aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bra.toml4
-rw-r--r--.gobuild.yml1
-rw-r--r--.gopmfile6
-rw-r--r--.pkgr.yml1
-rw-r--r--LICENSE40
-rw-r--r--README.md4
-rw-r--r--README_ZH.md4
-rw-r--r--cmd/serve.go10
-rw-r--r--cmd/web.go69
-rw-r--r--conf/app.ini6
-rwxr-xr-x[-rw-r--r--]conf/locale/locale_de-DE.ini1257
-rw-r--r--conf/locale/locale_en-US.ini36
-rwxr-xr-x[-rw-r--r--]conf/locale/locale_fr-CA.ini1195
-rwxr-xr-x[-rw-r--r--]conf/locale/locale_nl-NL.ini1264
-rwxr-xr-x[-rw-r--r--]conf/locale/locale_zh-CN.ini1338
-rwxr-xr-x[-rw-r--r--]conf/locale/locale_zh-HK.ini1338
-rw-r--r--gogs.go2
-rw-r--r--models/models.go5
-rw-r--r--models/publickey.go6
-rw-r--r--models/repo.go24
-rw-r--r--models/token.go69
-rw-r--r--models/user.go13
-rw-r--r--models/webhook.go55
-rw-r--r--modules/auth/admin.go17
-rw-r--r--modules/auth/auth.go67
-rw-r--r--modules/auth/publickey_form.go19
-rw-r--r--modules/auth/user_form.go17
-rw-r--r--modules/avatar/avatar.go16
-rw-r--r--modules/base/base.go4
-rw-r--r--modules/base/template.go3
-rw-r--r--modules/base/tool.go31
-rw-r--r--modules/cron/doc.go6
-rw-r--r--modules/mailer/mailer.go2
-rw-r--r--modules/middleware/auth.go9
-rw-r--r--modules/middleware/context.go7
-rw-r--r--modules/middleware/repo.go278
-rw-r--r--modules/setting/setting.go19
-rw-r--r--public/ng/css/gogs.css164
-rw-r--r--public/ng/css/ui.css29
-rw-r--r--public/ng/js/gogs.js15
-rw-r--r--public/ng/js/min/gogs-min.js4
-rw-r--r--public/ng/less/gogs/base.less3
-rw-r--r--public/ng/less/gogs/issue.less121
-rw-r--r--public/ng/less/gogs/repository.less12
-rw-r--r--public/ng/less/gogs/settings.less9
-rw-r--r--public/ng/less/ui.less3
-rw-r--r--public/ng/less/ui/label.less2
-rw-r--r--public/ng/less/ui/pager.less28
-rw-r--r--public/ng/less/ui/var.less9
-rw-r--r--routers/admin/users.go6
-rw-r--r--routers/api/v1/miscellaneous.go6
-rw-r--r--routers/api/v1/repo.go (renamed from routers/api/v1/repos.go)86
-rw-r--r--routers/api/v1/repo_file.go32
-rw-r--r--routers/api/v1/repo_hooks.go168
-rw-r--r--routers/api/v1/users.go15
-rw-r--r--routers/install.go4
-rw-r--r--routers/repo/commit.go141
-rw-r--r--routers/repo/download.go32
-rw-r--r--routers/repo/http.go28
-rw-r--r--routers/repo/issue.go8
-rw-r--r--routers/repo/release.go49
-rw-r--r--routers/repo/repo.go186
-rw-r--r--routers/repo/setting.go1
-rw-r--r--routers/repo/view.go2
-rw-r--r--routers/user/setting.go78
-rw-r--r--templates/.VERSION2
-rw-r--r--templates/admin/config.tmpl4
-rw-r--r--templates/admin/user/edit.tmpl14
-rw-r--r--templates/repo/fork.tmpl65
-rw-r--r--templates/repo/header.tmpl8
-rw-r--r--templates/repo/home.tmpl14
-rw-r--r--templates/repo/issue2/labels.tmpl36
-rw-r--r--templates/repo/issue2/list.tmpl57
-rw-r--r--templates/repo/pr2/list.tmpl48
-rw-r--r--templates/repo/settings/hook_gogs.tmpl2
-rw-r--r--templates/repo/settings/hook_slack.tmpl2
-rw-r--r--templates/repo/settings/hooks.tmpl2
-rw-r--r--templates/repo/settings/nav.tmpl2
-rw-r--r--templates/repo/sidebar.tmpl2
-rw-r--r--templates/repo/view_file.tmpl8
-rw-r--r--templates/repo/view_list.tmpl4
-rw-r--r--templates/user/profile.tmpl9
-rw-r--r--templates/user/settings/applications.tmpl56
-rw-r--r--templates/user/settings/nav.tmpl1
-rw-r--r--templates/user/settings/sshkeys.tmpl10
85 files changed, 5338 insertions, 3491 deletions
diff --git a/.bra.toml b/.bra.toml
index 5fac22f5..65b39884 100644
--- a/.bra.toml
+++ b/.bra.toml
@@ -14,7 +14,7 @@ watch_dirs = [
watch_exts = [".go", ".ini"]
build_delay = 1500
cmds = [
- ["go", "install", "-tags", "sqlite redis cert"],
- ["go", "build", "-tags", "sqlite redis cert"],
+ ["go", "install", "-tags", "sqlite cert"],# redis memcache
+ ["go", "build", "-tags", "sqlite cert"],
["./gogs", "web"]
] \ No newline at end of file
diff --git a/.gobuild.yml b/.gobuild.yml
index 3a2f361d..f1b9b691 100644
--- a/.gobuild.yml
+++ b/.gobuild.yml
@@ -10,6 +10,7 @@ filesets:
- README_ZH.md
excludes:
- \.git
+ depth: 5
settings:
build: |
if test "$GOOS" = "windows" -a "$GOARCH" = "386"
diff --git a/.gopmfile b/.gopmfile
index 8017a138..f78fe165 100644
--- a/.gopmfile
+++ b/.gopmfile
@@ -11,9 +11,9 @@ github.com/Unknwon/i18n =
github.com/Unknwon/macaron =
github.com/codegangsta/cli = commit:7381bc4e62
github.com/go-sql-driver/mysql = commit:8111ee3ec3
-github.com/go-xorm/core = commit:750aae0fa5
-github.com/go-xorm/xorm = commit:2d8b3135b1
-github.com/gogits/gfm = commit:40f747a9c0
+github.com/go-xorm/core =
+github.com/go-xorm/xorm =
+github.com/gogits/go-gogs-client =
github.com/gogits/oauth2 = commit:99cbec870a
github.com/lib/pq = commit:b021d0ef20
github.com/macaron-contrib/binding =
diff --git a/.pkgr.yml b/.pkgr.yml
index e670ef80..296920be 100644
--- a/.pkgr.yml
+++ b/.pkgr.yml
@@ -2,6 +2,7 @@ targets:
ubuntu-14.04:
ubuntu-12.04:
debian-7:
+ centos6:
build_dependencies:
- mercurial
- bzr
diff --git a/LICENSE b/LICENSE
index 3af16b07..546e65ae 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,27 +1,19 @@
-Copyright (c) 2014
-All rights reserved.
+Copyright (c) 2014 All Gogs Contributors
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
+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:
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
-* 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 {organization} 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. \ No newline at end of file
+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/README.md b/README.md
index 36e8ca6e..8a5a71e3 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Gogs(Go Git Service) is a painless self-hosted Git Service written in Go.
![Demo](https://gowalker.org/public/gogs_demo.gif)
-##### Current version: 0.5.6 Beta
+##### Current version: 0.5.7 Beta
### NOTICES
@@ -35,7 +35,7 @@ The goal of this project is to make the easiest, fastest and most painless way t
- Reverse proxy suburl support
- Register/delete/rename account
- Create/manage/delete organization with team management
-- Create/migrate/mirror/delete/watch/rename/transfer public/private repository
+- Create/fork/migrate/mirror/delete/watch/rename/transfer public/private repository
- Repository viewer/release/issue tracker
- Repository and Organization level webhooks
- Repository Git hooks
diff --git a/README_ZH.md b/README_ZH.md
index 83addc0f..cb5e5a1a 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务。
![Demo](https://gowalker.org/public/gogs_demo.gif)
-##### 当前版本:0.5.6 Beta
+##### 当前版本:0.5.7 Beta
## 开发目的
@@ -26,7 +26,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
- 支持反向代理子路径
- 支持 注册/删除/重命名 用户
- 支持 创建/管理/删除 组织以及团队管理功能
-- 支持 创建/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库
+- 支持 创建/派生/迁移/镜像/删除/关注/重命名/转移 公开/私有 仓库
- 支持仓库 浏览/发布/工单管理
- 支持仓库和组织级别 Web 钩子
- 支持仓库 Git 钩子
diff --git a/cmd/serve.go b/cmd/serve.go
index c18bf3ad..15d48dcb 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -96,7 +96,7 @@ func runServ(k *cli.Context) {
println("Gogs: you are not the owner of SSH key")
log.GitLogger.Fatal(2, "Invalid owner of SSH key: %d", keyId)
}
- println("Gogs: internal error:", err)
+ println("Gogs: internal error:", err.Error())
log.GitLogger.Fatal(2, "Fail to get user by key ID(%d): %v", keyId, err)
}
@@ -125,7 +125,7 @@ func runServ(k *cli.Context) {
println("Gogs: given repository owner are not registered")
log.GitLogger.Fatal(2, "Unregistered owner: %s", repoUserName)
}
- println("Gogs: internal error:", err)
+ println("Gogs: internal error:", err.Error())
log.GitLogger.Fatal(2, "Fail to get repository owner(%s): %v", repoUserName, err)
}
@@ -134,7 +134,7 @@ func runServ(k *cli.Context) {
case isWrite:
has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.WRITABLE)
if err != nil {
- println("Gogs: internal error:", err)
+ println("Gogs: internal error:", err.Error())
log.GitLogger.Fatal(2, "Fail to check write access:", err)
} else if !has {
println("You have no right to write this repository")
@@ -147,7 +147,7 @@ func runServ(k *cli.Context) {
println("Gogs: given repository does not exist")
log.GitLogger.Fatal(2, "Repository does not exist: %s/%s", repoUser.Name, repoName)
}
- println("Gogs: internal error:", err)
+ println("Gogs: internal error:", err.Error())
log.GitLogger.Fatal(2, "Fail to get repository: %v", err)
}
@@ -157,7 +157,7 @@ func runServ(k *cli.Context) {
has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.READABLE)
if err != nil {
- println("Gogs: internal error:", err)
+ println("Gogs: internal error:", err.Error())
log.GitLogger.Fatal(2, "Fail to check read access:", err)
} else if !has {
println("You have no right to access this repository")
diff --git a/cmd/web.go b/cmd/web.go
index d2ab01f1..5b81537f 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -9,6 +9,7 @@ import (
"html/template"
"io/ioutil"
"net/http"
+ "net/http/fcgi"
"os"
"path"
"strings"
@@ -63,7 +64,7 @@ func checkVersion() {
// Check dependency version.
macaronVer := git.MustParseVersion(strings.Join(strings.Split(macaron.Version(), ".")[:3], "."))
- if macaronVer.LessThan(git.MustParseVersion("0.2.3")) {
+ if macaronVer.LessThan(git.MustParseVersion("0.4.2")) {
log.Fatal(4, "Package macaron version is too old, did you forget to update?(github.com/Unknwon/macaron)")
}
i18nVer := git.MustParseVersion(i18n.Version())
@@ -71,7 +72,7 @@ func checkVersion() {
log.Fatal(4, "Package i18n version is too old, did you forget to update?(github.com/macaron-contrib/i18n)")
}
sessionVer := git.MustParseVersion(session.Version())
- if sessionVer.LessThan(git.MustParseVersion("0.0.3")) {
+ if sessionVer.LessThan(git.MustParseVersion("0.0.5")) {
log.Fatal(4, "Package session version is too old, did you forget to update?(github.com/macaron-contrib/session)")
}
}
@@ -84,6 +85,9 @@ func newMacaron() *macaron.Macaron {
if setting.EnableGzip {
m.Use(macaron.Gziper())
}
+ if setting.Protocol == setting.FCGI {
+ m.SetURLPrefix(setting.AppSubUrl)
+ }
m.Use(macaron.Static(
path.Join(setting.StaticRootPath, "public"),
macaron.StaticOptions{
@@ -144,6 +148,7 @@ func runWeb(*cli.Context) {
ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true})
reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true})
+ bind := binding.Bind
bindIgnErr := binding.BindIgnErr
// Routers.
@@ -156,7 +161,8 @@ func runWeb(*cli.Context) {
m.Get("/issues", user.Issues)
}, reqSignIn)
- // API routers.
+ // API.
+ // FIXME: custom form error response.
m.Group("/api", func() {
m.Group("/v1", func() {
// Miscellaneous.
@@ -169,18 +175,25 @@ func runWeb(*cli.Context) {
})
// Repositories.
+ m.Get("/user/repos", middleware.ApiReqToken(), v1.ListMyRepos)
m.Group("/repos", func() {
m.Get("/search", v1.SearchRepos)
m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), v1.Migrate)
+
+ m.Group("/:username/:reponame", func() {
+ m.Combo("/hooks").Get(v1.ListRepoHooks).Post(bind(v1.CreateRepoHookForm{}), v1.CreateRepoHook)
+ m.Patch("/hooks/:id:int", bind(v1.EditRepoHookForm{}), v1.EditRepoHook)
+ m.Get("/raw/*", middleware.RepoRef(), v1.GetRepoRawFile)
+ }, middleware.ApiRepoAssignment(), middleware.ApiReqToken())
})
m.Any("/*", func(ctx *middleware.Context) {
- ctx.JSON(404, &base.ApiJsonErr{"Not Found", v1.DOC_URL})
+ ctx.JSON(404, &base.ApiJsonErr{"Not Found", base.DOC_URL})
})
})
})
- // User routers.
+ // User.
m.Group("/user", func() {
m.Get("/login", user.SignIn)
m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost)
@@ -198,6 +211,7 @@ func runWeb(*cli.Context) {
m.Get("/ssh", user.SettingsSSHKeys)
m.Post("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost)
m.Get("/social", user.SettingsSocial)
+ m.Combo("/applications").Get(user.SettingsApplications).Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost)
m.Route("/delete", "GET,POST", user.SettingsDelete)
}, reqSignIn)
m.Group("/user", func() {
@@ -209,9 +223,6 @@ func runWeb(*cli.Context) {
m.Get("/logout", user.SignOut)
})
- // FIXME: Legacy
- m.Get("/user/:username", ignSignIn, user.Profile)
-
// Gravatar service.
avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg")
os.MkdirAll("public/img/avatar/", os.ModePerm)
@@ -264,7 +275,7 @@ func runWeb(*cli.Context) {
reqTrueOwner := middleware.RequireTrueOwner()
- // Organization routers.
+ // Organization.
m.Group("/org", func() {
m.Get("/create", org.Create)
m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost)
@@ -308,12 +319,14 @@ func runWeb(*cli.Context) {
m.Get("/:org", org.Home)
}, middleware.OrgAssignment(true))
- // Repository routers.
+ // Repository.
m.Group("/repo", func() {
m.Get("/create", repo.Create)
m.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost)
m.Get("/migrate", repo.Migrate)
m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost)
+ m.Get("/fork", repo.Fork)
+ m.Post("/fork", bindIgnErr(auth.CreateRepoForm{}), repo.ForkPost)
}, reqSignIn)
m.Group("/:username/:reponame", func() {
@@ -351,7 +364,6 @@ func runWeb(*cli.Context) {
m.Post("/labels/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel)
m.Post("/labels/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel)
m.Post("/labels/delete", repo.DeleteLabel)
- m.Get("/milestones", repo.Milestones)
m.Get("/milestones/new", repo.NewMilestone)
m.Post("/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
m.Get("/milestones/:index/edit", repo.UpdateMilestone)
@@ -361,38 +373,35 @@ func runWeb(*cli.Context) {
m.Post("/comment/:action", repo.Comment)
m.Get("/releases/new", repo.NewRelease)
- m.Get("/releases/edit/:tagname", repo.EditRelease)
- }, reqSignIn, middleware.RepoAssignment(true))
-
- m.Group("/:username/:reponame", func() {
m.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
+ m.Get("/releases/edit/:tagname", repo.EditRelease)
m.Post("/releases/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
- }, reqSignIn, middleware.RepoAssignment(true, true))
+ }, reqSignIn, middleware.RepoAssignment(true))
m.Group("/:username/:reponame", func() {
+ m.Get("/releases", repo.Releases)
m.Get("/issues", repo.Issues)
m.Get("/issues/:index", repo.ViewIssue)
+ m.Get("/issues/milestones", repo.Milestones)
m.Get("/pulls", repo.Pulls)
m.Get("/branches", repo.Branches)
m.Get("/archive/*", repo.Download)
m.Get("/issues2/", repo.Issues2)
- }, ignSignIn, middleware.RepoAssignment(true))
+ m.Get("/pulls2/", repo.PullRequest2)
+ m.Get("/labels2/",repo.Labels2)
+
+ m.Group("", func() {
+ m.Get("/src/*", repo.Home)
+ m.Get("/raw/*", repo.SingleDownload)
+ m.Get("/commits/*", repo.RefCommits)
+ m.Get("/commit/*", repo.Diff)
+ }, middleware.RepoRef())
- m.Group("/:username/:reponame", func() {
- m.Get("/src/:branchname", repo.Home)
- m.Get("/src/:branchname/*", repo.Home)
- m.Get("/raw/:branchname/*", repo.SingleDownload)
- m.Get("/commits/:branchname", repo.Commits)
- m.Get("/commits/:branchname/search", repo.SearchCommits)
- m.Get("/commits/:branchname/*", repo.FileHistory)
- m.Get("/commit/:branchname", repo.Diff)
- m.Get("/commit/:branchname/*", repo.Diff)
- m.Get("/releases", repo.Releases)
m.Get("/compare/:before([a-z0-9]+)...:after([a-z0-9]+)", repo.CompareDiff)
- }, ignSignIn, middleware.RepoAssignment(true, true))
+ }, ignSignIn, middleware.RepoAssignment(true))
m.Group("/:username", func() {
- m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true, true), repo.Home)
+ m.Get("/:reponame", ignSignIn, middleware.RepoAssignment(true, true), middleware.RepoRef(), repo.Home)
m.Any("/:reponame/*", ignSignInAndCsrf, repo.Http)
})
@@ -416,6 +425,8 @@ func runWeb(*cli.Context) {
err = http.ListenAndServe(listenAddr, m)
case setting.HTTPS:
err = http.ListenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile, m)
+ case setting.FCGI:
+ err = fcgi.Serve(nil, m)
default:
log.Fatal(4, "Invalid protocol: %s", setting.Protocol)
}
diff --git a/conf/app.ini b/conf/app.ini
index ed4a1b62..dbae8a4f 100644
--- a/conf/app.ini
+++ b/conf/app.ini
@@ -163,14 +163,12 @@ ENABLE_SET_COOKIE = true
GC_INTERVAL_TIME = 86400
; Session life time, default is 86400
SESSION_LIFE_TIME = 86400
-; session id hash func, Either "sha1", "sha256" or "md5" default is sha1
-SESSION_ID_HASHFUNC = sha1
-; Session hash key, default is use random string
-SESSION_ID_HASHKEY =
[picture]
; The place to picture data, either "server" or "qiniu", default is "server"
SERVICE = server
+; Chinese users can choose "duoshuo"
+GRAVATAR_SOURCE = gravatar
DISABLE_GRAVATAR = false
[attachment]
diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini
index 651fdac0..53e71d85 100644..100755
--- a/conf/locale/locale_de-DE.ini
+++ b/conf/locale/locale_de-DE.ini
@@ -1,578 +1,679 @@
-app_desc = Ein einfacher, selbst gehosteter Git-Service, geschrieben in Go.
-
-home = Home
-dashboard = Dashboard
-explore = Erkunden
-help = Hilfe
-sign_in = Anmelden
-social_sign_in = Anmeldung über soziales Konto: zweiter Schritt <small>Konto verknüpfen</small>
-sign_out = Abmelden
-sign_up = Registrieren
-register = Registrieren
-website = Webseite
-version = Version
-page = Seite
-template = Vorlage
-language = Sprache
-
-username = Benutzername
-email = E-Mail
-password = Passwort
-re_type = Passwort bestätigen
-captcha = Captcha
-
-repository = Repository
-organization = Organisation
-mirror = Spiegel
-new_repo = Neues Repository
-new_migrate = Neue Migration
-new_org = Neue Organisation
-manage_org = Organisationen verwalten
-admin_panel = Admin-Panel
-account_settings = Kontoeinstellungen
-settings = Einstellungen
-
-news_feed = News Feed
-pull_requests = Pull Requests
-issues = Issues
-
-cancel = Abbrechen
-
-[install]
-install = Installation
-title = Installation für erstmaligen Start
-requite_db_desc = Gogs erfordert MySQL, PostgreSQL oder SQLite 3, aber SQLite3 ist in der offiziellen binären Version akiviert.
-db_type = Datenbanktyp
-host = Host
-user = Benutzer
-password = Passwort
-db_name = Datenbankname
-db_helper = Bitte verwenden InnoDB-Engine mit utf8_general_ci Zeichensatz für MySQL.
-ssl_mode = SSL-Modus
-path = Pfad
-sqlite_helper = Der Dateipfad des SQLite3 Datenbank.
-general_title = Allgemeine Einstellungen von Gogs
-repo_path = Repository Root-Verzeichnispfad
-repo_path_helper = Alle Git-Repositorys werden in diesem Verzeichnis gespeichert.
-run_user = Ausführender Benutzer
-run_user_helper = Der Benutzer muss die Zugriffsberechtigung für das Repository Root-Verzeichnis haben und der ausführende Benutzer von Gogs sein.
-domain = Domain
-domain_helper = Dies hat Auswirkung auf die SSH clone URLs.
-app_url = Anwendungs-URL
-app_url_helper = Dies hat Auswirkung auf die HTTP/HTTPS clone URLs und für die E-Mails.
-email_title = E-Mail-Service-Einstellungen (optional)
-smtp_host = SMTP Host
-mailer_user = Sender E-mail
-mailer_password = Sender Passwort
-notify_title = Benachrichtigungseinstellungen (optional)
-register_confirm = Registrierungsbestätigung aktvieren
-mail_notify = E-Mail-Benachrichtgung aktivieren
-admin_title = Konto-Einstellungen für den Administrator
-admin_name = Benutzername
-admin_password = Passwort
-confirm_password = Passwort bestätigen
-admin_email = E-Mail
-install_gogs = Gogs installieren
-test_git_failed = Fehler beim Test des 'git' Kommandos: %v
-sqlite3_not_available = Deine Version unterstüzt nicht SQLite3, bitte downloade dir die offiziele binäre Version von http://gogs.io/docs/installation/install_from_binary.html, NICHT die gobuild Version.
-invalid_db_setting = Datenbank-Einstellungen sind nicht korrekt: %v
-invalid_repo_path = Repository Root-Verzeichnis ist ungültig: %v
-run_user_not_match = Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s
-save_config_failed = Versuche die Konfiguration zu speichern ist fehlgeschlagen: %v
-invalid_admin_setting = Admin-Konto Einstellungen sind ungültig: %v
-install_success = Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Hab viel Vergnügen damit.
-
-[home]
-uname_holder = Benutzername oder E-Mail
-password_holder = Passwort
-switch_dashboard_context = Dashboard Kontext wechseln
-my_repos = Meine Repositorys
-collaborative_repos = Gemeinschaftliche Repositorys
-my_orgs = Meine Organisationen
-my_mirrors = Meine Spiegel
-
-[explore]
-repos = Repositorys
-
-[auth]
-create_new_account = Neues Konto erstellen
-register_hepler_msg = Du hast schon ein Konto? Jetzt anmelden!
-social_register_hepler_msg = Du hast schon ein soziales Konto? Jetzt verknüpfen!
-disable_register_prompt = Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator.
-disable_register_mail = Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
-remember_me = angemeldet bleiben
-forgot_password= Passwort vergessen
-forget_password = Passwort vergessen?
-sign_up_now = Du willst ein Konto? Jetzt registrieren!
-confirmation_mail_sent_prompt = Eine neue Bestätigungs-E-Mail wurde an <b>%s</b> gesendet. Kontrolliere dein Postfach innerhalb der nächsten %d Stunden, um die Registrierung abzuschließen.
-sign_in_email = Melde dich mit deiner E-Mail-Adresse an
-active_your_account = Aktiviere dein Konto
-resent_limit_prompt = Es tut uns leid, du sendest zu häufig Aktivierungs-E-Mails. Bitte warte 3 Minuten.
-has_unconfirmed_mail = Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Falls du noch keine Bestätigungs-E-Mail erhalten hast oder eine neue senden musst, klicke auf den unteren Button.
-resend_mail = Hier klicken, um deine Aktivierungs-E-Mail erneut zu versenden
-email_not_associate = Diese E-Mail-Adresse ist mit keinem Konto verknüpft.
-send_reset_mail = Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden
-reset_password = Passwort zurücksetzen
-invalid_code = Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.
-reset_password_helper = Hier klicken, um das Passwort zurückzusetzen
-password_too_short = Das Passwort muss mindenstens 6 Zeichen lang sein
-
-[form]
-UserName = Benutzername
-RepoName = Repository-Name
-Email = E-Mail-Adresse
-Password = Passwort
-Retype = Passwort bestätigen
-SSHTitle = SSH-Schlüsselname
-HttpsUrl = HTTPS-URL
-PayloadUrl = Payload-URL
-TeamName = Teamname
-AuthName = Authentifizierungsname
-AdminEmail = Admin E-mail
-
-require_error = ` darf nicht leer sein.`
-alpha_dash_error = ` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.`
-alpha_dash_dot_error = ` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.`
-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.`
-unknown_error = Unbekannter Fehler:
-captcha_incorrect = Captcha stimmt nicht überein.
-password_not_match = Die Passwörter stimmen nicht überein.
-
-username_been_taken = Benutzername ist bereits vergeben.
-repo_name_been_taken = Repository-Name ist bereits vergeben.
-org_name_been_taken = Organisationsname ist bereits vergeben.
-team_name_been_taken = Teamname ist bereits vergeben.
-email_been_used = E-Mail-Adresse wird bereits verwendet.
-ssh_key_been_used = SSH-Schlüsselname wird bereits verwendet.
-illegal_username = Benutzername enthält ungültige Zeichen.
-illegal_repo_name = Repository-Name enthält ungültige Zeichen.
-illegal_org_name = Organisationsname enthält ungültige Zeichen.
-illegal_team_name = Teamname enthält ungültige Zeichen.
-username_password_incorrect = Benutzername oder Passwort ist nicht korrekt.
-enterred_invalid_repo_name = Bitte stelle sicher, dass der eingegeben Repository-Name richtig ist.
-enterred_invalid_owner_name = Bitte stelle sicher, dass der eingegeben Besitzername richtig ist.
-enterred_invalid_password = Bitte stelle sicher, dass das eingegebene Passwort richtig ist.
-user_not_exist = Angegebener Benutzer existiert nicht.
-last_org_owner = Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben.
-
-invalid_ssh_key = Leider sind wir nicht in der Lage, deinen SSH-Schlüssel zu überprüfen: %s
-auth_failed = Authentifizierung fehlgeschlagen: %v
-
-still_own_repo = Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
-org_still_own_repo = Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
-
-still_own_user = Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut.
-
-[user]
-change_avatar = Ändere dein Profilbild auf gravatar.com
-join_on = Registriert
-repositories = Repositorys
-activity = Öffentliche Aktivität
-followers = Folgen
-starred = Markiert
-following = Folgt
-
-[settings]
-profile = Profil
-password = Passwort
-ssh_keys = SSH-Schlüssel
-social = Soziale Konten
-orgs = Organisationen
-delete = Konto löschen
-uid = Uid
-
-public_profile = Öffentliches Profil
-profile_desc = Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken.
-full_name = Vollständiger Name
-website = Webseite
-location = Standort
-update_profile = Profil aktualisieren
-update_profile_success = Profil aktualisiert
-
-change_password = Passwort ändern
-old_password = Aktuelles Passwort
-new_password = Neues Passwort
-password_incorrect = Aktuelles Passwort ist nicht korrekt.
-change_password_success = Passwort geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden.
-
-manage_ssh_keys = SSH-Schlüssel verwalten
-add_key = SSH-Schlüssel hinzufügen
-ssh_desc = Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verknüpft sind. Entferne alle Schlüssel, die du nicht kennst.
-ssh_helper = <strong>Du brauchst Hilfe?</strong> Hier ist eine Anleitung zum <a href="https://help.github.com/articles/generating-ssh-keys">Erzeugen von SSH-Schlüsseln</a> oder <a href="https://help.github.com/ssh-issues/">Problemlösen einfacher SSH-Probleme</a>.
-add_new_key = SSH-Schlüssel hinzufügen
-key_name = Schlüsselname
-key_content = Inhalt
-add_key_success = SSH-Schlüssel hinzugefügt
-delete_key = SSH-Schlüssel löschen
-add_on = Hinzugefügt am
-last_used = Zuletzt verwendet auf
-no_activity = Keine neuen Aktivitäten
-
-manage_social = Verknüpfte soziale Konten verwalten
-social_desc = Dies ist eine Liste verknüpfter sozialer Konten. Entferne alle Verknüpfungen, die du nicht kennst.
-unbind = Verknüpfung entfernen
-unbind_success = Die Verknüpfung zum sozialen Konto wurde entfernt.
-
-delete_account = Konto löschen
-delete_prompt = Diese Aktion wird dein Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden!
-confirm_delete_account = Löschen
-
-[repo]
-owner = Besitzer
-repo_name = Repository-Name
-repo_name_helper = Gute Repository-Namen sind kurz, einprägsam und <strong>einzigartig</strong>.
-visibility = Sichtbarkeit
-visiblity_helper = Dieses Repository ist <span class="label label-red label-radius">Privat</span>
-repo_desc = Beschreibung
-repo_lang = Sprache
-repo_lang_helper = Wähle eine .gitignore Datei
-license = Lizenz
-license_helper = Wähle eine Lizenz aus
-init_readme = Repository mit README.md initialisieren
-create_repo = Repository erstellen
-default_branch = Standard-Branch
-mirror_interval = Spiegel-Intervall (in Stunden)
-goget_meta = Go-Get Meta
-goget_meta_helper = Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können.
-
-need_auth = Authorisierung benötigt
-migrate_type = Migrationstyp
-migrate_type_helper = Dieses Repository wird ein <span class="label label-blue label-radius">Spiegel</span>
-migrate_repo = Repository migrieren
-
-copy_link = Klonen
-clone_helper = Du brauchst Hilfe beim Klonen? Hier gibt es <a target="_blank" href="http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository">Hilfe</a>!
-unwatch = Beobachtung beenden
-watch = Beobachtung
-unstar = Markierung aufheben
-star = Markierung
-fork = Abspaltung
-
-quick_guide = Kurzanleitung
-clone_this_repo = Dieses Repository klonen
-create_new_repo_command = Erstelle ein neues Repository mittels der Kommandozeile
-push_exist_repo = Übertrage ein existierendes Repository von der Kommandozeile
-
-settings = Einstellungen
-settings.options = Optionen
-settings.collaboration = Zusammenarbeit
-settings.hooks = Webhooks
-settings.deploy_keys = Deploy-Keys
-settings.basic_settings = Grundeinstellungen
-settings.danger_zone = Gefahrenzone
-settings.site = Offizielle Webseite
-settings.update_settings = Aktualisierungseinstellungen
-settings.transfer = Besitz übertragen
-settings.transfer_desc = Übertrage dieses Repository einem anderen Benutzer oder einer Organisation.
-settings.new_owner_has_same_repo = Neuer Eigentümer hat bereits ein Repository mit dem gleichen Namen.
-settings.delete = Repository löschen
-settings.delete_desc = Wenn dieses Repository gelöscht ist, gibt es keinen Weg zurück. Sei dir sicher!
-settings.update_settings_success = Repository-Optionen aktualisiert
-settings.transfer_owner = Neuer Besitzer
-settings.make_transfer = übertragen
-settings.transfer_succeed = Repository-Eigentum wurde erfolgreich übertragen.
-settings.confirm_delete = Löschen
-settings.add_collaborator = Mitarbeiter hinzufügen
-settings.add_collaborator_success = Mitarbeiter hinzugefügt
-settings.remove_collaborator_success = Mitarbeiter entfernt
-settings.add_webhook = Webhook hinzufügen
-settings.hooks_desc = Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>.
-settings.remove_hook_success = Webhook entfernt
-settings.add_webhook_desc = GoGS sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>.
-settings.payload_url = Payload-URL
-settings.content_type = Inhaltstyp
-settings.secret = Secret
-settings.event_desc = Welche Ereignisse sollen diesen Webhook auslösen?
-settings.event_push_only = Nur das <code>push</code>-Ereignis.
-settings.active = Aktiv
-settings.active_helper = Ereignisdetails werden ausgeliefert, wenn dieser Webhook ausgelöst wird.
-settings.add_hook_success = Webhook hinzugefügt
-settings.update_webhook = Webhook aktualisieren
-settings.update_hook_success = Webhook aktualisiert
-settings.delete_webhook = Webhook löschen
-settings.recent_deliveries = letzte Zustellungen
-settings.hook_type = Hook Typ
-settings.add_slack_hook_desc = Add <a href="http://slack.com">Slack</a> integration to your repository.
-settings.slack_token = Token
-settings.slack_domain = Domain
-settings.slack_channel = Channel
-
-[org]
-org_name_holder = Name der Organisation
-org_name_helper = Gute Namen von Organisationen sind kurz und einprägsam.
-org_email_helper = Das E-Mail-Konto der Organisation empfängt alle Benachrichtigungen.
-create_org = Organisation erstellen
-repo_updated = Aktualisiert
-people = Personen
-invite_someone = Benutzer einladen
-teams = Teams
-lower_members = Mitglieder
-lower_repositories = Repositorys
-create_new_team = Neues Team erstellen
-org_desc = Beschreibung
-team_name = Teamname
-team_desc = Beschreibung
-team_name_helper = Verwende diesen Namen, um dich auf dieses Team zu beziehen.
-team_desc_helper = Was hat es mit diesem Team auf sich?
-team_permission_desc = Welche Berechtigungsstufe soll das Team haben?
-
-settings = Einstellungen
-settings.options = Optionen
-settings.full_name = Vollständiger Name
-settings.website = Webseite
-settings.location = Standort
-settings.update_settings = Aktualisierungseinstellungen
-settings.update_setting_success = Organisationseinstellungen aktualisiert
-settings.delete = Organisation löschen
-settings.delete_account = Diese Organisation löschen
-settings.delete_prompt = Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden!
-settings.confirm_delete_account = Löschen
-settings.hooks_desc = Füge Webhooks hinzu, die für <strong>alle</strong> Repositorys dieser Organisation ausgelöst werden.
-
-members.public = Öffentlich
-members.public_helper = Privat machen
-members.private = Privat
-members.private_helper = Öffentlich machen
-members.owner = Besitzer
-members.member = Mitglied
-members.conceal = Verbergen
-members.remove = Entfernen
-members.leave = Verlassen
-members.invite_desc = Benutzernamen eingeben, um ihn als neues Mitglied in %s einzuladen:
-members.invite_now = Jetzt einladen
-
-teams.join = Beitreten
-teams.leave = Verlassen
-teams.read_access = Lesezugriff
-teams.read_access_helper = Dieses Team wird Repositorys einsehen und klonen können.
-teams.write_access = Schreibzugriff
-teams.write_access_helper = Dieses Team wird die Repositorys einsehen und in sie hinein pushen können.
-teams.admin_access = Adminzugriff
-teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können.
-teams.no_desc = Dieses Team hat keine Beschreibung
-teams.settings = Einstellungen
-teams.owners_permission_desc = Besitzer haben vollen Zugriff auf <strong>alle Repositorys</strong> und <strong>Admin Rechte</strong> für diese Organisation.
-teams.members = Teammitglieder
-teams.update_settings = Einstellungen aktualisieren
-teams.delete_team = Dieses Team löschen
-teams.add_team_member = Teammitglied hinzufügen
-teams.delete_team_success = Team gelöscht
-teams.read_permission_desc = Dieses Team erlaubt <strong>Lesezugriff</strong>: Mitglieder können Team-Repositorys einsehen und klonen.
-teams.write_permission_desc = Dieses Team erlaubt <strong>Schreibzugriff</strong>: Mitglieder können Team-Repositorys einsehen und hinein pushen.
-teams.admin_permission_desc = Diese Team erlaubt <strong>Adminzugriff</strong>: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen.
-teams.repositories = Team-Repositorys
-teams.add_team_repository = Team-Repository hinzufügen
-teams.remove_repo = Entfernen
-
-[admin]
-dashboard = Dashboard
-users = Benutzer
-organizations = Organisationen
-repositories = Repositorys
-authentication = Authentifizierung
-config = Konfiguration
-monitor = Monitoring
-prev = zurück
-next = vor
-
-dashboard.statistic = Statistik
-dashboard.operations = Operationen
-dashboard.system_status = System-Monitor-Status
-dashboard.statistic_info = GoGS Datenbank hat <b>%d</b> Benutzer, <b>%d</b> Organisationen, <b>%d</b> öffentliche Schlüssel, <b>%d</b> Repositorys, <b>%d</b> Beobachtungen, <b>%d</b> Markierungen, <b>%d</b> Aktionen, <b>%d</b> Zugriffe, <b>%d</b> Issues, <b>%d</b> Kommentare, <b>%d</b> soziale Konten, <b>%d</b> Folgende, <b>%d</b> Spiegel, <b>%d</b> Releases, <b>%d</b> Login-Quellen, <b>%d</b> Webhooks, <b>%d</b> Milestones, <b>%d</b> Labels, <b>%d</b> Hook-Tasks, <b>%d</b> Teams, <b>%d</b> Aktualisierungs-Tasks, <b>%d</b> Anhänge.
-dashboard.operation_name = Name der Operation
-dashboard.operation_switch = Switch
-dashboard.operation_run = Ausführen
-dashboard.clean_unbind_oauth = ungebundene OAuths bereinigen
-dashboard.delete_inactivate_accounts = inaktive Konten löschen
-dashboard.server_uptime = Server-Uptime
-dashboard.current_goroutine = Aktuelle Goroutines
-dashboard.current_memory_usage = Aktuelle Speichernutzung
-dashboard.total_memory_allocated = Zugeteilter Gesamtspeicher
-dashboard.memory_obtained = Erhaltener Speicher
-dashboard.pointer_lookup_times = Pointer Lookup Times
-dashboard.memory_allocate_times = Memory Allocate Times
-dashboard.memory_free_times = Memory Free Times
-dashboard.current_heap_usage = Aktuelle Heap-Auslastung
-dashboard.heap_memory_obtained = erhaltener Heap-Memory
-dashboard.heap_memory_idle = unbenutzter Heap-Memory
-dashboard.heap_memory_in_use = benutzter Heap-Memory
-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 = erhaltene MSpan-Structures
-dashboard.mcache_structures_usage = MCache-Structures-Auslastung
-dashboard.mcache_structures_obtained = erhaltene MCache-Structures
-dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained
-dashboard.gc_metadata_obtained = erhaltene GC-Metadata
-dashboard.other_system_allocation_obtained = andere erhaltene System-Allokatoren
-dashboard.next_gc_recycle = nächster GC-Zyklus
-dashboard.last_gc_time = seit letztem GC-Zyklus
-dashboard.total_gc_time = gesammte GC-Zeit
-dashboard.total_gc_pause = gesammte GC-Pause
-dashboard.last_gc_pause = letzte GC-Pause
-dashboard.gc_times = GC-Takt
-
-users.user_manage_panel = Benutzer
-users.new_account = Neues Konto erstellen
-users.name = Name
-users.activated = Aktiviert
-users.admin = Admin
-users.repos = Repositorys
-users.created = Erzeugt
-users.edit = Bearbeiten
-users.auth_source = Auth-Quelle
-users.local = Lokal
-users.auth_login_name = Auth-Login-Name
-users.update_profile_success = Kontoprofil aktualisiert
-users.edit_account = Konto bearbeiten
-users.is_activated = Dieses Konto ist aktiviert
-users.is_admin = Dieses Konto hat Administratorrechte
-users.update_profile = Kontoprofil aktualisieren
-users.delete_account = Dieses Konto löschen
-users.still_own_repo = Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
-
-orgs.org_manage_panel = Organisationenverwaltung
-orgs.name = Name
-orgs.teams = Teams
-orgs.members = Mitglieder
-
-repos.repo_manage_panel = Repositorys
-repos.owner = Besitzer
-repos.name = Name
-repos.private = Privat
-repos.watches = Beobachtungen
-repos.stars = Markierungen
-repos.issues = Issues
-
-auths.auth_manage_panel = Authentifizierung
-auths.new = Neue Authentifizierungsquelle hinzufügen
-auths.name = Name
-auths.type = Typ
-auths.enabled = aktiviert
-auths.updated = aktualisiert
-auths.auth_type = Authentifizierungstyp
-auths.auth_name = Authentifizierungsname
-auths.domain = Domain
-auths.host = Host
-auths.port = Port
-auths.base_dn = Base DN
-auths.attributes = Suchattribute
-auths.filter = Suchfilter
-auths.ms_ad_sa = Ms Ad SA
-auths.smtp_auth = SMTP-Authentifizierungstyp
-auths.smtphost = SMTP-Host
-auths.smtpport = SMTP-Port
-auths.enable_tls = TLS-Verschlüsselung aktivieren
-auths.enable_auto_register = Automatische Registrierung aktivieren
-auths.tips = Tipps
-auths.edit = Authentifizierungseinstellungen bearbeiten
-auths.activated = Diese Authentifizierung ist aktiviert
-auths.update_success = Authentifizierungseinstellungen aktualisiert
-auths.update = Authentifizierungseinstellungen aktualisieren
-auths.delete = Authentifizierung löschen
-
-config.server_config = Server-Konfiguration
-config.app_name = Anwendungsname
-config.app_ver = Anwendungsversion
-config.app_url = Anwendungs-URL
-config.domain = Domain
-config.offline_mode = Offline-Modus
-config.disable_router_log = Router-Log deaktivieren
-config.run_user = Laufzeit-Benutzer
-config.run_mode = Laufzeit-Modus
-config.repo_root_path = Repository-Verzeichnis
-config.static_file_root_path = Verzeichnis für statische Dateien
-config.log_file_root_path = Log-Verzeichnis
-config.script_type = Skript-Typ
-config.reverse_auth_user = Reverse Authentication User
-config.db_config = Datenbankkonfiguration
-config.db_type = Typ
-config.db_host = Host
-config.db_name = Name
-config.db_user = Benutzer
-config.db_ssl_mode = SSL-Modus
-config.db_ssl_mode_helper = (nur für "postgres")
-config.db_path = Verzeichnis
-config.db_path_helper = (nur für "sqlite3")
-config.service_config = Service-Einstellungen
-config.register_email_confirm = E-Mail-Bestätigung bei Registrierung
-config.disable_register = Registrierung deaktivieren
-config.require_sign_in_view = Ansehen erfordert Registrierung
-config.mail_notify = E-Mail-Benachrichtigung
-config.enable_cache_avatar = Avatar-Cache aktivieren
-config.active_code_lives = Aktivierungscode Lebensdauer
-config.reset_password_code_lives = Passwortcode Lebensdauer
-config.webhook_config = Webhook-Einstellungen
-config.task_interval = Task-Intervall
-config.deliver_timeout = Zeitlimit für Zustellung
-config.mailer_config = Mailer-Einstellungen
-config.mailer_enabled = Aktiviert
-config.mailer_name = Name
-config.mailer_host = Host
-config.mailer_user = Benutzer
-config.oauth_config = OAuth-Einstellungen
-config.oauth_enabled = Aktiviert
-config.cache_config = Cache-Einstellungen
-config.cache_adapter = Cache-Adapter
-config.cache_interval = Cache-Intervall
-config.cache_conn = Cache-Anbindung
-config.session_config = Session-Einstellungen
-config.session_provider = Session-Provider
-config.provider_config = Provider-Einstellungen
-config.cookie_name = Cookie-Name
-config.enable_set_cookie = Cookies einschalten
-config.gc_interval_time = GC-Intervallzeit
-config.session_life_time = Session-Lebensdauer
-config.https_only = nur HTTPS
-config.cookie_life_time = Cookie-Lebensdauer
-config.session_hash_function = Session-ID-Hashfunktion
-config.session_hash_key = Session-ID-Hashschlüssel
-config.picture_config = Bildeinstellungen
-config.picture_service = Bildservice
-config.disable_gravatar = Gravatar deaktivieren
-config.log_config = Log-Einstellungen
-config.log_mode = Log-Modus
-
-monitor.cron = Cron-Tasks
-monitor.name = Name
-monitor.schedule = Zeitplan
-monitor.next = nächste Ausführung
-monitor.previous = letzte Ausführung
-monitor.execute_times = Anzahl Ausführungen
-monitor.process = Laufende Prozesse
-monitor.desc = Beschreibung
-monitor.start = Startzeit
-monitor.execute_time = Ausführungszeit
-
-[action]
-create_repo = hat Repository <a href="%s/%s">%s</a> erstellt
-commit_repo = hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
-create_issue = hat Issue <a href="%s/%s/issues/%s">%s#%s</a> eröffnet
-comment_issue = hat Issue <a href="%s/%s/issues/%s">%s#%s</a> kommentiert
-transfer_repo = hat Repository <code>%s</code> transferiert an <a href="/%s%s">%s</a>
-
-[tool]
-ago = vor
-from_now = ab sofort
-now = Jetzt
-1s = 1 Sekunde %s
-1m = 1 Minute %s
-1h = 1 Stunde %s
-1d = 1 Tag %s
-1w = 1 Woche %s
-1mon = 1 Monat %s
-1y = 1 Jahr %s
-seconds = %d Sekunden %s
-minutes = %d Minuten %s
-hours = %d Stunden %s
-days = %d Tage %s
-weeks = %d Wochen %s
-months = %d Monate %s
-years = %d Jahre %s
-raw_seconds = Sekunden
-raw_minutes = Minuten
+app_desc=Ein einfacher, selbst gehosteter Git-Service, geschrieben in Go
+
+home=Home
+dashboard=Übersicht
+explore=Erkunden
+help=Hilfe
+sign_in=Anmelden
+social_sign_in=Anmeldung über soziales Konto: zweiter Schritt <small>Konto verknüpfen</small>
+sign_out=Abmelden
+sign_up=Registrieren
+register=Registrieren
+website=Webseite
+version=Version
+page=Seite
+template=Vorlage
+language=Sprache
+
+username=Benutzername
+email=E-Mail
+password=Passwort
+re_type=Passwort bestätigen
+captcha=Captcha
+
+repository=Repository
+organization=Organisation
+mirror=Spiegel
+new_repo=Neues Repository
+new_migrate=Neue Migration
+new_fork=Neues abgespaltetes Repository
+new_org=Neue Organisation
+manage_org=Organisationen verwalten
+admin_panel=Admin-Panel
+account_settings=Kontoeinstellungen
+settings=Einstellungen
+
+news_feed=News Feed
+pull_requests=Pull Requests
+issues=Issues
+
+cancel=Abbrechen
+
+[install]
+install=Installation
+title=Installation für erstmaligen Start
+requite_db_desc=Gogs erfordert MySQL, PostgreSQL oder SQLite 3, aber SQLite3 ist in der offiziellen binären Version akiviert.
+db_type=Datenbanktyp
+host=Host
+user=Benutzer
+password=Passwort
+db_name=Datenbankname
+db_helper=Bitte verwenden InnoDB-Engine mit utf8_general_ci Zeichensatz für MySQL.
+ssl_mode=SSL-Modus
+path=Pfad
+sqlite_helper=Der Dateipfad des SQLite3 Datenbank.
+general_title=Allgemeine Einstellungen von Gogs
+repo_path=Repository Root-Verzeichnispfad
+repo_path_helper=Alle Git-Repositorys werden in diesem Verzeichnis gespeichert.
+run_user=Ausführender Benutzer
+run_user_helper=Der Benutzer muss die Zugriffsberechtigung für das Repository Root-Verzeichnis haben und der ausführende Benutzer von Gogs sein.
+domain=Domain
+domain_helper=Dies hat Auswirkung auf die SSH clone URLs.
+app_url=Anwendungs-URL
+app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS clone URLs und für die E-Mails.
+email_title=E-Mail-Service-Einstellungen (optional)
+smtp_host=SMTP Host
+mailer_user=Sender E-mail
+mailer_password=Sender Passwort
+notify_title=Benachrichtigungseinstellungen (optional)
+register_confirm=Registrierungsbestätigung aktvieren
+mail_notify=E-Mail-Benachrichtgung aktivieren
+admin_title=Konto-Einstellungen für den Administrator
+admin_name=Benutzername
+admin_password=Passwort
+confirm_password=Passwort bestätigen
+admin_email=E-Mail
+install_gogs=Gogs installieren
+test_git_failed=Fehler beim Test des 'git' Kommandos: %v
+sqlite3_not_available=Deine Version unterstützt SQLite3 nicht, bitte lade dir die offizielle binäre Version von %s herunter, NICHT die gobuild-Version.
+invalid_db_setting=Datenbank-Einstellungen sind nicht korrekt: %v
+invalid_repo_path=Repository Root-Verzeichnis ist ungültig: %v
+run_user_not_match=Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s
+save_config_failed=Versuche die Konfiguration zu speichern ist fehlgeschlagen: %v
+invalid_admin_setting=Admin-Konto Einstellungen sind ungültig: %v
+install_success=Herzlich Willkommen! Wir sind froh, dass du dich für Gogs entschieden hast. Hab viel Vergnügen damit.
+
+[home]
+uname_holder=Benutzername oder E-Mail
+password_holder=Passwort
+switch_dashboard_context=Dashboard Kontext wechseln
+my_repos=Meine Repositorys
+collaborative_repos=Gemeinschaftliche Repositorys
+my_orgs=Meine Organisationen
+my_mirrors=Meine Spiegel
+
+[explore]
+repos=Repositorys
+
+[auth]
+create_new_account=Neues Konto erstellen
+register_hepler_msg=Du hast schon ein Konto? Jetzt anmelden!
+social_register_hepler_msg=Du hast schon ein soziales Konto? Jetzt verknüpfen!
+disable_register_prompt=Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator.
+disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.
+remember_me=angemeldet bleiben
+forgot_password=Passwort vergessen
+forget_password=Passwort vergessen?
+sign_up_now=Du willst ein Konto? Jetzt registrieren!
+confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an <b>%s</b> gesendet. Kontrolliere dein Postfach innerhalb der nächsten %d Stunden, um die Registrierung abzuschließen.
+sign_in_email=Melde dich mit deiner E-Mail-Adresse an
+active_your_account=Aktiviere dein Konto
+resent_limit_prompt=Es tut uns leid, du sendest zu häufig Aktivierungs-E-Mails. Bitte warte 3 Minuten.
+has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (<b>%s</b>). Falls du noch keine Bestätigungs-E-Mail erhalten hast oder eine neue senden musst, klicke auf den unteren Button.
+resend_mail=Hier klicken, um deine Aktivierungs-E-Mail erneut zu versenden
+email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft.
+send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden
+reset_password=Passwort zurücksetzen
+invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.
+reset_password_helper=Hier klicken, um das Passwort zurückzusetzen
+password_too_short=Das Passwort muss mindenstens 6 Zeichen lang sein
+
+[form]
+UserName=Benutzername
+RepoName=Repository-Name
+Email=E-Mail-Adresse
+Password=Passwort
+Retype=Passwort bestätigen
+SSHTitle=SSH-Schlüsselname
+HttpsUrl=HTTPS-URL
+PayloadUrl=Payload-URL
+TeamName=Teamname
+AuthName=Authentifizierungsname
+AdminEmail=Admin E-mail
+
+require_error=` darf nicht leer sein.`
+alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.`
+alpha_dash_dot_error=` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.`
+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.`
+unknown_error=Unbekannter Fehler:
+captcha_incorrect=Captcha stimmt nicht überein.
+password_not_match=Die Passwörter stimmen nicht überein.
+
+username_been_taken=Benutzername ist bereits vergeben.
+repo_name_been_taken=Repository-Name ist bereits vergeben.
+org_name_been_taken=Organisationsname ist bereits vergeben.
+team_name_been_taken=Teamname ist bereits vergeben.
+email_been_used=E-Mail-Adresse wird bereits verwendet.
+ssh_key_been_used=SSH-Schlüsselname wird bereits verwendet.
+illegal_username=Benutzername enthält ungültige Zeichen.
+illegal_repo_name=Repository-Name enthält ungültige Zeichen.
+illegal_org_name=Organisationsname enthält ungültige Zeichen.
+illegal_team_name=Teamname enthält ungültige Zeichen.
+username_password_incorrect=Benutzername oder Passwort ist nicht korrekt.
+enterred_invalid_repo_name=Bitte stelle sicher, dass der eingegeben Repository-Name richtig ist.
+enterred_invalid_owner_name=Bitte stelle sicher, dass der eingegeben Besitzername richtig ist.
+enterred_invalid_password=Bitte stelle sicher, dass das eingegebene Passwort richtig ist.
+user_not_exist=Angegebener Benutzer existiert nicht.
+last_org_owner=Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben.
+
+invalid_ssh_key=Leider sind wir nicht in der Lage, deinen SSH-Schlüssel zu überprüfen: %s
+unable_verify_ssh_key=Gogs kann deinen SSH-Schlüssel nicht verifizieren, nimmt aber an, dass er gültig ist. Bitte stelle dies selbst sicher.
+auth_failed=Authentifizierung fehlgeschlagen: %v
+
+still_own_repo=Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+still_has_org=Ihr Konto noch Mitgliedschaft in der Organisation, Sie nach links oder löschen Sie sie zuerst.
+org_still_own_repo=Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+
+still_own_user=Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut.
+
+target_branch_not_exist=Ziel-Branch existiert nicht
+
+[user]
+change_avatar=Ändere dein Profilbild auf gravatar.com
+join_on=Registriert
+repositories=Repositorys
+activity=Öffentliche Aktivität
+followers=Folgen
+starred=Markiert
+following=Folgt
+
+[settings]
+profile=Profil
+password=Passwort
+ssh_keys=SSH-Schlüssel
+social=Soziale Konten
+applications=Anwendungen
+orgs=Organisationen
+delete=Konto löschen
+uid=Uid
+
+public_profile=Öffentliches Profil
+profile_desc=Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken.
+full_name=Vollständiger Name
+website=Webseite
+location=Standort
+update_profile=Profil aktualisieren
+update_profile_success=Profil aktualisiert
+change_username=Benutzername geändert
+change_username_desc=Benutzername wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die dein Konto betreffen.
+continue=Weiter
+cancel=Abbrechen
+
+change_password=Passwort ändern
+old_password=Aktuelles Passwort
+new_password=Neues Passwort
+password_incorrect=Aktuelles Passwort ist nicht korrekt.
+change_password_success=Passwort geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden.
+
+manage_ssh_keys=SSH-Schlüssel verwalten
+add_key=SSH-Schlüssel hinzufügen
+ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verknüpft sind. Entferne alle Schlüssel, die du nicht kennst.
+ssh_helper=<strong>Du brauchst Hilfe?</strong> Hier ist eine Anleitung zum <a href="%s">Erzeugen von SSH-Schlüsseln</a> oder <a href="%s">Problemlösen einfacher SSH-Probleme</a>.
+add_new_key=SSH-Schlüssel hinzufügen
+key_name=Schlüsselname
+key_content=Inhalt
+add_key_success=SSH-Schlüssel hinzugefügt
+delete_key=SSH-Schlüssel löschen
+add_on=Hinzugefügt am
+last_used=Zuletzt verwendet auf
+no_activity=Keine neuen Aktivitäten
+
+manage_social=Verknüpfte soziale Konten verwalten
+social_desc=Dies ist eine Liste verknüpfter sozialer Konten. Entferne alle Verknüpfungen, die du nicht kennst.
+unbind=Verknüpfung entfernen
+unbind_success=Die Verknüpfung zum sozialen Konto wurde entfernt.
+
+manage_access_token=Verwaltung persönlicher Zugangs-Tokens
+generate_new_token=Neues Token erzeugen
+tokens_desc=Die von dir erzeugten Tokens können zum Zugriff auf die Gogs-API verwendet werden.
+new_token_desc=Momentan erlaubt jedes Token vollen Zugriff auf dein Konto.
+token_name=Token-Name
+generate_token=Token erzeugen
+generate_token_succees=Neues Zugangs-Token wurde erstellt! Bitte kopiere dein persönliches Zugangs-Token jetzt. Du wirst es später nicht mehr anzeigen können!
+delete_token=Löschen
+delete_token_success=Persönliches Zugangs-Token wurde gelöscht! Vergiss nicht, auch deine Anwendungen zu aktualisieren.
+
+delete_account=Konto löschen
+delete_prompt=Diese Aktion wird dein Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden!
+confirm_delete_account=Löschen
+delete_account_title=Account löschen
+delete_account_desc=Du bist dabei dieses Konto dauerhaft zu löschen, willst du fortfahren?
+
+[repo]
+owner=Besitzer
+repo_name=Repository-Name
+repo_name_helper=Gute Repository-Namen sind kurz, einprägsam und <strong>einzigartig</strong>.
+visibility=Sichtbarkeit
+visiblity_helper=Dieses Repository ist <span class="label label-red label-radius">Privat</span>
+fork_repo=Repository abspalten
+fork_from=Abspaltung von
+fork_visiblity_helper=Sichtbarkeit von abgespalteten Repositories ist nicht veränderbar
+repo_desc=Beschreibung
+repo_lang=Sprache
+repo_lang_helper=Wähle eine .gitignore Datei
+license=Lizenz
+license_helper=Wähle eine Lizenz aus
+init_readme=Repository mit README.md initialisieren
+create_repo=Repository erstellen
+default_branch=Standard-Branch
+mirror_interval=Spiegel-Intervall (in Stunden)
+goget_meta=Go-Get Meta
+goget_meta_helper=Dieses Repository wird man mit <span class="label label-blue label-radius">go get</span> klonen können.
+
+need_auth=Authorisierung benötigt
+migrate_type=Migrationstyp
+migrate_type_helper=Dieses Repository wird ein <span class="label label-blue label-radius">Spiegel</span>
+migrate_repo=Repository migrieren
+
+copy_link=Kopieren
+click_to_copy=In Zwischenablage kopieren
+copied=Kopiert OK
+clone_helper=Du brauchst Hilfe beim Klonen? Hier gibt es <a target="_blank" href="%s">Hilfe</a>!
+unwatch=Beobachtung beenden
+watch=Beobachtung
+unstar=Markierung aufheben
+star=Markierung
+fork=Abspaltung
+
+no_desc=Keine Beschreibung
+quick_guide=Kurzanleitung
+clone_this_repo=Dieses Repository klonen
+create_new_repo_command=Erstelle ein neues Repository mittels der Kommandozeile
+push_exist_repo=Übertrage ein existierendes Repository von der Kommandozeile
+
+branch=Branch
+tree=Struktur
+branch_and_tags=Branches & Tags
+branches=Branches
+tags=Markierungen
+issues=Issues
+commits=Commits
+releases=Veröffentlichungen
+file_raw=Roh
+file_history=Verlauf
+file_view_raw=Ansicht Roh
+
+commits.commits=Commits
+commits.search=Durchsuche Commits
+commits.find=Finden
+commits.author=Author
+commits.message=Mitteilung
+commits.date=Datum
+commits.older=Älter
+commits.newer=Neuer
+
+settings=Einstellungen
+settings.options=Optionen
+settings.collaboration=Zusammenarbeit
+settings.hooks=Webhooks
+settings.githooks=Git-Hooks
+settings.deploy_keys=Deploy-Keys
+settings.basic_settings=Grundeinstellungen
+settings.danger_zone=Gefahrenzone
+settings.site=Offizielle Webseite
+settings.update_settings=Aktualisierungseinstellungen
+settings.change_reponame=Name des Repositories geändert
+settings.change_reponame_desc=Repository-Name wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die dieses Repository betreffen.
+settings.transfer=Besitz übertragen
+settings.transfer_desc=Übertrage dieses Repository einem anderen Benutzer oder einer Organisation.
+settings.new_owner_has_same_repo=Neuer Eigentümer hat bereits ein Repository mit dem gleichen Namen.
+settings.delete=Repository löschen
+settings.delete_desc=Wenn dieses Repository gelöscht ist, gibt es keinen Weg zurück. Sei dir sicher!
+settings.transfer_notices=<p>- Du wirst den Zugriff verlieren, falls der neue Besitzer ein einzelner Benutzer ist.</p><p>- Du wirst deinen Zugang behalten, falls der neue Besitzer eine Organisation ist, und du zu ihren Besitzern gehörst.</p>
+settings.update_settings_success=Repository-Optionen aktualisiert
+settings.transfer_owner=Neuer Besitzer
+settings.make_transfer=übertragen
+settings.transfer_succeed=Repository-Eigentum wurde erfolgreich übertragen.
+settings.confirm_delete=Löschen
+settings.add_collaborator=Mitarbeiter hinzufügen
+settings.add_collaborator_success=Mitarbeiter hinzugefügt
+settings.remove_collaborator_success=Mitarbeiter entfernt
+settings.user_is_org_member=Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden.
+settings.add_webhook=Webhook hinzufügen
+settings.hooks_desc=Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem <a target="_blank" href="%s">Webhooks Guide</a>.
+settings.githooks_desc=Git-Hooks werden von Git selbst bereitgestellt. Du kannst die Dateien der unterstützten Hooks in der Liste unten bearbeiten, um eigene Operationen einzubinden.
+settings.githook_edit_desc=Wenn ein Hook nicht aktiv ist, wird der Standardinhalt benutzt. Lasse den Inhalt leer, um den Hook zu deaktivieren.
+settings.githook_name=Hook-Name
+settings.githook_content=Hook-Inhalt
+settings.update_githook=Aktualisiere Hook
+settings.remove_hook_success=Webhook entfernt
+settings.add_webhook_desc=GoGS sendet einen <code>POST</code>-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). Mehr Informationen findest du im <a target="_blank" href="%s">Webhooks Guide</a>.
+settings.payload_url=Payload-URL
+settings.content_type=Inhaltstyp
+settings.secret=Secret
+settings.event_desc=Welche Ereignisse sollen diesen Webhook auslösen?
+settings.event_push_only=Nur das <code>push</code>-Ereignis.
+settings.active=Aktiv
+settings.active_helper=Ereignisdetails werden ausgeliefert, wenn dieser Webhook ausgelöst wird.
+settings.add_hook_success=Webhook hinzugefügt
+settings.update_webhook=Webhook aktualisieren
+settings.update_hook_success=Webhook aktualisiert
+settings.delete_webhook=Webhook löschen
+settings.recent_deliveries=letzte Zustellungen
+settings.hook_type=Hook Typ
+settings.add_slack_hook_desc=Füge <a href="%s">Slack</a>-Integration zu deinem Repository hinzu.
+settings.slack_token=Token
+settings.slack_domain=Domain
+settings.slack_channel=Kanal
+
+diff.browse_source=Quellcode durchsuchen
+diff.parent=Ursprung
+diff.commit=Commit
+diff.data_not_available=Keine Diff-Daten verfügbar.
+diff.show_diff_stats=Diff-Statistik anzeigen
+diff.stats_desc=<strong> %d geänderte Dateien</strong> mit <strong>%d neuen Zeilen</strong> und <strong>%d gelöschten Zeilen</strong>
+diff.bin=BIN
+diff.view_file=Datei anzeigen
+
+[org]
+org_name_holder=Name der Organisation
+org_name_helper=Gute Namen von Organisationen sind kurz und einprägsam.
+org_email_helper=Das E-Mail-Konto der Organisation empfängt alle Benachrichtigungen.
+create_org=Organisation erstellen
+repo_updated=Aktualisiert
+people=Personen
+invite_someone=Benutzer einladen
+teams=Teams
+lower_members=Mitglieder
+lower_repositories=Repositorys
+create_new_team=Neues Team erstellen
+org_desc=Beschreibung
+team_name=Teamname
+team_desc=Beschreibung
+team_name_helper=Verwende diesen Namen, um dich auf dieses Team zu beziehen.
+team_desc_helper=Was hat es mit diesem Team auf sich?
+team_permission_desc=Welche Berechtigungsstufe soll das Team haben?
+
+settings=Einstellungen
+settings.options=Optionen
+settings.full_name=Vollständiger Name
+settings.website=Webseite
+settings.location=Standort
+settings.update_settings=Aktualisierungseinstellungen
+settings.change_orgname=Organisationsname geändert
+settings.change_orgname_desc=Organisationsname wurde geändert, möchtest du fortfahren? Dies beeinträchtigt sämtliche Links, die diese Organisation betreffen.
+settings.update_setting_success=Organisationseinstellungen aktualisiert
+settings.delete=Organisation löschen
+settings.delete_account=Diese Organisation löschen
+settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies kann <strong>NICHT</strong> rückgängig gemacht werden!
+settings.confirm_delete_account=Löschen
+settings.delete_org_title=Organisation löschen
+settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht, möchtest du fortfahren?
+settings.hooks_desc=Füge Webhooks hinzu, die für <strong>alle</strong> Repositorys dieser Organisation ausgelöst werden.
+
+members.public=Öffentlich
+members.public_helper=Privat machen
+members.private=Privat
+members.private_helper=Öffentlich machen
+members.owner=Besitzer
+members.member=Mitglied
+members.conceal=Verbergen
+members.remove=Entfernen
+members.leave=Verlassen
+members.invite_desc=Benutzernamen eingeben, um ihn als neues Mitglied in %s einzuladen:
+members.invite_now=Jetzt einladen
+
+teams.join=Beitreten
+teams.leave=Verlassen
+teams.read_access=Lesezugriff
+teams.read_access_helper=Dieses Team wird Repositorys einsehen und klonen können.
+teams.write_access=Schreibzugriff
+teams.write_access_helper=Dieses Team wird die Repositorys einsehen und in sie hinein pushen können.
+teams.admin_access=Adminzugriff
+teams.admin_access_helper=Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können.
+teams.no_desc=Dieses Team hat keine Beschreibung
+teams.settings=Einstellungen
+teams.owners_permission_desc=Besitzer haben vollen Zugriff auf <strong>alle Repositorys</strong> und <strong>Admin Rechte</strong> für diese Organisation.
+teams.members=Teammitglieder
+teams.update_settings=Einstellungen aktualisieren
+teams.delete_team=Dieses Team löschen
+teams.add_team_member=Teammitglied hinzufügen
+teams.delete_team_title=Team löschen
+teams.delete_team_desc=Dieses Team wird gelöscht, möchtest du fortfahren? Mitglieder dieses Teams verlieren möglicherweise ihren Zugang zu einigen Repositories.
+teams.delete_team_success=Team gelöscht
+teams.read_permission_desc=Dieses Team hat <strong>Lesezugriff</strong>: Mitglieder können Team-Repositories einsehen und klonen.
+teams.write_permission_desc=Dieses Team erlaubt <strong>Schreibzugriff</strong>: Mitglieder können Team-Repositorys einsehen und hinein pushen.
+teams.admin_permission_desc=Diese Team erlaubt <strong>Adminzugriff</strong>: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen.
+teams.repositories=Team-Repositorys
+teams.add_team_repository=Team-Repository hinzufügen
+teams.remove_repo=Entfernen
+teams.add_nonexistent_repo=Das Repository, das du hinzufügen willst, existiert nicht. Bitte erstelle es zuerst.
+
+[admin]
+dashboard=Dashboard
+users=Benutzer
+organizations=Organisationen
+repositories=Repositorys
+authentication=Authentifizierung
+config=Konfiguration
+notices=System-Mitteilungen
+monitor=Monitoring
+prev=zurück
+next=vor
+
+dashboard.statistic=Statistik
+dashboard.operations=Operationen
+dashboard.system_status=System-Monitor-Status
+dashboard.statistic_info=GoGS Datenbank hat <b>%d</b> Benutzer, <b>%d</b> Organisationen, <b>%d</b> öffentliche Schlüssel, <b>%d</b> Repositorys, <b>%d</b> Beobachtungen, <b>%d</b> Markierungen, <b>%d</b> Aktionen, <b>%d</b> Zugriffe, <b>%d</b> Issues, <b>%d</b> Kommentare, <b>%d</b> soziale Konten, <b>%d</b> Folgende, <b>%d</b> Spiegel, <b>%d</b> Releases, <b>%d</b> Login-Quellen, <b>%d</b> Webhooks, <b>%d</b> Milestones, <b>%d</b> Labels, <b>%d</b> Hook-Tasks, <b>%d</b> Teams, <b>%d</b> Aktualisierungs-Tasks, <b>%d</b> Anhänge.
+dashboard.operation_name=Name der Operation
+dashboard.operation_switch=Switch
+dashboard.operation_run=Ausführen
+dashboard.clean_unbind_oauth=ungebundene OAuths bereinigen
+dashboard.delete_inactivate_accounts=inaktive Konten löschen
+dashboard.server_uptime=Server-Uptime
+dashboard.current_goroutine=Aktuelle Goroutines
+dashboard.current_memory_usage=Aktuelle Speichernutzung
+dashboard.total_memory_allocated=Zugeteilter Gesamtspeicher
+dashboard.memory_obtained=Erhaltener Speicher
+dashboard.pointer_lookup_times=Pointer Lookup Times
+dashboard.memory_allocate_times=Memory Allocate Times
+dashboard.memory_free_times=Memory Free Times
+dashboard.current_heap_usage=Aktuelle Heap-Auslastung
+dashboard.heap_memory_obtained=erhaltener Heap-Memory
+dashboard.heap_memory_idle=unbenutzter Heap-Memory
+dashboard.heap_memory_in_use=benutzter Heap-Memory
+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=erhaltene MSpan-Structures
+dashboard.mcache_structures_usage=MCache-Structures-Auslastung
+dashboard.mcache_structures_obtained=erhaltene MCache-Structures
+dashboard.profiling_bucket_hash_table_obtained=Profiling Bucket Hash Table Obtained
+dashboard.gc_metadata_obtained=erhaltene GC-Metadata
+dashboard.other_system_allocation_obtained=andere erhaltene System-Allokatoren
+dashboard.next_gc_recycle=nächster GC-Zyklus
+dashboard.last_gc_time=seit letztem GC-Zyklus
+dashboard.total_gc_time=gesammte GC-Zeit
+dashboard.total_gc_pause=gesammte GC-Pause
+dashboard.last_gc_pause=letzte GC-Pause
+dashboard.gc_times=GC-Takt
+
+users.user_manage_panel=Benutzer
+users.new_account=Neues Konto erstellen
+users.name=Name
+users.activated=Aktiviert
+users.admin=Admin
+users.repos=Repositorys
+users.created=Erzeugt
+users.edit=Bearbeiten
+users.auth_source=Auth-Quelle
+users.local=Lokal
+users.auth_login_name=Auth-Login-Name
+users.update_profile_success=Kontoprofil aktualisiert
+users.edit_account=Konto bearbeiten
+users.is_activated=Dieses Konto ist aktiviert
+users.is_admin=Dieses Konto hat Administratorrechte
+users.allow_git_hook=Dieses Konto verfügt über Berechtigungen zum Erstellen von Git hooks
+users.update_profile=Kontoprofil aktualisieren
+users.delete_account=Dieses Konto löschen
+users.still_own_repo=Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden.
+users.still_has_org=Dieses Konto noch Mitgliedschaft in der Organisation, Sie nach links oder löschen Sie sie zuerst.
+
+orgs.org_manage_panel=Organisationenverwaltung
+orgs.name=Name
+orgs.teams=Teams
+orgs.members=Mitglieder
+
+repos.repo_manage_panel=Repositorys
+repos.owner=Besitzer
+repos.name=Name
+repos.private=Privat
+repos.watches=Beobachtungen
+repos.stars=Markierungen
+repos.issues=Issues
+
+auths.auth_manage_panel=Authentifizierung
+auths.new=Neue Authentifizierungsquelle hinzufügen
+auths.name=Name
+auths.type=Typ
+auths.enabled=aktiviert
+auths.updated=aktualisiert
+auths.auth_type=Authentifizierungstyp
+auths.auth_name=Authentifizierungsname
+auths.domain=Domain
+auths.host=Host
+auths.port=Port
+auths.base_dn=Base DN
+auths.attributes=Suchattribute
+auths.filter=Suchfilter
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=SMTP-Authentifizierungstyp
+auths.smtphost=SMTP-Host
+auths.smtpport=SMTP-Port
+auths.enable_tls=TLS-Verschlüsselung aktivieren
+auths.enable_auto_register=Automatische Registrierung aktivieren
+auths.tips=Tipps
+auths.edit=Authentifizierungseinstellungen bearbeiten
+auths.activated=Diese Authentifizierung ist aktiviert
+auths.update_success=Authentifizierungseinstellungen aktualisiert
+auths.update=Authentifizierungseinstellungen aktualisieren
+auths.delete=Authentifizierung löschen
+auths.delete_auth_title=Authentifizierungsquelle löschen
+auths.delete_auth_desc=Diese Authentifizierungsquelle wird gelöscht, möchtest du fortfahren?
+
+config.server_config=Server-Konfiguration
+config.app_name=Anwendungsname
+config.app_ver=Anwendungsversion
+config.app_url=Anwendungs-URL
+config.domain=Domain
+config.offline_mode=Offline-Modus
+config.disable_router_log=Router-Log deaktivieren
+config.run_user=Laufzeit-Benutzer
+config.run_mode=Laufzeit-Modus
+config.repo_root_path=Repository-Verzeichnis
+config.static_file_root_path=Verzeichnis für statische Dateien
+config.log_file_root_path=Log-Verzeichnis
+config.script_type=Skript-Typ
+config.reverse_auth_user=Nutzer bei Reverse-Authentifizierung
+config.db_config=Datenbankkonfiguration
+config.db_type=Typ
+config.db_host=Host
+config.db_name=Name
+config.db_user=Benutzer
+config.db_ssl_mode=SSL-Modus
+config.db_ssl_mode_helper=(nur für "postgres")
+config.db_path=Verzeichnis
+config.db_path_helper=(nur für "sqlite3")
+config.service_config=Service-Einstellungen
+config.register_email_confirm=E-Mail-Bestätigung bei Registrierung
+config.disable_register=Registrierung deaktivieren
+config.require_sign_in_view=Ansehen erfordert Registrierung
+config.mail_notify=E-Mail-Benachrichtigung
+config.enable_cache_avatar=Avatar-Cache aktivieren
+config.active_code_lives=Aktivierungscode Lebensdauer
+config.reset_password_code_lives=Passwortcode Lebensdauer
+config.webhook_config=Webhook-Einstellungen
+config.task_interval=Task-Intervall
+config.deliver_timeout=Zeitlimit für Zustellung
+config.mailer_config=Mailer-Einstellungen
+config.mailer_enabled=Aktiviert
+config.mailer_name=Name
+config.mailer_host=Host
+config.mailer_user=Benutzer
+config.oauth_config=OAuth-Einstellungen
+config.oauth_enabled=Aktiviert
+config.cache_config=Cache-Einstellungen
+config.cache_adapter=Cache-Adapter
+config.cache_interval=Cache-Intervall
+config.cache_conn=Cache-Anbindung
+config.session_config=Session-Einstellungen
+config.session_provider=Session-Provider
+config.provider_config=Provider-Einstellungen
+config.cookie_name=Cookie-Name
+config.enable_set_cookie=Cookies einschalten
+config.gc_interval_time=GC-Intervallzeit
+config.session_life_time=Session-Lebensdauer
+config.https_only=nur HTTPS
+config.cookie_life_time=Cookie-Lebensdauer
+config.picture_config=Bildeinstellungen
+config.picture_service=Bildservice
+config.disable_gravatar=Gravatar deaktivieren
+config.log_config=Log-Einstellungen
+config.log_mode=Log-Modus
+
+monitor.cron=Cron-Tasks
+monitor.name=Name
+monitor.schedule=Zeitplan
+monitor.next=nächste Ausführung
+monitor.previous=letzte Ausführung
+monitor.execute_times=Anzahl Ausführungen
+monitor.process=Laufende Prozesse
+monitor.desc=Beschreibung
+monitor.start=Startzeit
+monitor.execute_time=Ausführungszeit
+
+notices.system_notice_list=System-Mitteilungen
+notices.type=Typ
+notices.type_1=Repository
+notices.desc=Beschreibung
+notices.op=Op.
+notices.delete_success=System-Mitteilung erfolgreich gelöscht.
+
+[action]
+create_repo=hat Repository <a href="%s/%s">%s</a> erstellt
+commit_repo=hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
+create_issue=hat Issue <a href="%s/%s/issues/%s">%s#%s</a> eröffnet
+comment_issue=hat Issue <a href="%s/%s/issues/%s">%s#%s</a> kommentiert
+transfer_repo=hat Repository <code>%s</code> transferiert an <a href="/%s%s">%s</a>
+push_tag=hat nach <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a> gepusht
+compare_2_commits=Zeige Vergleich dieser 2 Commits
+
+[tool]
+ago=vor
+from_now=ab sofort
+now=Jetzt
+1s=%s 1 Sekunde
+1m=%s 1 Minute
+1h=%s 1 Stunde
+1d=%s 1 Tag
+1w=%s 1 Woche
+1mon=%s 1 Monat
+1y=%s 1 Jahr
+seconds=%[2]s %[1]d Sekunden
+minutes=%[2]s %[1]d Minuten
+hours=%[2]s %[1]d Stunden
+days=%[2]s %[1]d Tagen
+weeks=%[2]s %[1]d Wochen
+months=%[2]s %[1]d Monaten
+years=%[2]s %[1]d Jahren
+raw_seconds=Sekunden
+raw_minutes=Minuten
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini
index 4b85143a..a061bcb2 100644
--- a/conf/locale/locale_en-US.ini
+++ b/conf/locale/locale_en-US.ini
@@ -26,6 +26,7 @@ organization = Organization
mirror = Mirror
new_repo = New Repository
new_migrate = New Migration
+new_fork = New Fork Repository
new_org = New Organization
manage_org = Manage Organizations
admin_panel = Admin Panel
@@ -41,7 +42,7 @@ cancel = Cancel
[install]
install = Installation
title = Install Steps For First-time Run
-requite_db_desc = Gogs requires MySQL, PostgreSQL or SQLite3, but SQLite3.
+requite_db_desc = Gogs requires MySQL, PostgreSQL or SQLite3.
db_type = Database Type
host = Host
user = User
@@ -74,7 +75,7 @@ confirm_password = Confirm Password
admin_email = E-mail
install_gogs = Install Gogs
test_git_failed = Fail to test 'git' command: %v
-sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from http://gogs.io/docs/installation/install_from_binary.html, NOT the gobuild version.
+sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version.
invalid_db_setting = Database setting is not correct: %v
invalid_repo_path = Repository root path is invalid: %v
run_user_not_match = Run user isn't the current user: %s -> %s
@@ -163,10 +164,13 @@ unable_verify_ssh_key = Gogs cannot verify your SSH key, but we assume that is v
auth_failed = Authentication failed: %v
still_own_repo = Your account still have ownership of repository, you have to delete or transfer them first.
+still_has_org = Your account still have membership of organization, you have to left or delete them first.
org_still_own_repo = This organization still have ownership of repository, you have to delete or transfer them first.
still_own_user = This authentication still has used by some users, you should move them and then delete again.
+target_branch_not_exist = Target branch does not exist
+
[user]
change_avatar = Change your avatar at gravatar.com
join_on = Joined on
@@ -181,6 +185,7 @@ profile = Profile
password = Password
ssh_keys = SSH Keys
social = Social Accounts
+applications = Applications
orgs = Organizations
delete = Delete Account
uid = Uid
@@ -206,7 +211,7 @@ change_password_success = Password is changed successfully. You can now sign in
manage_ssh_keys = Manage SSH Keys
add_key = Add Key
ssh_desc = This is a list of SSH keys associated with your account. Remove any keys that you do not recognize.
-ssh_helper = <strong>Need help?</strong> Check out our guide to <a href="https://help.github.com/articles/generating-ssh-keys">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/">common SSH Problems</a>.
+ssh_helper = <strong>Need help?</strong> Check out our guide to <a href="%s">generating SSH keys</a> or troubleshoot <a href="%s">common SSH Problems</a>.
add_new_key = Add SSH Key
key_name = Key Name
key_content = Content
@@ -221,6 +226,16 @@ social_desc = This is a list of associated social accounts. Remove any binding t
unbind = Unbind
unbind_success = Social account has been unbound.
+manage_access_token = Manage Personal Access Tokens
+generate_new_token = Generate New Token
+tokens_desc = Tokens you have generated that can be used to access the Gogs API.
+new_token_desc = As for now, every token will have full access to your account.
+token_name = Token Name
+generate_token = Generate Token
+generate_token_succees = New access token has been generated successfully! Make sure to copy your new personal access token now. You won't be able to see it again!
+delete_token = Delete
+delete_token_success = Personal access token has been deleted successfully! Don't forget to update your applications as well.
+
delete_account = Delete Your Account
delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone!
confirm_delete_account = Confirm Deletion
@@ -233,6 +248,9 @@ repo_name = Repository Name
repo_name_helper = Great repository names are short, memorable and <strong>unique</strong>.
visibility = Visibility
visiblity_helper = This repository is <span class="label label-red label-radius">Private</span>
+fork_repo = Fork Repository
+fork_from = Fork From
+fork_visiblity_helper = Forked repository cannot change its visiblity
repo_desc = Description
repo_lang = Language
repo_lang_helper = Select a .gitignore file
@@ -253,7 +271,7 @@ migrate_repo = Migrate Repository
copy_link = Copy
click_to_copy = Copy to clipboard
copied = Copied OK
-clone_helper = Need help cloning? Visit <a target="_blank" href="http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository">Help</a>!
+clone_helper = Need help cloning? Visit <a target="_blank" href="%s">Help</a>!
unwatch = Unwatch
watch = Watch
unstar = Unstar
@@ -315,14 +333,14 @@ settings.add_collaborator_success = New collaborator has been added.
settings.remove_collaborator_success = Collaborator has been removed.
settings.user_is_org_member = User is organization member who cannot be added as a collaborator.
settings.add_webhook = Add Webhook
-settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>.
+settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our <a target="_blank" href="%s">Webhooks Guide</a>.
settings.githooks_desc = Git Hooks are powered by Git itself, you can edit files of supported hooks in the list below to apply custom operations.
settings.githook_edit_desc = If hook is not active, sample content will be presented. Leave content to be blank will disable this hook.
settings.githook_name = Hook Name
settings.githook_content = Hook Content
settings.update_githook = Update Hook
settings.remove_hook_success = Webhook has been removed.
-settings.add_webhook_desc = We’ll send a <code>POST</code> request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). More information can be found in <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks Guide</a>.
+settings.add_webhook_desc = We’ll send a <code>POST</code> request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). More information can be found in <a target="_blank" href="%s">Webhooks Guide</a>.
settings.payload_url = Payload URL
settings.content_type = Content Type
settings.secret = Secret
@@ -336,7 +354,7 @@ settings.update_hook_success = Webhook has been updated.
settings.delete_webhook = Delete Webhook
settings.recent_deliveries = Recent Deliveries
settings.hook_type = Hook Type
-settings.add_slack_hook_desc = Add <a href="http://slack.com">Slack</a> integration to your repository.
+settings.add_slack_hook_desc = Add <a href="%s">Slack</a> integration to your repository.
settings.slack_token = Token
settings.slack_domain = Domain
settings.slack_channel = Channel
@@ -490,9 +508,11 @@ users.update_profile_success = Account profile has been successfully updated.
users.edit_account = Edit Account
users.is_activated = This account is activated
users.is_admin = This account has administrator permissions
+users.allow_git_hook = This account has permissions to create Git hooks
users.update_profile = Update Account Profile
users.delete_account = Delete This Account
users.still_own_repo = This account still have ownership of repository, you have to delete or transfer them first.
+users.still_has_org = This account still have membership of organization, you have to left or delete them first.
orgs.org_manage_panel = Organization Manage Panel
orgs.name = Name
@@ -590,8 +610,6 @@ config.gc_interval_time = GC Interval Time
config.session_life_time = Session Life Time
config.https_only = HTTPS Only
config.cookie_life_time = Cookie Life Time
-config.session_hash_function = Session ID Hash Function
-config.session_hash_key = Session ID Hash Key
config.picture_config = Picture Configuration
config.picture_service = Picture Service
config.disable_gravatar = Disable Gravatar
diff --git a/conf/locale/locale_fr-CA.ini b/conf/locale/locale_fr-CA.ini
index 3f5d705f..5ebe53e0 100644..100755
--- a/conf/locale/locale_fr-CA.ini
+++ b/conf/locale/locale_fr-CA.ini
@@ -1,516 +1,679 @@
-app_desc = Un service Git écrit en Go auto-hébergé
-
-home = Accueil
-dashboard = Tableau de bord
-explore = Explorer
-help = Aide
-sign_in = Connexion
-social_sign_in = Authentification via Internet: 2ème étape <small>associé le compte</small>
-sign_out = Déconnexion
-sign_up = Créer un compte
-register = S'inscrire
-website = Site web
-version = Version
-page = Page
-template = Gabarit
-language = Langage
-
-username = Usager
-email = Courriel
-password = Mot de passe
-re_type = Saisir à nouveau
-captcha = Captcha
-
-repository = Dépôt
-organization = Organisation
-mirror = Mirroir
-new_repo = Nouveau dépôt
-new_migrate = Nouvelle migration
-new_org = Nouvel organisation
-manage_org = Gestion des organisations
-admin_panel = Gestion
-account_settings = Profil usager
-settings = Configuration
-
-news_feed = Fil de nouvelles
-pull_requests = Demandes de fusion (pull requests)
-issues = Suivi de problèmes
-
-cancel = Annuler
-
-[home]
-uname_holder = Nom d'usager ou courriel
-password_holder = Mot de passe
-switch_dashboard_context = Changer de tableau de bord
-my_repos = Mes dépôts
-collaborative_repos = Dépôts partagés
-my_orgs = Mes organisations
-my_mirrors = Mes mirroirs
-
-[auth]
-create_new_account = Créer un nouveau compte
-register_hepler_msg = Déjà inscrits? Connectez-vous maintenant!
-social_register_hepler_msg = Déjà inscrits? Branchez-vous!
-disable_register_prompt = Désolé, l'auto-inscription n'est pas activée. Contactez l'admnistrateur du site.
-disable_register_mail = Désolé, la confirmation d'inscription par courriel est désactivée. Contactez l'administrateur du site.
-remember_me = Se souvenir de moi
-forgot_password= Mot de passe oublié
-forget_password = Mot de passe oublié?
-sign_up_now = Besoin d'un compte? Inscrivez-vous maintenant.
-confirmation_mail_sent_prompt = Un courriel de confirmation à été envoyé à <b>%s</b>, consultez vos courriels d'ici %d heures pour terminer l'inscription.
-sign_in_email = Connexion avec votre courriel
-active_your_account = Activez votre compte
-resent_limit_prompt = Désolé vous demandez trop souvent un courriel de confirmation. S.v.p. patientez 3 minutes.
-has_unconfirmed_mail = Bonjour %s, votre adresse courriel n'est pas vérifiée(<b>%s</b>). Si vous n'avez pas reçu de courriel de confirmation ou si vous avez besoin d'en envoyer un maintenant, appuyez sur le bouton ci-dessous.
-resend_mail = Appuyez ici pour envoyer de nouveau un courriel de confirmation.
-email_not_associate = Ce courriel ne correspond à aucun compte.
-send_reset_mail = Appuyez ici pour (ré)envoyer un courriel pour réinitialiser le mot de passe.
-reset_password = Réinitialiser votre mot de passe
-invalid_code = Désolé, ce code de confirmation est périmé ou non-valide.
-reset_password_helper = Appuyez ici pour réinitialiser votre mot de passe
-password_too_short = La longueur du mot de passe doit être d'au moins 6 caractères.
-
-[form]
-UserName = Nom d'usager
-RepoName = Nom du dépôt
-Email = Adresse de courriel
-Password = Mot de passe
-Retype = Mot de passe (confirmation)
-SSHTitle = Nom de la clé SSH
-HttpsUrl = URL HTTPS
-PayloadUrl = URL cible
-TeamName = Nom de l'équipe
-AuthName = Nom d'usager
-
-require_error = ` ne peut être vide.`
-alpha_dash_error = ` doit être composé de caractères alpha-numériques et/ou d'un tiret(-_).`
-alpha_dash_dot_error = ` doit être composé de caractères alpha-numérique, un point(.) et/ou tiret(-_).`
-min_size_error = ` doit être composé d'au moins %s caractères.`
-max_size_error = ` doit être conposé d'au plus %s caractères.`
-email_error = ` n'est pas une adresse de courriel bien formée.`
-url_error = ` n'est pas un URL valide.`
-unknown_error = Erreur inconnue:
-captcha_incorrect = Le captcha ne concorde pas.
-password_not_match = Les deux mots de passe diffèrent.
-
-username_been_taken = `Nom d'usager dèjà utilisé.`
-repo_name_been_taken = Nom de dépôt déjà utilisé.
-org_name_been_taken = Nom d'organisation déjà utilisé.
-team_name_been_taken = Nom d'équipe déjà utilisé.
-email_been_used = Adresse de courriel déjà utilisée.
-ssh_key_been_used = Nom de clé publique déjà utilisé.
-illegal_username = Votre nom d'usager contient des caractères interdits.
-illegal_repo_name = Le nom du dépôt contient des caractères interdits.
-illegal_org_name = Le nom de l'organisation contient des caractères interdits.
-illegal_team_name = Le nom de l'équipe contient des caractères interdits.
-username_password_incorrect = Nom d'usager ou mot de passe erroné.
-enterred_invalid_repo_name = Nom de dépôt inexistant.
-enterred_invalid_owner_name = Responsable de dépôt inexistant.
-enterred_invalid_password = Mot de passe erroné.
-user_not_exist = Nom d'usager inexistant.
-last_org_owner = Ceci est le dernier responsable du dépôt. Il doit y avoir obligatoirement au moins un usager responsable.
-
-invalid_ssh_key = Désolé, impossible de vérifier votre clé SSH: %
-auth_failed = Erreur d'authentification : %v
-
-still_own_repo = Votre compte est responsable d'au moins un dépôt. Vous devez soit détruire ces dépôts, soit transférer la responsabilité à un autre usager.
-org_still_own_repo = Cette organisation est responsable d'au moins un dépôt. Vous devez soit détruire ces dépôts, soit transférer la responsabilité à un autre usager ou organisation.
-
-still_own_user = Cette authentification est utilisée par un usager.
-
-[settings]
-profile = Profil
-password = Mot de passe
-ssh_keys = Clés SSH
-social = Comptes Internet
-orgs = Organisations
-delete = Supprimer votre compte
-
-public_profile = Profil public
-profile_desc = Votre adresse de courriel est publique et sera utilisée pour les avis produits par le site.
-full_name = Nom complet
-website = Site web
-location = Endroit
-update_profile = Mettre à jour le profil
-update_profile_success = Mise à jour du profil réussie.
-
-change_password = Changer le mot de passe
-old_password = Mot de passe actuel
-new_password = Nouveau mot de passe
-password_incorrect = Mot de passe actuel erroné.
-change_password_success = Modification du mot de passe effectuée. Vous pouvez dorénavant vous connecter avec le nouveau mot de passe.
-
-manage_ssh_keys = Gestion des clés SSH
-add_key = Ajouter une clé
-ssh_desc = Voici la liste de clés SSH associées à votre profil. Retirez les clés que vous ne reconnaissez pas.
-ssh_helper = <strong>Beson d'aide?</strong> Consultez le guide au <a href="https://help.github.com/articles/generating-ssh-keys">generating SSH keys</a> ou vérifiez <a href="https://help.github.com/ssh-issues/">les problèmes SSH fréquents</a>.
-add_new_key = Ajouter une clé SSH
-key_name = Nom de la clé
-key_content = Contenu
-add_key_success = Clé SSH ajoutée!
-delete_key = Détruire
-add_on = Ajoutée le
-last_used = Dernière utilisation le
-no_activity = Pas d'activité récente
-
-manage_social = Gestion des comptes Internets associés
-social_desc = Ceci est une liste de comptes Internet associés. Retirez les comptes que vous ne reconnaissez pas.
-unbind = Désassocier
-unbind_success = Compte Internet déassocié.
-
-delete_account = Detruire votre compte
-delete_prompt = Cette opération détruira votre compte et <strong>ne pourra être annulée</strong>!
-confirm_delete_account = Confirmez la suppression
-
-[repo]
-owner = Responsable
-repo_name = Nom du dépôt
-repo_name_helper = Les bons noms de dépôts sont courts, mémorables et <strong>uniques</strong>.
-visibility = Visibilité
-visiblity_helper = Ce dépôt est <span class="label label-red label-radius">privé</span>
-repo_desc = Description
-repo_lang = Langue
-repo_lang_helper = Choisir un fichier .gitignore
-license = License
-license_helper = Choisir un fichier de licence
-init_readme = Initialiser le dépôt avec un fichier README.md
-create_repo = Créer le dépôt
-default_branch = Branche par défaut
-mirror_interval = Intervale de synchronisation (heures)
-goget_meta = Métadonnées Go-Get
-goget_meta_helper = Ce dépôt sera <span class="label label-blue label-radius">Go-Getable</span>
-
-need_auth = Authorisation requise
-migrate_type = Type de migration
-migrate_type_helper = Ce dépôt sera un <span class="label label-blue label-radius">mirroir</span>
-migrate_repo = Migrer le dépôt
-
-copy_link = Copier
-clone_helper = Besoin d'aide pour cloner? Obtenez de l' <a target="_blank" href="http://git-scm.com/book/fr/Les-bases-de-Git-Démarrer-un-dépôt-Git">aide</a>!
-unwatch = Ne plus suivre
-watch = Suivre
-unstar = Retirer étoile
-star = Étoile
-fork = Fork
-
-quick_guide = Guide rapide
-clone_this_repo = Cloner ce dépôt
-create_new_repo_command = Créer un nouveau dépôt à la ligne de commande
-push_exist_repo = Pousser un dépôt existant depuis la ligne de commande
-
-settings = Réglages
-settings.options = Réglages de base
-settings.collaboration = Collaboration
-settings.hooks = Webhooks
-settings.deploy_keys = Clé de déploiement
-settings.basic_settings = réglages de base
-settings.danger_zone = Danger!
-settings.site = Site officiel
-settings.update_settings = Réglage des mises à jour
-settings.transfer = Transférer la responsabilité
-settings.transfer_desc = Transférer ce dépôt à un autre usager ou organisation si vous en avez la responsabilité.
-settings.delete = Détruire ce dépôt
-settings.delete_desc = La destruction est irrémédiable, impossible d'annuler. Soyez sûr de votre décision.
-settings.update_settings_success = Réglages modifiés
-settings.transfer_owner = Nouveau responsable
-settings.make_transfer = Faire le transfert
-settings.confirm_delete = Confirmer la destruction
-settings.add_collaborator = Ajouter un nouveau collaborateur
-settings.add_collaborator_success = Nouveau collaborateur ajouté.
-settings.remove_collaborator_success = Collaborateur supprimé.
-settings.add_webhook = Ajouter un Webhook
-settings.hooks_desc = Les Webhooks permettent à des services externes d'être avertis de certains changements sur Gogs. Lorque qu'un changement se produit, Gogs envoie une requête POST à chacun des URLs spécifiés. Plus d'info disponible sur notre <a target="_blank" href="http://gogs.io/docs/features/webhook.html">guide Webhooks'</a>.
-settings.remove_hook_success = Webhook supprimé.
-settings.add_webhook_desc = Gogs envoiera un POST à l'URL ci-dessous avec le détail de l'événement souscrit. Vous pouvez aussi spécifier dans quel format vous désirez recevoir les données (JSON,<code>x-www-form-urlencoded</code>, <em>etc</em>). Plus d'info disponible sur notre <a target="_blank" href="http://gogs.io/docs/features/webhook.html">guide Webhooks'</a>.
-settings.payload_url = URL cible
-settings.content_type = Content Type
-settings.secret = Secret
-settings.event_desc = Quels changements déclencheront le webhook?
-settings.event_push_only = Uniquement les <code>push</code>.
-settings.active = Activé
-settings.active_helper = Gogs fournira le détail de l'événement lorsque ce webhook sera déclenché.
-settings.add_hook_success = Nouveau webhook ajouté.
-settings.update_webhook = Mettre à jour le webhook
-settings.update_hook_success = Webhook mis à jour.
-settings.delete_webhook = Détruire le webhook
-settings.recent_deliveries = Livraisons récentes
-settings.hook_type = Type de déclencheur
-settings.add_slack_hook_desc = Ajouter la compatibilité <a href="http://slack.com">Slack</a> à ce dépôt.
-settings.slack_token = Jeton (token)
-settings.slack_domain = Domaine
-settings.slack_channel = Canal
-
-[org]
-org_name_holder = Nom de l'organisation
-org_name_helper = Les bons noms d'organisations sont courts, mémorables et uniques
-org_email_helper = Le courriel de l'organisation recevra toutes les notifications et les confirmations.
-create_org = Créer une organisation
-repo_updated = Changement effectué
-people = Personne
-invite_someone = Inviter quelqu'un
-teams = Équipes
-lower_members = Membres
-lower_repositories = Dépôts
-create_new_team = Créer une nouvelle équipe
-org_desc = Description
-team_name = Nom de l'équipe
-team_desc = Description
-team_name_helper = Le nom qui sera utilisé pour mentionner cette équipe dans les conversations.
-team_desc_helper = Quel est la raison d'être de cette équipe?
-team_permission_desc = Quel niveau de permission attribuer à cette équipe?
-
-settings = Réglages
-settings.options = Paramètres
-settings.full_name = Nom complet
-settings.website = Site web
-settings.location = Endroit
-settings.update_settings = Mettre à jour les paramètres
-settings.update_setting_success = Paramètres mis à jour.
-settings.delete = Détruire l'organisation
-settings.delete_account = Détruire cette organisation
-settings.delete_prompt = La destruction de l'organisation est irrémédiable, impossible d'annuler. Soyez sûr de votre décision.
-settings.confirm_delete_account = Confirmer la destruction
-
-members.public = Publique
-members.public_helper = Rendre privé
-members.private = Privé
-members.private_helper = Rendre publique
-members.owner = Responsable
-members.member = Membre
-members.conceal = Caché
-members.remove = Retirer
-members.leave = Quitter
-members.invite_desc = Commencez à saisir un nom d'usager pour l'inviter à %s:
-members.invite_now = Inviter
-
-teams.join = Rejoindre
-teams.leave = Quitter
-teams.read_access = Droits de lecture
-teams.read_access_helper = Cette équipe pourra voir et cloner ses dépôts.
-teams.write_access = Droits d'écriture
-teams.write_access_helper = Cette équipe pourra voir et cloner ses dépôts ainsi que pousser vers ceux-ci.
-teams.admin_access = Droits de gestion
-teams.admin_access_helper = En plus des droits d'écriture, cette équipe pourra gérer les collaborateurs.
-teams.no_desc = Cette équipe ne posséde pas de description
-teams.settings = Réglages
-teams.owners_permission_desc = Les responsables ont accès à <strong>tous</strong> les dépôts et en possédent les droits de gestion.
-teams.members = Membre de l'équipe
-teams.update_settings = Mettre à jour
-teams.delete_team = Détruire cette équipe
-teams.add_team_member = Ajouter un membre à l'équipe
-teams.delete_team_success = Équipe détruite
-teams.read_permission_desc = La participation à cette équipe confère les droits de lecture. Ses membres peuvent voir et cloner ses dépôts.
-teams.write_permission_desc = La participation à cette équipe confère les droits d'écriture en plus des droits de lecture. Ses membres peuvent pousser vers les dépôts de l'équipe.
-teams.admin_permission_desc = La participation à cette équire confère les droits de gestion. Ses membres peuvent voir, cloner, pousser et gérer les collaborateurs des dépôts.
-teams.repositories = Dépôts de l'équipe
-teams.add_team_repository = Ajouer un dépôt à l'équipe
-teams.remove_repo = Enlever
-
-[admin]
-dashboard = Tableau de bord
-users = Usagers
-organizations = Organisations
-repositories = Dépôts
-authentication = Sources d'authentifications
-config = Configuration
-monitor = Monitoring
-prev = Préc.
-next = Suiv.
-
-dashboard.statistic = Statistiques
-dashboard.operations = Opérations
-dashboard.system_status = État du monitoring système
-dashboard.statistic_info = La BD Gogs compte <b>%d</b> usagers, <b>%d</b> organisations, <b>%d</b> clé SSH, <b>%d</b> dépôts, <b>%d</b> suivis, <b>%d</b> étoiles, <b>%d</b> actions, <b>%d</b> accès, <b>%d</b> tickets, <b>%d</b> commentaires, <b>%d</b> comptes Internet, <b>%d</b> suivis, <b>%d</b> mirroirs, <b>%d</b> publications, <b>%d</b> sources d'authentification, <b>%d</b> webhooks, <b>%d</b> jalons, <b>%d</b> tags, <b>%d</b> tâches hook, <b>%d</b> équipes, <b>%d</b> tâches de mise à jours, <b>%d</b> fichiers joints.
-dashboard.operation_name = Nom de l'opération
-dashboard.operation_switch = Commande
-dashboard.operation_run = Lancer
-dashboard.clean_unbind_oauth = Nettoyer les OAuths orphelins
-dashboard.delete_inactivate_accounts = Détruire les comptes inactifs
-dashboard.server_uptime = Démarré depuis
-dashboard.current_goroutine = Nombre de Goroutines
-dashboard.current_memory_usage = Usage mémoire actuel
-dashboard.total_memory_allocated = Mémoire allouée totale
-dashboard.memory_obtained = Memoire obtenue
-dashboard.pointer_lookup_times = Accès pointeur
-dashboard.memory_allocate_times = Allocation mémoire
-dashboard.memory_free_times = Désallocation mémoire
-dashboard.current_heap_usage = Taille du heap actuelle
-dashboard.heap_memory_obtained = Mémoire heap obtenue
-dashboard.heap_memory_idle = Mémoire heap inactive
-dashboard.heap_memory_in_use = Mémoire heap utilisée
-dashboard.heap_memory_released = Mémoire heap relachée
-dashboard.heap_objects = Objets dans le heap
-dashboard.bootstrap_stack_usage = Bootstrap Stack Usage
-dashboard.stack_memory_obtained = Stack Memory Obtained
-dashboard.mspan_structures_usage = MSpan Structures Usage
-dashboard.mspan_structures_obtained = MSpan Structures Obtained
-dashboard.mcache_structures_usage = MCache Structures Usage
-dashboard.mcache_structures_obtained = MCache Structures Obtained
-dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained
-dashboard.gc_metadata_obtained = GC Metadada Obtained
-dashboard.other_system_allocation_obtained = Other System Allocation Obtained
-dashboard.next_gc_recycle = Next GC Recycle
-dashboard.last_gc_time = Since Last GC Time
-dashboard.total_gc_time = Total GC Pause
-dashboard.total_gc_pause = Total GC Pause
-dashboard.last_gc_pause = Last GC Pause
-dashboard.gc_times = GC Times
-
-users.user_manage_panel = Gestion des usager
-users.new_account = Creér un nouveau compte
-users.name = Nom
-users.activated = Activé
-users.admin = Gestionnaire
-users.repos = Dépôts
-users.created = Créé
-users.edit = Editer
-users.auth_source = Source d'authentification
-users.local = Locale
-users.auth_login_name = Identifiant d'authentification
-users.update_profile_success = Compte crée.
-users.edit_account = Éditer compte
-users.is_activated = Ce compte est activé
-users.is_admin = Ce compte a les droits de gestionnaire
-users.update_profile = Mettre à jour le compte
-users.delete_account = Détruire ce compte
-users.still_own_repo = Ce compte est responsables d'un dépôt. I faut détruire le dépôt ou transférer la responsabilité avant de détruire ce compte.
-
-orgs.org_manage_panel = Gestion des organisations
-orgs.name = Nom
-orgs.teams = Équipes
-orgs.members = Membres
-
-repos.repo_manage_panel = Gestion des dépôts
-repos.owner = Responsable
-repos.name = Nom
-repos.private = Privé
-repos.watches = Suivis
-repos.stars = Étoiles
-repos.issues = Ticket
-
-auths.auth_manage_panel = Gestion des sources d'authentification
-auths.new = Ajouter une nouvelle source d'authentification
-auths.name = Nom
-auths.type = Type
-auths.enabled = Activé
-auths.updated = Mis à jour
-auths.auth_type = Type d'authentification
-auths.auth_name = Nom de l'authentification
-auths.domain = Domaine
-auths.host = Serveur
-auths.port = Port
-auths.base_dn = DN de base
-auths.attributes = Attributs de recherche
-auths.filter = Filtre de recherche
-auths.ms_ad_sa = Microsoft Active Directory
-auths.smtp_auth = Authentification SMTP
-auths.smtphost = Serveur SMTP
-auths.smtpport = Port SMTP
-auths.enable_tls = Chiffrement TLS
-auths.enable_auto_register = Activer auto-abonnement
-auths.tips = Trucs
-auths.edit = Éditer réglages d'authentification
-auths.activated = Source d'authentification activée
-auths.update_success = Réglages mis à jour.
-auths.update = Mettre à jour réglages
-auths.delete = Détruire cette source
-
-config.server_config = Configuration du serveur
-config.app_name = Nom de l'applicaiton
-config.app_ver = Version de l'application
-config.app_url = URL de l'application
-config.domain = Domaine
-config.offline_mode = Mode hors-ligne
-config.disable_router_log = Journal du routeur désactivé
-config.run_user = Éxécuté en tant que
-config.run_mode = Mode de fonctionnement
-config.repo_root_path = Dossier contenant les dépôts
-config.static_file_root_path = Dossier contenant les fichiers statiques
-config.log_file_root_path = Dossier contenant les journaux
-config.script_type = Type de script
-config.reverse_auth_user = Usager d'authentification inversée
-config.db_config = Configuration de la BD
-config.db_type = Type
-config.db_host = Serveur
-config.db_name = Nom
-config.db_user = Usager
-config.db_ssl_mode = Mode SSL
-config.db_ssl_mode_helper = (pour "postgres" seulement)
-config.db_path = Path
-config.db_path_helper = (pour "sqlite3" seulement)
-config.service_config = Configuration du service
-config.register_email_confirm = Confirmation d'abonnement par courriel
-config.disable_register = Auto-inscription désactivée
-config.require_sign_in_view = Connexion requise pour visualiser
-config.mail_notify = Notifications par courriel
-config.enable_cache_avatar = Cache avatar activée
-config.active_code_lives = Jeton d'activation
-config.reset_password_code_lives = Jeton de modification mot-de-passe
-config.webhook_config = Configuration Webhook
-config.task_interval = Intervalle
-config.deliver_timeout = Expiration des appels
-config.mailer_config = Configuration expédition de courriels
-config.mailer_enabled = Activé
-config.mailer_name = Nom
-config.mailer_host = Serveur
-config.mailer_user = Usager
-config.oauth_config = Configuration OAuth
-config.oauth_enabled = Activé
-config.cache_config = Configuration du cache
-config.cache_adapter = Mécanisme de cache
-config.cache_interval = Intervalle
-config.cache_conn = Chaîne de connexion
-config.session_config = Configuration des session
-config.session_provider = Mécanisme
-config.provider_config = Configuration du mécanisme
-config.cookie_name = Nom du fichier témoin
-config.enable_set_cookie = Fichier témoin actvité
-config.gc_interval_time = Intervalle GC
-config.session_life_time = Durée de la session
-config.https_only = HTTPS exigé
-config.cookie_life_time = Expiration du fichier témoin
-config.session_hash_function = Fonction de hashage ID de session
-config.session_hash_key = Clé de hashage ID de session
-config.picture_config = Configuration des avatars
-config.picture_service = Service image
-config.disable_gravatar = Désactivé Gravatar
-config.log_config = Configuration du journal
-config.log_mode = Mode de journal
-
-monitor.cron = Cron Tasks
-monitor.name = Name
-monitor.schedule = Schedule
-monitor.next = Next Time
-monitor.previous = Previous Time
-monitor.execute_times = Execute Times
-monitor.process = Running Processes
-monitor.desc = Description
-monitor.start = Start Time
-monitor.execute_time = Execution Time
-
-[action]
-create_repo = a créé le dépôt <a href="/%s">%s</a>
-commit_repo = a poussé sur <a href="/%s/src/%s">%s</a> à <a href="/%s">%s</a>
-create_issue = a ouvert le ticket <a href="/%s/issues/%s">%s#%s</a>
-comment_issue = a commenté sur le ticket <a href="/%s/issues/%s">%s#%s</a>
-
-[tool]
-ago = auparavant
-from_now = depuis
-now = maintenant
-1s = 1 seconde %s
-1m = 1 minute %s
-1h = 1 heure %s
-1d = 1 jour %s
-1w = 1 semaine %s
-1mon = 1 mos %s
-1y = 1 an %s
-seconds = %d secondes %s
-minutes = %d minutes %s
-hours = %d heures %s
-days = %d jours %s
-weeks = %d semaines %s
-months = %d mois %s
-years = %d années %s
-raw_seconds = secondes
-raw_minutes = minutes
+app_desc=Un service de Git sans prise de tête auto-hébergé codé en Go
+
+home=Accueil
+dashboard=Tableau de bord
+explore=Explorer
+help=Aide
+sign_in=Connexion
+social_sign_in=Connexion avec un réseau social : 2e étape <small>associer un compte</small>
+sign_out=Déconnexion
+sign_up=Créer un compte
+register=S'enregistrer
+website=Site Web
+version=Version
+page=Page
+template=Modèle
+language=Langue
+
+username=Nom d'utilisateur
+email=E-mail
+password=Mot de passe
+re_type=Confirmez
+captcha=Captcha
+
+repository=Référentiel
+organization=Organisation
+mirror=Miroir
+new_repo=Nouveau Référentiel
+new_migrate=Nouvelle Migration
+new_fork=Nouveau référentiel de fourche
+new_org=Nouvelle Organisation
+manage_org=Gérer les Organisations
+admin_panel=Administration
+account_settings=Paramètres du Compte
+settings=Paramètres
+
+news_feed=Flux d'actualités
+pull_requests=Extraire les Requêtes
+issues=Problèmes
+
+cancel=Annuler
+
+[install]
+install=Installation
+title=Instructions de Première Installation
+requite_db_desc=Gogs nécessite MySQL, PostgreSQL ou SQLite3.
+db_type=Type de Base de Données
+host=Hôte
+user=Utilisateur
+password=Mot De Passe
+db_name=Nom de la Base de Données
+db_helper=Veuillez utiliser le moteur INNODB avec le jeu de caractères utf8_general_ci pour MySQL.
+ssl_mode=Mode SSL
+path=Chemin
+sqlite_helper=Emplacement du fichier de la base de données SQLite3.
+general_title=Paramètres Généraux de Gogs
+repo_path=Emplacement Racine du Référentiel
+repo_path_helper=Tous les Référentiels Git distants seront sauvegardés ici.
+run_user=Entrer un Utilisateur
+run_user_helper=L'utilisateur doit avoir accès à la Racine du Référentiel et éxécuter Gogs.
+domain=Domaine
+domain_helper=Cela affecte les doublons d'URL SSH.
+app_url=URL de l'Application
+app_url_helper=Cela affecte les doublons d'URL HTTP/HTTPS et le contenu d'e-mail.
+email_title=Paramètres du Service de Messagerie (Facultatif)
+smtp_host=Hôte SMTP
+mailer_user=E-mail de l'Expéditeur
+mailer_password=Mot de Passe de l'Expéditeur
+notify_title=Paramètre des Notifications (Facultatif)
+register_confirm=Activer la Confirmation d'Enregistrement
+mail_notify=Activer la Notification des Mails reçus
+admin_title=Paramètres du Compte Administrateur
+admin_name=Nom d'Utilisateur
+admin_password=Mot de Passe
+confirm_password=Confirmez le Mot de Passe
+admin_email=E-mail
+install_gogs=Installer Gogs
+test_git_failed=Tentative de commande "git" échouée : %v
+sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veuillez télécharger la version binaire officielle à cette adresse %s.
+invalid_db_setting=Paramètres de base de données incorrects : %v
+invalid_repo_path=Chemin Racine du Référentiel invalide : %v
+run_user_not_match=L'utilisateur entré n'est pas l'utilisateur actuel : %s -> %s
+save_config_failed=Sauvegarde de la configuration échouée : %v
+invalid_admin_setting=Paramètres du compte administrateur invalides : %v
+install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gogs, amusez-vous et prenez soin de vous.
+
+[home]
+uname_holder=Nom d'Utilisateur ou E-mail
+password_holder=Mot de Passe
+switch_dashboard_context=Basculer le Contexte du Tableau de Bord
+my_repos=Mes Référentiels
+collaborative_repos=Référentiels collaboratifs
+my_orgs=Mes Organisations
+my_mirrors=Mes Miroirs
+
+[explore]
+repos=Référentiels
+
+[auth]
+create_new_account=Créer un Nouveau Compte
+register_hepler_msg=Déjà enregistré ? Connectez-vous !
+social_register_hepler_msg=Possesseur d'un compte ? Associez-le !
+disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
+disable_register_mail=Désolé, la Confirmation par Mail des Enregistrements a été désactivée.
+remember_me=Se souvenir de Moi
+forgot_password=Mot de Passe oublié
+forget_password=Mot de Passe oublié ?
+sign_up_now=Pas de compte ? Créer maintenant.
+confirmation_mail_sent_prompt=Un nouveau mail de confirmation à été envoyé à <b>%s</b>. Veuillez vérifier votre boîte de réception dans un délai de %d heures pour compléter votre enregistrement.
+sign_in_email=Connexion avec l'E-mail
+active_your_account=Activer votre Compte
+resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. Veuillez réessayer dans 3 minutes.
+has_unconfirmed_mail=Bonjour %s, votre adresse e-mail n'a pas été confirmée (<b>%s</b>). Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, appuyez sur le bouton ci-dessous.
+resend_mail=Appuyez ici pour renvoyer un mail de confirmation
+email_not_associate=Cette adresse e-mail n'est associée à aucun compte.
+send_reset_mail=Appuyez ici pour (r)envoyer le mail de réinitialisation du mot de passe
+reset_password=Réinitialiser le Mot de Passe
+invalid_code=Désolé, code de confirmation invalide ou expiré.
+reset_password_helper=Appuyez ici pour réinitialiser votre mot de passe
+password_too_short=Le mot de passe doit contenir 6 caractères minimum.
+
+[form]
+UserName=Nom d'Utilisateur
+RepoName=Nom du Référentiel
+Email=Adresse E-mail
+Password=Mot de Passe
+Retype=Confirmez le Mot de Passe
+SSHTitle=Nom de la clé SSH
+HttpsUrl=URL HTTPS
+PayloadUrl=URL des Données Utiles
+TeamName=Nom d'équipe
+AuthName=Nom d'autorisation
+AdminEmail=E-mail d'admin
+
+require_error=` Ne peut être vide `
+alpha_dash_error=` doivent être des caractères alpha, numeriques ou console (-_) valides `
+alpha_dash_dot_error=` doivent être des caractères alpha, numeriques, console (-_) valides ou des points `
+min_size_error=` %s caractères minimum `
+max_size_error=` %s caractères maximum `
+email_error=` adresse e-mail invalide `
+url_error=` URL invalide `
+unknown_error=Erreur inconnue :
+captcha_incorrect=Le Captcha ne correspond pas.
+password_not_match=Le mot de passe et la confirmation de mot de passe ne correspondent pas.
+
+username_been_taken=Nom d'utilisateur déjà pris.
+repo_name_been_taken=Nom de Référentiel déjà pris.
+org_name_been_taken=Nom d'organisation déjà pris.
+team_name_been_taken=Nom d'équipe déjà pris.
+email_been_used=Adresse e-mail déjà utilisée.
+ssh_key_been_used=Le nom de la clé publique a déjà servi.
+illegal_username=Le nom d'utilisateur contient des caractères interdits.
+illegal_repo_name=Le nom du Référentiel contient des caractères interdits.
+illegal_org_name=Le nom de l'organisation contient des caractères interdits.
+illegal_team_name=Le nom de l'équipe contient des caractères interdits.
+username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect.
+enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du Référentiel soit correct.
+enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct.
+enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct.
+user_not_exist=Cet utilisateur n'existe pas.
+last_org_owner=L'utilisateur à exclure est le dernier membre de l'équipe propriétaire. Il doit y avoir un autre propriétaire.
+
+invalid_ssh_key=Désolé, impossible de valider votre clé SSH : %s
+unable_verify_ssh_key=Gogs n'a pu vérifier la validité de votre clé SSH, même si nous partons du principe qu'elle le soit. Cela-dit, veuillez vous en assurer.
+auth_failed=Échec d'authentification : %s
+
+still_own_repo=Votre compte comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
+still_has_org=Votre compte a toujours membres de l'organisation, vous avez à gauche ou supprimez tout d'abord.
+org_still_own_repo=Cette organisation comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
+
+still_own_user=Cette authentification a déjà servi à d'autres utilisateurs. Veuillez les déplacer puis supprimez à nouveau.
+
+target_branch_not_exist=Branche cible n'existe pas
+
+[user]
+change_avatar=Changez d'avatar via gravatar.com
+join_on=Adhéré le
+repositories=Référentiels
+activity=Activités publiques
+followers=Abonnés
+starred=Votés
+following=Abonnements
+
+[settings]
+profile=Profil
+password=Mot de Passe
+ssh_keys=Clés SSH
+social=Réseaux Sociaux
+applications=Applications
+orgs=Organisations
+delete=Supprimer le Compte
+uid=ID d'Utilisateur
+
+public_profile=Profil Public
+profile_desc=Votre adresse e-mail est publique et sera utilisée pour les notifications relatives au compte, ainsi que pour toute opération Web effectuée via le site.
+full_name=Non Complet
+website=Site Web
+location=Localisation
+update_profile=Valider les modifications
+update_profile_success=Profil mis à jour avec succès.
+change_username=Non d'utilisateur modifié
+change_username_desc=Nom d'utilisateur modifié. Cela affecte tous les liens relatifs à votre compte. Continuer ?
+continue=Continuer
+cancel=Annuler
+
+change_password=Modifier le Mot de Passe
+old_password=Mot de Passe actuel
+new_password=Nouveau Mot de Passe
+password_incorrect=Mot de passe actuel incorrect.
+change_password_success=Mot de passe modifié avec succès. Vous pouvez à présent vous connecter avec le nouveau mot de passe.
+
+manage_ssh_keys=Gérer les clés SSH
+add_key=Ajouter une Clé
+ssh_desc=Ceci est une liste des clés SSH associées à votre compte. Supprimez celles que vous ne reconnaissez pas.
+ssh_helper=<strong>Besoin d'aide?</strong> Consultez notre guide pour <a href="%s"> générer des clés SSH</a> ou résoudre les <a href="%s"> problèmes courants de SSH</a>.
+add_new_key=Ajouter une Clé SSH
+key_name=Nom de la Clé
+key_content=Contenu
+add_key_success=Nouvelle Clé SSH ajoutée !
+delete_key=Supprimer
+add_on=Ajouté le
+last_used=Dernière utilisation le
+no_activity=Aucune activité récente
+
+manage_social=Gérer les réseaux sociaux associés
+social_desc=Ceci est la liste des comptes de réseaux sociaux associés. Supprimez ceux que vous ne reconnaissez pas.
+unbind=Dissocier
+unbind_success=Compte de réseau social dissocié.
+
+manage_access_token=Gérer les jetons d'accès personnels
+generate_new_token=Générer le nouveau jeton
+tokens_desc=Jetons, que vous avez généré qui peuvent être utilisés pour accéder à l'API Gogs.
+new_token_desc=Comme pour l'instant, chaque jeton aura un accès complet à votre compte.
+token_name=Nom du jeton
+generate_token=Générer le jeton
+generate_token_succees=Nouveau jeton d'accès a été généré avec succès ! Assurez-vous de copier votre nouveau jeton d'accès personnel maintenant. Vous ne serez pas en mesure de le revoir !
+delete_token=Supprimer
+delete_token_success=Jeton d'accès personnelle a été supprimée avec succès ! N'oubliez pas de mettre à jour vos applications aussi bien.
+
+delete_account=Supprimer le Compte
+delete_prompt=Votre compte sera supprimé définitivement et cette opération est <strong>IRRÉVERSIBLE</strong> !
+confirm_delete_account=Confirmer la suppression
+delete_account_title=Suppression de compte
+delete_account_desc=Ce compte sera supprimé définitivement. Voulez-vous continuer ?
+
+[repo]
+owner=Propriétaire
+repo_name=Nom du Référentiel
+repo_name_helper=Idéalement, le nom d'un Référentiel devrait être court, mémorable et <strong>unique</strong>.
+visibility=Visibilité
+visiblity_helper=Ce Référentiel est <span class="label label-red label-radius">Privé</span>
+fork_repo=Référentiel de la fourche
+fork_from=Fourche de
+fork_visiblity_helper=Référentiel Aristide ne peut pas changer sa visiblité
+repo_desc=Description
+repo_lang=Langue
+repo_lang_helper=Sélectionner un fichier .gitignore
+license=Licence
+license_helper=Sélectionner un fichier de licence
+init_readme=Initialiser ce Référentiel avec un README.md
+create_repo=Créer un Référentiel
+default_branch=Branche par défaut
+mirror_interval=Intervalle du miroir (heure)
+goget_meta=Méta Go-Get
+goget_meta_helper=Ce Référentiel sera <span class="label label-blue label-radius">Go-Getable</span>
+
+need_auth=Nécessite une Autorisation
+migrate_type=Type de Migration
+migrate_type_helper=Ce Référentiel sera un <span class="label label-blue label-radius">Miroir</span>
+migrate_repo=Migrer le Référentiel
+
+copy_link=Copier
+click_to_copy=Copier dans le presse-papier
+copied=Copié
+clone_helper=Besoin d'aide pour le clonage ? Visitez <a target="_blank" href="%s"> l'aider</a> !
+unwatch=Ne plus suivre
+watch=Suivre
+unstar=Retirer le vote
+star=Voter
+fork=Embranchement
+
+no_desc=Aucune description
+quick_guide=Introduction rapide
+clone_this_repo=Dupliquer ce Référentiel
+create_new_repo_command=Créer un nouveau Référentiel en ligne de commande
+push_exist_repo=Soumettre un Référentiel existant par ligne de commande
+
+branch=Branche
+tree=Aborescence
+branch_and_tags=Branches & Tags
+branches=Branches
+tags=Tags
+issues=Problèmes
+commits=Commissions
+releases=Publications
+file_raw=Raw
+file_history=Historique
+file_view_raw=Voir le Raw
+
+commits.commits=Commissions
+commits.search=Rechercher des commissions
+commits.find=Trouver
+commits.author=Auteur
+commits.message=Message
+commits.date=Date
+commits.older=Précédemment
+commits.newer=Récemment
+
+settings=Paramètres
+settings.options=Options
+settings.collaboration=Collaboration
+settings.hooks=Webhooks
+settings.githooks=Git Hooks
+settings.deploy_keys=Clés de déploiement
+settings.basic_settings=Paramètres de base
+settings.danger_zone=Zone de danger
+settings.site=Site officiel
+settings.update_settings=Valider
+settings.change_reponame=Référentiel renommé
+settings.change_reponame_desc=Le Référentiel a été renommé. Cela affecte tous les liens relatifs à ce Référentiel. Continuer ?
+settings.transfer=Transférer les propriétés
+settings.transfer_desc=Transfère ce Référentiel à un autre utilisateur ou organisation dont vous possédez des droits d'administrateur.
+settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un Référentiel nommé ainsi.
+settings.delete=Supprimer ce Référentiel
+settings.delete_desc=Attention, action irréversible. Soyez sûre de vous.
+settings.transfer_notices=<p>- Vous perdrez l'accès si le nouveau propriétaire est un utilisateur individuel.</p><p>- Vous garderez l'accès si le nouveau propriétaire est une organisation et que vous en faites partie.</p>
+settings.update_settings_success=Options mises à jour avec succès.
+settings.transfer_owner=Nouveau propriétaire
+settings.make_transfer=Transférer
+settings.transfer_succeed=Propriétés transférées avec succès.
+settings.confirm_delete=Confirmer la suppression
+settings.add_collaborator=Ajouter un collaborateur
+settings.add_collaborator_success=Nouveau collaborateur ajouté.
+settings.remove_collaborator_success=Collaborateur supprimé.
+settings.user_is_org_member=Cet utilisateur ne peut pas être ajouté en tant que collaborateur car il fait partie d'une organisation.
+settings.add_webhook=Ajouter un Webhook
+settings.hooks_desc=Webhooks aux services externes être notifié lorsque certains événements se produisent sur Gogs. Lorsque les événements spécifiés se produisent, nous vous enverrons une demande POST à chacun des URL que vous fournissez. Apprenez-en davantage dans notre <a target="_blank" href="%s"> Webhooks Guide</a>.
+settings.githooks_desc=Les Hooks Git sont alimentés par Git lui même. Les Hooks compatibles sont modifiables dans la liste ci-dessous pour effectuer 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.remove_hook_success=Webhook supprimé.
+settings.add_webhook_desc=Nous vous enverrons une demande <code>POST</code> à l'URL ci-dessous avec les détails de tous les événements souscrites. Vous pouvez également spécifier quel format de données vous souhaitez recevoir (JSON, <code>x-www-formulaires-urlencoded</code>, <em>etc.</em>). Plus d'informations se trouvent dans le <a target="_blank" href="%s"> Guide de le Webhooks</a>.
+settings.payload_url=URL des Données Utiles
+settings.content_type=Type de contenu
+settings.secret=Confidentiel
+settings.event_desc=Quel évènement ce Webhook doit-il déclencher ?
+settings.event_push_only=Uniquement les <code>push</code> (soumissions).
+settings.active=Actif
+settings.active_helper=Les détails seront délivrés lorsque ce Hook sera déclenché.
+settings.add_hook_success=Nouveau Webhook ajouté.
+settings.update_webhook=Mettre le Webhook à jour
+settings.update_hook_success=Webhook mis à jour.
+settings.delete_webhook=Supprimer le Webhook
+settings.recent_deliveries=Livraisons récentes
+settings.hook_type=Type de Hook
+settings.add_slack_hook_desc=Ajouter <a href="%s"> Slack</a> intégration dans votre référentiel.
+settings.slack_token=Jeton
+settings.slack_domain=Domaine
+settings.slack_channel=Canal
+
+diff.browse_source=Parcourir la Source
+diff.parent=Parent
+diff.commit=Commettre
+diff.data_not_available=Données Diff indisponibles.
+diff.show_diff_stats=Afficher les stats Diff
+diff.stats_desc=<strong> %d fichiers modifiés</strong> avec <strong>%d ajouts</strong> et <strong>%d suppressions</strong>
+diff.bin=BIN
+diff.view_file=Voir le fichier
+
+[org]
+org_name_holder=Nom d'organisation
+org_name_helper=Idéalement, un nom d'organisation devrait être court et mémorable.
+org_email_helper=L'e-mail de l'organisation recevra toutes les notifications et confirmations.
+create_org=Créer une organisation
+repo_updated=Mis à jour
+people=Contacts
+invite_someone=Inviter quelqu'un
+teams=Équipes
+lower_members=Membres
+lower_repositories=Référentiels
+create_new_team=Créer une Nouvelle Équipe
+org_desc=Description
+team_name=Nom d'Équipe
+team_desc=Description
+team_name_helper=Ce nom sera utilisé pour mentionner l'équipe dans les conversations.
+team_desc_helper=Présentation de l'équipe
+team_permission_desc=Quel niveau d'accès cette équipe devrait-elle posséder ?
+
+settings=Paramètres
+settings.options=Options
+settings.full_name=Non Complet
+settings.website=Site Web
+settings.location=Localisation
+settings.update_settings=Valider
+settings.change_orgname=Organisation renommée
+settings.change_orgname_desc=L'Organisation a été renommée. Cela affecte tous les liens relatifs à cette organisation. Continuer ?
+settings.update_setting_success=Paramètres d'organisation modifiés avec succès.
+settings.delete=Supprimer l'organisation
+settings.delete_account=Supprimer cette organisation
+settings.delete_prompt=Cela supprimera cette organisation définitivement. Cette opération est <strong>IRRÉVERSIBLE</strong> !
+settings.confirm_delete_account=Confirmez la suppression
+settings.delete_org_title=Suppression d'organisation
+settings.delete_org_desc=Cette organisation sera définitivement supprimée. Continuer ?
+settings.hooks_desc=Ajoute des Webhooks qui seront activés pour <strong>tous les Référentiels</strong> de cette organisation.
+
+members.public=Public
+members.public_helper=Rendre privé
+members.private=Privé
+members.private_helper=Rendre public
+members.owner=Propriétaire
+members.member=Membre
+members.conceal=Masquer
+members.remove=Exclure
+members.leave=Quitter
+members.invite_desc=Tapez un nom d'utilisateur pour inviter un nouveau membre chez %s :
+members.invite_now=Lancer l'invitation
+
+teams.join=Rejoindre
+teams.leave=Quitter
+teams.read_access=Accès en Lecture
+teams.read_access_helper=Cette équipe aura la possibilité de voir et dupliquer ses Référentiels.
+teams.write_access=Accès en Écriture
+teams.write_access_helper=Cette équipe possèdera aussi bien des droits de lecture que d'écriture sur ses Référentiels.
+teams.admin_access=Accès Administrateur
+teams.admin_access_helper=Cette équipe possèdera des droits de lecture, d'écriture, ainsi que le pouvoir d'ajouter des collaborateurs.
+teams.no_desc=Aucune description
+teams.settings=Paramètres
+teams.owners_permission_desc=Les propriétaires possèdent <strong>les droits d'administrateur</strong> et disposent d'un accès complet à <strong>tous les Référentiels</strong> de l'organisation.
+teams.members=Membres de L'Équipe
+teams.update_settings=Valider
+teams.delete_team=Supprimer cette Équipe
+teams.add_team_member=Ajouter un Membre
+teams.delete_team_title=Suppression de l'équipe
+teams.delete_team_desc=Cette équipe sera supprimée. Les membres pourraient perdre leurs accès à certains Référentiels.
+teams.delete_team_success=Équipe supprimée avec succès.
+teams.read_permission_desc=Cette équipe permet l'accès en <strong>lecture</strong> : les membres peuvent voir et dupliquer ses Référentiels.
+teams.write_permission_desc=Cette équipe permet l'accès en <strong>écriture</strong> : les membres peuvent participer à ses Référentiels.
+teams.admin_permission_desc=Cette équipe permet l'accès en <strong>administrateur</strong> : les membres peuvent voir, participer et ajouter des collaborateurs à ses Référentiels.
+teams.repositories=Référentiels de l'Équipe
+teams.add_team_repository=Ajouter un Référentiel à l'Équipe
+teams.remove_repo=Supprimer
+teams.add_nonexistent_repo=Référentiel inexistant, veuillez d'abord le créer.
+
+[admin]
+dashboard=Tableau de bord
+users=Utilisateurs
+organizations=Organisations
+repositories=Référentiels
+authentication=Authentifications
+config=Configuration
+notices=Notes Systèmes
+monitor=Supervision
+prev=Préc.
+next=Suiv.
+
+dashboard.statistic=Statistiques
+dashboard.operations=Opérations
+dashboard.system_status=État du Moniteur Système
+dashboard.statistic_info=La base de données Gogs contient <b>%d</b> utilisateurs, <b>%d</b> organisations, <b>%d</b> clés publiques, <b>%d</b> Référentiels, <b>%d</b> suivis, <b>%d</b> votes, <b>%d</b> actions, <b>%d</b> accès, <b>%d</b> problèmes, <b>%d</b> commentaires, <b>%d</b> comptes de réseaux sociaux, <b>%d</b> abonnements, <b>%d</b> miroirs, <b>%d</b> publications, <b>%d</b> connexions d'origine, <b>%d</b> webhooks, <b>%d</b> milestones, <b>%d</b> labels, <b>%d</b> tâches hook, <b>%d</b> équipes, <b>%d</b> tâches de mise à jour, <b>%d</b> fichiers.
+dashboard.operation_name=Nom de l'Opération
+dashboard.operation_switch=Basculer
+dashboard.operation_run=Exécuter
+dashboard.clean_unbind_oauth=Nettoyer les associations OAuthes
+dashboard.delete_inactivate_accounts=Supprimer tous les comptes inactifs
+dashboard.server_uptime=Durée de Marche 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=Nombre d'Allocation Mémoire
+dashboard.memory_free_times=Nombre de Libération 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
+dashboard.heap_memory_in_use=Utilisation Mémoire Tas (Heap)
+dashboard.heap_memory_released=Mémoire Tas (Heap) libérée
+dashboard.heap_objects=Objets Tas (Heap)
+dashboard.bootstrap_stack_usage=Utilisation Pile Bootstrap
+dashboard.stack_memory_obtained=Mémoire Pile obtenue
+dashboard.mspan_structures_usage=Utilisation des Structures MSpan
+dashboard.mspan_structures_obtained=Structures MSpan obtenues
+dashboard.mcache_structures_usage=Utilisation des Structures MCache
+dashboard.mcache_structures_obtained=Structures MCache obtenues
+dashboard.profiling_bucket_hash_table_obtained=Profilage de Seau de Table de Hashage obtenu
+dashboard.gc_metadata_obtained=Métadonnées GC obtenues
+dashboard.other_system_allocation_obtained=Allocation de l'autre Système obtenue
+dashboard.next_gc_recycle=Traitement GC suivant
+dashboard.last_gc_time=Depuis le dernier GC
+dashboard.total_gc_time=Pause GC totale
+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 des Utilisateurs
+users.new_account=Créer un nouveau compte
+users.name=Nom
+users.activated=Activés
+users.admin=Administrateur
+users.repos=Repos
+users.created=Créés
+users.edit=Éditer
+users.auth_source=Source d'Autorisation
+users.local=Locales
+users.auth_login_name=Autorisation de connexion
+users.update_profile_success=Profil mis à jour avec succès.
+users.edit_account=Modifier le Compte
+users.is_activated=Ce compte est activé
+users.is_admin=Ce compte possède un niveau d'accès administrateur
+users.allow_git_hook=Ce compte dispose des autorisations pour créer des crochets de Git
+users.update_profile=Mettre le profil à jour
+users.delete_account=Supprimer ce Compte
+users.still_own_repo=Ce compte comporte toujours des propriétés de Référentiel. Vous devez d'abord les supprimer ou les transférer.
+users.still_has_org=Ce compte a toujours membres de l'organisation, vous avez à gauche ou supprimez tout d'abord.
+
+orgs.org_manage_panel=Gestion des Organisations
+orgs.name=Nom
+orgs.teams=Équipes
+orgs.members=Membres
+
+repos.repo_manage_panel=Gestion des Référentiels
+repos.owner=Propriétaire
+repos.name=Nom
+repos.private=Privé
+repos.watches=Suivi par
+repos.stars=Votes
+repos.issues=Problèmes
+
+auths.auth_manage_panel=Gestion des Autorisations
+auths.new=Ajouter une Nouvelle Source d'Autorisation
+auths.name=Nom
+auths.type=Type
+auths.enabled=Activé
+auths.updated=Mis à jour
+auths.auth_type=Type d'Autorisation
+auths.auth_name=Nom d'Autorisation
+auths.domain=Domaine
+auths.host=Hôte
+auths.port=Port
+auths.base_dn=Base DN (Nom Distingué)
+auths.attributes=Rechercher les Attributs
+auths.filter=Filtre de recherche
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=Type d'Autorisation SMTP
+auths.smtphost=Hôte SMTP
+auths.smtpport=Port SMTP
+auths.enable_tls=Activer le Chiffrement TLS
+auths.enable_auto_register=Connexion Automatique
+auths.tips=Conseils
+auths.edit=Modifier les Paramètres d'Autorisation
+auths.activated=Authentification activée
+auths.update_success=Paramètres d'autorisation mis à jour avec succès.
+auths.update=Mettre les Paramètres d'Autorisation à jour
+auths.delete=Supprimer cette Autorisation
+auths.delete_auth_title=Suppression d'Autorisation
+auths.delete_auth_desc=Cette autorisation sera supprimée. Continuer ?
+
+config.server_config=Configuration du Serveur
+config.app_name=Nom de l'Application
+config.app_ver=Version de l'Application
+config.app_url=URL de l'Application
+config.domain=Domaine
+config.offline_mode=Mode hors-ligne
+config.disable_router_log=Désactiver la Journalisation du Routeur
+config.run_user=Entrer un Utilisateur
+config.run_mode=Mode d'Éxécution
+config.repo_root_path=Emplacement Racine du Référentiel
+config.static_file_root_path=Emplacement Racine du Fichier Statique
+config.log_file_root_path=Emplacement Racine du Fichier Journal
+config.script_type=Type de Script
+config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur
+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=Utilisateur
+config.db_ssl_mode=Mode SSL
+config.db_ssl_mode_helper=("postgres" uniquement)
+config.db_path=Emplacement
+config.db_path_helper=("sqlite3" uniquement)
+config.service_config=Configuration du Service
+config.register_email_confirm=E-mail de Confirmation d'Enregistrement
+config.disable_register=Désactiver l'Enregistrement
+config.require_sign_in_view=Connexion Obligatoire pour Visualiser
+config.mail_notify=Mailer les Notifications
+config.enable_cache_avatar=Activer le Cache d'Avatar
+config.active_code_lives=Limites de Code Actif
+config.reset_password_code_lives=Réinitialiser le Mot De Passe des Limites de Code
+config.webhook_config=Configuration Webhook
+config.task_interval=Intervalles de Tâches
+config.deliver_timeout=Expiration d'Envoi
+config.mailer_config=Configuration du Maileur
+config.mailer_enabled=Activé
+config.mailer_name=Nom
+config.mailer_host=Hôte
+config.mailer_user=Utilisateur
+config.oauth_config=Configuration OAuth
+config.oauth_enabled=Activé
+config.cache_config=Configuration du Cache
+config.cache_adapter=Adaptateur du Cache
+config.cache_interval=Intervals du Cache
+config.cache_conn=Liaison du Cache
+config.session_config=Configuration de Session
+config.session_provider=Fournisseur de Session
+config.provider_config=Configurer le Fournisseur
+config.cookie_name=Nom du Cookie
+config.enable_set_cookie=Activer les Cookies
+config.gc_interval_time=Intervals GC
+config.session_life_time=Durée de Session
+config.https_only=HTTPS uniquement
+config.cookie_life_time=Expiration du Cookie
+config.picture_config=Configuration d'Image
+config.picture_service=Service d'Imagerie
+config.disable_gravatar=Désactiver Gravatar
+config.log_config=Configuration du Journal
+config.log_mode=Mode du Journal
+
+monitor.cron=Tâches Cron
+monitor.name=Nom
+monitor.schedule=Planification
+monitor.next=Suivant
+monitor.previous=Précédent
+monitor.execute_times=Nombre d'Éxécutions
+monitor.process=Processus en cours d'Éxécution
+monitor.desc=Description
+monitor.start=Heure de Démarrage
+monitor.execute_time=Heure d'Éxécution
+
+notices.system_notice_list=Notes Systèmes
+notices.type=Type
+notices.type_1=Référentiel
+notices.desc=Description
+notices.op=Auteur
+notices.delete_success=Note système supprimée avec succès.
+
+[action]
+create_repo=a crée le Référentiel <a href="%s/%s">%s</a>
+commit_repo=a soumis à <a href="%s/%s/src/%s">%s</a> chez <a href="%s/%s">%s</a>
+create_issue=a ouvert un problème <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=a commenté le problème <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=a transféré le Référentiel <code>%s</code> à <a href="/%s%s">%s</a>
+push_tag=a tagé <a href="%s/%s/src/%s">%s</a> à <a href="%s/%s">%s</a>
+compare_2_commits=Comparer ces 2 commissions
+
+[tool]
+ago=auparavant
+from_now=à partir de maintenant
+now=maintenant
+1s=1 seconde %s
+1m=1 minute %s
+1h=1 heure %s
+1d=1 jour %s
+1w=1 semaine %s
+1mon=1 mois %s
+1y=1 an %s
+seconds=%d secondes %s
+minutes=%d minutes %s
+hours=%d heures %s
+days=%d jours %s
+weeks=%d semaines %s
+months=%d mois %s
+years=%d ans %s
+raw_seconds=secondes
+raw_minutes=minutes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_nl-NL.ini b/conf/locale/locale_nl-NL.ini
index 4943951f..ab93b8e0 100644..100755
--- a/conf/locale/locale_nl-NL.ini
+++ b/conf/locale/locale_nl-NL.ini
@@ -1,585 +1,679 @@
-app_desc = Een pijnloze self-hosted Git-dienst geschreven in Go
-home = Home
-dashboard = Dashboard
-explore = Verkennen
-help = Help
-sign_in = Inloggen
-social_sign_in = Social netwerk inlog: tweede stap <small>account koppelen</small>
-sign_out = Afmelden
-sign_up = Aanmelden
-register = Registreer
-website = Website
-version = Versie
-page = Pagina
-template = Template
-language = Taal
-username = Gebruikersnaam
-email = E-mail
-password = Wachttwoord
-re_type = Verificatie
-captcha = Captcha
-repository = Repositorie
-organization = Organisatie
-mirror = Mirror
-new_repo = Nieuwe repositorie
-new_migrate = Nieuwe migratie
-new_org = Nieuwe organisatie
-manage_org = Beheer organisaties
-admin_panel = Adminpaneel
-account_settings = Accountinstellingen
-settings = Instellingen
-news_feed = Nieuwsfeed
-pull_requests = Pull-aanvragen
-issues = Issues
-cancel = Annuleer
-
-[home]
-uname_holder = Gebruikersnaam of e-mail
-password_holder = Wachtwoord
-switch_dashboard_context = Wissel voorpaginacontext
-my_repos = Mijn repositories
-collaborative_repos = Gedeelde repositories
-my_orgs = Mijn organisaties
-my_mirrors = Mijn mirrors
-
-[auth]
-create_new_account = Maak nieuw account aan
-register_hepler_msg = Heeft u al een account? Meld u nu aan!
-social_register_hepler_msg = Heeft u al een account? Koppel nu!
-disable_register_prompt = Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.
-disable_register_mail = Sorry, bevestiging van registratie per e-mail is uitgeschakeld.
-remember_me = Onthoud mij
-forgot_password = Wachtwoord vergeten
-forget_password = Wachtwoord vergeten?
-sign_up_now = Een account nodig? Meld u nu aan.
-confirmation_mail_sent_prompt = Een bevestigingsemail is gestuurd naar <b>%s</b>, Bevestig u aanvraag binnen %d uren om uw registratie te voltooien.
-sign_in_email = Meld u aan met uw e-mailadres
-active_your_account = Activeer uw account
-resent_limit_prompt = Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag.
-has_unconfirmed_mail = Beste %s, u heeft een onbevestigde e-mailadres (<b>%s</b>). Als u nog geen bevestiging per e-mail 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
-send_reset_mail = Klik hier om uw wachtwoord reset mail (nogmaals) te versturen
-reset_password = Reset uw wachtwoord
-invalid_code = Sorry, uw bevestigingscode is verlopen of niet meer geldig.
-reset_password_helper = Klik hier om uw wachtwoord opnieuw in te stellen.
-password_too_short = De lengte van uw wachtwoord moet minimaal zes karakters zijn.
-email_not_associate = Dit e-mailadres is niet gekoppeld aan een account.
-
-[form]
-UserName = Gebruikersnaam
-RepoName = Repositorie naam
-Email = e-mailadres
-Password = Wachtwoord
-Retype = Verifieer wachtwoord
-SSHTitle = SSH sleutel naam
-HttpsUrl = HTTPS URL
-PayloadUrl = Payload URL
-TeamName = Team naam
-AuthName = Autorisatienaam
-require_error = kan niet leeg zijn.
-alpha_dash_error = moet een valide alfanumeriek of dash(-_) karakter zijn.
-alpha_dash_dot_error = moet een valide alfanumeriek, dash(-_) of (.) punt karakter zijn.
-min_size_error = moet minimaal %s karakters bevatten.
-max_size_error = mag maximaal %s karakters bevatten.
-email_error = is niet een valide e-mail adres.
-url_error = is niet een valide URL.
-unknown_error = Onbekende fout:
-captcha_incorrect = Captcha komt niet overeen.
-password_not_match = Wachtwoord en verificatie wachtwoord komen niet overeen.
-username_been_taken = Gebruikersnaam is al in gebruik.
-repo_name_been_taken = Repositorie naam is al in gebruik.
-org_name_been_taken = Organisatie naam is al in gebruik.
-team_name_been_taken = Team naam is al in gebruik.
-email_been_used = e-mailadres is al in gebruik.
-ssh_key_been_used = Openbare sleutel naam is al in gebruik.
-illegal_username = Gebruikersnaam bevat illegale karakters.
-illegal_repo_name = Repositorie naam bevat illegale karakters.
-illegal_org_name = Organisatie naam bevat illegale karakters.
-illegal_team_name = Team naam bevat illegale karakters.
-username_password_incorrect = Gebruikersnaam of wachtwoord is niet correct.
-enterred_invalid_repo_name = U heeft een onjuiste repositorie naam ingevoerd.
-enterred_invalid_owner_name = U heeft een onjuiste eigenaar ingevoerd.
-enterred_invalid_password = U heeft een onjuiste wachtwoord ingevoerd.
-user_not_exist = Gegeven gebruiker bestaat niet.
-last_org_owner = De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst nieuwe lid (eigenaar) aanstellen.
-invalid_ssh_key = Sorry, we zijn niet in staat om uw SSH-sleutel te verifiëren: %s
-auth_failed = Verificatie mislukt: %v
-still_own_repo = Uw account heeft nog een eigendom op een repositorie. U moet deze eerst verwijderen of overdragen.
-org_still_own_repo = De organisatie heeft nog eigendomen op repositories. U moet deze eerst verwijderen of overdragen.
-still_own_user = Deze authenticatie methode wordt nog gebruikt door sommige gebruikers. U moet hen eerst verplaatsen of verwijderen.
-AdminEmail = E-mail beheerder
-
-[settings]
-profile = Profiel
-password = Wachtwoord
-ssh_keys = SSH-sleutels
-social = Sociale netwerk-accounts
-orgs = Organisaties
-delete = Verwijder account
-public_profile = Openbaar profiel
-profile_desc = Uw e-mailadres is openbaar zichtbaar en zal gebruikt worden gebruikt voor alle account gerlateerde berichtgevingen en web bewerking gemaakt via de website.
-full_name = Volledige naam
-website = Website
-location = Locatie
-update_profile = Profile bijwerken
-update_profile_success = Uw profiel is succesvol bijgewerkt.
-change_password = Verander wachtwoord
-old_password = Huidige wachtwoord
-new_password = Nieuw wachtwoord
-password_incorrect = Huidig wachtwoord is niet correct.
-change_password_success = Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen.
-manage_ssh_keys = Beheer SSH sleutels
-add_key = Sleutel toevoegen
-ssh_desc = Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent.
-ssh_helper = <strong>Hulp nodig?</strong> Bekijk onze help pagina's over <a href="https://help.github.com/articles/generating-ssh-keys">SSH sleutels genereeren</a> of over <a href="https://help.github.com/ssh-issues/">meest voorkomende SSH problemen</a>.
-add_new_key = SSH sleutel toevoegen
-key_name = Sleutel naam
-key_content = Inhoud
-add_key_success = Nieuwe SSH sleutel is toegevoegd!
-delete_key = Verwijder
-add_on = Toegevoegd op
-last_used = Laatst gebruikt op
-no_activity = Geen recente activiteiten
-manage_social = Beheer gekoppelde sociale accounts
-social_desc = Dit is een lijst van de bijbehorende sociale accounts koppelingen, Verwijder eventueel koppelingen die u niet herkent.
-unbind = Loskoppelen
-unbind_success = Sociaal account is ontkoppeld.
-delete_account = Verwijder uw account
-delete_prompt = Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien!
-confirm_delete_account = Bevestig verwijdering
-uid = uid
-change_username = Username veranderd
-change_username_desc = Gebruikersnaam is gewijzigd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op uw account.
-continue = Doorgaan
-cancel = Annuleren
-delete_account_title = Account verwijderen
-delete_account_desc = Dit account zal permanent worden verwijderd. Wilt u doorgaan?
-
-[repo]
-owner = Eigenaar
-repo_name = Repositorie naam
-repo_name_helper = Een goede repositorie naam is kort, memorabel en <strong>uniek</strong>.
-visibility = Zichtbaarheid
-visiblity_helper = Deze repositorie is <span class="label label-red label-radius">prive</span>
-repo_desc = Omschrijving
-repo_lang = Taal
-repo_lang_helper = Selecteer een .gitignore bestand
-license = Licentie
-license_helper = Selecteer een licentie bestand
-init_readme = Initialiseer deze repositorie met een README.md
-create_repo = Nieuwe Repositorie
-default_branch = Standaard branch
-mirror_interval = Mirror interval(uur)
-goget_meta = Go-Get Meta
-goget_meta_helper = Deze repositorie is nu beschikbaar voor <span class="label label-blue label-radius">Go-Get</span>
-need_auth = Autorisatie vereist
-migrate_type = Migratie type
-migrate_type_helper = Deze repositorie zal een <span class="label label-blue label-radius">mirror</span> worden
-migrate_repo = Migreer repositorie
-clone_helper = Hulp nodig bij het klonen? Kijk dan <a target="_blank" href="http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository">hier</a> voor hulp!
-unwatch = Negeren
-watch = Volgen
-unstar = Ontster
-star = Ster
-fork = Fork
-settings = Instellingen
-settings.options = Opties
-settings.collaboration = Samenwerking
-settings.hooks = Webhooks
-settings.deploy_keys = Installeer sleutels
-settings.basic_settings = Basis instellingen
-settings.danger_zone = Gevaren zone
-settings.site = Officiële site
-settings.update_settings = Instellingen bewerken
-settings.transfer = Eigendom overdragen
-settings.transfer_desc = Draag deze repo over aan een andere gebruiker of een organisatie waar u beheerders rechten heeft.
-settings.delete = Verwijder deze repositorie
-settings.delete_desc = Als u eenmaal een repositorie verwijderd is er geen weg terug. Gelieve zeker te zijn van uw acties.
-settings.update_settings_success = Repositorie instellingen zijn succesvol bijgewerkt.
-settings.transfer_owner = Nieuwe eigenaar
-settings.make_transfer = Maak overdracht
-settings.confirm_delete = Bevestig verwijdering
-settings.add_collaborator = Nieuwe medewerker toevoegen
-settings.add_collaborator_success = medewerker is toegevoegd.
-settings.remove_collaborator_success = medewerker is verwijderd.
-settings.add_webhook = Webhook toevoegen
-settings.hooks_desc = Webhooks maken het mogelijk om ​​externe diensten te waaarschuwen wanneer zich bepaalde gebeurtenissen voordoen op Gogs . Wanneer de opgegeven gebeurtenissen gebeuren , zullen we een POST-aanvraag aan alle URL's die u verstrekt sturen . Lees meer in onze <a target="_blank" href="http://gogs.io/docs/features/webhook.html"> Webhooks gids </a>.
-settings.remove_hook_success = Webhook is verwijderd.
-settings.add_webhook_desc = We sturen een <code>POST</code> verzoek aan de onderstaande URL met de details van het geplaatste evenementen. U kunt ook aangeven welke data u wilt ontvangen (JSON, <code>x-www-form-urlencoded</code>, <em>etc</em>). U kunt meer informatie vinden in onze <a target="_blank" href="http://gogs.io/docs/features/webhook.html"> webhooks gids</a>.
-settings.payload_url = Payload URL
-settings.content_type = Content type
-settings.secret = Geheim
-settings.event_desc = Bij welke gebeurtenissen wilt u dat deze webhook getriggerd wordt?
-settings.event_push_only = Alleen bij de <code>push</code> event.
-settings.active = Actief
-settings.active_helper = We zullen details van de gebeurtenissen af leveren wanneer deze webhook wordt geactiveerd.
-settings.add_hook_success = Nieuwe webhook toegevoegd.
-settings.update_webhook = Bewerk webhook
-settings.update_hook_success = Webhook is bijgewerkt.
-settings.delete_webhook = Webhook verwijderen
-settings.recent_deliveries = Recente bezorgingen
-copy_link = Kopieer
-click_to_copy = Kopieer link naar plakbord
-copied = Gekopieerd
-no_desc = Geen omschrijving
-quick_guide = Snelstart gids
-clone_this_repo = Kloon deze repositorie
-create_new_repo_command = Maak een nieuwe repositorie aan vanaf de console
-push_exist_repo = Push een bestaande repositorie vanaf de console
-branch = Aftakking
-tree = Boom
-branch_and_tags = Aftakkingen & labels
-branches = Aftakkingen
-tags = Labels
-issues = Issues
-commits = Commits
-releases = Publicaties
-commits.commits = Commits
-commits.search = Zoeken
-commits.find = zoek
-commits.author = Auteur
-commits.message = Bericht
-commits.date = Datum
-commits.older = Ouder
-commits.newer = Nieuwer
-settings.change_reponame = Repositorienaam aangepast
-settings.change_reponame_desc = De repositorienaam is veranderd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze repositorie.
-settings.new_owner_has_same_repo = De nieuwe eigenaar heeft al een repositorie met deze naam
-settings.transfer_notices = <p> - U kan uw toegang verliezen als de nieuwe eigenaar een individuele gebruiker is</p> <p> - . . U zal uw toegang behouden als de nieuwe eigenaar een organisatie is en u één van de eigenaren bent</p>
-settings.transfer_succeed = Eigendom repositorie succesvol overgedragen
-settings.hook_type = Type hook
-settings.add_slack_hook_desc = Voeg een <a href="http://slack.com">Slack</a> integratie toe aan uw repositorie.
-settings.slack_token = Slack token
-settings.slack_domain = Slack domein
-settings.slack_channel = Slack kanaal
-
-[org]
-org_name_holder = Organisatienaam
-org_name_helper = Een goede organisatienaam is kort en memorabel.
-org_email_helper = Alle notificaties en bevestigingen worden op het e-mailadres van de organisatie ontvangen.
-create_org = Nieuwe organisatie aanmaken
-repo_updated = Geupdate
-people = Mensen
-invite_someone = Iemand uitnodigen
-teams = Teams
-lower_members = leden
-lower_repositories = repositories
-create_new_team = Nieuw team aanmaken
-org_desc = Omschrijving
-team_name = Teamnaam
-team_desc = Omschrijving
-team_name_helper = U gebruikt deze naam om dit team te vermelden in conversaties.
-team_desc_helper = Waar gaat dit team doen?
-team_permission_desc = Welke privileges zou dit team moeten hebben?
-settings = Instellingen
-settings.options = Opties
-settings.full_name = Volledige naam
-settings.website = Website
-settings.location = Locatie
-settings.update_settings = Instellingen bijwerken
-settings.update_setting_success = Organisatie instellingen zijn succesvol bijgewerkt.
-settings.delete = Verwijder organisatie
-settings.delete_account = Verwijder deze organisatie
-settings.delete_prompt = Deze actie zal de origanisatie permanent verwijderen. U kunt dit <strong>NIET</strong> terug draaien!
-settings.confirm_delete_account = Bevestig verwijdering
-members.public = Openbaar
-members.public_helper = maak prive
-members.private = Prive
-members.private_helper = maak openbaar
-members.owner = Eigenaar
-members.member = Lid
-members.conceal = Verbergen
-members.remove = Verwijderen
-members.leave = Verlaat
-members.invite_desc = Begin met het typen van een gebruikersnaam om een nieuw lid aan %s uit te nodigen:
-members.invite_now = Nu uitnodigen
-teams.join = Lid worden
-teams.leave = Vertlaat
-teams.read_access = Leestoegang
-teams.read_access_helper = Dit team is in staat om zijn repositories te bekijken en te klonen.
-teams.write_access = Schrijf toegang
-teams.write_access_helper = Dit team is in staat om zijn repositories te bekijken en push aanvragen te verwerken.
-teams.admin_access = Beheerder toegang
-teams.admin_access_helper = Dit team is in staat om push & pull aanvragen te verwerken en om nieuwe medewerkers toe te voegen.
-teams.no_desc = Dit team heeft geen omschrijving
-teams.settings = Instellingen
-teams.owners_permission_desc = Eigenaren hebben volledige toegang tot <strong>alle repositories</strong> en hebben <strong>beheerder rechten</strong> over de organisatie.
-teams.members = Team leden
-teams.update_settings = Instellingen bijwerken
-teams.delete_team = Verwijder deze team
-teams.add_team_member = Nieuwe team lid aanmaken
-teams.delete_team_success = Gekozen team is succesvol verwijderd.
-teams.read_permission_desc = Dit team heeft <strong>Lees</strong> rechten : leden kunnen repositories lezen en klonen.
-teams.write_permission_desc = Dit team heeft <strong>Schrijf</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken.
-teams.admin_permission_desc = Dit team heeft <strong>Beheerders</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken en medewerkers toevoegen.
-teams.repositories = Teamrepositories
-teams.add_team_repository = Nieuwe teamrepositorie aanmaken
-teams.remove_repo = Verwijder
-settings.change_orgname = Organisatie naam veranderd
-settings.change_orgname_desc = De naam van de organisatie is veranderd, wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze organisatie.
-settings.delete_org_title = Verwijderen organsiatie
-settings.delete_org_desc = Deze organisatie zal permanent worden verwijderd, wilt u doorgaan?
-settings.hooks_desc = Een webhook toevoegen die door <strong>alle repositories</strong> in deze organisatie getriggerd kan worden.
-teams.delete_team_title = Team verwijderen
-teams.delete_team_desc = Dit team zal worden verwijderd. De leden van dit team zullen toegang tot alle repositories van het team verliezen. Wilt u doorgaan?
-
-[admin]
-dashboard = Dashboard
-users = Gebruikers
-organizations = Orgranisaties
-repositories = Repositories
-authentication = Autenticaties
-config = Configuratie
-monitor = Bijhouden
-prev = Vorige
-next = Volgende
-dashboard.statistic = Statistieken
-dashboard.operations = Bewerkingen
-dashboard.system_status = Status Systeemmonitor
-dashboard.statistic_info = Gogs database heeft <b>%d</b> gebruikers, <b>%d</b> organisaties, <b>%d</b> openbare sleutels, <b>%d</b> repositories, <b>%d</b> volgers, <b>%d</b> sterren, <b>%d</b> acties, <b>%d</b> participanten, <b>%d</b> issues, <b>%d</b> reacties, <b>%d</b> sociale accounten, <b>%d</b> volgers, <b>%d</b> mirrors, <b>%d</b> publicaties, <b>%d</b> login bronnen, <b>%d</b> webhooks, <b>%d</b> mijlpalen, <b>%d</b> labels, <b>%d</b> hook taken, <b>%d</b> teams, <b>%d</b> bijgewerkte taken, <b>%d</b> bijlagen.
-dashboard.operation_name = Bewerking naam
-dashboard.operation_switch = Omschakelen
-dashboard.operation_run = Uitvoeren
-dashboard.clean_unbind_oauth = Clean unbound OAuths
-dashboard.delete_inactivate_accounts = Verwijder alle inactieve accounts
-dashboard.server_uptime = Uptime server
-dashboard.current_goroutine = Huidige Goroutines
-dashboard.current_memory_usage = Huidige geheugen gebruik
-dashboard.total_memory_allocated = Totaal toegewezen geheugen
-dashboard.memory_obtained = Geheugen gebruikt
-dashboard.pointer_lookup_times = Pointer Lookup Times
-dashboard.memory_allocate_times = Memory Allocate Times
-dashboard.memory_free_times = Memory Free Times
-dashboard.current_heap_usage = Current Heap Usage
-dashboard.heap_memory_obtained = Heap Memory Obtained
-dashboard.heap_memory_idle = Heap Memory Idle
-dashboard.heap_memory_in_use = Heap Memory In Use
-dashboard.heap_memory_released = Heap Memory Released
-dashboard.heap_objects = Heap Objects
-dashboard.bootstrap_stack_usage = Bootstrap Stack Usage
-dashboard.stack_memory_obtained = Stack Memory Obtained
-dashboard.mspan_structures_usage = MSpan Structures Usage
-dashboard.mspan_structures_obtained = MSpan Structures Obtained
-dashboard.mcache_structures_usage = MCache Structures Usage
-dashboard.mcache_structures_obtained = MCache Structures Obtained
-dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained
-dashboard.gc_metadata_obtained = GC Metadada Obtained
-dashboard.other_system_allocation_obtained = Other System Allocation Obtained
-dashboard.next_gc_recycle = Volgende GC recycle
-dashboard.last_gc_time = Sinds vorige GC verwerkingstijd
-dashboard.total_gc_time = Totaal GC verwerkingstijd
-dashboard.total_gc_pause = Totaal GC verwerkingstijd
-dashboard.last_gc_pause = Laatste GC verwerkingstijd
-dashboard.gc_times = GC verwerkingen
-users.user_manage_panel = Gebruikers beheren
-users.new_account = Nieuw account aanmaken
-users.name = Naam
-users.activated = Geactiveerd
-users.admin = Admin
-users.repos = Repos
-users.created = Aangemaakt
-users.edit = Bewerken
-users.auth_source = Autorisatiebron
-users.local = Lokaal
-users.auth_login_name = Autorisatie inlognaam
-users.update_profile_success = Profiel is succesvol bijgewerkt.
-users.edit_account = Bewerk account
-users.is_activated = Dit account is geactiveerd
-users.is_admin = Dit account heeft beheerdersrechten
-users.update_profile = Account profiel bijwerken
-users.delete_account = Dit account verwijderen
-users.still_own_repo = Dit account is nog steeds eigendom van een repositorie. U moet deze repositorie eerst verwijderen of overdragen.
-orgs.org_manage_panel = Organisaties beheren
-orgs.name = Naam
-orgs.teams = Teams
-orgs.members = Leden
-repos.repo_manage_panel = Repositoriebeheerpaneel
-repos.owner = Eigenaar
-repos.name = Naam
-repos.private = Prive
-repos.watches = Volgers
-repos.stars = Sterren
-repos.issues = Issues
-auths.auth_manage_panel = Autorisatiebeheerpaneel
-auths.new = Nieuwe autorisatiebron
-auths.name = Naam
-auths.type = Type
-auths.enabled = Ingeschakeld
-auths.updated = Bijgewerkt
-auths.auth_type = Autorisatietype
-auths.auth_name = Autorisatienaam
-auths.domain = Domein
-auths.host = Host
-auths.port = Poort
-auths.base_dn = Base DN
-auths.attributes = Zoek attributen
-auths.filter = Zoek filter
-auths.ms_ad_sa = Ms Ad SA
-auths.smtp_auth = SMTP authenticatietype
-auths.smtphost = SMTP host
-auths.smtpport = SMTP poort
-auths.enable_tls = Activeer TLS-encryptie
-auths.enable_auto_register = Activeer automatische registratie
-auths.tips = Tips
-auths.edit = Bewerk autorisatie-instellingen
-auths.activated = Deze autorisatiemethode is geactiveerd
-auths.update_success = Autorisatie-instellingen zijn succesvol bijgewerkt.
-auths.update = Update autorisatie-instellingen
-auths.delete = Verwijder deze autorisatie
-config.server_config = Serverconfiguratie
-config.app_name = Applicatienaam
-config.app_ver = Applicatieversie
-config.app_url = Applicatie-URL
-config.domain = Domein
-config.offline_mode = Offline-modus
-config.disable_router_log = Router-log uitschakelen
-config.run_user = Uitvoerende gebruiker
-config.run_mode = Uitvoer modus
-config.repo_root_path = Repositorie basis pad
-config.static_file_root_path = Statische bestanden basis pad
-config.log_file_root_path = Log bestand basis pad
-config.script_type = Script type
-config.reverse_auth_user = Reverse Authentication User
-config.db_config = Databaseconfiguratie
-config.db_type = Type
-config.db_host = Host
-config.db_name = Naam
-config.db_user = Gebruiker
-config.db_ssl_mode = SSL modus
-config.db_ssl_mode_helper = (alleen voor "postgres")
-config.db_path = Path
-config.db_path_helper = (alleen voor "sqlite3")
-config.service_config = Serviceconfiguratie
-config.register_email_confirm = Register Email Confirmation
-config.disable_register = Registratie uitgeschakeld
-config.require_sign_in_view = Inloggen vereist om te kunnen inzien
-config.mail_notify = E-mailnotificaties
-config.enable_cache_avatar = Avatar Cache inschakelen
-config.active_code_lives = Active Code Lives
-config.reset_password_code_lives = Reset Password Code Lives
-config.webhook_config = Webhook configuratie
-config.task_interval = Taakinterval
-config.deliver_timeout = Bezorging verlooptijd
-config.mailer_config = Mailerconfiguatie
-config.mailer_enabled = Ingeschakeld
-config.mailer_name = Naam
-config.mailer_host = Host
-config.mailer_user = Gebruiker
-config.oauth_config = OAuth-configuratie
-config.oauth_enabled = Ingeschakeld
-config.cache_config = Cache-configuratie
-config.cache_adapter = Cache-adapter
-config.cache_interval = Cache-interval
-config.cache_conn = Cache-connectie
-config.session_config = Sessieconfiguratie
-config.session_provider = Sessieprovider
-config.provider_config = Provider config
-config.cookie_name = Cookie naam
-config.enable_set_cookie = Set Cookie inschakelen
-config.gc_interval_time = GC interval time
-config.session_life_time = Sessie duur
-config.https_only = Alleen HTTPS
-config.cookie_life_time = Cookie duur leeftijd
-config.session_hash_function = Sessie ID Hash functie
-config.session_hash_key = Sessie ID Hash sleutel
-config.picture_config = Foto configuratie
-config.picture_service = Foto service
-config.disable_gravatar = Gravatar uitschakelen
-config.log_config = Logconfiguratie
-config.log_mode = Log-modus
-monitor.cron = Cron-taken
-monitor.name = Naam
-monitor.schedule = Planning
-monitor.next = Volgende
-monitor.previous = Vorige
-monitor.execute_times = Aantal keren uitgevoerd
-monitor.process = Draaiende processen
-monitor.desc = Omschrijving
-monitor.start = Starttijd
-monitor.execute_time = Uitvoertijd
-auths.delete_auth_title = Verwijderings-autorisatie
-auths.delete_auth_desc = Deze autorisatiemethode wordt verwijderd. Weet u zeker dat u wilt doorgaan?
-
-[action]
-create_repo = repositorie aangemaakt in <a href="%s/%s">%s</a>
-commit_repo = push update naar <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a
-create_issue = opende issue in <a href="%s/%s/issues/%s">%s#%s</a>
-comment_issue = reactie op issue <a href="%s/%s/issues/%s">%s#%s</a>
-transfer_repo = repositorie verplaatst naar <code>%s</code> naar <a href="/%s%s">%s</a>
-
-[tool]
-ago = geleden
-from_now = vanaf nu
-now = nu
-1s = 1 seconde %s
-1m = 1 minuut %s
-1h = 1 uur %s
-1d = 1 dag %s
-1w = 1 week %s
-1mon = 1 maand %s
-1y = 1 jaar %s
-seconds = %d seconden %s
-minutes = %d minuten %s
-hours = %d uur %s
-days = %d dagen %s
-weeks = %d weken %s
-months = %d maanden %s
-years = %d jaren %s
-raw_seconds = seconden
-raw_minutes = minuten
-
-[install]
-install = Installatie
-title = Installatiestappen voor de eerste keer opstarten
-requite_db_desc = Om Gogs te gebruiken is MySQL, PostgreSQL of SQLite3 vereist (SQLite3 is beschikbaar in de officiële versie).
-db_type = Database-type
-host = Host
-user = Gebruikersnaam
-password = Wachtwoord
-db_name = Database naam
-db_helper = Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL.
-ssl_mode = SSL-modus
-path = Pad
-sqlite_helper = Het pad naar de SQLite3 database.
-general_title = Algemene instellingen van Gogs
-repo_path = Repositories basis directorie
-repo_path_helper = Alle remote Git repositories worden in deze directorie opgeslagen
-run_user = Uitvoerende gebruikersnaam
-run_user_helper = Deze gebruiker moet toegang hebben tot de git repositorie directorie en moet Gogs kunnen starten
-domain = Domein
-domain_helper = Dit heeft invloed op de SSH kloon URLs
-app_url = Applicatie URL
-app_url_helper = Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt
-email_title = Email service instellingen (Optioneel)
-smtp_host = SMTP host
-mailer_user = Afzender e-mail / gebruikersnaam
-mailer_password = Wachtwoord
-notify_title = Notificatie-instelligen (optioneel)
-register_confirm = Activeer registratie emails
-mail_notify = Activeer e-mailnotificaties
-admin_title = Instellingen beheerdersaccount
-admin_name = Gebruikersnaam
-admin_password = Wachtwoord
-confirm_password = Verifieer wachtwoord
-admin_email = E-mailadres
-install_gogs = Installeer Gogs
-test_git_failed = Git test niet gelukt: 'git' commando %v
-sqlite3_not_available = SQLite3 wordt niet ondersteund in uw versie. Gelieve de officiële versie downloaden vanaf http://gogs.io/docs/installation/install_from_binary.html, niet de gobuild versie downloaden.
-invalid_db_setting = Uw database instellingen zijn niet correct: %v
-invalid_repo_path = Repositorie basis pad is niet correct: %v
-run_user_not_match = De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s
-save_config_failed = Kan de configuratie niet opslaan: %v
-invalid_admin_setting = Uw admin-instellingen zijn niet geldig: %v
-install_success = Welkom! Wij zijn veheugd dat u voor Gogs heeft gekozen, veel plezier en tot ziens
-
-[explore]
-repos = Repositories
-
-[user]
-change_avatar = Verander uw avatar op Gravatar.com
-join_on = Aangemeld op
-repositories = repositories
-activity = Openbare activiteit
-followers = Volgers
-starred = Sterren
-following = Volgt
+app_desc=Een pijnloze self-hosted Git-dienst geschreven in Go
+
+home=Huis
+dashboard=Dashboard
+explore=Verkennen
+help=Help
+sign_in=Inloggen
+social_sign_in=Social netwerk inlog: tweede stap <small>account koppelen</small>
+sign_out=Afmelden
+sign_up=Aanmelden
+register=Registreer
+website=Website
+version=Versie
+page=Pagina
+template=Sjabloon
+language=Taal
+
+username=Gebruikersnaam
+email=E-mail
+password=Wachttwoord
+re_type=Verificatie
+captcha=CAPTCHA
+
+repository=Repositorie
+organization=Organisatie
+mirror=Spiegel
+new_repo=Nieuwe repositorie
+new_migrate=Nieuwe migratie
+new_fork=Nieuwe vork Repository
+new_org=Nieuwe organisatie
+manage_org=Beheer organisaties
+admin_panel=Adminpaneel
+account_settings=Accountinstellingen
+settings=Instellingen
+
+news_feed=Nieuwsfeed
+pull_requests=Pull-aanvragen
+issues=Kwesties
+
+cancel=Annuleer
+
+[install]
+install=Installatie
+title=Installatiestappen voor de eerste keer opstarten
+requite_db_desc=Om Gogs te gebruiken is MySQL, PostgreSQL of SQLite3 vereist (SQLite3 is beschikbaar in de officiële versie).
+db_type=Database-type
+host=Host
+user=Gebruikersnaam
+password=Wachtwoord
+db_name=Database naam
+db_helper=Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL.
+ssl_mode=SSL-modus
+path=Pad
+sqlite_helper=Het pad naar de SQLite3 database.
+general_title=Algemene instellingen van Gogs
+repo_path=Repositories basis directorie
+repo_path_helper=Alle remote Git repositories worden in deze directorie opgeslagen
+run_user=Uitvoerende gebruikersnaam
+run_user_helper=Deze gebruiker moet toegang hebben tot de git repositorie directorie en moet Gogs kunnen starten
+domain=Domein
+domain_helper=Dit heeft invloed op de SSH kloon URLs
+app_url=Applicatie URL
+app_url_helper=Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt
+email_title=Email service instellingen (Optioneel)
+smtp_host=SMTP host
+mailer_user=Afzender e-mail / gebruikersnaam
+mailer_password=Wachtwoord
+notify_title=Notificatie-instelligen (optioneel)
+register_confirm=Activeer registratie emails
+mail_notify=Activeer e-mailnotificaties
+admin_title=Instellingen beheerdersaccount
+admin_name=Gebruikersnaam
+admin_password=Wachtwoord
+confirm_password=Verifieer wachtwoord
+admin_email=E-mailadres
+install_gogs=Installeer Gogs
+test_git_failed=Git test niet gelukt: 'git' commando %v
+sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download de officiële binaire versie van %s, niet de gobuild versie.
+invalid_db_setting=Uw database instellingen zijn niet correct: %v
+invalid_repo_path=Repositorie basis pad is niet correct: %v
+run_user_not_match=De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s
+save_config_failed=Kan de configuratie niet opslaan: %v
+invalid_admin_setting=Uw admin-instellingen zijn niet geldig: %v
+install_success=Welkom! Wij zijn veheugd dat u voor Gogs heeft gekozen, veel plezier en tot ziens
+
+[home]
+uname_holder=Gebruikersnaam of e-mail
+password_holder=Wachtwoord
+switch_dashboard_context=Wissel voorpaginacontext
+my_repos=Mijn repositories
+collaborative_repos=Gedeelde repositories
+my_orgs=Mijn organisaties
+my_mirrors=Mijn mirrors
+
+[explore]
+repos=Repositories
+
+[auth]
+create_new_account=Maak nieuw account aan
+register_hepler_msg=Heeft u al een account? Meld u nu aan!
+social_register_hepler_msg=Heeft u al een account? Koppel nu!
+disable_register_prompt=Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.
+disable_register_mail=Sorry, bevestiging van registratie per e-mail is uitgeschakeld.
+remember_me=Onthoud mij
+forgot_password=Wachtwoord vergeten
+forget_password=Wachtwoord vergeten?
+sign_up_now=Een account nodig? Meld u nu aan.
+confirmation_mail_sent_prompt=Een bevestigingsemail is gestuurd naar <b>%s</b>, Bevestig u aanvraag binnen %d uren om uw registratie te voltooien.
+sign_in_email=Meld u aan met uw e-mailadres
+active_your_account=Activeer uw account
+resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag.
+has_unconfirmed_mail=Beste %s, u heeft een onbevestigde e-mailadres (<b>%s</b>). Als u nog geen bevestiging per e-mail 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 e-mailadres is niet gekoppeld aan een account.
+send_reset_mail=Klik hier om uw wachtwoord reset mail (nogmaals) te versturen
+reset_password=Reset uw wachtwoord
+invalid_code=Sorry, uw bevestigingscode is verlopen of niet meer geldig.
+reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen.
+password_too_short=De lengte van uw wachtwoord moet minimaal zes karakters zijn.
+
+[form]
+UserName=Gebruikersnaam
+RepoName=Repositorie naam
+Email=e-mailadres
+Password=Wachtwoord
+Retype=Verifieer wachtwoord
+SSHTitle=SSH sleutel naam
+HttpsUrl=HTTPS-URL
+PayloadUrl=Nettolading URL
+TeamName=Team naam
+AuthName=Autorisatienaam
+AdminEmail=E-mail beheerder
+
+require_error=kan niet leeg zijn.
+alpha_dash_error=moet een valide alfanumeriek of dash(-_) karakter zijn.
+alpha_dash_dot_error=moet een valide alfanumeriek, dash(-_) of (.) punt karakter zijn.
+min_size_error=moet minimaal %s karakters bevatten.
+max_size_error=mag maximaal %s karakters bevatten.
+email_error=is niet een valide e-mail adres.
+url_error=is niet een valide URL.
+unknown_error=Onbekende fout:
+captcha_incorrect=Captcha komt niet overeen.
+password_not_match=Wachtwoord en verificatie wachtwoord komen niet overeen.
+
+username_been_taken=Gebruikersnaam is al in gebruik.
+repo_name_been_taken=Repositorie naam is al in gebruik.
+org_name_been_taken=Organisatie naam is al in gebruik.
+team_name_been_taken=Team naam is al in gebruik.
+email_been_used=e-mailadres is al in gebruik.
+ssh_key_been_used=Openbare sleutel naam is al in gebruik.
+illegal_username=Gebruikersnaam bevat illegale karakters.
+illegal_repo_name=Repositorie naam bevat illegale karakters.
+illegal_org_name=Organisatie naam bevat illegale karakters.
+illegal_team_name=Team naam bevat illegale karakters.
+username_password_incorrect=Gebruikersnaam of wachtwoord is niet correct.
+enterred_invalid_repo_name=U heeft een onjuiste repositorie naam ingevoerd.
+enterred_invalid_owner_name=U heeft een onjuiste eigenaar ingevoerd.
+enterred_invalid_password=U heeft een onjuiste wachtwoord ingevoerd.
+user_not_exist=Gegeven gebruiker bestaat niet.
+last_org_owner=De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst nieuwe lid (eigenaar) aanstellen.
+
+invalid_ssh_key=Sorry, we zijn niet in staat om uw SSH-sleutel te verifiëren: %s
+unable_verify_ssh_key=Gogs kan niet controleren of uw SSH-sleutel, maar wij gaan ervan uit dat is geldig, zorg ervoor dat uzelf.
+auth_failed=Verificatie mislukt: %v
+
+still_own_repo=Uw account heeft nog een eigendom op een repositorie. U moet deze eerst verwijderen of overdragen.
+still_has_org=Uw account nog steeds lidmaatschap van organisatie, u hebt naar links of hen eerst verwijderen.
+org_still_own_repo=De organisatie heeft nog eigendomen op repositories. U moet deze eerst verwijderen of overdragen.
+
+still_own_user=Deze authenticatie methode wordt nog gebruikt door sommige gebruikers. U moet hen eerst verplaatsen of verwijderen.
+
+target_branch_not_exist=Doel branch bestaat niet
+
+[user]
+change_avatar=Verander uw avatar op Gravatar.com
+join_on=Aangemeld op
+repositories=repositories
+activity=Openbare activiteit
+followers=Volgers
+starred=Sterren
+following=Volgt
+
+[settings]
+profile=Profiel
+password=Wachtwoord
+ssh_keys=SSH-sleutels
+social=Sociale netwerk-accounts
+applications=Toepassingen
+orgs=Organisaties
+delete=Verwijder account
+uid=uid
+
+public_profile=Openbaar profiel
+profile_desc=Uw e-mailadres is openbaar zichtbaar en zal gebruikt worden gebruikt voor alle account gerlateerde berichtgevingen en web bewerking gemaakt via de website.
+full_name=Volledige naam
+website=Website
+location=Locatie
+update_profile=Profile bijwerken
+update_profile_success=Uw profiel is succesvol bijgewerkt.
+change_username=Username veranderd
+change_username_desc=Gebruikersnaam is gewijzigd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op uw account.
+continue=Doorgaan
+cancel=Annuleren
+
+change_password=Verander wachtwoord
+old_password=Huidige wachtwoord
+new_password=Nieuw wachtwoord
+password_incorrect=Huidig wachtwoord is niet correct.
+change_password_success=Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen.
+
+manage_ssh_keys=Beheer SSH sleutels
+add_key=Sleutel toevoegen
+ssh_desc=Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent.
+ssh_helper=<strong>De behoeftehulp van?</strong> Check out onze gids voor het <a href="%s"> genereren van SSH sleutels</a> of <a href="%s"> algemene SSH</a> problemen.
+add_new_key=SSH sleutel toevoegen
+key_name=Sleutel naam
+key_content=Inhoud
+add_key_success=Nieuwe SSH sleutel is toegevoegd!
+delete_key=Verwijder
+add_on=Toegevoegd op
+last_used=Laatst gebruikt op
+no_activity=Geen recente activiteiten
+
+manage_social=Beheer gekoppelde sociale accounts
+social_desc=Dit is een lijst van de bijbehorende sociale accounts koppelingen, Verwijder eventueel koppelingen die u niet herkent.
+unbind=Loskoppelen
+unbind_success=Sociaal account is ontkoppeld.
+
+manage_access_token=Persoonlijke toegangstokens beheren
+generate_new_token=Nieuwe Token genereren
+tokens_desc=Tokens u hebt gegenereerd die kunnen worden gebruikt voor toegang tot de API Gogs.
+new_token_desc=Zoals voor nu, moet elke token zal hebben volledige toegang tot uw account.
+token_name=Symbolische naam
+generate_token=Token genereren
+generate_token_succees=Nieuwe toegangstoken is met succes gegenereerd! Zorg ervoor dat uw nieuwe persoonlijke toegangstoken nu kopiëren. U zal niet zitten kundig voor zien het weer!
+delete_token=Verwijderen
+delete_token_success=Persoonlijke toegangstoken is met succes verwijderd! Vergeet niet uw toepassingen ook wilt bijwerken.
+
+delete_account=Verwijder uw account
+delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien!
+confirm_delete_account=Bevestig verwijdering
+delete_account_title=Account verwijderen
+delete_account_desc=Dit account zal permanent worden verwijderd. Wilt u doorgaan?
+
+[repo]
+owner=Eigenaar
+repo_name=Repositorie naam
+repo_name_helper=Een goede repositorie naam is kort, memorabel en <strong>uniek</strong>.
+visibility=Zichtbaarheid
+visiblity_helper=Deze repositorie is <span class="label label-red label-radius">prive</span>
+fork_repo=Vork Repository
+fork_from=Afsplitsing van
+fork_visiblity_helper=Gevorkte repository wijzigen zijn bereik potentiële kopers niet
+repo_desc=Omschrijving
+repo_lang=Taal
+repo_lang_helper=Selecteer een .gitignore bestand
+license=Licentie
+license_helper=Selecteer een licentie bestand
+init_readme=Initialiseer deze repositorie met een README.md
+create_repo=Nieuwe Repositorie
+default_branch=Standaard branch
+mirror_interval=Mirror interval(uur)
+goget_meta=Go-Get Meta
+goget_meta_helper=Deze repositorie is nu beschikbaar voor <span class="label label-blue label-radius">Go-Get</span>
+
+need_auth=Autorisatie vereist
+migrate_type=Migratie type
+migrate_type_helper=Deze repositorie zal een <span class="label label-blue label-radius">mirror</span> worden
+migrate_repo=Migreer repositorie
+
+copy_link=Kopieer
+click_to_copy=Kopieer link naar plakbord
+copied=Gekopieerd
+clone_helper=De behoeftehulp van klonen? Bezoek <a target="_blank" href="%s"> helpen</a>!
+unwatch=Negeren
+watch=Volgen
+unstar=Ontster
+star=Ster
+fork=Vork
+
+no_desc=Geen omschrijving
+quick_guide=Snelstart gids
+clone_this_repo=Kloon deze repositorie
+create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
+push_exist_repo=Push een bestaande repositorie vanaf de console
+
+branch=Aftakking
+tree=Boom
+branch_and_tags=Aftakkingen & labels
+branches=Aftakkingen
+tags=Labels
+issues=Kwesties
+commits=Commits
+releases=Publicaties
+file_raw=Ruwe
+file_history=Geschiedenis
+file_view_raw=Weergave ruwe
+
+commits.commits=Commits
+commits.search=Zoeken
+commits.find=zoek
+commits.author=Auteur
+commits.message=Bericht
+commits.date=Datum
+commits.older=Ouder
+commits.newer=Nieuwer
+
+settings=Instellingen
+settings.options=Opties
+settings.collaboration=Samenwerking
+settings.hooks=Webhooks
+settings.githooks=Git haken
+settings.deploy_keys=Installeer sleutels
+settings.basic_settings=Basis instellingen
+settings.danger_zone=Gevaren zone
+settings.site=Officiële site
+settings.update_settings=Instellingen bewerken
+settings.change_reponame=Repositorienaam aangepast
+settings.change_reponame_desc=De repositorienaam is veranderd. Wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze repositorie.
+settings.transfer=Eigendom overdragen
+settings.transfer_desc=Draag deze repo over aan een andere gebruiker of een organisatie waar u beheerders rechten heeft.
+settings.new_owner_has_same_repo=De nieuwe eigenaar heeft al een repositorie met deze naam
+settings.delete=Verwijder deze repositorie
+settings.delete_desc=Als u eenmaal een repositorie verwijderd is er geen weg terug. Gelieve zeker te zijn van uw acties.
+settings.transfer_notices=<p> - U kan uw toegang verliezen als de nieuwe eigenaar een individuele gebruiker is</p> <p> - . . U zal uw toegang behouden als de nieuwe eigenaar een organisatie is en u één van de eigenaren bent</p>
+settings.update_settings_success=Repositorie instellingen zijn succesvol bijgewerkt.
+settings.transfer_owner=Nieuwe eigenaar
+settings.make_transfer=Maak overdracht
+settings.transfer_succeed=Eigendom repositorie succesvol overgedragen
+settings.confirm_delete=Bevestig verwijdering
+settings.add_collaborator=Nieuwe medewerker toevoegen
+settings.add_collaborator_success=medewerker is toegevoegd.
+settings.remove_collaborator_success=medewerker is verwijderd.
+settings.user_is_org_member=Gebruiker is lid van de organisatie die als een medewerker kan niet worden toegevoegd.
+settings.add_webhook=Webhook toevoegen
+settings.hooks_desc=Webhooks dat de externe diensten om kennisgevingen te ontvangen wanneer bepaalde gebeurtenissen op Gogs plaatsvinden. Wanneer de opgegeven gebeurtenissen plaatsvinden, sturen we een POST-aanvraag naar elk van de URL's die u opgeeft. Meer informatie vindt u in onze <a target="_blank" href="%s"> Webhooks gids</a>.
+settings.githooks_desc=Git haken worden aangedreven door Git zelf, u kunt bestanden van ondersteunde haken in de lijst hieronder om aangepaste acties van toepassing bewerken.
+settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden gepresenteerd. Verlof inhoud leeg zal deze haak uitschakelen.
+settings.githook_name=Haak naam
+settings.githook_content=Haak inhoud
+settings.update_githook=Haak bijwerken
+settings.remove_hook_success=Webhook is verwijderd.
+settings.add_webhook_desc=We sturen een <code>POST</code>-aanvraag naar de onderstaande URL met details voor alle geplaatste gebeurtenissen. U kunt ook opgeven welke gegevensindeling u wenst te ontvangen (JSON, <code>x-1-800-www-Dell-vorm-urlencoded</code>, <em>enz</em>.). Meer informatie kan gevonden worden in <a target="_blank" href="%s"> Webhooks gids</a>.
+settings.payload_url=Nettolading URL
+settings.content_type=Content type
+settings.secret=Geheim
+settings.event_desc=Bij welke gebeurtenissen wilt u dat deze webhook getriggerd wordt?
+settings.event_push_only=Alleen bij de <code>push</code> event.
+settings.active=Actief
+settings.active_helper=We zullen details van de gebeurtenissen af leveren wanneer deze webhook wordt geactiveerd.
+settings.add_hook_success=Nieuwe webhook toegevoegd.
+settings.update_webhook=Bewerk webhook
+settings.update_hook_success=Webhook is bijgewerkt.
+settings.delete_webhook=Webhook verwijderen
+settings.recent_deliveries=Recente bezorgingen
+settings.hook_type=Type hook
+settings.add_slack_hook_desc=<a href="%s"> toegestane vertraging</a> integratie toevoegen aan uw repository.
+settings.slack_token=Slack token
+settings.slack_domain=Slack domein
+settings.slack_channel=Slack kanaal
+
+diff.browse_source=Bladeren bron
+diff.parent=bovenliggende
+diff.commit=commit
+diff.data_not_available=Diff gegevens niet beschikbaar.
+diff.show_diff_stats=Toon Diff Stats
+diff.stats_desc=<strong>%d gewijzigde bestanden</strong> met <strong>toevoegingen van %d</strong> en <strong>%d verwijderingen</strong>
+diff.bin=BIN
+diff.view_file=Bestand weergeven
+
+[org]
+org_name_holder=Organisatienaam
+org_name_helper=Een goede organisatienaam is kort en memorabel.
+org_email_helper=Alle notificaties en bevestigingen worden op het e-mailadres van de organisatie ontvangen.
+create_org=Nieuwe organisatie aanmaken
+repo_updated=Geupdate
+people=Mensen
+invite_someone=Iemand uitnodigen
+teams=Teams
+lower_members=leden
+lower_repositories=repositories
+create_new_team=Nieuw team aanmaken
+org_desc=Omschrijving
+team_name=Teamnaam
+team_desc=Omschrijving
+team_name_helper=U gebruikt deze naam om dit team te vermelden in conversaties.
+team_desc_helper=Waar gaat dit team doen?
+team_permission_desc=Welke privileges zou dit team moeten hebben?
+
+settings=Instellingen
+settings.options=Opties
+settings.full_name=Volledige naam
+settings.website=Website
+settings.location=Locatie
+settings.update_settings=Instellingen bijwerken
+settings.change_orgname=Organisatie naam veranderd
+settings.change_orgname_desc=De naam van de organisatie is veranderd, wilt u doorgaan? Dit zal gevolgen hebben voor alle koppelingen die betrekking hebben op deze organisatie.
+settings.update_setting_success=Organisatie instellingen zijn succesvol bijgewerkt.
+settings.delete=Verwijder organisatie
+settings.delete_account=Verwijder deze organisatie
+settings.delete_prompt=Deze actie zal de origanisatie permanent verwijderen. U kunt dit <strong>NIET</strong> terug draaien!
+settings.confirm_delete_account=Bevestig verwijdering
+settings.delete_org_title=Verwijderen organsiatie
+settings.delete_org_desc=Deze organisatie zal permanent worden verwijderd, wilt u doorgaan?
+settings.hooks_desc=Een webhook toevoegen die door <strong>alle repositories</strong> in deze organisatie getriggerd kan worden.
+
+members.public=Openbaar
+members.public_helper=maak prive
+members.private=Prive
+members.private_helper=maak openbaar
+members.owner=Eigenaar
+members.member=Lid
+members.conceal=Verbergen
+members.remove=Verwijderen
+members.leave=Verlaat
+members.invite_desc=Begin met het typen van een gebruikersnaam om een nieuw lid aan %s uit te nodigen:
+members.invite_now=Nu uitnodigen
+
+teams.join=Lid worden
+teams.leave=Vertlaat
+teams.read_access=Leestoegang
+teams.read_access_helper=Dit team is in staat om zijn repositories te bekijken en te klonen.
+teams.write_access=Schrijf toegang
+teams.write_access_helper=Dit team is in staat om zijn repositories te bekijken en push aanvragen te verwerken.
+teams.admin_access=Beheerder toegang
+teams.admin_access_helper=Dit team is in staat om push & pull aanvragen te verwerken en om nieuwe medewerkers toe te voegen.
+teams.no_desc=Dit team heeft geen omschrijving
+teams.settings=Instellingen
+teams.owners_permission_desc=Eigenaren hebben volledige toegang tot <strong>alle repositories</strong> en hebben <strong>beheerder rechten</strong> over de organisatie.
+teams.members=Team leden
+teams.update_settings=Instellingen bijwerken
+teams.delete_team=Verwijder deze team
+teams.add_team_member=Nieuwe team lid aanmaken
+teams.delete_team_title=Team verwijderen
+teams.delete_team_desc=Dit team zal worden verwijderd. De leden van dit team zullen toegang tot alle repositories van het team verliezen. Wilt u doorgaan?
+teams.delete_team_success=Gekozen team is succesvol verwijderd.
+teams.read_permission_desc=Dit team heeft <strong>Lees</strong> rechten : leden kunnen repositories lezen en klonen.
+teams.write_permission_desc=Dit team heeft <strong>Schrijf</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken.
+teams.admin_permission_desc=Dit team heeft <strong>Beheerders</strong> rechten : leden kunnen repositories lezen en push aanvragen verwerken en medewerkers toevoegen.
+teams.repositories=Teamrepositories
+teams.add_team_repository=Nieuwe teamrepositorie aanmaken
+teams.remove_repo=Verwijder
+teams.add_nonexistent_repo=De opslagplaats die u probeert toe te voegen niet bestaat, kunt u het eerst aanmaken.
+
+[admin]
+dashboard=Dashboard
+users=Gebruikers
+organizations=Orgranisaties
+repositories=Repositories
+authentication=Autenticaties
+config=Configuratie
+notices=Systeem aankondigingen
+monitor=Bijhouden
+prev=Vorige
+next=Volgende
+
+dashboard.statistic=Statistieken
+dashboard.operations=Bewerkingen
+dashboard.system_status=Status Systeemmonitor
+dashboard.statistic_info=Gogs database heeft <b>%d</b> gebruikers, <b>%d</b> organisaties, <b>%d</b> openbare sleutels, <b>%d</b> repositories, <b>%d</b> volgers, <b>%d</b> sterren, <b>%d</b> acties, <b>%d</b> participanten, <b>%d</b> issues, <b>%d</b> reacties, <b>%d</b> sociale accounten, <b>%d</b> volgers, <b>%d</b> mirrors, <b>%d</b> publicaties, <b>%d</b> login bronnen, <b>%d</b> webhooks, <b>%d</b> mijlpalen, <b>%d</b> labels, <b>%d</b> hook taken, <b>%d</b> teams, <b>%d</b> bijgewerkte taken, <b>%d</b> bijlagen.
+dashboard.operation_name=Bewerking naam
+dashboard.operation_switch=Omschakelen
+dashboard.operation_run=Uitvoeren
+dashboard.clean_unbind_oauth=Clean unbound OAuths
+dashboard.delete_inactivate_accounts=Verwijder alle inactieve accounts
+dashboard.server_uptime=Uptime server
+dashboard.current_goroutine=Huidige Goroutines
+dashboard.current_memory_usage=Huidige geheugen gebruik
+dashboard.total_memory_allocated=Totaal toegewezen geheugen
+dashboard.memory_obtained=Geheugen gebruikt
+dashboard.pointer_lookup_times=Aanwijzer Lookup keer
+dashboard.memory_allocate_times=Geheugen toewijzen keer
+dashboard.memory_free_times=Geheugen gratis keer
+dashboard.current_heap_usage=Huidige Heap gebruik
+dashboard.heap_memory_obtained=Heap-geheugen verkregen
+dashboard.heap_memory_idle=Heap Memory inactief
+dashboard.heap_memory_in_use=Hoop geheugen In gebruik
+dashboard.heap_memory_released=Heap-geheugen vrijgegeven
+dashboard.heap_objects=Heap-objecten
+dashboard.bootstrap_stack_usage=Bootstrap Stack gebruik
+dashboard.stack_memory_obtained=Stapel geheugen verkregen
+dashboard.mspan_structures_usage=MSpan structuren gebruik
+dashboard.mspan_structures_obtained=MSpan structuren verkregen
+dashboard.mcache_structures_usage=MCache structuren gebruik
+dashboard.mcache_structures_obtained=MCache structuren verkregen
+dashboard.profiling_bucket_hash_table_obtained=Profilering emmer hashtabel verkregen
+dashboard.gc_metadata_obtained=GC Metadada verkregen
+dashboard.other_system_allocation_obtained=Andere systeem toewijzing verkregen
+dashboard.next_gc_recycle=Volgende GC recycle
+dashboard.last_gc_time=Sinds vorige GC verwerkingstijd
+dashboard.total_gc_time=Totaal GC verwerkingstijd
+dashboard.total_gc_pause=Totaal GC verwerkingstijd
+dashboard.last_gc_pause=Laatste GC verwerkingstijd
+dashboard.gc_times=GC verwerkingen
+
+users.user_manage_panel=Gebruikers beheren
+users.new_account=Nieuw account aanmaken
+users.name=Naam
+users.activated=Geactiveerd
+users.admin=Admin
+users.repos=Repos
+users.created=Aangemaakt
+users.edit=Bewerken
+users.auth_source=Autorisatiebron
+users.local=Lokaal
+users.auth_login_name=Autorisatie inlognaam
+users.update_profile_success=Profiel is succesvol bijgewerkt.
+users.edit_account=Bewerk account
+users.is_activated=Dit account is geactiveerd
+users.is_admin=Dit account heeft beheerdersrechten
+users.allow_git_hook=Deze account beschikt over machtigingen voor het maken van Git haken
+users.update_profile=Account profiel bijwerken
+users.delete_account=Dit account verwijderen
+users.still_own_repo=Dit account is nog steeds eigendom van een repositorie. U moet deze repositorie eerst verwijderen of overdragen.
+users.still_has_org=Deze account nog steeds lidmaatschap van organisatie, u hebt naar links of hen eerst verwijderen.
+
+orgs.org_manage_panel=Organisaties beheren
+orgs.name=Naam
+orgs.teams=Teams
+orgs.members=Leden
+
+repos.repo_manage_panel=Repositoriebeheerpaneel
+repos.owner=Eigenaar
+repos.name=Naam
+repos.private=Prive
+repos.watches=Volgers
+repos.stars=Sterren
+repos.issues=Kwesties
+
+auths.auth_manage_panel=Autorisatiebeheerpaneel
+auths.new=Nieuwe autorisatiebron
+auths.name=Naam
+auths.type=Type
+auths.enabled=Ingeschakeld
+auths.updated=Bijgewerkt
+auths.auth_type=Autorisatietype
+auths.auth_name=Autorisatienaam
+auths.domain=Domein
+auths.host=Host
+auths.port=Poort
+auths.base_dn=Base DN
+auths.attributes=Zoek attributen
+auths.filter=Zoek filter
+auths.ms_ad_sa=MS Ad SA
+auths.smtp_auth=SMTP authenticatietype
+auths.smtphost=SMTP host
+auths.smtpport=SMTP poort
+auths.enable_tls=Activeer TLS-encryptie
+auths.enable_auto_register=Activeer automatische registratie
+auths.tips=Tips
+auths.edit=Bewerk autorisatie-instellingen
+auths.activated=Deze autorisatiemethode is geactiveerd
+auths.update_success=Autorisatie-instellingen zijn succesvol bijgewerkt.
+auths.update=Update autorisatie-instellingen
+auths.delete=Verwijder deze autorisatie
+auths.delete_auth_title=Verwijderings-autorisatie
+auths.delete_auth_desc=Deze autorisatiemethode wordt verwijderd. Weet u zeker dat u wilt doorgaan?
+
+config.server_config=Serverconfiguratie
+config.app_name=Applicatienaam
+config.app_ver=Applicatieversie
+config.app_url=Applicatie-URL
+config.domain=Domein
+config.offline_mode=Offline-modus
+config.disable_router_log=Router-log uitschakelen
+config.run_user=Uitvoerende gebruiker
+config.run_mode=Uitvoer modus
+config.repo_root_path=Repositorie basis pad
+config.static_file_root_path=Statische bestanden basis pad
+config.log_file_root_path=Log bestand basis pad
+config.script_type=Script type
+config.reverse_auth_user=Omgekeerde verificatie gebruiker
+config.db_config=Databaseconfiguratie
+config.db_type=Type
+config.db_host=Host
+config.db_name=Naam
+config.db_user=Gebruiker
+config.db_ssl_mode=SSL modus
+config.db_ssl_mode_helper=(alleen voor "postgres")
+config.db_path=Pad
+config.db_path_helper=(alleen voor "sqlite3")
+config.service_config=Serviceconfiguratie
+config.register_email_confirm=E-mailbevestiging registreren
+config.disable_register=Registratie uitgeschakeld
+config.require_sign_in_view=Inloggen vereist om te kunnen inzien
+config.mail_notify=E-mailnotificaties
+config.enable_cache_avatar=Avatar Cache inschakelen
+config.active_code_lives=Actieve Code leven
+config.reset_password_code_lives=Reset wachtwoord Code leven
+config.webhook_config=Webhook configuratie
+config.task_interval=Taakinterval
+config.deliver_timeout=Bezorging verlooptijd
+config.mailer_config=Mailerconfiguatie
+config.mailer_enabled=Ingeschakeld
+config.mailer_name=Naam
+config.mailer_host=Host
+config.mailer_user=Gebruiker
+config.oauth_config=OAuth-configuratie
+config.oauth_enabled=Ingeschakeld
+config.cache_config=Cache-configuratie
+config.cache_adapter=Cache-adapter
+config.cache_interval=Cache-interval
+config.cache_conn=Cache-connectie
+config.session_config=Sessieconfiguratie
+config.session_provider=Sessieprovider
+config.provider_config=Provider config
+config.cookie_name=Cookie naam
+config.enable_set_cookie=Set Cookie inschakelen
+config.gc_interval_time=GC interval time
+config.session_life_time=Sessie duur
+config.https_only=Alleen HTTPS
+config.cookie_life_time=Cookie duur leeftijd
+config.picture_config=Foto configuratie
+config.picture_service=Foto service
+config.disable_gravatar=Gravatar uitschakelen
+config.log_config=Logconfiguratie
+config.log_mode=Log-modus
+
+monitor.cron=Cron-taken
+monitor.name=Naam
+monitor.schedule=Planning
+monitor.next=Volgende
+monitor.previous=Vorige
+monitor.execute_times=Aantal keren uitgevoerd
+monitor.process=Draaiende processen
+monitor.desc=Omschrijving
+monitor.start=Starttijd
+monitor.execute_time=Uitvoertijd
+
+notices.system_notice_list=Systeem aankondigingen
+notices.type=Type
+notices.type_1=Opslagplaats
+notices.desc=Beschrijving
+notices.op=Op.
+notices.delete_success=Systeem bericht is met succes verwijderd.
+
+[action]
+create_repo=repositorie aangemaakt in <a href="%s/%s">%s</a>
+commit_repo=push update naar <a href="%s/%s/src/%s">%s</a> in <a href="%s/%s">%s</a
+create_issue=opende issue in <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=reactie op issue <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=repositorie verplaatst naar <code>%s</code> naar <a href="/%s%s">%s</a>
+push_tag=geduwd label <a href="%s/%s/src/%s"> %s</a> naar <a href="%s/%s"> %s</a>
+compare_2_commits=Weergave vergelijking voor deze 2 commits
+
+[tool]
+ago=geleden
+from_now=vanaf nu
+now=nu
+1s=1 seconde %s
+1m=1 minuut %s
+1h=1 uur %s
+1d=1 dag %s
+1w=1 week %s
+1mon=1 maand %s
+1y=1 jaar %s
+seconds=%d seconden %s
+minutes=%d minuten %s
+hours=%d uur %s
+days=%d dagen %s
+weeks=%d weken %s
+months=%d maanden %s
+years=%d jaren %s
+raw_seconds=seconden
+raw_minutes=minuten
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini
index a5bccb55..bf1b21a4 100644..100755
--- a/conf/locale/locale_zh-CN.ini
+++ b/conf/locale/locale_zh-CN.ini
@@ -1,659 +1,679 @@
-app_desc = 基于 Go 语言的自助 Git 服务
-
-home = 首页
-dashboard = 控制面板
-explore = 探索
-help = 帮助
-sign_in = 登录
-social_sign_in = 社交帐号登录:第 2 步 <small>关联帐号</small>
-sign_out = 退出
-sign_up = 注册
-register = 注册
-website = 官方网站
-version = 当前版本
-page = 页面
-template = 模板
-language = 语言选项
-
-username = 用户名
-email = 邮箱
-password = 密码
-re_type = 确认密码
-captcha = 验证码
-
-repository = 仓库
-organization = 组织
-mirror = 镜像
-new_repo = 创建新的仓库
-new_migrate = 迁移外部仓库
-new_org = 创建新的组织
-manage_org = 管理我的组织
-admin_panel = 管理面板
-account_settings = 帐户设置
-settings = 帐户设置
-
-news_feed = 最新活动
-pull_requests = 合并请求
-issues = 工单管理
-
-cancel = 取消
-
-[install]
-install = 安装页面
-title = 首次运行安装程序
-requite_db_desc = Gogs 允许后端数据库为 MySQL、PostgreSQL 或 SQLite3。
-db_type = 数据库类型
-host = 数据库主机
-user = 数据库用户
-password = 数据库用户密码
-db_name = 数据库名称
-db_helper = 如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci 字符集。
-ssl_mode = SSL 模式
-path = 数据库文件路径
-sqlite_helper = SQLite3 数据库的文件路径。
-general_title = 应用基本设置
-repo_path = 仓库根目录
-repo_path_helper = 所有 Git 远程仓库都将被存放于该目录。
-run_user = 运行系统用户
-run_user_helper = 该用户必须具有对仓库根目录和运行 Gogs 的操作权限。
-domain = 域名
-domain_helper = 该设置影响 SSH 克隆地址。
-app_url = 应用 URL
-app_url_helper = 该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。
-email_title = 邮件服务设置(可选)
-smtp_host = SMTP 主机
-mailer_user = 发送邮箱
-mailer_password = 发送邮箱密码
-notify_title = 通知提醒设置(可选)
-register_confirm = 启用注册邮箱确认
-mail_notify = 启用邮件通知提醒
-admin_title = 管理员帐号设置
-admin_name = 管理员用户名
-admin_password = 管理员密码
-confirm_password = 确认密码
-admin_email = 管理员邮箱
-install_gogs = 立即安装
-test_git_failed = 无法识别 'git' 命令:%v
-sqlite3_not_available = 您所使用的发行版不支持 SQLite3,请从 http://gogs.io/docs/installation/install_from_binary.html 下载官方二进制发行版,而不是 gobuild 版本。
-invalid_db_setting = 数据库设置不正确:%v
-invalid_repo_path = 仓库根目录设置不正确:%v
-run_user_not_match = 运行系统用户非当前用户:%s -> %s
-save_config_failed = 应用配置保存失败:%v
-invalid_admin_setting = 管理员帐户设置不正确:%v
-install_success = 您好!我们很高兴您选择使用 Gogs,祝您使用愉快,代码从此无 BUG!
-
-[home]
-uname_holder = 用户名或邮箱
-password_holder = 密码
-switch_dashboard_context = 切换控制面板用户
-my_repos = 我的仓库
-collaborative_repos = 参与协作的仓库
-my_orgs = 我的组织
-my_mirrors = 我的镜像
-
-[explore]
-repos = 探索仓库
-
-[auth]
-create_new_account = 创建帐户
-register_hepler_msg = 已经注册?立即登录!
-social_register_hepler_msg = 已经注册?立即绑定!
-disable_register_prompt = 对不起,注册功能已被关闭。请联系网站管理员。
-disable_register_mail = 对不起,注册邮箱确认功能已被关闭。
-remember_me = 记住登录
-forgot_password = 忘记密码
-forget_password = 忘记密码?
-sign_up_now = 还没帐户?马上注册。
-confirmation_mail_sent_prompt = 一封新的确认邮件已经被发送至 <b>%s</b>,请检查您的收件箱并在 %d 小时内完成确认注册操作。
-sign_in_email = 登录到您的邮箱
-active_your_account = 激活您的帐户
-resent_limit_prompt = 对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试!
-has_unconfirmed_mail = %s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
-resend_mail = 单击此处重新发送确认邮件
-email_not_associate = 您输入的邮箱地址未被关联到任何帐号!
-send_reset_mail = 单击此处(重新)发送您的密码重置邮件
-reset_password = 重置密码
-invalid_code = 对不起,您的确认代码已过期或已失效。
-reset_password_helper = 单击此处重置密码
-password_too_short = 密码长度不能少于 6 位!
-
-[form]
-UserName = 用户名
-RepoName = 仓库名称
-Email = 邮箱地址
-Password = 密码
-Retype = 确认密码
-SSHTitle = SSH 密钥名称
-HttpsUrl = HTTPS URL 地址
-PayloadUrl = 推送地址
-TeamName = 团队名称
-AuthName = 认证名称
-AdminEmail = 管理员邮箱
-
-require_error = 不能为空。
-alpha_dash_error = 必须为英文字母、阿拉伯数字或横线(-_)。
-alpha_dash_dot_error = 必须为英文字母、阿拉伯数字、横线(-_)或点。
-min_size_error = 长度最小为 %s 个字符。
-max_size_error = 长度最大为 %s 个字符。
-email_error = 不是一个有效的邮箱地址。
-url_error = 不是一个有效的 URL。
-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 = 邮箱地址已经被使用。
-ssh_key_been_used = SSH 密钥已经被使用。
-illegal_username = 您的用户名包含非法字符。
-illegal_repo_name = 仓库名称包含非法字符。
-illegal_org_name = 组织名称包含非法字符。
-illegal_team_name = 团队名称包含非法字符。
-username_password_incorrect = 用户名或密码不正确。
-enterred_invalid_repo_name = 请检查您输入的仓库名称是正确。
-enterred_invalid_owner_name = 请检查您输入的新所有者用户名是否正确。
-enterred_invalid_password = 请检查您输入的密码是否正确。
-user_not_exist = 被操作的用户不存在!
-last_org_owner = 被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作!
-
-invalid_ssh_key = 很抱歉,我们无法验证您输入的 SSH 密钥:%s
-unable_verify_ssh_key = Gogs 无法验证您输入的 SSH 密钥,但我们假设那是有效的密钥,请您自行确保其有效性!
-auth_failed = 授权验证失败:%v
-
-still_own_repo = 您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作!
-org_still_own_repo = 该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作!
-
-still_own_user = 该授权认证依旧被部分用户使用,请先删除该部分用户后再试!
-
-[user]
-change_avatar = 到 gravatar.com 上修改您的头像
-join_on = 加入于
-repositories = 仓库列表
-activity = 公开活动
-followers = 关注者
-starred = 已点赞
-following = 关注中
-
-[settings]
-profile = 个人信息
-password = 修改密码
-ssh_keys = 管理 SSH 密钥
-social = 社交帐号绑定
-orgs = 管理组织
-delete = 删除帐户
-uid = 用户 ID
-
-public_profile = 公开信息
-profile_desc = 您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。
-full_name = 自定义名称
-website = 个人网站
-location = 所在地区
-update_profile = 更新信息
-update_profile_success = 您的个人信息更新成功!
-change_username = 用户名将被修改
-change_username_desc = 用户名被修改,您确定要继续操作吗?这将会影响到所有与您帐户有关的链接。
-continue = 继续操作
-cancel = 取消操作
-
-change_password = 修改密码
-old_password = 当前密码
-new_password = 新的密码
-password_incorrect = 当前密码不正确!
-change_password_success = 密码修改成功!您现在可以使用新的密码登录。
-
-manage_ssh_keys = 管理 SSH 密钥
-add_key = 增加密钥
-ssh_desc = 以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它!
-ssh_helper = <strong>需要帮助?</strong> 请查看有关 <a href="https://help.github.com/articles/generating-ssh-keys">如何生成 SSH 密钥</a> 或 <a href="https://help.github.com/ssh-issues/">常见 SSH 问题</a> 寻找答案。
-add_new_key = 增加 SSH 密钥
-key_name = 密钥名称
-key_content = 密钥内容
-add_key_success = 新的 SSH 密钥添加成功!
-delete_key = 删除
-add_on = 增加于
-last_used = 上次使用在
-no_activity = 没有最近活动
-
-manage_social = 管理关联社交帐户
-social_desc = 以下是与您帐户所关联的社交帐号,如果您发现有陌生的关联,请立即解除绑定!
-unbind = 解除绑定
-unbind_success = 社交帐号解除绑定成功!
-
-delete_account = 删除当前帐户
-delete_prompt = 删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>!
-confirm_delete_account = 确认删除帐户
-delete_account_title = 帐户删除操作
-delete_account_desc = 该帐户将被永久性删除,您确定要继续操作吗?
-
-[repo]
-owner = 拥有者
-repo_name = 仓库名称
-repo_name_helper = 伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。
-visibility = 可见性
-visiblity_helper = 本仓库将是 <span class="label label-red label-radius">私有的</span>
-repo_desc = 仓库描述
-repo_lang = 仓库语言
-repo_lang_helper = 请选择 .gitignore 文件
-license = 授权许可
-license_helper = 请选择授权许可文件
-init_readme = 使用 README.md 文件初始化仓库
-create_repo = 创建仓库
-default_branch = 默认分支
-mirror_interval = 镜像同步周期(小时)
-goget_meta = Go-Get 支持
-goget_meta_helper = 本仓库将可以通过 <span class="label label-blue label-radius">Go Get</span> 获取
-
-need_auth = 需要授权验证
-migrate_type = 迁移类型
-migrate_type_helper = 本仓库将是 <span class="label label-blue label-radius">镜像</span>
-migrate_repo = 迁移仓库
-
-copy_link = 复制链接
-click_to_copy = 复制到剪切板
-copied = 复制成功
-clone_helper = 不知道如何操作?访问 <a target="_blank" href="http://git-scm.com/book/zh/Git-基础-取得项目的-Git-仓库">此处</a> 查看帮助!
-unwatch = 取消关注
-watch = 关注
-unstar = 取消点赞
-star = 点赞
-fork = 派生
-
-no_desc = 暂无描述
-quick_guide = 快速帮助
-clone_this_repo = 克隆当前仓库
-create_new_repo_command = 从命令行创建一个新的仓库
-push_exist_repo = 从命令行推送已经创建的仓库
-
-branch = 分支
-tree = 目录树
-branch_and_tags = 分支与标签
-branches = 分支列表
-tags = 标签列表
-issues = 工单管理
-commits = 提交历史
-releases = 版本发布
-file_raw = 原始文件
-file_history = 文件历史
-file_view_raw = 查看原始文件
-
-commits.commits = 次代码提交
-commits.search = 搜索提交历史
-commits.find = 查找
-commits.author = 作者
-commits.message = 备注
-commits.date = 提交日期
-commits.older = 更旧的提交
-commits.newer = 更新的提交
-
-settings = 仓库设置
-settings.options = 基本设置
-settings.collaboration = 管理协作者
-settings.hooks = 管理 Web 钩子
-settings.githooks = 管理 Git 钩子
-settings.deploy_keys = 管理部署密钥
-settings.basic_settings = 基本设置
-settings.danger_zone = 危险操作区
-settings.site = 官方网站
-settings.update_settings = 更新仓库设置
-settings.change_reponame = 仓库名称将被修改
-settings.change_reponame_desc = 仓库名称被修改,您确定要继续操作吗?这将会影响到所有与该仓库有关的链接。
-settings.transfer = 转移仓库所有权
-settings.transfer_desc = 您可以将仓库转移至您拥有管理员权限的帐户或组织。
-settings.new_owner_has_same_repo = 新的仓库拥有者已经存在同名仓库!
-settings.delete = 删除本仓库
-settings.delete_desc = 删除仓库操作不可逆转,请三思而后行。
-settings.transfer_notices = <p>- 如果您转移给个人用户,您将对仓库失去所有权限。</p><p>- 如果您转移给您作为拥有者的组织,则可继续保持操作权限。</p>
-settings.update_settings_success = 仓库设置更新成功!
-settings.transfer_owner = 新拥有者
-settings.make_transfer = 确认转移仓库
-settings.transfer_succeed = 仓库所有权转移成功!
-settings.confirm_delete = 确认删除仓库
-settings.add_collaborator = 增加新的协作者
-settings.add_collaborator_success = 成功添加新的协作者!
-settings.remove_collaborator_success = 被操作的协作者已经被收回权限!
-settings.user_is_org_member = 被操作的用户是组织成员,因此无法添加为协作者!
-settings.add_webhook = 添加 Web 钩子
-settings.hooks_desc = Web 钩子允许您设定在 Gogs 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文档</a> 获取更多信息。
-settings.remove_hook_success = Web 钩子删除成功!
-settings.add_webhook_desc = 我们会通过 <code>POST</code> 请求将订阅事件信息发送至向指定 URL 地址。您可以设置不同的数据接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 请查阅 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文档</a> 获取更多信息。
-settings.githooks_desc = Git 钩子是由 Git 本身提供的功能,以下为 Gogs 所支持的钩子列表。
-settings.githook_edit_desc = 如果钩子未启动,则会显示样例文件中的内容。如果想要删除某个钩子,则提交空白文本即可。
-settings.githook_name = 钩子名称
-settings.githook_content = 钩子文本
-settings.update_githook = 更新钩子设置
-settings.payload_url = 推送地址
-settings.content_type = 数据格式
-settings.secret = 密钥文本
-settings.event_desc = 请设置您希望触发 Web 钩子的事件:
-settings.event_push_only = 只推送 <code>push</code> 事件。
-settings.active = 是否激活
-settings.active_helper = 当指定事件发生时我们将会触发此 Web 钩子。
-settings.add_hook_success = Web 钩子添加成功!
-settings.update_webhook = 更新 Web 钩子
-settings.update_hook_success = Web 钩子更新成功!
-settings.delete_webhook = 删除 Web 钩子
-settings.recent_deliveries = 最近推送记录
-settings.hook_type = 钩子类型
-settings.add_slack_hook_desc = 为您的仓库增加 <a href="http://slack.com">Slack</a> 集成
-settings.slack_token = 令牌
-settings.slack_domain = 域名
-settings.slack_channel = 频道
-
-diff.browse_source = 浏览代码
-diff.parent = 父节点
-diff.commit = 当前提交
-diff.data_not_available = 暂无可用数据
-diff.show_diff_stats = 显示文件统计
-diff.stats_desc = 共有 <strong> %d 个文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
-diff.bin = 二进制
-diff.view_file = 查看文件
-
-[org]
-org_name_holder = 组织名称
-org_name_helper = 伟大的组织都有一个简短而寓意深刻的名字。
-org_email_helper = 组织的邮箱用于接收所有通知和确认邮件。
-create_org = 创建组织
-repo_updated = 最后更新于
-people = 组织成员
-invite_someone = 邀请他人加入
-teams = 组织团队
-lower_members = 名成员
-lower_repositories = 个仓库
-create_new_team = 创建新的团队
-org_desc = 组织描述
-team_name = 团队名称
-team_desc = 团队描述
-team_name_helper = 您可以使用该名称来通知改组全体成员。
-team_desc_helper = 一句话描述这个团队是做什么的。
-team_permission_desc = 请选择该团队所具有的权限等级:
-
-settings = 组织设置
-settings.options = 基本设置
-settings.full_name = 组织全名
-settings.website = 官方网站
-settings.location = 所在地区
-settings.update_settings = 更新组织设置
-settings.change_orgname = 组织名称将被修改
-settings.change_orgname_desc = 组织名称被修改,您确定要继续操作吗?这将会影响到所有与该组织有关的链接。
-settings.update_setting_success = 组织设置更新成功!
-settings.delete = 删除组织
-settings.delete_account = 删除当前组织
-settings.delete_prompt = 删除操作会永久清除该组织的信息,并且 <strong>不可恢复</strong>!
-settings.confirm_delete_account = 确认删除组织
-settings.delete_org_title = 组织删除操作
-settings.delete_org_desc = 该组织将被永久性删除,您确定要继续操作吗?
-settings.hooks_desc = 在此处添加的 Web 钩子将会应用到该组织下的 <strong>所有仓库</strong>。
-
-members.public = 公开成员
-members.public_helper = 设为私有
-members.private = 私有成员
-members.private_helper = 设为公开
-members.owner = 管理员
-members.member = 普通成员
-members.conceal = 隐藏身份
-members.remove = 移除成员
-members.leave = 离开组织
-members.invite_desc = 请输入被邀请到组织 %s 的用户名称:
-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.admin_access_helper = 这个团队将拥有查看、克隆、推送和添加其他组织成员到团队的权限。
-teams.no_desc = 该团队暂无描述
-teams.settings = 团队设置
-teams.owners_permission_desc = 管理员团队对 <strong>所有仓库</strong> 具有操作权限,且对组织具有 <strong>管理员权限</strong>。
-teams.members = 团队成员
-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 = 该团队拥有对所属仓库的 <strong>读取</strong> 权限,团队成员可以进行查看和克隆等只读操作。
-teams.write_permission_desc = 该团队拥有对所属仓库的 <strong>读取</strong> 和 <strong>写入</strong> 的权限。
-teams.admin_permission_desc = 该团队拥有一定的 <strong>管理</strong> 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。
-teams.repositories = 团队仓库
-teams.add_team_repository = 添加团队仓库
-teams.remove_repo = 移除仓库
-teams.add_nonexistent_repo = 您尝试添加到团队的仓库不存在,请先创建仓库!
-
-[admin]
-dashboard = 控制面板
-users = 用户管理
-organizations = 组织管理
-repositories = 仓库管理
-authentication = 授权认证管理
-config = 应用配置管理
-notices = 系统提示管理
-monitor = 应用监控面板
-prev = 上一页
-next = 下一页
-
-dashboard.statistic = 应用统计数据
-dashboard.operations = 管理员操作
-dashboard.system_status = 系统监视状态
-dashboard.statistic_info = Gogs 数据库统计:<b>%d</b> 位用户,<b>%d</b> 个组织,<b>%d</b> 个公钥,<b>%d</b> 个仓库,<b>%d</b> 个仓库关注,<b>%d</b> 个赞,<b>%d</b> 次行为,<b>%d</b> 条权限记录,<b>%d</b> 张工单,<b>%d</b> 次评论,<b>%d</b> 个社交帐号,<b>%d</b> 个用户关注,<b>%d</b> 个镜像,<b>%d</b> 个版本发布,<b>%d</b> 个登录源,<b>%d</b> 个 Web 钩子,<b>%d</b> 个里程碑,<b>%d</b> 个标签,<b>%d</b> 个钩子任务,<b>%d</b> 个团队,<b>%d</b> 个更新任务,<b>%d</b> 个附件。
-dashboard.operation_name = 操作名称
-dashboard.operation_switch = 开关
-dashboard.operation_run = 执行
-dashboard.clean_unbind_oauth = 清理未绑定社交帐号
-dashboard.delete_inactivate_accounts = 删除所有未激活帐户
-dashboard.server_uptime = 服务运行时间
-dashboard.current_goroutine = 当前 Goroutines 数量
-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 内存空闲量
-dashboard.heap_memory_in_use = 正在使用的 Heap 内存
-dashboard.heap_memory_released = 被释放的 Heap 内存
-dashboard.heap_objects = Heap 对象数量
-dashboard.bootstrap_stack_usage = 启动 Stack 使用量
-dashboard.stack_memory_obtained = 被分配的 Stack 内存
-dashboard.mspan_structures_usage = MSpan 结构内存使用量
-dashboard.mspan_structures_obtained = 被分配的 MSpan 结构内存
-dashboard.mcache_structures_usage = MCache 结构内存使用量
-dashboard.mcache_structures_obtained = 被分配的 MCache 结构内存
-dashboard.profiling_bucket_hash_table_obtained = 被分配的剖析哈希表内存
-dashboard.gc_metadata_obtained = 被分配的 GC 元数据内存
-dashboard.other_system_allocation_obtained = 其它被分配的系统内存
-dashboard.next_gc_recycle = 下次 GC 内存回收量
-dashboard.last_gc_time = 距离上次 GC 时间
-dashboard.total_gc_time = GC 执行时间总量
-dashboard.total_gc_pause = GC 暂停时间总量
-dashboard.last_gc_pause = 上次 GC 暂停时间
-dashboard.gc_times = GC 执行次数
-
-users.user_manage_panel = 用户管理面板
-users.new_account = 创建新的帐户
-users.name = 用户名
-users.activated = 已激活
-users.admin = 管理员
-users.repos = 仓库数
-users.created = 创建时间
-users.edit = 编辑
-users.auth_source = 认证源
-users.local = 本地
-users.auth_login_name = 认证登录名
-users.update_profile_success = 该用户信息更新成功!
-users.edit_account = 编辑用户信息
-users.is_activated = 该用户已被激活
-users.is_admin = 该用户具有管理员权限
-users.update_profile = 更新用户信息
-users.delete_account = 删除该用户
-users.still_own_repo = 该帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作!
-
-orgs.org_manage_panel = 组织管理面板
-orgs.name = 组织名称
-orgs.teams = 团队数
-orgs.members = 成员数
-
-repos.repo_manage_panel = 仓库管理界面
-repos.owner = 所有者
-repos.name = 仓库名称
-repos.private = 私有库
-repos.watches = 关注数
-repos.stars = 点赞数
-repos.issues = 工单数
-
-auths.auth_manage_panel = 授权认证管理面板
-auths.new = 添加新的认证源
-auths.name = 认证名称
-auths.type = 认证类型
-auths.enabled = 已启用
-auths.updated = 最后更新时间
-auths.auth_type = 授权类型
-auths.auth_name = 授权名称
-auths.domain = 域名
-auths.host = 主机地址
-auths.port = 主机端口
-auths.base_dn = Base DN
-auths.attributes = Search Attributes
-auths.filter = Search Filter
-auths.ms_ad_sa = Ms Ad SA
-auths.smtp_auth = SMTP 授权类型
-auths.smtphost = SMTP 主机地址
-auths.smtpport = SMTP 主机端口
-auths.enable_tls = 启用 TLS 加密
-auths.enable_auto_register = 允许授权用户自动注册
-auths.tips = 帮助提示
-auths.edit = 修改授权认证设置
-auths.activated = 该授权认证已经启用
-auths.update_success = 授权认证设置更新成功!
-auths.update = 更新授权认证信息
-auths.delete = 删除该授权认证
-auths.delete_auth_title = 授权认证删除操作
-auths.delete_auth_desc = 该授权认证将被删除,您确定要继续吗?
-
-config.server_config = 服务器配置
-config.app_name = 应用名称
-config.app_ver = 应用版本
-config.app_url = 应用 URL
-config.domain = 应用域名
-config.offline_mode = 离线模式
-config.disable_router_log = 关闭路由日志
-config.run_user = 运行用户
-config.run_mode = 运行模式
-config.repo_root_path = 仓库根目录
-config.static_file_root_path = 静态文件根目录
-config.log_file_root_path = 日志文件根目录
-config.script_type = 脚本类型
-config.reverse_auth_user = 反向代理认证
-config.db_config = 数据库配置
-config.db_type = 数据库类型
-config.db_host = 主机地址
-config.db_name = 数据库名称
-config.db_user = 连接用户
-config.db_ssl_mode = SSL 模式
-config.db_ssl_mode_helper = (仅限 "postgres" 使用)
-config.db_path = 数据库路径
-config.db_path_helper = (仅限 "sqlite3" 使用)
-config.service_config = 服务配置
-config.register_email_confirm = 注册邮件确认
-config.disable_register = 关闭注册功能
-config.require_sign_in_view = 强制登录浏览
-config.mail_notify = 邮件通知提醒
-config.enable_cache_avatar = 开启缓存头像
-config.active_code_lives = 激活用户链接有效期
-config.reset_password_code_lives = 重置密码链接有效期
-config.webhook_config = Web 钩子配置
-config.task_interval = 任务周期
-config.deliver_timeout = 推送超时
-config.mailer_config = 邮件配置
-config.mailer_enabled = 启用服务
-config.mailer_name = 发送者名称
-config.mailer_host = 邮件主机地址
-config.mailer_user = 发送者帐号
-config.oauth_config = 社交帐号配置
-config.oauth_enabled = 启用服务
-config.cache_config = Cache 配置
-config.cache_adapter = Cache 适配器
-config.cache_interval = Cache 周期
-config.cache_conn = Cache 连接字符串
-config.session_config = Session 配置
-config.session_provider = Session 提供者
-config.provider_config = 提供者配置
-config.cookie_name = Cookie 名称
-config.enable_set_cookie = 启用设置 Cookie
-config.gc_interval_time = GC 周期
-config.session_life_time = Session 生命周期
-config.https_only = 仅限 HTTPS
-config.cookie_life_time = Cookie 生命周期
-config.session_hash_function = Session ID 哈希函数
-config.session_hash_key = Session ID 哈希健值
-config.picture_config = 图片配置
-config.picture_service = 图片服务
-config.disable_gravatar = 禁用 Gravatar 头像
-config.log_config = 日志配置
-config.log_mode = 日志模式
-
-monitor.cron = Cron 任务
-monitor.name = 任务名称
-monitor.schedule = 任务安排
-monitor.next = 下次执行时间
-monitor.previous = 上次执行时间
-monitor.execute_times = 执行次数
-monitor.process = 运行中进程
-monitor.desc = 进程描述
-monitor.start = 开始时间
-monitor.execute_time = 已执行时间
-
-notices.system_notice_list = 系统提示管理
-notices.type = 提示类型
-notices.type_1 = 仓库
-notices.desc = 描述
-notices.op = 操作
-notices.delete_success = 系统提示删除成功!
-
-[action]
-create_repo = 创建了仓库 <a href="%s/%s">%s</a>
-commit_repo = 推送了 <a href="%s/%s/src/%s">%s</a> 分支的代码到 <a href="%s/%s">%s</a>
-create_issue = 创建了工单 <a href="%s/%s/issues/%s">%s#%s</a>
-comment_issue = 评论了工单 <a href="%s/%s/issues/%s">%s#%s</a>
-transfer_repo = 将仓库 <code>%s</code> 转移至 <a href="/%s%s">%s</a>
-push_tag = 推送了标签 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
-compare_2_commits = 查看 2 次提交的内容对比
-
-[tool]
-ago = 之前
-from_now = 之后
-now = 现在
-1s = 1 秒%s
-1m = 1 分钟%s
-1h = 1 小时%s
-1d = 1 天%s
-1w = 1 周%s
-1mon = 1 月%s
-1y = 1 年%s
-seconds = %d 秒%s
-minutes = %d 分钟%s
-hours = %d 小时%s
-days = %d 天%s
-weeks = %d 周%s
-months = %d 月%s
-years = %d 年%s
-raw_seconds = 秒
-raw_minutes = 分钟
-
-
-
-
-
-
-
-
-
-
-
-
+app_desc=基于 Go 语言的自助 Git 服务
+
+home=首页
+dashboard=控制面板
+explore=探索
+help=帮助
+sign_in=登录
+social_sign_in=社交帐号登录:第 2 步 <small>关联帐号</small>
+sign_out=退出
+sign_up=注册
+register=注册
+website=官方网站
+version=当前版本
+page=页面
+template=模板
+language=语言选项
+
+username=用户名
+email=邮箱
+password=密码
+re_type=确认密码
+captcha=验证码
+
+repository=仓库
+organization=组织
+mirror=镜像
+new_repo=创建新的仓库
+new_migrate=迁移外部仓库
+new_fork=创建新的派生仓库
+new_org=创建新的组织
+manage_org=管理我的组织
+admin_panel=管理面板
+account_settings=帐户设置
+settings=帐户设置
+
+news_feed=最新活动
+pull_requests=合并请求
+issues=工单管理
+
+cancel=取消
+
+[install]
+install=安装页面
+title=首次运行安装程序
+requite_db_desc=Gogs 允许后端数据库为 MySQL、PostgreSQL 或 SQLite3。
+db_type=数据库类型
+host=数据库主机
+user=数据库用户
+password=数据库用户密码
+db_name=数据库名称
+db_helper=如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci 字符集。
+ssl_mode=SSL 模式
+path=数据库文件路径
+sqlite_helper=SQLite3 数据库的文件路径。
+general_title=应用基本设置
+repo_path=仓库根目录
+repo_path_helper=所有 Git 远程仓库都将被存放于该目录。
+run_user=运行系统用户
+run_user_helper=该用户必须具有对仓库根目录和运行 Gogs 的操作权限。
+domain=域名
+domain_helper=该设置影响 SSH 克隆地址。
+app_url=应用 URL
+app_url_helper=该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。
+email_title=邮件服务设置(可选)
+smtp_host=SMTP 主机
+mailer_user=发送邮箱
+mailer_password=发送邮箱密码
+notify_title=通知提醒设置(可选)
+register_confirm=启用注册邮箱确认
+mail_notify=启用邮件通知提醒
+admin_title=管理员帐号设置
+admin_name=管理员用户名
+admin_password=管理员密码
+confirm_password=确认密码
+admin_email=管理员邮箱
+install_gogs=立即安装
+test_git_failed=无法识别 'git' 命令:%v
+sqlite3_not_available=您所使用的发行版不支持 SQLite3,请从 %s 下载官方构建版,而不是 gobuild 版本。
+invalid_db_setting=数据库设置不正确:%v
+invalid_repo_path=仓库根目录设置不正确:%v
+run_user_not_match=运行系统用户非当前用户:%s -> %s
+save_config_failed=应用配置保存失败:%v
+invalid_admin_setting=管理员帐户设置不正确:%v
+install_success=您好!我们很高兴您选择使用 Gogs,祝您使用愉快,代码从此无 BUG!
+
+[home]
+uname_holder=用户名或邮箱
+password_holder=密码
+switch_dashboard_context=切换控制面板用户
+my_repos=我的仓库
+collaborative_repos=参与协作的仓库
+my_orgs=我的组织
+my_mirrors=我的镜像
+
+[explore]
+repos=探索仓库
+
+[auth]
+create_new_account=创建帐户
+register_hepler_msg=已经注册?立即登录!
+social_register_hepler_msg=已经注册?立即绑定!
+disable_register_prompt=对不起,注册功能已被关闭。请联系网站管理员。
+disable_register_mail=对不起,注册邮箱确认功能已被关闭。
+remember_me=记住登录
+forgot_password=忘记密码
+forget_password=忘记密码?
+sign_up_now=还没帐户?马上注册。
+confirmation_mail_sent_prompt=一封新的确认邮件已经被发送至 <b>%s</b>,请检查您的收件箱并在 %d 小时内完成确认注册操作。
+sign_in_email=登录到您的邮箱
+active_your_account=激活您的帐户
+resent_limit_prompt=对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试!
+has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
+resend_mail=单击此处重新发送确认邮件
+email_not_associate=您输入的邮箱地址未被关联到任何帐号!
+send_reset_mail=单击此处(重新)发送您的密码重置邮件
+reset_password=重置密码
+invalid_code=对不起,您的确认代码已过期或已失效。
+reset_password_helper=单击此处重置密码
+password_too_short=密码长度不能少于 6 位!
+
+[form]
+UserName=用户名
+RepoName=仓库名称
+Email=邮箱地址
+Password=密码
+Retype=确认密码
+SSHTitle=SSH 密钥名称
+HttpsUrl=HTTPS URL 地址
+PayloadUrl=推送地址
+TeamName=团队名称
+AuthName=认证名称
+AdminEmail=管理员邮箱
+
+require_error=不能为空。
+alpha_dash_error=必须为英文字母、阿拉伯数字或横线(-_)。
+alpha_dash_dot_error=必须为英文字母、阿拉伯数字、横线(-_)或点。
+min_size_error=长度最小为 %s 个字符。
+max_size_error=长度最大为 %s 个字符。
+email_error=不是一个有效的邮箱地址。
+url_error=不是一个有效的 URL。
+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=邮箱地址已经被使用。
+ssh_key_been_used=SSH 密钥已经被使用。
+illegal_username=您的用户名包含非法字符。
+illegal_repo_name=仓库名称包含非法字符。
+illegal_org_name=组织名称包含非法字符。
+illegal_team_name=团队名称包含非法字符。
+username_password_incorrect=用户名或密码不正确。
+enterred_invalid_repo_name=请检查您输入的仓库名称是正确。
+enterred_invalid_owner_name=请检查您输入的新所有者用户名是否正确。
+enterred_invalid_password=请检查您输入的密码是否正确。
+user_not_exist=被操作的用户不存在!
+last_org_owner=被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作!
+
+invalid_ssh_key=很抱歉,我们无法验证您输入的 SSH 密钥:%s
+unable_verify_ssh_key=Gogs 无法验证您输入的 SSH 密钥,但我们假设那是有效的密钥,请您自行确保其有效性!
+auth_failed=授权验证失败:%v
+
+still_own_repo=您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作!
+still_has_org=您的帐户仍旧是某些组织的成员,您必须先离开或删除组织。
+org_still_own_repo=该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作!
+
+still_own_user=该授权认证依旧被部分用户使用,请先删除该部分用户后再试!
+
+target_branch_not_exist=目标分支不存在。
+
+[user]
+change_avatar=到 gravatar.com 上修改您的头像
+join_on=加入于
+repositories=仓库列表
+activity=公开活动
+followers=关注者
+starred=已点赞
+following=关注中
+
+[settings]
+profile=个人信息
+password=修改密码
+ssh_keys=管理 SSH 密钥
+social=社交帐号绑定
+applications=管理授权应用
+orgs=管理组织
+delete=删除帐户
+uid=用户 ID
+
+public_profile=公开信息
+profile_desc=您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。
+full_name=自定义名称
+website=个人网站
+location=所在地区
+update_profile=更新信息
+update_profile_success=您的个人信息更新成功!
+change_username=用户名将被修改
+change_username_desc=用户名被修改,您确定要继续操作吗?这将会影响到所有与您帐户有关的链接。
+continue=继续操作
+cancel=取消操作
+
+change_password=修改密码
+old_password=当前密码
+new_password=新的密码
+password_incorrect=当前密码不正确!
+change_password_success=密码修改成功!您现在可以使用新的密码登录。
+
+manage_ssh_keys=管理 SSH 密钥
+add_key=增加密钥
+ssh_desc=以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它!
+ssh_helper=<strong>需要帮助?</strong> 请查看有关 <a href="%s">如何生成 SSH 密钥</a> 或 <a href="%s">常见 SSH 问题</a> 寻找答案。
+add_new_key=增加 SSH 密钥
+key_name=密钥名称
+key_content=密钥内容
+add_key_success=新的 SSH 密钥添加成功!
+delete_key=删除
+add_on=增加于
+last_used=上次使用在
+no_activity=没有最近活动
+
+manage_social=管理关联社交帐户
+social_desc=以下是与您帐户所关联的社交帐号,如果您发现有陌生的关联,请立即解除绑定!
+unbind=解除绑定
+unbind_success=社交帐号解除绑定成功!
+
+manage_access_token=管理个人操作令牌
+generate_new_token=生成新的令牌
+tokens_desc=您可以使用这些已生成的令牌来操作 Gogs API。
+new_token_desc=目前为止,任何令牌都对您的帐户拥有完整的操作权限。
+token_name=令牌名称
+generate_token=生成令牌
+generate_token_succees=新的操作令牌生成成功!您必须立即复制到一个安全的地方,因为该令牌只会显示一次!
+delete_token=删除令牌
+delete_token_success=个人操作令牌删除成功!请更新与该令牌有关的所有应用。
+
+delete_account=删除当前帐户
+delete_prompt=删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>!
+confirm_delete_account=确认删除帐户
+delete_account_title=帐户删除操作
+delete_account_desc=该帐户将被永久性删除,您确定要继续操作吗?
+
+[repo]
+owner=拥有者
+repo_name=仓库名称
+repo_name_helper=伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。
+visibility=可见性
+visiblity_helper=本仓库将是 <span class="label label-red label-radius">私有的</span>
+fork_repo=派生仓库
+fork_from=派生自
+fork_visiblity_helper=派生仓库无法修改可见性
+repo_desc=仓库描述
+repo_lang=仓库语言
+repo_lang_helper=请选择 .gitignore 文件
+license=授权许可
+license_helper=请选择授权许可文件
+init_readme=使用 README.md 文件初始化仓库
+create_repo=创建仓库
+default_branch=默认分支
+mirror_interval=镜像同步周期(小时)
+goget_meta=Go-Get 支持
+goget_meta_helper=本仓库将可以通过 <span class="label label-blue label-radius">Go Get</span> 获取
+
+need_auth=需要授权验证
+migrate_type=迁移类型
+migrate_type_helper=本仓库将是 <span class="label label-blue label-radius">镜像</span>
+migrate_repo=迁移仓库
+
+copy_link=复制链接
+click_to_copy=复制到剪切板
+copied=复制成功
+clone_helper=不知道如何操作?访问 <a target="_blank" href="%s">此处</a> 查看帮助!
+unwatch=取消关注
+watch=关注
+unstar=取消点赞
+star=点赞
+fork=派生
+
+no_desc=暂无描述
+quick_guide=快速帮助
+clone_this_repo=克隆当前仓库
+create_new_repo_command=从命令行创建一个新的仓库
+push_exist_repo=从命令行推送已经创建的仓库
+
+branch=分支
+tree=目录树
+branch_and_tags=分支与标签
+branches=分支列表
+tags=标签列表
+issues=工单管理
+commits=提交历史
+releases=版本发布
+file_raw=原始文件
+file_history=文件历史
+file_view_raw=查看原始文件
+
+commits.commits=次代码提交
+commits.search=搜索提交历史
+commits.find=查找
+commits.author=作者
+commits.message=备注
+commits.date=提交日期
+commits.older=更旧的提交
+commits.newer=更新的提交
+
+settings=仓库设置
+settings.options=基本设置
+settings.collaboration=管理协作者
+settings.hooks=管理 Web 钩子
+settings.githooks=管理 Git 钩子
+settings.deploy_keys=管理部署密钥
+settings.basic_settings=基本设置
+settings.danger_zone=危险操作区
+settings.site=官方网站
+settings.update_settings=更新仓库设置
+settings.change_reponame=仓库名称将被修改
+settings.change_reponame_desc=仓库名称被修改,您确定要继续操作吗?这将会影响到所有与该仓库有关的链接。
+settings.transfer=转移仓库所有权
+settings.transfer_desc=您可以将仓库转移至您拥有管理员权限的帐户或组织。
+settings.new_owner_has_same_repo=新的仓库拥有者已经存在同名仓库!
+settings.delete=删除本仓库
+settings.delete_desc=删除仓库操作不可逆转,请三思而后行。
+settings.transfer_notices=<p>- 如果您转移给个人用户,您将对仓库失去所有权限。</p><p>- 如果您转移给您作为拥有者的组织,则可继续保持操作权限。</p>
+settings.update_settings_success=仓库设置更新成功!
+settings.transfer_owner=新拥有者
+settings.make_transfer=确认转移仓库
+settings.transfer_succeed=仓库所有权转移成功!
+settings.confirm_delete=确认删除仓库
+settings.add_collaborator=增加新的协作者
+settings.add_collaborator_success=成功添加新的协作者!
+settings.remove_collaborator_success=被操作的协作者已经被收回权限!
+settings.user_is_org_member=被操作的用户是组织成员,因此无法添加为协作者!
+settings.add_webhook=添加 Web 钩子
+settings.hooks_desc=Web 钩子允许您设定在 Gogs 上发生指定事件时对指定 URL 发送 POST 通知。查看 <a target="_blank" href="%s">Webhooks 文档</a> 获取更多信息。
+settings.githooks_desc=Git 钩子是由 Git 本身提供的功能,以下为 Gogs 所支持的钩子列表。
+settings.githook_edit_desc=如果钩子未启动,则会显示样例文件中的内容。如果想要删除某个钩子,则提交空白文本即可。
+settings.githook_name=钩子名称
+settings.githook_content=钩子文本
+settings.update_githook=更新钩子设置
+settings.remove_hook_success=Web 钩子删除成功!
+settings.add_webhook_desc=我们会通过 <code>POST</code> 请求将订阅事件信息发送至向指定 URL 地址。您可以设置不同的数据接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 请查阅 <a target="_blank" href="%s">Webhooks 文档</a> 获取更多信息。
+settings.payload_url=推送地址
+settings.content_type=数据格式
+settings.secret=密钥文本
+settings.event_desc=请设置您希望触发 Web 钩子的事件:
+settings.event_push_only=只推送 <code>push</code> 事件。
+settings.active=是否激活
+settings.active_helper=当指定事件发生时我们将会触发此 Web 钩子。
+settings.add_hook_success=Web 钩子添加成功!
+settings.update_webhook=更新 Web 钩子
+settings.update_hook_success=Web 钩子更新成功!
+settings.delete_webhook=删除 Web 钩子
+settings.recent_deliveries=最近推送记录
+settings.hook_type=钩子类型
+settings.add_slack_hook_desc=为您的仓库增加 <a href="%s">Slack</a> 集成。
+settings.slack_token=令牌
+settings.slack_domain=域名
+settings.slack_channel=频道
+
+diff.browse_source=浏览代码
+diff.parent=父节点
+diff.commit=当前提交
+diff.data_not_available=暂无可用数据
+diff.show_diff_stats=显示文件统计
+diff.stats_desc=共有 <strong> %d 个文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
+diff.bin=二进制
+diff.view_file=查看文件
+
+[org]
+org_name_holder=组织名称
+org_name_helper=伟大的组织都有一个简短而寓意深刻的名字。
+org_email_helper=组织的邮箱用于接收所有通知和确认邮件。
+create_org=创建组织
+repo_updated=最后更新于
+people=组织成员
+invite_someone=邀请他人加入
+teams=组织团队
+lower_members=名成员
+lower_repositories=个仓库
+create_new_team=创建新的团队
+org_desc=组织描述
+team_name=团队名称
+team_desc=团队描述
+team_name_helper=您可以使用该名称来通知改组全体成员。
+team_desc_helper=一句话描述这个团队是做什么的。
+team_permission_desc=请选择该团队所具有的权限等级:
+
+settings=组织设置
+settings.options=基本设置
+settings.full_name=组织全名
+settings.website=官方网站
+settings.location=所在地区
+settings.update_settings=更新组织设置
+settings.change_orgname=组织名称将被修改
+settings.change_orgname_desc=组织名称被修改,您确定要继续操作吗?这将会影响到所有与该组织有关的链接。
+settings.update_setting_success=组织设置更新成功!
+settings.delete=删除组织
+settings.delete_account=删除当前组织
+settings.delete_prompt=删除操作会永久清除该组织的信息,并且 <strong>不可恢复</strong>!
+settings.confirm_delete_account=确认删除组织
+settings.delete_org_title=组织删除操作
+settings.delete_org_desc=该组织将被永久性删除,您确定要继续操作吗?
+settings.hooks_desc=在此处添加的 Web 钩子将会应用到该组织下的 <strong>所有仓库</strong>。
+
+members.public=公开成员
+members.public_helper=设为私有
+members.private=私有成员
+members.private_helper=设为公开
+members.owner=管理员
+members.member=普通成员
+members.conceal=隐藏身份
+members.remove=移除成员
+members.leave=离开组织
+members.invite_desc=请输入被邀请到组织 %s 的用户名称:
+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.admin_access_helper=这个团队将拥有查看、克隆、推送和添加其他组织成员到团队的权限。
+teams.no_desc=该团队暂无描述
+teams.settings=团队设置
+teams.owners_permission_desc=管理员团队对 <strong>所有仓库</strong> 具有操作权限,且对组织具有 <strong>管理员权限</strong>。
+teams.members=团队成员
+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=该团队拥有对所属仓库的 <strong>读取</strong> 权限,团队成员可以进行查看和克隆等只读操作。
+teams.write_permission_desc=该团队拥有对所属仓库的 <strong>读取</strong> 和 <strong>写入</strong> 的权限。
+teams.admin_permission_desc=该团队拥有一定的 <strong>管理</strong> 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。
+teams.repositories=团队仓库
+teams.add_team_repository=添加团队仓库
+teams.remove_repo=移除仓库
+teams.add_nonexistent_repo=您尝试添加到团队的仓库不存在,请先创建仓库!
+
+[admin]
+dashboard=控制面板
+users=用户管理
+organizations=组织管理
+repositories=仓库管理
+authentication=授权认证管理
+config=应用配置管理
+notices=系统提示管理
+monitor=应用监控面板
+prev=上一页
+next=下一页
+
+dashboard.statistic=应用统计数据
+dashboard.operations=管理员操作
+dashboard.system_status=系统监视状态
+dashboard.statistic_info=Gogs 数据库统计:<b>%d</b> 位用户,<b>%d</b> 个组织,<b>%d</b> 个公钥,<b>%d</b> 个仓库,<b>%d</b> 个仓库关注,<b>%d</b> 个赞,<b>%d</b> 次行为,<b>%d</b> 条权限记录,<b>%d</b> 张工单,<b>%d</b> 次评论,<b>%d</b> 个社交帐号,<b>%d</b> 个用户关注,<b>%d</b> 个镜像,<b>%d</b> 个版本发布,<b>%d</b> 个登录源,<b>%d</b> 个 Web 钩子,<b>%d</b> 个里程碑,<b>%d</b> 个标签,<b>%d</b> 个钩子任务,<b>%d</b> 个团队,<b>%d</b> 个更新任务,<b>%d</b> 个附件。
+dashboard.operation_name=操作名称
+dashboard.operation_switch=开关
+dashboard.operation_run=执行
+dashboard.clean_unbind_oauth=清理未绑定社交帐号
+dashboard.delete_inactivate_accounts=删除所有未激活帐户
+dashboard.server_uptime=服务运行时间
+dashboard.current_goroutine=当前 Goroutines 数量
+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 内存空闲量
+dashboard.heap_memory_in_use=正在使用的 Heap 内存
+dashboard.heap_memory_released=被释放的 Heap 内存
+dashboard.heap_objects=Heap 对象数量
+dashboard.bootstrap_stack_usage=启动 Stack 使用量
+dashboard.stack_memory_obtained=被分配的 Stack 内存
+dashboard.mspan_structures_usage=MSpan 结构内存使用量
+dashboard.mspan_structures_obtained=被分配的 MSpan 结构内存
+dashboard.mcache_structures_usage=MCache 结构内存使用量
+dashboard.mcache_structures_obtained=被分配的 MCache 结构内存
+dashboard.profiling_bucket_hash_table_obtained=被分配的剖析哈希表内存
+dashboard.gc_metadata_obtained=被分配的 GC 元数据内存
+dashboard.other_system_allocation_obtained=其它被分配的系统内存
+dashboard.next_gc_recycle=下次 GC 内存回收量
+dashboard.last_gc_time=距离上次 GC 时间
+dashboard.total_gc_time=GC 执行时间总量
+dashboard.total_gc_pause=GC 暂停时间总量
+dashboard.last_gc_pause=上次 GC 暂停时间
+dashboard.gc_times=GC 执行次数
+
+users.user_manage_panel=用户管理面板
+users.new_account=创建新的帐户
+users.name=用户名
+users.activated=已激活
+users.admin=管理员
+users.repos=仓库数
+users.created=创建时间
+users.edit=编辑
+users.auth_source=认证源
+users.local=本地
+users.auth_login_name=认证登录名
+users.update_profile_success=该用户信息更新成功!
+users.edit_account=编辑用户信息
+users.is_activated=该用户已被激活
+users.is_admin=该用户具有管理员权限
+users.allow_git_hook=该帐户具有创建 Git 钩子的权限
+users.update_profile=更新用户信息
+users.delete_account=删除该用户
+users.still_own_repo=该帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作!
+users.still_has_org=该帐户仍旧是某些组织的成员,您必须先使其离开或删除组织。
+
+orgs.org_manage_panel=组织管理面板
+orgs.name=组织名称
+orgs.teams=团队数
+orgs.members=成员数
+
+repos.repo_manage_panel=仓库管理界面
+repos.owner=所有者
+repos.name=仓库名称
+repos.private=私有库
+repos.watches=关注数
+repos.stars=点赞数
+repos.issues=工单数
+
+auths.auth_manage_panel=授权认证管理面板
+auths.new=添加新的认证源
+auths.name=认证名称
+auths.type=认证类型
+auths.enabled=已启用
+auths.updated=最后更新时间
+auths.auth_type=授权类型
+auths.auth_name=授权名称
+auths.domain=域名
+auths.host=主机地址
+auths.port=主机端口
+auths.base_dn=Base DN
+auths.attributes=Search Attributes
+auths.filter=Search Filter
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=SMTP 授权类型
+auths.smtphost=SMTP 主机地址
+auths.smtpport=SMTP 主机端口
+auths.enable_tls=启用 TLS 加密
+auths.enable_auto_register=允许授权用户自动注册
+auths.tips=帮助提示
+auths.edit=修改授权认证设置
+auths.activated=该授权认证已经启用
+auths.update_success=授权认证设置更新成功!
+auths.update=更新授权认证信息
+auths.delete=删除该授权认证
+auths.delete_auth_title=授权认证删除操作
+auths.delete_auth_desc=该授权认证将被删除,您确定要继续吗?
+
+config.server_config=服务器配置
+config.app_name=应用名称
+config.app_ver=应用版本
+config.app_url=应用 URL
+config.domain=应用域名
+config.offline_mode=离线模式
+config.disable_router_log=关闭路由日志
+config.run_user=运行用户
+config.run_mode=运行模式
+config.repo_root_path=仓库根目录
+config.static_file_root_path=静态文件根目录
+config.log_file_root_path=日志文件根目录
+config.script_type=脚本类型
+config.reverse_auth_user=反向代理认证
+config.db_config=数据库配置
+config.db_type=数据库类型
+config.db_host=主机地址
+config.db_name=数据库名称
+config.db_user=连接用户
+config.db_ssl_mode=SSL 模式
+config.db_ssl_mode_helper=(仅限 "postgres" 使用)
+config.db_path=数据库路径
+config.db_path_helper=(仅限 "sqlite3" 使用)
+config.service_config=服务配置
+config.register_email_confirm=注册邮件确认
+config.disable_register=关闭注册功能
+config.require_sign_in_view=强制登录浏览
+config.mail_notify=邮件通知提醒
+config.enable_cache_avatar=开启缓存头像
+config.active_code_lives=激活用户链接有效期
+config.reset_password_code_lives=重置密码链接有效期
+config.webhook_config=Web 钩子配置
+config.task_interval=任务周期
+config.deliver_timeout=推送超时
+config.mailer_config=邮件配置
+config.mailer_enabled=启用服务
+config.mailer_name=发送者名称
+config.mailer_host=邮件主机地址
+config.mailer_user=发送者帐号
+config.oauth_config=社交帐号配置
+config.oauth_enabled=启用服务
+config.cache_config=Cache 配置
+config.cache_adapter=Cache 适配器
+config.cache_interval=Cache 周期
+config.cache_conn=Cache 连接字符串
+config.session_config=Session 配置
+config.session_provider=Session 提供者
+config.provider_config=提供者配置
+config.cookie_name=Cookie 名称
+config.enable_set_cookie=启用设置 Cookie
+config.gc_interval_time=GC 周期
+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.log_config=日志配置
+config.log_mode=日志模式
+
+monitor.cron=Cron 任务
+monitor.name=任务名称
+monitor.schedule=任务安排
+monitor.next=下次执行时间
+monitor.previous=上次执行时间
+monitor.execute_times=执行次数
+monitor.process=运行中进程
+monitor.desc=进程描述
+monitor.start=开始时间
+monitor.execute_time=已执行时间
+
+notices.system_notice_list=系统提示管理
+notices.type=提示类型
+notices.type_1=仓库
+notices.desc=描述
+notices.op=操作
+notices.delete_success=系统提示删除成功!
+
+[action]
+create_repo=创建了仓库 <a href="%s/%s">%s</a>
+commit_repo=推送了 <a href="%s/%s/src/%s">%s</a> 分支的代码到 <a href="%s/%s">%s</a>
+create_issue=创建了工单 <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=评论了工单 <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=将仓库 <code>%s</code> 转移至 <a href="/%s%s">%s</a>
+push_tag=推送了标签 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
+compare_2_commits=查看 2 次提交的内容对比
+
+[tool]
+ago=之前
+from_now=之后
+now=现在
+1s=1 秒%s
+1m=1 分钟%s
+1h=1 小时%s
+1d=1 天%s
+1w=1 周%s
+1mon=1 月%s
+1y=1 年%s
+seconds=%d 秒%s
+minutes=%d 分钟%s
+hours=%d 小时%s
+days=%d 天%s
+weeks=%d 周%s
+months=%d 月%s
+years=%d 年%s
+raw_seconds=秒
+raw_minutes=分钟
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/locale/locale_zh-HK.ini b/conf/locale/locale_zh-HK.ini
index d8b98168..25974e7d 100644..100755
--- a/conf/locale/locale_zh-HK.ini
+++ b/conf/locale/locale_zh-HK.ini
@@ -1,659 +1,679 @@
-app_desc = 基於 Go 語言的自助 Git 服務
-
-home = 首頁
-dashboard = 控制面版
-explore = 探索
-help = 幫助
-sign_in = 登錄
-social_sign_in = 社交帳號登錄:第 2 步 <small>關聯帳號</small>
-sign_out = 退出
-sign_up = 註冊
-register = 註冊
-website = 官方網站
-version = 當前版本
-page = 頁面
-template = 模版
-language = 語言選項
-
-username = 用戶名
-email = 郵箱
-password = 密碼
-re_type = 確認密碼
-captcha = 驗證碼
-
-repository = 倉庫
-organization = 組織
-mirror = 鏡像
-new_repo = 創建新的倉庫
-new_migrate = 遷移外部倉庫
-new_org = 創建新的組織
-manage_org = 管理我的組織
-admin_panel = 管理面版
-account_settings = 帳戶設置
-settings = 帳戶設置
-
-news_feed = 最新活動
-pull_requests = 合併請求
-issues = 問題管理
-
-cancel = 取消
-
-[install]
-install = 安裝頁面
-title = 首次執行安裝程序
-requite_db_desc = Gogs 允許後端數據庫為 MySQL、PostgreSQL 或 SQLite3,但是 SQLite3 一般只有官方二進制發行版才支持。
-db_type = 數據庫類型
-host = 數據庫主機
-user = 數據庫用戶
-password = 數據庫用戶密碼
-db_name = 數據庫名稱
-db_helper = 如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字符集。
-ssl_mode = SSL 模式
-path = 數據庫文件路徑
-sqlite_helper = SQLite3 數據庫的文件路徑。
-general_title = 應用基本設置
-repo_path = 倉庫根目錄
-repo_path_helper = 所有 Git 遠程倉庫都將被存放於該目錄。
-run_user = 執行系統用戶
-run_user_helper = 該用戶必須具有對倉庫根目錄和執行 Gogs 的操作權限。
-domain = 域名
-domain_helper = 該設置影響 SSH 復製地址。
-app_url = 應用 URL
-app_url_helper = 該設置影響 HTTP/HTTPS 復製地址和一些郵箱中的連結。
-email_title = 郵件服務設置(可選)
-smtp_host = SMTP 主機
-mailer_user = 發送郵箱
-mailer_password = 發送郵箱密碼
-notify_title = 通知提醒設置(可選)
-register_confirm = 啟用註冊郵箱確認
-mail_notify = 啟用郵件通知提醒
-admin_title = 管理員帳號設置
-admin_name = 管理員用戶名
-admin_password = 管理員密碼
-confirm_password = 確認密碼
-admin_email = 管理員郵箱
-install_gogs = 立即安裝
-test_git_failed = 無法識別 'git' 命令:%v
-sqlite3_not_available = 您所使用的發行版本不支持 SQLite3,請從 http://gogs.io/docs/installation/install_from_binary.html 下載官方二進制發行版本,而不是 gobuild 版本。
-invalid_db_setting = 數據庫設置不正確:%v
-invalid_repo_path = 倉庫根目錄設置不正確:%v
-run_user_not_match = 執行系統用戶非當前用戶:%s -> %s
-save_config_failed = 應用配置保存失敗:%v
-invalid_admin_setting = 管理員帳戶設置不正確:%v
-install_success = 您好!我們很高興您選擇使用 Gogs,祝您使用愉快,代碼從此無 BUG!
-
-[home]
-uname_holder = 用戶名或郵箱
-password_holder = 密碼
-switch_dashboard_context = 切換控制面版用戶
-my_repos = 我的倉庫
-collaborative_repos = 參與協作的倉庫
-my_orgs = 我的組織
-my_mirrors = 我的鏡像
-
-[explore]
-repos = 探索倉庫
-
-[auth]
-create_new_account = 創建帳戶
-register_hepler_msg = 已經註冊?立即登錄!
-social_register_hepler_msg = 已經註冊?立即綁定!
-disable_register_prompt = 對不起,註冊功能已被關閉。請聯系網站管理員。
-disable_register_mail = 對不起,註冊郵箱確認功能已被關閉。
-remember_me = 記住登錄
-forgot_password = 忘記密碼
-forget_password = 忘記密碼?
-sign_up_now = 還沒帳戶?馬上註冊。
-confirmation_mail_sent_prompt = 一封新的確認郵件已經被發送至 <b>%s</b>,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。
-sign_in_email = 登錄到您的郵箱
-active_your_account = 激活您的帳戶
-resent_limit_prompt = 對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試!
-has_unconfirmed_mail = %s 您好,系統檢測到您有一封發送至 <b>%s</b> 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
-resend_mail = 單擊此處重新發送確認郵件
-email_not_associate = 您輸入的郵箱地址未被關聯到任何帳號!
-send_reset_mail = 單擊此處(重新)發送您的密碼重置郵件
-reset_password = 重置密碼
-invalid_code = 對不起,您的確認代碼已過期或已失效。
-reset_password_helper = 單擊此處重置密碼
-password_too_short = 密碼長度不能少於 6 位!
-
-[form]
-UserName = 用戶名
-RepoName = 倉庫名稱
-Email = 郵箱地址
-Password = 密碼
-Retype = 確認密碼
-SSHTitle = SSH 密鑰名稱
-HttpsUrl = HTTPS URL 地址
-PayloadUrl = 推送地址
-TeamName = 團隊名稱
-AuthName = 認證名稱
-AdminEmail = 管理員郵箱
-
-require_error = 不能為空。
-alpha_dash_error = 必須為英文字母、阿拉伯數字或橫線(-_)。
-alpha_dash_dot_error = 必須為英文字母、阿拉伯數字、橫線(-_)或點。
-min_size_error = 長度最小為 %s 個字符。
-max_size_error = 長度最大為 %s 個字符。
-email_error = 不是一個有效的郵箱地址。
-url_error = 不是一個有效的 URL。
-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 = 郵箱地址已經被使用。
-ssh_key_been_used = SSH 密鑰已經被使用。
-illegal_username = 您的用戶名包含不合法字符。
-illegal_repo_name = 倉庫名稱包含不合法字符。
-illegal_org_name = 組織名稱包含不合法字符。
-illegal_team_name = 團隊名稱包含不合法字符。
-username_password_incorrect = 用戶名或密碼不正確。
-enterred_invalid_repo_name = 請檢查您輸入的倉庫名稱是正確。
-enterred_invalid_owner_name = 請檢查您輸入的新所有者用戶名是否正確。
-enterred_invalid_password = 請檢查您輸入的密碼是否正確。
-user_not_exist = 被操作的用戶不存在!
-last_org_owner = 被移除用戶為最後一位管理員。請添加一位新的管理員再進行移除成員操作!
-
-invalid_ssh_key = 很抱歉,我們無法驗證您輸入的 SSH 密鑰:%s
-unable_verify_ssh_key = Gogs 無法驗證您輸入的 SSH 密鑰,但我們假設那是有效的密鑰,請您自行確保其有效性!
-auth_failed = 授權驗證失敗:%v
-
-still_own_repo = 您的帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作!
-org_still_own_repo = 該組織仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織操作!
-
-still_own_user = 該授權認證依舊被部分用戶使用,請先刪除該部分用戶後再試!
-
-[user]
-change_avatar = 到 gravatar.com 上修改您的頭像
-join_on = 加入於
-repositories = 倉庫列表
-activity = 公開活動
-followers = 關註者
-starred = 已讚好
-following = 關註中
-
-[settings]
-profile = 個人信息
-password = 修改密碼
-ssh_keys = 管理 SSH 密鑰
-social = 社交帳號綁定
-orgs = 管理組織
-delete = 刪除帳戶
-uid = 用戶 ID
-
-public_profile = 公開信息
-profile_desc = 您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。
-full_name = 自定義名稱
-website = 個人網站
-location = 所在地區
-update_profile = 更新信息
-update_profile_success = 您的個人信息更新成功!
-change_username = 用戶名將被修改
-change_username_desc = 用戶名被修改,您確定要繼續操作嗎?這將會影響到所有與您帳戶有關的連結。
-continue = 繼續操作
-cancel = 取消操作
-
-change_password = 修改密碼
-old_password = 當前密碼
-new_password = 新的密碼
-password_incorrect = 當前密碼不正確!
-change_password_success = 密碼修改成功!您現在可以使用新的密碼登錄。
-
-manage_ssh_keys = 管理 SSH 密鑰
-add_key = 增加密鑰
-ssh_desc = 以下是與您帳戶所關聯的 SSH 密鑰,如果您發現有陌生的密鑰,請立即刪除它!
-ssh_helper = <strong>需要幫助?</strong> 請查看有關 <a href="https://help.github.com/articles/generating-ssh-keys">如何生成 SSH 密鑰</a> 或 <a href="https://help.github.com/ssh-issues/">常見 SSH 問題</a> 尋找答案。
-add_new_key = 增加 SSH 密鑰
-key_name = 密鑰名稱
-key_content = 密鑰內容
-add_key_success = 新的 SSH 密鑰添加成功!
-delete_key = 刪除
-add_on = 增加於
-last_used = 上次使用在
-no_activity = 沒有最近活動
-
-manage_social = 管理關聯社交帳戶
-social_desc = 以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定!
-unbind = 解除綁定
-unbind_success = 社交帳號解除綁定成功!
-
-delete_account = 刪除當前帳戶
-delete_prompt = 刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
-confirm_delete_account = 確認刪除帳戶
-delete_account_title = 帳戶刪除操作
-delete_account_desc = 該帳戶將被永久性刪除,您確定要繼續操作嗎?
-
-[repo]
-owner = 擁有者
-repo_name = 倉庫名稱
-repo_name_helper = 偉大的倉庫名稱一般都較短、令人深刻並且 <strong>獨一無二</strong> 的。
-visibility = 可見度
-visiblity_helper = 本倉庫將是 <span class="label label-red label-radius">私有的</span>
-repo_desc = 倉庫描述
-repo_lang = 倉庫語言
-repo_lang_helper = 請選擇 .gitignore 文件
-license = 授權許可
-license_helper = 請選擇授權許可文件
-init_readme = 使用 README.md 文件初始化倉庫
-create_repo = 創建倉庫
-default_branch = 默認分支
-mirror_interval = 鏡像同步周期(小時)
-goget_meta = Go-Get 支持
-goget_meta_helper = 本倉庫將可以通過 <span class="label label-blue label-radius">Go Get</span> 獲取
-
-need_auth = 需要授權驗證
-migrate_type = 遷移類型
-migrate_type_helper = 本倉庫將是 <span class="label label-blue label-radius">鏡像</span>
-migrate_repo = 遷移倉庫
-
-copy_link = 復製連結
-click_to_copy = 復製到剪切簿
-copied = 復製成功
-clone_helper = 不知道如何操作?訪問 <a target="_blank" href="http://git-scm.com/book/zh/Git-基礎-取得項目的-Git-倉庫">此處</a> 查看幫助!
-unwatch = 取消關註
-watch = 關註
-unstar = 取消讚好
-star = 讚好
-fork = 派生
-
-no_desc = 暫無描述
-quick_guide = 快速幫助
-clone_this_repo = 復製當前倉庫
-create_new_repo_command = 從命令行創建一個新的倉庫
-push_exist_repo = 從命令行推送已經創建的倉庫
-
-branch = 分支
-tree = 目錄樹
-branch_and_tags = 分支與標籤
-branches = 分支列表
-tags = 標籤列表
-issues = 問題管理
-commits = 提交歷史
-releases = 版本發佈
-file_raw = 原始文件
-file_history = 文件歷史
-file_view_raw = 查看原始文件
-
-commits.commits = 次代碼提交
-commits.search = 搜索提交歷史
-commits.find = 查找
-commits.author = 作者
-commits.message = 備註
-commits.date = 提交日期
-commits.older = 更舊的提交
-commits.newer = 更新的提交
-
-settings = 倉庫設置
-settings.options = 基本設置
-settings.collaboration = 管理協作者
-settings.hooks = 管理 Web 鉤子
-settings.githooks = 管理 Git 鉤子
-settings.deploy_keys = 管理部署密鑰
-settings.basic_settings = 基本設置
-settings.danger_zone = 危險操作區
-settings.site = 官方網站
-settings.update_settings = 更新倉庫設置
-settings.change_reponame = 倉庫名稱將被修改
-settings.change_reponame_desc = 倉庫名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該倉庫有關的連結。
-settings.transfer = 轉移倉庫所有權
-settings.transfer_desc = 您可以將倉庫轉移至您擁有管理員權限的帳戶或組織。
-settings.new_owner_has_same_repo = 新的倉庫擁有者已經存在同名倉庫!
-settings.delete = 刪除本倉庫
-settings.delete_desc = 刪除倉庫操作不可逆轉,請三思而後行。
-settings.transfer_notices = <p>- 如果您轉移給個人用戶,您將對倉庫失去所有權限。</p><p>- 如果您轉移給您作為擁有者的組織,則可繼續保持操作權限。</p>
-settings.update_settings_success = 倉庫設置更新成功!
-settings.transfer_owner = 新擁有者
-settings.make_transfer = 確認轉移倉庫
-settings.transfer_succeed = 倉庫所有權轉移成功!
-settings.confirm_delete = 確認刪除倉庫
-settings.add_collaborator = 增加新的協作者
-settings.add_collaborator_success = 成功添加新的協作者!
-settings.remove_collaborator_success = 被操作的協作者已經被收回權限!
-settings.user_is_org_member = 被操作的用戶是組織成員,因此無法添加為協作者!
-settings.add_webhook = 添加 Web 鉤子
-settings.hooks_desc = Web 鉤子允許您設定在 Gogs 上發生指定事件時對指定 URL 發送 POST 通知。查看 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文檔</a> 獲取更多信息。
-settings.remove_hook_success = Web 鉤子刪除成功!
-settings.add_webhook_desc = 我們會通過 <code>POST</code> 請求將訂閱事件信息發送至向指定 URL 地址。您可以設置不同的數據接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 請查閱 <a target="_blank" href="http://gogs.io/docs/features/webhook.html">Webhooks 文檔</a> 獲取更多信息。
-settings.githooks_desc = Git 鉤子是由 Git 本身提供的功能,以下為 Gogs 所支持的鉤子列表。
-settings.githook_edit_desc = 如果鉤子未啟動,則會顯示樣例文件中的內容。如果想要刪除某個鉤子,則提交空白文本即可。
-settings.githook_name = 鉤子名稱
-settings.githook_content = 鉤子文本
-settings.update_githook = 更新鉤子設置
-settings.payload_url = 推送地址
-settings.content_type = 數據格式
-settings.secret = 密鑰文本
-settings.event_desc = 請設置您希望觸發 Web 鉤子的事件:
-settings.event_push_only = 只推送 <code>push</code> 事件。
-settings.active = 是否激活
-settings.active_helper = 當指定事件發生時我們將會觸發此 Web 鉤子。
-settings.add_hook_success = Web 鉤子添加成功!
-settings.update_webhook = 更新 Web 鉤子
-settings.update_hook_success = Web 鉤子更新成功!
-settings.delete_webhook = 刪除 Web 鉤子
-settings.recent_deliveries = 最近推送記錄
-settings.hook_type = 鉤子類型
-settings.add_slack_hook_desc = 為您的倉庫增加 <a href="http://slack.com">Slack</a> 集成
-settings.slack_token = 令牌
-settings.slack_domain = 域名
-settings.slack_channel = 頻道
-
-diff.browse_source = 瀏覽代碼
-diff.parent = 父節點
-diff.commit = 當前提交
-diff.data_not_available = 暫無可用數據
-diff.show_diff_stats = 顯示文件統計
-diff.stats_desc = 共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
-diff.bin = 二進制
-diff.view_file = 查看文件
-
-[org]
-org_name_holder = 組織名稱
-org_name_helper = 偉大的組織都有一個簡短而寓意深刻的名字。
-org_email_helper = 組織的郵箱用於接收所有通知和確認郵件。
-create_org = 創建組織
-repo_updated = 最後更新於
-people = 組織成員
-invite_someone = 邀請他人加入
-teams = 組織團隊
-lower_members = 名成員
-lower_repositories = 個倉庫
-create_new_team = 創建新的團隊
-org_desc = 組織描述
-team_name = 團隊名稱
-team_desc = 團隊描述
-team_name_helper = 您可以使用該名稱來通知改組全體成員。
-team_desc_helper = 一句話描述這個團隊是做什麼的。
-team_permission_desc = 請選擇該團隊所具有的權限等級:
-
-settings = 組織設置
-settings.options = 基本設置
-settings.full_name = 組織全名
-settings.website = 官方網站
-settings.location = 所在地區
-settings.update_settings = 更新組織設置
-settings.change_orgname = 組織名稱將被修改
-settings.change_orgname_desc = 組織名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該組織有關的連結。
-settings.update_setting_success = 組織設置更新成功!
-settings.delete = 刪除組織
-settings.delete_account = 刪除當前組織
-settings.delete_prompt = 刪除操作會永久清除該組織的信息,並且 <strong>不可恢復</strong>!
-settings.confirm_delete_account = 確認刪除組織
-settings.delete_org_title = 組織刪除操作
-settings.delete_org_desc = 該組織將被永久性刪除,您確定要繼續操作嗎?
-settings.hooks_desc = 在此處添加的 Web 鉤子將會應用到該組織下的 <strong>所有倉庫</strong>。
-
-members.public = 公開成員
-members.public_helper = 設為私有
-members.private = 私有成員
-members.private_helper = 設為公開
-members.owner = 管理員
-members.member = 普通成員
-members.conceal = 隱藏身份
-members.remove = 移除成員
-members.leave = 離開組織
-members.invite_desc = 請輸入被邀請到組織 %s 的用戶名稱:
-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.admin_access_helper = 這個團隊將擁有查看、復製、推送和添加其他組織成員到團隊的權限。
-teams.no_desc = 該團隊暫無描述
-teams.settings = 團隊設置
-teams.owners_permission_desc = 管理員團隊對 <strong>所有倉庫</strong> 具有操作權限,且對組織具有 <strong>管理員權限</strong>。
-teams.members = 團隊成員
-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 = 該團隊擁有對所屬倉庫的 <strong>讀取</strong> 權限,團隊成員可以進行查看和復製等只讀操作。
-teams.write_permission_desc = 該團隊擁有對所屬倉庫的 <strong>讀取</strong> 和 <strong>寫入</strong> 的權限。
-teams.admin_permission_desc = 該團隊擁有一定的 <strong>管理</strong> 權限,團隊成員可以讀取、復製、推送以及添加其它倉庫協作者。
-teams.repositories = 團隊倉庫
-teams.add_team_repository = 添加團隊倉庫
-teams.remove_repo = 移除倉庫
-teams.add_nonexistent_repo = 您嘗試添加到團隊的倉庫不存在,請先創建倉庫!
-
-[admin]
-dashboard = 控制面版
-users = 用戶管理
-organizations = 組織管理
-repositories = 倉庫管理
-authentication = 授權認證管理
-config = 應用配置管理
-notices = 系統提示管理
-monitor = 應用監控面版
-prev = 上一頁
-next = 下一頁
-
-dashboard.statistic = 應用統計數據
-dashboard.operations = 管理員操作
-dashboard.system_status = 系統監視狀態
-dashboard.statistic_info = Gogs 數據庫統計:<b>%d</b> 位用戶,<b>%d</b> 個組織,<b>%d</b> 個公鑰,<b>%d</b> 個倉庫,<b>%d</b> 個倉庫關註,<b>%d</b> 個贊,<b>%d</b> 次行為,<b>%d</b> 條權限記錄,<b>%d</b> 個問題,<b>%d</b> 次評論,<b>%d</b> 個社交帳號,<b>%d</b> 個用戶關註,<b>%d</b> 個鏡像,<b>%d</b> 個版本發佈,<b>%d</b> 個登錄源,<b>%d</b> 個 Web 鉤子,<b>%d</b> 個里程碑,<b>%d</b> 個標籤,<b>%d</b> 個鉤子任務,<b>%d</b> 個團隊,<b>%d</b> 個更新任務,<b>%d</b> 個附件。
-dashboard.operation_name = 操作名稱
-dashboard.operation_switch = 開關
-dashboard.operation_run = 執行
-dashboard.clean_unbind_oauth = 清理未綁定社交帳號
-dashboard.delete_inactivate_accounts = 刪除所有未激活帳戶
-dashboard.server_uptime = 服務執行時間
-dashboard.current_goroutine = 當前 Goroutines 數量
-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 內存空閒量
-dashboard.heap_memory_in_use = 正在使用的 Heap 內存
-dashboard.heap_memory_released = 被釋放的 Heap 內存
-dashboard.heap_objects = Heap 對象數量
-dashboard.bootstrap_stack_usage = 啟動 Stack 使用量
-dashboard.stack_memory_obtained = 被分配的 Stack 內存
-dashboard.mspan_structures_usage = MSpan 結構內存使用量
-dashboard.mspan_structures_obtained = 被分配的 MSpan 結構內存
-dashboard.mcache_structures_usage = MCache 結構內存使用量
-dashboard.mcache_structures_obtained = 被分配的 MCache 結構內存
-dashboard.profiling_bucket_hash_table_obtained = 被分配的剖析哈希表內存
-dashboard.gc_metadata_obtained = 被分配的垃圾收集元數據內存
-dashboard.other_system_allocation_obtained = 其它被分配的系統內存
-dashboard.next_gc_recycle = 下次垃圾收集內存回收量
-dashboard.last_gc_time = 距離上次垃圾收集時間
-dashboard.total_gc_time = 垃圾收集執行時間總量
-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.edit = 編輯
-users.auth_source = 認證源
-users.local = 本地
-users.auth_login_name = 認證登錄名
-users.update_profile_success = 該用戶信息更新成功!
-users.edit_account = 編輯用戶信息
-users.is_activated = 該用戶已被激活
-users.is_admin = 該用戶具有管理員權限
-users.update_profile = 更新用戶信息
-users.delete_account = 刪除該用戶
-users.still_own_repo = 該帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作!
-
-orgs.org_manage_panel = 組織管理面版
-orgs.name = 組織名稱
-orgs.teams = 團隊數
-orgs.members = 成員數
-
-repos.repo_manage_panel = 倉庫管理界面
-repos.owner = 所有者
-repos.name = 倉庫名稱
-repos.private = 私有庫
-repos.watches = 關註數
-repos.stars = 讚好數
-repos.issues = 問題數
-
-auths.auth_manage_panel = 授權認證管理面版
-auths.new = 添加新的認證源
-auths.name = 認證名稱
-auths.type = 認證類型
-auths.enabled = 已啟用
-auths.updated = 最後更新時間
-auths.auth_type = 授權類型
-auths.auth_name = 授權名稱
-auths.domain = 域名
-auths.host = 主機地址
-auths.port = 主機端口
-auths.base_dn = Base DN
-auths.attributes = 搜尋屬性
-auths.filter = 搜尋過濾
-auths.ms_ad_sa = Ms Ad SA
-auths.smtp_auth = SMTP 授權類型
-auths.smtphost = SMTP 主機地址
-auths.smtpport = SMTP 主機端口
-auths.enable_tls = 啟用 TLS 加密
-auths.enable_auto_register = 允許授權用戶自動註冊
-auths.tips = 幫助提示
-auths.edit = 修改授權認證設置
-auths.activated = 該授權認證已經啟用
-auths.update_success = 授權認證設置更新成功!
-auths.update = 更新授權認證信息
-auths.delete = 刪除該授權認證
-auths.delete_auth_title = 授權認證刪除操作
-auths.delete_auth_desc = 該授權認證將被刪除,您確定要繼續嗎?
-
-config.server_config = 服務器配置
-config.app_name = 應用名稱
-config.app_ver = 應用版本
-config.app_url = 應用 URL
-config.domain = 應用域名
-config.offline_mode = 離線模式
-config.disable_router_log = 關閉路由日志
-config.run_user = 執行用戶
-config.run_mode = 執行模式
-config.repo_root_path = 倉庫根目錄
-config.static_file_root_path = 靜態文件根目錄
-config.log_file_root_path = 日志文件根目錄
-config.script_type = 腳本類型
-config.reverse_auth_user = 反向代理認證
-config.db_config = 數據庫配置
-config.db_type = 數據庫類型
-config.db_host = 主機地址
-config.db_name = 數據庫名稱
-config.db_user = 數據庫用戶
-config.db_ssl_mode = SSL 模式
-config.db_ssl_mode_helper = (僅限 "postgres" 使用)
-config.db_path = 數據庫路徑
-config.db_path_helper = (僅限 "sqlite3" 使用)
-config.service_config = 服務配置
-config.register_email_confirm = 註冊郵件確認
-config.disable_register = 關閉註冊功能
-config.require_sign_in_view = 強制登錄瀏覽
-config.mail_notify = 郵件通知提醒
-config.enable_cache_avatar = 開啟緩存頭像
-config.active_code_lives = 激活用戶連結有效期
-config.reset_password_code_lives = 重置密碼連結有效期
-config.webhook_config = Web 鉤子配置
-config.task_interval = 任務周期
-config.deliver_timeout = 推送超時
-config.mailer_config = 郵件配置
-config.mailer_enabled = 啟用服務
-config.mailer_name = 發送者名稱
-config.mailer_host = 郵件主機地址
-config.mailer_user = 發送者帳號
-config.oauth_config = 社交帳號配置
-config.oauth_enabled = 啟用服務
-config.cache_config = Cache 配置
-config.cache_adapter = Cache 適配器
-config.cache_interval = Cache 周期
-config.cache_conn = Cache 連接字符串
-config.session_config = Session 配置
-config.session_provider = Session 提供者
-config.provider_config = 提供者配置
-config.cookie_name = Cookie 名稱
-config.enable_set_cookie = 啟用設置 Cookie
-config.gc_interval_time = 垃圾收集周期
-config.session_life_time = Session 生命周期
-config.https_only = 僅限 HTTPS
-config.cookie_life_time = Cookie 生命周期
-config.session_hash_function = Session ID 哈希函數
-config.session_hash_key = Session ID 哈希健值
-config.picture_config = 圖片配置
-config.picture_service = 圖片服務
-config.disable_gravatar = 禁用 Gravatar 頭像
-config.log_config = 日誌配置
-config.log_mode = 日誌模式
-
-monitor.cron = Cron 任務
-monitor.name = 任務名稱
-monitor.schedule = 任務安排
-monitor.next = 下次執行時間
-monitor.previous = 上次執行時間
-monitor.execute_times = 執行次數
-monitor.process = 執行中進程
-monitor.desc = 進程描述
-monitor.start = 開始時間
-monitor.execute_time = 已執行時間
-
-notices.system_notice_list = 系統提示管理
-notices.type = 提示類型
-notices.type_1 = 倉庫
-notices.desc = 描述
-notices.op = 操作
-notices.delete_success = 系統提示刪除成功!
-
-[action]
-create_repo = 創建了倉庫 <a href="%s/%s">%s</a>
-commit_repo = 推送了 <a href="%s/%s/src/%s">%s</a> 分支的代碼到 <a href="%s/%s">%s</a>
-create_issue = 創建了問題 <a href="%s/%s/issues/%s">%s#%s</a>
-comment_issue = 評論了問題 <a href="%s/%s/issues/%s">%s#%s</a>
-transfer_repo = 將倉庫 <code>%s</code> 轉移至 <a href="/%s%s">%s</a>
-push_tag = 推送了標籤 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
-compare_2_commits = 查看 2 次提交的內容對比
-
-[tool]
-ago = 之前
-from_now = 之後
-now = 現在
-1s = 1 秒%s
-1m = 1 分鐘%s
-1h = 1 小時%s
-1d = 1 天%s
-1w = 1 周%s
-1mon = 1 月%s
-1y = 1 年%s
-seconds = %d 秒%s
-minutes = %d 分鐘%s
-hours = %d 小時%s
-days = %d 天%s
-weeks = %d 周%s
-months = %d 月%s
-years = %d 年%s
-raw_seconds = 秒
-raw_minutes = 分鐘
-
-
-
-
-
-
-
-
-
-
-
-
+app_desc=基於 Go 語言的自助 Git 服務
+
+home=首頁
+dashboard=控制面版
+explore=探索
+help=幫助
+sign_in=登錄
+social_sign_in=社交帳號登錄:第 2 步 <small>關聯帳號</small>
+sign_out=退出
+sign_up=註冊
+register=註冊
+website=官方網站
+version=當前版本
+page=頁面
+template=模版
+language=語言選項
+
+username=用戶名
+email=郵箱
+password=密碼
+re_type=確認密碼
+captcha=驗證碼
+
+repository=倉庫
+organization=組織
+mirror=鏡像
+new_repo=創建新的倉庫
+new_migrate=遷移外部倉庫
+new_fork=新的派生倉庫
+new_org=創建新的組織
+manage_org=管理我的組織
+admin_panel=管理面版
+account_settings=帳戶設置
+settings=帳戶設置
+
+news_feed=最新活動
+pull_requests=合併請求
+issues=問題管理
+
+cancel=取消
+
+[install]
+install=安裝頁面
+title=首次執行安裝程序
+requite_db_desc=Gogs 允許後端數據庫為 MySQL、PostgreSQL 或 SQLite3,但是 SQLite3 一般只有官方二進制發行版才支持。
+db_type=數據庫類型
+host=數據庫主機
+user=數據庫用戶
+password=數據庫用戶密碼
+db_name=數據庫名稱
+db_helper=如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字符集。
+ssl_mode=SSL 模式
+path=數據庫文件路徑
+sqlite_helper=SQLite3 數據庫的文件路徑。
+general_title=應用基本設置
+repo_path=倉庫根目錄
+repo_path_helper=所有 Git 遠程倉庫都將被存放於該目錄。
+run_user=執行系統用戶
+run_user_helper=該用戶必須具有對倉庫根目錄和執行 Gogs 的操作權限。
+domain=域名
+domain_helper=該設置影響 SSH 復製地址。
+app_url=應用 URL
+app_url_helper=該設置影響 HTTP/HTTPS 復製地址和一些郵箱中的連結。
+email_title=郵件服務設置(可選)
+smtp_host=SMTP 主機
+mailer_user=發送郵箱
+mailer_password=發送郵箱密碼
+notify_title=通知提醒設置(可選)
+register_confirm=啟用註冊郵箱確認
+mail_notify=啟用郵件通知提醒
+admin_title=管理員帳號設置
+admin_name=管理員用戶名
+admin_password=管理員密碼
+confirm_password=確認密碼
+admin_email=管理員郵箱
+install_gogs=立即安裝
+test_git_failed=無法識別 'git' 命令:%v
+sqlite3_not_available=您所使用的發行版本不支持 SQLite3,請從 %s 下載官方構建版,而不是 gobuild 版本。
+invalid_db_setting=數據庫設置不正確:%v
+invalid_repo_path=倉庫根目錄設置不正確:%v
+run_user_not_match=執行系統用戶非當前用戶:%s -> %s
+save_config_failed=應用配置保存失敗:%v
+invalid_admin_setting=管理員帳戶設置不正確:%v
+install_success=您好!我們很高興您選擇使用 Gogs,祝您使用愉快,代碼從此無 BUG!
+
+[home]
+uname_holder=用戶名或郵箱
+password_holder=密碼
+switch_dashboard_context=切換控制面版用戶
+my_repos=我的倉庫
+collaborative_repos=參與協作的倉庫
+my_orgs=我的組織
+my_mirrors=我的鏡像
+
+[explore]
+repos=探索倉庫
+
+[auth]
+create_new_account=創建帳戶
+register_hepler_msg=已經註冊?立即登錄!
+social_register_hepler_msg=已經註冊?立即綁定!
+disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。
+disable_register_mail=對不起,註冊郵箱確認功能已被關閉。
+remember_me=記住登錄
+forgot_password=忘記密碼
+forget_password=忘記密碼?
+sign_up_now=還沒帳戶?馬上註冊。
+confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 <b>%s</b>,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。
+sign_in_email=登錄到您的郵箱
+active_your_account=激活您的帳戶
+resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試!
+has_unconfirmed_mail=%s 您好,系統檢測到您有一封發送至 <b>%s</b> 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
+resend_mail=單擊此處重新發送確認郵件
+email_not_associate=您輸入的郵箱地址未被關聯到任何帳號!
+send_reset_mail=單擊此處(重新)發送您的密碼重置郵件
+reset_password=重置密碼
+invalid_code=對不起,您的確認代碼已過期或已失效。
+reset_password_helper=單擊此處重置密碼
+password_too_short=密碼長度不能少於 6 位!
+
+[form]
+UserName=用戶名
+RepoName=倉庫名稱
+Email=郵箱地址
+Password=密碼
+Retype=確認密碼
+SSHTitle=SSH 密鑰名稱
+HttpsUrl=HTTPS URL 地址
+PayloadUrl=推送地址
+TeamName=團隊名稱
+AuthName=認證名稱
+AdminEmail=管理員郵箱
+
+require_error=不能為空。
+alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。
+alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。
+min_size_error=長度最小為 %s 個字符。
+max_size_error=長度最大為 %s 個字符。
+email_error=不是一個有效的郵箱地址。
+url_error=不是一個有效的 URL。
+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=郵箱地址已經被使用。
+ssh_key_been_used=SSH 密鑰已經被使用。
+illegal_username=您的用戶名包含不合法字符。
+illegal_repo_name=倉庫名稱包含不合法字符。
+illegal_org_name=組織名稱包含不合法字符。
+illegal_team_name=團隊名稱包含不合法字符。
+username_password_incorrect=用戶名或密碼不正確。
+enterred_invalid_repo_name=請檢查您輸入的倉庫名稱是正確。
+enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。
+enterred_invalid_password=請檢查您輸入的密碼是否正確。
+user_not_exist=被操作的用戶不存在!
+last_org_owner=被移除用戶為最後一位管理員。請添加一位新的管理員再進行移除成員操作!
+
+invalid_ssh_key=很抱歉,我們無法驗證您輸入的 SSH 密鑰:%s
+unable_verify_ssh_key=Gogs 無法驗證您輸入的 SSH 密鑰,但我們假設那是有效的密鑰,請您自行確保其有效性!
+auth_failed=授權驗證失敗:%v
+
+still_own_repo=您的帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作!
+still_has_org=您的帳戶仍舊是某些組織的成員,您必須先離開或刪除組織。
+org_still_own_repo=該組織仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織操作!
+
+still_own_user=該授權認證依舊被部分用戶使用,請先刪除該部分用戶後再試!
+
+target_branch_not_exist=目標分支不存在
+
+[user]
+change_avatar=到 gravatar.com 上修改您的頭像
+join_on=加入於
+repositories=倉庫列表
+activity=公開活動
+followers=關註者
+starred=已讚好
+following=關註中
+
+[settings]
+profile=個人信息
+password=修改密碼
+ssh_keys=管理 SSH 密鑰
+social=社交帳號綁定
+applications=管理授權應用
+orgs=管理組織
+delete=刪除帳戶
+uid=用戶 ID
+
+public_profile=公開信息
+profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。
+full_name=自定義名稱
+website=個人網站
+location=所在地區
+update_profile=更新信息
+update_profile_success=您的個人信息更新成功!
+change_username=用戶名將被修改
+change_username_desc=用戶名被修改,您確定要繼續操作嗎?這將會影響到所有與您帳戶有關的連結。
+continue=繼續操作
+cancel=取消操作
+
+change_password=修改密碼
+old_password=當前密碼
+new_password=新的密碼
+password_incorrect=當前密碼不正確!
+change_password_success=密碼修改成功!您現在可以使用新的密碼登錄。
+
+manage_ssh_keys=管理 SSH 密鑰
+add_key=增加密鑰
+ssh_desc=以下是與您帳戶所關聯的 SSH 密鑰,如果您發現有陌生的密鑰,請立即刪除它!
+ssh_helper=<strong>需要幫助嗎?</strong> 請查看有關 <a href="%s"> 如何生成 SSH 密鑰</a> 的指南或 <a href="%s"> SSH 的常見問題</a> 的疑難排解。
+add_new_key=增加 SSH 密鑰
+key_name=密鑰名稱
+key_content=密鑰內容
+add_key_success=新的 SSH 密鑰添加成功!
+delete_key=刪除
+add_on=增加於
+last_used=上次使用在
+no_activity=沒有最近活動
+
+manage_social=管理關聯社交帳戶
+social_desc=以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定!
+unbind=解除綁定
+unbind_success=社交帳號解除綁定成功!
+
+manage_access_token=管理個人操作令牌
+generate_new_token=生成新的令牌
+tokens_desc=您可以使用這些已生成的令牌來操作 Gogs API。
+new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。
+token_name=令牌名稱
+generate_token=生成令牌
+generate_token_succees=新的操作令牌生成成功!您必須立即復製到一個安全的地方,因為該令牌只會顯示一次!
+delete_token=删除令牌
+delete_token_success=個人操作令牌刪除成功!請更新與該令牌有關的所有應用。
+
+delete_account=刪除當前帳戶
+delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
+confirm_delete_account=確認刪除帳戶
+delete_account_title=帳戶刪除操作
+delete_account_desc=該帳戶將被永久性刪除,您確定要繼續操作嗎?
+
+[repo]
+owner=擁有者
+repo_name=倉庫名稱
+repo_name_helper=偉大的倉庫名稱一般都較短、令人深刻並且 <strong>獨一無二</strong> 的。
+visibility=可見度
+visiblity_helper=本倉庫將是 <span class="label label-red label-radius">私有的</span>
+fork_repo=派生倉庫
+fork_from=派生自
+fork_visiblity_helper=派生倉庫無法修改可見性。
+repo_desc=倉庫描述
+repo_lang=倉庫語言
+repo_lang_helper=請選擇 .gitignore 文件
+license=授權許可
+license_helper=請選擇授權許可文件
+init_readme=使用 README.md 文件初始化倉庫
+create_repo=創建倉庫
+default_branch=默認分支
+mirror_interval=鏡像同步周期(小時)
+goget_meta=Go-Get 支持
+goget_meta_helper=本倉庫將可以通過 <span class="label label-blue label-radius">Go Get</span> 獲取
+
+need_auth=需要授權驗證
+migrate_type=遷移類型
+migrate_type_helper=本倉庫將是 <span class="label label-blue label-radius">鏡像</span>
+migrate_repo=遷移倉庫
+
+copy_link=復製連結
+click_to_copy=復製到剪切簿
+copied=復製成功
+clone_helper=不知道如何操作?訪問 <a target="_blank"href="%s"> 帮助説明</a> !
+unwatch=取消關註
+watch=關註
+unstar=取消讚好
+star=讚好
+fork=派生
+
+no_desc=暫無描述
+quick_guide=快速幫助
+clone_this_repo=復製當前倉庫
+create_new_repo_command=從命令行創建一個新的倉庫
+push_exist_repo=從命令行推送已經創建的倉庫
+
+branch=分支
+tree=目錄樹
+branch_and_tags=分支與標籤
+branches=分支列表
+tags=標籤列表
+issues=問題管理
+commits=提交歷史
+releases=版本發佈
+file_raw=原始文件
+file_history=文件歷史
+file_view_raw=查看原始文件
+
+commits.commits=次代碼提交
+commits.search=搜索提交歷史
+commits.find=查找
+commits.author=作者
+commits.message=備註
+commits.date=提交日期
+commits.older=更舊的提交
+commits.newer=更新的提交
+
+settings=倉庫設置
+settings.options=基本設置
+settings.collaboration=管理協作者
+settings.hooks=管理 Web 鉤子
+settings.githooks=管理 Git 鉤子
+settings.deploy_keys=管理部署密鑰
+settings.basic_settings=基本設置
+settings.danger_zone=危險操作區
+settings.site=官方網站
+settings.update_settings=更新倉庫設置
+settings.change_reponame=倉庫名稱將被修改
+settings.change_reponame_desc=倉庫名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該倉庫有關的連結。
+settings.transfer=轉移倉庫所有權
+settings.transfer_desc=您可以將倉庫轉移至您擁有管理員權限的帳戶或組織。
+settings.new_owner_has_same_repo=新的倉庫擁有者已經存在同名倉庫!
+settings.delete=刪除本倉庫
+settings.delete_desc=刪除倉庫操作不可逆轉,請三思而後行。
+settings.transfer_notices=<p>- 如果您轉移給個人用戶,您將對倉庫失去所有權限。</p><p>- 如果您轉移給您作為擁有者的組織,則可繼續保持操作權限。</p>
+settings.update_settings_success=倉庫設置更新成功!
+settings.transfer_owner=新擁有者
+settings.make_transfer=確認轉移倉庫
+settings.transfer_succeed=倉庫所有權轉移成功!
+settings.confirm_delete=確認刪除倉庫
+settings.add_collaborator=增加新的協作者
+settings.add_collaborator_success=成功添加新的協作者!
+settings.remove_collaborator_success=被操作的協作者已經被收回權限!
+settings.user_is_org_member=被操作的用戶是組織成員,因此無法添加為協作者!
+settings.add_webhook=添加 Web 鉤子
+settings.hooks_desc=Web 鉤子允許您設定在 Gogs 上發生指定事件時對指定 URL 發送 POST 通知。查看 <a target="_blank" href="%s">Webhooks 文檔</a> 獲取更多信息。
+settings.githooks_desc=Git 鉤子是由 Git 本身提供的功能,以下為 Gogs 所支持的鉤子列表。
+settings.githook_edit_desc=如果鉤子未啟動,則會顯示樣例文件中的內容。如果想要刪除某個鉤子,則提交空白文本即可。
+settings.githook_name=鉤子名稱
+settings.githook_content=鉤子文本
+settings.update_githook=更新鉤子設置
+settings.remove_hook_success=Web 鉤子刪除成功!
+settings.add_webhook_desc=我們會通過 <code>POST</code> 請求將訂閱事件信息發送至向指定 URL 地址。您可以設置不同的數據接收方式(JSON 或 <code>x-www-form-urlencoded</code>)。 請查閱 <a target="_blank" href="%s">Webhooks 指南</a>.
+settings.payload_url=推送地址
+settings.content_type=數據格式
+settings.secret=密鑰文本
+settings.event_desc=請設置您希望觸發 Web 鉤子的事件:
+settings.event_push_only=只推送 <code>push</code> 事件。
+settings.active=是否激活
+settings.active_helper=當指定事件發生時我們將會觸發此 Web 鉤子。
+settings.add_hook_success=Web 鉤子添加成功!
+settings.update_webhook=更新 Web 鉤子
+settings.update_hook_success=Web 鉤子更新成功!
+settings.delete_webhook=刪除 Web 鉤子
+settings.recent_deliveries=最近推送記錄
+settings.hook_type=鉤子類型
+settings.add_slack_hook_desc=為您的倉庫增加 <a href="%s">Slack</a> 集成。
+settings.slack_token=令牌
+settings.slack_domain=域名
+settings.slack_channel=頻道
+
+diff.browse_source=瀏覽代碼
+diff.parent=父節點
+diff.commit=當前提交
+diff.data_not_available=暫無可用數據
+diff.show_diff_stats=顯示文件統計
+diff.stats_desc=共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
+diff.bin=二進制
+diff.view_file=查看文件
+
+[org]
+org_name_holder=組織名稱
+org_name_helper=偉大的組織都有一個簡短而寓意深刻的名字。
+org_email_helper=組織的郵箱用於接收所有通知和確認郵件。
+create_org=創建組織
+repo_updated=最後更新於
+people=組織成員
+invite_someone=邀請他人加入
+teams=組織團隊
+lower_members=名成員
+lower_repositories=個倉庫
+create_new_team=創建新的團隊
+org_desc=組織描述
+team_name=團隊名稱
+team_desc=團隊描述
+team_name_helper=您可以使用該名稱來通知改組全體成員。
+team_desc_helper=一句話描述這個團隊是做什麼的。
+team_permission_desc=請選擇該團隊所具有的權限等級:
+
+settings=組織設置
+settings.options=基本設置
+settings.full_name=組織全名
+settings.website=官方網站
+settings.location=所在地區
+settings.update_settings=更新組織設置
+settings.change_orgname=組織名稱將被修改
+settings.change_orgname_desc=組織名稱被修改,您確定要繼續操作嗎?這將會影響到所有與該組織有關的連結。
+settings.update_setting_success=組織設置更新成功!
+settings.delete=刪除組織
+settings.delete_account=刪除當前組織
+settings.delete_prompt=刪除操作會永久清除該組織的信息,並且 <strong>不可恢復</strong>!
+settings.confirm_delete_account=確認刪除組織
+settings.delete_org_title=組織刪除操作
+settings.delete_org_desc=該組織將被永久性刪除,您確定要繼續操作嗎?
+settings.hooks_desc=在此處添加的 Web 鉤子將會應用到該組織下的 <strong>所有倉庫</strong>。
+
+members.public=公開成員
+members.public_helper=設為私有
+members.private=私有成員
+members.private_helper=設為公開
+members.owner=管理員
+members.member=普通成員
+members.conceal=隱藏身份
+members.remove=移除成員
+members.leave=離開組織
+members.invite_desc=請輸入被邀請到組織 %s 的用戶名稱:
+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.admin_access_helper=這個團隊將擁有查看、復製、推送和添加其他組織成員到團隊的權限。
+teams.no_desc=該團隊暫無描述
+teams.settings=團隊設置
+teams.owners_permission_desc=管理員團隊對 <strong>所有倉庫</strong> 具有操作權限,且對組織具有 <strong>管理員權限</strong>。
+teams.members=團隊成員
+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=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 權限,團隊成員可以進行查看和復製等只讀操作。
+teams.write_permission_desc=該團隊擁有對所屬倉庫的 <strong>讀取</strong> 和 <strong>寫入</strong> 的權限。
+teams.admin_permission_desc=該團隊擁有一定的 <strong>管理</strong> 權限,團隊成員可以讀取、復製、推送以及添加其它倉庫協作者。
+teams.repositories=團隊倉庫
+teams.add_team_repository=添加團隊倉庫
+teams.remove_repo=移除倉庫
+teams.add_nonexistent_repo=您嘗試添加到團隊的倉庫不存在,請先創建倉庫!
+
+[admin]
+dashboard=控制面版
+users=用戶管理
+organizations=組織管理
+repositories=倉庫管理
+authentication=授權認證管理
+config=應用配置管理
+notices=系統提示管理
+monitor=應用監控面版
+prev=上一頁
+next=下一頁
+
+dashboard.statistic=應用統計數據
+dashboard.operations=管理員操作
+dashboard.system_status=系統監視狀態
+dashboard.statistic_info=Gogs 數據庫統計:<b>%d</b> 位用戶,<b>%d</b> 個組織,<b>%d</b> 個公鑰,<b>%d</b> 個倉庫,<b>%d</b> 個倉庫關註,<b>%d</b> 個贊,<b>%d</b> 次行為,<b>%d</b> 條權限記錄,<b>%d</b> 個問題,<b>%d</b> 次評論,<b>%d</b> 個社交帳號,<b>%d</b> 個用戶關註,<b>%d</b> 個鏡像,<b>%d</b> 個版本發佈,<b>%d</b> 個登錄源,<b>%d</b> 個 Web 鉤子,<b>%d</b> 個里程碑,<b>%d</b> 個標籤,<b>%d</b> 個鉤子任務,<b>%d</b> 個團隊,<b>%d</b> 個更新任務,<b>%d</b> 個附件。
+dashboard.operation_name=操作名稱
+dashboard.operation_switch=開關
+dashboard.operation_run=執行
+dashboard.clean_unbind_oauth=清理未綁定社交帳號
+dashboard.delete_inactivate_accounts=刪除所有未激活帳戶
+dashboard.server_uptime=服務執行時間
+dashboard.current_goroutine=當前 Goroutines 數量
+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 內存空閒量
+dashboard.heap_memory_in_use=正在使用的 Heap 內存
+dashboard.heap_memory_released=被釋放的 Heap 內存
+dashboard.heap_objects=Heap 對象數量
+dashboard.bootstrap_stack_usage=啟動 Stack 使用量
+dashboard.stack_memory_obtained=被分配的 Stack 內存
+dashboard.mspan_structures_usage=MSpan 結構內存使用量
+dashboard.mspan_structures_obtained=被分配的 MSpan 結構內存
+dashboard.mcache_structures_usage=MCache 結構內存使用量
+dashboard.mcache_structures_obtained=被分配的 MCache 結構內存
+dashboard.profiling_bucket_hash_table_obtained=被分配的剖析哈希表內存
+dashboard.gc_metadata_obtained=被分配的垃圾收集元數據內存
+dashboard.other_system_allocation_obtained=其它被分配的系統內存
+dashboard.next_gc_recycle=下次垃圾收集內存回收量
+dashboard.last_gc_time=距離上次垃圾收集時間
+dashboard.total_gc_time=垃圾收集執行時間總量
+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.edit=編輯
+users.auth_source=認證源
+users.local=本地
+users.auth_login_name=認證登錄名
+users.update_profile_success=該用戶信息更新成功!
+users.edit_account=編輯用戶信息
+users.is_activated=該用戶已被激活
+users.is_admin=該用戶具有管理員權限
+users.allow_git_hook=該帳戶具有創建 Git 鉤子的權限
+users.update_profile=更新用戶信息
+users.delete_account=刪除該用戶
+users.still_own_repo=該帳戶仍然是某些倉庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作!
+users.still_has_org=該帳戶仍舊是某些組織的成員,您必須先使其離開或刪除組織。
+
+orgs.org_manage_panel=組織管理面版
+orgs.name=組織名稱
+orgs.teams=團隊數
+orgs.members=成員數
+
+repos.repo_manage_panel=倉庫管理界面
+repos.owner=所有者
+repos.name=倉庫名稱
+repos.private=私有庫
+repos.watches=關註數
+repos.stars=讚好數
+repos.issues=問題數
+
+auths.auth_manage_panel=授權認證管理面版
+auths.new=添加新的認證源
+auths.name=認證名稱
+auths.type=認證類型
+auths.enabled=已啟用
+auths.updated=最後更新時間
+auths.auth_type=授權類型
+auths.auth_name=授權名稱
+auths.domain=域名
+auths.host=主機地址
+auths.port=主機端口
+auths.base_dn=Base DN
+auths.attributes=搜尋屬性
+auths.filter=搜尋過濾
+auths.ms_ad_sa=Ms Ad SA
+auths.smtp_auth=SMTP 授權類型
+auths.smtphost=SMTP 主機地址
+auths.smtpport=SMTP 主機端口
+auths.enable_tls=啟用 TLS 加密
+auths.enable_auto_register=允許授權用戶自動註冊
+auths.tips=幫助提示
+auths.edit=修改授權認證設置
+auths.activated=該授權認證已經啟用
+auths.update_success=授權認證設置更新成功!
+auths.update=更新授權認證信息
+auths.delete=刪除該授權認證
+auths.delete_auth_title=授權認證刪除操作
+auths.delete_auth_desc=該授權認證將被刪除,您確定要繼續嗎?
+
+config.server_config=服務器配置
+config.app_name=應用名稱
+config.app_ver=應用版本
+config.app_url=應用 URL
+config.domain=應用域名
+config.offline_mode=離線模式
+config.disable_router_log=關閉路由日志
+config.run_user=執行用戶
+config.run_mode=執行模式
+config.repo_root_path=倉庫根目錄
+config.static_file_root_path=靜態文件根目錄
+config.log_file_root_path=日志文件根目錄
+config.script_type=腳本類型
+config.reverse_auth_user=反向代理認證
+config.db_config=數據庫配置
+config.db_type=數據庫類型
+config.db_host=主機地址
+config.db_name=數據庫名稱
+config.db_user=數據庫用戶
+config.db_ssl_mode=SSL 模式
+config.db_ssl_mode_helper=(僅限 "postgres" 使用)
+config.db_path=數據庫路徑
+config.db_path_helper=(僅限 "sqlite3" 使用)
+config.service_config=服務配置
+config.register_email_confirm=註冊郵件確認
+config.disable_register=關閉註冊功能
+config.require_sign_in_view=強制登錄瀏覽
+config.mail_notify=郵件通知提醒
+config.enable_cache_avatar=開啟緩存頭像
+config.active_code_lives=激活用戶連結有效期
+config.reset_password_code_lives=重置密碼連結有效期
+config.webhook_config=Web 鉤子配置
+config.task_interval=任務周期
+config.deliver_timeout=推送超時
+config.mailer_config=郵件配置
+config.mailer_enabled=啟用服務
+config.mailer_name=發送者名稱
+config.mailer_host=郵件主機地址
+config.mailer_user=發送者帳號
+config.oauth_config=社交帳號配置
+config.oauth_enabled=啟用服務
+config.cache_config=Cache 配置
+config.cache_adapter=Cache 適配器
+config.cache_interval=Cache 周期
+config.cache_conn=Cache 連接字符串
+config.session_config=Session 配置
+config.session_provider=Session 提供者
+config.provider_config=提供者配置
+config.cookie_name=Cookie 名稱
+config.enable_set_cookie=啟用設置 Cookie
+config.gc_interval_time=垃圾收集周期
+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.log_config=日誌配置
+config.log_mode=日誌模式
+
+monitor.cron=Cron 任務
+monitor.name=任務名稱
+monitor.schedule=任務安排
+monitor.next=下次執行時間
+monitor.previous=上次執行時間
+monitor.execute_times=執行次數
+monitor.process=執行中進程
+monitor.desc=進程描述
+monitor.start=開始時間
+monitor.execute_time=已執行時間
+
+notices.system_notice_list=系統提示管理
+notices.type=提示類型
+notices.type_1=倉庫
+notices.desc=描述
+notices.op=操作
+notices.delete_success=系統提示刪除成功!
+
+[action]
+create_repo=創建了倉庫 <a href="%s/%s">%s</a>
+commit_repo=推送了 <a href="%s/%s/src/%s">%s</a> 分支的代碼到 <a href="%s/%s">%s</a>
+create_issue=創建了問題 <a href="%s/%s/issues/%s">%s#%s</a>
+comment_issue=評論了問題 <a href="%s/%s/issues/%s">%s#%s</a>
+transfer_repo=將倉庫 <code>%s</code> 轉移至 <a href="/%s%s">%s</a>
+push_tag=推送了標籤 <a href="%s/%s/src/%s">%s</a> 到 <a href="%s/%s">%s</a>
+compare_2_commits=查看 2 次提交的內容對比
+
+[tool]
+ago=之前
+from_now=之後
+now=現在
+1s=1 秒%s
+1m=1 分鐘%s
+1h=1 小時%s
+1d=1 天%s
+1w=1 周%s
+1mon=1 月%s
+1y=1 年%s
+seconds=%d 秒%s
+minutes=%d 分鐘%s
+hours=%d 小時%s
+days=%d 天%s
+weeks=%d 周%s
+months=%d 月%s
+years=%d 年%s
+raw_seconds=秒
+raw_minutes=分鐘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gogs.go b/gogs.go
index 3f66c436..e4322955 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-const APP_VER = "0.5.6.1027 Beta"
+const APP_VER = "0.5.8.1117 Beta"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/models.go b/models/models.go
index 46716728..92a579df 100644
--- a/models/models.go
+++ b/models/models.go
@@ -39,7 +39,8 @@ var (
)
func init() {
- tables = append(tables, new(User), new(PublicKey), new(Follow), new(Oauth2),
+ tables = append(tables,
+ new(User), new(PublicKey), new(Follow), new(Oauth2), new(AccessToken),
new(Repository), new(Watch), new(Star), new(Action), new(Access),
new(Issue), new(Comment), new(Attachment), new(IssueUser), new(Label), new(Milestone),
new(Mirror), new(Release), new(LoginSource), new(Webhook),
@@ -129,7 +130,7 @@ func NewEngine() (err error) {
if err = SetEngine(); err != nil {
return err
}
- if err = x.Sync2(tables...); err != nil {
+ if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil {
return fmt.Errorf("sync database struct error: %v\n", err)
}
return nil
diff --git a/models/publickey.go b/models/publickey.go
index c29003ce..f379e121 100644
--- a/models/publickey.go
+++ b/models/publickey.go
@@ -239,10 +239,10 @@ func GetPublicKeyById(keyId int64) (*PublicKey, error) {
return key, nil
}
-// ListPublicKey returns a list of all public keys that user has.
-func ListPublicKey(uid int64) ([]*PublicKey, error) {
+// ListPublicKeys returns a list of public keys belongs to given user.
+func ListPublicKeys(uid int64) ([]*PublicKey, error) {
keys := make([]*PublicKey, 0, 5)
- err := x.Find(&keys, &PublicKey{OwnerId: uid})
+ err := x.Where("owner_id=?", uid).Find(&keys)
if err != nil {
return nil, err
}
diff --git a/models/repo.go b/models/repo.go
index 888dea1e..d0cd1b55 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1080,15 +1080,21 @@ func GetCollaboratorNames(repoName string) ([]string, error) {
return names, nil
}
+// CollaborativeRepository represents a repository with collaborative information.
+type CollaborativeRepository struct {
+ *Repository
+ CanPush bool
+}
+
// GetCollaborativeRepos returns a list of repositories that user is collaborator.
-func GetCollaborativeRepos(uname string) ([]*Repository, error) {
+func GetCollaborativeRepos(uname string) ([]*CollaborativeRepository, error) {
uname = strings.ToLower(uname)
accesses := make([]*Access, 0, 10)
if err := x.Find(&accesses, &Access{UserName: uname}); err != nil {
return nil, err
}
- repos := make([]*Repository, 0, 10)
+ repos := make([]*CollaborativeRepository, 0, 10)
for _, access := range accesses {
infos := strings.Split(access.RepoName, "/")
if infos[0] == uname {
@@ -1105,7 +1111,7 @@ func GetCollaborativeRepos(uname string) ([]*Repository, error) {
return nil, err
}
repo.Owner = u
- repos = append(repos, repo)
+ repos = append(repos, &CollaborativeRepository{repo, access.Mode == WRITABLE})
}
return repos, nil
}
@@ -1161,7 +1167,7 @@ func SearchRepositoryByName(opt SearchOption) (repos []*Repository, err error) {
if !opt.Private {
sess.And("is_private=false")
}
- sess.And("lower_name like '%" + opt.Keyword + "%'").Find(&repos)
+ sess.And("lower_name like ?", "%"+opt.Keyword+"%").Find(&repos)
return repos, err
}
@@ -1298,8 +1304,8 @@ func IsStaring(uid, repoId int64) bool {
// \___ / \____/|__| |__|_ \
// \/ \/
-func ForkRepository(u *User, oldRepo *Repository) (*Repository, error) {
- isExist, err := IsRepositoryExist(u, oldRepo.Name)
+func ForkRepository(u *User, oldRepo *Repository, name, desc string) (*Repository, error) {
+ isExist, err := IsRepositoryExist(u, name)
if err != nil {
return nil, err
} else if isExist {
@@ -1323,9 +1329,9 @@ func ForkRepository(u *User, oldRepo *Repository) (*Repository, error) {
repo := &Repository{
OwnerId: u.Id,
Owner: u,
- Name: oldRepo.Name,
- LowerName: oldRepo.LowerName,
- Description: oldRepo.Description,
+ Name: name,
+ LowerName: strings.ToLower(name),
+ Description: desc,
IsPrivate: oldRepo.IsPrivate,
IsFork: true,
ForkId: oldRepo.Id,
diff --git a/models/token.go b/models/token.go
new file mode 100644
index 00000000..909d05e0
--- /dev/null
+++ b/models/token.go
@@ -0,0 +1,69 @@
+// Copyright 2014 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 models
+
+import (
+ "errors"
+ "time"
+
+ "github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/uuid"
+)
+
+var (
+ ErrAccessTokenNotExist = errors.New("Access token does not exist")
+)
+
+// AccessToken represents a personal access token.
+type AccessToken struct {
+ Id int64
+ Uid int64
+ Name string
+ Sha1 string `xorm:"UNIQUE VARCHAR(40)"`
+ Created time.Time `xorm:"CREATED"`
+ Updated time.Time
+ HasRecentActivity bool `xorm:"-"`
+ HasUsed bool `xorm:"-"`
+}
+
+// NewAccessToken creates new access token.
+func NewAccessToken(t *AccessToken) error {
+ t.Sha1 = base.EncodeSha1(uuid.NewV4().String())
+ _, err := x.Insert(t)
+ return err
+}
+
+// GetAccessTokenBySha returns access token by given sha1.
+func GetAccessTokenBySha(sha string) (*AccessToken, error) {
+ t := &AccessToken{Sha1: sha}
+ has, err := x.Get(t)
+ if err != nil {
+ return nil, err
+ } else if !has {
+ return nil, ErrAccessTokenNotExist
+ }
+ return t, nil
+}
+
+// ListAccessTokens returns a list of access tokens belongs to given user.
+func ListAccessTokens(uid int64) ([]*AccessToken, error) {
+ tokens := make([]*AccessToken, 0, 5)
+ err := x.Where("uid=?", uid).Desc("id").Find(&tokens)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, t := range tokens {
+ t.HasUsed = t.Updated.After(t.Created)
+ t.HasRecentActivity = t.Updated.Add(7 * 24 * time.Hour).After(time.Now())
+ }
+ return tokens, nil
+}
+
+// DeleteAccessTokenById deletes access token by given ID.
+func DeleteAccessTokenById(id int64) error {
+ _, err := x.Id(id).Delete(new(AccessToken))
+ return err
+}
diff --git a/models/user.go b/models/user.go
index ce85008b..31f4a289 100644
--- a/models/user.go
+++ b/models/user.go
@@ -67,6 +67,7 @@ type User struct {
Website string
IsActive bool
IsAdmin bool
+ AllowGitHook bool
Rands string `xorm:"VARCHAR(10)"`
Salt string `xorm:"VARCHAR(10)"`
Created time.Time `xorm:"CREATED"`
@@ -100,7 +101,7 @@ func (u *User) AvatarLink() string {
} else if setting.Service.EnableCacheAvatar {
return setting.AppSubUrl + "/avatar/" + u.Avatar
}
- return "//1.gravatar.com/avatar/" + u.Avatar
+ return setting.GravatarSource + u.Avatar
}
// NewGitSig generates and returns the signature of given user.
@@ -376,7 +377,7 @@ func UpdateUser(u *User) error {
return err
}
-// TODO: need some kind of mechanism to record failure.
+// FIXME: need some kind of mechanism to record failure. HINT: system notice
// DeleteUser completely and permanently deletes everything of user.
func DeleteUser(u *User) error {
// Check ownership of repository.
@@ -390,13 +391,13 @@ func DeleteUser(u *User) error {
// Check membership of organization.
count, err = u.GetOrganizationCount()
if err != nil {
- return errors.New("modesl.GetRepositories(GetOrganizationCount): " + err.Error())
+ return errors.New("GetOrganizationCount: " + err.Error())
} else if count > 0 {
return ErrUserHasOrgs
}
- // TODO: check issues, other repos' commits
- // TODO: roll backable in some point.
+ // FIXME: check issues, other repos' commits
+ // FIXME: roll backable in some point.
// Delete all followers.
if _, err = x.Delete(&Follow{FollowId: u.Id}); err != nil {
@@ -581,7 +582,7 @@ func SearchUserByName(opt SearchOption) (us []*User, err error) {
opt.Keyword = strings.ToLower(opt.Keyword)
us = make([]*User, 0, opt.Limit)
- err = x.Limit(opt.Limit).Where("type=0").And("lower_name like '%" + opt.Keyword + "%'").Find(&us)
+ err = x.Limit(opt.Limit).Where("type=0").And("lower_name like ?", "%"+opt.Keyword+"%").Find(&us)
return us, err
}
diff --git a/models/webhook.go b/models/webhook.go
index ac0c2409..33146b52 100644
--- a/models/webhook.go
+++ b/models/webhook.go
@@ -27,6 +27,32 @@ const (
FORM
)
+var hookContentTypes = map[string]HookContentType{
+ "json": JSON,
+ "form": FORM,
+}
+
+// ToHookContentType returns HookContentType by given name.
+func ToHookContentType(name string) HookContentType {
+ return hookContentTypes[name]
+}
+
+func (t HookContentType) Name() string {
+ switch t {
+ case JSON:
+ return "json"
+ case FORM:
+ return "form"
+ }
+ return ""
+}
+
+// IsValidHookContentType returns true if given name is a valid hook content type.
+func IsValidHookContentType(name string) bool {
+ _, ok := hookContentTypes[name]
+ return ok
+}
+
// HookEvent represents events that will delivery hook.
type HookEvent struct {
PushOnly bool `json:"push_only"`
@@ -46,6 +72,8 @@ type Webhook struct {
HookTaskType HookTaskType
Meta string `xorm:"TEXT"` // store hook-specific attributes
OrgId int64
+ Created time.Time `xorm:"CREATED"`
+ Updated time.Time `xorm:"UPDATED"`
}
// GetEvent handles conversion from Events to HookEvent.
@@ -147,12 +175,39 @@ const (
SLACK
)
+var hookTaskTypes = map[string]HookTaskType{
+ "gogs": GOGS,
+ "slack": SLACK,
+}
+
+// ToHookTaskType returns HookTaskType by given name.
+func ToHookTaskType(name string) HookTaskType {
+ return hookTaskTypes[name]
+}
+
+func (t HookTaskType) Name() string {
+ switch t {
+ case GOGS:
+ return "gogs"
+ case SLACK:
+ return "slack"
+ }
+ return ""
+}
+
+// IsValidHookTaskType returns true if given name is a valid hook task type.
+func IsValidHookTaskType(name string) bool {
+ _, ok := hookTaskTypes[name]
+ return ok
+}
+
type HookEventType string
const (
PUSH HookEventType = "push"
)
+// FIXME: just use go-gogs-client structs maybe?
type PayloadAuthor struct {
Name string `json:"name"`
Email string `json:"email"`
diff --git a/modules/auth/admin.go b/modules/auth/admin.go
index 60ea3a3c..6fec6ce7 100644
--- a/modules/auth/admin.go
+++ b/modules/auth/admin.go
@@ -11,14 +11,15 @@ import (
)
type AdminEditUserForm struct {
- Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
- Passwd string `form:"password"`
- Website string `form:"website" binding:"MaxSize(50)"`
- Location string `form:"location" binding:"MaxSize(50)"`
- Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"`
- Active bool `form:"active"`
- Admin bool `form:"admin"`
- LoginType int `form:"login_type"`
+ Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
+ Passwd string `form:"password"`
+ Website string `form:"website" binding:"MaxSize(50)"`
+ Location string `form:"location" binding:"MaxSize(50)"`
+ Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"`
+ Active bool `form:"active"`
+ Admin bool `form:"admin"`
+ AllowGitHook bool `form:"allow_git_hook"`
+ LoginType int `form:"login_type"`
}
func (f *AdminEditUserForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
diff --git a/modules/auth/auth.go b/modules/auth/auth.go
index 95e647f5..da89c20c 100644
--- a/modules/auth/auth.go
+++ b/modules/auth/auth.go
@@ -14,27 +14,32 @@ import (
"github.com/macaron-contrib/session"
"github.com/gogits/gogs/models"
+ "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
)
// SignedInId returns the id of signed in user.
-func SignedInId(header http.Header, sess session.Store) int64 {
+func SignedInId(req *http.Request, sess session.Store) int64 {
if !models.HasEngine {
return 0
}
- if setting.Service.EnableReverseProxyAuth {
- webAuthUser := header.Get(setting.ReverseProxyAuthUser)
- if len(webAuthUser) > 0 {
- u, err := models.GetUserByName(webAuthUser)
- if err != nil {
- if err != models.ErrUserNotExist {
- log.Error(4, "GetUserByName: %v", err)
+ // API calls need to check access token.
+ if strings.HasPrefix(req.URL.Path, "/api/") {
+ auHead := req.Header.Get("Authorization")
+ if len(auHead) > 0 {
+ auths := strings.Fields(auHead)
+ if len(auths) == 2 && auths[0] == "token" {
+ t, err := models.GetAccessTokenBySha(auths[1])
+ if err != nil {
+ if err != models.ErrAccessTokenNotExist {
+ log.Error(4, "GetAccessTokenBySha: %v", err)
+ }
+ return 0
}
- return 0
+ return t.Uid
}
- return u.Id
}
}
@@ -55,9 +60,47 @@ func SignedInId(header http.Header, sess session.Store) int64 {
}
// SignedInUser returns the user object of signed user.
-func SignedInUser(header http.Header, sess session.Store) *models.User {
- uid := SignedInId(header, sess)
+func SignedInUser(req *http.Request, sess session.Store) *models.User {
+ if !models.HasEngine {
+ return nil
+ }
+
+ uid := SignedInId(req, sess)
+
if uid <= 0 {
+ if setting.Service.EnableReverseProxyAuth {
+ webAuthUser := req.Header.Get(setting.ReverseProxyAuthUser)
+ if len(webAuthUser) > 0 {
+ u, err := models.GetUserByName(webAuthUser)
+ if err != nil {
+ if err != models.ErrUserNotExist {
+ log.Error(4, "GetUserByName: %v", err)
+ }
+ return nil
+ }
+ return u
+ }
+ }
+
+ // Check with basic auth.
+ baHead := req.Header.Get("Authorization")
+ if len(baHead) > 0 {
+ auths := strings.Fields(baHead)
+ if len(auths) == 2 && auths[0] == "Basic" {
+ uname, passwd, _ := base.BasicAuthDecode(auths[1])
+ u, err := models.GetUserByName(uname)
+ if err != nil {
+ if err != models.ErrUserNotExist {
+ log.Error(4, "GetUserByName: %v", err)
+ }
+ return nil
+ }
+
+ if u.ValidtePassword(passwd) {
+ return u
+ }
+ }
+ }
return nil
}
diff --git a/modules/auth/publickey_form.go b/modules/auth/publickey_form.go
deleted file mode 100644
index 5a1d44c0..00000000
--- a/modules/auth/publickey_form.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 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 (
- "github.com/Unknwon/macaron"
- "github.com/macaron-contrib/binding"
-)
-
-type AddSSHKeyForm struct {
- SSHTitle string `form:"title" binding:"Required"`
- Content string `form:"content" binding:"Required"`
-}
-
-func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
- return validate(errs, ctx.Data, f, ctx.Locale)
-}
diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go
index 72bdd458..6046a8d1 100644
--- a/modules/auth/user_form.go
+++ b/modules/auth/user_form.go
@@ -95,3 +95,20 @@ type ChangePasswordForm struct {
func (f *ChangePasswordForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
return validate(errs, ctx.Data, f, ctx.Locale)
}
+
+type AddSSHKeyForm struct {
+ SSHTitle string `form:"title" binding:"Required"`
+ Content string `form:"content" binding:"Required"`
+}
+
+func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type NewAccessTokenForm struct {
+ Name string `form:"name" binding:"Required"`
+}
+
+func (f *NewAccessTokenForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go
index 5ed5d16a..fb198da1 100644
--- a/modules/avatar/avatar.go
+++ b/modules/avatar/avatar.go
@@ -33,11 +33,17 @@ import (
"github.com/nfnt/resize"
"github.com/gogits/gogs/modules/log"
+ "github.com/gogits/gogs/modules/setting"
)
-var (
- gravatar = "http://www.gravatar.com/avatar"
-)
+var gravatarSource string
+
+func init() {
+ gravatarSource = setting.GravatarSource
+ if !strings.HasPrefix(gravatarSource, "http:") {
+ gravatarSource = "http:" + gravatarSource
+ }
+}
// hash email to md5 string
// keep this func in order to make this package indenpent
@@ -121,7 +127,7 @@ func (this *Avatar) Encode(wr io.Writer, size int) (err error) {
// get image from gravatar.com
func (this *Avatar) Update() {
- thunder.Fetch(gravatar+"/"+this.Hash+"?"+this.reqParams,
+ thunder.Fetch(gravatarSource+this.Hash+"?"+this.reqParams,
this.imagePath)
}
@@ -129,7 +135,7 @@ func (this *Avatar) UpdateTimeout(timeout time.Duration) (err error) {
select {
case <-time.After(timeout):
err = fmt.Errorf("get gravatar image %s timeout", this.Hash)
- case err = <-thunder.GoFetch(gravatar+"/"+this.Hash+"?"+this.reqParams,
+ case err = <-thunder.GoFetch(gravatarSource+this.Hash+"?"+this.reqParams,
this.imagePath):
}
return err
diff --git a/modules/base/base.go b/modules/base/base.go
index cb514782..6bd29468 100644
--- a/modules/base/base.go
+++ b/modules/base/base.go
@@ -4,12 +4,14 @@
package base
+const DOC_URL = "http://gogs.io/docs"
+
type (
TplName string
ApiJsonErr struct {
Message string `json:"message"`
- DocUrl string `json:"documentation_url"`
+ DocUrl string `json:"url"`
}
)
diff --git a/modules/base/template.go b/modules/base/template.go
index 58572e24..446d01dd 100644
--- a/modules/base/template.go
+++ b/modules/base/template.go
@@ -141,6 +141,9 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
"Oauth2Icon": Oauth2Icon,
"Oauth2Name": Oauth2Name,
"ToUtf8": ToUtf8,
+ "EscapePound": func(str string) string {
+ return strings.Replace(str, "#", "%23", -1)
+ },
}
type Actioner interface {
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 5b56d1f6..0e083c8d 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -9,7 +9,9 @@ import (
"crypto/md5"
"crypto/rand"
"crypto/sha1"
+ "encoding/base64"
"encoding/hex"
+ "errors"
"fmt"
"hash"
"html/template"
@@ -31,6 +33,33 @@ func EncodeMd5(str string) string {
return hex.EncodeToString(m.Sum(nil))
}
+// Encode string to sha1 hex value.
+func EncodeSha1(str string) string {
+ h := sha1.New()
+ h.Write([]byte(str))
+ return hex.EncodeToString(h.Sum(nil))
+}
+
+func BasicAuthDecode(encoded string) (user string, name string, err error) {
+ var s []byte
+ s, err = base64.StdEncoding.DecodeString(encoded)
+ if err != nil {
+ return user, name, err
+ }
+
+ a := strings.Split(string(s), ":")
+ if len(a) == 2 {
+ user, name = a[0], a[1]
+ } else {
+ err = errors.New("decode failed")
+ }
+ return user, name, err
+}
+
+func BasicAuthEncode(username, password string) string {
+ return base64.StdEncoding.EncodeToString([]byte(username + ":" + password))
+}
+
// GetRandomString generate random string by specify chars.
func GetRandomString(n int, alphabets ...byte) string {
const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
@@ -151,7 +180,7 @@ func AvatarLink(email string) string {
} else if setting.Service.EnableCacheAvatar {
return setting.AppSubUrl + "/avatar/" + EncodeMd5(email)
}
- return "//1.gravatar.com/avatar/" + EncodeMd5(email)
+ return setting.GravatarSource + EncodeMd5(email)
}
// Seconds-based time units
diff --git a/modules/cron/doc.go b/modules/cron/doc.go
index dbdf5012..258fe1ef 100644
--- a/modules/cron/doc.go
+++ b/modules/cron/doc.go
@@ -7,9 +7,9 @@ Callers may register Funcs to be invoked on a given schedule. Cron will run
them in their own goroutines.
c := cron.New()
- c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
- c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
- c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") })
+ c.AddFunc("Every hour on the half hour","0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
+ c.AddFunc("Every hour","@hourly", func() { fmt.Println("Every hour") })
+ c.AddFunc("Every hour and a half","@every 1h30m", func() { fmt.Println("Every hour thirty") })
c.Start()
..
// Funcs are invoked in their own goroutine, asynchronously.
diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go
index 758792a3..df3efb61 100644
--- a/modules/mailer/mailer.go
+++ b/modules/mailer/mailer.go
@@ -82,7 +82,7 @@ func sendMail(hostAddressWithPort string, auth smtp.Auth, from string, recipient
return err
}
- if auth != nil {
+ if ok, _ := client.Extension("AUTH"); ok && auth != nil {
if err = client.Auth(auth); err != nil {
return err
}
diff --git a/modules/middleware/auth.go b/modules/middleware/auth.go
index 2bc05697..8388d2b2 100644
--- a/modules/middleware/auth.go
+++ b/modules/middleware/auth.go
@@ -67,3 +67,12 @@ func Toggle(options *ToggleOptions) macaron.Handler {
}
}
}
+
+func ApiReqToken() macaron.Handler {
+ return func(ctx *Context) {
+ if !ctx.IsSigned {
+ ctx.Error(403)
+ return
+ }
+ }
+}
diff --git a/modules/middleware/context.go b/modules/middleware/context.go
index c45206a9..cbc0b0cf 100644
--- a/modules/middleware/context.go
+++ b/modules/middleware/context.go
@@ -53,6 +53,7 @@ type Context struct {
GitRepo *git.Repository
BranchName string
TagName string
+ TreeName string
CommitId string
RepoLink string
CloneLink struct {
@@ -171,12 +172,16 @@ func Contexter() macaron.Handler {
ctx.Data["PageStartTime"] = time.Now()
// Get user from session if logined.
- ctx.User = auth.SignedInUser(ctx.Req.Header, ctx.Session)
+ ctx.User = auth.SignedInUser(ctx.Req.Request, ctx.Session)
+
if ctx.User != nil {
ctx.IsSigned = true
ctx.Data["IsSigned"] = ctx.IsSigned
ctx.Data["SignedUser"] = ctx.User
+ ctx.Data["SignedUserName"] = ctx.User.Name
ctx.Data["IsAdmin"] = ctx.User.IsAdmin
+ } else {
+ ctx.Data["SignedUserName"] = ""
}
// If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid.
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go
index fec9c541..0aae122d 100644
--- a/modules/middleware/repo.go
+++ b/modules/middleware/repo.go
@@ -13,22 +13,221 @@ import (
"github.com/Unknwon/macaron"
"github.com/gogits/gogs/models"
+ "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
)
+func ApiRepoAssignment() macaron.Handler {
+ return func(ctx *Context) {
+ userName := ctx.Params(":username")
+ repoName := ctx.Params(":reponame")
+
+ var (
+ u *models.User
+ err error
+ )
+
+ // Collaborators who have write access can be seen as owners.
+ if ctx.IsSigned {
+ ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, userName+"/"+repoName, models.WRITABLE)
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"HasAccess: " + err.Error(), base.DOC_URL})
+ return
+ }
+ ctx.Repo.IsTrueOwner = ctx.User.LowerName == strings.ToLower(userName)
+ }
+
+ if !ctx.Repo.IsTrueOwner {
+ u, err = models.GetUserByName(userName)
+ if err != nil {
+ if err == models.ErrUserNotExist {
+ ctx.Error(404)
+ } else {
+ ctx.JSON(500, &base.ApiJsonErr{"GetUserByName: " + err.Error(), base.DOC_URL})
+ }
+ return
+ }
+ } else {
+ u = ctx.User
+ }
+ ctx.Repo.Owner = u
+
+ // Organization owner team members are true owners as well.
+ if ctx.IsSigned && ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgOwner(ctx.User.Id) {
+ ctx.Repo.IsTrueOwner = true
+ }
+
+ // Get repository.
+ repo, err := models.GetRepositoryByName(u.Id, repoName)
+ if err != nil {
+ if err == models.ErrRepoNotExist {
+ ctx.Error(404)
+ return
+ }
+ ctx.JSON(500, &base.ApiJsonErr{"GetRepositoryByName: " + err.Error(), base.DOC_URL})
+ return
+ } else if err = repo.GetOwner(); err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetOwner: " + err.Error(), base.DOC_URL})
+ return
+ }
+
+ // Check if the mirror repository owner(mirror repository doesn't have access).
+ if ctx.IsSigned && !ctx.Repo.IsOwner {
+ if repo.OwnerId == ctx.User.Id {
+ ctx.Repo.IsOwner = true
+ }
+ // Check if current user has admin permission to repository.
+ if u.IsOrganization() {
+ auth, err := models.GetHighestAuthorize(u.Id, ctx.User.Id, repo.Id, 0)
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetHighestAuthorize: " + err.Error(), base.DOC_URL})
+ return
+ }
+ if auth == models.ORG_ADMIN {
+ ctx.Repo.IsOwner = true
+ ctx.Repo.IsAdmin = true
+ }
+ }
+ }
+
+ // Check access.
+ if repo.IsPrivate && !ctx.Repo.IsOwner {
+ if ctx.User == nil {
+ ctx.Error(404)
+ return
+ }
+
+ hasAccess, err := models.HasAccess(ctx.User.Name, ctx.Repo.Owner.Name+"/"+repo.Name, models.READABLE)
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"HasAccess: " + err.Error(), base.DOC_URL})
+ return
+ } else if !hasAccess {
+ ctx.Error(404)
+ return
+ }
+ }
+ ctx.Repo.HasAccess = true
+
+ ctx.Repo.Repository = repo
+ }
+}
+
+// RepoRef handles repository reference name including those contain `/`.
+func RepoRef() macaron.Handler {
+ return func(ctx *Context) {
+ var (
+ refName string
+ err error
+ )
+
+ // For API calls.
+ if ctx.Repo.GitRepo == nil {
+ repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name)
+ gitRepo, err := git.OpenRepository(repoPath)
+ if err != nil {
+ ctx.Handle(500, "RepoRef Invalid repo "+repoPath, err)
+ return
+ }
+ ctx.Repo.GitRepo = gitRepo
+ }
+
+ // Get default branch.
+ if len(ctx.Params("*")) == 0 {
+ refName = ctx.Repo.Repository.DefaultBranch
+ if !ctx.Repo.GitRepo.IsBranchExist(refName) {
+ brs, err := ctx.Repo.GitRepo.GetBranches()
+ if err != nil {
+ ctx.Handle(500, "GetBranches", err)
+ return
+ }
+ refName = brs[0]
+ }
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName)
+ if err != nil {
+ ctx.Handle(500, "GetCommitOfBranch", err)
+ return
+ }
+ ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
+ ctx.Repo.IsBranch = true
+
+ } else {
+ hasMatched := false
+ parts := strings.Split(ctx.Params("*"), "/")
+ for i, part := range parts {
+ refName = strings.TrimPrefix(refName+"/"+part, "/")
+
+ if ctx.Repo.GitRepo.IsBranchExist(refName) ||
+ ctx.Repo.GitRepo.IsTagExist(refName) {
+ if i < len(parts)-1 {
+ ctx.Repo.TreeName = strings.Join(parts[i+1:], "/")
+ }
+ hasMatched = true
+ break
+ }
+ }
+ if !hasMatched && len(parts[0]) == 40 {
+ refName = parts[0]
+ ctx.Repo.TreeName = strings.Join(parts[1:], "/")
+ }
+
+ if ctx.Repo.GitRepo.IsBranchExist(refName) {
+ ctx.Repo.IsBranch = true
+
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfBranch(refName)
+ if err != nil {
+ ctx.Handle(500, "GetCommitOfBranch", err)
+ return
+ }
+ ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
+
+ } else if ctx.Repo.GitRepo.IsTagExist(refName) {
+ ctx.Repo.IsTag = true
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
+ if err != nil {
+ ctx.Handle(500, "GetCommitOfTag", err)
+ return
+ }
+ ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
+ } else if len(refName) == 40 {
+ ctx.Repo.IsCommit = true
+ ctx.Repo.CommitId = refName
+
+ ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
+ if err != nil {
+ ctx.Handle(404, "GetCommit", nil)
+ return
+ }
+ } else {
+ ctx.Handle(404, "RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
+ return
+ }
+ }
+
+ ctx.Repo.BranchName = refName
+ ctx.Data["BranchName"] = ctx.Repo.BranchName
+ ctx.Data["CommitId"] = ctx.Repo.CommitId
+ ctx.Data["IsBranch"] = ctx.Repo.IsBranch
+ ctx.Data["IsTag"] = ctx.Repo.IsTag
+ ctx.Data["IsCommit"] = ctx.Repo.IsCommit
+
+ ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
+ if err != nil {
+ ctx.Handle(500, "CommitsCount", err)
+ return
+ }
+ ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
+ }
+}
+
func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
return func(ctx *Context) {
var (
- validBranch bool // To valid brach name.
displayBare bool // To display bare page if it is a bare repo.
)
if len(args) >= 1 {
- validBranch = args[0]
- }
- if len(args) >= 2 {
- displayBare = args[1]
+ displayBare = args[0]
}
var (
@@ -200,73 +399,6 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, u.LowerName, repo.LowerName)
}
- // when repo is bare, not valid branch
- if !ctx.Repo.Repository.IsBare && validBranch {
- detect:
- if len(refName) > 0 {
- if gitRepo.IsBranchExist(refName) {
- ctx.Repo.IsBranch = true
- ctx.Repo.BranchName = refName
-
- ctx.Repo.Commit, err = gitRepo.GetCommitOfBranch(refName)
- if err != nil {
- ctx.Handle(500, "RepoAssignment invalid branch", err)
- return
- }
- ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
-
- } else if gitRepo.IsTagExist(refName) {
- ctx.Repo.IsTag = true
- ctx.Repo.BranchName = refName
- ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommitOfTag(refName)
- if err != nil {
- ctx.Handle(500, "Fail to get tag commit", err)
- return
- }
- ctx.Repo.CommitId = ctx.Repo.Commit.Id.String()
- } else if len(refName) == 40 {
- ctx.Repo.IsCommit = true
- ctx.Repo.CommitId = refName
- ctx.Repo.BranchName = refName
-
- ctx.Repo.Commit, err = gitRepo.GetCommit(refName)
- if err != nil {
- ctx.Handle(404, "RepoAssignment invalid commit", nil)
- return
- }
- } else {
- ctx.Handle(404, "RepoAssignment invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
- return
- }
-
- } else {
- if len(refName) == 0 {
- if gitRepo.IsBranchExist(ctx.Repo.Repository.DefaultBranch) {
- refName = ctx.Repo.Repository.DefaultBranch
- } else {
- brs, err := gitRepo.GetBranches()
- if err != nil {
- ctx.Handle(500, "GetBranches", err)
- return
- }
- refName = brs[0]
- }
- }
- goto detect
- }
-
- ctx.Data["IsBranch"] = ctx.Repo.IsBranch
- ctx.Data["IsTag"] = ctx.Repo.IsTag
- ctx.Data["IsCommit"] = ctx.Repo.IsCommit
-
- ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
- if err != nil {
- ctx.Handle(500, "CommitsCount", err)
- return
- }
- ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
- }
-
// repo is bare and display enable
if ctx.Repo.Repository.IsBare {
log.Debug("Bare repository: %s", ctx.Repo.RepoLink)
@@ -322,7 +454,7 @@ func RequireTrueOwner() macaron.Handler {
// GitHookService checks if repsitory Git hooks service has been enabled.
func GitHookService() macaron.Handler {
return func(ctx *Context) {
- if !setting.Service.EnableGitHooks {
+ if !ctx.User.AllowGitHook && !ctx.User.IsAdmin {
ctx.Handle(404, "GitHookService", nil)
return
}
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index b8fc4dec..0f293b69 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -28,6 +28,7 @@ type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
+ FCGI Scheme = "fcgi"
)
var (
@@ -66,6 +67,7 @@ var (
// Picture settings.
PictureService string
+ GravatarSource string
DisableGravatar bool
// Log settings.
@@ -181,6 +183,9 @@ func NewConfigContext() {
CertFile = Cfg.MustValue("server", "CERT_FILE")
KeyFile = Cfg.MustValue("server", "KEY_FILE")
}
+ if Cfg.MustValue("server", "PROTOCOL") == "fcgi" {
+ Protocol = FCGI
+ }
Domain = Cfg.MustValue("server", "DOMAIN", "localhost")
HttpAddr = Cfg.MustValue("server", "HTTP_ADDR", "0.0.0.0")
HttpPort = Cfg.MustValue("server", "HTTP_PORT", "3000")
@@ -253,8 +258,13 @@ func NewConfigContext() {
}
ScriptType = Cfg.MustValue("repository", "SCRIPT_TYPE", "bash")
- PictureService = Cfg.MustValueRange("picture", "SERVICE", "server",
- []string{"server"})
+ PictureService = Cfg.MustValueRange("picture", "SERVICE", "server", []string{"server"})
+ switch Cfg.MustValue("picture", "GRAVATAR_SOURCE", "gravatar") {
+ case "duoshuo":
+ GravatarSource = "http://gravatar.duoshuo.com/avatar/"
+ default:
+ GravatarSource = "//1.gravatar.com/avatar/"
+ }
DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR")
MaxGitDiffLines = Cfg.MustInt("git", "MAX_GITDIFF_LINES", 10000)
@@ -275,7 +285,6 @@ var Service struct {
LdapAuth bool
ActiveCodeLives int
ResetPwdCodeLives int
- EnableGitHooks bool
}
func newService() {
@@ -285,7 +294,6 @@ func newService() {
Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW")
Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR")
Service.EnableReverseProxyAuth = Cfg.MustBool("service", "ENABLE_REVERSE_PROXY_AUTHENTICATION")
- Service.EnableGitHooks = Cfg.MustBool("service", "ENABLE_GIT_HOOKS")
}
var logLevels = map[string]string{
@@ -390,9 +398,6 @@ func newSessionService() {
SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true)
SessionConfig.Gclifetime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400)
SessionConfig.Maxlifetime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400)
- SessionConfig.SessionIDHashFunc = Cfg.MustValueRange("session", "SESSION_ID_HASHFUNC",
- "sha1", []string{"sha1", "sha256", "md5"})
- SessionConfig.SessionIDHashKey = Cfg.MustValue("session", "SESSION_ID_HASHKEY", string(com.RandomCreateBytes(16)))
if SessionProvider == "file" {
os.MkdirAll(path.Dir(SessionConfig.ProviderConfig), os.ModePerm)
diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css
index 8e5b590c..14acd7a9 100644
--- a/public/ng/css/gogs.css
+++ b/public/ng/css/gogs.css
@@ -240,6 +240,9 @@ img.avatar-100 {
.text-black {
color: #444444;
}
+.text-gold {
+ color: #a1882b;
+}
.table {
width: 100%;
max-width: 100%;
@@ -1049,9 +1052,9 @@ The register and sign-in page style
}
#repo-header-download-drop {
line-height: 24px;
- width: 440px;
+ width: 460px;
top: 50px;
- left: -370px;
+ left: -390px;
padding: 20px;
box-sizing: border-box;
z-index: 1;
@@ -1063,11 +1066,15 @@ The register and sign-in page style
#repo-header-download-drop input {
font-size: 11px;
}
+#repo-header-download-drop #repo-clone-copy {
+ width: 85px;
+ text-overflow: clip;
+}
#repo-content {
padding: 18px 0;
}
.repo-wide-wrapper {
- padding: 18px 0;
+ padding: 18px;
position: relative;
}
#repo-clone-url {
@@ -1692,18 +1699,21 @@ The register and sign-in page style
#repo-hooks-panel,
#repo-hooks-history-panel,
#user-social-panel,
+#user-applications-panel,
#user-ssh-panel {
margin-bottom: 20px;
}
#repo-hooks-panel .setting-list,
#repo-hooks-history-panel .setting-list,
#user-social-panel .setting-list,
+#user-applications-panel .setting-list,
#user-ssh-panel .setting-list {
background-color: #FFF;
}
#repo-hooks-panel .setting-list li,
#repo-hooks-history-panel .setting-list li,
#user-social-panel .setting-list li,
+#user-applications-panel .setting-list li,
#user-ssh-panel .setting-list li {
padding: 8px 20px;
border-bottom: 1px solid #eaeaea;
@@ -1711,18 +1721,21 @@ The register and sign-in page style
#repo-hooks-panel .setting-list li.ssh:hover,
#repo-hooks-history-panel .setting-list li.ssh:hover,
#user-social-panel .setting-list li.ssh:hover,
+#user-applications-panel .setting-list li.ssh:hover,
#user-ssh-panel .setting-list li.ssh:hover {
background-color: #ffffEE;
}
#repo-hooks-panel .setting-list li i,
#repo-hooks-history-panel .setting-list li i,
#user-social-panel .setting-list li i,
+#user-applications-panel .setting-list li i,
#user-ssh-panel .setting-list li i {
padding-right: 5px;
}
#repo-hooks-panel .active-icon,
#repo-hooks-history-panel .active-icon,
#user-social-panel .active-icon,
+#user-applications-panel .active-icon,
#user-ssh-panel .active-icon {
width: 10px;
height: 10px;
@@ -1734,43 +1747,60 @@ The register and sign-in page style
#repo-hooks-panel .ssh-content,
#repo-hooks-history-panel .ssh-content,
#user-social-panel .ssh-content,
+#user-applications-panel .ssh-content,
#user-ssh-panel .ssh-content {
margin-left: 24px;
}
#repo-hooks-panel .ssh-content .octicon,
#repo-hooks-history-panel .ssh-content .octicon,
#user-social-panel .ssh-content .octicon,
+#user-applications-panel .ssh-content .octicon,
#user-ssh-panel .ssh-content .octicon {
margin-right: 4px;
}
#repo-hooks-panel .ssh-content .print,
#repo-hooks-history-panel .ssh-content .print,
#user-social-panel .ssh-content .print,
+#user-applications-panel .ssh-content .print,
#user-ssh-panel .ssh-content .print,
+#repo-hooks-panel .ssh-content .access,
+#repo-hooks-history-panel .ssh-content .access,
+#user-social-panel .ssh-content .access,
+#user-applications-panel .ssh-content .access,
+#user-ssh-panel .ssh-content .access,
#repo-hooks-panel .ssh-content .activity,
#repo-hooks-history-panel .ssh-content .activity,
#user-social-panel .ssh-content .activity,
+#user-applications-panel .ssh-content .activity,
#user-ssh-panel .ssh-content .activity {
color: #888;
}
-#repo-hooks-panel .ssh-delete-btn,
-#repo-hooks-history-panel .ssh-delete-btn,
-#user-social-panel .ssh-delete-btn,
-#user-ssh-panel .ssh-delete-btn {
+#repo-hooks-panel .ssh-content .access,
+#repo-hooks-history-panel .ssh-content .access,
+#user-social-panel .ssh-content .access,
+#user-applications-panel .ssh-content .access,
+#user-ssh-panel .ssh-content .access {
+ max-width: 500px;
+}
+#repo-hooks-panel .ssh-btn,
+#repo-hooks-history-panel .ssh-btn,
+#user-social-panel .ssh-btn,
+#user-applications-panel .ssh-btn,
+#user-ssh-panel .ssh-btn {
margin-top: 6px;
}
-#user-ssh-add-form .panel-body {
+.form-settings-add .panel-body {
background-color: #FFF;
padding: 30px 0;
}
-#user-ssh-add-form .ipt {
+.form-settings-add .ipt {
width: 500px;
}
-#user-ssh-add-form textarea {
+.form-settings-add textarea {
height: 120px;
margin-left: 3px;
}
-#user-ssh-add-form .field {
+.form-settings-add .field {
margin-bottom: 24px;
}
.pr-main {
@@ -1972,16 +2002,18 @@ textarea#issue-add-content {
height: 120px;
resize: vertical;
}
+#issue-list-nav {
+ border-bottom: 1px solid #DDD;
+ padding-bottom: 12px;
+}
#issue-list-nav li > a {
font-size: 13px;
font-weight: bold;
- padding: .4em .9em;
- border-radius: .3em;
+ padding: .2em .8em;
}
#issue-list-nav li.current > a {
background-color: #0079bc;
color: #FAFAFA;
- border-radius: .3em;
}
#issue-list-nav li.right {
margin-left: 4px;
@@ -1990,7 +2022,109 @@ textarea#issue-add-content {
padding: 0 !important;
}
#issue-new > a button {
- height: 34px;
+ height: 29px;
+}
+#issue-list-menu {
+ padding: 16px 0 12px 0;
+ border-bottom: 1px solid #BBB;
+ margin-bottom: 12px;
+}
+#issue-list-menu .mark a {
+ color: #AAA;
+}
+#issue-list-menu .mark a:hover {
+ color: #444;
+}
+#issue-list-menu .mark.hover a {
+ color: #222;
+ font-weight: bold;
+}
+#issue-list-menu > .left .mark {
+ margin-right: 12px;
+}
+#issue-list-menu > .right .mark {
+ margin-left: 12px;
+}
+#issue-list .item,
+#pull-list .item {
+ position: relative;
+ padding-bottom: 12px;
+ margin-bottom: 12px;
+ border-bottom: 1px dashed #AAA;
+}
+#issue-list .item .title > .title-text,
+#pull-list .item .title > .title-text {
+ color: #444;
+ font-size: 15px;
+ margin: 0 6px;
+}
+#issue-list .item .index-num,
+#pull-list .item .index-num {
+ padding: .25em .6em;
+}
+#issue-list .comment,
+#pull-list .comment {
+ color: #666;
+ position: absolute;
+ top: 6px;
+ right: 0;
+}
+#issue-list .issue-label,
+#pull-list .issue-label {
+ padding: .25em .6em;
+}
+#issue-list .issue-label a,
+#pull-list .issue-label a {
+ color: #FFF;
+}
+#issue-list .desc,
+#pull-list .desc {
+ color: #999;
+}
+#issue-list .desc a,
+#pull-list .desc a {
+ color: #999;
+}
+#issue-list .desc a:hover,
+#pull-list .desc a:hover {
+ color: #03a2ef;
+}
+#issue-list-pager {
+ margin: 18px 0 24px 0;
+ font-size: 14px;
+ line-height: 24px;
+}
+#labels-num {
+ margin-right: 1em;
+}
+#label-list .right {
+ margin-left: 1em;
+ color: #999;
+ line-height: 30px;
+}
+#label-list .right i {
+ margin-right: 3px;
+}
+#label-list .right:hover {
+ color: #444444;
+}
+#label-list .num {
+ margin-right: 3px;
+}
+#label-list .issue-num {
+ margin-right: 4em;
+}
+#label-list .label:hover {
+ color: #FFF;
+}
+#label-list .label i {
+ margin-right: 6px;
+}
+#label-list .item {
+ height: 30px;
+ padding-bottom: 12px;
+ margin-bottom: 12px;
+ border-bottom: 1px dashed #AAA;
}
.org-header-alert .alert {
margin-top: 10px;
diff --git a/public/ng/css/ui.css b/public/ng/css/ui.css
index a6c218ad..a33d9a7a 100644
--- a/public/ng/css/ui.css
+++ b/public/ng/css/ui.css
@@ -735,7 +735,7 @@ ul.menu-radius > li:last-child > a {
border-color: #F0C36D;
}
.label {
- padding: 2px 6px;
+ padding: .3em .6em .2em .6em;
color: #ffffff;
}
.label-red {
@@ -881,3 +881,30 @@ table td {
.table-radius tbody tr:last-child > td:last-child {
border-bottom-right-radius: .3em;
}
+.pager .page {
+ padding: .3em .5em .2em .5em;
+ margin: 0 .3em;
+ background-color: #cccccc;
+ color: #444444;
+}
+.pager .page:hover,
+.pager .page.hover {
+ background-color: #428bca;
+ color: #ffffff;
+}
+.pager .prev,
+.pager .next {
+ padding: .4em .6em;
+ margin: 0 .3em;
+ background-color: #505050;
+ color: #fafafa;
+}
+.pager .prev.invalid,
+.pager .next.invalid {
+ background-color: #eeeeee;
+ color: #aaaaaa;
+ cursor: not-allowed;
+}
+.pager .page-radius {
+ border-radius: .2em;
+}
diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js
index eba1744b..3578cd7c 100644
--- a/public/ng/js/gogs.js
+++ b/public/ng/js/gogs.js
@@ -210,7 +210,7 @@ var Gogs = {};
if (json.ok && json.data.length) {
var html = '';
$.each(json.data, function (i, item) {
- html += '<li><a><img src="' + item.avatar + '">' + item.username + '</a></li>';
+ html += '<li><a><img src="' + item.avatar_url + '">' + item.username + '</a></li>';
});
$target.html(html);
$target.toggleShow();
@@ -230,7 +230,7 @@ var Gogs = {};
if (json.ok && json.data.length) {
var html = '';
$.each(json.data, function (i, item) {
- html += '<li><a><span class="octicon octicon-repo"></span> ' + item.repolink + '</a></li>';
+ html += '<li><a><span class="octicon octicon-repo"></span> ' + item.full_name + '</a></li>';
});
$target.html(html);
$target.toggleShow();
@@ -300,8 +300,11 @@ function initCore() {
$.magnificPopup.close();
});
- // Collapse.
+ // Plugins.
$('.collapse').hide();
+ $('.tipsy-tooltip').tipsy({
+ fade: true
+ });
}
function initUserSetting() {
@@ -329,9 +332,9 @@ function initUserSetting() {
$profile_form.submit();
});
- // Show add SSH key panel.
- $('#ssh-add').click(function () {
- $('#user-ssh-add-form').removeClass("hide");
+ // Show panels.
+ $('.show-form-btn').click(function () {
+ $($(this).data('target-form')).removeClass("hide");
});
// Confirmation of delete account.
diff --git a/public/ng/js/min/gogs-min.js b/public/ng/js/min/gogs-min.js
index 6b7f408d..2035d45b 100644
--- a/public/ng/js/min/gogs-min.js
+++ b/public/ng/js/min/gogs-min.js
@@ -1,5 +1,5 @@
-function Tabs(e){function t(e){console.log("hide",e),e.removeClass("js-tab-nav-show"),$(e.data("tab-target")).removeClass("js-tab-show").hide()}function n(e){console.log("show",e),e.addClass("js-tab-nav-show"),$(e.data("tab-target")).addClass("js-tab-show").show()}var r=$(e);if(r.length){var i=r.find(".js-tab-nav-show");i.length&&$(i.data("tab-target")).addClass("js-tab-show"),r.on("click",".js-tab-nav",function(e){e.preventDefault();var o=$(this);o.hasClass("js-tab-nav-show")||(i=r.find(".js-tab-nav-show").eq(0),t(i),n(o))}),console.log("init tabs @",e)}}function Preview(e,t){function n(e){return e.find(".js-preview-input").eq(0)}function r(e){return e.hasClass("js-preview-container")?e:e.find(".js-preview-container").eq(0)}var i=$(e),o=$(t),a=n(o);if(!a.length)return void console.log("[preview]: no preview input");var s=r(o);return s.length?(i.on("click",function(){$.post("/api/v1/markdown",{text:a.val()},function(e){s.html(e)})}),void console.log("[preview]: init preview @",e,"&",t)):void console.log("[preview]: no preview container")}function initCore(){Gogs.renderMarkdown(),Gogs.renderCodeView(),$(".js-tab-nav").click(function(e){$(this).hasClass("js-tab-nav-show")||($(this).parent().find(".js-tab-nav-show").each(function(){$(this).removeClass("js-tab-nav-show"),$($(this).data("tab-target")).hide()}),$(this).addClass("js-tab-nav-show"),$($(this).data("tab-target")).show()),e.preventDefault()}),$(document).on("click",".popup-modal-dismiss",function(e){e.preventDefault(),$.magnificPopup.close()}),$(".collapse").hide()}function initUserSetting(){var t=$("#username"),n=$("#user-profile-form");$("#change-username-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("uname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("uname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-username-submit").click(function(){$.magnificPopup.close(),n.submit()}),$("#ssh-add").click(function(){$("#user-ssh-add-form").removeClass("hide")}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close(),$("#delete-account-form").submit()})}function initRepoCreate(){$("#repo-create-owner-list").on("click","li",function(){if(!$(this).hasClass("checked")){var e=$(this).data("uid");$("#repo-owner-id").val(e),$("#repo-owner-avatar").attr("src",$(this).find("img").attr("src")),$("#repo-owner-name").text($(this).text().trim()),$(this).parent().find(".checked").removeClass("checked"),$(this).addClass("checked"),console.log("set repo owner to uid :",e,$(this).text().trim())}}),$("#auth-button").click(function(e){$("#repo-migrate-auth").slideToggle("fast"),e.preventDefault()}),console.log("initRepoCreate")}function initRepo(){$("#repo-clone-ssh").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-https").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))}),$("#repo-clone-https").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-ssh").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))});var e=$("#repo-clone-copy");e.hover(function(){Gogs.bindCopy($(this))}),e.tipsy({fade:!0})}function initHookTypeChange(){$("select#hook-type").on("change",function(){hookTypes=["Gogs","Slack"];var e=$(this).val();hookTypes.forEach(function(t){e===t?$("div#"+t.toLowerCase()).toggleShow():$("div#"+t.toLowerCase()).toggleHide()})})}function initRepoSetting(){var t=$("#repo_name"),n=$("#repo-setting-form");$("#change-reponame-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("repo-name")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("repo-name")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-reponame-submit").click(function(){$.magnificPopup.close(),n.submit()}),initHookTypeChange(),$("#transfer-repo-btn").magnificPopup({modal:!0}),$("#transfer-repo-submit").click(function(){$.magnificPopup.close(),$("#transfer-repo-form").submit()}),$("#delete-repo-btn").magnificPopup({modal:!0}),$("#delete-repo-submit").click(function(){$.magnificPopup.close(),$("#delete-repo-form").submit()}),$("#repo-collab-list hr:last-child").remove();var r=$("#repo-collaborator").next().next().find("ul");$("#repo-collaborator").on("keyup",function(){var e=$(this);return e.val()?void Gogs.searchUsers(e.val(),r):void r.toggleHide()}).on("focus",function(){$(this).val()?r.toggleShow():r.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#repo-collaborator").val($(this).text()),r.toggleHide()})}function initOrgSetting(){var t=$("#orgname"),n=$("#org-setting-form");$("#change-orgname-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("orgname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("orgname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-orgname-submit").click(function(){$.magnificPopup.close(),n.submit()}),$("#delete-org-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-org-submit").click(function(){$.magnificPopup.close(),$("#delete-org-form").submit()}),initHookTypeChange()}function initInvite(){var e=$("#org-member-invite-list");$("#org-member-invite").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-member-invite").val($(this).text()),e.toggleHide()})}function initOrgTeamCreate(){$("#org-team-delete").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-team-submit").click(function(){$.magnificPopup.close();var e=$("#team-create-form");e.attr("action",e.data("delete-url"))})}function initTeamMembersList(){var e=$("#org-team-members-list");$("#org-team-members-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-members-add").val($(this).text()),e.toggleHide()})}function initTeamRepositoriesList(){var e=$("#org-team-repositories-list");$("#org-team-repositories-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchRepos(t.val(),e,"uid="+t.data("uid")):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-repositories-add").val($(this).text()),e.toggleHide()})}function initAdmin(){$("#login-type").on("change",function(){var e=$(this).val();e.indexOf("0-")+1?($(".auth-name").toggleHide(),$(".pwd").find("input").attr("required","required").end().toggleShow()):($(".pwd").find("input").removeAttr("required").end().toggleHide(),$(".auth-name").toggleShow())}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close();var e=$("#user-profile-form");e.attr("action",e.data("delete-url"))}),$("#auth-type").on("change",function(){var e=$(this).val();2==e&&($(".ldap").toggleShow(),$(".smtp").toggleHide()),3==e&&($(".smtp").toggleShow(),$(".ldap").toggleHide())}),$("#delete-auth-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-auth-submit").click(function(){$.magnificPopup.close();var e=$("#auth-setting-form");e.attr("action",e.data("delete-url"))})}function initInstall(){!function(){var e="127.0.0.1:3306",t="127.0.0.1:5432";$("#install-database").on("change",function(){var n=$(this).val();"SQLite3"!=n?($(".server-sql").show(),$(".sqlite-setting").addClass("hide"),"PostgreSQL"==n?($(".pgsql-setting").removeClass("hide"),$("#database-host").val()==e&&$("#database-host").val(t)):"MySQL"==n?($(".pgsql-setting").addClass("hide"),$("#database-host").val()==t&&$("#database-host").val(e)):$(".pgsql-setting").addClass("hide")):($(".server-sql").hide(),$(".pgsql-setting").hide(),$(".sqlite-setting").removeClass("hide"))})}()}function initProfile(){$("#profile-avatar").tipsy({fade:!0})}function initTimeSwitch(){$(".time-since[title]").on("click",function(){var e=$(this),t=e.attr("title"),n=e.text();e.text(t),e.attr("title",n)})}function initDiff(){$(".diff-detail-box>a").click(function(){$($(this).data("target")).slideToggle(100)});var e=$(".diff-counter");e.length<1||e.each(function(e,t){var n=$(t),r=n.find("span[data-line].add").data("line"),i=n.find("span[data-line].del").data("line"),o=parseFloat(r)/(parseFloat(r)+parseFloat(i))*100;n.find(".bar .add").css("width",o+"%")})}function homepage(){$("#promo-form").submit(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/login",!0):void 0}),$("#register-button").click(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/sign_up",!0):void $("#promo-form").attr("action",Gogs.AppSubUrl+"/user/sign_up")})}!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=ot.type(e);return"function"===n||ot.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(ot.isFunction(t))return ot.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ot.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pt.test(t))return ot.filter(t,e,n);t=ot.filter(t,e)}return ot.grep(e,function(e){return ot.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=wt[e]={};return ot.each(e.match(xt)||[],function(e,n){t[n]=!0}),t}function a(){mt.addEventListener?(mt.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(mt.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(mt.addEventListener||"load"===event.type||"complete"===mt.readyState)&&(a(),ot.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace($t,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:Tt.test(n)?ot.parseJSON(n):n}catch(i){}ot.data(e,t,n)}else n=void 0}return n}function c(e){var t;for(t in e)if(("data"!==t||!ot.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(e,t,n,r){if(ot.acceptData(e)){var i,o,a=ot.expando,s=e.nodeType,l=s?ot.cache:e,c=s?e[a]:e[a]&&a;if(c&&l[c]&&(r||l[c].data)||void 0!==n||"string"!=typeof t)return c||(c=s?e[a]=V.pop()||ot.guid++:a),l[c]||(l[c]=s?{}:{toJSON:ot.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[c]=ot.extend(l[c],t):l[c].data=ot.extend(l[c].data,t)),o=l[c],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ot.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ot.camelCase(t)])):i=o,i}}function d(e,t,n){if(ot.acceptData(e)){var r,i,o=e.nodeType,a=o?ot.cache:e,s=o?e[ot.expando]:ot.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ot.isArray(t)?t=t.concat(ot.map(t,ot.camelCase)):t in r?t=[t]:(t=ot.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!c(r):!ot.isEmptyObject(r))return}(n||(delete a[s].data,c(a[s])))&&(o?ot.cleanData([e],!0):rt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return mt.activeElement}catch(e){}}function m(e){var t=Ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==St?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==St?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ot.nodeName(r,t)?o.push(r):ot.merge(o,g(r,t));return void 0===t||t&&ot.nodeName(e,t)?ot.merge([e],o):o}function v(e){Dt.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ot.nodeName(e,"table")&&ot.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ot.find.attr(e,"type"))+"/"+e.type,e}function x(e){var t=Zt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function w(e,t){for(var n,r=0;null!=(n=e[r]);r++)ot._data(n,"globalEval",!t||ot._data(t[r],"globalEval"))}function C(e,t){if(1===t.nodeType&&ot.hasData(e)){var n,r,i,o=ot._data(e),a=ot._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ot.event.add(t,n,s[n][r])}a.data&&(a.data=ot.extend({},a.data))}}function S(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!rt.noCloneEvent&&t[ot.expando]){i=ot._data(t);for(r in i.events)ot.removeEvent(t,r,i.handle);t.removeAttribute(ot.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,x(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),rt.html5Clone&&e.innerHTML&&!ot.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Dt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function k(t,n){var r,i=ot(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ot.css(i[0],"display");return i.detach(),o}function T(e){var t=mt,n=Jt[e];return n||(n=k(e,t),"none"!==n&&n||(Kt=(Kt||ot("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(Kt[0].contentWindow||Kt[0].contentDocument).document,t.write(),t.close(),n=k(e,t),Kt.detach()),Jt[e]=n),n}function E(e,t){return{get:function(){var n=e();return null!=n?n?void delete this.get:(this.get=t).apply(this,arguments):void 0}}}function N(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=pn.length;i--;)if(t=pn[i]+n,t in e)return t;return r}function L(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=ot._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[a]=ot._data(r,"olddisplay",T(r.nodeName)))):(i=Lt(r),(n&&"none"!==n||!i)&&ot._data(r,"olddisplay",i?n:ot.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function A(e,t,n){var r=cn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function D(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=ot.css(e,n+Nt[o],!0,i)),r?("content"===n&&(a-=ot.css(e,"padding"+Nt[o],!0,i)),"margin"!==n&&(a-=ot.css(e,"border"+Nt[o]+"Width",!0,i))):(a+=ot.css(e,"padding"+Nt[o],!0,i),"padding"!==n&&(a+=ot.css(e,"border"+Nt[o]+"Width",!0,i)));return a}function j(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=nn(e),a=rt.boxSizing&&"border-box"===ot.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=rn(e,t,o),(0>i||null==i)&&(i=e.style[t]),tn.test(i))return i;r=a&&(rt.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+D(e,t,n||(a?"border":"content"),r,o)+"px"}function R(e,t,n,r,i){return new R.prototype.init(e,t,n,r,i)}function P(){return setTimeout(function(){hn=void 0}),hn=ot.now()}function _(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Nt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function H(e,t,n){for(var r,i=(xn[t]||[]).concat(xn["*"]),o=0,a=i.length;a>o;o++)if(r=i[o].call(n,t,e))return r}function O(e,t,n){var r,i,o,a,s,l,c,u,d=this,f={},p=e.style,h=e.nodeType&&Lt(e),m=ot._data(e,"fxshow");n.queue||(s=ot._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,d.always(function(){d.always(function(){s.unqueued--,ot.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],c=ot.css(e,"display"),u="none"===c?ot._data(e,"olddisplay")||T(e.nodeName):c,"inline"===u&&"none"===ot.css(e,"float")&&(rt.inlineBlockNeedsLayout&&"inline"!==T(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",rt.shrinkWrapBlocks()||d.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],gn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!m||void 0===m[r])continue;h=!0}f[r]=m&&m[r]||ot.style(e,r)}else c=void 0;if(ot.isEmptyObject(f))"inline"===("none"===c?T(e.nodeName):c)&&(p.display=c);else{m?"hidden"in m&&(h=m.hidden):m=ot._data(e,"fxshow",{}),o&&(m.hidden=!h),h?ot(e).show():d.done(function(){ot(e).hide()}),d.done(function(){var t;ot._removeData(e,"fxshow");for(t in f)ot.style(e,t,f[t])});for(r in f)a=H(h?m[r]:0,r,d),r in m||(m[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function q(e,t){var n,r,i,o,a;for(n in e)if(r=ot.camelCase(n),i=t[r],o=e[n],ot.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=ot.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function M(e,t,n){var r,i,o=0,a=bn.length,s=ot.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var t=hn||P(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,o=1-r,a=0,l=c.tweens.length;l>a;a++)c.tweens[a].run(o);return s.notifyWith(e,[c,o,n]),1>o&&l?n:(s.resolveWith(e,[c]),!1)},c=s.promise({elem:e,props:ot.extend({},t),opts:ot.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:hn||P(),duration:n.duration,tweens:[],createTween:function(t,n){var r=ot.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)c.tweens[n].run(1);return t?s.resolveWith(e,[c,t]):s.rejectWith(e,[c,t]),this}}),u=c.props;for(q(u,c.opts.specialEasing);a>o;o++)if(r=bn[o].call(c,e,u,c.opts))return r;return ot.map(u,H,c),ot.isFunction(c.opts.start)&&c.opts.start.call(e,c),ot.fx.timer(ot.extend(l,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(xt)||[];if(ot.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function F(e,t,n,r){function i(s){var l;return o[s]=!0,ot.each(e[s]||[],function(e,s){var c=s(t,n,r);return"string"!=typeof c||a||o[c]?a?!(l=c):void 0:(t.dataTypes.unshift(c),i(c),!1)}),l}var o={},a=e===Wn;return i(t.dataTypes[0])||!o["*"]&&i("*")}function I(e,t){var n,r,i=ot.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&ot.extend(!0,e,n),e}function B(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){l.unshift(a);break}if(l[0]in n)o=l[0];else{for(a in n){if(!l[0]||e.converters[a+" "+l[0]]){o=a;break}r||(r=a)}o=o||r}return o?(o!==l[0]&&l.unshift(o),n[o]):void 0}function W(e,t,n,r){var i,o,a,s,l,c={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=u.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=u.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=c[l+" "+o]||c["* "+o],!a)for(i in c)if(s=i.split(" "),s[1]===o&&(a=c[l+" "+s[0]]||c["* "+s[0]])){a===!0?a=c[i]:c[i]!==!0&&(o=s[0],u.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(d){return{state:"parsererror",error:a?d:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}function U(e,t,n,r){var i;if(ot.isArray(t))ot.each(t,function(t,i){n||Gn.test(e)?r(e,i):U(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==ot.type(t))r(e,t);else for(i in t)U(e+"["+i+"]",t[i],n,r)}function X(){try{return new e.XMLHttpRequest}catch(t){}}function Z(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function G(e){return ot.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var V=[],Q=V.slice,Y=V.concat,K=V.push,J=V.indexOf,et={},tt=et.toString,nt=et.hasOwnProperty,rt={},it="1.11.1",ot=function(e,t){return new ot.fn.init(e,t)},at=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,st=/^-ms-/,lt=/-([\da-z])/gi,ct=function(e,t){return t.toUpperCase()};ot.fn=ot.prototype={jquery:it,constructor:ot,selector:"",length:0,toArray:function(){return Q.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:Q.call(this)},pushStack:function(e){var t=ot.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return ot.each(this,e,t)},map:function(e){return this.pushStack(ot.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(Q.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:K,sort:V.sort,splice:V.splice},ot.extend=ot.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,l=arguments.length,c=!1;for("boolean"==typeof a&&(c=a,a=arguments[s]||{},s++),"object"==typeof a||ot.isFunction(a)||(a={}),s===l&&(a=this,s--);l>s;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(c&&n&&(ot.isPlainObject(n)||(t=ot.isArray(n)))?(t?(t=!1,o=e&&ot.isArray(e)?e:[]):o=e&&ot.isPlainObject(e)?e:{},a[r]=ot.extend(c,o,n)):void 0!==n&&(a[r]=n));return a},ot.extend({expando:"jQuery"+(it+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===ot.type(e)},isArray:Array.isArray||function(e){return"array"===ot.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!ot.isArray(e)&&e-parseFloat(e)>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==ot.type(e)||e.nodeType||ot.isWindow(e))return!1;try{if(e.constructor&&!nt.call(e,"constructor")&&!nt.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(rt.ownLast)for(t in e)return nt.call(e,t);for(t in e);return void 0===t||nt.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?et[tt.call(e)]||"object":typeof e},globalEval:function(t){t&&ot.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(st,"ms-").replace(lt,ct)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(at,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?ot.merge(r,"string"==typeof e?[e]:e):K.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(J)return J.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;n>r;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;a>o;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),l=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&l.push(i);else for(o in e)i=t(e[o],o,r),null!=i&&l.push(i);return Y.apply([],l)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(i=e[t],t=e,e=i),ot.isFunction(e)?(n=Q.call(arguments,2),r=function(){return e.apply(t||this,n.concat(Q.call(arguments)))},r.guid=e.guid=e.guid||ot.guid++,r):void 0},now:function(){return+new Date},support:rt}),ot.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){et["[object "+t+"]"]=t.toLowerCase()});var ut=function(e){function t(e,t,n,r){var i,o,a,s,l,c,d,p,h,m;if((t?t.ownerDocument||t:F)!==R&&j(t),t=t||R,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(_&&!r){if(i=yt.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&M(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return et.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&w.getElementsByClassName&&t.getElementsByClassName)return et.apply(n,t.getElementsByClassName(a)),n}if(w.qsa&&(!H||!H.test(e))){if(p=d=z,h=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(c=T(e),(d=t.getAttribute("id"))?p=d.replace(xt,"\\$&"):t.setAttribute("id",p),p="[id='"+p+"'] ",l=c.length;l--;)c[l]=p+f(c[l]);h=bt.test(e)&&u(t.parentNode)||t,m=c.join(",")}if(m)try{return et.apply(n,h.querySelectorAll(m)),n}catch(g){}finally{d||t.removeAttribute("id")}}}return N(e.replace(ct,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>C.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[z]=!0,e}function i(e){var t=R.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)C.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function u(e){return e&&typeof e.getElementsByTagName!==G&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,c=[I,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[z]||(t[z]={}),(s=l[r])&&s[0]===I&&s[1]===o)return c[2]=s[2];if(l[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var i=0,o=n.length;o>i;i++)t(e,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,c=null!=t;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),c&&t.push(s));return a}function v(e,t,n,i,o,a){return i&&!i[z]&&(i=v(i)),o&&!o[z]&&(o=v(o,a)),r(function(r,a,s,l){var c,u,d,f=[],p=[],h=a.length,v=r||m(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?v:g(v,f,e,s,l),b=n?o||(r?e:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(c=g(b,p),i(c,[],s,l),u=c.length;u--;)(d=c[u])&&(b[p[u]]=!(y[p[u]]=d));if(r){if(o||e){if(o){for(c=[],u=b.length;u--;)(d=b[u])&&c.push(y[u]=d);o(null,b=[],c,l)}for(u=b.length;u--;)(d=b[u])&&(c=o?nt.call(r,d):f[u])>-1&&(r[c]=!(a[c]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):et.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=C.relative[e[0].type],a=o||C.relative[" "],s=o?1:0,l=p(function(e){return e===t},a,!0),c=p(function(e){return nt.call(t,e)>-1},a,!0),u=[function(e,n,r){return!o&&(r||n!==L)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];i>s;s++)if(n=C.relative[e[s].type])u=[p(h(u),n)];else{if(n=C.filter[e[s].type].apply(null,e[s].matches),n[z]){for(r=++s;i>r&&!C.relative[e[r].type];r++);return v(s>1&&h(u),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ct,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&f(e))}u.push(n)}return h(u)}function b(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,l,c){var u,d,f,p=0,h="0",m=r&&[],v=[],y=L,b=r||o&&C.find.TAG("*",c),x=I+=null==y?1:Math.random()||.1,w=b.length;for(c&&(L=a!==R&&a);h!==w&&null!=(u=b[h]);h++){if(o&&u){for(d=0;f=e[d++];)if(f(u,a,s)){l.push(u);break}c&&(I=x)}i&&((u=!f&&u)&&p--,r&&m.push(u))}if(p+=h,i&&h!==p){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(p>0)for(;h--;)m[h]||v[h]||(v[h]=K.call(l));v=g(v)}et.apply(l,v),c&&!r&&v.length>0&&p+n.length>1&&t.uniqueSort(l)}return c&&(I=x,L=y),m};return i?r(a):a}var x,w,C,S,k,T,E,N,L,A,D,j,R,P,_,H,O,q,M,z="sizzle"+-new Date,F=e.document,I=0,B=0,W=n(),U=n(),X=n(),Z=function(e,t){return e===t&&(D=!0),0},G="undefined",V=1<<31,Q={}.hasOwnProperty,Y=[],K=Y.pop,J=Y.push,et=Y.push,tt=Y.slice,nt=Y.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},rt="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",it="[\\x20\\t\\r\\n\\f]",ot="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",at=ot.replace("w","w#"),st="\\["+it+"*("+ot+")(?:"+it+"*([*^$|!~]?=)"+it+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+at+"))|)"+it+"*\\]",lt=":("+ot+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+st+")*)|.*)\\)|)",ct=new RegExp("^"+it+"+|((?:^|[^\\\\])(?:\\\\.)*)"+it+"+$","g"),ut=new RegExp("^"+it+"*,"+it+"*"),dt=new RegExp("^"+it+"*([>+~]|"+it+")"+it+"*"),ft=new RegExp("="+it+"*([^\\]'\"]*?)"+it+"*\\]","g"),pt=new RegExp(lt),ht=new RegExp("^"+at+"$"),mt={ID:new RegExp("^#("+ot+")"),CLASS:new RegExp("^\\.("+ot+")"),TAG:new RegExp("^("+ot.replace("w","w*")+")"),ATTR:new RegExp("^"+st),PSEUDO:new RegExp("^"+lt),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+it+"*(even|odd|(([+-]|)(\\d*)n|)"+it+"*(?:([+-]|)"+it+"*(\\d+)|))"+it+"*\\)|)","i"),bool:new RegExp("^(?:"+rt+")$","i"),needsContext:new RegExp("^"+it+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+it+"*((?:-\\d)?\\d*)"+it+"*\\)|)(?=[^-]|$)","i")},gt=/^(?:input|select|textarea|button)$/i,vt=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,bt=/[+~]/,xt=/'|\\/g,wt=new RegExp("\\\\([\\da-f]{1,6}"+it+"?|("+it+")|.)","ig"),Ct=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{et.apply(Y=tt.call(F.childNodes),F.childNodes),Y[F.childNodes.length].nodeType}catch(St){et={apply:Y.length?function(e,t){J.apply(e,tt.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},j=t.setDocument=function(e){var t,n=e?e.ownerDocument||e:F,r=n.defaultView;return n!==R&&9===n.nodeType&&n.documentElement?(R=n,P=n.documentElement,_=!k(n),r&&r!==r.top&&(r.addEventListener?r.addEventListener("unload",function(){j()},!1):r.attachEvent&&r.attachEvent("onunload",function(){j()})),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=$.test(n.getElementsByClassName)&&i(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),w.getById=i(function(e){return P.appendChild(e).id=z,!n.getElementsByName||!n.getElementsByName(z).length
+function Tabs(e){function t(e){console.log("hide",e),e.removeClass("js-tab-nav-show"),$(e.data("tab-target")).removeClass("js-tab-show").hide()}function n(e){console.log("show",e),e.addClass("js-tab-nav-show"),$(e.data("tab-target")).addClass("js-tab-show").show()}var r=$(e);if(r.length){var i=r.find(".js-tab-nav-show");i.length&&$(i.data("tab-target")).addClass("js-tab-show"),r.on("click",".js-tab-nav",function(e){e.preventDefault();var o=$(this);o.hasClass("js-tab-nav-show")||(i=r.find(".js-tab-nav-show").eq(0),t(i),n(o))}),console.log("init tabs @",e)}}function Preview(e,t){function n(e){return e.find(".js-preview-input").eq(0)}function r(e){return e.hasClass("js-preview-container")?e:e.find(".js-preview-container").eq(0)}var i=$(e),o=$(t),a=n(o);if(!a.length)return void console.log("[preview]: no preview input");var s=r(o);return s.length?(i.on("click",function(){$.post("/api/v1/markdown",{text:a.val()},function(e){s.html(e)})}),void console.log("[preview]: init preview @",e,"&",t)):void console.log("[preview]: no preview container")}function initCore(){Gogs.renderMarkdown(),Gogs.renderCodeView(),$(".js-tab-nav").click(function(e){$(this).hasClass("js-tab-nav-show")||($(this).parent().find(".js-tab-nav-show").each(function(){$(this).removeClass("js-tab-nav-show"),$($(this).data("tab-target")).hide()}),$(this).addClass("js-tab-nav-show"),$($(this).data("tab-target")).show()),e.preventDefault()}),$(document).on("click",".popup-modal-dismiss",function(e){e.preventDefault(),$.magnificPopup.close()}),$(".collapse").hide(),$(".tipsy-tooltip").tipsy({fade:!0})}function initUserSetting(){var t=$("#username"),n=$("#user-profile-form");$("#change-username-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("uname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("uname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-username-submit").click(function(){$.magnificPopup.close(),n.submit()}),$(".show-form-btn").click(function(){$($(this).data("target-form")).removeClass("hide")}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close(),$("#delete-account-form").submit()})}function initRepoCreate(){$("#repo-create-owner-list").on("click","li",function(){if(!$(this).hasClass("checked")){var e=$(this).data("uid");$("#repo-owner-id").val(e),$("#repo-owner-avatar").attr("src",$(this).find("img").attr("src")),$("#repo-owner-name").text($(this).text().trim()),$(this).parent().find(".checked").removeClass("checked"),$(this).addClass("checked"),console.log("set repo owner to uid :",e,$(this).text().trim())}}),$("#auth-button").click(function(e){$("#repo-migrate-auth").slideToggle("fast"),e.preventDefault()}),console.log("initRepoCreate")}function initRepo(){$("#repo-clone-ssh").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-https").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))}),$("#repo-clone-https").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-ssh").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))});var e=$("#repo-clone-copy");e.hover(function(){Gogs.bindCopy($(this))}),e.tipsy({fade:!0})}function initHookTypeChange(){$("select#hook-type").on("change",function(){hookTypes=["Gogs","Slack"];var e=$(this).val();hookTypes.forEach(function(t){e===t?$("div#"+t.toLowerCase()).toggleShow():$("div#"+t.toLowerCase()).toggleHide()})})}function initRepoSetting(){var t=$("#repo_name"),n=$("#repo-setting-form");$("#change-reponame-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("repo-name")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("repo-name")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-reponame-submit").click(function(){$.magnificPopup.close(),n.submit()}),initHookTypeChange(),$("#transfer-repo-btn").magnificPopup({modal:!0}),$("#transfer-repo-submit").click(function(){$.magnificPopup.close(),$("#transfer-repo-form").submit()}),$("#delete-repo-btn").magnificPopup({modal:!0}),$("#delete-repo-submit").click(function(){$.magnificPopup.close(),$("#delete-repo-form").submit()}),$("#repo-collab-list hr:last-child").remove();var r=$("#repo-collaborator").next().next().find("ul");$("#repo-collaborator").on("keyup",function(){var e=$(this);return e.val()?void Gogs.searchUsers(e.val(),r):void r.toggleHide()}).on("focus",function(){$(this).val()?r.toggleShow():r.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#repo-collaborator").val($(this).text()),r.toggleHide()})}function initOrgSetting(){var t=$("#orgname"),n=$("#org-setting-form");$("#change-orgname-btn").magnificPopup({modal:!0,callbacks:{open:function(){t.data("orgname")==t.val()&&($.magnificPopup.close(),n.submit())}}}).click(function(){return t.data("orgname")!=t.val()?(e.preventDefault(),!0):void 0}),$("#change-orgname-submit").click(function(){$.magnificPopup.close(),n.submit()}),$("#delete-org-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-org-submit").click(function(){$.magnificPopup.close(),$("#delete-org-form").submit()}),initHookTypeChange()}function initInvite(){var e=$("#org-member-invite-list");$("#org-member-invite").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-member-invite").val($(this).text()),e.toggleHide()})}function initOrgTeamCreate(){$("#org-team-delete").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-team-submit").click(function(){$.magnificPopup.close();var e=$("#team-create-form");e.attr("action",e.data("delete-url"))})}function initTeamMembersList(){var e=$("#org-team-members-list");$("#org-team-members-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-members-add").val($(this).text()),e.toggleHide()})}function initTeamRepositoriesList(){var e=$("#org-team-repositories-list");$("#org-team-repositories-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchRepos(t.val(),e,"uid="+t.data("uid")):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-repositories-add").val($(this).text()),e.toggleHide()})}function initAdmin(){$("#login-type").on("change",function(){var e=$(this).val();e.indexOf("0-")+1?($(".auth-name").toggleHide(),$(".pwd").find("input").attr("required","required").end().toggleShow()):($(".pwd").find("input").removeAttr("required").end().toggleHide(),$(".auth-name").toggleShow())}),$("#delete-account-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-account-submit").click(function(){$.magnificPopup.close();var e=$("#user-profile-form");e.attr("action",e.data("delete-url"))}),$("#auth-type").on("change",function(){var e=$(this).val();2==e&&($(".ldap").toggleShow(),$(".smtp").toggleHide()),3==e&&($(".smtp").toggleShow(),$(".ldap").toggleHide())}),$("#delete-auth-btn").magnificPopup({modal:!0}).click(function(e){return e.preventDefault(),!0}),$("#delete-auth-submit").click(function(){$.magnificPopup.close();var e=$("#auth-setting-form");e.attr("action",e.data("delete-url"))})}function initInstall(){!function(){var e="127.0.0.1:3306",t="127.0.0.1:5432";$("#install-database").on("change",function(){var n=$(this).val();"SQLite3"!=n?($(".server-sql").show(),$(".sqlite-setting").addClass("hide"),"PostgreSQL"==n?($(".pgsql-setting").removeClass("hide"),$("#database-host").val()==e&&$("#database-host").val(t)):"MySQL"==n?($(".pgsql-setting").addClass("hide"),$("#database-host").val()==t&&$("#database-host").val(e)):$(".pgsql-setting").addClass("hide")):($(".server-sql").hide(),$(".pgsql-setting").hide(),$(".sqlite-setting").removeClass("hide"))})}()}function initProfile(){$("#profile-avatar").tipsy({fade:!0})}function initTimeSwitch(){$(".time-since[title]").on("click",function(){var e=$(this),t=e.attr("title"),n=e.text();e.text(t),e.attr("title",n)})}function initDiff(){$(".diff-detail-box>a").click(function(){$($(this).data("target")).slideToggle(100)});var e=$(".diff-counter");e.length<1||e.each(function(e,t){var n=$(t),r=n.find("span[data-line].add").data("line"),i=n.find("span[data-line].del").data("line"),o=parseFloat(r)/(parseFloat(r)+parseFloat(i))*100;n.find(".bar .add").css("width",o+"%")})}function homepage(){$("#promo-form").submit(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/login",!0):void 0}),$("#register-button").click(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/sign_up",!0):void $("#promo-form").attr("action",Gogs.AppSubUrl+"/user/sign_up")})}!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=ot.type(e);return"function"===n||ot.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(ot.isFunction(t))return ot.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ot.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pt.test(t))return ot.filter(t,e,n);t=ot.filter(t,e)}return ot.grep(e,function(e){return ot.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=wt[e]={};return ot.each(e.match(xt)||[],function(e,n){t[n]=!0}),t}function a(){mt.addEventListener?(mt.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(mt.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(mt.addEventListener||"load"===event.type||"complete"===mt.readyState)&&(a(),ot.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace($t,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:Tt.test(n)?ot.parseJSON(n):n}catch(i){}ot.data(e,t,n)}else n=void 0}return n}function c(e){var t;for(t in e)if(("data"!==t||!ot.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(e,t,n,r){if(ot.acceptData(e)){var i,o,a=ot.expando,s=e.nodeType,l=s?ot.cache:e,c=s?e[a]:e[a]&&a;if(c&&l[c]&&(r||l[c].data)||void 0!==n||"string"!=typeof t)return c||(c=s?e[a]=V.pop()||ot.guid++:a),l[c]||(l[c]=s?{}:{toJSON:ot.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[c]=ot.extend(l[c],t):l[c].data=ot.extend(l[c].data,t)),o=l[c],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ot.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ot.camelCase(t)])):i=o,i}}function d(e,t,n){if(ot.acceptData(e)){var r,i,o=e.nodeType,a=o?ot.cache:e,s=o?e[ot.expando]:ot.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ot.isArray(t)?t=t.concat(ot.map(t,ot.camelCase)):t in r?t=[t]:(t=ot.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!c(r):!ot.isEmptyObject(r))return}(n||(delete a[s].data,c(a[s])))&&(o?ot.cleanData([e],!0):rt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return mt.activeElement}catch(e){}}function m(e){var t=Ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==St?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==St?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ot.nodeName(r,t)?o.push(r):ot.merge(o,g(r,t));return void 0===t||t&&ot.nodeName(e,t)?ot.merge([e],o):o}function v(e){Dt.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ot.nodeName(e,"table")&&ot.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ot.find.attr(e,"type"))+"/"+e.type,e}function x(e){var t=Zt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function w(e,t){for(var n,r=0;null!=(n=e[r]);r++)ot._data(n,"globalEval",!t||ot._data(t[r],"globalEval"))}function C(e,t){if(1===t.nodeType&&ot.hasData(e)){var n,r,i,o=ot._data(e),a=ot._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ot.event.add(t,n,s[n][r])}a.data&&(a.data=ot.extend({},a.data))}}function S(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!rt.noCloneEvent&&t[ot.expando]){i=ot._data(t);for(r in i.events)ot.removeEvent(t,r,i.handle);t.removeAttribute(ot.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,x(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),rt.html5Clone&&e.innerHTML&&!ot.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Dt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function k(t,n){var r,i=ot(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ot.css(i[0],"display");return i.detach(),o}function T(e){var t=mt,n=Jt[e];return n||(n=k(e,t),"none"!==n&&n||(Kt=(Kt||ot("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(Kt[0].contentWindow||Kt[0].contentDocument).document,t.write(),t.close(),n=k(e,t),Kt.detach()),Jt[e]=n),n}function E(e,t){return{get:function(){var n=e();return null!=n?n?void delete this.get:(this.get=t).apply(this,arguments):void 0}}}function N(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=pn.length;i--;)if(t=pn[i]+n,t in e)return t;return r}function L(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=ot._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[a]=ot._data(r,"olddisplay",T(r.nodeName)))):(i=Lt(r),(n&&"none"!==n||!i)&&ot._data(r,"olddisplay",i?n:ot.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function A(e,t,n){var r=cn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function D(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=ot.css(e,n+Nt[o],!0,i)),r?("content"===n&&(a-=ot.css(e,"padding"+Nt[o],!0,i)),"margin"!==n&&(a-=ot.css(e,"border"+Nt[o]+"Width",!0,i))):(a+=ot.css(e,"padding"+Nt[o],!0,i),"padding"!==n&&(a+=ot.css(e,"border"+Nt[o]+"Width",!0,i)));return a}function j(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=nn(e),a=rt.boxSizing&&"border-box"===ot.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=rn(e,t,o),(0>i||null==i)&&(i=e.style[t]),tn.test(i))return i;r=a&&(rt.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+D(e,t,n||(a?"border":"content"),r,o)+"px"}function R(e,t,n,r,i){return new R.prototype.init(e,t,n,r,i)}function P(){return setTimeout(function(){hn=void 0}),hn=ot.now()}function _(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Nt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function H(e,t,n){for(var r,i=(xn[t]||[]).concat(xn["*"]),o=0,a=i.length;a>o;o++)if(r=i[o].call(n,t,e))return r}function O(e,t,n){var r,i,o,a,s,l,c,u,d=this,f={},p=e.style,h=e.nodeType&&Lt(e),m=ot._data(e,"fxshow");n.queue||(s=ot._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,d.always(function(){d.always(function(){s.unqueued--,ot.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],c=ot.css(e,"display"),u="none"===c?ot._data(e,"olddisplay")||T(e.nodeName):c,"inline"===u&&"none"===ot.css(e,"float")&&(rt.inlineBlockNeedsLayout&&"inline"!==T(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",rt.shrinkWrapBlocks()||d.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],gn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!m||void 0===m[r])continue;h=!0}f[r]=m&&m[r]||ot.style(e,r)}else c=void 0;if(ot.isEmptyObject(f))"inline"===("none"===c?T(e.nodeName):c)&&(p.display=c);else{m?"hidden"in m&&(h=m.hidden):m=ot._data(e,"fxshow",{}),o&&(m.hidden=!h),h?ot(e).show():d.done(function(){ot(e).hide()}),d.done(function(){var t;ot._removeData(e,"fxshow");for(t in f)ot.style(e,t,f[t])});for(r in f)a=H(h?m[r]:0,r,d),r in m||(m[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function q(e,t){var n,r,i,o,a;for(n in e)if(r=ot.camelCase(n),i=t[r],o=e[n],ot.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=ot.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function M(e,t,n){var r,i,o=0,a=bn.length,s=ot.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;for(var t=hn||P(),n=Math.max(0,c.startTime+c.duration-t),r=n/c.duration||0,o=1-r,a=0,l=c.tweens.length;l>a;a++)c.tweens[a].run(o);return s.notifyWith(e,[c,o,n]),1>o&&l?n:(s.resolveWith(e,[c]),!1)},c=s.promise({elem:e,props:ot.extend({},t),opts:ot.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:hn||P(),duration:n.duration,tweens:[],createTween:function(t,n){var r=ot.Tween(e,c.opts,t,n,c.opts.specialEasing[t]||c.opts.easing);return c.tweens.push(r),r},stop:function(t){var n=0,r=t?c.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)c.tweens[n].run(1);return t?s.resolveWith(e,[c,t]):s.rejectWith(e,[c,t]),this}}),u=c.props;for(q(u,c.opts.specialEasing);a>o;o++)if(r=bn[o].call(c,e,u,c.opts))return r;return ot.map(u,H,c),ot.isFunction(c.opts.start)&&c.opts.start.call(e,c),ot.fx.timer(ot.extend(l,{elem:e,anim:c,queue:c.opts.queue})),c.progress(c.opts.progress).done(c.opts.done,c.opts.complete).fail(c.opts.fail).always(c.opts.always)}function z(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(xt)||[];if(ot.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function F(e,t,n,r){function i(s){var l;return o[s]=!0,ot.each(e[s]||[],function(e,s){var c=s(t,n,r);return"string"!=typeof c||a||o[c]?a?!(l=c):void 0:(t.dataTypes.unshift(c),i(c),!1)}),l}var o={},a=e===Wn;return i(t.dataTypes[0])||!o["*"]&&i("*")}function I(e,t){var n,r,i=ot.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&ot.extend(!0,e,n),e}function B(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){l.unshift(a);break}if(l[0]in n)o=l[0];else{for(a in n){if(!l[0]||e.converters[a+" "+l[0]]){o=a;break}r||(r=a)}o=o||r}return o?(o!==l[0]&&l.unshift(o),n[o]):void 0}function W(e,t,n,r){var i,o,a,s,l,c={},u=e.dataTypes.slice();if(u[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=u.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=u.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=c[l+" "+o]||c["* "+o],!a)for(i in c)if(s=i.split(" "),s[1]===o&&(a=c[l+" "+s[0]]||c["* "+s[0]])){a===!0?a=c[i]:c[i]!==!0&&(o=s[0],u.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(d){return{state:"parsererror",error:a?d:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}function U(e,t,n,r){var i;if(ot.isArray(t))ot.each(t,function(t,i){n||Gn.test(e)?r(e,i):U(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==ot.type(t))r(e,t);else for(i in t)U(e+"["+i+"]",t[i],n,r)}function X(){try{return new e.XMLHttpRequest}catch(t){}}function Z(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function G(e){return ot.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var V=[],Q=V.slice,Y=V.concat,K=V.push,J=V.indexOf,et={},tt=et.toString,nt=et.hasOwnProperty,rt={},it="1.11.1",ot=function(e,t){return new ot.fn.init(e,t)},at=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,st=/^-ms-/,lt=/-([\da-z])/gi,ct=function(e,t){return t.toUpperCase()};ot.fn=ot.prototype={jquery:it,constructor:ot,selector:"",length:0,toArray:function(){return Q.call(this)},get:function(e){return null!=e?0>e?this[e+this.length]:this[e]:Q.call(this)},pushStack:function(e){var t=ot.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return ot.each(this,e,t)},map:function(e){return this.pushStack(ot.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(Q.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:K,sort:V.sort,splice:V.splice},ot.extend=ot.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,l=arguments.length,c=!1;for("boolean"==typeof a&&(c=a,a=arguments[s]||{},s++),"object"==typeof a||ot.isFunction(a)||(a={}),s===l&&(a=this,s--);l>s;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(c&&n&&(ot.isPlainObject(n)||(t=ot.isArray(n)))?(t?(t=!1,o=e&&ot.isArray(e)?e:[]):o=e&&ot.isPlainObject(e)?e:{},a[r]=ot.extend(c,o,n)):void 0!==n&&(a[r]=n));return a},ot.extend({expando:"jQuery"+(it+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===ot.type(e)},isArray:Array.isArray||function(e){return"array"===ot.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!ot.isArray(e)&&e-parseFloat(e)>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==ot.type(e)||e.nodeType||ot.isWindow(e))return!1;try{if(e.constructor&&!nt.call(e,"constructor")&&!nt.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(rt.ownLast)for(t in e)return nt.call(e,t);for(t in e);return void 0===t||nt.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?et[tt.call(e)]||"object":typeof e},globalEval:function(t){t&&ot.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(st,"ms-").replace(lt,ct)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(at,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?ot.merge(r,"string"==typeof e?[e]:e):K.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(J)return J.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;n>r;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;a>o;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),l=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&l.push(i);else for(o in e)i=t(e[o],o,r),null!=i&&l.push(i);return Y.apply([],l)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(i=e[t],t=e,e=i),ot.isFunction(e)?(n=Q.call(arguments,2),r=function(){return e.apply(t||this,n.concat(Q.call(arguments)))},r.guid=e.guid=e.guid||ot.guid++,r):void 0},now:function(){return+new Date},support:rt}),ot.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){et["[object "+t+"]"]=t.toLowerCase()});var ut=function(e){function t(e,t,n,r){var i,o,a,s,l,c,d,p,h,m;if((t?t.ownerDocument||t:F)!==R&&j(t),t=t||R,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(_&&!r){if(i=yt.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&M(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return et.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&w.getElementsByClassName&&t.getElementsByClassName)return et.apply(n,t.getElementsByClassName(a)),n}if(w.qsa&&(!H||!H.test(e))){if(p=d=z,h=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(c=T(e),(d=t.getAttribute("id"))?p=d.replace(xt,"\\$&"):t.setAttribute("id",p),p="[id='"+p+"'] ",l=c.length;l--;)c[l]=p+f(c[l]);h=bt.test(e)&&u(t.parentNode)||t,m=c.join(",")}if(m)try{return et.apply(n,h.querySelectorAll(m)),n}catch(g){}finally{d||t.removeAttribute("id")}}}return N(e.replace(ct,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>C.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[z]=!0,e}function i(e){var t=R.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)C.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function u(e){return e&&typeof e.getElementsByTagName!==G&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=B++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,c=[I,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[z]||(t[z]={}),(s=l[r])&&s[0]===I&&s[1]===o)return c[2]=s[2];if(l[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(e,n,r){for(var i=0,o=n.length;o>i;i++)t(e,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,c=null!=t;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),c&&t.push(s));return a}function v(e,t,n,i,o,a){return i&&!i[z]&&(i=v(i)),o&&!o[z]&&(o=v(o,a)),r(function(r,a,s,l){var c,u,d,f=[],p=[],h=a.length,v=r||m(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?v:g(v,f,e,s,l),b=n?o||(r?e:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(c=g(b,p),i(c,[],s,l),u=c.length;u--;)(d=c[u])&&(b[p[u]]=!(y[p[u]]=d));if(r){if(o||e){if(o){for(c=[],u=b.length;u--;)(d=b[u])&&c.push(y[u]=d);o(null,b=[],c,l)}for(u=b.length;u--;)(d=b[u])&&(c=o?nt.call(r,d):f[u])>-1&&(r[c]=!(a[c]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):et.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=C.relative[e[0].type],a=o||C.relative[" "],s=o?1:0,l=p(function(e){return e===t},a,!0),c=p(function(e){return nt.call(t,e)>-1},a,!0),u=[function(e,n,r){return!o&&(r||n!==L)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];i>s;s++)if(n=C.relative[e[s].type])u=[p(h(u),n)];else{if(n=C.filter[e[s].type].apply(null,e[s].matches),n[z]){for(r=++s;i>r&&!C.relative[e[r].type];r++);return v(s>1&&h(u),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ct,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&f(e))}u.push(n)}return h(u)}function b(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,l,c){var u,d,f,p=0,h="0",m=r&&[],v=[],y=L,b=r||o&&C.find.TAG("*",c),x=I+=null==y?1:Math.random()||.1,w=b.length;for(c&&(L=a!==R&&a);h!==w&&null!=(u=b[h]);h++){if(o&&u){for(d=0;f=e[d++];)if(f(u,a,s)){l.push(u);break}c&&(I=x)}i&&((u=!f&&u)&&p--,r&&m.push(u))}if(p+=h,i&&h!==p){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(p>0)for(;h--;)m[h]||v[h]||(v[h]=K.call(l));v=g(v)}et.apply(l,v),c&&!r&&v.length>0&&p+n.length>1&&t.uniqueSort(l)}return c&&(I=x,L=y),m};return i?r(a):a}var x,w,C,S,k,T,E,N,L,A,D,j,R,P,_,H,O,q,M,z="sizzle"+-new Date,F=e.document,I=0,B=0,W=n(),U=n(),X=n(),Z=function(e,t){return e===t&&(D=!0),0},G="undefined",V=1<<31,Q={}.hasOwnProperty,Y=[],K=Y.pop,J=Y.push,et=Y.push,tt=Y.slice,nt=Y.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},rt="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",it="[\\x20\\t\\r\\n\\f]",ot="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",at=ot.replace("w","w#"),st="\\["+it+"*("+ot+")(?:"+it+"*([*^$|!~]?=)"+it+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+at+"))|)"+it+"*\\]",lt=":("+ot+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+st+")*)|.*)\\)|)",ct=new RegExp("^"+it+"+|((?:^|[^\\\\])(?:\\\\.)*)"+it+"+$","g"),ut=new RegExp("^"+it+"*,"+it+"*"),dt=new RegExp("^"+it+"*([>+~]|"+it+")"+it+"*"),ft=new RegExp("="+it+"*([^\\]'\"]*?)"+it+"*\\]","g"),pt=new RegExp(lt),ht=new RegExp("^"+at+"$"),mt={ID:new RegExp("^#("+ot+")"),CLASS:new RegExp("^\\.("+ot+")"),TAG:new RegExp("^("+ot.replace("w","w*")+")"),ATTR:new RegExp("^"+st),PSEUDO:new RegExp("^"+lt),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+it+"*(even|odd|(([+-]|)(\\d*)n|)"+it+"*(?:([+-]|)"+it+"*(\\d+)|))"+it+"*\\)|)","i"),bool:new RegExp("^(?:"+rt+")$","i"),needsContext:new RegExp("^"+it+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+it+"*((?:-\\d)?\\d*)"+it+"*\\)|)(?=[^-]|$)","i")},gt=/^(?:input|select|textarea|button)$/i,vt=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,bt=/[+~]/,xt=/'|\\/g,wt=new RegExp("\\\\([\\da-f]{1,6}"+it+"?|("+it+")|.)","ig"),Ct=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{et.apply(Y=tt.call(F.childNodes),F.childNodes),Y[F.childNodes.length].nodeType}catch(St){et={apply:Y.length?function(e,t){J.apply(e,tt.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},k=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},j=t.setDocument=function(e){var t,n=e?e.ownerDocument||e:F,r=n.defaultView;return n!==R&&9===n.nodeType&&n.documentElement?(R=n,P=n.documentElement,_=!k(n),r&&r!==r.top&&(r.addEventListener?r.addEventListener("unload",function(){j()},!1):r.attachEvent&&r.attachEvent("onunload",function(){j()})),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=$.test(n.getElementsByClassName)&&i(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),w.getById=i(function(e){return P.appendChild(e).id=z,!n.getElementsByName||!n.getElementsByName(z).length
}),w.getById?(C.find.ID=function(e,t){if(typeof t.getElementById!==G&&_){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},C.filter.ID=function(e){var t=e.replace(wt,Ct);return function(e){return e.getAttribute("id")===t}}):(delete C.find.ID,C.filter.ID=function(e){var t=e.replace(wt,Ct);return function(e){var n=typeof e.getAttributeNode!==G&&e.getAttributeNode("id");return n&&n.value===t}}),C.find.TAG=w.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==G?t.getElementsByTagName(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},C.find.CLASS=w.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==G&&_?t.getElementsByClassName(e):void 0},O=[],H=[],(w.qsa=$.test(n.querySelectorAll))&&(i(function(e){e.innerHTML="<select msallowclip=''><option selected=''></option></select>",e.querySelectorAll("[msallowclip^='']").length&&H.push("[*^$]="+it+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||H.push("\\["+it+"*(?:value|"+rt+")"),e.querySelectorAll(":checked").length||H.push(":checked")}),i(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&H.push("name"+it+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||H.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),H.push(",.*:")})),(w.matchesSelector=$.test(q=P.matches||P.webkitMatchesSelector||P.mozMatchesSelector||P.oMatchesSelector||P.msMatchesSelector))&&i(function(e){w.disconnectedMatch=q.call(e,"div"),q.call(e,"[s!='']:x"),O.push("!=",lt)}),H=H.length&&new RegExp(H.join("|")),O=O.length&&new RegExp(O.join("|")),t=$.test(P.compareDocumentPosition),M=t||$.test(P.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Z=t?function(e,t){if(e===t)return D=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r?r:(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&r||!w.sortDetached&&t.compareDocumentPosition(e)===r?e===n||e.ownerDocument===F&&M(F,e)?-1:t===n||t.ownerDocument===F&&M(F,t)?1:A?nt.call(A,e)-nt.call(A,t):0:4&r?-1:1)}:function(e,t){if(e===t)return D=!0,0;var r,i=0,o=e.parentNode,s=t.parentNode,l=[e],c=[t];if(!o||!s)return e===n?-1:t===n?1:o?-1:s?1:A?nt.call(A,e)-nt.call(A,t):0;if(o===s)return a(e,t);for(r=e;r=r.parentNode;)l.unshift(r);for(r=t;r=r.parentNode;)c.unshift(r);for(;l[i]===c[i];)i++;return i?a(l[i],c[i]):l[i]===F?-1:c[i]===F?1:0},n):R},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==R&&j(e),n=n.replace(ft,"='$1']"),!(!w.matchesSelector||!_||O&&O.test(n)||H&&H.test(n)))try{var r=q.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,R,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==R&&j(e),M(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==R&&j(e);var n=C.attrHandle[t.toLowerCase()],r=n&&Q.call(C.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(D=!w.detectDuplicates,A=!w.sortStable&&e.slice(0),e.sort(Z),D){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return A=null,e},S=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=S(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=S(t);return n},C=t.selectors={cacheLength:50,createPseudo:r,match:mt,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(wt,Ct),e[3]=(e[3]||e[4]||e[5]||"").replace(wt,Ct),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return mt.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&pt.test(n)&&(t=T(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(wt,Ct).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+it+")"+e+"("+it+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==G&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:n?(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o+" ").indexOf(r)>-1:"|="===n?o===r||o.slice(0,r.length+1)===r+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var c,u,d,f,p,h,m=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!l&&!s;if(g){if(o){for(;m;){for(d=t;d=d[m];)if(s?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;h=m="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(u=g[z]||(g[z]={}),c=u[e]||[],p=c[0]===I&&c[1],f=c[0]===I&&c[2],d=p&&g.childNodes[p];d=++p&&d&&d[m]||(f=p=0)||h.pop();)if(1===d.nodeType&&++f&&d===t){u[e]=[I,p,f];break}}else if(y&&(c=(t[z]||(t[z]={}))[e])&&c[0]===I)f=c[1];else for(;(d=++p&&d&&d[m]||(f=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++f||(y&&((d[z]||(d[z]={}))[e]=[I,f]),d!==t)););return f-=i,f===r||f%r===0&&f/r>=0}}},PSEUDO:function(e,n){var i,o=C.pseudos[e]||C.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[z]?o(n):o.length>1?(i=[e,e,"",n],C.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=nt.call(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=E(e.replace(ct,"$1"));return i[z]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return function(t){return(t.textContent||t.innerText||S(t)).indexOf(e)>-1}}),lang:r(function(e){return ht.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(wt,Ct).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===P},focus:function(e){return e===R.activeElement&&(!R.hasFocus||R.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return vt.test(e.nodeName)},input:function(e){return gt.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=0>n?n+t:n;++r<t;)e.push(r);return e})}},C.pseudos.nth=C.pseudos.eq;for(x in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[x]=s(x);for(x in{submit:!0,reset:!0})C.pseudos[x]=l(x);return d.prototype=C.filters=C.pseudos,C.setFilters=new d,T=t.tokenize=function(e,n){var r,i,o,a,s,l,c,u=U[e+" "];if(u)return n?0:u.slice(0);for(s=e,l=[],c=C.preFilter;s;){(!r||(i=ut.exec(s)))&&(i&&(s=s.slice(i[0].length)||s),l.push(o=[])),r=!1,(i=dt.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(ct," ")}),s=s.slice(r.length));for(a in C.filter)!(i=mt[a].exec(s))||c[a]&&!(i=c[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):U(e,l).slice(0)},E=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=T(e)),n=t.length;n--;)o=y(t[n]),o[z]?r.push(o):i.push(o);o=X(e,b(i,r)),o.selector=e}return o},N=t.select=function(e,t,n,r){var i,o,a,s,l,c="function"==typeof e&&e,d=!r&&T(e=c.selector||e);if(n=n||[],1===d.length){if(o=d[0]=d[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&C.relative[o[1].type]){if(t=(C.find.ID(a.matches[0].replace(wt,Ct),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=mt.needsContext.test(e)?0:o.length;i--&&(a=o[i],!C.relative[s=a.type]);)if((l=C.find[s])&&(r=l(a.matches[0].replace(wt,Ct),bt.test(o[0].type)&&u(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&f(o),!e)return et.apply(n,r),n;break}}return(c||E(e,d))(r,t,!_,n,bt.test(e)&&u(t.parentNode)||t),n},w.sortStable=z.split("").sort(Z).join("")===z,w.detectDuplicates=!!D,j(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(R.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){return n?void 0:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?void 0:e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(rt,function(e,t,n){var r;return n?void 0:e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);ot.find=ut,ot.expr=ut.selectors,ot.expr[":"]=ot.expr.pseudos,ot.unique=ut.uniqueSort,ot.text=ut.getText,ot.isXMLDoc=ut.isXML,ot.contains=ut.contains;var dt=ot.expr.match.needsContext,ft=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,pt=/^.[^:#\[\.,]*$/;ot.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ot.find.matchesSelector(r,e)?[r]:[]:ot.find.matches(e,ot.grep(t,function(e){return 1===e.nodeType}))},ot.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(ot(e).filter(function(){for(t=0;i>t;t++)if(ot.contains(r[t],this))return!0}));for(t=0;i>t;t++)ot.find(e,r[t],n);return n=this.pushStack(i>1?ot.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&dt.test(e)?ot(e):e||[],!1).length}});var ht,mt=e.document,gt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,vt=ot.fn.init=function(e,t){var n,r;if(!e)return this;if("string"==typeof e){if(n="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:gt.exec(e),!n||!n[1]&&t)return!t||t.jquery?(t||ht).find(e):this.constructor(t).find(e);if(n[1]){if(t=t instanceof ot?t[0]:t,ot.merge(this,ot.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:mt,!0)),ft.test(n[1])&&ot.isPlainObject(t))for(n in t)ot.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}if(r=mt.getElementById(n[2]),r&&r.parentNode){if(r.id!==n[2])return ht.find(e);this.length=1,this[0]=r}return this.context=mt,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ot.isFunction(e)?"undefined"!=typeof ht.ready?ht.ready(e):e(ot):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ot.makeArray(e,this))};vt.prototype=ot.fn,ht=ot(mt);var yt=/^(?:parents|prev(?:Until|All))/,bt={children:!0,contents:!0,next:!0,prev:!0};ot.extend({dir:function(e,t,n){for(var r=[],i=e[t];i&&9!==i.nodeType&&(void 0===n||1!==i.nodeType||!ot(i).is(n));)1===i.nodeType&&r.push(i),i=i[t];return r},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}}),ot.fn.extend({has:function(e){var t,n=ot(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(ot.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=dt.test(e)||"string"!=typeof e?ot(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&ot.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?ot.unique(o):o)},index:function(e){return e?"string"==typeof e?ot.inArray(this[0],ot(e)):ot.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ot.unique(ot.merge(this.get(),ot(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ot.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ot.dir(e,"parentNode")},parentsUntil:function(e,t,n){return ot.dir(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return ot.dir(e,"nextSibling")},prevAll:function(e){return ot.dir(e,"previousSibling")},nextUntil:function(e,t,n){return ot.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return ot.dir(e,"previousSibling",n)},siblings:function(e){return ot.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return ot.sibling(e.firstChild)},contents:function(e){return ot.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:ot.merge([],e.childNodes)}},function(e,t){ot.fn[e]=function(n,r){var i=ot.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=ot.filter(r,i)),this.length>1&&(bt[e]||(i=ot.unique(i)),yt.test(e)&&(i=i.reverse())),this.pushStack(i)}});var xt=/\S+/g,wt={};ot.Callbacks=function(e){e="string"==typeof e?wt[e]||o(e):ot.extend({},e);var t,n,r,i,a,s,l=[],c=!e.once&&[],u=function(o){for(n=e.memory&&o,r=!0,a=s||0,s=0,i=l.length,t=!0;l&&i>a;a++)if(l[a].apply(o[0],o[1])===!1&&e.stopOnFalse){n=!1;break}t=!1,l&&(c?c.length&&u(c.shift()):n?l=[]:d.disable())},d={add:function(){if(l){var r=l.length;!function o(t){ot.each(t,function(t,n){var r=ot.type(n);"function"===r?e.unique&&d.has(n)||l.push(n):n&&n.length&&"string"!==r&&o(n)})}(arguments),t?i=l.length:n&&(s=r,u(n))}return this},remove:function(){return l&&ot.each(arguments,function(e,n){for(var r;(r=ot.inArray(n,l,r))>-1;)l.splice(r,1),t&&(i>=r&&i--,a>=r&&a--)}),this},has:function(e){return e?ot.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],i=0,this},disable:function(){return l=c=n=void 0,this},disabled:function(){return!l},lock:function(){return c=void 0,n||d.disable(),this},locked:function(){return!c},fireWith:function(e,n){return!l||r&&!c||(n=n||[],n=[e,n.slice?n.slice():n],t?c.push(n):u(n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!r}};return d},ot.extend({Deferred:function(e){var t=[["resolve","done",ot.Callbacks("once memory"),"resolved"],["reject","fail",ot.Callbacks("once memory"),"rejected"],["notify","progress",ot.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ot.Deferred(function(n){ot.each(t,function(t,o){var a=ot.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&ot.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ot.extend(e,r):r}},i={};return r.pipe=r.then,ot.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=Q.call(arguments),r=n.length,i=1!==r||e&&ot.isFunction(e.promise)?r:0,o=1===i?e:ot.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?Q.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,c;if(r>1)for(s=new Array(r),l=new Array(r),c=new Array(r);r>t;t++)n[t]&&ot.isFunction(n[t].promise)?n[t].promise().done(a(t,c,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(c,n),o.promise()}});var Ct;ot.fn.ready=function(e){return ot.ready.promise().done(e),this},ot.extend({isReady:!1,readyWait:1,holdReady:function(e){e?ot.readyWait++:ot.ready(!0)},ready:function(e){if(e===!0?!--ot.readyWait:!ot.isReady){if(!mt.body)return setTimeout(ot.ready);ot.isReady=!0,e!==!0&&--ot.readyWait>0||(Ct.resolveWith(mt,[ot]),ot.fn.triggerHandler&&(ot(mt).triggerHandler("ready"),ot(mt).off("ready")))}}}),ot.ready.promise=function(t){if(!Ct)if(Ct=ot.Deferred(),"complete"===mt.readyState)setTimeout(ot.ready);else if(mt.addEventListener)mt.addEventListener("DOMContentLoaded",s,!1),e.addEventListener("load",s,!1);else{mt.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&mt.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!ot.isReady){try{n.doScroll("left")}catch(e){return setTimeout(i,50)}a(),ot.ready()}}()}return Ct.promise(t)};var St="undefined",kt;for(kt in ot(rt))break;rt.ownLast="0"!==kt,rt.inlineBlockNeedsLayout=!1,ot(function(){var e,t,n,r;n=mt.getElementsByTagName("body")[0],n&&n.style&&(t=mt.createElement("div"),r=mt.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==St&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",rt.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=mt.createElement("div");if(null==rt.deleteExpando){rt.deleteExpando=!0;try{delete e.test}catch(t){rt.deleteExpando=!1}}e=null}(),ot.acceptData=function(e){var t=ot.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return 1!==n&&9!==n?!1:!t||t!==!0&&e.getAttribute("classid")===t};var Tt=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,$t=/([A-Z])/g;ot.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?ot.cache[e[ot.expando]]:e[ot.expando],!!e&&!c(e)},data:function(e,t,n){return u(e,t,n)},removeData:function(e,t){return d(e,t)},_data:function(e,t,n){return u(e,t,n,!0)},_removeData:function(e,t){return d(e,t,!0)}}),ot.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=ot.data(o),1===o.nodeType&&!ot._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=ot.camelCase(r.slice(5)),l(o,r,i[r])));ot._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){ot.data(this,e)}):arguments.length>1?this.each(function(){ot.data(this,e,t)}):o?l(o,e,ot.data(o,e)):void 0},removeData:function(e){return this.each(function(){ot.removeData(this,e)})}}),ot.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=ot._data(e,t),n&&(!r||ot.isArray(n)?r=ot._data(e,t,ot.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=ot.queue(e,t),r=n.length,i=n.shift(),o=ot._queueHooks(e,t),a=function(){ot.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ot._data(e,n)||ot._data(e,n,{empty:ot.Callbacks("once memory").add(function(){ot._removeData(e,t+"queue"),ot._removeData(e,n)})})}}),ot.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?ot.queue(this[0],e):void 0===t?this:this.each(function(){var n=ot.queue(this,e,t);ot._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&ot.dequeue(this,e)})},dequeue:function(e){return this.each(function(){ot.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ot.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=ot._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var Et=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Nt=["Top","Right","Bottom","Left"],Lt=function(e,t){return e=t||e,"none"===ot.css(e,"display")||!ot.contains(e.ownerDocument,e)},At=ot.access=function(e,t,n,r,i,o,a){var s=0,l=e.length,c=null==n;if("object"===ot.type(n)){i=!0;for(s in n)ot.access(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,ot.isFunction(r)||(a=!0),c&&(a?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(ot(e),n)})),t))for(;l>s;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:c?t.call(e):l?t(e[0],n):o},Dt=/^(?:checkbox|radio)$/i;!function(){var e=mt.createElement("input"),t=mt.createElement("div"),n=mt.createDocumentFragment();if(t.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",rt.leadingWhitespace=3===t.firstChild.nodeType,rt.tbody=!t.getElementsByTagName("tbody").length,rt.htmlSerialize=!!t.getElementsByTagName("link").length,rt.html5Clone="<:nav></:nav>"!==mt.createElement("nav").cloneNode(!0).outerHTML,e.type="checkbox",e.checked=!0,n.appendChild(e),rt.appendChecked=e.checked,t.innerHTML="<textarea>x</textarea>",rt.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,n.appendChild(t),t.innerHTML="<input type='radio' checked='checked' name='t'/>",rt.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,rt.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){rt.noCloneEvent=!1}),t.cloneNode(!0).click()),null==rt.deleteExpando){rt.deleteExpando=!0;try{delete t.test}catch(r){rt.deleteExpando=!1}}}(),function(){var t,n,r=mt.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(rt[t+"Bubbles"]=n in e)||(r.setAttribute(n,"t"),rt[t+"Bubbles"]=r.attributes[n].expando===!1);r=null}();var jt=/^(?:input|select|textarea)$/i,Rt=/^key/,Pt=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_t=/^([^.]*)(?:\.(.+)|)$/;ot.event={global:{},add:function(e,t,n,r,i){var o,a,s,l,c,u,d,f,p,h,m,g=ot._data(e);if(g){for(n.handler&&(l=n,n=l.handler,i=l.selector),n.guid||(n.guid=ot.guid++),(a=g.events)||(a=g.events={}),(u=g.handle)||(u=g.handle=function(e){return typeof ot===St||e&&ot.event.triggered===e.type?void 0:ot.event.dispatch.apply(u.elem,arguments)},u.elem=e),t=(t||"").match(xt)||[""],s=t.length;s--;)o=_t.exec(t[s])||[],p=m=o[1],h=(o[2]||"").split(".").sort(),p&&(c=ot.event.special[p]||{},p=(i?c.delegateType:c.bindType)||p,c=ot.event.special[p]||{},d=ot.extend({type:p,origType:m,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ot.expr.match.needsContext.test(i),namespace:h.join(".")},l),(f=a[p])||(f=a[p]=[],f.delegateCount=0,c.setup&&c.setup.call(e,r,h,u)!==!1||(e.addEventListener?e.addEventListener(p,u,!1):e.attachEvent&&e.attachEvent("on"+p,u))),c.add&&(c.add.call(e,d),d.handler.guid||(d.handler.guid=n.guid)),i?f.splice(f.delegateCount++,0,d):f.push(d),ot.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,c,u,d,f,p,h,m,g=ot.hasData(e)&&ot._data(e);if(g&&(u=g.events)){for(t=(t||"").match(xt)||[""],c=t.length;c--;)if(s=_t.exec(t[c])||[],p=m=s[1],h=(s[2]||"").split(".").sort(),p){for(d=ot.event.special[p]||{},p=(r?d.delegateType:d.bindType)||p,f=u[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;o--;)a=f[o],!i&&m!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,d.remove&&d.remove.call(e,a));l&&!f.length&&(d.teardown&&d.teardown.call(e,h,g.handle)!==!1||ot.removeEvent(e,p,g.handle),delete u[p])}else for(p in u)ot.event.remove(e,p+t[c],n,r,!0);ot.isEmptyObject(u)&&(delete g.handle,ot._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,l,c,u,d,f=[r||mt],p=nt.call(t,"type")?t.type:t,h=nt.call(t,"namespace")?t.namespace.split("."):[];if(s=u=r=r||mt,3!==r.nodeType&&8!==r.nodeType&&!$.test(p+ot.event.triggered)&&(p.indexOf(".")>=0&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[ot.expando]?t:new ot.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:ot.makeArray(n,[t]),c=ot.event.special[p]||{},i||!c.trigger||c.trigger.apply(r,n)!==!1)){if(!i&&!c.noBubble&&!ot.isWindow(r)){for(l=c.delegateType||p,$.test(l+p)||(s=s.parentNode);s;s=s.parentNode)f.push(s),u=s;u===(r.ownerDocument||mt)&&f.push(u.defaultView||u.parentWindow||e)}for(d=0;(s=f[d++])&&!t.isPropagationStopped();)t.type=d>1?l:c.bindType||p,o=(ot._data(s,"events")||{})[t.type]&&ot._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&ot.acceptData(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!c._default||c._default.apply(f.pop(),n)===!1)&&ot.acceptData(r)&&a&&r[p]&&!ot.isWindow(r)){u=r[a],u&&(r[a]=null),ot.event.triggered=p;try{r[p]()}catch(m){}ot.event.triggered=void 0,u&&(r[a]=u)}return t.result}},dispatch:function(e){e=ot.event.fix(e);var t,n,r,i,o,a=[],s=Q.call(arguments),l=(ot._data(this,"events")||{})[e.type]||[],c=ot.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(a=ot.event.handlers.call(this,e,l),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,o=0;(r=i.handlers[o++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(r.namespace))&&(e.handleObj=r,e.data=r.data,n=((ot.event.special[r.origType]||{}).handle||r.handler).apply(i.elem,s),void 0!==n&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,l=e.target;if(s&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(i=[],o=0;s>o;o++)r=t[o],n=r.selector+" ",void 0===i[n]&&(i[n]=r.needsContext?ot(n,this).index(l)>=0:ot.find(n,this,null,[l]).length),i[n]&&i.push(r);i.length&&a.push({elem:l,handlers:i})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[ot.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Pt.test(i)?this.mouseHooks:Rt.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new ot.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||mt),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||mt,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==h()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===h()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return ot.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(e){return ot.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=ot.extend(new ot.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?ot.event.trigger(i,null,t):ot.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},ot.removeEvent=mt.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===St&&(e[r]=null),e.detachEvent(r,n))},ot.Event=function(e,t){return this instanceof ot.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?f:p):this.type=e,t&&ot.extend(this,t),this.timeStamp=e&&e.timeStamp||ot.now(),void(this[ot.expando]=!0)):new ot.Event(e,t)},ot.Event.prototype={isDefaultPrevented:p,isPropagationStopped:p,isImmediatePropagationStopped:p,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=f,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=f,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=f,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},ot.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){ot.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!ot.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),rt.submitBubbles||(ot.event.special.submit={setup:function(){return ot.nodeName(this,"form")?!1:void ot.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=ot.nodeName(t,"input")||ot.nodeName(t,"button")?t.form:void 0;n&&!ot._data(n,"submitBubbles")&&(ot.event.add(n,"submit._submit",function(e){e._submit_bubble=!0}),ot._data(n,"submitBubbles",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&ot.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return ot.nodeName(this,"form")?!1:void ot.event.remove(this,"._submit")}}),rt.changeBubbles||(ot.event.special.change={setup:function(){return jt.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(ot.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),ot.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),ot.event.simulate("change",this,e,!0)
})),!1):void ot.event.add(this,"beforeactivate._change",function(e){var t=e.target;jt.test(t.nodeName)&&!ot._data(t,"changeBubbles")&&(ot.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||ot.event.simulate("change",this.parentNode,e,!0)}),ot._data(t,"changeBubbles",!0))})},handle:function(e){var t=e.target;return this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type?e.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return ot.event.remove(this,"._change"),!jt.test(this.nodeName)}}),rt.focusinBubbles||ot.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ot.event.simulate(t,e.target,ot.event.fix(e),!0)};ot.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=ot._data(r,t);i||r.addEventListener(e,n,!0),ot._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=ot._data(r,t)-1;i?ot._data(r,t,i):(r.removeEventListener(e,n,!0),ot._removeData(r,t))}}}),ot.fn.extend({on:function(e,t,n,r,i){var o,a;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=void 0);for(o in e)this.on(o,t,n,e[o],i);return this}if(null==n&&null==r?(r=t,n=t=void 0):null==r&&("string"==typeof t?(r=n,n=void 0):(r=n,n=t,t=void 0)),r===!1)r=p;else if(!r)return this;return 1===i&&(a=r,r=function(e){return ot().off(e),a.apply(this,arguments)},r.guid=a.guid||(a.guid=ot.guid++)),this.each(function(){ot.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ot(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=void 0),n===!1&&(n=p),this.each(function(){ot.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){ot.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?ot.event.trigger(e,t,n,!0):void 0}});var Ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Ot=/ jQuery\d+="(?:null|\d+)"/g,qt=new RegExp("<(?:"+Ht+")[\\s/>]","i"),Mt=/^\s+/,zt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Ft=/<([\w:]+)/,It=/<tbody/i,Bt=/<|&#?\w+;/,Wt=/<(?:script|style|link)/i,Ut=/checked\s*(?:[^=]|=\s*.checked.)/i,Xt=/^$|\/(?:java|ecma)script/i,Zt=/^true\/(.*)/,Gt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Vt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:rt.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},Qt=m(mt),Yt=Qt.appendChild(mt.createElement("div"));Vt.optgroup=Vt.option,Vt.tbody=Vt.tfoot=Vt.colgroup=Vt.caption=Vt.thead,Vt.th=Vt.td,ot.extend({clone:function(e,t,n){var r,i,o,a,s,l=ot.contains(e.ownerDocument,e);if(rt.html5Clone||ot.isXMLDoc(e)||!qt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Yt.innerHTML=e.outerHTML,Yt.removeChild(o=Yt.firstChild)),!(rt.noCloneEvent&&rt.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ot.isXMLDoc(e)))for(r=g(o),s=g(e),a=0;null!=(i=s[a]);++a)r[a]&&S(i,r[a]);if(t)if(n)for(s=s||g(e),r=r||g(o),a=0;null!=(i=s[a]);a++)C(i,r[a]);else C(e,o);return r=g(o,"script"),r.length>0&&w(r,!l&&g(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){for(var i,o,a,s,l,c,u,d=e.length,f=m(t),p=[],h=0;d>h;h++)if(o=e[h],o||0===o)if("object"===ot.type(o))ot.merge(p,o.nodeType?[o]:o);else if(Bt.test(o)){for(s=s||f.appendChild(t.createElement("div")),l=(Ft.exec(o)||["",""])[1].toLowerCase(),u=Vt[l]||Vt._default,s.innerHTML=u[1]+o.replace(zt,"<$1></$2>")+u[2],i=u[0];i--;)s=s.lastChild;if(!rt.leadingWhitespace&&Mt.test(o)&&p.push(t.createTextNode(Mt.exec(o)[0])),!rt.tbody)for(o="table"!==l||It.test(o)?"<table>"!==u[1]||It.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)ot.nodeName(c=o.childNodes[i],"tbody")&&!c.childNodes.length&&o.removeChild(c);for(ot.merge(p,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=f.lastChild}else p.push(t.createTextNode(o));for(s&&f.removeChild(s),rt.appendChecked||ot.grep(g(p,"input"),v),h=0;o=p[h++];)if((!r||-1===ot.inArray(o,r))&&(a=ot.contains(o.ownerDocument,o),s=g(f.appendChild(o),"script"),a&&w(s),n))for(i=0;o=s[i++];)Xt.test(o.type||"")&&n.push(o);return s=null,f},cleanData:function(e,t){for(var n,r,i,o,a=0,s=ot.expando,l=ot.cache,c=rt.deleteExpando,u=ot.event.special;null!=(n=e[a]);a++)if((t||ot.acceptData(n))&&(i=n[s],o=i&&l[i])){if(o.events)for(r in o.events)u[r]?ot.event.remove(n,r):ot.removeEvent(n,r,o.handle);l[i]&&(delete l[i],c?delete n[s]:typeof n.removeAttribute!==St?n.removeAttribute(s):n[s]=null,V.push(i))}}}),ot.fn.extend({text:function(e){return At(this,function(e){return void 0===e?ot.text(this):this.empty().append((this[0]&&this[0].ownerDocument||mt).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=y(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=e?ot.filter(e,this):this,i=0;null!=(n=r[i]);i++)t||1!==n.nodeType||ot.cleanData(g(n)),n.parentNode&&(t&&ot.contains(n.ownerDocument,n)&&w(g(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&ot.cleanData(g(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&ot.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return ot.clone(this,e,t)})},html:function(e){return At(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ot,""):void 0;if(!("string"!=typeof e||Wt.test(e)||!rt.htmlSerialize&&qt.test(e)||!rt.leadingWhitespace&&Mt.test(e)||Vt[(Ft.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(zt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(ot.cleanData(g(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,ot.cleanData(g(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=Y.apply([],e);var n,r,i,o,a,s,l=0,c=this.length,u=this,d=c-1,f=e[0],p=ot.isFunction(f);if(p||c>1&&"string"==typeof f&&!rt.checkClone&&Ut.test(f))return this.each(function(n){var r=u.eq(n);p&&(e[0]=f.call(this,n,r.html())),r.domManip(e,t)});if(c&&(s=ot.buildFragment(e,this[0].ownerDocument,!1,this),n=s.firstChild,1===s.childNodes.length&&(s=n),n)){for(o=ot.map(g(s,"script"),b),i=o.length;c>l;l++)r=s,l!==d&&(r=ot.clone(r,!0,!0),i&&ot.merge(o,g(r,"script"))),t.call(this[l],r,l);if(i)for(a=o[o.length-1].ownerDocument,ot.map(o,x),l=0;i>l;l++)r=o[l],Xt.test(r.type||"")&&!ot._data(r,"globalEval")&&ot.contains(a,r)&&(r.src?ot._evalUrl&&ot._evalUrl(r.src):ot.globalEval((r.text||r.textContent||r.innerHTML||"").replace(Gt,"")));s=n=null}return this}}),ot.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){ot.fn[e]=function(e){for(var n,r=0,i=[],o=ot(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),ot(o[r])[t](n),K.apply(i,n.get());return this.pushStack(i)}});var Kt,Jt={};!function(){var e;rt.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=mt.getElementsByTagName("body")[0],n&&n.style?(t=mt.createElement("div"),r=mt.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),typeof t.style.zoom!==St&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(mt.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var en=/^margin/,tn=new RegExp("^("+Et+")(?!px)[a-z%]+$","i"),nn,rn,on=/^(top|right|bottom|left)$/;e.getComputedStyle?(nn=function(e){return e.ownerDocument.defaultView.getComputedStyle(e,null)},rn=function(e,t,n){var r,i,o,a,s=e.style;return n=n||nn(e),a=n?n.getPropertyValue(t)||n[t]:void 0,n&&(""!==a||ot.contains(e.ownerDocument,e)||(a=ot.style(e,t)),tn.test(a)&&en.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0===a?a:a+""}):mt.documentElement.currentStyle&&(nn=function(e){return e.currentStyle},rn=function(e,t,n){var r,i,o,a,s=e.style;return n=n||nn(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),tn.test(a)&&!on.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"}),!function(){function t(){var t,n,r,i;n=mt.getElementsByTagName("body")[0],n&&n.style&&(t=mt.createElement("div"),r=mt.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),t.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",o=a=!1,l=!0,e.getComputedStyle&&(o="1%"!==(e.getComputedStyle(t,null)||{}).top,a="4px"===(e.getComputedStyle(t,null)||{width:"4px"}).width,i=t.appendChild(mt.createElement("div")),i.style.cssText=t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",t.style.width="1px",l=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight)),t.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=t.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",s=0===i[0].offsetHeight,s&&(i[0].style.display="",i[1].style.display="none",s=0===i[0].offsetHeight),n.removeChild(r))}var n,r,i,o,a,s,l;n=mt.createElement("div"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",i=n.getElementsByTagName("a")[0],(r=i&&i.style)&&(r.cssText="float:left;opacity:.5",rt.opacity="0.5"===r.opacity,rt.cssFloat=!!r.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",rt.clearCloneStyle="content-box"===n.style.backgroundClip,rt.boxSizing=""===r.boxSizing||""===r.MozBoxSizing||""===r.WebkitBoxSizing,ot.extend(rt,{reliableHiddenOffsets:function(){return null==s&&t(),s},boxSizingReliable:function(){return null==a&&t(),a},pixelPosition:function(){return null==o&&t(),o},reliableMarginRight:function(){return null==l&&t(),l}}))}(),ot.swap=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};var an=/alpha\([^)]*\)/i,sn=/opacity\s*=\s*([^)]*)/,ln=/^(none|table(?!-c[ea]).+)/,cn=new RegExp("^("+Et+")(.*)$","i"),un=new RegExp("^([+-])=("+Et+")","i"),dn={position:"absolute",visibility:"hidden",display:"block"},fn={letterSpacing:"0",fontWeight:"400"},pn=["Webkit","O","Moz","ms"];ot.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=rn(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":rt.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=ot.camelCase(t),l=e.style;if(t=ot.cssProps[s]||(ot.cssProps[s]=N(l,s)),a=ot.cssHooks[t]||ot.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];if(o=typeof n,"string"===o&&(i=un.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(ot.css(e,t)),o="number"),null!=n&&n===n&&("number"!==o||ot.cssNumber[s]||(n+="px"),rt.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{l[t]=n}catch(c){}}},css:function(e,t,n,r){var i,o,a,s=ot.camelCase(t);return t=ot.cssProps[s]||(ot.cssProps[s]=N(e.style,s)),a=ot.cssHooks[t]||ot.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=rn(e,t,r)),"normal"===o&&t in fn&&(o=fn[t]),""===n||n?(i=parseFloat(o),n===!0||ot.isNumeric(i)?i||0:o):o}}),ot.each(["height","width"],function(e,t){ot.cssHooks[t]={get:function(e,n,r){return n?ln.test(ot.css(e,"display"))&&0===e.offsetWidth?ot.swap(e,dn,function(){return j(e,t,r)}):j(e,t,r):void 0},set:function(e,n,r){var i=r&&nn(e);return A(e,n,r?D(e,t,r,rt.boxSizing&&"border-box"===ot.css(e,"boxSizing",!1,i),i):0)}}}),rt.opacity||(ot.cssHooks.opacity={get:function(e,t){return sn.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=ot.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===ot.trim(o.replace(an,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=an.test(o)?o.replace(an,i):o+" "+i)}}),ot.cssHooks.marginRight=E(rt.reliableMarginRight,function(e,t){return t?ot.swap(e,{display:"inline-block"},rn,[e,"marginRight"]):void 0}),ot.each({margin:"",padding:"",border:"Width"},function(e,t){ot.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+Nt[r]+t]=o[r]||o[r-2]||o[0];return i}},en.test(e)||(ot.cssHooks[e+t].set=A)}),ot.fn.extend({css:function(e,t){return At(this,function(e,t,n){var r,i,o={},a=0;if(ot.isArray(t)){for(r=nn(e),i=t.length;i>a;a++)o[t[a]]=ot.css(e,t[a],!1,r);return o}return void 0!==n?ot.style(e,t,n):ot.css(e,t)},e,t,arguments.length>1)},show:function(){return L(this,!0)},hide:function(){return L(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?ot(this).show():ot(this).hide()})}}),ot.Tween=R,R.prototype={constructor:R,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ot.cssNumber[n]?"":"px")},cur:function(){var e=R.propHooks[this.prop];return e&&e.get?e.get(this):R.propHooks._default.get(this)},run:function(e){var t,n=R.propHooks[this.prop];return this.pos=t=this.options.duration?ot.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):R.propHooks._default.set(this),this}},R.prototype.init.prototype=R.prototype,R.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=ot.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){ot.fx.step[e.prop]?ot.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[ot.cssProps[e.prop]]||ot.cssHooks[e.prop])?ot.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},R.propHooks.scrollTop=R.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ot.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},ot.fx=R.prototype.init,ot.fx.step={};var hn,mn,gn=/^(?:toggle|show|hide)$/,vn=new RegExp("^(?:([+-])=|)("+Et+")([a-z%]*)$","i"),yn=/queueHooks$/,bn=[O],xn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=vn.exec(t),o=i&&i[3]||(ot.cssNumber[e]?"":"px"),a=(ot.cssNumber[e]||"px"!==o&&+r)&&vn.exec(ot.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,ot.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};ot.Animation=ot.extend(M,{tweener:function(e,t){ot.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],xn[n]=xn[n]||[],xn[n].unshift(t)},prefilter:function(e,t){t?bn.unshift(e):bn.push(e)}}),ot.speed=function(e,t,n){var r=e&&"object"==typeof e?ot.extend({},e):{complete:n||!n&&t||ot.isFunction(e)&&e,duration:e,easing:n&&t||t&&!ot.isFunction(t)&&t};return r.duration=ot.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in ot.fx.speeds?ot.fx.speeds[r.duration]:ot.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){ot.isFunction(r.old)&&r.old.call(this),r.queue&&ot.dequeue(this,r.queue)},r},ot.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=ot.isEmptyObject(e),o=ot.speed(t,n,r),a=function(){var t=M(this,ot.extend({},e),o);(i||ot._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=ot.timers,a=ot._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&yn.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&ot.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=ot._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=ot.timers,a=r?r.length:0;for(n.finish=!0,ot.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),ot.each(["toggle","show","hide"],function(e,t){var n=ot.fn[t];ot.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(_(t,!0),e,r,i)}}),ot.each({slideDown:_("show"),slideUp:_("hide"),slideToggle:_("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){ot.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),ot.timers=[],ot.fx.tick=function(){var e,t=ot.timers,n=0;for(hn=ot.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||ot.fx.stop(),hn=void 0},ot.fx.timer=function(e){ot.timers.push(e),e()?ot.fx.start():ot.timers.pop()},ot.fx.interval=13,ot.fx.start=function(){mn||(mn=setInterval(ot.fx.tick,ot.fx.interval))},ot.fx.stop=function(){clearInterval(mn),mn=null},ot.fx.speeds={slow:600,fast:200,_default:400},ot.fn.delay=function(e,t){return e=ot.fx?ot.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},function(){var e,t,n,r,i;t=mt.createElement("div"),t.setAttribute("className","t"),t.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",r=t.getElementsByTagName("a")[0],n=mt.createElement("select"),i=n.appendChild(mt.createElement("option")),e=t.getElementsByTagName("input")[0],r.style.cssText="top:1px",rt.getSetAttribute="t"!==t.className,rt.style=/top/.test(r.getAttribute("style")),rt.hrefNormalized="/a"===r.getAttribute("href"),rt.checkOn=!!e.value,rt.optSelected=i.selected,rt.enctype=!!mt.createElement("form").enctype,n.disabled=!0,rt.optDisabled=!i.disabled,e=mt.createElement("input"),e.setAttribute("value",""),rt.input=""===e.getAttribute("value"),e.value="t",e.setAttribute("type","radio"),rt.radioValue="t"===e.value}();var wn=/\r/g;ot.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=ot.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,ot(this).val()):e,null==i?i="":"number"==typeof i?i+="":ot.isArray(i)&&(i=ot.map(i,function(e){return null==e?"":e+""})),t=ot.valHooks[this.type]||ot.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=ot.valHooks[i.type]||ot.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(wn,""):null==n?"":n)):void 0}}),ot.extend({valHooks:{option:{get:function(e){var t=ot.find.attr(e,"value");return null!=t?t:ot.trim(ot.text(e))}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(rt.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&ot.nodeName(n.parentNode,"optgroup"))){if(t=ot(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=ot.makeArray(t),a=i.length;a--;)if(r=i[a],ot.inArray(ot.valHooks.option.get(r),o)>=0)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),ot.each(["radio","checkbox"],function(){ot.valHooks[this]={set:function(e,t){return ot.isArray(t)?e.checked=ot.inArray(ot(e).val(),t)>=0:void 0}},rt.checkOn||(ot.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Cn,Sn,kn=ot.expr.attrHandle,Tn=/^(?:checked|selected)$/i,$n=rt.getSetAttribute,En=rt.input;ot.fn.extend({attr:function(e,t){return At(this,ot.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){ot.removeAttr(this,e)})}}),ot.extend({attr:function(e,t,n){var r,i,o=e.nodeType;return e&&3!==o&&8!==o&&2!==o?typeof e.getAttribute===St?ot.prop(e,t,n):(1===o&&ot.isXMLDoc(e)||(t=t.toLowerCase(),r=ot.attrHooks[t]||(ot.expr.match.bool.test(t)?Sn:Cn)),void 0===n?r&&"get"in r&&null!==(i=r.get(e,t))?i:(i=ot.find.attr(e,t),null==i?void 0:i):null!==n?r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+""),n):void ot.removeAttr(e,t)):void 0},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(xt);if(o&&1===e.nodeType)for(;n=o[i++];)r=ot.propFix[n]||n,ot.expr.match.bool.test(n)?En&&$n||!Tn.test(n)?e[r]=!1:e[ot.camelCase("default-"+n)]=e[r]=!1:ot.attr(e,n,""),e.removeAttribute($n?n:r)},attrHooks:{type:{set:function(e,t){if(!rt.radioValue&&"radio"===t&&ot.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),Sn={set:function(e,t,n){return t===!1?ot.removeAttr(e,n):En&&$n||!Tn.test(n)?e.setAttribute(!$n&&ot.propFix[n]||n,n):e[ot.camelCase("default-"+n)]=e[n]=!0,n}},ot.each(ot.expr.match.bool.source.match(/\w+/g),function(e,t){var n=kn[t]||ot.find.attr;kn[t]=En&&$n||!Tn.test(t)?function(e,t,r){var i,o;return r||(o=kn[t],kn[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,kn[t]=o),i}:function(e,t,n){return n?void 0:e[ot.camelCase("default-"+t)]?t.toLowerCase():null}}),En&&$n||(ot.attrHooks.value={set:function(e,t,n){return ot.nodeName(e,"input")?void(e.defaultValue=t):Cn&&Cn.set(e,t,n)}}),$n||(Cn={set:function(e,t,n){var r=e.getAttributeNode(n);return r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n)?t:void 0}},kn.id=kn.name=kn.coords=function(e,t,n){var r;return n?void 0:(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},ot.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:void 0},set:Cn.set},ot.attrHooks.contenteditable={set:function(e,t,n){Cn.set(e,""===t?!1:t,n)}},ot.each(["width","height"],function(e,t){ot.attrHooks[t]={set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}}})),rt.style||(ot.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Nn=/^(?:input|select|textarea|button|object)$/i,Ln=/^(?:a|area)$/i;ot.fn.extend({prop:function(e,t){return At(this,ot.prop,e,t,arguments.length>1)},removeProp:function(e){return e=ot.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),ot.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,a=e.nodeType;return e&&3!==a&&8!==a&&2!==a?(o=1!==a||!ot.isXMLDoc(e),o&&(t=ot.propFix[t]||t,i=ot.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]):void 0},propHooks:{tabIndex:{get:function(e){var t=ot.find.attr(e,"tabindex");return t?parseInt(t,10):Nn.test(e.nodeName)||Ln.test(e.nodeName)&&e.href?0:-1}}}}),rt.hrefNormalized||ot.each(["href","src"],function(e,t){ot.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),rt.optSelected||(ot.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),ot.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ot.propFix[this.toLowerCase()]=this}),rt.enctype||(ot.propFix.enctype="encoding");var An=/[\t\r\n\f]/g;ot.fn.extend({addClass:function(e){var t,n,r,i,o,a,s=0,l=this.length,c="string"==typeof e&&e;if(ot.isFunction(e))return this.each(function(t){ot(this).addClass(e.call(this,t,this.className))});if(c)for(t=(e||"").match(xt)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(An," "):" ")){for(o=0;i=t[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a=ot.trim(r),n.className!==a&&(n.className=a)}return this},removeClass:function(e){var t,n,r,i,o,a,s=0,l=this.length,c=0===arguments.length||"string"==typeof e&&e;if(ot.isFunction(e))return this.each(function(t){ot(this).removeClass(e.call(this,t,this.className))});if(c)for(t=(e||"").match(xt)||[];l>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(An," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");a=e?ot.trim(r):"",n.className!==a&&(n.className=a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):this.each(ot.isFunction(e)?function(n){ot(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var t,r=0,i=ot(this),o=e.match(xt)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else(n===St||"boolean"===n)&&(this.className&&ot._data(this,"__className__",this.className),this.className=this.className||e===!1?"":ot._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(An," ").indexOf(t)>=0)return!0;return!1}}),ot.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ot.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ot.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Dn=ot.now(),jn=/\?/,Rn=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;ot.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=ot.trim(t+"");return i&&!ot.trim(i.replace(Rn,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():ot.error("Invalid JSON: "+t)},ot.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new DOMParser,n=r.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||ot.error("Invalid XML: "+t),n};var Pn,_n,Hn=/#.*$/,On=/([?&])_=[^&]*/,qn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Mn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,zn=/^(?:GET|HEAD)$/,Fn=/^\/\//,In=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Bn={},Wn={},Un="*/".concat("*");try{_n=location.href}catch(Xn){_n=mt.createElement("a"),_n.href="",_n=_n.href}Pn=In.exec(_n.toLowerCase())||[],ot.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:_n,type:"GET",isLocal:Mn.test(Pn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Un,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ot.parseJSON,"text xml":ot.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?I(I(e,ot.ajaxSettings),t):I(ot.ajaxSettings,e)},ajaxPrefilter:z(Bn),ajaxTransport:z(Wn),ajax:function(e,t){function n(e,t,n,r){var i,u,v,y,x,C=t;2!==b&&(b=2,s&&clearTimeout(s),c=void 0,a=r||"",w.readyState=e>0?4:0,i=e>=200&&300>e||304===e,n&&(y=B(d,w,n)),y=W(d,y,w,i),i?(d.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(ot.lastModified[o]=x),x=w.getResponseHeader("etag"),x&&(ot.etag[o]=x)),204===e||"HEAD"===d.type?C="nocontent":304===e?C="notmodified":(C=y.state,u=y.data,v=y.error,i=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),w.status=e,w.statusText=(t||C)+"",i?h.resolveWith(f,[u,C,w]):h.rejectWith(f,[w,C,v]),w.statusCode(g),g=void 0,l&&p.trigger(i?"ajaxSuccess":"ajaxError",[w,d,i?u:v]),m.fireWith(f,[w,C]),l&&(p.trigger("ajaxComplete",[w,d]),--ot.active||ot.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,a,s,l,c,u,d=ot.ajaxSetup({},t),f=d.context||d,p=d.context&&(f.nodeType||f.jquery)?ot(f):ot.event,h=ot.Deferred(),m=ot.Callbacks("once memory"),g=d.statusCode||{},v={},y={},b=0,x="canceled",w={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!u)for(u={};t=qn.exec(a);)u[t[1].toLowerCase()]=t[2];t=u[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=y[n]=y[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)g[t]=[g[t],e[t]];else w.always(e[w.status]);return this},abort:function(e){var t=e||x;return c&&c.abort(t),n(0,t),this}};if(h.promise(w).complete=m.add,w.success=w.done,w.error=w.fail,d.url=((e||d.url||_n)+"").replace(Hn,"").replace(Fn,Pn[1]+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=ot.trim(d.dataType||"*").toLowerCase().match(xt)||[""],null==d.crossDomain&&(r=In.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]===Pn[1]&&r[2]===Pn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(Pn[3]||("http:"===Pn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=ot.param(d.data,d.traditional)),F(Bn,d,t,w),2===b)return w;l=d.global,l&&0===ot.active++&&ot.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!zn.test(d.type),o=d.url,d.hasContent||(d.data&&(o=d.url+=(jn.test(o)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=On.test(o)?o.replace(On,"$1_="+Dn++):o+(jn.test(o)?"&":"?")+"_="+Dn++)),d.ifModified&&(ot.lastModified[o]&&w.setRequestHeader("If-Modified-Since",ot.lastModified[o]),ot.etag[o]&&w.setRequestHeader("If-None-Match",ot.etag[o])),(d.data&&d.hasContent&&d.contentType!==!1||t.contentType)&&w.setRequestHeader("Content-Type",d.contentType),w.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Un+"; q=0.01":""):d.accepts["*"]);
for(i in d.headers)w.setRequestHeader(i,d.headers[i]);if(d.beforeSend&&(d.beforeSend.call(f,w,d)===!1||2===b))return w.abort();x="abort";for(i in{success:1,error:1,complete:1})w[i](d[i]);if(c=F(Wn,d,t,w)){w.readyState=1,l&&p.trigger("ajaxSend",[w,d]),d.async&&d.timeout>0&&(s=setTimeout(function(){w.abort("timeout")},d.timeout));try{b=1,c.send(v,n)}catch(C){if(!(2>b))throw C;n(-1,C)}}else n(-1,"No Transport");return w},getJSON:function(e,t,n){return ot.get(e,t,n,"json")},getScript:function(e,t){return ot.get(e,void 0,t,"script")}}),ot.each(["get","post"],function(e,t){ot[t]=function(e,n,r,i){return ot.isFunction(n)&&(i=i||r,r=n,n=void 0),ot.ajax({url:e,type:t,dataType:i,data:n,success:r})}}),ot.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ot.fn[t]=function(e){return this.on(t,e)}}),ot._evalUrl=function(e){return ot.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},ot.fn.extend({wrapAll:function(e){if(ot.isFunction(e))return this.each(function(t){ot(this).wrapAll(e.call(this,t))});if(this[0]){var t=ot(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(ot.isFunction(e)?function(t){ot(this).wrapInner(e.call(this,t))}:function(){var t=ot(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ot.isFunction(e);return this.each(function(n){ot(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ot.nodeName(this,"body")||ot(this).replaceWith(this.childNodes)}).end()}}),ot.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!rt.reliableHiddenOffsets()&&"none"===(e.style&&e.style.display||ot.css(e,"display"))},ot.expr.filters.visible=function(e){return!ot.expr.filters.hidden(e)};var Zn=/%20/g,Gn=/\[\]$/,Vn=/\r?\n/g,Qn=/^(?:submit|button|image|reset|file)$/i,Yn=/^(?:input|select|textarea|keygen)/i;ot.param=function(e,t){var n,r=[],i=function(e,t){t=ot.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ot.ajaxSettings&&ot.ajaxSettings.traditional),ot.isArray(e)||e.jquery&&!ot.isPlainObject(e))ot.each(e,function(){i(this.name,this.value)});else for(n in e)U(n,e[n],t,i);return r.join("&").replace(Zn,"+")},ot.fn.extend({serialize:function(){return ot.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ot.prop(this,"elements");return e?ot.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ot(this).is(":disabled")&&Yn.test(this.nodeName)&&!Qn.test(e)&&(this.checked||!Dt.test(e))}).map(function(e,t){var n=ot(this).val();return null==n?null:ot.isArray(n)?ot.map(n,function(e){return{name:t.name,value:e.replace(Vn,"\r\n")}}):{name:t.name,value:n.replace(Vn,"\r\n")}}).get()}}),ot.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&X()||Z()}:X;var Kn=0,Jn={},er=ot.ajaxSettings.xhr();e.ActiveXObject&&ot(e).on("unload",function(){for(var e in Jn)Jn[e](void 0,!0)}),rt.cors=!!er&&"withCredentials"in er,er=rt.ajax=!!er,er&&ot.ajaxTransport(function(e){if(!e.crossDomain||rt.cors){var t;return{send:function(n,r){var i,o=e.xhr(),a=++Kn;if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)o[i]=e.xhrFields[i];e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)void 0!==n[i]&&o.setRequestHeader(i,n[i]+"");o.send(e.hasContent&&e.data||null),t=function(n,i){var s,l,c;if(t&&(i||4===o.readyState))if(delete Jn[a],t=void 0,o.onreadystatechange=ot.noop,i)4!==o.readyState&&o.abort();else{c={},s=o.status,"string"==typeof o.responseText&&(c.text=o.responseText);try{l=o.statusText}catch(u){l=""}s||!e.isLocal||e.crossDomain?1223===s&&(s=204):s=c.text?200:404}c&&r(s,l,c,o.getAllResponseHeaders())},e.async?4===o.readyState?setTimeout(t):o.onreadystatechange=Jn[a]=t:t()},abort:function(){t&&t(void 0,!0)}}}}),ot.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return ot.globalEval(e),e}}}),ot.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),ot.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=mt.head||ot("head")[0]||mt.documentElement;return{send:function(r,i){t=mt.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var tr=[],nr=/(=)\?(?=&|$)|\?\?/;ot.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=tr.pop()||ot.expando+"_"+Dn++;return this[e]=!0,e}}),ot.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(nr.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&nr.test(t.data)&&"data");return s||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=ot.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(nr,"$1"+i):t.jsonp!==!1&&(t.url+=(jn.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||ot.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,tr.push(i)),a&&ot.isFunction(o)&&o(a[0]),a=o=void 0}),"script"):void 0}),ot.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||mt;var r=ft.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=ot.buildFragment([e],t,i),i&&i.length&&ot(i).remove(),ot.merge([],r.childNodes))};var rr=ot.fn.load;ot.fn.load=function(e,t,n){if("string"!=typeof e&&rr)return rr.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>=0&&(r=ot.trim(e.slice(s,e.length)),e=e.slice(0,s)),ot.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(o="POST"),a.length>0&&ot.ajax({url:e,type:o,dataType:"html",data:t}).done(function(e){i=arguments,a.html(r?ot("<div>").append(ot.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){a.each(n,i||[e.responseText,t,e])}),this},ot.expr.filters.animated=function(e){return ot.grep(ot.timers,function(t){return e===t.elem}).length};var ir=e.document.documentElement;ot.offset={setOffset:function(e,t,n){var r,i,o,a,s,l,c,u=ot.css(e,"position"),d=ot(e),f={};"static"===u&&(e.style.position="relative"),s=d.offset(),o=ot.css(e,"top"),l=ot.css(e,"left"),c=("absolute"===u||"fixed"===u)&&ot.inArray("auto",[o,l])>-1,c?(r=d.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(l)||0),ot.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):d.css(f)}},ot.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){ot.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;return o?(t=o.documentElement,ot.contains(t,i)?(typeof i.getBoundingClientRect!==St&&(r=i.getBoundingClientRect()),n=G(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r):void 0},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===ot.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),ot.nodeName(e[0],"html")||(n=e.offset()),n.top+=ot.css(e[0],"borderTopWidth",!0),n.left+=ot.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-ot.css(r,"marginTop",!0),left:t.left-n.left-ot.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||ir;e&&!ot.nodeName(e,"html")&&"static"===ot.css(e,"position");)e=e.offsetParent;return e||ir})}}),ot.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);ot.fn[e]=function(r){return At(this,function(e,r,i){var o=G(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?ot(o).scrollLeft():i,n?i:ot(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),ot.each(["top","left"],function(e,t){ot.cssHooks[t]=E(rt.pixelPosition,function(e,n){return n?(n=rn(e,t),tn.test(n)?ot(e).position()[t]+"px":n):void 0})}),ot.each({Height:"height",Width:"width"},function(e,t){ot.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){ot.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return At(this,function(t,n,r){var i;return ot.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?ot.css(t,n,a):ot.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),ot.fn.size=function(){return this.length},ot.fn.andSelf=ot.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return ot});var or=e.jQuery,ar=e.$;return ot.noConflict=function(t){return e.$===ot&&(e.$=ar),t&&e.jQuery===ot&&(e.jQuery=or),ot},typeof t===St&&(e.jQuery=e.$=ot),ot}),!function(){var e=null;window.PR_SHOULD_USE_CONTINUATION=!0,function(){function t(e){function t(e){var t=e.charCodeAt(0);if(92!==t)return t;var n=e.charAt(1);return(t=d[n])?t:n>="0"&&"7">=n?parseInt(e.substring(1),8):"u"===n||"x"===n?parseInt(e.substring(2),16):e.charCodeAt(1)}function n(e){return 32>e?(16>e?"\\x0":"\\x")+e.toString(16):(e=String.fromCharCode(e),"\\"===e||"-"===e||"]"===e||"^"===e?"\\"+e:e)}function r(e){var r=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],i="^"===r[0],o=["["];i&&o.push("^");for(var i=i?1:0,a=r.length;a>i;++i){var s=r[i];if(/\\[bdsw]/i.test(s))o.push(s);else{var s=t(s),l;a>i+2&&"-"===r[i+1]?(l=t(r[i+2]),i+=2):l=s,e.push([s,l]),65>l||s>122||(65>l||s>90||e.push([32|Math.max(65,s),32|Math.min(l,90)]),97>l||s>122||e.push([-33&Math.max(97,s),-33&Math.min(l,122)]))}}for(e.sort(function(e,t){return e[0]-t[0]||t[1]-e[1]}),r=[],a=[],i=0;i<e.length;++i)s=e[i],s[0]<=a[1]+1?a[1]=Math.max(a[1],s[1]):r.push(a=s);for(i=0;i<r.length;++i)s=r[i],o.push(n(s[0])),s[1]>s[0]&&(s[1]+1>s[0]&&o.push("-"),o.push(n(s[1])));return o.push("]"),o.join("")}function i(e){for(var t=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),i=t.length,s=[],l=0,c=0;i>l;++l){var u=t[l];"("===u?++c:"\\"===u.charAt(0)&&(u=+u.substring(1))&&(c>=u?s[u]=-1:t[l]=n(u))}for(l=1;l<s.length;++l)-1===s[l]&&(s[l]=++o);for(c=l=0;i>l;++l)u=t[l],"("===u?(++c,s[c]||(t[l]="(?:")):"\\"===u.charAt(0)&&(u=+u.substring(1))&&c>=u&&(t[l]="\\"+s[u]);for(l=0;i>l;++l)"^"===t[l]&&"^"!==t[l+1]&&(t[l]="");if(e.ignoreCase&&a)for(l=0;i>l;++l)u=t[l],e=u.charAt(0),u.length>=2&&"["===e?t[l]=r(u):"\\"!==e&&(t[l]=u.replace(/[A-Za-z]/g,function(e){return e=e.charCodeAt(0),"["+String.fromCharCode(-33&e,32|e)+"]"}));return t.join("")}for(var o=0,a=!1,s=!1,l=0,c=e.length;c>l;++l){var u=e[l];if(u.ignoreCase)s=!0;else if(/[a-z]/i.test(u.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){a=!0,s=!1;break}}for(var d={b:8,t:9,n:10,v:11,f:12,r:13},f=[],l=0,c=e.length;c>l;++l){if(u=e[l],u.global||u.multiline)throw Error(""+u);f.push("(?:"+i(u)+")")}return RegExp(f.join("|"),s?"gi":"g")}function n(e,t){function n(e){var l=e.nodeType;if(1==l){if(!r.test(e.className)){for(l=e.firstChild;l;l=l.nextSibling)n(l);l=e.nodeName.toLowerCase(),("br"===l||"li"===l)&&(i[s]="\n",a[s<<1]=o++,a[s++<<1|1]=e)}}else(3==l||4==l)&&(l=e.nodeValue,l.length&&(l=t?l.replace(/\r\n?/g,"\n"):l.replace(/[\t\n\r ]+/g," "),i[s]=l,a[s<<1]=o,o+=l.length,a[s++<<1|1]=e))}var r=/(?:^|\s)nocode(?:\s|$)/,i=[],o=0,a=[],s=0;return n(e),{a:i.join("").replace(/\n$/,""),d:a}}function r(e,t,n,r){t&&(e={a:t,e:e},n(e),r.push.apply(r,e.g))}function i(e){for(var t=void 0,n=e.firstChild;n;n=n.nextSibling)var r=n.nodeType,t=1===r?t?e:n:3===r&&w.test(n.nodeValue)?e:t;return t===e?void 0:t}function o(n,i){function o(e){for(var t=e.e,n=[t,"pln"],u=0,d=e.a.match(s)||[],f={},p=0,h=d.length;h>p;++p){var m=d[p],g=f[m],v=void 0,y;if("string"==typeof g)y=!1;else{var b=a[m.charAt(0)];if(b)v=m.match(b[1]),g=b[0];else{for(y=0;l>y;++y)if(b=i[y],v=m.match(b[1])){g=b[0];break}v||(g="pln")}!(y=g.length>=5&&"lang-"===g.substring(0,5))||v&&"string"==typeof v[1]||(y=!1,g="src"),y||(f[m]=g)}if(b=u,u+=m.length,y){y=v[1];var x=m.indexOf(y),w=x+y.length;v[2]&&(w=m.length-v[2].length,x=w-y.length),g=g.substring(5),r(t+b,m.substring(0,x),o,n),r(t+b+x,y,c(g,y),n),r(t+b+w,m.substring(w),o,n)}else n.push(t+b,g)}e.g=n}var a={},s;!function(){for(var r=n.concat(i),o=[],l={},c=0,u=r.length;u>c;++c){var d=r[c],f=d[3];if(f)for(var p=f.length;--p>=0;)a[f.charAt(p)]=d;d=d[1],f=""+d,l.hasOwnProperty(f)||(o.push(d),l[f]=e)}o.push(/[\S\s]/),s=t(o)}();var l=i.length;return o}function a(t){var n=[],r=[];n.push(t.tripleQuotedStrings?["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,e,"'\""]:t.multiLineStrings?["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,e,"'\"`"]:["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,e,"\"'"]),t.verbatimStrings&&r.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,e]);var i=t.hashComments;if(i&&(t.cStyleComments?(n.push(i>1?["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,e,"#"]:["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,e,"#"]),r.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,e])):n.push(["com",/^#[^\n\r]*/,e,"#"])),t.cStyleComments&&(r.push(["com",/^\/\/[^\n\r]*/,e]),r.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,e])),i=t.regexLiterals){var a=(i=i>1?"":"\n\r")?".":"[\\S\\s]";r.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+i+"])(?:[^/\\x5B\\x5C"+i+"]|\\x5C"+a+"|\\x5B(?:[^\\x5C\\x5D"+i+"]|\\x5C"+a+")*(?:\\x5D|$))+/")+")")])}return(i=t.types)&&r.push(["typ",i]),i=(""+t.keywords).replace(/^ | $/g,""),i.length&&r.push(["kwd",RegExp("^(?:"+i.replace(/[\s,]+/g,"|")+")\\b"),e]),n.push(["pln",/^\s+/,e," \r\n  "]),i="^.[^\\s\\w.$@'\"`/\\\\]*",t.regexLiterals&&(i+="(?!s*/)"),r.push(["lit",/^@[$_a-z][\w$@]*/i,e],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,e],["pln",/^[$_a-z][\w$@]*/i,e],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,e,"0123456789"],["pln",/^\\[\S\s]?/,e],["pun",RegExp(i),e]),o(n,r)}function s(e,t,n){function r(e){var t=e.nodeType;if(1!=t||o.test(e.className)){if((3==t||4==t)&&n){var l=e.nodeValue,c=l.match(a);c&&(t=l.substring(0,c.index),e.nodeValue=t,(l=l.substring(c.index+c[0].length))&&e.parentNode.insertBefore(s.createTextNode(l),e.nextSibling),i(e),t||e.parentNode.removeChild(e))}}else if("br"===e.nodeName)i(e),e.parentNode&&e.parentNode.removeChild(e);else for(e=e.firstChild;e;e=e.nextSibling)r(e)}function i(e){function t(e,n){var r=n?e.cloneNode(!1):e,i=e.parentNode;if(i){var i=t(i,1),o=e.nextSibling;i.appendChild(r);for(var a=o;a;a=o)o=a.nextSibling,i.appendChild(a)}return r}for(;!e.nextSibling;)if(e=e.parentNode,!e)return;for(var e=t(e.nextSibling,0),n;(n=e.parentNode)&&1===n.nodeType;)e=n;c.push(e)}for(var o=/(?:^|\s)nocode(?:\s|$)/,a=/\r\n?|\n/,s=e.ownerDocument,l=s.createElement("li");e.firstChild;)l.appendChild(e.firstChild);for(var c=[l],u=0;u<c.length;++u)r(c[u]);t===(0|t)&&c[0].setAttribute("value",t);var d=s.createElement("ol");d.className="linenums";for(var t=Math.max(0,t-1|0)||0,u=0,f=c.length;f>u;++u)l=c[u],l.setAttribute("rel","L"+(u+t+1)),l.className="L"+(u+t+1),l.firstChild||l.appendChild(s.createTextNode(" ")),d.appendChild(l);e.appendChild(d)}function l(e,t){for(var n=t.length;--n>=0;){var r=t[n];S.hasOwnProperty(r)?d.console&&console.warn("cannot override language handler %s",r):S[r]=e}}function c(e,t){return e&&S.hasOwnProperty(e)||(e=/^\s*</.test(t)?"default-markup":"default-code"),S[e]}function u(e){var t=e.h;try{var r=n(e.c,e.i),i=r.a;e.a=i,e.d=r.d,e.e=0,c(t,i)(e);var o=/\bMSIE\s(\d+)/.exec(navigator.userAgent),o=o&&+o[1]<=8,t=/\n/g,a=e.a,s=a.length,r=0,l=e.d,u=l.length,i=0,f=e.g,p=f.length,h=0;f[p]=s;var m,g;for(g=m=0;p>g;)f[g]!==f[g+2]?(f[m++]=f[g++],f[m++]=f[g++]):g+=2;for(p=m,g=m=0;p>g;){for(var v=f[g],y=f[g+1],b=g+2;p>=b+2&&f[b+1]===y;)b+=2;f[m++]=v,f[m++]=y,g=b}f.length=m;var x=e.c,w;x&&(w=x.style.display,x.style.display="none");try{for(;u>i;){var C=l[i+2]||s,S=f[h+2]||s,b=Math.min(C,S),k=l[i+1],T;if(1!==k.nodeType&&(T=a.substring(r,b))){o&&(T=T.replace(t,"\r")),k.nodeValue=T;var E=k.ownerDocument,N=E.createElement("span");N.className=f[h+1];var L=k.parentNode;L.replaceChild(N,k),N.appendChild(k),C>r&&(l[i+1]=k=E.createTextNode(a.substring(b,C)),L.insertBefore(k,N.nextSibling))}r=b,r>=C&&(i+=2),r>=S&&(h+=2)}}finally{x&&(x.style.display=w)}}catch(A){d.console&&console.log(A&&A.stack||A)}}var d=window,f=["break,continue,do,else,for,if,return,while"],p=[[f,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],h=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],m=[p,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],g=[m,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],p=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],v=[f,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],y=[f,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],b=[f,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],f=[f,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],x=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,w=/\S/,C=a({keywords:[h,g,p,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",v,y,f],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),S={};l(C,["default-code"]),l(o([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]),l(o([["pln",/^\s+/,e," \r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,e,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]),l(o([],[["atv",/^[\S\s]+/]]),["uq.val"]),l(a({keywords:h,hashComments:!0,cStyleComments:!0,types:x}),["c","cc","cpp","cxx","cyc","m"]),l(a({keywords:"null,true,false"}),["json"]),l(a({keywords:g,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:x}),["cs"]),l(a({keywords:m,cStyleComments:!0}),["java"]),l(a({keywords:f,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]),l(a({keywords:v,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]),l(a({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]),l(a({keywords:y,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]),l(a({keywords:p,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]),l(a({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]),l(a({keywords:b,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]),l(o([],[["str",/^[\S\s]+/]]),["regex"]);var k=d.PR={createSimpleLexer:o,registerLangHandler:l,sourceDecorator:a,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:d.prettyPrintOne=function(e,t,n){var r=document.createElement("div");return r.innerHTML="<pre>"+e+"</pre>",r=r.firstChild,n&&s(r,n,!0),u({h:t,j:n,c:r,i:1}),r.innerHTML},prettyPrint:d.prettyPrint=function(t,n){function r(){for(var n=d.PR_SHOULD_USE_CONTINUATION?h.now()+250:1/0;m<l.length&&h.now()<n;m++){for(var o=l[m],c=S,f=o;f=f.previousSibling;){var p=f.nodeType,k=(7===p||8===p)&&f.nodeValue;if(k?!/^\??prettify\b/.test(k):3!==p||/\S/.test(f.nodeValue))break;if(k){c={},k.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(e,t,n){c[t]=n});break}}if(f=o.className,(c!==S||y.test(f))&&!b.test(f)){for(p=!1,k=o.parentNode;k;k=k.parentNode)if(C.test(k.tagName)&&k.className&&y.test(k.className)){p=!0;break}if(!p){if(o.className+=" prettyprinted",p=c.lang,!p){var p=f.match(v),T;!p&&(T=i(o))&&w.test(T.tagName)&&(p=T.className.match(v)),p&&(p=p[1])}if(x.test(o.tagName))k=1;else var k=o.currentStyle,E=a.defaultView,k=(k=k?k.whiteSpace:E&&E.getComputedStyle?E.getComputedStyle(o,e).getPropertyValue("white-space"):0)&&"pre"===k.substring(0,3);E=c.linenums,(E="true"===E||+E)||(E=(E=f.match(/\blinenums\b(?::(\d+))?/))?E[1]&&E[1].length?+E[1]:!0:!1),E&&s(o,E,k),g={h:p,c:o,j:E,i:k},u(g)}}}m<l.length?setTimeout(r,250):"function"==typeof t&&t()}for(var o=n||document.body,a=o.ownerDocument||document,o=[o.getElementsByTagName("pre"),o.getElementsByTagName("code"),o.getElementsByTagName("xmp")],l=[],c=0;c<o.length;++c)for(var f=0,p=o[c].length;p>f;++f)l.push(o[c][f]);var o=e,h=Date;h.now||(h={now:function(){return+new Date}});var m=0,g,v=/\blang(?:uage)?-([\w.]+)(?!\S)/,y=/\bprettyprint\b/,b=/\bprettyprinted\b/,x=/pre|xmp/i,w=/^code$/i,C=/^(?:pre|code|xmp)$/i,S={};r()}};"function"==typeof define&&define.amd&&define("google-code-prettify",[],function(){return k})}()}(),PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\n\r]*/,null,"#"],["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[ES]?BANK=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[!-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["apollo","agc","aea"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^"(?:[^\n\r"\\]|\\.)*(?:"|$)/,a,'"'],["pln",/^\s+/,a," \r\n  "]],[["com",/^REM[^\n\r]*/,a],["kwd",/^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/,a],["pln",/^[a-z][^\W_]?(?:\$|%)?/i,a],["lit",/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/i,a,"0123456789"],["pun",/^.[^\s\w"$%.]*/,a]]),["basic","cbm"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^[([{]+/,a,"([{"],["clo",/^[)\]}]+/,a,")]}"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/,a],["typ",/^:[\dA-Za-z-]+/]]),["clj"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \r\n\f"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]+)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}\b/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]),PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]),PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "]],[["com",/^#!.*/],["kwd",/^\b(?:import|library|part of|part|as|show|hide)\b/i],["com",/^\/\/.*/],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["kwd",/^\b(?:class|interface)\b/i],["kwd",/^\b(?:assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\b/i],["kwd",/^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i],["typ",/^\b(?:bool|double|dynamic|int|num|object|string|void)\b/i],["kwd",/^\b(?:false|null|true)\b/i],["str",/^r?'''[\S\s]*?[^\\]'''/],["str",/^r?"""[\S\s]*?[^\\]"""/],["str",/^r?'('|[^\n\f\r]*?[^\\]')/],["str",/^r?"("|[^\n\f\r]*?[^\\]")/],["pln",/^[$_a-z]\w*/i],["pun",/^[!%&*+/:<-?^|~-]/],["lit",/^\b0x[\da-f]+/i],["lit",/^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],["lit",/^\b\.\d+(?:e[+-]?\d+)?/i],["pun",/^[(),.;[\]{}]/]]),["dart"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null," \n \f\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["lit",/^[a-z]\w*/],["lit",/^'(?:[^\n\f\r'\\]|\\[^&])+'?/,null,"'"],["lit",/^\?[^\t\n ({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],["kwd",/^-[_a-z]+/],["typ",/^[A-Z_]\w*/],["pun",/^[,.;]/]]),["erlang","erl"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null," \n \f\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/,null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","lsp","scm","ss","rkt"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^!?"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["com",/^;[^\n\r]*/,null,";"]],[["pln",/^[!%@](?:[$\-.A-Z_a-z][\w$\-.]*|\d+)/],["kwd",/^[^\W\d]\w*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[Xx][\dA-Fa-f]+)/],["pun",/^[(-*,:<->[\]{}]|\.\.\.$/]]),["llvm","ll"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\S\s]*?(?:]\1]|$)|[^\n\r]*)/],["str",/^\[(=*)\[[\S\s]*?(?:]\1]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z]\w*/i],["pun",/^[^\w\t\n\r \xa0][^\w\t\n\r "'+=\xa0-]*/]]),["lua"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["com",/^#(?:if[\t\n\r \xa0]+(?:[$_a-z][\w']*|``[^\t\n\r`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])(?:'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\(\*[\S\s]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^(?:[_a-z][\w']*[!#?]?|``[^\t\n\r`]*(?:``|$))/i],["pun",/^[^\w\t\n\r "'\xa0]+/]]),["fs","ml"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^"(?:[^"]|\\.)*"/,null,'"']],[["com",/^;[^\n\r]*/,null,";"],["dec",/^\$(?:d|device|ec|ecode|es|estack|et|etrap|h|horolog|i|io|j|job|k|key|p|principal|q|quit|st|stack|s|storage|sy|system|t|test|tl|tlevel|tr|trestart|x|y|z[a-z]*|a|ascii|c|char|d|data|e|extract|f|find|fn|fnumber|g|get|j|justify|l|length|na|name|o|order|p|piece|ql|qlength|qs|qsubscript|q|query|r|random|re|reverse|s|select|st|stack|t|text|tr|translate|nan)\b/i,null],["kwd",/^(?:[^$]b|break|c|close|d|do|e|else|f|for|g|goto|h|halt|h|hang|i|if|j|job|k|kill|l|lock|m|merge|n|new|o|open|q|quit|r|read|s|set|tc|tcommit|tre|trestart|tro|trollback|ts|tstart|u|use|v|view|w|write|x|xecute)\b/i,null],["lit",/^[+-]?(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?/i],["pln",/^[a-z][^\W_]*/i],["pun",/^[^\w\t\n\r"$%;^\xa0]|_/]]),["mumps"]);
-var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n  "]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/,a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n  "]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a],["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]),PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/],["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^{+/,a,"{"],["clo",/^}+/,a,"}"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^[\t\n\r \xa0]+/,a," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["tcl"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null," \n\r  \u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"“”'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'‘’"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i,null],["com",/^rem\b.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[!#%&@]+])?|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i],["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"  abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]),PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);var a=null,a=null;PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]),function(e){e.fn.zclip=function(t){if("object"==typeof t&&!t.length){var n=e.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:!0,setHandCursor:!0,setCSSEffects:!0},t);return this.each(function(){var t=e(this);if(t.is(":visible")&&("string"==typeof n.copy||e.isFunction(n.copy))){ZeroClipboard.setMoviePath(n.path);var r=new ZeroClipboard.Client;e.isFunction(n.copy)&&t.bind("zClip_copy",n.copy),e.isFunction(n.beforeCopy)&&t.bind("zClip_beforeCopy",n.beforeCopy),e.isFunction(n.afterCopy)&&t.bind("zClip_afterCopy",n.afterCopy),r.setHandCursor(n.setHandCursor),r.setCSSEffects(n.setCSSEffects),r.addEventListener("mouseOver",function(e){t.trigger("mouseenter")}),r.addEventListener("mouseOut",function(e){t.trigger("mouseleave")}),r.addEventListener("mouseDown",function(i){t.trigger("mousedown"),r.setText(e.isFunction(n.copy)?t.triggerHandler("zClip_copy"):n.copy),e.isFunction(n.beforeCopy)&&t.trigger("zClip_beforeCopy")}),r.addEventListener("complete",function(r,i){e.isFunction(n.afterCopy)?t.trigger("zClip_afterCopy"):(i.length>500&&(i=i.substr(0,500)+"...\n\n("+(i.length-500)+" characters not shown)"),t.removeClass("hover"),alert("Copied text to clipboard:\n\n "+i)),n.clickAfter&&t.trigger("click")}),r.glue(t[0],t.parent()[0]),e(window).bind("load resize",function(){r.reposition()})}})}return"string"==typeof t?this.each(function(){var n=e(this);t=t.toLowerCase();var r=n.data("zclipId"),i=e("#"+r+".zclip");"remove"==t?(i.remove(),n.removeClass("active hover")):"hide"==t?(i.hide(),n.removeClass("active hover")):"show"==t&&i.show()}):void 0}}(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(e){return"string"==typeof e&&(e=document.getElementById(e)),e.addClass||(e.hide=function(){},e.show=function(){this.style.display=""},e.addClass=function(e){this.removeClass(e),this.className+=" "+e},e.removeClass=function(e){for(var t=this.className.split(/\s+/),n=-1,r=0;r<t.length;r++)t[r]==e&&(n=r,r=t.length);return n>-1&&(t.splice(n,1),this.className=t.join(" ")),this},e.hasClass=function(e){return!!this.className.match(new RegExp("\\s*"+e+"\\s*"))}),e},setMoviePath:function(e){this.moviePath=e},dispatch:function(e,t,n){var r=this.clients[e];r&&r.receiveEvent(t,n)},register:function(e,t){this.clients[e]=t},getDOMObjectPosition:function(e,t){var n={left:0,top:0,width:e.width?e.width:e.offsetWidth,height:e.height?e.height:e.offsetHeight};return e&&e!=t&&(n.left+=e.offsetLeft,n.top+=e.offsetTop),n},Client:function(e){this.handlers={},this.id=ZeroClipboard.nextId++,this.movieId="ZeroClipboardMovie_"+this.id,ZeroClipboard.register(this.id,this),e&&this.glue(e)}};ZeroClipboard.Client.prototype={id:0,ready:!1,movie:null,clipText:"",handCursorEnabled:!0,cssEffects:!0,handlers:null,glue:function(e,t,n){this.domElement=ZeroClipboard.$(e);var r=99;this.domElement.style.zIndex&&(r=parseInt(this.domElement.style.zIndex,10)+1),"string"==typeof t?t=ZeroClipboard.$(t):"undefined"==typeof t&&(t=document.getElementsByTagName("body")[0]);var i=ZeroClipboard.getDOMObjectPosition(this.domElement,t);this.div=document.createElement("div"),this.div.className="zclip",this.div.id="zclip-"+this.movieId,$(this.domElement).data("zclipId","zclip-"+this.movieId);var o=this.div.style;if(o.position="absolute",o.left=""+i.left+"px",o.top=""+i.top+"px",o.width=""+i.width+"px",o.height=""+i.height+"px",o.zIndex=r,"object"==typeof n)for(addedStyle in n)o[addedStyle]=n[addedStyle];t.appendChild(this.div),this.div.innerHTML=this.getHTML(i.width,i.height)},getHTML:function(e,t){var n="",r="id="+this.id+"&width="+e+"&height="+t;if(navigator.userAgent.match(/MSIE/)){var i=location.href.match(/^https/i)?"https://":"http://";n+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+i+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+e+'" height="'+t+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+r+'"/><param name="wmode" value="transparent"/></object>'}else n+='<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+e+'" height="'+t+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+r+'" wmode="transparent" />';return n},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide(),this.div.innerHTML="";var e=document.getElementsByTagName("body")[0];try{e.removeChild(this.div)}catch(t){}this.domElement=null,this.div=null}},reposition:function(e){if(e&&(this.domElement=ZeroClipboard.$(e),this.domElement||this.hide()),this.domElement&&this.div){var t=ZeroClipboard.getDOMObjectPosition(this.domElement),n=this.div.style;n.left=""+t.left+"px",n.top=""+t.top+"px"}},setText:function(e){this.clipText=e,this.ready&&this.movie.setText(e)},addEventListener:function(e,t){e=e.toString().toLowerCase().replace(/^on/,""),this.handlers[e]||(this.handlers[e]=[]),this.handlers[e].push(t)},setHandCursor:function(e){this.handCursorEnabled=e,this.ready&&this.movie.setHandCursor(e)},setCSSEffects:function(e){this.cssEffects=!!e},receiveEvent:function(e,t){switch(e=e.toString().toLowerCase().replace(/^on/,"")){case"load":if(this.movie=document.getElementById(this.movieId),!this.movie){var n=this;return void setTimeout(function(){n.receiveEvent("load",null)},1)}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var n=this;return setTimeout(function(){n.receiveEvent("load",null)},100),void(this.ready=!0)}this.ready=!0;try{this.movie.setText(this.clipText)}catch(r){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(r){}break;case"mouseover":this.domElement&&this.cssEffects&&(this.domElement.addClass("hover"),this.recoverActive&&this.domElement.addClass("active"));break;case"mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0),this.domElement.removeClass("hover"));break;case"mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case"mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[e])for(var i=0,o=this.handlers[e].length;o>i;i++){var a=this.handlers[e][i];"function"==typeof a?a(this,t):"object"==typeof a&&2==a.length?a[0][a[1]](this,t):"string"==typeof a&&window[a](this,t)}}},$.fn.extend({tabs:function(){Tabs(this)}}),$.fn.extend({markdown_preview:function(e){Preview(this,e)}}),function($){function e(e,t){return"function"==typeof e?e.call(t):e}function t(e){for(;e=e.parentNode;)if(e==document)return!0;return!1}function n(e,t){this.$element=$(e),this.options=t,this.enabled=!0,this.fixTitle()}n.prototype={show:function(){var t=this.getTitle();if(t&&this.enabled){var n=this.tip();n.find(".tipsy-inner")[this.options.html?"html":"text"](t),n[0].className="tipsy",n.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).prependTo(document.body);var r=$.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight}),i=n[0].offsetWidth,o=n[0].offsetHeight,a=e(this.options.gravity,this.$element[0]),s;switch(a.charAt(0)){case"n":s={top:r.top+r.height+this.options.offset,left:r.left+r.width/2-i/2};break;case"s":s={top:r.top-o-this.options.offset,left:r.left+r.width/2-i/2};break;case"e":s={top:r.top+r.height/2-o/2,left:r.left-i-this.options.offset};break;case"w":s={top:r.top+r.height/2-o/2,left:r.left+r.width+this.options.offset}}2==a.length&&(s.left="w"==a.charAt(1)?r.left+r.width/2-15:r.left+r.width/2-i+15),n.css(s).addClass("tipsy-"+a),n.find(".tipsy-arrow")[0].className="tipsy-arrow tipsy-arrow-"+a.charAt(0),this.options.className&&n.addClass(e(this.options.className,this.$element[0])),this.options.fade?n.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity}):n.css({visibility:"visible",opacity:this.options.opacity})}},hide:function(){this.options.fade?this.tip().stop().fadeOut(function(){$(this).remove()}):this.tip().remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||"string"!=typeof e.attr("original-title"))&&e.attr("original-title",e.attr("title")||"").removeAttr("title")},getTitle:function(){var e,t=this.$element,n=this.options;this.fixTitle();var e,n=this.options;return"string"==typeof n.title?e=t.attr("title"==n.title?"original-title":n.title):"function"==typeof n.title&&(e=n.title.call(t[0])),e=(""+e).replace(/(^\s*|\s*$)/,""),e||n.fallback},tip:function(){return this.$tip||(this.$tip=$('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>'),this.$tip.data("tipsy-pointee",this.$element[0])),this.$tip},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled}},$.fn.tipsy=function(e){function t(t){var r=$.data(t,"tipsy");return r||(r=new n(t,$.fn.tipsy.elementOptions(t,e)),$.data(t,"tipsy",r)),r}function r(){var n=t(this);n.hoverState="in",0==e.delayIn?n.show():(n.fixTitle(),setTimeout(function(){"in"==n.hoverState&&n.show()},e.delayIn))}function i(){var n=t(this);n.hoverState="out",0==e.delayOut?n.hide():setTimeout(function(){"out"==n.hoverState&&n.hide()},e.delayOut)}if(e===!0)return this.data("tipsy");if("string"==typeof e){var o=this.data("tipsy");return o&&o[e](),this}if(e=$.extend({},$.fn.tipsy.defaults,e),e.live||this.each(function(){t(this)}),"manual"!=e.trigger){var a=e.live?"live":"bind",s="hover"==e.trigger?"mouseenter":"focus",l="hover"==e.trigger?"mouseleave":"blur";this[a](s,r)[a](l,i)}return this},$.fn.tipsy.defaults={className:null,delayIn:0,delayOut:0,fade:!1,fallback:"",gravity:"n",html:!1,live:!1,offset:0,opacity:.8,title:"title",trigger:"hover"},$.fn.tipsy.revalidate=function(){$(".tipsy").each(function(){var e=$.data(this,"tipsy-pointee");e&&t(e)||$(this).remove()})},$.fn.tipsy.elementOptions=function(e,t){return $.metadata?$.extend({},t,$(e).metadata()):t},$.fn.tipsy.autoNS=function(){return $(this).offset().top>$(document).scrollTop()+$(window).height()/2?"s":"n"},$.fn.tipsy.autoWE=function(){return $(this).offset().left>$(document).scrollLeft()+$(window).width()/2?"e":"w"},$.fn.tipsy.autoBounds=function(e,t){return function(){var n={ns:t[0],ew:t.length>1?t[1]:!1},r=$(document).scrollTop()+e,i=$(document).scrollLeft()+e,o=$(this);return o.offset().top<r&&(n.ns="n"),o.offset().left<i&&(n.ew="w"),$(window).width()+$(document).scrollLeft()-o.offset().left<e&&(n.ew="e"),$(window).height()+$(document).scrollTop()-o.offset().top<e&&(n.ns="s"),n.ns+(n.ew?n.ew:"")}}}(jQuery);var Gogs={};!function($){var ajax=$.ajax;$.extend({ajax:function(url,options){"object"==typeof url&&(options=url,url=void 0),options=options||{},url=options.url;var csrftoken=$("meta[name=_csrf]").attr("content"),headers=options.headers||{},domain=document.domain.replace(/\./gi,"\\.");(!/^(http:|https:).*/.test(url)||eval("/^(http:|https:)\\/\\/(.+\\.)*"+domain+".*/").test(url))&&(headers=$.extend(headers,{"X-Csrf-Token":csrftoken})),options.headers=headers;var callback=options.success;return options.success=function(e){e.once&&$("[name=_once]").val(e.once),callback&&callback.apply(this,arguments)},ajax(url,options)},changeHash:function(e){history.pushState?history.pushState(null,null,e):location.hash=e},deSelect:function(){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()}}),$.fn.extend({toggleHide:function(){$(this).addClass("hidden")},toggleShow:function(){$(this).removeClass("hidden")},toggleAjax:function(e,t){var n=$(this).data("ajax"),r=$(this).data("ajax-method")||"get",i=$(this).data("ajax-name"),o={};i.endsWith("preview")&&(o.mode="gfm",o.context=$(this).data("ajax-context")),$("[data-ajax-rel="+i+"]").each(function(){var e=$(this).data("ajax-field"),t=$(this).data("ajax-val");return"val"==t?(o[e]=$(this).val(),!0):"txt"==t?(o[e]=$(this).text(),!0):"html"==t?(o[e]=$(this).html(),!0):"data"==t?(o[e]=$(this).data("ajax-data"),!0):!0}),console.log("toggleAjax:",r,n,o),$.ajax({url:n,method:r.toUpperCase(),data:o,error:t,success:function(t){e&&e(t)}})}})}(jQuery),function($){Gogs.renderMarkdown=function(){var e=$(".markdown"),t=e.find("pre > code").parent();t.addClass("prettyprint"),prettyPrint();var n={};e.find("h1, h2, h3, h4, h5, h6").each(function(){var e=$(this),t=encodeURIComponent(e.text().toLowerCase().replace(/[^\w\- ]/g,"").replace(/[ ]/g,"-")),r=t;n[t]>0&&(r=t+"-"+n[t]),void 0==n[t]?n[t]=1:n[t]+=1,e=e.wrap('<div id="'+r+'" class="anchor-wrap" ></div>'),e.append('<a class="anchor" href="#'+r+'"><span class="octicon octicon-link"></span></a>')})},Gogs.renderCodeView=function(){function e(e,t,n){if(e.removeClass("active"),n){var r=parseInt(t.attr("rel").substr(1)),o=parseInt(n.attr("rel").substr(1)),a;if(r!=o){r>o&&(a=r,r=o,o=a);var s=[];for(i=r;o>=i;i++)s.push(".L"+i);return e.filter(s.join(",")).addClass("active"),void $.changeHash("#L"+r+"-L"+o)}}t.addClass("active"),$.changeHash("#"+t.attr("rel"))}$(document).on("click",".lines-num span",function(t){var n=$(this),r=n.parent().siblings(".lines-code").find("ol.linenums > li");e(r,r.filter("[rel="+n.attr("rel")+"]"),t.shiftKey?r.filter(".active").eq(0):null),$.deSelect()}),$(".code-view .lines-code > pre").each(function(){var e=$(this),t=e.parent(),n=t.siblings(".lines-num");if(n.length>0)for(var r=e.find("ol.linenums > li").length,i=1;r>=i;i++)n.append('<span id="L'+i+'" rel="L'+i+'">'+i+"</span>")}),$(window).on("hashchange",function(t){var n=window.location.hash.match(/^#(L\d+)\-(L\d+)$/),r=$(".code-view ol.linenums > li"),i;return n?(i=r.filter("."+n[1]),e(r,i,r.filter("."+n[2])),void $("html, body").scrollTop(i.offset().top-200)):(n=window.location.hash.match(/^#(L\d+)$/),void(n&&(i=r.filter("."+n[1]),e(r,i),$("html, body").scrollTop(i.offset().top-200))))}).trigger("hashchange")},Gogs.searchUsers=function(e,t){$.ajax({url:Gogs.AppSubUrl+"/api/v1/users/search?q="+e,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><img src="'+t.avatar+'">'+t.username+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.searchRepos=function(e,t,n){$.ajax({url:Gogs.AppSubUrl+"/api/v1/repos/search?q="+e+"&"+n,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><span class="octicon octicon-repo"></span> '+t.repolink+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.bindCopy=function(e){$(e).hasClass("js-copy-bind")||$(e).zclip({path:Gogs.AppSubUrl+"/js/ZeroClipboard.swf",copy:function(){var e=$(this).data("copy-val"),t=$($(this).data("copy-from")),n="";return"txt"==e&&(n=t.text()),"val"==e&&(n=t.val()),"html"==e&&(n=t.html()),n},afterCopy:function(){var e=$(this);e.tipsy("hide").attr("original-title",e.data("after-title")),setTimeout(function(){e.tipsy("show")},200),setTimeout(function(){e.tipsy("hide").attr("original-title",e.data("original-title"))},2e3)}}).addClass("js-copy-bind")}}(jQuery),$(document).ready(function(){Gogs.AppSubUrl=$("head").data("suburl")||"",initCore(),$("#user-profile-setting").length&&initUserSetting(),($("#repo-create-form").length||$("#repo-migrate-form").length)&&initRepoCreate(),$("#repo-header").length&&initRepo(),$("#repo-setting").length&&initRepoSetting(),$("#org-setting").length&&initOrgSetting(),$("#invite-box").length&&initInvite(),$("#team-create-form").length&&initOrgTeamCreate(),$("#team-members-list").length&&initTeamMembersList(),$("#team-repositories-list").length&&initTeamRepositoriesList(),$("#admin-setting").length&&initAdmin(),$("#install-form").length&&initInstall(),$("#user-profile-page").length&&initProfile(),$("#diff-page").length&&(initTimeSwitch(),initDiff()),$("#dashboard-sidebar-menu").tabs(),$("#pull-issue-preview").markdown_preview(".issue-add-comment"),homepage();var e=$("#footer-lang li").length;$("#footer-lang .drop-down").css({top:-31*e+"px",height:31*e-3+"px"})}); \ No newline at end of file
+var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n  "]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/,a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n  "]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a],["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]),PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/],["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|following|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\w-]|$)/i,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);var a=null;PR.registerLangHandler(PR.createSimpleLexer([["opn",/^{+/,a,"{"],["clo",/^}+/,a,"}"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^[\t\n\r \xa0]+/,a," \n\r  "],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\b/,a],["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["tcl"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null," \n\r  \u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"“”'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'‘’"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i,null],["com",/^rem\b.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*(?:\[[!#%&@]+])?|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null," \n\r  "]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i],["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]),PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"  abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]),PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);var a=null,a=null;PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]),function(e){e.fn.zclip=function(t){if("object"==typeof t&&!t.length){var n=e.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:!0,setHandCursor:!0,setCSSEffects:!0},t);return this.each(function(){var t=e(this);if(t.is(":visible")&&("string"==typeof n.copy||e.isFunction(n.copy))){ZeroClipboard.setMoviePath(n.path);var r=new ZeroClipboard.Client;e.isFunction(n.copy)&&t.bind("zClip_copy",n.copy),e.isFunction(n.beforeCopy)&&t.bind("zClip_beforeCopy",n.beforeCopy),e.isFunction(n.afterCopy)&&t.bind("zClip_afterCopy",n.afterCopy),r.setHandCursor(n.setHandCursor),r.setCSSEffects(n.setCSSEffects),r.addEventListener("mouseOver",function(e){t.trigger("mouseenter")}),r.addEventListener("mouseOut",function(e){t.trigger("mouseleave")}),r.addEventListener("mouseDown",function(i){t.trigger("mousedown"),r.setText(e.isFunction(n.copy)?t.triggerHandler("zClip_copy"):n.copy),e.isFunction(n.beforeCopy)&&t.trigger("zClip_beforeCopy")}),r.addEventListener("complete",function(r,i){e.isFunction(n.afterCopy)?t.trigger("zClip_afterCopy"):(i.length>500&&(i=i.substr(0,500)+"...\n\n("+(i.length-500)+" characters not shown)"),t.removeClass("hover"),alert("Copied text to clipboard:\n\n "+i)),n.clickAfter&&t.trigger("click")}),r.glue(t[0],t.parent()[0]),e(window).bind("load resize",function(){r.reposition()})}})}return"string"==typeof t?this.each(function(){var n=e(this);t=t.toLowerCase();var r=n.data("zclipId"),i=e("#"+r+".zclip");"remove"==t?(i.remove(),n.removeClass("active hover")):"hide"==t?(i.hide(),n.removeClass("active hover")):"show"==t&&i.show()}):void 0}}(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(e){return"string"==typeof e&&(e=document.getElementById(e)),e.addClass||(e.hide=function(){},e.show=function(){this.style.display=""},e.addClass=function(e){this.removeClass(e),this.className+=" "+e},e.removeClass=function(e){for(var t=this.className.split(/\s+/),n=-1,r=0;r<t.length;r++)t[r]==e&&(n=r,r=t.length);return n>-1&&(t.splice(n,1),this.className=t.join(" ")),this},e.hasClass=function(e){return!!this.className.match(new RegExp("\\s*"+e+"\\s*"))}),e},setMoviePath:function(e){this.moviePath=e},dispatch:function(e,t,n){var r=this.clients[e];r&&r.receiveEvent(t,n)},register:function(e,t){this.clients[e]=t},getDOMObjectPosition:function(e,t){var n={left:0,top:0,width:e.width?e.width:e.offsetWidth,height:e.height?e.height:e.offsetHeight};return e&&e!=t&&(n.left+=e.offsetLeft,n.top+=e.offsetTop),n},Client:function(e){this.handlers={},this.id=ZeroClipboard.nextId++,this.movieId="ZeroClipboardMovie_"+this.id,ZeroClipboard.register(this.id,this),e&&this.glue(e)}};ZeroClipboard.Client.prototype={id:0,ready:!1,movie:null,clipText:"",handCursorEnabled:!0,cssEffects:!0,handlers:null,glue:function(e,t,n){this.domElement=ZeroClipboard.$(e);var r=99;this.domElement.style.zIndex&&(r=parseInt(this.domElement.style.zIndex,10)+1),"string"==typeof t?t=ZeroClipboard.$(t):"undefined"==typeof t&&(t=document.getElementsByTagName("body")[0]);var i=ZeroClipboard.getDOMObjectPosition(this.domElement,t);this.div=document.createElement("div"),this.div.className="zclip",this.div.id="zclip-"+this.movieId,$(this.domElement).data("zclipId","zclip-"+this.movieId);var o=this.div.style;if(o.position="absolute",o.left=""+i.left+"px",o.top=""+i.top+"px",o.width=""+i.width+"px",o.height=""+i.height+"px",o.zIndex=r,"object"==typeof n)for(addedStyle in n)o[addedStyle]=n[addedStyle];t.appendChild(this.div),this.div.innerHTML=this.getHTML(i.width,i.height)},getHTML:function(e,t){var n="",r="id="+this.id+"&width="+e+"&height="+t;if(navigator.userAgent.match(/MSIE/)){var i=location.href.match(/^https/i)?"https://":"http://";n+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+i+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+e+'" height="'+t+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+r+'"/><param name="wmode" value="transparent"/></object>'}else n+='<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+e+'" height="'+t+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+r+'" wmode="transparent" />';return n},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide(),this.div.innerHTML="";var e=document.getElementsByTagName("body")[0];try{e.removeChild(this.div)}catch(t){}this.domElement=null,this.div=null}},reposition:function(e){if(e&&(this.domElement=ZeroClipboard.$(e),this.domElement||this.hide()),this.domElement&&this.div){var t=ZeroClipboard.getDOMObjectPosition(this.domElement),n=this.div.style;n.left=""+t.left+"px",n.top=""+t.top+"px"}},setText:function(e){this.clipText=e,this.ready&&this.movie.setText(e)},addEventListener:function(e,t){e=e.toString().toLowerCase().replace(/^on/,""),this.handlers[e]||(this.handlers[e]=[]),this.handlers[e].push(t)},setHandCursor:function(e){this.handCursorEnabled=e,this.ready&&this.movie.setHandCursor(e)},setCSSEffects:function(e){this.cssEffects=!!e},receiveEvent:function(e,t){switch(e=e.toString().toLowerCase().replace(/^on/,"")){case"load":if(this.movie=document.getElementById(this.movieId),!this.movie){var n=this;return void setTimeout(function(){n.receiveEvent("load",null)},1)}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var n=this;return setTimeout(function(){n.receiveEvent("load",null)},100),void(this.ready=!0)}this.ready=!0;try{this.movie.setText(this.clipText)}catch(r){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(r){}break;case"mouseover":this.domElement&&this.cssEffects&&(this.domElement.addClass("hover"),this.recoverActive&&this.domElement.addClass("active"));break;case"mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0),this.domElement.removeClass("hover"));break;case"mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case"mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[e])for(var i=0,o=this.handlers[e].length;o>i;i++){var a=this.handlers[e][i];"function"==typeof a?a(this,t):"object"==typeof a&&2==a.length?a[0][a[1]](this,t):"string"==typeof a&&window[a](this,t)}}},$.fn.extend({tabs:function(){Tabs(this)}}),$.fn.extend({markdown_preview:function(e){Preview(this,e)}}),function($){function e(e,t){return"function"==typeof e?e.call(t):e}function t(e){for(;e=e.parentNode;)if(e==document)return!0;return!1}function n(e,t){this.$element=$(e),this.options=t,this.enabled=!0,this.fixTitle()}n.prototype={show:function(){var t=this.getTitle();if(t&&this.enabled){var n=this.tip();n.find(".tipsy-inner")[this.options.html?"html":"text"](t),n[0].className="tipsy",n.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).prependTo(document.body);var r=$.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight}),i=n[0].offsetWidth,o=n[0].offsetHeight,a=e(this.options.gravity,this.$element[0]),s;switch(a.charAt(0)){case"n":s={top:r.top+r.height+this.options.offset,left:r.left+r.width/2-i/2};break;case"s":s={top:r.top-o-this.options.offset,left:r.left+r.width/2-i/2};break;case"e":s={top:r.top+r.height/2-o/2,left:r.left-i-this.options.offset};break;case"w":s={top:r.top+r.height/2-o/2,left:r.left+r.width+this.options.offset}}2==a.length&&(s.left="w"==a.charAt(1)?r.left+r.width/2-15:r.left+r.width/2-i+15),n.css(s).addClass("tipsy-"+a),n.find(".tipsy-arrow")[0].className="tipsy-arrow tipsy-arrow-"+a.charAt(0),this.options.className&&n.addClass(e(this.options.className,this.$element[0])),this.options.fade?n.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity}):n.css({visibility:"visible",opacity:this.options.opacity})}},hide:function(){this.options.fade?this.tip().stop().fadeOut(function(){$(this).remove()}):this.tip().remove()},fixTitle:function(){var e=this.$element;(e.attr("title")||"string"!=typeof e.attr("original-title"))&&e.attr("original-title",e.attr("title")||"").removeAttr("title")},getTitle:function(){var e,t=this.$element,n=this.options;this.fixTitle();var e,n=this.options;return"string"==typeof n.title?e=t.attr("title"==n.title?"original-title":n.title):"function"==typeof n.title&&(e=n.title.call(t[0])),e=(""+e).replace(/(^\s*|\s*$)/,""),e||n.fallback},tip:function(){return this.$tip||(this.$tip=$('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>'),this.$tip.data("tipsy-pointee",this.$element[0])),this.$tip},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled}},$.fn.tipsy=function(e){function t(t){var r=$.data(t,"tipsy");return r||(r=new n(t,$.fn.tipsy.elementOptions(t,e)),$.data(t,"tipsy",r)),r}function r(){var n=t(this);n.hoverState="in",0==e.delayIn?n.show():(n.fixTitle(),setTimeout(function(){"in"==n.hoverState&&n.show()},e.delayIn))}function i(){var n=t(this);n.hoverState="out",0==e.delayOut?n.hide():setTimeout(function(){"out"==n.hoverState&&n.hide()},e.delayOut)}if(e===!0)return this.data("tipsy");if("string"==typeof e){var o=this.data("tipsy");return o&&o[e](),this}if(e=$.extend({},$.fn.tipsy.defaults,e),e.live||this.each(function(){t(this)}),"manual"!=e.trigger){var a=e.live?"live":"bind",s="hover"==e.trigger?"mouseenter":"focus",l="hover"==e.trigger?"mouseleave":"blur";this[a](s,r)[a](l,i)}return this},$.fn.tipsy.defaults={className:null,delayIn:0,delayOut:0,fade:!1,fallback:"",gravity:"n",html:!1,live:!1,offset:0,opacity:.8,title:"title",trigger:"hover"},$.fn.tipsy.revalidate=function(){$(".tipsy").each(function(){var e=$.data(this,"tipsy-pointee");e&&t(e)||$(this).remove()})},$.fn.tipsy.elementOptions=function(e,t){return $.metadata?$.extend({},t,$(e).metadata()):t},$.fn.tipsy.autoNS=function(){return $(this).offset().top>$(document).scrollTop()+$(window).height()/2?"s":"n"},$.fn.tipsy.autoWE=function(){return $(this).offset().left>$(document).scrollLeft()+$(window).width()/2?"e":"w"},$.fn.tipsy.autoBounds=function(e,t){return function(){var n={ns:t[0],ew:t.length>1?t[1]:!1},r=$(document).scrollTop()+e,i=$(document).scrollLeft()+e,o=$(this);return o.offset().top<r&&(n.ns="n"),o.offset().left<i&&(n.ew="w"),$(window).width()+$(document).scrollLeft()-o.offset().left<e&&(n.ew="e"),$(window).height()+$(document).scrollTop()-o.offset().top<e&&(n.ns="s"),n.ns+(n.ew?n.ew:"")}}}(jQuery);var Gogs={};!function($){var ajax=$.ajax;$.extend({ajax:function(url,options){"object"==typeof url&&(options=url,url=void 0),options=options||{},url=options.url;var csrftoken=$("meta[name=_csrf]").attr("content"),headers=options.headers||{},domain=document.domain.replace(/\./gi,"\\.");(!/^(http:|https:).*/.test(url)||eval("/^(http:|https:)\\/\\/(.+\\.)*"+domain+".*/").test(url))&&(headers=$.extend(headers,{"X-Csrf-Token":csrftoken})),options.headers=headers;var callback=options.success;return options.success=function(e){e.once&&$("[name=_once]").val(e.once),callback&&callback.apply(this,arguments)},ajax(url,options)},changeHash:function(e){history.pushState?history.pushState(null,null,e):location.hash=e},deSelect:function(){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()}}),$.fn.extend({toggleHide:function(){$(this).addClass("hidden")},toggleShow:function(){$(this).removeClass("hidden")},toggleAjax:function(e,t){var n=$(this).data("ajax"),r=$(this).data("ajax-method")||"get",i=$(this).data("ajax-name"),o={};i.endsWith("preview")&&(o.mode="gfm",o.context=$(this).data("ajax-context")),$("[data-ajax-rel="+i+"]").each(function(){var e=$(this).data("ajax-field"),t=$(this).data("ajax-val");return"val"==t?(o[e]=$(this).val(),!0):"txt"==t?(o[e]=$(this).text(),!0):"html"==t?(o[e]=$(this).html(),!0):"data"==t?(o[e]=$(this).data("ajax-data"),!0):!0}),console.log("toggleAjax:",r,n,o),$.ajax({url:n,method:r.toUpperCase(),data:o,error:t,success:function(t){e&&e(t)}})}})}(jQuery),function($){Gogs.renderMarkdown=function(){var e=$(".markdown"),t=e.find("pre > code").parent();t.addClass("prettyprint"),prettyPrint();var n={};e.find("h1, h2, h3, h4, h5, h6").each(function(){var e=$(this),t=encodeURIComponent(e.text().toLowerCase().replace(/[^\w\- ]/g,"").replace(/[ ]/g,"-")),r=t;n[t]>0&&(r=t+"-"+n[t]),void 0==n[t]?n[t]=1:n[t]+=1,e=e.wrap('<div id="'+r+'" class="anchor-wrap" ></div>'),e.append('<a class="anchor" href="#'+r+'"><span class="octicon octicon-link"></span></a>')})},Gogs.renderCodeView=function(){function e(e,t,n){if(e.removeClass("active"),n){var r=parseInt(t.attr("rel").substr(1)),o=parseInt(n.attr("rel").substr(1)),a;if(r!=o){r>o&&(a=r,r=o,o=a);var s=[];for(i=r;o>=i;i++)s.push(".L"+i);return e.filter(s.join(",")).addClass("active"),void $.changeHash("#L"+r+"-L"+o)}}t.addClass("active"),$.changeHash("#"+t.attr("rel"))}$(document).on("click",".lines-num span",function(t){var n=$(this),r=n.parent().siblings(".lines-code").find("ol.linenums > li");e(r,r.filter("[rel="+n.attr("rel")+"]"),t.shiftKey?r.filter(".active").eq(0):null),$.deSelect()}),$(".code-view .lines-code > pre").each(function(){var e=$(this),t=e.parent(),n=t.siblings(".lines-num");if(n.length>0)for(var r=e.find("ol.linenums > li").length,i=1;r>=i;i++)n.append('<span id="L'+i+'" rel="L'+i+'">'+i+"</span>")}),$(window).on("hashchange",function(t){var n=window.location.hash.match(/^#(L\d+)\-(L\d+)$/),r=$(".code-view ol.linenums > li"),i;return n?(i=r.filter("."+n[1]),e(r,i,r.filter("."+n[2])),void $("html, body").scrollTop(i.offset().top-200)):(n=window.location.hash.match(/^#(L\d+)$/),void(n&&(i=r.filter("."+n[1]),e(r,i),$("html, body").scrollTop(i.offset().top-200))))}).trigger("hashchange")},Gogs.searchUsers=function(e,t){$.ajax({url:Gogs.AppSubUrl+"/api/v1/users/search?q="+e,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><img src="'+t.avatar_url+'">'+t.username+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.searchRepos=function(e,t,n){$.ajax({url:Gogs.AppSubUrl+"/api/v1/repos/search?q="+e+"&"+n,dataType:"json",success:function(e){if(e.ok&&e.data.length){var n="";$.each(e.data,function(e,t){n+='<li><a><span class="octicon octicon-repo"></span> '+t.full_name+"</a></li>"}),t.html(n),t.toggleShow()}else t.toggleHide()}})},Gogs.bindCopy=function(e){$(e).hasClass("js-copy-bind")||$(e).zclip({path:Gogs.AppSubUrl+"/js/ZeroClipboard.swf",copy:function(){var e=$(this).data("copy-val"),t=$($(this).data("copy-from")),n="";return"txt"==e&&(n=t.text()),"val"==e&&(n=t.val()),"html"==e&&(n=t.html()),n},afterCopy:function(){var e=$(this);e.tipsy("hide").attr("original-title",e.data("after-title")),setTimeout(function(){e.tipsy("show")},200),setTimeout(function(){e.tipsy("hide").attr("original-title",e.data("original-title"))},2e3)}}).addClass("js-copy-bind")}}(jQuery),$(document).ready(function(){Gogs.AppSubUrl=$("head").data("suburl")||"",initCore(),$("#user-profile-setting").length&&initUserSetting(),($("#repo-create-form").length||$("#repo-migrate-form").length)&&initRepoCreate(),$("#repo-header").length&&initRepo(),$("#repo-setting").length&&initRepoSetting(),$("#org-setting").length&&initOrgSetting(),$("#invite-box").length&&initInvite(),$("#team-create-form").length&&initOrgTeamCreate(),$("#team-members-list").length&&initTeamMembersList(),$("#team-repositories-list").length&&initTeamRepositoriesList(),$("#admin-setting").length&&initAdmin(),$("#install-form").length&&initInstall(),$("#user-profile-page").length&&initProfile(),$("#diff-page").length&&(initTimeSwitch(),initDiff()),$("#dashboard-sidebar-menu").tabs(),$("#pull-issue-preview").markdown_preview(".issue-add-comment"),homepage();var e=$("#footer-lang li").length;$("#footer-lang .drop-down").css({top:-31*e+"px",height:31*e-3+"px"})}); \ No newline at end of file
diff --git a/public/ng/less/gogs/base.less b/public/ng/less/gogs/base.less
index 49389b06..ed5f2fee 100644
--- a/public/ng/less/gogs/base.less
+++ b/public/ng/less/gogs/base.less
@@ -259,6 +259,9 @@ clear: both;
.text-black {
color: #444444;
}
+.text-gold {
+ color: #a1882b;
+}
.table {
width: 100%;
max-width: 100%;
diff --git a/public/ng/less/gogs/issue.less b/public/ng/less/gogs/issue.less
index 12cc59fc..79f9d793 100644
--- a/public/ng/less/gogs/issue.less
+++ b/public/ng/less/gogs/issue.less
@@ -223,19 +223,19 @@ textarea#issue-add-content {
}
// #issue list navigator
#issue-list-nav {
+ border-bottom: 1px solid #DDD;
+ padding-bottom: 12px;
li {
> a {
font-size: 13px;
font-weight: bold;
- padding: .4em .9em;
- border-radius: .3em;
+ padding: .2em .8em;
}
}
li.current {
> a {
background-color: #0079bc;
color: #FAFAFA;
- border-radius: .3em;
}
}
li.right {
@@ -247,7 +247,120 @@ textarea#issue-add-content {
> a {
padding: 0 !important;
button {
- height: 34px;
+ height: 29px;
+ }
+ }
+}
+// issue list menu
+#issue-list-menu {
+ padding: 16px 0 12px 0;
+ border-bottom: 1px solid #BBB;
+ margin-bottom: 12px;
+ .mark {
+ a {
+ color: #AAA;
+ &:hover {
+ color: #444;
+ }
+ }
+ &.hover {
+ a {
+ color: #222;
+ font-weight: bold;
+ }
+ }
+ }
+ > .left {
+ .mark {
+ margin-right: 12px;
+ }
+ }
+ > .right {
+ .mark {
+ margin-left: 12px;
+ }
+ }
+}
+// each issue list item
+#issue-list,
+#pull-list {
+ .item {
+ position: relative;
+ padding-bottom: 12px;
+ margin-bottom: 12px;
+ border-bottom: 1px dashed #AAA;
+ .title > .title-text {
+ color: #444;
+ font-size: 15px;
+ margin: 0 6px;
+ }
+ .index-num {
+ padding: .25em .6em;
+ }
+ }
+ .comment {
+ color: #666;
+ position: absolute;
+ top: 6px;
+ right: 0;
+ }
+ .issue-label {
+ padding: .25em .6em;
+ a {
+ color: #FFF;
}
}
+ .desc {
+ color: #999;
+ a {
+ color: #999;
+ &:hover {
+ color: #03a2ef;
+ }
+ }
+ }
+}
+// issue list pager
+#issue-list-pager {
+ margin: 18px 0 24px 0;
+ font-size: 14px;
+ line-height: 24px;
+}
+// labels numbers
+#labels-num {
+ margin-right: 1em;
+}
+// labels list
+#label-list {
+ .right {
+ margin-left: 1em;
+ color: #999;
+ i {
+ margin-right: 3px;
+ }
+ line-height: 30px;
+ &:hover {
+ color: #444444;
+ }
+ }
+ .num {
+ margin-right: 3px;
+ }
+ .issue-num {
+ margin-right: 4em;
+ }
+ .label {
+ &:hover {
+ color: #FFF;
+ }
+ i {
+ margin-right: 6px;
+ }
+ }
+ .item {
+ height: 30px;
+ padding-bottom: 12px;
+ margin-bottom: 12px;
+ border-bottom: 1px dashed #AAA;
+ }
} \ No newline at end of file
diff --git a/public/ng/less/gogs/repository.less b/public/ng/less/gogs/repository.less
index 4a8bc738..d0e4a3ce 100644
--- a/public/ng/less/gogs/repository.less
+++ b/public/ng/less/gogs/repository.less
@@ -72,9 +72,9 @@
}
#repo-header-download-drop {
line-height: 24px;
- width: 440px;
+ width: 460px;
top: 50px;
- left: -370px;
+ left: -390px;
padding: 20px;
box-sizing: border-box;
z-index: 1;
@@ -84,12 +84,16 @@
button, input {
font-size: 11px;
}
+ #repo-clone-copy {
+ width: 85px;
+ text-overflow: clip;
+ }
}
#repo-content {
padding: 18px 0;
}
.repo-wide-wrapper {
- padding: 18px 0;
+ padding: 18px;
position: relative;
}
#repo-clone-url {
@@ -655,4 +659,4 @@
white-space: nowrap;
margin-left: 44px;
margin-top: -15px;
-} \ No newline at end of file
+}
diff --git a/public/ng/less/gogs/settings.less b/public/ng/less/gogs/settings.less
index 80c00f2d..de923dab 100644
--- a/public/ng/less/gogs/settings.less
+++ b/public/ng/less/gogs/settings.less
@@ -68,6 +68,7 @@
#repo-hooks-panel,
#repo-hooks-history-panel,
#user-social-panel,
+#user-applications-panel,
#user-ssh-panel {
margin-bottom: 20px;
.setting-list {
@@ -97,16 +98,20 @@
margin-right: 4px;
}
.print,
+ .access,
.activity {
color: #888;
}
+ .access {
+ max-width: 500px;
+ }
}
- .ssh-delete-btn {
+ .ssh-btn {
margin-top: 6px;
}
}
-#user-ssh-add-form {
+.form-settings-add {
.panel-body {
background-color: #FFF;
padding: 30px 0;
diff --git a/public/ng/less/ui.less b/public/ng/less/ui.less
index 3db8b12c..fc7ad3c2 100644
--- a/public/ng/less/ui.less
+++ b/public/ng/less/ui.less
@@ -7,4 +7,5 @@
@import "ui/label";
@import "ui/bread";
@import "ui/alert";
-@import "ui/table"; \ No newline at end of file
+@import "ui/table";
+@import "ui/pager"; \ No newline at end of file
diff --git a/public/ng/less/ui/label.less b/public/ng/less/ui/label.less
index 21a4c82d..ab07718f 100644
--- a/public/ng/less/ui/label.less
+++ b/public/ng/less/ui/label.less
@@ -1,7 +1,7 @@
@import "var";
.label {
- padding: 2px 6px;
+ padding: .3em .6em .2em .6em;
color: @labelFontColor;
}
diff --git a/public/ng/less/ui/pager.less b/public/ng/less/ui/pager.less
new file mode 100644
index 00000000..37540b36
--- /dev/null
+++ b/public/ng/less/ui/pager.less
@@ -0,0 +1,28 @@
+@import "var";
+
+.pager{
+ .page{
+ padding: .3em .5em .2em .5em;
+ margin: 0 .3em;
+ background-color: @pagerPageBgColor;
+ color: @pagerPageColor;
+ &:hover,&.hover{
+ background-color: @pagerHoverBgColor;
+ color: @pagerHoverColor;
+ }
+ }
+ .prev,.next{
+ padding: .4em .6em;
+ margin: 0 .3em;
+ background-color: @pagerDirectionBgColor;
+ color: @pagerDirectionColor;
+ &.invalid{
+ background-color: @pagerInvalidBgColor;
+ color: @pagerInvalidColor;
+ cursor: not-allowed;
+ }
+ }
+ .page-radius{
+ border-radius: .2em;
+ }
+} \ No newline at end of file
diff --git a/public/ng/less/ui/var.less b/public/ng/less/ui/var.less
index e3c5ada6..c9eb1629 100644
--- a/public/ng/less/ui/var.less
+++ b/public/ng/less/ui/var.less
@@ -81,3 +81,12 @@
@preBgColor:#444;
@preFontColor:#FFF;
+
+@pagerPageColor:#444;
+@pagerPageBgColor:#CCC;
+@pagerHoverBgColor:#428BCA;
+@pagerHoverColor:#FFF;
+@pagerInvalidColor:#AAA;
+@pagerInvalidBgColor:#EEE;
+@pagerDirectionBgColor:#505050;
+@pagerDirectionColor:#FAFAFA;
diff --git a/routers/admin/users.go b/routers/admin/users.go
index 35104453..0a1056f3 100644
--- a/routers/admin/users.go
+++ b/routers/admin/users.go
@@ -174,7 +174,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) {
return
}
- // NOTE: need password length check?
+ // FIXME: need password length check
if len(form.Passwd) > 0 {
u.Passwd = form.Passwd
u.Salt = models.GetUserSalt()
@@ -191,6 +191,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) {
u.AvatarEmail = form.Avatar
u.IsActive = form.Active
u.IsAdmin = form.Admin
+ u.AllowGitHook = form.AllowGitHook
if err := models.UpdateUser(u); err != nil {
ctx.Handle(500, "UpdateUser", err)
return
@@ -220,6 +221,9 @@ func DeleteUser(ctx *middleware.Context) {
case models.ErrUserOwnRepos:
ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo"))
ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid"))
+ case models.ErrUserHasOrgs:
+ ctx.Flash.Error(ctx.Tr("admin.users.still_has_org"))
+ ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid"))
default:
ctx.Handle(500, "DeleteUser", err)
}
diff --git a/routers/api/v1/miscellaneous.go b/routers/api/v1/miscellaneous.go
index f75ae264..b3291fc1 100644
--- a/routers/api/v1/miscellaneous.go
+++ b/routers/api/v1/miscellaneous.go
@@ -13,12 +13,10 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-const DOC_URL = "http://gogs.io/docs"
-
// Render an arbitrary Markdown document.
func Markdown(ctx *middleware.Context, form apiv1.MarkdownForm) {
if ctx.HasApiError() {
- ctx.JSON(422, base.ApiJsonErr{ctx.GetErrMsg(), DOC_URL})
+ ctx.JSON(422, base.ApiJsonErr{ctx.GetErrMsg(), base.DOC_URL})
return
}
@@ -35,7 +33,7 @@ func Markdown(ctx *middleware.Context, form apiv1.MarkdownForm) {
func MarkdownRaw(ctx *middleware.Context) {
body, err := ctx.Req.Body().Bytes()
if err != nil {
- ctx.JSON(422, base.ApiJsonErr{err.Error(), DOC_URL})
+ ctx.JSON(422, base.ApiJsonErr{err.Error(), base.DOC_URL})
return
}
ctx.Write(base.RenderRawMarkdown(body, ""))
diff --git a/routers/api/v1/repos.go b/routers/api/v1/repo.go
index 2dee512f..33e3b05a 100644
--- a/routers/api/v1/repos.go
+++ b/routers/api/v1/repo.go
@@ -11,16 +11,16 @@ import (
"github.com/Unknwon/com"
+ api "github.com/gogits/go-gogs-client"
+
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
+ "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
-type repo struct {
- RepoLink string `json:"repolink"`
-}
-
func SearchRepos(ctx *middleware.Context) {
opt := models.SearchOption{
Keyword: path.Base(ctx.Query("q")),
@@ -60,7 +60,7 @@ func SearchRepos(ctx *middleware.Context) {
return
}
- results := make([]*repo, len(repos))
+ results := make([]*api.Repository, len(repos))
for i := range repos {
if err = repos[i].GetOwner(); err != nil {
ctx.JSON(500, map[string]interface{}{
@@ -69,8 +69,9 @@ func SearchRepos(ctx *middleware.Context) {
})
return
}
- results[i] = &repo{
- RepoLink: path.Join(repos[i].Owner.Name, repos[i].Name),
+ results[i] = &api.Repository{
+ Id: repos[i].Id,
+ FullName: path.Join(repos[i].Owner.Name, repos[i].Name),
}
}
@@ -155,3 +156,74 @@ func Migrate(ctx *middleware.Context, form auth.MigrateRepoForm) {
"error": err.Error(),
})
}
+
+// GET /user/repos
+// https://developer.github.com/v3/repos/#list-your-repositories
+func ListMyRepos(ctx *middleware.Context) {
+ ownRepos, err := models.GetRepositories(ctx.User.Id, true)
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetRepositories: " + err.Error(), base.DOC_URL})
+ return
+ }
+ numOwnRepos := len(ownRepos)
+
+ collaRepos, err := models.GetCollaborativeRepos(ctx.User.Name)
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetCollaborativeRepos: " + err.Error(), base.DOC_URL})
+ return
+ }
+
+ sshUrlFmt := "%s@%s:%s/%s.git"
+ if setting.SshPort != 22 {
+ sshUrlFmt = "ssh://%s@%s:%d/%s/%s.git"
+ }
+
+ repos := make([]*api.Repository, numOwnRepos+len(collaRepos))
+ // FIXME: make only one loop
+ for i := range ownRepos {
+ repos[i] = &api.Repository{
+ Id: ownRepos[i].Id,
+ Owner: api.User{
+ Id: ctx.User.Id,
+ UserName: ctx.User.Name,
+ AvatarUrl: string(setting.Protocol) + ctx.User.AvatarLink(),
+ },
+ FullName: ctx.User.Name + "/" + ownRepos[i].Name,
+ Private: ownRepos[i].IsPrivate,
+ Fork: ownRepos[i].IsFork,
+ HtmlUrl: setting.AppUrl + ctx.User.Name + "/" + ownRepos[i].Name,
+ SshUrl: fmt.Sprintf(sshUrlFmt, setting.RunUser, setting.Domain, ctx.User.LowerName, ownRepos[i].LowerName),
+ Permissions: api.Permission{true, true, true},
+ }
+ repos[i].CloneUrl = repos[i].HtmlUrl + ".git"
+ }
+ for i := range collaRepos {
+ if err = collaRepos[i].GetOwner(); err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetOwner: " + err.Error(), base.DOC_URL})
+ return
+ }
+ j := i + numOwnRepos
+ repos[j] = &api.Repository{
+ Id: collaRepos[i].Id,
+ Owner: api.User{
+ Id: collaRepos[i].Owner.Id,
+ UserName: collaRepos[i].Owner.Name,
+ AvatarUrl: string(setting.Protocol) + collaRepos[i].Owner.AvatarLink(),
+ },
+ FullName: collaRepos[i].Owner.Name + "/" + collaRepos[i].Name,
+ Private: collaRepos[i].IsPrivate,
+ Fork: collaRepos[i].IsFork,
+ HtmlUrl: setting.AppUrl + collaRepos[i].Owner.Name + "/" + collaRepos[i].Name,
+ SshUrl: fmt.Sprintf(sshUrlFmt, setting.RunUser, setting.Domain, collaRepos[i].Owner.LowerName, collaRepos[i].LowerName),
+ Permissions: api.Permission{false, collaRepos[i].CanPush, true},
+ }
+ repos[j].CloneUrl = repos[j].HtmlUrl + ".git"
+
+ // FIXME: cache result to reduce DB query?
+ if collaRepos[i].Owner.IsOrganization() && collaRepos[i].Owner.IsOrgOwner(ctx.User.Id) {
+ repos[j].Permissions.Admin = true
+ }
+ }
+
+ ctx.JSON(200, &repos)
+}
diff --git a/routers/api/v1/repo_file.go b/routers/api/v1/repo_file.go
new file mode 100644
index 00000000..a049904f
--- /dev/null
+++ b/routers/api/v1/repo_file.go
@@ -0,0 +1,32 @@
+// Copyright 2014 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 v1
+
+import (
+ "github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/git"
+ "github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/routers/repo"
+)
+
+func GetRepoRawFile(ctx *middleware.Context) {
+ if ctx.Repo.Repository.IsPrivate && !ctx.Repo.HasAccess {
+ ctx.Error(404)
+ return
+ }
+
+ blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName)
+ if err != nil {
+ if err == git.ErrNotExist {
+ ctx.Error(404)
+ } else {
+ ctx.JSON(500, &base.ApiJsonErr{"GetBlobByPath: " + err.Error(), base.DOC_URL})
+ }
+ return
+ }
+ if err = repo.ServeBlob(ctx, blob); err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"ServeBlob: " + err.Error(), base.DOC_URL})
+ }
+}
diff --git a/routers/api/v1/repo_hooks.go b/routers/api/v1/repo_hooks.go
new file mode 100644
index 00000000..49bf8e46
--- /dev/null
+++ b/routers/api/v1/repo_hooks.go
@@ -0,0 +1,168 @@
+// Copyright 2014 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 v1
+
+import (
+ "encoding/json"
+
+ api "github.com/gogits/go-gogs-client"
+
+ "github.com/gogits/gogs/models"
+ "github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/middleware"
+)
+
+// GET /repos/:username/:reponame/hooks
+// https://developer.github.com/v3/repos/hooks/#list-hooks
+func ListRepoHooks(ctx *middleware.Context) {
+ hooks, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id)
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetWebhooksByRepoId: " + err.Error(), base.DOC_URL})
+ return
+ }
+
+ apiHooks := make([]*api.Hook, len(hooks))
+ for i := range hooks {
+ h := &api.Hook{
+ Id: hooks[i].Id,
+ Type: hooks[i].HookTaskType.Name(),
+ Active: hooks[i].IsActive,
+ Config: make(map[string]string),
+ }
+
+ // Currently, onle have push event.
+ h.Events = []string{"push"}
+
+ h.Config["url"] = hooks[i].Url
+ h.Config["content_type"] = hooks[i].ContentType.Name()
+ if hooks[i].HookTaskType == models.SLACK {
+ s := hooks[i].GetSlackHook()
+ h.Config["channel"] = s.Channel
+ }
+
+ apiHooks[i] = h
+ }
+
+ ctx.JSON(200, &apiHooks)
+}
+
+type CreateRepoHookForm struct {
+ Type string `json:"type" binding:"Required"`
+ Config map[string]string `json:"config" binding:"Required"`
+ Active bool `json:"active"`
+}
+
+// POST /repos/:username/:reponame/hooks
+// https://developer.github.com/v3/repos/hooks/#create-a-hook
+func CreateRepoHook(ctx *middleware.Context, form CreateRepoHookForm) {
+ if !models.IsValidHookTaskType(form.Type) {
+ ctx.JSON(422, &base.ApiJsonErr{"invalid hook type", base.DOC_URL})
+ return
+ }
+ for _, name := range []string{"url", "content_type"} {
+ if _, ok := form.Config[name]; !ok {
+ ctx.JSON(422, &base.ApiJsonErr{"missing config option: " + name, base.DOC_URL})
+ return
+ }
+ }
+ if !models.IsValidHookContentType(form.Config["content_type"]) {
+ ctx.JSON(422, &base.ApiJsonErr{"invalid content type", base.DOC_URL})
+ return
+ }
+
+ w := &models.Webhook{
+ RepoId: ctx.Repo.Repository.Id,
+ Url: form.Config["url"],
+ ContentType: models.ToHookContentType(form.Config["content_type"]),
+ Secret: form.Config["secret"],
+ HookEvent: &models.HookEvent{
+ PushOnly: true, // Only support it now.
+ },
+ IsActive: form.Active,
+ HookTaskType: models.ToHookTaskType(form.Type),
+ }
+ if w.HookTaskType == models.SLACK {
+ channel, ok := form.Config["channel"]
+ if !ok {
+ ctx.JSON(422, &base.ApiJsonErr{"missing config option: channel", base.DOC_URL})
+ return
+ }
+ meta, err := json.Marshal(&models.Slack{
+ Channel: channel,
+ })
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"slack: JSON marshal failed: " + err.Error(), base.DOC_URL})
+ return
+ }
+ w.Meta = string(meta)
+ }
+
+ if err := w.UpdateEvent(); err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"UpdateEvent: " + err.Error(), base.DOC_URL})
+ return
+ } else if err := models.CreateWebhook(w); err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"CreateWebhook: " + err.Error(), base.DOC_URL})
+ return
+ }
+
+ ctx.JSON(201, map[string]interface{}{
+ "ok": true,
+ })
+}
+
+type EditRepoHookForm struct {
+ Config map[string]string `json:"config"`
+ Active *bool `json:"active"`
+}
+
+// PATCH /repos/:username/:reponame/hooks/:id
+// https://developer.github.com/v3/repos/hooks/#edit-a-hook
+func EditRepoHook(ctx *middleware.Context, form EditRepoHookForm) {
+ w, err := models.GetWebhookById(ctx.ParamsInt64(":id"))
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"GetWebhookById: " + err.Error(), base.DOC_URL})
+ return
+ }
+
+ if form.Config != nil {
+ if url, ok := form.Config["url"]; ok {
+ w.Url = url
+ }
+ if ct, ok := form.Config["content_type"]; ok {
+ if !models.IsValidHookContentType(ct) {
+ ctx.JSON(422, &base.ApiJsonErr{"invalid content type", base.DOC_URL})
+ return
+ }
+ w.ContentType = models.ToHookContentType(ct)
+ }
+
+ if w.HookTaskType == models.SLACK {
+ if channel, ok := form.Config["channel"]; ok {
+ meta, err := json.Marshal(&models.Slack{
+ Channel: channel,
+ })
+ if err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"slack: JSON marshal failed: " + err.Error(), base.DOC_URL})
+ return
+ }
+ w.Meta = string(meta)
+ }
+ }
+ }
+
+ if form.Active != nil {
+ w.IsActive = *form.Active
+ }
+
+ // FIXME: edit events
+ if err := models.UpdateWebhook(w); err != nil {
+ ctx.JSON(500, &base.ApiJsonErr{"UpdateWebhook: " + err.Error(), base.DOC_URL})
+ return
+ }
+
+ ctx.JSON(200, map[string]interface{}{
+ "ok": true,
+ })
+}
diff --git a/routers/api/v1/users.go b/routers/api/v1/users.go
index 062c3680..e0f51ca8 100644
--- a/routers/api/v1/users.go
+++ b/routers/api/v1/users.go
@@ -7,15 +7,12 @@ package v1
import (
"github.com/Unknwon/com"
+ api "github.com/gogits/go-gogs-client"
+
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/middleware"
)
-type user struct {
- UserName string `json:"username"`
- AvatarLink string `json:"avatar"`
-}
-
func SearchUsers(ctx *middleware.Context) {
opt := models.SearchOption{
Keyword: ctx.Query("q"),
@@ -34,11 +31,11 @@ func SearchUsers(ctx *middleware.Context) {
return
}
- results := make([]*user, len(us))
+ results := make([]*api.User, len(us))
for i := range us {
- results[i] = &user{
- UserName: us[i].Name,
- AvatarLink: us[i].AvatarLink(),
+ results[i] = &api.User{
+ UserName: us[i].Name,
+ AvatarUrl: us[i].AvatarLink(),
}
}
diff --git a/routers/install.go b/routers/install.go
index eff66e84..408ca108 100644
--- a/routers/install.go
+++ b/routers/install.go
@@ -165,9 +165,9 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
// Set test engine.
var x *xorm.Engine
if err := models.NewTestEngine(x); err != nil {
- // NOTE: should use core.QueryDriver (github.com/go-xorm/core)
+ // FIXME: should use core.QueryDriver (github.com/go-xorm/core)
if strings.Contains(err.Error(), `Unknown database type: sqlite3`) {
- ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available"), INSTALL, &form)
+ ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "http://gogs.io/docs/installation/install_from_binary.html"), INSTALL, &form)
} else {
ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), INSTALL, &form)
}
diff --git a/routers/repo/commit.go b/routers/repo/commit.go
index b2c2e0f9..4a974aab 100644
--- a/routers/repo/commit.go
+++ b/routers/repo/commit.go
@@ -20,6 +20,17 @@ const (
DIFF base.TplName = "repo/diff"
)
+func RefCommits(ctx *middleware.Context) {
+ switch {
+ case len(ctx.Repo.TreeName) == 0:
+ Commits(ctx)
+ case ctx.Repo.TreeName == "search":
+ SearchCommits(ctx)
+ default:
+ FileHistory(ctx)
+ }
+}
+
func Commits(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarCommits"] = true
@@ -109,6 +120,69 @@ func SearchCommits(ctx *middleware.Context) {
ctx.HTML(200, COMMITS)
}
+func FileHistory(ctx *middleware.Context) {
+ ctx.Data["IsRepoToolbarCommits"] = true
+
+ fileName := ctx.Repo.TreeName
+ if len(fileName) == 0 {
+ Commits(ctx)
+ return
+ }
+
+ userName := ctx.Repo.Owner.Name
+ repoName := ctx.Repo.Repository.Name
+ branchName := ctx.Repo.BranchName
+
+ brs, err := ctx.Repo.GitRepo.GetBranches()
+ if err != nil {
+ ctx.Handle(500, "GetBranches", err)
+ return
+ } else if len(brs) == 0 {
+ ctx.Handle(404, "GetBranches", nil)
+ return
+ }
+
+ commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName)
+ if err != nil {
+ ctx.Handle(500, "repo.FileHistory(GetCommitsCount)", err)
+ return
+ } else if commitsCount == 0 {
+ ctx.Handle(404, "repo.FileHistory", nil)
+ return
+ }
+
+ // Calculate and validate page number.
+ page := com.StrTo(ctx.Query("p")).MustInt()
+ if page < 1 {
+ page = 1
+ }
+ lastPage := page - 1
+ if lastPage < 0 {
+ lastPage = 0
+ }
+ nextPage := page + 1
+ if nextPage*50 > commitsCount {
+ nextPage = 0
+ }
+
+ commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(
+ branchName, fileName, page)
+ if err != nil {
+ ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err)
+ return
+ }
+ commits = models.ValidateCommitsWithEmails(commits)
+
+ ctx.Data["Commits"] = commits
+ ctx.Data["Username"] = userName
+ ctx.Data["Reponame"] = repoName
+ ctx.Data["FileName"] = fileName
+ ctx.Data["CommitCount"] = commitsCount
+ ctx.Data["LastPageNum"] = lastPage
+ ctx.Data["NextPageNum"] = nextPage
+ ctx.HTML(200, COMMITS)
+}
+
func Diff(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarCommits"] = true
@@ -226,70 +300,7 @@ func CompareDiff(ctx *middleware.Context) {
ctx.Data["Commit"] = commit
ctx.Data["Diff"] = diff
ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0
- ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", afterCommitId)
- ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", afterCommitId)
+ ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", afterCommitId)
+ ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "raw", afterCommitId)
ctx.HTML(200, DIFF)
}
-
-func FileHistory(ctx *middleware.Context) {
- ctx.Data["IsRepoToolbarCommits"] = true
-
- fileName := ctx.Params("*")
- if len(fileName) == 0 {
- Commits(ctx)
- return
- }
-
- userName := ctx.Repo.Owner.Name
- repoName := ctx.Repo.Repository.Name
- branchName := ctx.Params(":branchname")
-
- brs, err := ctx.Repo.GitRepo.GetBranches()
- if err != nil {
- ctx.Handle(500, "GetBranches", err)
- return
- } else if len(brs) == 0 {
- ctx.Handle(404, "GetBranches", nil)
- return
- }
-
- commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName)
- if err != nil {
- ctx.Handle(500, "repo.FileHistory(GetCommitsCount)", err)
- return
- } else if commitsCount == 0 {
- ctx.Handle(404, "repo.FileHistory", nil)
- return
- }
-
- // Calculate and validate page number.
- page := com.StrTo(ctx.Query("p")).MustInt()
- if page < 1 {
- page = 1
- }
- lastPage := page - 1
- if lastPage < 0 {
- lastPage = 0
- }
- nextPage := page + 1
- if nextPage*50 > commitsCount {
- nextPage = 0
- }
-
- commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(
- branchName, fileName, page)
- if err != nil {
- ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err)
- return
- }
- commits = models.ValidateCommitsWithEmails(commits)
-
- ctx.Data["Commits"] = commits
- ctx.Data["Username"] = userName
- ctx.Data["Reponame"] = repoName
- ctx.Data["FileName"] = fileName
- ctx.Data["CommitCount"] = commitsCount
- ctx.Data["LastPageNum"] = lastPage
- ctx.Data["NextPageNum"] = nextPage
- ctx.HTML(200, COMMITS)
-}
diff --git a/routers/repo/download.go b/routers/repo/download.go
index abb9b062..6367c40e 100644
--- a/routers/repo/download.go
+++ b/routers/repo/download.go
@@ -9,22 +9,14 @@ import (
"path"
"github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/middleware"
)
-func SingleDownload(ctx *middleware.Context) {
- treename := ctx.Params("*")
-
- blob, err := ctx.Repo.Commit.GetBlobByPath(treename)
- if err != nil {
- ctx.Handle(500, "GetBlobByPath", err)
- return
- }
-
+func ServeBlob(ctx *middleware.Context, blob *git.Blob) error {
dataRc, err := blob.Data()
if err != nil {
- ctx.Handle(500, "repo.SingleDownload(Data)", err)
- return
+ return err
}
buf := make([]byte, 1024)
@@ -37,9 +29,25 @@ func SingleDownload(ctx *middleware.Context) {
_, isImageFile := base.IsImageFile(buf)
ctx.Resp.Header().Set("Content-Type", contentType)
if !isTextFile && !isImageFile {
- ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(treename))
+ ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName))
ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary")
}
ctx.Resp.Write(buf)
io.Copy(ctx.Resp, dataRc)
+ return nil
+}
+
+func SingleDownload(ctx *middleware.Context) {
+ blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName)
+ if err != nil {
+ if err == git.ErrNotExist {
+ ctx.Handle(404, "GetBlobByPath", nil)
+ } else {
+ ctx.Handle(500, "GetBlobByPath", err)
+ }
+ return
+ }
+ if err = ServeBlob(ctx, blob); err != nil {
+ ctx.Handle(500, "ServeBlob", err)
+ }
}
diff --git a/routers/repo/http.go b/routers/repo/http.go
index 3641f4da..2dc66449 100644
--- a/routers/repo/http.go
+++ b/routers/repo/http.go
@@ -7,8 +7,6 @@ package repo
import (
"bytes"
"compress/gzip"
- "encoding/base64"
- "errors"
"fmt"
"io"
"io/ioutil"
@@ -18,6 +16,7 @@ import (
"path"
"path/filepath"
"regexp"
+ "runtime"
"strconv"
"strings"
"time"
@@ -29,27 +28,6 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-func basicEncode(username, password string) string {
- auth := username + ":" + password
- return base64.StdEncoding.EncodeToString([]byte(auth))
-}
-
-func basicDecode(encoded string) (user string, name string, err error) {
- var s []byte
- s, err = base64.StdEncoding.DecodeString(encoded)
- if err != nil {
- return user, name, err
- }
-
- a := strings.Split(string(s), ":")
- if len(a) == 2 {
- user, name = a[0], a[1]
- } else {
- err = errors.New("decode failed")
- }
- return user, name, err
-}
-
func authRequired(ctx *middleware.Context) {
ctx.Resp.Header().Set("WWW-Authenticate", "Basic realm=\".\"")
ctx.Data["ErrorMsg"] = "no basic auth and digit auth"
@@ -112,11 +90,12 @@ func Http(ctx *middleware.Context) {
auths := strings.Fields(baHead)
// currently check basic auth
// TODO: support digit auth
+ // FIXME: middlewares/context.go did basic auth check already
if len(auths) != 2 || auths[0] != "Basic" {
ctx.Handle(401, "no basic auth and digit auth", nil)
return
}
- authUsername, passwd, err = basicDecode(auths[1])
+ authUsername, passwd, err = base.BasicAuthDecode(auths[1])
if err != nil {
ctx.Handle(401, "no basic auth and digit auth", nil)
return
@@ -205,6 +184,7 @@ func Http(ctx *middleware.Context) {
handler := HttpBackend(&config)
handler(ctx.Resp, ctx.Req.Request)
+ runtime.GC()
}
type route struct {
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index e3a14e19..b08b0605 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -1125,3 +1125,11 @@ func IssueGetAttachment(ctx *middleware.Context) {
func Issues2(ctx *middleware.Context){
ctx.HTML(200,"repo/issue2/list")
}
+
+func PullRequest2(ctx *middleware.Context){
+ ctx.HTML(200,"repo/pr2/list")
+}
+
+func Labels2(ctx *middleware.Context){
+ ctx.HTML(200,"repo/issue2/labels")
+}
diff --git a/routers/repo/release.go b/routers/repo/release.go
index addeb1ce..cc9864fe 100644
--- a/routers/repo/release.go
+++ b/routers/repo/release.go
@@ -22,21 +22,38 @@ func Releases(ctx *middleware.Context) {
ctx.Data["Title"] = "Releases"
ctx.Data["IsRepoToolbarReleases"] = true
ctx.Data["IsRepoReleaseNew"] = false
+
rawTags, err := ctx.Repo.GitRepo.GetTags()
if err != nil {
- ctx.Handle(500, "release.Releases(GetTags)", err)
+ ctx.Handle(500, "GetTags", err)
return
}
rels, err := models.GetReleasesByRepoId(ctx.Repo.Repository.Id)
if err != nil {
- ctx.Handle(500, "release.Releases(GetReleasesByRepoId)", err)
+ ctx.Handle(500, "GetReleasesByRepoId", err)
+ return
+ }
+
+ // Get default branch.
+ refName := ctx.Repo.Repository.DefaultBranch
+ if !ctx.Repo.GitRepo.IsBranchExist(refName) {
+ brs, err := ctx.Repo.GitRepo.GetBranches()
+ if err != nil {
+ ctx.Handle(500, "GetBranches", err)
+ return
+ }
+ refName = brs[0]
+ }
+ commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(refName)
+ if err != nil {
+ ctx.Handle(500, "GetCommitOfBranch", err)
return
}
- commitsCount, err := ctx.Repo.Commit.CommitsCount()
+ commitsCount, err := commit.CommitsCount()
if err != nil {
- ctx.Handle(500, "release.Releases(CommitsCount)", err)
+ ctx.Handle(500, "CommitsCount", err)
return
}
@@ -59,18 +76,18 @@ func Releases(ctx *middleware.Context) {
if ctx.Repo.BranchName != rel.Target {
// Get count if not exists.
if _, ok := countCache[rel.Target]; !ok {
- commit, err := ctx.Repo.GitRepo.GetCommitOfTag(rel.TagName)
+ commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(ctx.Repo.BranchName)
if err != nil {
- ctx.Handle(500, "GetCommitOfTag", err)
+ ctx.Handle(500, "GetCommitOfBranch", err)
return
}
- countCache[rel.Target], err = commit.CommitsCount()
+ countCache[ctx.Repo.BranchName], err = commit.CommitsCount()
if err != nil {
ctx.Handle(500, "CommitsCount2", err)
return
}
}
- rel.NumCommitsBehind = countCache[rel.Target] - rel.NumCommits
+ rel.NumCommitsBehind = countCache[ctx.Repo.BranchName] - rel.NumCommits
} else {
rel.NumCommitsBehind = commitsCount - rel.NumCommits
}
@@ -134,14 +151,20 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) {
return
}
- commitsCount, err := ctx.Repo.Commit.CommitsCount()
+ if !ctx.Repo.GitRepo.IsBranchExist(form.Target) {
+ ctx.RenderWithErr(ctx.Tr("form.target_branch_not_exist"), RELEASE_NEW, &form)
+ return
+ }
+
+ commit, err := ctx.Repo.GitRepo.GetCommitOfBranch(form.Target)
if err != nil {
- ctx.Handle(500, "release.ReleasesNewPost(CommitsCount)", err)
+ ctx.Handle(500, "GetCommitOfBranch", err)
return
}
- if !ctx.Repo.GitRepo.IsBranchExist(form.Target) {
- ctx.RenderWithErr("Target branch does not exist", "release/new", &form)
+ commitsCount, err := commit.CommitsCount()
+ if err != nil {
+ ctx.Handle(500, "CommitsCount", err)
return
}
@@ -151,7 +174,7 @@ func NewReleasePost(ctx *middleware.Context, form auth.NewReleaseForm) {
Title: form.Title,
TagName: form.TagName,
Target: form.Target,
- Sha1: ctx.Repo.Commit.Id.String(),
+ Sha1: commit.Id.String(),
NumCommits: commitsCount,
Note: form.Content,
IsDraft: len(form.Draft) > 0,
diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index 2116e2c9..8e4ace99 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -24,8 +24,23 @@ import (
const (
CREATE base.TplName = "repo/create"
MIGRATE base.TplName = "repo/migrate"
+ FORK base.TplName = "repo/fork"
)
+func checkContextUser(ctx *middleware.Context, uid int64) (*models.User, error) {
+ ctxUser := ctx.User
+ if uid > 0 {
+ org, err := models.GetUserById(uid)
+ if err != models.ErrUserNotExist {
+ if err != nil {
+ return nil, fmt.Errorf("GetUserById: %v", err)
+ }
+ ctxUser = org
+ }
+ }
+ return ctxUser, nil
+}
+
func Create(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("new_repo")
@@ -35,14 +50,10 @@ func Create(ctx *middleware.Context) {
ctx.Data["Gitignores"] = models.Gitignores
ctx.Data["Licenses"] = models.Licenses
- ctxUser := ctx.User
- if orgId := com.StrTo(ctx.Query("org")).MustInt64(); orgId > 0 {
- org, err := models.GetUserById(orgId)
- if err != nil && err != models.ErrUserNotExist {
- ctx.Handle(500, "GetUserById", err)
- return
- }
- ctxUser = org
+ ctxUser, err := checkContextUser(ctx, ctx.QueryInt64("org"))
+ if err != nil {
+ ctx.Handle(500, "checkContextUser", err)
+ return
}
ctx.Data["ContextUser"] = ctxUser
@@ -64,12 +75,12 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
ctxUser := ctx.User
// Not equal means current user is an organization.
if form.Uid != ctx.User.Id {
- org, err := models.GetUserById(form.Uid)
- if err != nil && err != models.ErrUserNotExist {
- ctx.Handle(500, "GetUserById", err)
+ var err error
+ ctxUser, err = checkContextUser(ctx, form.Uid)
+ if err != nil {
+ ctx.Handle(500, "checkContextUser", err)
return
}
- ctxUser = org
}
ctx.Data["ContextUser"] = ctxUser
@@ -95,8 +106,8 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
repo, err := models.CreateRepository(ctxUser, form.RepoName, form.Description,
form.Gitignore, form.License, form.Private, false, form.InitReadme)
if err == nil {
- log.Trace("Repository created: %s/%s", ctxUser.Name, form.RepoName)
- ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + form.RepoName)
+ log.Trace("Repository created: %s/%s", ctxUser.Name, repo.Name)
+ ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name)
return
} else if err == models.ErrRepoAlreadyExist {
ctx.Data["Err_RepoName"] = true
@@ -119,14 +130,10 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
func Migrate(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("new_migrate")
- ctxUser := ctx.User
- if orgId := com.StrTo(ctx.Query("org")).MustInt64(); orgId > 0 {
- org, err := models.GetUserById(orgId)
- if err != nil && err != models.ErrUserNotExist {
- ctx.Handle(500, "GetUserById", err)
- return
- }
- ctxUser = org
+ ctxUser, err := checkContextUser(ctx, ctx.QueryInt64("org"))
+ if err != nil {
+ ctx.Handle(500, "checkContextUser", err)
+ return
}
ctx.Data["ContextUser"] = ctxUser
@@ -145,12 +152,12 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
ctxUser := ctx.User
// Not equal means current user is an organization.
if form.Uid != ctx.User.Id {
- org, err := models.GetUserById(form.Uid)
+ var err error
+ ctxUser, err = checkContextUser(ctx, form.Uid)
if err != nil {
- ctx.Handle(500, "GetUserById", err)
+ ctx.Handle(500, "checkContextUser", err)
return
}
- ctxUser = org
}
ctx.Data["ContextUser"] = ctxUser
@@ -206,6 +213,114 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
ctx.Handle(500, "MigratePost", err)
}
+func getForkRepository(ctx *middleware.Context) (*models.Repository, error) {
+ forkId := ctx.QueryInt64("fork_id")
+ ctx.Data["ForkId"] = forkId
+
+ forkRepo, err := models.GetRepositoryById(forkId)
+ if err != nil {
+ return nil, fmt.Errorf("GetRepositoryById: %v", err)
+ }
+ ctx.Data["repo_name"] = forkRepo.Name
+ ctx.Data["desc"] = forkRepo.Description
+
+ if err = forkRepo.GetOwner(); err != nil {
+ return nil, fmt.Errorf("GetOwner: %v", err)
+ }
+ ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name
+ return forkRepo, nil
+}
+
+func Fork(ctx *middleware.Context) {
+ ctx.Data["Title"] = ctx.Tr("new_fork")
+
+ if _, err := getForkRepository(ctx); err != nil {
+ if err == models.ErrRepoNotExist {
+ ctx.Redirect(setting.AppSubUrl + "/")
+ } else {
+ ctx.Handle(500, "getForkRepository", err)
+ }
+ return
+ }
+
+ // FIXME: maybe sometime can directly fork to organization?
+ ctx.Data["ContextUser"] = ctx.User
+ if err := ctx.User.GetOrganizations(); err != nil {
+ ctx.Handle(500, "GetOrganizations", err)
+ return
+ }
+ ctx.Data["Orgs"] = ctx.User.Orgs
+
+ ctx.HTML(200, FORK)
+}
+
+func ForkPost(ctx *middleware.Context, form auth.CreateRepoForm) {
+ ctx.Data["Title"] = ctx.Tr("new_fork")
+
+ forkRepo, err := getForkRepository(ctx)
+ if err != nil {
+ if err == models.ErrRepoNotExist {
+ ctx.Redirect(setting.AppSubUrl + "/")
+ } else {
+ ctx.Handle(500, "getForkRepository", err)
+ }
+ return
+ }
+
+ ctxUser := ctx.User
+ // Not equal means current user is an organization.
+ if form.Uid != ctx.User.Id {
+ var err error
+ ctxUser, err = checkContextUser(ctx, form.Uid)
+ if err != nil {
+ ctx.Handle(500, "checkContextUser", err)
+ return
+ }
+ }
+ ctx.Data["ContextUser"] = ctxUser
+
+ if err := ctx.User.GetOrganizations(); err != nil {
+ ctx.Handle(500, "GetOrganizations", err)
+ return
+ }
+ ctx.Data["Orgs"] = ctx.User.Orgs
+
+ if ctx.HasError() {
+ ctx.HTML(200, CREATE)
+ return
+ }
+
+ if ctxUser.IsOrganization() {
+ // Check ownership of organization.
+ if !ctxUser.IsOrgOwner(ctx.User.Id) {
+ ctx.Error(403)
+ return
+ }
+ }
+
+ repo, err := models.ForkRepository(ctxUser, forkRepo, form.RepoName, form.Description)
+ if err == nil {
+ log.Trace("Repository forked: %s/%s", ctxUser.Name, repo.Name)
+ ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name)
+ return
+ } else if err == models.ErrRepoAlreadyExist {
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), FORK, &form)
+ return
+ } else if err == models.ErrRepoNameIllegal {
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("form.illegal_repo_name"), CREATE, &form)
+ return
+ }
+
+ if repo != nil {
+ if errDelete := models.DeleteRepository(ctxUser.Id, repo.Id, ctxUser.Name); errDelete != nil {
+ log.Error(4, "DeleteRepository: %v", errDelete)
+ }
+ }
+ ctx.Handle(500, "ForkPost", err)
+}
+
func Action(ctx *middleware.Context) {
var err error
switch ctx.Params(":action") {
@@ -217,20 +332,6 @@ func Action(ctx *middleware.Context) {
err = models.StarRepo(ctx.User.Id, ctx.Repo.Repository.Id, true)
case "unstar":
err = models.StarRepo(ctx.User.Id, ctx.Repo.Repository.Id, false)
- case "fork":
- repo, err := models.ForkRepository(ctx.User, ctx.Repo.Repository)
- if err != nil {
- if err != models.ErrRepoAlreadyExist {
- log.Error(4, "Action(%s): %v", ctx.Params(":action"), err)
- ctx.JSON(200, map[string]interface{}{
- "ok": false,
- "err": err.Error(),
- })
- return
- }
- }
- ctx.Redirect(setting.AppSubUrl + "/" + repo.Owner.Name + "/" + repo.Name)
- return
case "desc":
if !ctx.Repo.IsOwner {
ctx.Error(404)
@@ -263,15 +364,18 @@ func Download(ctx *middleware.Context) {
refName string
ext string
archivePath string
+ archiveType git.ArchiveType
)
switch {
case strings.HasSuffix(uri, ".zip"):
ext = ".zip"
archivePath = path.Join(ctx.Repo.GitRepo.Path, "archives/zip")
+ archiveType = git.ZIP
case strings.HasSuffix(uri, ".tar.gz"):
ext = ".tar.gz"
archivePath = path.Join(ctx.Repo.GitRepo.Path, "archives/targz")
+ archiveType = git.TARGZ
default:
ctx.Error(404)
return
@@ -314,9 +418,9 @@ func Download(ctx *middleware.Context) {
return
}
- archivePath = path.Join(archivePath, ctx.Repo.CommitId+ext)
+ archivePath = path.Join(archivePath, base.ShortSha(commit.Id.String())+ext)
if !com.IsFile(archivePath) {
- if err := commit.CreateArchive(archivePath, git.ZIP); err != nil {
+ if err := commit.CreateArchive(archivePath, archiveType); err != nil {
ctx.Handle(500, "Download -> CreateArchive "+archivePath, err)
return
}
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index a8e80272..491448a7 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -334,6 +334,7 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) {
return
}
+ // FIXME: code too old here, sync with APIs
ct := models.JSON
if form.ContentType == "2" {
ct = models.FORM
diff --git a/routers/repo/view.go b/routers/repo/view.go
index 26fa0b4c..162279ac 100644
--- a/routers/repo/view.go
+++ b/routers/repo/view.go
@@ -34,7 +34,7 @@ func Home(ctx *middleware.Context) {
rawLink := ctx.Repo.RepoLink + "/raw/" + branchName
// Get tree path
- treename := ctx.Params("*")
+ treename := ctx.Repo.TreeName
if len(treename) > 0 && treename[len(treename)-1] == '/' {
ctx.Redirect(repoLink + "/src/" + branchName + "/" + treename[:len(treename)-1])
diff --git a/routers/user/setting.go b/routers/user/setting.go
index 778f27ac..bb0fa910 100644
--- a/routers/user/setting.go
+++ b/routers/user/setting.go
@@ -18,13 +18,14 @@ import (
)
const (
- SETTINGS_PROFILE base.TplName = "user/settings/profile"
- SETTINGS_PASSWORD base.TplName = "user/settings/password"
- SETTINGS_SSH_KEYS base.TplName = "user/settings/sshkeys"
- SETTINGS_SOCIAL base.TplName = "user/settings/social"
- SETTINGS_DELETE base.TplName = "user/settings/delete"
- NOTIFICATION base.TplName = "user/notification"
- SECURITY base.TplName = "user/security"
+ SETTINGS_PROFILE base.TplName = "user/settings/profile"
+ SETTINGS_PASSWORD base.TplName = "user/settings/password"
+ SETTINGS_SSH_KEYS base.TplName = "user/settings/sshkeys"
+ SETTINGS_SOCIAL base.TplName = "user/settings/social"
+ SETTINGS_APPLICATIONS base.TplName = "user/settings/applications"
+ SETTINGS_DELETE base.TplName = "user/settings/delete"
+ NOTIFICATION base.TplName = "user/notification"
+ SECURITY base.TplName = "user/security"
)
func Settings(ctx *middleware.Context) {
@@ -129,7 +130,7 @@ func SettingsSSHKeys(ctx *middleware.Context) {
ctx.Data["PageIsSettingsSSHKeys"] = true
var err error
- ctx.Data["Keys"], err = models.ListPublicKey(ctx.User.Id)
+ ctx.Data["Keys"], err = models.ListPublicKeys(ctx.User.Id)
if err != nil {
ctx.Handle(500, "ssh.ListPublicKey", err)
return
@@ -144,7 +145,7 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
ctx.Data["PageIsSettingsSSHKeys"] = true
var err error
- ctx.Data["Keys"], err = models.ListPublicKey(ctx.User.Id)
+ ctx.Data["Keys"], err = models.ListPublicKeys(ctx.User.Id)
if err != nil {
ctx.Handle(500, "ssh.ListPublicKey", err)
return
@@ -235,6 +236,62 @@ func SettingsSocial(ctx *middleware.Context) {
ctx.HTML(200, SETTINGS_SOCIAL)
}
+func SettingsApplications(ctx *middleware.Context) {
+ ctx.Data["Title"] = ctx.Tr("settings")
+ ctx.Data["PageIsUserSettings"] = true
+ ctx.Data["PageIsSettingsApplications"] = true
+
+ // Delete access token.
+ remove, _ := com.StrTo(ctx.Query("remove")).Int64()
+ if remove > 0 {
+ if err := models.DeleteAccessTokenById(remove); err != nil {
+ ctx.Handle(500, "DeleteAccessTokenById", err)
+ return
+ }
+ ctx.Flash.Success(ctx.Tr("settings.delete_token_success"))
+ ctx.Redirect(setting.AppSubUrl + "/user/settings/applications")
+ return
+ }
+
+ tokens, err := models.ListAccessTokens(ctx.User.Id)
+ if err != nil {
+ ctx.Handle(500, "ListAccessTokens", err)
+ return
+ }
+ ctx.Data["Tokens"] = tokens
+
+ ctx.HTML(200, SETTINGS_APPLICATIONS)
+}
+
+// FIXME: split to two different functions and pages to handle access token and oauth2
+func SettingsApplicationsPost(ctx *middleware.Context, form auth.NewAccessTokenForm) {
+ ctx.Data["Title"] = ctx.Tr("settings")
+ ctx.Data["PageIsUserSettings"] = true
+ ctx.Data["PageIsSettingsApplications"] = true
+
+ switch ctx.Query("type") {
+ case "token":
+ if ctx.HasError() {
+ ctx.HTML(200, SETTINGS_APPLICATIONS)
+ return
+ }
+
+ t := &models.AccessToken{
+ Uid: ctx.User.Id,
+ Name: form.Name,
+ }
+ if err := models.NewAccessToken(t); err != nil {
+ ctx.Handle(500, "NewAccessToken", err)
+ return
+ }
+
+ ctx.Flash.Success(ctx.Tr("settings.generate_token_succees"))
+ ctx.Flash.Info(t.Sha1)
+ }
+
+ ctx.Redirect(setting.AppSubUrl + "/user/settings/applications")
+}
+
func SettingsDelete(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("settings")
ctx.Data["PageIsUserSettings"] = true
@@ -254,6 +311,9 @@ func SettingsDelete(ctx *middleware.Context) {
case models.ErrUserOwnRepos:
ctx.Flash.Error(ctx.Tr("form.still_own_repo"))
ctx.Redirect(setting.AppSubUrl + "/user/settings/delete")
+ case models.ErrUserHasOrgs:
+ ctx.Flash.Error(ctx.Tr("form.still_has_org"))
+ ctx.Redirect(setting.AppSubUrl + "/user/settings/delete")
default:
ctx.Handle(500, "DeleteUser", err)
}
diff --git a/templates/.VERSION b/templates/.VERSION
index 151da606..43806b4f 100644
--- a/templates/.VERSION
+++ b/templates/.VERSION
@@ -1 +1 @@
-0.5.6.1027 Beta \ No newline at end of file
+0.5.8.1117 Beta \ No newline at end of file
diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl
index e5a210c2..3ccb106b 100644
--- a/templates/admin/config.tmpl
+++ b/templates/admin/config.tmpl
@@ -184,10 +184,6 @@
<dd><i class="fa fa{{if .SessionConfig.Secure}}-check{{end}}-square-o"></i></dd>
<dt>{{.i18n.Tr "admin.config.cookie_life_time"}}</dt>
<dd>{{.SessionConfig.CookieLifeTime}} {{.i18n.Tr "tool.raw_seconds"}}</dd>
- <dt>{{.i18n.Tr "admin.config.session_hash_function"}}</dt>
- <dd>{{.SessionConfig.SessionIDHashFunc}}</dd>
- <dt>{{.i18n.Tr "admin.config.session_hash_key"}}</dt>
- <dd>{{.SessionConfig.SessionIDHashKey}}</dd>
</dl>
</div>
</div>
diff --git a/templates/admin/user/edit.tmpl b/templates/admin/user/edit.tmpl
index 1d4cf806..31734993 100644
--- a/templates/admin/user/edit.tmpl
+++ b/templates/admin/user/edit.tmpl
@@ -56,15 +56,19 @@
<label></label>
<input type="checkbox" name="active" {{if .User.IsActive}}checked{{end}}>
<strong>{{.i18n.Tr "admin.users.is_activated"}}</strong>
- <br>
- <label></label>
- <input type="checkbox" name="admin" {{if .User.IsAdmin}}checked{{end}}>
- <strong>{{.i18n.Tr "admin.users.is_admin"}}</strong>
+ <br>
+ <label></label>
+ <input type="checkbox" name="admin" {{if .User.IsAdmin}}checked{{end}}>
+ <strong>{{.i18n.Tr "admin.users.is_admin"}}</strong>
+ <br>
+ <label></label>
+ <input type="checkbox" name="allow_git_hook" {{if .User.AllowGitHook}}checked{{end}}>
+ <strong>{{.i18n.Tr "admin.users.allow_git_hook"}}</strong>
</div>
<div class="field">
<label></label>
<button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "admin.users.update_profile"}}</button>
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ &nbsp;&nbsp;&nbsp;&nbsp;
<button class="btn btn-large btn-red btn-radius" id="delete-account-btn" href="#delete-account-modal">{{.i18n.Tr "admin.users.delete_account"}}</button>
</div>
<div class="white-popup-block mfp-hide" id="delete-account-modal">
diff --git a/templates/repo/fork.tmpl b/templates/repo/fork.tmpl
new file mode 100644
index 00000000..1d096a75
--- /dev/null
+++ b/templates/repo/fork.tmpl
@@ -0,0 +1,65 @@
+{{template "ng/base/head" .}}
+{{template "ng/base/header" .}}
+<div id="repo-wrapper">
+ <form id="repo-create-form" class="form form-align panel panel-radius" action="{{AppSubUrl}}/repo/fork?fork_id={{.ForkId}}" method="post">
+ {{.CsrfTokenHtml}}
+ <div class="panel-header">
+ <h2>{{.i18n.Tr "new_fork"}}</h2>
+ </div>
+ <div class="panel-content">
+ {{template "ng/base/alert" .}}
+ <div class="field">
+ <label for="owner" class="req">{{.i18n.Tr "repo.owner"}}</label>
+ <input id="repo-owner-id" type="hidden" name="uid" value="{{.ContextUser.Id}}" />
+ <div class="inline-block drop">
+ <a class="drop-bottom">
+ <img class="avatar" src="{{.ContextUser.AvatarLink}}" id="repo-owner-avatar" alt="user-avatar">
+ <strong id="repo-owner-name">{{.ContextUser.Name}}</strong>
+ </a>
+ <ul class="drop-down menu menu-vertical menu-radius switching-list" id="repo-create-owner-list">
+ <li {{if eq $.ContextUser.Id .SignedUser.Id}}class="checked"{{end}} data-uid="{{.SignedUser.Id}}">
+ <a>
+ <i class="octicon octicon-check"></i>
+ <img class="avatar" src="{{.SignedUser.AvatarLink}}" alt="user-avatar">
+ <strong>{{.SignedUser.Name}}</strong>
+ </a>
+ </li>
+ {{range .Orgs}}
+ <li {{if eq $.ContextUser.Id .Id}}class="checked"{{end}} data-uid="{{.Id}}">
+ <a>
+ <i class="octicon octicon-check"></i>
+ <img class="avatar" src="{{.AvatarLink}}" alt="user-avatar">
+ <strong>{{.Name}}</strong>
+ </a>
+ </li>
+ {{end}}
+ </ul>
+ </div>
+ </div>
+ <div class="field">
+ <label>{{.i18n.Tr "repo.fork_from"}}</label>
+ <span><a target="_blank" href="{{AppSubUrl}}/{{.ForkFrom}}">{{.ForkFrom}}</a></span>
+ </div>
+ <div class="field">
+ <label class="req" for="repo-name">{{.i18n.Tr "repo.repo_name"}}</label>
+ <input class="ipt ipt-large ipt-radius {{if .Err_RepoName}}ipt-error{{end}}" id="repo-name" name="repo_name" type="text" value="{{.repo_name}}" required />
+ <span class="form-label"></span>
+ <span class="help">{{.i18n.Tr "repo.repo_name_helper" | Str2html}}</span>
+ </div>
+ <div class="field">
+ <label for="visibility">{{.i18n.Tr "repo.visibility"}}</label>
+ <span>{{.i18n.Tr "repo.fork_visiblity_helper"}}</span>
+ </div>
+ <div class="field clear">
+ <label class="left" for="desc">{{.i18n.Tr "repo.repo_desc"}}</label>
+ <textarea class="ipt ipt-large ipt-radius {{if .Err_Description}}ipt-error{{end}}" id="desc" name="desc">{{.desc}}</textarea>
+ </div>
+ <div class="field">
+ <label></label>
+ <button class="btn btn-large btn-blue btn-radius">{{.i18n.Tr "repo.fork_repo"}}</button>
+ <a class="btn btn-small btn-gray btn-radius" id="repo-create-cancel" href="{{AppSubUrl}}/"><strong>{{.i18n.Tr "cancel"}}</strong></a>
+ </div>
+ </div>
+ </form>
+</div>
+{{template "ng/base/footer" .}} \ No newline at end of file
diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl
index c2caf4b0..20e67db8 100644
--- a/templates/repo/header.tmpl
+++ b/templates/repo/header.tmpl
@@ -22,11 +22,11 @@
<button class="btn btn-gray left" id="repo-clone-https" data-link="{{$.CloneLink.HTTPS}}">HTTPS</button>
<input id="repo-clone-url" class="ipt ipt-disabled left" value="{{$.CloneLink.SSH}}" readonly />
<button id="repo-clone-copy" class="btn btn-black left btn-right-radius" data-copy-val="val" data-copy-from="#repo-clone-url" original-title="{{$.i18n.Tr "repo.click_to_copy"}}" data-original-title="{{$.i18n.Tr "repo.click_to_copy"}}" data-after-title="{{$.i18n.Tr "repo.copied"}}">{{$.i18n.Tr "repo.copy_link"}}</button>
- <p class="text-center" id="repo-clone-help">{{$.i18n.Tr "repo.clone_helper" | Str2html}}</p>
+ <p class="text-center" id="repo-clone-help">{{$.i18n.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository" | Str2html}}</p>
<hr/>
<div class="text-center" id="repo-clone-zip">
- <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{$.BranchName}}.zip"><i class="octicon octicon-file-zip"></i>ZIP</a>
- <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{$.BranchName}}.tar.gz"><i class="octicon octicon-file-zip"></i>TAR.GZ</a>
+ <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{EscapePound $.BranchName}}.zip"><i class="octicon octicon-file-zip"></i>ZIP</a>
+ <a class="btn btn-green btn-radius" href="{{$.RepoLink}}/archive/{{EscapePound $.BranchName}}.tar.gz"><i class="octicon octicon-file-zip"></i>TAR.GZ</a>
</div>
</div>
</div>
@@ -47,7 +47,7 @@
</a>
</li>
<li id="repo-header-fork">
- <a id="repo-header-fork-btn" {{if not $.IsRepositoryTrueOwner}}href="{{.RepoLink}}/action/fork"{{end}}>
+ <a id="repo-header-fork-btn" {{if or (not $.IsRepositoryTrueOwner) $.Owner.IsOrganization}}href="{{AppSubUrl}}/repo/fork?fork_id={{.Id}}"{{end}}>
<button class="btn btn-gray text-bold btn-radius">
<i class="octicon octicon-repo-forked"></i>{{$.i18n.Tr "repo.fork"}}
<span class="num">{{.NumForks}}</span>
diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl
index 49bf1fd1..acfdc38b 100644
--- a/templates/repo/home.tmpl
+++ b/templates/repo/home.tmpl
@@ -31,30 +31,30 @@
</ul>
<ul class="menu menu-vertical switching-list {{if .IsTag}}hide{{end}}" id="repo-branch-list">
{{range .Branches}}
- <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{.}}"><i class="octicon octicon-check"></i>{{.}}</a></li>
+ <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{EscapePound .}}"><i class="octicon octicon-check"></i>{{.}}</a></li>
{{end}}
</ul>
<ul class="menu menu-vertical switching-list {{if not .IsTag}}hide{{end}}" id="repo-tag-list">
{{range .Tags}}
- <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{.}}"><i class="octicon octicon-check"></i>{{.}}</a></li>
+ <li {{if eq . $.BranchName}}class="checked"{{end}}><a href="{{$.RepoLink}}/src/{{EscapePound .}}"><i class="octicon octicon-check"></i>{{.}}</a></li>
{{end}}
</ul>
</div>
</div>
</li>
<li id="repo-bread" class="breads">
- <a class="title bread" href="{{.RepoLink}}">{{.Repository.Name}}</a>
+ <a class="title bread" href="{{.RepoLink}}/src/{{EscapePound .BranchName}}">{{.Repository.Name}}</a>
{{ $n := len .Treenames}}
{{ $l := Subtract $n 1}}
{{range $i, $v := .Treenames}}
{{if eq $i $l}}
- <span class="bread">{{$v}}</span>
+ <span class="bread">{{EscapePound $v}}</span>
{{else}}
- <span class="bread"><a href="{{$.BranchLink}}/{{index $.Paths $i}}">{{$v}}</a></span>
+ <span class="bread"><a href="{{EscapePound $.BranchLink}}/{{index $.Paths $i}}">{{$v}}</a></span>
{{end}}
{{end}}
</li>
- <li id="repo-commits-jump" class="repo-jump right">
+ <!-- <li id="repo-commits-jump" class="repo-jump right">
<a href="#">
<button class="btn btn-small btn-gray btn-right-radius"><i class="octicon octicon-git-commit"></i></button>
</a>
@@ -63,7 +63,7 @@
<a href="#">
<button class="btn btn-small btn btn-small btn-gray btn-left-radius"><i class="octicon octicon-list-unordered"></i></button>
</a>
- </li>
+ </li> -->
</ul>
{{if .IsFile}}
{{template "repo/view_file" .}}
diff --git a/templates/repo/issue2/labels.tmpl b/templates/repo/issue2/labels.tmpl
new file mode 100644
index 00000000..b499bae1
--- /dev/null
+++ b/templates/repo/issue2/labels.tmpl
@@ -0,0 +1,36 @@
+{{template "ng/base/head" .}}
+{{template "ng/base/header" .}}
+<div id="repo-wrapper">
+ {{template "repo/header" .}}
+ <div class="issue-main container repo-wide-wrapper">
+ <ul id="issue-list-nav" class="menu menu-line">
+ <li><a href="#">Issue</a></li>
+ <li><a href="#">Pull Request</a></li>
+ <li class="current"><a href="#">Labels</a></li>
+ <li><a href="#">Milestones</a></li>
+ <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green text-bold">New Issue</button></a></li>
+ <li class="right"><a href="#">Filter</a></li>
+ </ul>
+ <div id="issue-list-container">
+ <div id="issue-list-menu">
+ <div class="left"><span class="label label-black" id="labels-num">6</span><strong>Labels</strong></div>
+ <div class="clear"></div>
+ </div>
+ <ul id="label-list" class="list-no-style">
+ <li class="item" id="label-id">
+ <a class="right" href="#"><i class="octicon octicon-x"></i>Delete</a>
+ <a class="right" href="#"><i class="octicon octicon-pencil"></i>Edit</a>
+ <a class="right issue-num" href="#"><i class="octicon octicon-issue-opened"></i><strong class="num">12</strong>Issues</a>
+ <a class="left label clear" href="#" style="background-color: red"><i class="octicon octicon-tag"></i><strong>bug</strong></a>
+ </li>
+ <li class="item" id="label-id">
+ <a class="right" href="#"><i class="octicon octicon-x"></i>Delete</a>
+ <a class="right" href="#"><i class="octicon octicon-pencil"></i>Edit</a>
+ <a class="right issue-num" href="#"><i class="octicon octicon-issue-opened"></i><strong class="num">12</strong>Issues</a>
+ <a class="left label clear" href="#" style="background-color: red"><i class="octicon octicon-tag"></i><strong>bug</strong></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+</div>
+{{template "ng/base/footer" .}} \ No newline at end of file
diff --git a/templates/repo/issue2/list.tmpl b/templates/repo/issue2/list.tmpl
index d2440a3c..db69afb7 100644
--- a/templates/repo/issue2/list.tmpl
+++ b/templates/repo/issue2/list.tmpl
@@ -8,9 +8,64 @@
<li><a href="#">Pull Request</a></li>
<li><a href="#">Labels</a></li>
<li><a href="#">Milestones</a></li>
- <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green btn-radius text-bold">New Issue</button></a></li>
+ <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green text-bold">New Issue</button></a></li>
<li class="right"><a href="#">Filter</a></li>
</ul>
+ <div id="issue-list-container">
+ <div id="issue-list-menu">
+ <div class="left">
+ <span class="mark open hover"><a href="#">
+ <i class="octicon octicon-issue-opened"></i> 88 Open
+ </a></span>
+ <span class="mark close"><a href="">
+ <i class="octicon octicon-issue-closed"></i> 12 Close
+ </a></span>
+ </div>
+ <div class="clear"></div>
+ </div>
+ <ul id="issue-list" class="list-no-style">
+ <li class="item" id="issue-id">
+ <a class="comment" href="#">
+ <i class="octicon octicon-comment"></i> 7
+ </a>
+ <p class="title text-bold">
+ <span class="label label-black index-num">#588</span>
+ <a href="#" class="title-text">Delete account text and/or translations missing</a>
+ <span class="label label-red issue-label"><a href="#">bug</a></span>
+ </p>
+ <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p>
+ </li>
+ <li class="item" id="issue-id2">
+ <a class="comment" href="#">
+ <i class="octicon octicon-comment"></i> 7
+ </a>
+ <p class="title text-bold">
+ <span class="label label-black index-num">#588</span>
+ <a href="#" class="title-text">Delete account text and/or translations missing</a>
+ <span class="label label-red issue-label"><a href="#">bug</a></span>
+ </p>
+ <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p>
+ </li>
+ <li class="item" id="issue-id3">
+ <a class="comment" href="#">
+ <i class="octicon octicon-comment"></i> 7
+ </a>
+ <p class="title text-bold">
+ <span class="label label-black index-num">#588</span>
+ <a href="#" class="title-text">Disabling attachments breaks issues and comments ajax submit</a>
+ <span class="label label-red issue-label"><a href="#">bug</a></span>
+ </p>
+ <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p>
+ </li>
+ </ul>
+ <div id="issue-list-pager" class="pager text-center">
+ <a class="prev invalid" href="#">Prev</a>
+ <a class="page" href="#">1</a>
+ <a class="page hover" href="#">2</a>
+ <a class="page" href="#">3</a>
+ <a class="next" href="#">Next</a>
+ </div>
+ </div>
</div>
</div>
{{template "ng/base/footer" .}} \ No newline at end of file
diff --git a/templates/repo/pr2/list.tmpl b/templates/repo/pr2/list.tmpl
new file mode 100644
index 00000000..93868256
--- /dev/null
+++ b/templates/repo/pr2/list.tmpl
@@ -0,0 +1,48 @@
+{{template "ng/base/head" .}}
+{{template "ng/base/header" .}}
+<div id="repo-wrapper">
+ {{template "repo/header" .}}
+ <div class="issue-main container repo-wide-wrapper">
+ <ul id="issue-list-nav" class="menu menu-line">
+ <li><a href="#">Issue</a></li>
+ <li class="current"><a href="#">Pull Request</a></li>
+ <li><a href="#">Labels</a></li>
+ <li><a href="#">Milestones</a></li>
+ <li class="right" id="issue-new"><a href="#"><button id="issue-new-btn" class="btn btn-green text-bold">New Pull Request</button></a></li>
+ <li class="right"><a href="#">Filter</a></li>
+ </ul>
+ <div id="issue-list-container">
+ <div id="issue-list-menu">
+ <div class="left">
+ <span class="mark open hover"><a href="#">
+ <i class="octicon octicon-git-pull-request"></i> 88 Open
+ </a></span>
+ <span class="mark close"><a href="">
+ <i class="octicon octicon-issue-closed"></i> 12 Close
+ </a></span>
+ </div>
+ <div class="clear"></div>
+ </div>
+ <ul id="pull-list" class="list-no-style">
+ <li class="item" id="pr-id">
+ <a class="comment" href="#">
+ <i class="octicon octicon-comment"></i> 7
+ </a>
+ <p class="title text-bold">
+ <i class="octicon octicon-git-pull-request"></i>
+ <a href="#" class="title-text">Delete account text and/or translations missing</a>
+ </p>
+ <p class="desc">opened 7 days ago by <a href="#">marcuspoehls</a></p>
+ </li>
+ </ul>
+ <div id="issue-list-pager" class="pager text-center">
+ <a class="prev invalid" href="#">Prev</a>
+ <a class="page" href="#">1</a>
+ <a class="page hover" href="#">2</a>
+ <a class="page" href="#">3</a>
+ <a class="next" href="#">Next</a>
+ </div>
+ </div>
+ </div>
+</div>
+{{template "ng/base/footer" .}} \ No newline at end of file
diff --git a/templates/repo/settings/hook_gogs.tmpl b/templates/repo/settings/hook_gogs.tmpl
index 31a04ce0..39e612b9 100644
--- a/templates/repo/settings/hook_gogs.tmpl
+++ b/templates/repo/settings/hook_gogs.tmpl
@@ -2,7 +2,7 @@
<form class="form form-align panel-body repo-setting-form" id="repo-setting-form-gogs" action="{{if .RepoLink}}{{.RepoLink}}{{else if .OrgLink}}{{.OrgLink}}{{end}}/settings/hooks/gogs/{{if .PageIsSettingsHooksNew}}new{{else}}{{.Webhook.Id}}{{end}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="hook_type" value="gogs">
- <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}</div>
+ <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_webhook_desc" "http://gogs.io/docs/features/webhook.html" | Str2html}}</div>
<div class="field">
<label class="req" for="payload-url">{{.i18n.Tr "repo.settings.payload_url"}}</label>
<input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="payload-url" name="payload_url" type="url" value="{{.Webhook.Url}}" required />
diff --git a/templates/repo/settings/hook_slack.tmpl b/templates/repo/settings/hook_slack.tmpl
index 08d86180..bc307ec8 100644
--- a/templates/repo/settings/hook_slack.tmpl
+++ b/templates/repo/settings/hook_slack.tmpl
@@ -2,7 +2,7 @@
<form class="form form-align panel-body repo-setting-form" id="repo-setting-form-slack" action="{{if .RepoLink}}{{.RepoLink}}{{else if .OrgLink}}{{.OrgLink}}{{end}}/settings/hooks/slack/{{if .PageIsSettingsHooksNew}}new{{else}}{{.Webhook.Id}}{{end}}" method="post">
{{.CsrfTokenHtml}}
<input type="hidden" name="hook_type" value="slack">
- <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_slack_hook_desc" | Str2html}}</div>
+ <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.add_slack_hook_desc" "http://slack.com" | Str2html}}</div>
<div class="field">
<label class="req" for="payload-url">{{.i18n.Tr "repo.settings.payload_url"}}</label>
<input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="payload-url" name="payload_url" type="url" value="{{.Webhook.Url}}" required />
diff --git a/templates/repo/settings/hooks.tmpl b/templates/repo/settings/hooks.tmpl
index 6efd8f0a..6fcedab7 100644
--- a/templates/repo/settings/hooks.tmpl
+++ b/templates/repo/settings/hooks.tmpl
@@ -15,7 +15,7 @@
<strong>{{.i18n.Tr "repo.settings.hooks"}}</strong>
</div>
<ul class="panel-body setting-list">
- <li>{{.i18n.Tr "repo.settings.hooks_desc" | Str2html}}</li>
+ <li>{{.i18n.Tr "repo.settings.hooks_desc" "http://gogs.io/docs/features/webhook.html" | Str2html}}</li>
{{range .Webhooks}}
<li>
{{if .IsActive}}
diff --git a/templates/repo/settings/nav.tmpl b/templates/repo/settings/nav.tmpl
index 16128f01..6803c563 100644
--- a/templates/repo/settings/nav.tmpl
+++ b/templates/repo/settings/nav.tmpl
@@ -5,7 +5,9 @@
<li {{if .PageIsSettingsOptions}}class="current"{{end}}><a href="{{.RepoLink}}/settings">{{.i18n.Tr "repo.settings.options"}}</a></li>
<li {{if .PageIsSettingsCollaboration}}class="current"{{end}}><a href="{{.RepoLink}}/settings/collaboration">{{.i18n.Tr "repo.settings.collaboration"}}</a></li>
<li {{if .PageIsSettingsHooks}}class="current"{{end}}><a href="{{.RepoLink}}/settings/hooks">{{.i18n.Tr "repo.settings.hooks"}}</a></li>
+ {{if or .SignedUser.AllowGitHook .SignedUser.IsAdmin}}
<li {{if .PageIsSettingsGitHooks}}class="current"{{end}}><a href="{{.RepoLink}}/settings/hooks/git">{{.i18n.Tr "repo.settings.githooks"}}</a></li>
+ {{end}}
<!-- <li {{if .PageIsSettingsKeys}}class="current"{{end}}><a href="{{.RepoLink}}/settings/keys">{{.i18n.Tr "repo.settings.deploy_keys"}}</a></li> -->
</ul>
</div>
diff --git a/templates/repo/sidebar.tmpl b/templates/repo/sidebar.tmpl
index 7a00dbb8..9d6abb47 100644
--- a/templates/repo/sidebar.tmpl
+++ b/templates/repo/sidebar.tmpl
@@ -9,7 +9,7 @@
<li class="border-bottom"></li>
<li class="head">{{if .IsViewBranch}}{{.BranchName}}{{else}}{{ShortSha .BranchName}}{{end}}</li>
<li>
- <a class="radius" href="{{.RepoLink}}/commits/{{.BranchName}}"><i class="octicon octicon-history"></i>{{.i18n.Tr "repo.commits"}} <span class="num right label label-gray label-radius">{{.CommitsCount}}</span></a>
+ <a class="radius" href="{{.RepoLink}}/commits/{{EscapePound .BranchName}}"><i class="octicon octicon-history"></i>{{.i18n.Tr "repo.commits"}} <span class="num right label label-gray label-radius">{{.CommitsCount}}</span></a>
</li>
<!-- <li>
<a class="radius" href="{{.RepoLink}}/branches"><i class="octicon octicon-git-branch"></i>Branches<span class="num right label label-gray label-radius">{{.BrancheCount}}</span></a>
diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl
index 4e2d4fc6..d33cc950 100644
--- a/templates/repo/view_file.tmpl
+++ b/templates/repo/view_file.tmpl
@@ -12,10 +12,10 @@
<strong class="file-name">{{.FileName}}</strong><span class="file-size">{{FileSize .FileSize}}</span>
{{end}}
{{if not .ReadmeInList}}
- <a class="right" href="{{.RepoLink}}/commits/{{.BranchName}}/{{.TreeName}}">
+ <a class="right" href="{{.RepoLink}}/commits/{{EscapePound .BranchName}}/{{.TreeName}}">
<button class="btn btn-medium btn-gray btn-right-radius btn-comb">{{.i18n.Tr "repo.file_history"}}</button>
</a>
- <a class="right" href="{{.FileLink}}">
+ <a class="right" href="{{EscapePound .FileLink}}">
<button class="btn btn-medium btn-gray btn-left-radius btn-comb">{{.i18n.Tr "repo.file_raw"}}</button>
</a>
{{end}}
@@ -26,9 +26,9 @@
{{else if not .IsFileText}}
<div class="view-raw">
{{if .IsImageFile}}
- <img src="{{.FileLink}}">
+ <img src="{{EscapePound .FileLink}}">
{{else}}
- <a href="{{.FileLink}}" rel="nofollow" class="btn btn-gray btn-radius">{{.i18n.Tr "repo.file_view_raw"}}</a>
+ <a href="{{EscapePound .FileLink}}" rel="nofollow" class="btn btn-gray btn-radius">{{.i18n.Tr "repo.file_view_raw"}}</a>
{{end}}
</div>
{{else if .FileSize}}
diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl
index 032b9e0f..e65d7c11 100644
--- a/templates/repo/view_list.tmpl
+++ b/templates/repo/view_list.tmpl
@@ -18,7 +18,7 @@
{{if .HasParentPath}}
<tr class="has-parent">
<td class="icon"></td>
- <td class="name"><a href="{{.BranchLink}}{{.ParentPath}}">..</a></td>
+ <td class="name"><a href="{{EscapePound .BranchLink}}{{.ParentPath}}">..</a></td>
<td class="msg"></td>
<td class="age"></td>
</tr>
@@ -39,7 +39,7 @@
<span class="octicon octicon-file-{{if or $entry.IsDir}}directory{{else}}text{{end}}"></span>
</td>
<td class="name">
- <a href="{{$.BranchLink}}/{{$.TreePath}}{{$entry.Name}}" class="text-truncate">{{$entry.Name}}</a>
+ <a href="{{EscapePound $.BranchLink}}/{{$.TreePath}}{{$entry.Name}}" class="text-truncate">{{$entry.Name}}</a>
</td>
{{end}}
<td class="msg">
diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl
index af3d11a0..46bc99bd 100644
--- a/templates/user/profile.tmpl
+++ b/templates/user/profile.tmpl
@@ -70,13 +70,18 @@
<div class="tab-pane active">
<div id="org-repo-list">
{{range .Repos}}
- {{if not .IsPrivate}}
+ {{if or (not .IsPrivate) (.HasAccess $.SignedUserName)}}
<div class="org-repo-item">
<ul class="org-repo-status right">
<li><i class="octicon octicon-star"></i> {{.NumStars}}</li>
<li><i class="octicon octicon-git-branch"></i> {{.NumForks}}</li>
</ul>
- <h2><a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a></h2>
+ <h2>
+ <a href="{{AppSubUrl}}/{{$.Owner.Name}}/{{.Name}}">{{.Name}}</a>
+ {{if .IsPrivate}}
+ <span class="text-gold"><i class="octicon octicon-lock"></i></span>
+ {{end}}
+ </h2>
<p class="org-repo-description">{{.Description}}</p>
<p class="org-repo-updated">{{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}</p>
</div>
diff --git a/templates/user/settings/applications.tmpl b/templates/user/settings/applications.tmpl
new file mode 100644
index 00000000..f34349a5
--- /dev/null
+++ b/templates/user/settings/applications.tmpl
@@ -0,0 +1,56 @@
+{{template "ng/base/head" .}}
+{{template "ng/base/header" .}}
+<div id="setting-wrapper" class="main-wrapper">
+ <div id="user-profile-setting" class="container clear">
+ {{template "user/settings/nav" .}}
+ <div class="grid-4-5 left">
+ <div class="setting-content">
+ {{template "ng/base/alert" .}}
+ <div id="setting-content">
+ <div id="user-applications-panel" class="panel panel-radius">
+ <div class="panel-header">
+ <a class="show-form-btn" data-target-form="#access-add-form">
+ <button class="btn btn-medium btn-black btn-radius right">{{.i18n.Tr "settings.generate_new_token"}}</button>
+ </a>
+ <strong>{{.i18n.Tr "settings.manage_access_token"}}</strong>
+ </div>
+ <ul class="panel-body setting-list">
+ <li>{{.i18n.Tr "settings.tokens_desc"}}</li>
+ {{range .Tokens}}
+ <li class="ssh clear">
+ <span class="active-icon left label label-{{if .HasRecentActivity}}green{{else}}gray{{end}} label-radius"></span>
+ <i class="fa fa-send fa-2x left"></i>
+ <div class="ssh-content left">
+ <p><strong>{{.Name}}</strong></p>
+ <p class="activity"><i>{{$.i18n.Tr "settings.add_on"}} {{DateFormat .Created "M d, Y"}} — <i class="octicon octicon-info"></i>{{if .HasUsed}}{{$.i18n.Tr "settings.last_used"}} {{DateFormat .Updated "M d, Y"}}{{else}}{{$.i18n.Tr "settings.no_activity"}}{{end}}</i></p>
+ </div>
+ <a href="{{AppSubUrl}}/user/settings/applications?remove={{.Id}}">
+ <button class="btn btn-small btn-red btn-radius ssh-btn right">{{$.i18n.Tr "settings.delete_token"}}</button>
+ </a>
+ </li>
+ {{end}}
+ </ul>
+ </div>
+ <br>
+ <form class="panel panel-radius form form-align form-settings-add hide" id="access-add-form" action="{{AppSubUrl}}/user/settings/applications" method="post">
+ {{.CsrfTokenHtml}}
+ <p class="panel-header"><strong>{{.i18n.Tr "settings.generate_new_token"}}</strong></p>
+ <div class="panel-body">
+ <div class="text-center panel-desc">{{.i18n.Tr "settings.new_token_desc"}}</div>
+ <input type="hidden" name="type" value="token">
+ <p class="field">
+ <label class="req" for="token-name">{{.i18n.Tr "settings.token_name"}}</label>
+ <input class="ipt ipt-radius" id="token-name" name="name" required />
+ </p>
+ <p class="field">
+ <label></label>
+ <button class="btn btn-green btn-medium btn-radius" id="ssh-add-btn">{{.i18n.Tr "settings.generate_token"}}</button>
+ </p>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+{{template "ng/base/footer" .}} \ No newline at end of file
diff --git a/templates/user/settings/nav.tmpl b/templates/user/settings/nav.tmpl
index fd60cb53..6204b85a 100644
--- a/templates/user/settings/nav.tmpl
+++ b/templates/user/settings/nav.tmpl
@@ -6,6 +6,7 @@
<li {{if .PageIsSettingsPassword}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/password">{{.i18n.Tr "settings.password"}}</a></li>
<li {{if .PageIsSettingsSSHKeys}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/ssh">{{.i18n.Tr "settings.ssh_keys"}}</a></li>
<li {{if .PageIsSettingsSocial}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/social">{{.i18n.Tr "settings.social"}}</a></li>
+ <li {{if .PageIsSettingsApplications}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/applications">{{.i18n.Tr "settings.applications"}}</a></li>
<li {{if .PageIsSettingsDelete}}class="current"{{end}}><a href="{{AppSubUrl}}/user/settings/delete">{{.i18n.Tr "settings.delete"}}</a></li>
</ul>
</div>
diff --git a/templates/user/settings/sshkeys.tmpl b/templates/user/settings/sshkeys.tmpl
index 188f078a..dcebccbb 100644
--- a/templates/user/settings/sshkeys.tmpl
+++ b/templates/user/settings/sshkeys.tmpl
@@ -9,7 +9,9 @@
<div id="user-ssh-setting-content">
<div id="user-ssh-panel" class="panel panel-radius">
<div class="panel-header">
- <a class="btn btn-small btn-black btn-header btn-radius right" id="ssh-add">{{.i18n.Tr "settings.add_key"}}</a>
+ <a class="show-form-btn" data-target-form="#user-ssh-add-form">
+ <button class="btn btn-medium btn-black btn-radius right">{{.i18n.Tr "settings.add_key"}}</button>
+ </a>
<strong>{{.i18n.Tr "settings.manage_ssh_keys"}}</strong>
</div>
<ul class="panel-body setting-list">
@@ -27,15 +29,15 @@
{{$.CsrfTokenHtml}}
<input name="_method" type="hidden" value="DELETE">
<input name="id" type="hidden" value="{{.Id}}">
- <button class="right ssh-delete-btn btn btn-red btn-radius btn-small">{{$.i18n.Tr "settings.delete_key"}}</button>
+ <button class="right ssh-btn btn btn-red btn-radius btn-small">{{$.i18n.Tr "settings.delete_key"}}</button>
</form>
</li>
{{end}}
</ul>
</div>
- <p>{{.i18n.Tr "settings.ssh_helper" | Str2html}}</p>
+ <p>{{.i18n.Tr "settings.ssh_helper" "https://help.github.com/articles/generating-ssh-keys" "https://help.github.com/ssh-issues/" | Str2html}}</p>
<br>
- <form class="panel panel-radius form form-align hide" id="user-ssh-add-form" action="{{AppSubUrl}}/user/settings/ssh" method="post">
+ <form class="panel panel-radius form form-align form-settings-add hide" id="user-ssh-add-form" action="{{AppSubUrl}}/user/settings/ssh" method="post">
{{.CsrfTokenHtml}}
<p class="panel-header"><strong>{{.i18n.Tr "settings.add_new_key"}}</strong></p>
<div class="panel-body">