From 383dbd1b7b8afa712d9493197e0a28cc34340c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Fri, 10 May 2019 16:29:55 +0000 Subject: [PATCH 001/171] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20web=5Fbase=5Furl?= =?UTF-8?q?=20=E9=85=8D=E7=BD=AE,=20=E7=94=A8=E4=BA=8E=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=20web=20=E5=90=8E=E5=8F=B0=E5=8F=AF=E7=BD=AE=E4=BA=8E=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E5=AD=90=E8=B7=AF=E5=BE=84=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 ++++++++++++++++++ cmd/nps/nps.go | 3 ++- conf/nps.conf | 3 +++ server/proxy/tcp.go | 2 +- web/controllers/base.go | 5 +++- web/controllers/index.go | 2 ++ web/controllers/login.go | 4 ++- web/routers/router.go | 24 ++++++++++++----- web/static/js/langchange.js | 4 +-- web/views/client/add.html | 2 +- web/views/client/edit.html | 2 +- web/views/client/list.html | 18 ++++++------- web/views/index/add.html | 2 +- web/views/index/edit.html | 2 +- web/views/index/hadd.html | 2 +- web/views/index/hedit.html | 2 +- web/views/index/hlist.html | 6 ++--- web/views/index/list.html | 12 ++++----- web/views/login/index.html | 14 +++++----- web/views/login/register.html | 14 +++++----- web/views/public/layout.html | 49 +++++++++++++++++++---------------- 21 files changed, 124 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 5f08bee..cb24ffb 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 * [配置文件说明](#服务端配置文件) * [使用https](#使用https) * [与nginx配合](#与nginx配合) + * [web使用Caddy代理](#web使用Caddy代理) * [关闭http|https代理](#关闭代理) * [将nps安装到系统](#将nps安装到系统) * [流量数据持久化](#流量数据持久化) @@ -307,6 +308,7 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 web_port | web管理端口 web_password | web界面管理密码 web_username | web界面管理账号 +web_base_url | web管理主路径,用于将web管理置于代理子路径后面 bridge_port | 服务端客户端通信端口 https_proxy_port | 域名代理https代理监听端口 http_proxy_port | 域名代理http代理监听端口 @@ -365,6 +367,29 @@ server { } } ``` + +### web使用Caddy代理 + +如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. + +假设我们想通过 `http://caddy_ip:caddy_port/nps` 来访问后台, Caddyfile 这样配置: + +```Caddyfile +caddy_ip:caddy_port/nps { + #server_ip 为 nps 服务器IP + #web_port 为 nps 后台端口 + proxy / http://server_ip:web_port/nps { + transparent + } +} +``` + +nps.conf 修改 `web_base_url` 为 `/nps` 即可 +``` +web_base_url=/nps +``` + + ### 关闭代理 如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。 diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 2cb9a28..369dcf1 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -14,7 +14,7 @@ import ( "github.com/cnlh/nps/server/tool" "github.com/cnlh/nps/vender/github.com/astaxie/beego" "github.com/cnlh/nps/vender/github.com/astaxie/beego/logs" - _ "github.com/cnlh/nps/web/routers" + "github.com/cnlh/nps/web/routers" "log" "os" "path/filepath" @@ -28,6 +28,7 @@ var ( func main() { flag.Parse() beego.LoadAppConfig("ini", filepath.Join(common.GetRunPath(), "conf", "nps.conf")) + routers.Init() if len(os.Args) > 1 { switch os.Args[1] { case "test": diff --git a/conf/nps.conf b/conf/nps.conf index c75a430..8c22ab1 100755 --- a/conf/nps.conf +++ b/conf/nps.conf @@ -41,6 +41,9 @@ web_username=admin web_password=123 web_port = 8080 web_ip=0.0.0.0 +web_base_url= +# if web under proxy use sub path. like http://host/nps need this. +#web_base_url=/nps #Web API unauthenticated IP address(the len of auth_crypt_key must be 16) auth_key=test diff --git a/server/proxy/tcp.go b/server/proxy/tcp.go index b7c7267..e263a82 100755 --- a/server/proxy/tcp.go +++ b/server/proxy/tcp.go @@ -62,7 +62,7 @@ func (s *WebServer) Start() error { <-stop } beego.BConfig.WebConfig.Session.SessionOn = true - beego.SetStaticPath("/static", filepath.Join(common.GetRunPath(), "web", "static")) + beego.SetStaticPath(beego.AppConfig.String("web_base_url")+"/static", filepath.Join(common.GetRunPath(), "web", "static")) beego.SetViewsPath(filepath.Join(common.GetRunPath(), "web", "views")) if l, err := connection.GetWebManagerListener(); err == nil { beego.InitBeforeHTTPRun() diff --git a/web/controllers/base.go b/web/controllers/base.go index cbfa1cc..e58d37d 100755 --- a/web/controllers/base.go +++ b/web/controllers/base.go @@ -21,6 +21,7 @@ type BaseController struct { //初始化参数 func (s *BaseController) Prepare() { + s.Data["web_base_url"] = beego.AppConfig.String("web_base_url") controllerName, actionName := s.GetControllerAndAction() s.controllerName = strings.ToLower(controllerName[0 : len(controllerName)-10]) s.actionName = strings.ToLower(actionName) @@ -33,7 +34,7 @@ func (s *BaseController) Prepare() { timeNowUnix := time.Now().Unix() if !((math.Abs(float64(timeNowUnix-int64(timestamp))) <= 20) && (crypt.Md5(configKey+strconv.Itoa(timestamp)) == md5Key)) { if s.GetSession("auth") != true { - s.Redirect("/login/index", 302) + s.Redirect(beego.AppConfig.String("web_base_url")+"/login/index", 302) } } if s.GetSession("isAdmin") != nil && !s.GetSession("isAdmin").(bool) { @@ -59,6 +60,7 @@ func (s *BaseController) Prepare() { //加载模板 func (s *BaseController) display(tpl ...string) { + s.Data["web_base_url"] = beego.AppConfig.String("web_base_url") var tplname string if s.Data["menu"] == nil { s.Data["menu"] = s.actionName @@ -82,6 +84,7 @@ func (s *BaseController) display(tpl ...string) { //错误 func (s *BaseController) error() { + s.Data["web_base_url"] = beego.AppConfig.String("web_base_url") s.Layout = "public/layout.html" s.TplName = "public/error.html" } diff --git a/web/controllers/index.go b/web/controllers/index.go index 5ecdb15..ff7370a 100755 --- a/web/controllers/index.go +++ b/web/controllers/index.go @@ -4,6 +4,7 @@ import ( "github.com/cnlh/nps/lib/file" "github.com/cnlh/nps/server" "github.com/cnlh/nps/server/tool" + "github.com/cnlh/nps/vender/github.com/astaxie/beego" ) type IndexController struct { @@ -11,6 +12,7 @@ type IndexController struct { } func (s *IndexController) Index() { + s.Data["web_base_url"] = beego.AppConfig.String("web_base_url") s.Data["data"] = server.GetDashboardData() s.SetInfo("dashboard") s.display("index/index") diff --git a/web/controllers/login.go b/web/controllers/login.go index 7b8a55d..6c62a0d 100755 --- a/web/controllers/login.go +++ b/web/controllers/login.go @@ -13,6 +13,7 @@ type LoginController struct { } func (self *LoginController) Index() { + self.Data["web_base_url"] = beego.AppConfig.String("web_base_url") self.Data["register_allow"], _ = beego.AppConfig.Bool("allow_user_register") self.TplName = "login/index.html" } @@ -59,6 +60,7 @@ func (self *LoginController) Verify() { } func (self *LoginController) Register() { if self.Ctx.Request.Method == "GET" { + self.Data["web_base_url"] = beego.AppConfig.String("web_base_url") self.TplName = "login/register.html" } else { if b, err := beego.AppConfig.Bool("allow_user_register"); err != nil || !b { @@ -90,5 +92,5 @@ func (self *LoginController) Register() { func (self *LoginController) Out() { self.SetSession("auth", false) - self.Redirect("/login/index", 302) + self.Redirect(beego.AppConfig.String("web_base_url")+"/login/index", 302) } diff --git a/web/routers/router.go b/web/routers/router.go index 690df3b..82d4ad2 100755 --- a/web/routers/router.go +++ b/web/routers/router.go @@ -5,10 +5,22 @@ import ( "github.com/cnlh/nps/web/controllers" ) -func init() { - beego.Router("/", &controllers.IndexController{}, "*:Index") - beego.AutoRouter(&controllers.IndexController{}) - beego.AutoRouter(&controllers.LoginController{}) - beego.AutoRouter(&controllers.ClientController{}) - beego.AutoRouter(&controllers.AuthController{}) +func Init() { + web_base_url := beego.AppConfig.String("web_base_url") + if len(web_base_url) > 0 { + ns := beego.NewNamespace(web_base_url, + beego.NSRouter("/", &controllers.IndexController{}, "*:Index"), + beego.NSAutoRouter(&controllers.IndexController{}), + beego.NSAutoRouter(&controllers.LoginController{}), + beego.NSAutoRouter(&controllers.ClientController{}), + beego.NSAutoRouter(&controllers.AuthController{}), + ) + beego.AddNamespace(ns) + } else { + beego.Router("/", &controllers.IndexController{}, "*:Index") + beego.AutoRouter(&controllers.IndexController{}) + beego.AutoRouter(&controllers.LoginController{}) + beego.AutoRouter(&controllers.ClientController{}) + beego.AutoRouter(&controllers.AuthController{}) + } } diff --git a/web/static/js/langchange.js b/web/static/js/langchange.js index 54961d7..e7a60fb 100644 --- a/web/static/js/langchange.js +++ b/web/static/js/langchange.js @@ -12,7 +12,7 @@ $.ajax({ type: "GET", - url: defaults.file, + url: window.nps.web_base_url + defaults.file, dataType: "xml", success: function (xml) { $(xml).find('text').each(function () { @@ -65,4 +65,4 @@ $(document).ready(function () { setCookie("lang", "zh") $("body").cloudLang({lang: "zh", file: "/static/page/lang-example.xml"}); }); -}); \ No newline at end of file +}); diff --git a/web/views/client/add.html b/web/views/client/add.html index 07719bd..30563c2 100755 --- a/web/views/client/add.html +++ b/web/views/client/add.html @@ -134,7 +134,7 @@ $("#add").on("click", function () { $.ajax({ type: "POST", - url: "/client/add", + url: "{{.web_base_url}}/client/add", data: $("form").serializeArray(), success: function (res) { alert(res.msg) diff --git a/web/views/client/edit.html b/web/views/client/edit.html index 20db215..0ae06a2 100755 --- a/web/views/client/edit.html +++ b/web/views/client/edit.html @@ -145,7 +145,7 @@ $("#add").on("click", function () { $.ajax({ type: "POST", - url: "/client/edit", + url: "{{.web_base_url}}/client/edit", data: $("form").serializeArray(), success: function (res) { alert(res.msg) diff --git a/web/views/client/list.html b/web/views/client/list.html index ce49bfe..60a4fc6 100755 --- a/web/views/client/list.html +++ b/web/views/client/list.html @@ -20,7 +20,7 @@
@@ -42,7 +42,7 @@ if (confirm("Are you sure you want to delete it??")) { $.ajax({ type: "POST", - url: "/client/del", + url: "{{.web_base_url}}/client/del", data: {"id": id}, success: function (res) { alert(res.msg) @@ -58,7 +58,7 @@ if (confirm("Are you sure you want to start it??")) { $.ajax({ type: "POST", - url: "/client/changestatus", + url: "{{.web_base_url}}/client/changestatus", data: {"id": id, "status": 1}, success: function (res) { alert(res.msg) @@ -74,7 +74,7 @@ if (confirm("Are you sure you want to stop it?")) { $.ajax({ type: "POST", - url: "/client/changestatus", + url: "{{.web_base_url}}/client/changestatus", data: { "id": id, "status": 0 }, @@ -90,26 +90,26 @@ } function edit(id) { - window.location.href = "/client/edit?id=" + id + window.location.href = "{{.web_base_url}}/client/edit?id=" + id } function add() { - window.location.href = "/client/add" + window.location.href = "{{.web_base_url}}/client/add" } function tunnel(id) { - window.location.href = "/index/all?client_id=" + id + window.location.href = "{{.web_base_url}}/index/all?client_id=" + id } function host(id) { - window.location.href = "/index/hostlist?client_id=" + id + window.location.href = "{{.web_base_url}}/index/hostlist?client_id=" + id } /*bootstrap table*/ $('#table').bootstrapTable({ toolbar: "#toolbar", method: 'post', // 服务器数据的请求方式 get or post - url: "/client/list", // 服务器数据的加载地址 + url: "{{.web_base_url}}/client/list", // 服务器数据的加载地址 contentType: "application/x-www-form-urlencoded", striped: true, // 设置为true会有隔行变色效果 search: true, diff --git a/web/views/index/add.html b/web/views/index/add.html index c2208a7..302553a 100755 --- a/web/views/index/add.html +++ b/web/views/index/add.html @@ -162,7 +162,7 @@ $("#add").on("click", function () { $.ajax({ type: "POST", - url: "/index/add", + url: "{{.web_base_url}}/index/add", data: $("form").serializeArray(), success: function (res) { alert(res.msg) diff --git a/web/views/index/edit.html b/web/views/index/edit.html index ef48ad0..32e3c3f 100755 --- a/web/views/index/edit.html +++ b/web/views/index/edit.html @@ -160,7 +160,7 @@ $("#add").on("click", function () { $.ajax({ type: "POST", - url: "/index/edit", + url: "{{.web_base_url}}/index/edit", data: $("form").serializeArray(), success: function (res) { alert(res.msg) diff --git a/web/views/index/hadd.html b/web/views/index/hadd.html index ac2a5cc..1a4482d 100755 --- a/web/views/index/hadd.html +++ b/web/views/index/hadd.html @@ -112,7 +112,7 @@ $("#add").on("click", function () { $.ajax({ type: "POST", - url: "/index/addhost", + url: "{{.web_base_url}}/index/addhost", data: $("form").serializeArray(), success: function (res) { alert(res.msg) diff --git a/web/views/index/hedit.html b/web/views/index/hedit.html index 5b430e9..9e17f45 100644 --- a/web/views/index/hedit.html +++ b/web/views/index/hedit.html @@ -116,7 +116,7 @@ $("#add").on("click", function () { $.ajax({ type: "POST", - url: "/index/edithost", + url: "{{.web_base_url}}/index/edithost", data: $("form").serializeArray(), success: function (res) { alert(res.msg) diff --git a/web/views/index/hlist.html b/web/views/index/hlist.html index 6d2ccaa..d2ec24e 100755 --- a/web/views/index/hlist.html +++ b/web/views/index/hlist.html @@ -18,7 +18,7 @@
- 新增
@@ -158,7 +158,7 @@ if (confirm("Are you sure you want to delete it??")) { $.ajax({ type: "POST", - url: "/index/delhost", + url: "{{.web_base_url}}/index/delhost", data: {"id": id}, success: function (res) { alert(res.msg) @@ -171,7 +171,7 @@ } function edit(id) { - window.location.href = "/index/edithost?id=" + id + window.location.href = "{{.web_base_url}}/index/edithost?id=" + id } diff --git a/web/views/index/list.html b/web/views/index/list.html index 5537f67..248d2cb 100755 --- a/web/views/index/list.html +++ b/web/views/index/list.html @@ -18,7 +18,7 @@
- 新增
diff --git a/web/views/login/index.html b/web/views/login/index.html index a28ae87..ffe89d0 100755 --- a/web/views/login/index.html +++ b/web/views/login/index.html @@ -8,10 +8,10 @@ nps admin login - - + + - + @@ -49,7 +49,7 @@ {{if eq true .register_allow}} - register + register {{end}} @@ -59,7 +59,7 @@ - + @@ -68,11 +68,11 @@ function login() { $.ajax({ type: "POST", - url: "/login/verify", + url: "{{.web_base_url}}/login/verify", data: $("form").serializeArray(), success: function (res) { if (res.status) { - window.location.href = "/index/index" + window.location.href = "{{.web_base_url}}/index/index" } else { alert(res.msg) } diff --git a/web/views/login/register.html b/web/views/login/register.html index 88d6e3b..a67e8c5 100644 --- a/web/views/login/register.html +++ b/web/views/login/register.html @@ -8,10 +8,10 @@ nps register - - + + - + @@ -34,22 +34,22 @@ - login + login - + + + + + - - - + + + - + - - + + - + @@ -35,7 +35,7 @@ @@ -115,7 +115,7 @@
  • - + logout
  • @@ -142,6 +142,9 @@ \ No newline at end of file + From 01a4bcf13db7d2aeed77e198a11fddb1e5317f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 01:54:23 +0800 Subject: [PATCH 042/171] update npc sdk and version --- .travis.yml | 10 ++++++++-- cmd/npc/sdk.go | 35 +++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 64c4aa0..345d47f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,9 @@ services: - docker script: - go test -v ./cmd/nps/ - +os: + - linux + - windows before_deploy: - wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz - tar -xvf upx-3.95-amd64_linux.tar.xz @@ -162,7 +164,7 @@ before_deploy: - tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe - - export VERSION=0.24.2 + - export VERSION=0.24.3 - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - sudo apt-get update @@ -174,6 +176,9 @@ before_deploy: - docker exec -it spksrc /bin/bash -c 'cd /spksrc && make setup && cd /spksrc/spk/npc && make' - cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk + - if [ "$TRAVIS_OS_NAME" = "windows" ]; then go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go ; fi + - tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h + - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - export DOCKER_CLI_EXPERIMENTAL=enabled - docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d @@ -220,6 +225,7 @@ deploy: - win_amd64_client.tar.gz - win_amd64_server.tar.gz - npc_$VERSION.spk + - nnpc_sdk.tar.gz on: tags: true all_branches: true diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index bf247fa..b4b60f9 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -2,32 +2,47 @@ package main import "C" import ( - "fmt" "github.com/cnlh/nps/client" "time" ) -//export PrintBye -func PrintBye() { - fmt.Println("From DLL: Bye!") -} - var status bool +var closeBefore bool +var cl *client.TRPClient -//export Sum -func StartClientByVerifyKey(a int, b int) bool { - c := client.NewRPClient(*serverAddr, *verifyKey, *connType, *proxyUrl, nil) +//export StartClientByVerifyKey +func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl string) bool { + if cl != nil { + closeBefore = true + cl.Close() + } + cl = client.NewRPClient(serverAddr, verifyKey, connType, proxyUrl, nil) + closeBefore = false go func() { for { status = true - c.Start() + cl.Start() status = false + if closeBefore { + return + } time.Sleep(time.Second * 5) } }() return true } +//export GetClientStatus +func GetClientStatus() bool { + return status +} + +//export CloseClient +func CloseClient() { + cl.Close() + closeBefore = true +} + func main() { // Need a main function to make CGO compile package as C shared library } From 509c81a2b58646c4dbf9294dc081ff0602199da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 02:36:45 +0800 Subject: [PATCH 043/171] update trivas --- .travis.yml | 178 ++------------------------------------------------- build.sh | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++ update.sh | 50 +++++++++++++++ 3 files changed, 233 insertions(+), 174 deletions(-) create mode 100644 build.sh create mode 100644 update.sh diff --git a/.travis.yml b/.travis.yml index 345d47f..cb8c8ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,181 +10,11 @@ script: os: - linux - windows +jobs: + allow_failures: + - os: windows before_deploy: - - wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz - - tar -xvf upx-3.95-amd64_linux.tar.xz - - cp upx-3.95-amd64_linux/upx ./ - - - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_386_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_arm_v7_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_arm_v6_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_arm_v5_client.tar.gz npc conf/npc.conf - - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf linux_mips_client.tar.gz npc conf/npc.conf - - - - CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf - - - - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf - - - - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - - - tar -czvf macos_client.tar.gz npc conf/npc.conf - - - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_arm_v5_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_arm_v6_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_arm_v7_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_arm64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf freebsd_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf freebsd_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf freebsd_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_mips_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_mips64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_mips64le_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe - - - - CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - - - tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe - - - export VERSION=0.24.3 - - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - - sudo apt-get update - - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - - docker --version - - git clone https://github.com/cnlh/spksrc.git ~/spksrc - - mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ - - docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash - - docker exec -it spksrc /bin/bash -c 'cd /spksrc && make setup && cd /spksrc/spk/npc && make' - - cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk - - - if [ "$TRAVIS_OS_NAME" = "windows" ]; then go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go ; fi - - tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h - - - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - - export DOCKER_CLI_EXPERIMENTAL=enabled - - docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d - - docker buildx create --use --name mybuilder - - docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . - - docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . + - ./build.sh deploy: provider: releases diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..4be7456 --- /dev/null +++ b/build.sh @@ -0,0 +1,179 @@ +#/bash/sh + +if [ "$TRAVIS_OS_NAME" = "windows" ]; then + go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go + tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h +else + wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz + tar -xvf upx-3.95-amd64_linux.tar.xz + cp upx-3.95-amd64_linux/upx ./ + + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_386_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_arm_v7_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_arm_v6_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_arm_v5_client.tar.gz npc conf/npc.conf + + + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf + + + CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf + + + CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf + + + CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf + + + CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf linux_mips_client.tar.gz npc conf/npc.conf + + + CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf + + + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf + + + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go + + tar -czvf macos_client.tar.gz npc conf/npc.conf + + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_arm_v5_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_arm_v6_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_arm_v7_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_arm64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf freebsd_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf freebsd_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf freebsd_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + + CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_mips_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_mips64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_mips64le_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe + + + CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go + + tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe + + export VERSION=0.24.3 + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + sudo apt-get update + sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce + docker --version + git clone https://github.com/cnlh/spksrc.git ~/spksrc + mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ + docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash + docker exec -it spksrc /bin/bash -c 'cd /spksrc && make setup && cd /spksrc/spk/npc && make' + cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk + + + echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + export DOCKER_CLI_EXPERIMENTAL=enabled + docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d + docker buildx create --use --name mybuilder + docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . + docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . +fi diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..3e0bfe3 --- /dev/null +++ b/update.sh @@ -0,0 +1,50 @@ +#/bash/sh +echo "start upgrading to the latest version" +if [ $1 == "latest" ] +then + version=`wget -qO- -t1 -T2 "https://api.github.com/repos/cnlh/nps/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g'` +else + version=$1 +fi +echo "the current latest version is "$version"" +download_base_url=https://github.com/cnlh/nps/releases/download/$version/ + +if [ $4 ] +then + filename=""$2"_"$3"_v"$4"_"server".tar.gz" +else + filename=""$2"_"$3"_"server".tar.gz" +fi +complete_download_url=""$download_base_url""$filename"" +echo "start download file from "$complete_download_url"" + +dir_name=`echo $RANDOM` +mkdir $dir_name && cd $dir_name +wget $complete_download_url >/dev/null 2>&1 +if [ ! -f "$filename" ]; then + echo "download file failed!" + rm -rf $dir_name + exit +fi + +echo "start extracting files" +mkdir nps +tar -xvf $filename -C ./nps >/dev/null 2>&1 +cd nps + +if [ -f "../../nps" ]; then + echo "replace "../../nps"!" + cp -rf nps ../../ +fi + +usr_dir=`which nps` + +if [ -f "$usr_dir" ]; then + echo "replace "$usr_dir"!" + cp -rf nps $usr_dir +fi + +cd ../../ && rm -rf $dir_name + +echo "update complete!" +echo -e "\033[32m please restart nps \033[0m" From 6de4877f2473fe08d3cce3e8b546384f8599d733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 02:44:39 +0800 Subject: [PATCH 044/171] remove docker for test --- build.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build.sh b/build.sh index 4be7456..0ee6f00 100644 --- a/build.sh +++ b/build.sh @@ -170,10 +170,5 @@ else cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - export DOCKER_CLI_EXPERIMENTAL=enabled - docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d - docker buildx create --use --name mybuilder - docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . - docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . + fi From 78c71c2fa34fff21dab8f6c12be5d9af168f2f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 02:51:30 +0800 Subject: [PATCH 045/171] update travis ci --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cb8c8ae..7e370ad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ jobs: allow_failures: - os: windows before_deploy: - - ./build.sh + - chmod +x ./build.sh && ./build.sh deploy: provider: releases From 1dca14fc01ff955d5dec79a19abd64584215ab72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 02:57:34 +0800 Subject: [PATCH 046/171] update travis ci --- .travis.yml | 3 +- build.sh | 167 ++++++++++++++++++++++++++-------------------------- 2 files changed, 86 insertions(+), 84 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7e370ad..5a29a75 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,8 @@ jobs: allow_failures: - os: windows before_deploy: - - chmod +x ./build.sh && ./build.sh + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then chmod +x ./build.sh && ./build.sh; fi + - if [ "$TRAVIS_OS_NAME" = "windows" ]; go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go && tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h fi deploy: provider: releases diff --git a/build.sh b/build.sh index 0ee6f00..43f72a1 100644 --- a/build.sh +++ b/build.sh @@ -1,174 +1,175 @@ #/bash/sh -if [ "$TRAVIS_OS_NAME" = "windows" ]; then - go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go - tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h -else - wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz - tar -xvf upx-3.95-amd64_linux.tar.xz - cp upx-3.95-amd64_linux/upx ./ - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz +tar -xvf upx-3.95-amd64_linux.tar.xz +cp upx-3.95-amd64_linux/upx ./ - tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf - tar -czvf linux_386_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_386_client.tar.gz npc conf/npc.conf - tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf - tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf - tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf - tar -czvf linux_arm_v7_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_arm_v7_client.tar.gz npc conf/npc.conf - tar -czvf linux_arm_v6_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_arm_v6_client.tar.gz npc conf/npc.conf - tar -czvf linux_arm_v5_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_arm_v5_client.tar.gz npc conf/npc.conf - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf - CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf - CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf - CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf - CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf linux_mips_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf linux_mips_client.tar.gz npc conf/npc.conf - CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf +CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf +CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - tar -czvf macos_client.tar.gz npc conf/npc.conf +CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf macos_client.tar.gz npc conf/npc.conf - tar -czvf linux_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - tar -czvf linux_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - tar -czvf linux_arm_v5_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_arm_v5_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - tar -czvf linux_arm_v6_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_arm_v6_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - tar -czvf linux_arm_v7_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_arm_v7_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf linux_arm64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_arm64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf freebsd_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf freebsd_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf freebsd_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf freebsd_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf freebsd_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf freebsd_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf linux_mips_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_mips_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf linux_mips64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_mips64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf linux_mips64le_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_mips64le_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe +CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe - CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe +CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go - export VERSION=0.24.3 - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - sudo apt-get update - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - docker --version - git clone https://github.com/cnlh/spksrc.git ~/spksrc - mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ - docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash - docker exec -it spksrc /bin/bash -c 'cd /spksrc && make setup && cd /spksrc/spk/npc && make' - cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk +tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe +export VERSION=0.24.3 +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +sudo apt-get update +sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce +docker --version +git clone https://github.com/cnlh/spksrc.git ~/spksrc +mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ +docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash +docker exec -it spksrc /bin/bash -c 'cd /spksrc && make setup && cd /spksrc/spk/npc && make' +cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk -fi +echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin +export DOCKER_CLI_EXPERIMENTAL=enabled +docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d +docker buildx create --use --name mybuilder +docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . +docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . From 5d2b3a53a019871a2c1504434212f3bb098d5692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 03:06:14 +0800 Subject: [PATCH 047/171] update travis.yml --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5a29a75..cb16992 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ jobs: - os: windows before_deploy: - if [ "$TRAVIS_OS_NAME" = "linux" ]; then chmod +x ./build.sh && ./build.sh; fi - - if [ "$TRAVIS_OS_NAME" = "windows" ]; go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go && tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h fi + - if [ "$TRAVIS_OS_NAME" = "windows" ]; then go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go; fi deploy: provider: releases @@ -56,7 +56,8 @@ deploy: - win_amd64_client.tar.gz - win_amd64_server.tar.gz - npc_$VERSION.spk - - nnpc_sdk.tar.gz + - npc_sdk.dll + - npc_sdk.h on: tags: true all_branches: true From 3e26af308c81a34d7cba7ed3f11fd81ccc3b26b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 03:12:03 +0800 Subject: [PATCH 048/171] update travis.yml --- .travis.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index cb16992..c1417fd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,13 +9,8 @@ script: - go test -v ./cmd/nps/ os: - linux - - windows -jobs: - allow_failures: - - os: windows before_deploy: - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then chmod +x ./build.sh && ./build.sh; fi - - if [ "$TRAVIS_OS_NAME" = "windows" ]; then go build -buildmode=c-shared -o npc_sdk.dll cmd\npc\sdk.go; fi + - chmod +x ./build.sh && ./build.sh deploy: provider: releases @@ -56,8 +51,6 @@ deploy: - win_amd64_client.tar.gz - win_amd64_server.tar.gz - npc_$VERSION.spk - - npc_sdk.dll - - npc_sdk.h on: tags: true all_branches: true From eccf3c2be1b591b005466377f5777341802dc4be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 03:56:04 +0800 Subject: [PATCH 049/171] fix bug 250 --- lib/conn/conn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/conn/conn.go b/lib/conn/conn.go index 8f19e6c..db03c40 100755 --- a/lib/conn/conn.go +++ b/lib/conn/conn.go @@ -87,7 +87,7 @@ func (s *Conn) GetShortContent(l int) (b []byte, err error) { //读取指定长度内容 func (s *Conn) ReadLen(cLen int, buf []byte) (int, error) { - if cLen > len(buf) { + if cLen > len(buf) || cLen <= 0 { return 0, errors.New("长度错误" + strconv.Itoa(cLen)) } if n, err := io.ReadFull(s, buf[:cLen]); err != nil || n != cLen { From 627ea612e64b7db5a8c6d8592f3f1894e9542965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 04:04:05 +0800 Subject: [PATCH 050/171] fix nil pointer --- server/proxy/http.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/proxy/http.go b/server/proxy/http.go index 31ec81c..936aae3 100644 --- a/server/proxy/http.go +++ b/server/proxy/http.go @@ -171,11 +171,11 @@ reset: } }() for { - if resp, err := http.ReadResponse(bufio.NewReader(connClient), r); err != nil { + if resp, err := http.ReadResponse(bufio.NewReader(connClient), r); err != nil || resp == nil { return } else { //if the cache is start and the response is in the extension,store the response to the cache list - if s.useCache && strings.Contains(r.URL.Path, ".") { + if s.useCache && r.URL != nil && strings.Contains(r.URL.Path, ".") { b, err := httputil.DumpResponse(resp, true) if err != nil { return From fd71e0821fcd2b7982c0955efd21f5843ff30ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 04:45:52 +0800 Subject: [PATCH 051/171] fix compress --- lib/conn/snappy.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/conn/snappy.go b/lib/conn/snappy.go index 3f22aa0..2ea1034 100644 --- a/lib/conn/snappy.go +++ b/lib/conn/snappy.go @@ -3,7 +3,6 @@ package conn import ( "io" - "github.com/cnlh/nps/lib/common" "github.com/golang/snappy" ) @@ -32,13 +31,7 @@ func (s *SnappyConn) Write(b []byte) (n int, err error) { //snappy压缩读 func (s *SnappyConn) Read(b []byte) (n int, err error) { - buf := common.BufPool.Get().([]byte) - defer common.BufPool.Put(buf) - if n, err = s.r.Read(buf); err != nil { - return - } - copy(b, buf[:n]) - return + return s.r.Read(b) } func (s *SnappyConn) Close() error { From 5da5bf16286164704f721fdf345b8712e4afaf51 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 4 Dec 2019 13:04:25 +0800 Subject: [PATCH 052/171] fix p2p connection race condition --- client/local.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/local.go b/client/local.go index a66f9c0..9c903f6 100644 --- a/client/local.go +++ b/client/local.go @@ -1,8 +1,10 @@ package client import ( + "errors" "net" "net/http" + "runtime" "sync" "time" @@ -31,6 +33,14 @@ type p2pBridge struct { } func (p2pBridge *p2pBridge) SendLinkInfo(clientId int, link *conn.Link, t *file.Tunnel) (target net.Conn, err error) { + for i := 0; muxSession == nil; i++ { + if i >= 20 { + err = errors.New("p2pBridge:too many times to get muxSession") + logs.Error(err) + return + } + runtime.Gosched() // waiting for another goroutine establish the mux connection + } nowConn, err := muxSession.NewConn() if err != nil { udpConn = nil From 50180e5b7f9902215f1e151d94bbc4e55eb0e423 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Dec 2019 17:41:46 +0800 Subject: [PATCH 053/171] add npc sdk dll --- .travis.yml | 1 + build.sh | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index c1417fd..a0f6582 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,6 +51,7 @@ deploy: - win_amd64_client.tar.gz - win_amd64_server.tar.gz - npc_$VERSION.spk + - npc_sdk.tar.gz on: tags: true all_branches: true diff --git a/build.sh b/build.sh index 43f72a1..5e8d93f 100644 --- a/build.sh +++ b/build.sh @@ -173,3 +173,8 @@ docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f docker buildx create --use --name mybuilder docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . + + +apt-get install gcc-mingw-w64-i686 +env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go +tar -czvf npc_sdk.tar.gz -xvf npc_sdk.dll npc_sdk.h \ No newline at end of file From 036a17a3d94acb7159b1d6b4a50a4d7988ad33b1 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Dec 2019 17:52:32 +0800 Subject: [PATCH 054/171] change version --- build.sh | 2 +- lib/version/version.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 5e8d93f..3db2d4b 100644 --- a/build.sh +++ b/build.sh @@ -154,7 +154,7 @@ CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -stat tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe -export VERSION=0.24.3 +export VERSION=0.25.0 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update diff --git a/lib/version/version.go b/lib/version/version.go index 0f395a8..c46c010 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,8 +1,8 @@ package version -const VERSION = "0.24.3" +const VERSION = "0.25.0" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { - return "0.24.3" + return "0.25.0" } From 391fdbd9202b7633dd3f85fb52a2be9f866e90c2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Dec 2019 18:11:24 +0800 Subject: [PATCH 055/171] change sdk --- cmd/npc/sdk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index b4b60f9..07693ee 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -11,12 +11,12 @@ var closeBefore bool var cl *client.TRPClient //export StartClientByVerifyKey -func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl string) bool { +func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl *C.char) bool { if cl != nil { closeBefore = true cl.Close() } - cl = client.NewRPClient(serverAddr, verifyKey, connType, proxyUrl, nil) + cl = client.NewRPClient(C.GoString(serverAddr), C.GoString(verifyKey), C.GoString(connType), C.GoString(proxyUrl), nil) closeBefore = false go func() { for { From 34fcd151014375db3c0ff4165858a9cf179a4813 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Dec 2019 18:21:54 +0800 Subject: [PATCH 056/171] add sudo in apt-get --- build.sh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index 3db2d4b..c5b5f4e 100644 --- a/build.sh +++ b/build.sh @@ -1,5 +1,8 @@ #/bash/sh +sudo apt-get install gcc-mingw-w64-i686 +env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go +tar -czvf npc_sdk.tar.gz -xvf npc_sdk.dll npc_sdk.h wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz tar -xvf upx-3.95-amd64_linux.tar.xz @@ -173,8 +176,3 @@ docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f docker buildx create --use --name mybuilder docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . - - -apt-get install gcc-mingw-w64-i686 -env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go -tar -czvf npc_sdk.tar.gz -xvf npc_sdk.dll npc_sdk.h \ No newline at end of file From cb1cc67e6bcb59f70d4d551992b9be92092af595 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Dec 2019 18:36:29 +0800 Subject: [PATCH 057/171] add log for sdk --- cmd/npc/sdk.go | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index 07693ee..cf41af9 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -2,45 +2,50 @@ package main import "C" import ( + "github.com/astaxie/beego/logs" "github.com/cnlh/nps/client" "time" ) -var status bool -var closeBefore bool +func init() { + logs.SetLogger(logs.AdapterFile, `{"filename":"npc.log","daily":false,"maxlines":100000,"color":true}`) +} + +var status int +var closeBefore int var cl *client.TRPClient //export StartClientByVerifyKey -func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl *C.char) bool { +func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl *C.char) int { if cl != nil { - closeBefore = true + closeBefore = 1 cl.Close() } cl = client.NewRPClient(C.GoString(serverAddr), C.GoString(verifyKey), C.GoString(connType), C.GoString(proxyUrl), nil) - closeBefore = false + closeBefore = 0 go func() { for { - status = true + status = 1 cl.Start() - status = false - if closeBefore { + status = 0 + if closeBefore == 1 { return } time.Sleep(time.Second * 5) } }() - return true + return 1 } //export GetClientStatus -func GetClientStatus() bool { +func GetClientStatus() int { return status } //export CloseClient func CloseClient() { + closeBefore = 1 cl.Close() - closeBefore = true } func main() { From d66f8724e9209f4f58252f39689d004afb320f6a Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 4 Dec 2019 18:40:29 +0800 Subject: [PATCH 058/171] update build.sh --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index c5b5f4e..beb8060 100644 --- a/build.sh +++ b/build.sh @@ -1,8 +1,8 @@ #/bash/sh sudo apt-get install gcc-mingw-w64-i686 -env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go -tar -czvf npc_sdk.tar.gz -xvf npc_sdk.dll npc_sdk.h +env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go +tar -czvf npc_sdk.tar.gz npc_sdk.dll npc_sdk.h wget https://github.com/upx/upx/releases/download/v3.95/upx-3.95-amd64_linux.tar.xz tar -xvf upx-3.95-amd64_linux.tar.xz From f365973bb9fbdbc8d3b41cde2e2cc6607bedf527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 21:07:19 +0800 Subject: [PATCH 059/171] update build.sh --- build.bash | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 build.bash diff --git a/build.bash b/build.bash new file mode 100755 index 0000000..b7296ca --- /dev/null +++ b/build.bash @@ -0,0 +1,136 @@ +#!/bin/bash +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf + +CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_386_client.tar.gz npc conf/npc.conf + +CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf + +CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf + +CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf + +CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_arm_client.tar.gz npc conf/npc.conf + + +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf + + +CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf + + +CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf + + +CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf + + +CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf linux_mips_client.tar.gz npc conf/npc.conf + + +CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf + + +CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf + + +CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go +upx npc +tar -czvf macos_client.tar.gz npc conf/npc.conf + + + +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + +CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + +CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_arm64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf freebsd_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf freebsd_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf freebsd_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + +CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_mips_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_mips64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_mips64le_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + + +CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps +tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps + + +CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps.exe +tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe + + +CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go +upx nps.exe +tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe + From e33b0be3b8a0a9f419d6c9ca7b4599f0af4540c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Wed, 4 Dec 2019 21:35:43 +0800 Subject: [PATCH 060/171] update build.sh --- .travis.yml | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a0f6582..f076c5c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,7 +50,7 @@ deploy: - win_386_server.tar.gz - win_amd64_client.tar.gz - win_amd64_server.tar.gz - - npc_$VERSION.spk + - npc_syno.spk - npc_sdk.tar.gz on: tags: true diff --git a/build.sh b/build.sh index beb8060..1df36fb 100644 --- a/build.sh +++ b/build.sh @@ -167,7 +167,7 @@ git clone https://github.com/cnlh/spksrc.git ~/spksrc mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash docker exec -it spksrc /bin/bash -c 'cd /spksrc && make setup && cd /spksrc/spk/npc && make' -cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_$VERSION.spk +cp ~/spksrc/packages/npc_noarch-all_$VERSION-1.spk ./npc_syno.spk echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin From c7e7d2bac65d5d3f8eb4a4462fef0f49742ce687 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Thu, 5 Dec 2019 22:43:22 +0800 Subject: [PATCH 061/171] Update README.md ci status image --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b11bbd1..9d67939 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ # nps ![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) [![Gitter](https://badges.gitter.im/cnlh-nps/community.svg)](https://gitter.im/cnlh-nps/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 From 2dc902fba10a518919ffb2e48de0c844f5f1a0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 6 Dec 2019 16:20:00 +0800 Subject: [PATCH 062/171] fix: p2p and secret add bug --- server/tool/utils.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/tool/utils.go b/server/tool/utils.go index 6a58bab..fb8fa55 100644 --- a/server/tool/utils.go +++ b/server/tool/utils.go @@ -31,6 +31,9 @@ func InitAllowPort() { } func TestServerPort(p int, m string) (b bool) { + if m == "p2p" || m == "secret" { + return true + } if p > 65535 || p < 0 { return false } From 4b3834e46db94971ceb1df8f693a9bd04a0f0935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 6 Dec 2019 23:32:44 +0800 Subject: [PATCH 063/171] fix multi account file --- lib/config/config.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/config/config.go b/lib/config/config.go index 89a6bfd..96531e2 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -241,13 +241,15 @@ func dealTunnel(s string) *file.Tunnel { t.StripPre = item[1] case "multi_account": t.MultiAccount = &file.MultiAccount{} - if b, err := common.ReadAllFromFile(item[1]); err != nil { - panic(err) - } else { - if content, err := common.ParseStr(string(b)); err != nil { + if common.FileExists(item[1]){ + if b, err := common.ReadAllFromFile(item[1]); err != nil { panic(err) } else { - t.MultiAccount.AccountMap = dealMultiUser(content) + if content, err := common.ParseStr(string(b)); err != nil { + panic(err) + } else { + t.MultiAccount.AccountMap = dealMultiUser(content) + } } } } From 883dd07d86a8eaf755a111bcae7d674166de5a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 6 Dec 2019 23:42:37 +0800 Subject: [PATCH 064/171] fix the number of client bug --- server/server.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/server.go b/server/server.go index 5335a40..868a94d 100644 --- a/server/server.go +++ b/server/server.go @@ -342,7 +342,10 @@ func GetDashboardData() map[string]interface{} { data := make(map[string]interface{}) data["version"] = version.VERSION data["hostCount"] = common.GeSynctMapLen(file.GetDb().JsonDb.Hosts) - data["clientCount"] = common.GeSynctMapLen(file.GetDb().JsonDb.Clients) - 1 //Remove the public key client + data["clientCount"] = common.GeSynctMapLen(file.GetDb().JsonDb.Clients) + if beego.AppConfig.String("public_vkey") != "" { //remove public vkey + data["clientCount"] = data["clientCount"].(int) - 1 + } dealClientData() c := 0 var in, out int64 From 614d81f374d5bab187ec09055bd52a56fc1e51e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 6 Dec 2019 23:54:55 +0800 Subject: [PATCH 065/171] delete user session when admin login --- web/controllers/login.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/controllers/login.go b/web/controllers/login.go index a460b75..10da8d7 100755 --- a/web/controllers/login.go +++ b/web/controllers/login.go @@ -22,6 +22,8 @@ func (self *LoginController) Verify() { var auth bool if self.GetString("password") == beego.AppConfig.String("web_password") && self.GetString("username") == beego.AppConfig.String("web_username") { self.SetSession("isAdmin", true) + self.DelSession("clientId") + self.DelSession("username") auth = true server.Bridge.Register.Store(common.GetIpByAddr(self.Ctx.Input.IP()), time.Now().Add(time.Hour*time.Duration(2))) } From 9268e6752909c039ee72765b002e3b4d6664d3c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 7 Dec 2019 20:44:32 +0800 Subject: [PATCH 066/171] fix port mux bug --- lib/mux/pconn.go | 24 ++++++++++++++++-------- lib/mux/pmux.go | 4 +++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/mux/pconn.go b/lib/mux/pconn.go index b351e7c..35af3cc 100644 --- a/lib/mux/pconn.go +++ b/lib/mux/pconn.go @@ -6,15 +6,17 @@ import ( ) type PortConn struct { - Conn net.Conn - rs []byte - start int + Conn net.Conn + rs []byte + readMore bool + start int } -func newPortConn(conn net.Conn, rs []byte) *PortConn { +func newPortConn(conn net.Conn, rs []byte, readMore bool) *PortConn { return &PortConn{ - Conn: conn, - rs: rs, + Conn: conn, + rs: rs, + readMore: readMore, } } @@ -29,9 +31,15 @@ func (pConn *PortConn) Read(b []byte) (n int, err error) { defer func() { pConn.start = len(pConn.rs) }() - return copy(b, pConn.rs[pConn.start:]), nil + n = copy(b, pConn.rs[pConn.start:]) + if !pConn.readMore { + return + } } - return pConn.Conn.Read(b) + var n2 = 0 + n2, err = pConn.Conn.Read(b[n:]) + n = n + n2 + return } func (pConn *PortConn) Write(b []byte) (n int, err error) { diff --git a/lib/mux/pmux.go b/lib/mux/pmux.go index e593bb0..f4e9d4a 100644 --- a/lib/mux/pmux.go +++ b/lib/mux/pmux.go @@ -89,6 +89,7 @@ func (pMux *PortMux) process(conn net.Conn) { var ch chan *PortConn var rs []byte var buffer bytes.Buffer + var readMore = false switch common.BytesToNum(buf) { case HTTP_CONNECT, HTTP_DELETE, HTTP_GET, HTTP_HEAD, HTTP_OPTIONS, HTTP_POST, HTTP_PUT, HTTP_TRACE: //http and manager buffer.Reset() @@ -123,6 +124,7 @@ func (pMux *PortMux) process(conn net.Conn) { case CLIENT: // client connection ch = pMux.clientConn default: // https + readMore = true ch = pMux.httpsConn } if len(rs) == 0 { @@ -131,7 +133,7 @@ func (pMux *PortMux) process(conn net.Conn) { timer := time.NewTimer(ACCEPT_TIME_OUT) select { case <-timer.C: - case ch <- newPortConn(conn, rs): + case ch <- newPortConn(conn, rs, readMore): } } From 528386cfd6d3d3dcc1636cbde66b2b6c9ba76a6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 7 Dec 2019 20:47:58 +0800 Subject: [PATCH 067/171] add multi_account file into build.sh --- build.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/build.sh b/build.sh index 1df36fb..768e448 100644 --- a/build.sh +++ b/build.sh @@ -10,75 +10,75 @@ cp upx-3.95-amd64_linux/upx ./ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf +tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_386_client.tar.gz npc conf/npc.conf +tar -czvf linux_386_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf +tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf +tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf +tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_arm_v7_client.tar.gz npc conf/npc.conf +tar -czvf linux_arm_v7_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_arm_v6_client.tar.gz npc conf/npc.conf +tar -czvf linux_arm_v6_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_arm_v5_client.tar.gz npc conf/npc.conf +tar -czvf linux_arm_v5_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf +tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf +tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf +tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf +tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf linux_mips_client.tar.gz npc conf/npc.conf +tar -czvf linux_mips_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf +tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf +tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf macos_client.tar.gz npc conf/npc.conf +tar -czvf macos_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go From f85c5cd9ad9f7d9711fb57d0f4d9824e2081822d Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sat, 7 Dec 2019 21:05:35 +0800 Subject: [PATCH 068/171] add systemd directory determining, fix #295 --- lib/install/install.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/install/install.go b/lib/install/install.go index 24af9b9..7b03581 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -62,11 +62,22 @@ WantedBy=multi-user.target` log.Println("Executable files have been copied to", "/usr/bin/nps") } systemd := unit + "\n\n" + service + "\n\n" + install - _ = os.Remove("/usr/lib/systemd/system/nps.service") - err := ioutil.WriteFile("/usr/lib/systemd/system/nps.service", []byte(systemd), 0644) - if err != nil { - log.Println("Write systemd service err ", err) + if _, err := os.Stat("/usr/lib/systemd/system"); os.IsExist(err) { + _ = os.Remove("/usr/lib/systemd/system/nps.service") + err := ioutil.WriteFile("/usr/lib/systemd/system/nps.service", []byte(systemd), 0644) + if err != nil { + log.Println("Write systemd service err ", err) + } + } else if _, err := os.Stat("/lib/systemd/system"); os.IsExist(err) { + _ = os.Remove("/lib/systemd/system/nps.service") + err := ioutil.WriteFile("/lib/systemd/system/nps.service", []byte(systemd), 0644) + if err != nil { + log.Println("Write systemd service err ", err) + } + } else { + log.Println("Write systemd service fail, not found the systemd system path ") } + _ = os.Mkdir("/var/log/nps", 644) } log.Println("install ok!") From 4ad17ba8692d1c4905966e9adb5f36d3a42f4974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 7 Dec 2019 22:25:03 +0800 Subject: [PATCH 069/171] fix npc http proxy verify bug --- client/control.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/control.go b/client/control.go index faf0fcb..e4a67a8 100644 --- a/client/control.go +++ b/client/control.go @@ -198,7 +198,7 @@ func NewConn(tp string, vkey string, server string, connType string, proxyUrl st return nil, er } connection, err = n.Dial("tcp", server) - case "http": + default: connection, err = NewHttpProxyConn(u, server) } } else { @@ -262,7 +262,7 @@ func NewHttpProxyConn(url *url.URL, remoteAddr string) (net.Conn, error) { Proto: "HTTP/1.1", } password, _ := url.User.Password() - req.Header.Set("Proxy-Authorization", "Basic "+basicAuth(url.User.Username(), password)) + req.Header.Set("Authorization", "Basic "+basicAuth(strings.Trim(url.User.Username(), " "), password)) b, err := httputil.DumpRequest(req, false) if err != nil { return nil, err From 3989463bebedc30fe73207915ae5ddefb18517c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 7 Dec 2019 23:26:49 +0800 Subject: [PATCH 070/171] change readme --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9d67939..b08104e 100644 --- a/README.md +++ b/README.md @@ -247,23 +247,22 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 **适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](#nat类型检测) **假设场景:** -内网1机器ip为10.1.50.2 内网2机器2 ip为10.2.50.2 -想通过访问内网1机器1的2000端口---->访问到内网2机器3 10.2.50.3的22端口 +想通过访问使用端机器(访问端,也就是本机)的2000端口---->访问到内网机器 10.2.50.2的22端口 **使用步骤** - 在`nps.conf`中设置`p2p_ip`(nps服务器ip)和`p2p_port`(nps服务器udp端口) - 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh -- 在机器1执行命令 +- 在使用端机器(本机)执行命令 ``` -./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.3:22 +./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.2:22 ``` 如需指定本地端口可加参数`-local_port=xx`,默认为2000 **注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 -假设机器3用户名为root,现在在机器1上执行`ssh -p 2000 root@127.0.0.1`即可访问机器2的ssh +假设内网机器为10.2.50.2的ssh用户名为root,现在在本机上执行`ssh -p 2000 root@127.0.0.1`即可访问机器2的ssh,如果是网站在浏览器访问127.0.0.1:2000端口即可。 @@ -1040,7 +1039,9 @@ POST /auth/getauthkey ## 捐助 如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 - +## 致谢 +Thanks [jetbrains](https://www.jetbrains.com/?from=nps) for providing development tools for nps +![https://www.jetbrains.com/?from=nps](https://ftp.bmp.ovh/imgs/2019/12/6435398b0c7402b1.png) ### 支付宝 ![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) ### 微信 From dfeaf523ee53c6f73a8d971adc135af10ead1a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 7 Dec 2019 23:31:52 +0800 Subject: [PATCH 071/171] change version --- build.sh | 2 +- lib/version/version.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 768e448..df967c4 100644 --- a/build.sh +++ b/build.sh @@ -1,4 +1,5 @@ #/bash/sh +export VERSION=0.25.1 sudo apt-get install gcc-mingw-w64-i686 env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go @@ -157,7 +158,6 @@ CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -stat tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe -export VERSION=0.25.0 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update diff --git a/lib/version/version.go b/lib/version/version.go index c46c010..b3ffbb1 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,6 +1,6 @@ package version -const VERSION = "0.25.0" +const VERSION = "0.25.1" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { From 9993ce8131ec75f89e5694618e9ca2b1d1b37fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 00:29:00 +0800 Subject: [PATCH 072/171] add logs and version for sdk --- README.md | 7 ++++++- cmd/npc/sdk.go | 18 ++++++++++++----- lib/common/logs.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 lib/common/logs.go diff --git a/README.md b/README.md index b08104e..5fb13c6 100644 --- a/README.md +++ b/README.md @@ -1041,7 +1041,12 @@ POST /auth/getauthkey 如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 ## 致谢 Thanks [jetbrains](https://www.jetbrains.com/?from=nps) for providing development tools for nps -![https://www.jetbrains.com/?from=nps](https://ftp.bmp.ovh/imgs/2019/12/6435398b0c7402b1.png) + + + + + + ### 支付宝 ![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) ### 微信 diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index cf41af9..f26a3de 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -1,16 +1,14 @@ package main -import "C" import ( + "C" "github.com/astaxie/beego/logs" "github.com/cnlh/nps/client" + "github.com/cnlh/nps/lib/common" + "github.com/cnlh/nps/lib/version" "time" ) -func init() { - logs.SetLogger(logs.AdapterFile, `{"filename":"npc.log","daily":false,"maxlines":100000,"color":true}`) -} - var status int var closeBefore int var cl *client.TRPClient @@ -48,6 +46,16 @@ func CloseClient() { cl.Close() } +//export Version +func Version() *C.char { + return C.CString(version.VERSION) +} + +func Logs() *C.char { + return C.CString(common.GetLogMsg()) +} + func main() { // Need a main function to make CGO compile package as C shared library + logs.SetLogger("store") } diff --git a/lib/common/logs.go b/lib/common/logs.go new file mode 100644 index 0000000..477ac5b --- /dev/null +++ b/lib/common/logs.go @@ -0,0 +1,48 @@ +package common + +import ( + "github.com/astaxie/beego/logs" + "time" +) + +const MaxMsgLen = 5000 + +var logMsgs string + +func init() { + logs.Register("store", func() logs.Logger { + return new(StoreMsg) + }) +} + +func GetLogMsg() string { + return logMsgs +} + +type StoreMsg struct { +} + +func (lg *StoreMsg) Init(config string) error { + return nil +} + +func (lg *StoreMsg) WriteMsg(when time.Time, msg string, level int) error { + m := when.Format("2006-01-02 15:04:05") + " " + msg + "\r\n" + if len(logMsgs) > MaxMsgLen { + start := MaxMsgLen - len(m) + if start <= 0 { + start = MaxMsgLen + } + logMsgs = logMsgs[start:] + } + logMsgs += m + return nil +} + +func (lg *StoreMsg) Destroy() { + return +} + +func (lg *StoreMsg) Flush() { + return +} From f938b2fdd1383eb3060280c7ed73f07800c5038b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 15:46:33 +0800 Subject: [PATCH 073/171] change npc sdk --- cmd/npc/sdk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index f26a3de..0edb2f5 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -15,6 +15,7 @@ var cl *client.TRPClient //export StartClientByVerifyKey func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl *C.char) int { + logs.SetLogger("store") if cl != nil { closeBefore = 1 cl.Close() @@ -50,12 +51,11 @@ func CloseClient() { func Version() *C.char { return C.CString(version.VERSION) } - +//export Logs func Logs() *C.char { return C.CString(common.GetLogMsg()) } func main() { // Need a main function to make CGO compile package as C shared library - logs.SetLogger("store") } From a602b11270eb0c38307ed3d143bab3e1d7ddad0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 15:52:38 +0800 Subject: [PATCH 074/171] change exit to error when the vkey is not right --- client/client.go | 2 +- client/control.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/client/client.go b/client/client.go index ac300ff..3a9d365 100755 --- a/client/client.go +++ b/client/client.go @@ -47,7 +47,7 @@ func (s *TRPClient) Start() { retry: c, err := NewConn(s.bridgeConnType, s.vKey, s.svrAddr, common.WORK_MAIN, s.proxyUrl) if err != nil { - logs.Error("The connection server failed and will be reconnected in five seconds") + logs.Error("The connection server failed and will be reconnected in five seconds, error", err.Error()) time.Sleep(time.Second * 5) goto retry } diff --git a/client/control.go b/client/control.go index e4a67a8..d8b98f3 100644 --- a/client/control.go +++ b/client/control.go @@ -241,8 +241,7 @@ func NewConn(tp string, vkey string, server string, connType string, proxyUrl st if s, err := c.ReadFlag(); err != nil { return nil, err } else if s == common.VERIFY_EER { - logs.Error("Validation key %s incorrect", vkey) - os.Exit(0) + return nil, errors.New(fmt.Sprintf("Validation key %s incorrect", vkey)) } if _, err := c.Write([]byte(connType)); err != nil { return nil, err From daaf1f28e155c4ab365c445ad747526e4e922d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 21:04:27 +0800 Subject: [PATCH 075/171] update sdk --- client/client.go | 9 +++++++++ cmd/npc/sdk.go | 20 ++++---------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/client/client.go b/client/client.go index 3a9d365..924662f 100755 --- a/client/client.go +++ b/client/client.go @@ -42,9 +42,16 @@ func NewRPClient(svraddr string, vKey string, bridgeConnType string, proxyUrl st } } +var NowStatus int +var CloseClient bool //start func (s *TRPClient) Start() { retry: + NowStatus = 0 + if CloseClient { + CloseClient = false + return + } c, err := NewConn(s.bridgeConnType, s.vKey, s.svrAddr, common.WORK_MAIN, s.proxyUrl) if err != nil { logs.Error("The connection server failed and will be reconnected in five seconds, error", err.Error()) @@ -66,6 +73,7 @@ retry: if s.cnf != nil && len(s.cnf.Healths) > 0 { go heathCheck(s.cnf.Healths, s.signal) } + NowStatus = 1 //msg connection, eg udp s.handleMain() } @@ -279,6 +287,7 @@ loop: } func (s *TRPClient) Close() { + CloseClient = true if s.tunnel != nil { s.tunnel.Close() } diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index 0edb2f5..0fc2b5b 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -6,44 +6,31 @@ import ( "github.com/cnlh/nps/client" "github.com/cnlh/nps/lib/common" "github.com/cnlh/nps/lib/version" - "time" ) -var status int -var closeBefore int var cl *client.TRPClient //export StartClientByVerifyKey func StartClientByVerifyKey(serverAddr, verifyKey, connType, proxyUrl *C.char) int { logs.SetLogger("store") if cl != nil { - closeBefore = 1 cl.Close() } cl = client.NewRPClient(C.GoString(serverAddr), C.GoString(verifyKey), C.GoString(connType), C.GoString(proxyUrl), nil) - closeBefore = 0 go func() { - for { - status = 1 - cl.Start() - status = 0 - if closeBefore == 1 { - return - } - time.Sleep(time.Second * 5) - } + cl.Start() + return }() return 1 } //export GetClientStatus func GetClientStatus() int { - return status + return client.NowStatus } //export CloseClient func CloseClient() { - closeBefore = 1 cl.Close() } @@ -51,6 +38,7 @@ func CloseClient() { func Version() *C.char { return C.CString(version.VERSION) } + //export Logs func Logs() *C.char { return C.CString(common.GetLogMsg()) From a3435c4c42de8bffb15f1d2db913efcb37050e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 21:10:40 +0800 Subject: [PATCH 076/171] update sdk --- client/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/client.go b/client/client.go index 924662f..326ad64 100755 --- a/client/client.go +++ b/client/client.go @@ -46,12 +46,12 @@ var NowStatus int var CloseClient bool //start func (s *TRPClient) Start() { + CloseClient = false retry: - NowStatus = 0 if CloseClient { - CloseClient = false return } + NowStatus = 0 c, err := NewConn(s.bridgeConnType, s.vKey, s.svrAddr, common.WORK_MAIN, s.proxyUrl) if err != nil { logs.Error("The connection server failed and will be reconnected in five seconds, error", err.Error()) From 5b1774c7b7b7e18ad83929a4347d57d2eeb899c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 21:15:27 +0800 Subject: [PATCH 077/171] fix client status when close client --- client/client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/client.go b/client/client.go index 326ad64..7a6f1da 100755 --- a/client/client.go +++ b/client/client.go @@ -288,6 +288,7 @@ loop: func (s *TRPClient) Close() { CloseClient = true + NowStatus = 0 if s.tunnel != nil { s.tunnel.Close() } From ac38d342faf95b09a1fa450f713f55ad62e157d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 23:30:33 +0800 Subject: [PATCH 078/171] add lang file --- web/static/page/lang-example.xml | 189 +++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 web/static/page/lang-example.xml diff --git a/web/static/page/lang-example.xml b/web/static/page/lang-example.xml new file mode 100644 index 0000000..1858935 --- /dev/null +++ b/web/static/page/lang-example.xml @@ -0,0 +1,189 @@ + + + 仪表盘 + dashboard + + + 客户端 + client + + + 域名解析 + host + + + tcp隧道 + tcp + + + udp隧道 + udp + + + http代理 + http + + + socks5代理 + socks5 + + + 私密代理 + secret + + + p2p代理 + p2p + + + 文件代理 + file + + + 备注 + remark + + + 流量限制 + flow limit + + + 带宽限制 + bandwidth + + + 最大连接数限制 + maximum number of client connections + + + + basic权限验证用户名 + web authentication username + + + basic权限验证密码 + web authentication password + + + 客户端连接密钥 + client connection key + + + 压缩 + compress + + + 加密 + crypt + + + + + 域名 + host + + + 协议类型 + scheme + + + url路由 + url router + + + 客户端id + client id + + + 内网目标(ip:端口) + target of Intranet(ip:port) + + + request header修改 + header modify + + + request host修改 + host modify + + + + + 隧道类型 + mode + + + 服务端端口 + server port + + + 服务端端口 + server ip + + + 加密 + crypt + + + 本地路径 + local path + + + 访问前缀 + strip pre + + + 唯一识别密钥 + unique vkey + + + + + 新增 + add + + + + 当前连接数 + now conn num + + + export flow + + + inlet flow + + + command + + + allow client connect by config file + + + username of web login + + + password of web login + + + https cert file path + + + https key file path + + + + max tunnel num + + + + Is the proxy local to the server? + + + + + save + + + + From 999fac8ad7245f86bcbe8b3241bb365336947b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sun, 8 Dec 2019 23:31:53 +0800 Subject: [PATCH 079/171] fix panic when close with not start in sdk --- cmd/npc/sdk.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index 0fc2b5b..b8cc38f 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -31,7 +31,9 @@ func GetClientStatus() int { //export CloseClient func CloseClient() { - cl.Close() + if cl != nil { + cl.Close() + } } //export Version From 6703a9841931af892cdebaa66c65d2e528786a7f Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 11 Dec 2019 23:32:32 +0800 Subject: [PATCH 080/171] fix mux conn read after Stop() method invoked will panic --- lib/mux/conn.go | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 8f6e31f..92d9b2c 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -293,6 +293,7 @@ copyData: // reset to 60s if timeout and data still available Self.off = 0 if err != nil { + Self.CloseWindow() // also close the window, to avoid read twice return // queue receive stop or time out, break the loop and return } //logs.Warn("pop element", Self.element.l, Self.element.part) From 8a28d243dfc7f9d609f7f25b2dd476e19878c7fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Thu, 12 Dec 2019 09:27:06 +0800 Subject: [PATCH 081/171] init docs --- README.md | 103 +----- docs/.nojekyll | 0 docs/README.md | 955 ++++++++++++++++++++++++++++++++++++++++++++++++ docs/index.html | 21 ++ 4 files changed, 977 insertions(+), 102 deletions(-) create mode 100644 docs/.nojekyll create mode 100644 docs/README.md create mode 100644 docs/index.html diff --git a/README.md b/README.md index 5fb13c6..4e96f7e 100644 --- a/README.md +++ b/README.md @@ -21,107 +21,6 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 - -## 目录 - -* [安装](#安装) - * [编译安装](#源码安装) - * [release安装](#release安装) - * [docker安装](#docker安装) -* [使用示例(以web主控模式为主)](#使用示例) - * [统一准备工作](#统一准备工作(必做)) - * [http|https域名解析](#域名解析) - * [内网ssh连接即tcp隧道](#tcp隧道) - * [内网dns解析即udp隧道](#udp隧道) - * [内网socks5代理](#socks5代理) - * [内网http正向代理](#http正向代理) - * [内网安全私密代理](#私密代理) - * [p2p穿透](#p2p服务) - * [简单的内网文件访问服务](#文件访问模式) -* [服务端](#web管理) - * [服务端启动](#服务端启动) - * [服务端测试](#服务端测试) - * [服务端启动](#服务端启动) - * [web管理](#web管理) - * [服务端配置文件重载](#服务端配置文件重载) - * [服务端停止或重启](#服务端停止或重启) - * [配置文件说明](#服务端配置文件) - * [使用https](#使用https) - * [与nginx配合](#与nginx配合) - * [web使用Caddy代理](#web使用Caddy代理) - * [关闭http|https代理](#关闭代理) - * [将nps安装到系统](#将nps安装到系统) - * [流量数据持久化](#流量数据持久化) - * [系统信息显示](#系统信息显示) - * [自定义客户端连接密钥](#自定义客户端连接密钥) - * [关闭公钥访问](#关闭公钥访问) - * [关闭web管理](#关闭web管理) - * [服务端多用户登陆](#服务端多用户登陆) - * [用户注册功能](#用户注册功能) - * [监听指定ip](#监听指定ip) - * [代理到服务端本地](#代理到服务端本地) -* [客户端](#客户端) - * [客户端启动](#客户端启动) - * [无配置文件模式](#无配置文件模式) - * [配置文件模式](#配置文件模式) - * [配置文件说明](#配置文件说明) - * [全局配置](#全局配置) - * [域名代理](#域名代理) - * [tcp隧道](#tcp隧道模式) - * [udp隧道](#udp隧道模式) - * [http正向代理](#http代理模式) - * [socks5代理](#socks5代理模式) - * [私密代理](#私密代理模式) - * [p2p服务](#p2p代理) - * [文件访问代理](#文件访问模式) - * [断线重连](#断线重连) - * [nat类型检测](#nat类型检测) - * [状态检查](#状态检查) - * [重载配置文件](#重载配置文件) - * [通过代理连接nps](#通过代理连接nps) - * [群晖支持](#群晖支持) - -* [相关功能](#相关功能) - * [缓存支持](#缓存支持) - * [数据压缩支持](#数据压缩支持) - * [站点密码保护](#站点保护) - * [加密传输](#加密传输) - * [host修改](#host修改) - * [自定义header](#自定义header) - * [自定义404页面](#404页面配置) - * [流量限制](#流量限制) - * [带宽限制](#带宽限制) - * [负载均衡](#负载均衡) - * [端口白名单](#端口白名单) - * [端口范围映射](#端口范围映射) - * [端口范围映射到其他机器](#端口范围映射到其他机器) - * [守护进程](#守护进程) - * [KCP协议支持](#KCP协议支持) - * [域名泛解析](#域名泛解析) - * [URL路由](#URL路由) - * [限制ip访问](#限制ip访问) - * [客户端最大连接数限制](#客户端最大连接数) - * [客户端最大隧道数限制](#客户端最大隧道数限制) - * [端口复用](#端口复用) - * [多路复用](#多路复用) - * [环境变量渲染](#环境变量渲染) - * [健康检查](#健康检查) - * [日志输出](#日志输出) -* [相关说明](#相关说明) - * [流量统计](#流量统计) - * [当前客户端带宽](#当前客户端带宽) - * [热更新支持](#热更新支持) - * [获取用户真实ip](#获取用户真实ip) - * [客户端地址显示](#客户端地址显示) - * [客户端与服务端版本对比](#客户端与服务端版本对比) - * [Linux系统限制](#Linux系统限制) -* [webAPI](#webAPI) -* [贡献](#贡献) -* [支持nps发展](#捐赠) -* [交流群](#交流群) - - - ## 安装 ### release安装 @@ -1031,7 +930,7 @@ POST /auth/getauthkey [webAPI文档](https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3) ## 贡献 -#### **欢迎参与到制作docker、图标、文档翻译等工作** +**欢迎参与到制作docker、图标、文档翻译等工作** - 如果遇到bug可以直接提交至dev分支 - 使用遇到问题可以通过issues反馈 - 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..4e96f7e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,955 @@ + +# nps +![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) +[![Gitter](https://badges.gitter.im/cnlh-nps/community.svg)](https://gitter.im/cnlh-nps/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) + +nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 + + +## 背景 +![image](https://github.com/cnlh/nps/blob/master/image/web.png?raw=true) + +1. 做微信公众号开发、小程序开发等----> 域名代理模式 + + +2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式 + +3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式 + +4. 在外网使用HTTP代理访问内网站点----> http代理模式 + +5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 + +## 安装 + +### release安装 +> [releases](https://github.com/cnlh/nps/releases) + +下载对应的系统版本即可,服务端和客户端是单独的 + +### 源码安装 +- 安装源码 +> go get -u github.com/cnlh/nps... +- 编译 +> go build cmd/nps/nps.go + +> go build cmd/npc/npc.go + +### docker安装 +> [server](https://hub.docker.com/r/ffdfgdfg/nps) +> [client](https://hub.docker.com/r/ffdfgdfg/npc) + +## 使用示例 + +### 统一准备工作(必做) +- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中`bridge_port`为8284,配置文件中`web_port`为8080 +- 访问1.1.1.1:8080 +- 在客户端管理中创建一个客户端,记录下验证密钥 +- 内网客户端运行(windows使用cmd运行加.exe) + +```shell +./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 +``` +**注意:运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的`bridge_port`端口,telnet,netcat这类的来检查** + +### 域名解析 + +**适用范围:** 小程序开发、微信公众号开发、产品演示 + +**假设场景:** +- 有一个域名proxy.com,有一台公网机器ip为1.1.1.1 +- 两个内网开发站点127.0.0.1:81,127.0.0.1:82 +- 想通过(http|https://)a.proxy.com访问127.0.0.1:81,通过(http|https://)b.proxy.com访问127.0.0.1:82 + +**使用步骤** +- 将*.proxy.com解析到公网服务器1.1.1.1 +- 点击刚才创建的客户端的域名管理,添加两条规则规则:1、域名:`a.proxy.com`,内网目标:`127.0.0.1:81`,2、域名:`b.proxy.com`,内网目标:`127.0.0.1:82` + +现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 + +**https:** 如需使用https请进行相关配置,详见 [使用https](#使用https) + +### tcp隧道 + + +**适用范围:** ssh、远程桌面等tcp连接场景 + +**假设场景:** + 想通过访问公网服务器1.1.1.1的8001端口,连接内网机器10.1.50.101的22端口,实现ssh连接 + +**使用步骤** +- 在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),保存。 +- 访问公网服务器ip(1.1.1.1),填写的监听端口(8001),相当于访问内网ip(10.1.50.101):目标端口(22),例如:`ssh -p 8001 root@1.1.1.1` + +### udp隧道 + +**适用范围:** 内网dns解析等udp连接场景 + +**假设场景:** +内网有一台dns(10.1.50.102:53),在非内网环境下想使用该dns,公网服务器为1.1.1.1 + +**使用步骤** +- 在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。 +- 修改需要使用的dns地址为1.1.1.1,则相当于使用10.1.50.102作为dns服务器 + +### socks5代理 + + +**适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 + +**假设场景:** +想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果 + +**使用步骤** +- 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。 +- 在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理),ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了 + +**注意** +经过socks5代理,当收到socks5数据包时socket已经是accept状态。表现是扫描端口全open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。 + +### http正向代理 + +**适用范围:** 在外网环境下使用http正向代理访问内网站点 + +**假设场景:** +想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站 + +**使用步骤** + +- 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。 +- 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了 + +### 私密代理 + +**适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。 + +**假设场景:** +无需新增多的端口实现访问内网服务器10.1.50.2的22端口 + +**使用步骤** +- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥secrettest和内网目标10.1.50.2:22 +- 在需要连接ssh的机器上以执行命令 + +``` +./npc -server=1.1.1.1:8284 -vkey=vkey -type=tcp -password=secrettest -local_type=secret +``` +如需指定本地端口可加参数`-local_port=xx`,默认为2000 + +**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 + +假设10.1.50.2用户名为root,现在执行`ssh -p 2000 root@1.1.1.1`即可访问ssh + + +### p2p服务 + +**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](#nat类型检测) + +**假设场景:** + +想通过访问使用端机器(访问端,也就是本机)的2000端口---->访问到内网机器 10.2.50.2的22端口 + +**使用步骤** +- 在`nps.conf`中设置`p2p_ip`(nps服务器ip)和`p2p_port`(nps服务器udp端口) +- 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh +- 在使用端机器(本机)执行命令 + +``` +./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.2:22 +``` +如需指定本地端口可加参数`-local_port=xx`,默认为2000 + +**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 + +假设内网机器为10.2.50.2的ssh用户名为root,现在在本机上执行`ssh -p 2000 root@127.0.0.1`即可访问机器2的ssh,如果是网站在浏览器访问127.0.0.1:2000端口即可。 + + + +## web管理 + +![image](https://github.com/cnlh/nps/blob/master/image/web2.png?raw=true) +### 介绍 + +可在网页上配置和管理各个tcp、udp隧道、内网站点代理,http、https解析等,功能强大,操作方便。 + + +**提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** + +### 启动 + + +#### 服务端测试 +```shell + ./nps test +``` +如有错误请及时修改配置文件,无错误可继续进行下去 +#### 服务端启动 +```shell + ./nps start +``` +**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** + +#### web管理 + +进入web界面,公网ip:web界面端口(默认8080),密码默认为123 + +进入web管理界面,有详细的说明 + +#### 服务端配置文件重载 +如果是daemon启动 +```shell + ./nps reload +``` +**说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 + + +#### 服务端停止或重启 +如果是daemon启动 +```shell + ./nps stop|restart +``` + +### 服务端配置文件 +- /conf/nps.conf + +名称 | 含义 +---|--- +web_port | web管理端口 +web_password | web界面管理密码 +web_username | web界面管理账号 +web_base_url | web管理主路径,用于将web管理置于代理子路径后面 +bridge_port | 服务端客户端通信端口 +https_proxy_port | 域名代理https代理监听端口 +http_proxy_port | 域名代理http代理监听端口 +auth_key|web api密钥 +bridge_type|客户端与服务端连接方式kcp或tcp +public_vkey|客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 +ip_limit|是否限制ip访问,true或false或忽略 +flow_store_interval|服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 +log_level|日志输出级别 +auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 +p2p_ip| 服务端Ip,使用p2p模式必填 +p2p_port|p2p模式开启的udp端口 + +### 使用https + +**方式一:** 类似于nginx实现https的处理 + +在配置文件中将https_proxy_port设置为443或者其他你想配置的端口,和在web中对应域名编辑中设置对应的证书路径,将`https_just_proxy`设置为false,然后就和http代理一样了 + +**此外:** 可以在`nps.conf`中设置一个默认的https配置,当遇到未在web中设置https证书的域名解析时,将自动使用默认证书,另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息,nps也将自动使用默认证书 + + +**方式二:** 在内网对应服务器上设置https + +在`nps.conf`中将`https_just_proxy`设置为true,并且打开`https_proxy_port`端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理 + +### 与nginx配合 + +有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等,本代理可和nginx配合使用,在配置文件中将httpProxyPort设置为非80端口,并在nginx中配置代理,例如httpProxyPort为8024时 +``` +server { + listen 80; + server_name *.proxy.com; + location / { + proxy_set_header Host $http_host; + proxy_pass http://127.0.0.1:8024; + } +} +``` +如需使用https也可在nginx监听443端口并配置ssl,并将本代理的httpsProxyPort设置为空关闭https即可,例如httpProxyPort为8024时 + +``` +server { + listen 443; + server_name *.proxy.com; + ssl on; + ssl_certificate certificate.crt; + ssl_certificate_key private.key; + ssl_session_timeout 5m; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + location / { + proxy_set_header Host $http_host; + proxy_pass http://127.0.0.1:8024; + } +} +``` + +### web使用Caddy代理 + +如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. + +假设我们想通过 `http://caddy_ip:caddy_port/nps` 来访问后台, Caddyfile 这样配置: + +```Caddyfile +caddy_ip:caddy_port/nps { + #server_ip 为 nps 服务器IP + #web_port 为 nps 后台端口 + proxy / http://server_ip:web_port/nps { + transparent + } +} +``` + +nps.conf 修改 `web_base_url` 为 `/nps` 即可 +``` +web_base_url=/nps +``` + + +### 关闭代理 + +如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。 + +### 将nps安装到系统 +如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 + +``` +(./nps|nps.exe) install +``` +安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 + +``` +sudo systemctl enable|disable|start|stop|restart|status nps +``` +systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 +建议采用此方式启动,能够捕获panic信息,便于排查问题。 + +``` +nps test|start|stop|restart|status +``` +对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 + +``` +nps.exe test|start|stop|restart|status +``` + +### 流量数据持久化 +服务端支持将流量数据持久化,默认情况下是关闭的,如果有需求可以设置`nps.conf`中的`flow_store_interval`参数,单位为分钟 + +**注意:** nps不会持久化通过公钥连接的客户端 +### 系统信息显示 +nps服务端支持在web上显示和统计服务器的相关信息,但默认一些统计图表是关闭的,如需开启请在`nps.conf`中设置`system_info_display=true` + +### 自定义客户端连接密钥 +web上可以自定义客户端连接的密钥,但是必须具有唯一性 +### 关闭公钥访问 +可以将`nps.conf`中的`public_vkey`设置为空或者删除 + +### 关闭web管理 +可以将`nps.conf`中的`web_port`设置为空或者删除 + +### 服务端多用户登陆 +如果将`nps.conf`中的`allow_user_login`设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。 + +### 用户注册功能 +nps服务端支持用户注册功能,可将`nps.conf`中的`allow_user_register`设置为true,开启后登陆页将会有有注册功能, + +### 监听指定ip + +nps支持每个隧道监听不同的服务端端口,在`nps.conf`中设置`allow_multi_ip=true`后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0) +```ini +server_ip=xxx +``` +### 代理到服务端本地 +在使用nps监听80或者443端口时,默认是将所有的请求都会转发到内网上,但有时候我们的nps服务器的上一些服务也需要使用这两个端口,nps提供类似于`nginx` `proxy_pass` 的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。 + +**即:** 假设在nps的vps服务器上有一个服务使用5000端口,这时候nps占用了80端口和443,我们想能使用一个域名通过http(s)访问到5000的服务。 + +**使用方式:** 在`nps.conf`中设置`allow_local_proxy=true`,然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。 +## 客户端 + +### 客户端启动 +#### 无配置文件模式 +此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 +``` + ./npc -server=ip:port -vkey=web界面中显示的密钥 +``` +#### 配置文件模式 +此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 +``` + ./npc -config=npc配置文件路径 +``` +可自行添加systemd service,例如:`npc.service` +``` +[Unit] +Description=npc - convenient proxy server client +Documentation=https://github.com/cnlh/nps/ +After=network-online.target remote-fs.target nss-lookup.target +Wants=network-online.target + +[Service] +Type=simple +KillMode=process +Restart=always +RestartSec=15s +StandardOutput=append:/var/log/nps/npc.log +ExecStartPre=/bin/echo 'Starting npc' +ExecStopPost=/bin/echo 'Stopping npc' +ExecStart=/absolutely path to/npc -server=ip:port -vkey=web界面中显示的密钥 + +[Install] +WantedBy=multi-user.target +``` +#### 配置文件说明 +[示例配置文件](https://github.com/cnlh/nps/tree/master/conf/npc.conf) +##### 全局配置 +```ini +[common] +server_addr=1.1.1.1:8284 +conn_type=tcp +vkey=123 +username=111 +password=222 +compress=true +crypt=true +rate_limit=10000 +flow_limit=100 +remark=test +max_conn=10 +``` +项 | 含义 +---|--- +server_addr | 服务端ip:port +conn_type | 与服务端通信模式(tcp或kcp) +vkey|服务端配置文件中的密钥(非web) +username|socks5或http(s)密码保护用户名(可忽略) +password|socks5或http(s)密码保护密码(可忽略) +compress|是否压缩传输(true或false或忽略) +crypt|是否加密传输(true或false或忽略) +rate_limit|速度限制,可忽略 +flow_limit|流量限制,可忽略 +remark|客户端备注,可忽略 +max_conn|最大连接数,可忽略 +##### 域名代理 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[web1] +host=a.proxy.com +target_addr=127.0.0.1:8080,127.0.0.1:8082 +host_change=www.proxy.com +header_set_proxy=nps +``` +项 | 含义 +---|--- +web1 | 备注 +host | 域名(http|https都可解析) +target_addr|内网目标,负载均衡时多个目标,逗号隔开 +host_change|请求host修改 +header_xxx|请求header修改或添加,header_proxy表示添加header proxy:nps + +##### tcp隧道模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[tcp] +mode=tcp +target_addr=127.0.0.1:8080 +server_port=9001 +``` +项 | 含义 +---|--- +mode | tcp +server_port | 在服务端的代理端口 +tartget_addr|内网目标 + +##### udp隧道模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[udp] +mode=udp +target_addr=127.0.0.1:8080 +server_port=9002 +``` +项 | 含义 +---|--- +mode | udp +server_port | 在服务端的代理端口 +target_addr|内网目标 +##### http代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[http] +mode=httpProxy +server_port=9003 +``` +项 | 含义 +---|--- +mode | httpProxy +server_port | 在服务端的代理端口 +##### socks5代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[socks5] +mode=socks5 +server_port=9004 +multi_account=multi_account.conf +``` +项 | 含义 +---|--- +mode | socks5 +server_port | 在服务端的代理端口 +multi_account | socks5多账号配置文件(可选),配置后使用basic_username和basic_password无法通过认证 +##### 私密代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[secret_ssh] +mode=secret +password=ssh2 +target_addr=10.1.50.2:22 +``` +项 | 含义 +---|--- +mode | secret +password | 唯一密钥 +target_addr|内网目标 + +##### p2p代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[p2p_ssh] +mode=p2p +password=ssh2 +target_addr=10.1.50.2:22 +``` +项 | 含义 +---|--- +mode | p2p +password | 唯一密钥 +target_addr|内网目标 + + +##### 文件访问模式 +利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[file] +mode=file +server_port=9100 +local_path=/tmp/ +strip_pre=/web/ +```` + +项 | 含义 +---|--- +mode | file +server_port | 服务端开启的端口 +local_path|本地文件目录 +strip_pre|前缀 + +对于`strip_pre`,访问公网`ip:9100/web/`相当于访问`/tmp/`目录 + +#### 断线重连 +```ini +[common] +auto_reconnection=true +``` +#### nat类型检测 +``` + ./npc nat +``` +如果p2p双方都是Symmetric Nat,肯定不能成功,其他组合都有较大成功率。 +#### 状态检查 +``` + ./npc status -config=npc配置文件路径 +``` +#### 重载配置文件 +``` + ./npc restart -config=npc配置文件路径 +``` + +#### 通过代理连接nps +有时候运行npc的内网机器无法直接访问外网,此时可以可以通过socks5代理连接nps + +对于配置文件方式启动,设置 +```ini +[common] +proxy_url=socks5://111:222@127.0.0.1:8024 +``` +对于无配置文件模式,加上参数 + +``` +-proxy=socks5://111:222@127.0.0.1:8024 +``` +支持socks5和http两种模式 + +即socks5://username:password@ip:port + +或http://username:password@ip:port + +#### 群晖支持 +可在releases中下载spk群晖套件,例如`npc_x64-6.1_0.19.0-1.spk` +## 相关功能 + +### 缓存支持 +对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。 + +即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在`nps.conf`中设置`http_cache=true`,并设置`http_cache_length`(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数) + +### 数据压缩支持 + +由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。 + + +- 所有模式均支持数据压缩 +- 在web管理或客户端配置文件中设置 + + +### 加密传输 + +如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。 +- nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成 +- 在web管理或客户端配置文件中设置 + + + +### 站点保护 +域名代理模式所有客户端共用一个http服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps将通过 Http Basic Auth 来保护,访问时需要输入正确的用户名和密码。 + + +- 在web管理或客户端配置文件中设置 + +### host修改 + +由于内网站点需要的host可能与公网域名不一致,域名代理支持host修改功能,即修改request的header中的host字段。 + +**使用方法:在web管理中设置** + +### 自定义header + +支持对header进行新增或者修改,以配合服务的需要 + +### 404页面配置 +支持域名解析模式的自定义404页面,修改/web/static/page/error.html中内容即可,暂不支持静态文件等内容 + +### 流量限制 + +支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务 +,域名代理会返回404页面,其他代理会拒绝连接,使用该功能需要在`nps.conf`中设置`allow_flow_limit`,默认是关闭的。 + +### 带宽限制 + +支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡,使用该功能需要在`nps.conf`中设置`allow_rate_limit`,默认是关闭的。 + +### 负载均衡 +本代理支持域名解析模式和tcp代理的负载均衡,在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡 + +### 端口白名单 +为了防止服务端上的端口被滥用,可在nps.conf中配置allow_ports限制可开启的端口,忽略或者不填表示端口不受限制,格式: + +```ini +allow_ports=9001-9009,10001,11000-12000 +``` + +### 端口范围映射 +当客户端以配置文件的方式启动时,可以将本地的端口进行范围映射,仅支持tcp和udp模式,例如: + +```ini +[tcp] +mode=tcp +server_port=9001-9009,10001,11000-12000 +target_port=8001-8009,10002,13000-14000 +``` + +逗号分隔,可单个或者范围,注意上下端口的对应关系,无法一一对应将不能成功 +### 端口范围映射到其他机器 +```ini +[tcp] +mode=tcp +server_port=9001-9009,10001,11000-12000 +target_port=8001-8009,10002,13000-14000 +target_ip=10.1.50.2 +``` +填写target_ip后则表示映射的该地址机器的端口,忽略则便是映射本地127.0.0.1,仅范围映射时有效 +### 守护进程 +本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux,darwin,windows。 +``` +./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数 +``` +``` +(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数 +``` +### KCP协议支持 + +KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,在弱网环境下对性能能有一定的提升。可在nps.conf中修改`bridge_type`为kcp +,设置后本代理将开启udp端口(`bridge_port`) + +注意:当服务端为kcp时,客户端连接时也需要使用相同配置,无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp + +### 域名泛解析 +支持域名泛解析,例如将host设置为*.proxy.com,a.proxy.com、b.proxy.com等都将解析到同一目标,在web管理中或客户端配置文件中将host设置为此格式即可。 + +### URL路由 +本代理支持根据URL将同一域名转发到不同的内网服务器,可在web中或客户端配置文件中设置,此参数也可忽略,例如在客户端配置文件中 + +```ini +[web1] +host=a.proxy.com +target_addr=127.0.0.1:7001 +location=/test +[web2] +host=a.proxy.com +target_addr=127.0.0.1:7002 +location=/static +``` +对于`a.proxy.com/test`将转发到`web1`,对于`a.proxy.com/static`将转发到`web2` + +### 限制ip访问 +如果将一些危险性高的端口例如ssh端口暴露在公网上,可能会带来一些风险,本代理支持限制ip访问。 + +**使用方法:** 在配置文件nps.conf中设置`ip_limit`=true,设置后仅通过注册的ip方可访问。 + +**ip注册**: + +**方式一:** +在需要访问的机器上,运行客户端 + +``` +./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2 +``` + +time为有效小时数,例如time=2,在当前时间后的两小时内,本机公网ip都可以访问nps代理. + +**方式二:** +此外nps的web登陆也可提供验证的功能,成功登陆nps web admin后将自动为登陆的ip注册两小时的允许访问权限。 + + +**注意:** 本机公网ip并不是一成不变的,请自行注意有效期的设置,同时同一网络下,多人也可能是在公用同一个公网ip。 +### 客户端最大连接数 +为防止恶意大量长连接,影响服务端程序的稳定性,可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对`socks5`、`http正向代理`、`域名代理`、`tcp代理`、`udp代理`、`私密代理`生效,使用该功能需要在`nps.conf`中设置`allow_connection_num_limit=true`,默认是关闭的。 + +### 客户端最大隧道数限制 +nps支持对客户端的隧道数量进行限制,该功能默认是关闭的,如需开启,请在`nps.conf`中设置`allow_tunnel_num_limit=true`。 +### 端口复用 +在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将`bridge_port`、 `http_proxy_port`、 `https_proxy_port` 、`web_port`都设置为同一端口,也能正常使用。 + +- 使用时将需要复用的端口设置为与`bridge_port`一致即可,将自动识别。 +- 如需将web管理的端口也复用,需要配置`web_host`也就是一个二级域名以便区分 + +### 多路复用 + +nps主要通信默认基于多路复用,无需开启。 + +多路复用基于TCP滑动窗口原理设计,动态计算延迟以及带宽来算出应该往网络管道中打入的流量。 +由于主要通信大多采用TCP协议,并无法探测其实时丢包情况,对于产生丢包重传的情况,采用较大的宽容度, +5分钟的等待时间,超时将会关闭当前隧道连接并重新建立,这将会抛弃当前所有的连接。 +在Linux上,可以通过调节内核参数来适应不同应用场景。 + +对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 +高并发下可根据[Linux系统限制](#Linux系统限制) 调整 + +对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 +`tcp_syn_retries`, `tcp_retries1`, `tcp_retries2` +高并发同上 +nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接 + +### 环境变量渲染 +npc支持环境变量渲染以适应在某些特殊场景下的要求。 + +**在无配置文件启动模式下:** +设置环境变量 +``` +export NPC_SERVER_ADDR=1.1.1.1:8284 +export NPC_SERVER_VKEY=xxxxx +``` +直接执行./npc即可运行 + +**在配置文件启动模式下:** +```ini +[common] +server_addr={{.NPC_SERVER_ADDR}} +conn_type=tcp +vkey={{.NPC_SERVER_VKEY}} +auto_reconnection=true +[web] +host={{.NPC_WEB_HOST}} +target_addr={{.NPC_WEB_TARGET}} +``` +在配置文件中填入相应的环境变量名称,npc将自动进行渲染配置文件替换环境变量 + +### 健康检查 + +当客户端以配置文件模式启动时,支持多节点的健康检查。配置示例如下 + +```ini +[health_check_test1] +health_check_timeout=1 +health_check_max_failed=3 +health_check_interval=1 +health_http_url=/ +health_check_type=http +health_check_target=127.0.0.1:8083,127.0.0.1:8082 + +[health_check_test2] +health_check_timeout=1 +health_check_max_failed=3 +health_check_interval=1 +health_check_type=tcp +health_check_target=127.0.0.1:8083,127.0.0.1:8082 +``` +**health关键词必须在开头存在** + +第一种是http模式,也就是以get的方式请求目标+url,返回状态码为200表示成功 + +第一种是tcp模式,也就是以tcp的方式与目标建立连接,能成功建立连接表示成功 + +如果失败次数超过`health_check_max_failed`,nps则会移除该npc下的所有该目标,如果失败后目标重新上线,nps将自动将目标重新加入。 + +项 | 含义 +---|--- +health_check_timeout | 健康检查超时时间 +health_check_max_failed | 健康检查允许失败次数 +health_check_interval | 健康检查间隔 +health_check_type | 健康检查类型 +health_check_target | 健康检查目标,多个以逗号(,)分隔 +health_check_type | 健康检查类型 +health_http_url | 健康检查url,仅http模式适用 + +### 日志输出 + +#### 日志输出级别 + +**对于npc:** +``` +-log_level=0~7 -log_path=npc.log +``` +``` +LevelEmergency->0 LevelAlert->1 + +LevelCritical->2 LevelError->3 + +LevelWarning->4 LevelNotice->5 + +LevelInformational->6 LevelDebug->7 +``` +默认为全输出,级别为0到7 + +**对于nps:** + +在`nps.conf`中设置相关配置即可 + +## 相关说明 + +### 获取用户真实ip + +在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。 + +**本代理前会在每一个http(s)请求中添加了这两个 header。** + +### 热更新支持 +对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端 + +### 客户端地址显示 +在web管理中将显示客户端的连接地址 + +### 流量统计 +可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异 + +### 当前客户端带宽 +可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。 + +### 客户端与服务端版本对比 +为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。 + +### Linux系统限制 +默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 +`tcp_max_syn_backlog` `somaxconn` +酌情调整参数,增强网络性能 + +## webAPI + +### webAPI验证说明 +- 采用auth_key的验证方式 +- 在提交的每个请求后面附带两个参数,`auth_key` 和`timestamp` + +``` +auth_key的生成方式为:md5(配置文件中的auth_key+当前时间戳) +``` + +``` +timestamp为当前时间戳 +``` +``` +curl --request POST \ + --url http://127.0.0.1:8080/client/list \ + --data 'auth_key=2a0000d9229e7dbcf79dd0f5e04bb084×tamp=1553045344&start=0&limit=10' +``` +**注意:** 为保证安全,时间戳的有效范围为20秒内,所以每次提交请求必须重新生成。 + +### 获取服务端时间 +由于服务端与api请求的客户端时间差异不能太大,所以提供了一个可以获取服务端时间的接口 + +``` +POST /auth/gettime +``` + +### 获取服务端authKey + +如果想获取authKey,服务端提供获取authKey的接口 + +``` +POST /auth/getauthkey +``` +将返回加密后的authKey,采用aes cbc加密,请使用与服务端配置文件中cryptKey相同的密钥进行解密 + +**注意:** nps配置文件中`auth_crypt_key`需为16位 +- 解密密钥长度128 +- 偏移量与密钥相同 +- 补码方式pkcs5padding +- 解密串编码方式 十六进制 + +### 详细文档 +- **此文档近期可能更新较慢,建议自行抓包** + +为方便第三方扩展,在web模式下可利用webAPI进行相关操作,详情见 +[webAPI文档](https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3) + +## 贡献 +**欢迎参与到制作docker、图标、文档翻译等工作** +- 如果遇到bug可以直接提交至dev分支 +- 使用遇到问题可以通过issues反馈 +- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 +- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 + +## 捐助 +如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 +## 致谢 +Thanks [jetbrains](https://www.jetbrains.com/?from=nps) for providing development tools for nps + + + + + + +### 支付宝 +![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) +### 微信 +![image](https://github.com/cnlh/nps/blob/master/image/donation_wx.png?raw=true) +## 交流群 + +![二维码.jpeg](https://i.loli.net/2019/02/15/5c66c32a42074.jpeg) diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..f48a914 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,21 @@ + + + + + Document + + + + + + +
    + + + + From 73d6c1dc1c2ac72065f4b68c50fcb83371f9ac38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 13 Dec 2019 00:00:12 +0800 Subject: [PATCH 082/171] change md --- docs/README.md | 934 ------------------------------------------ docs/_coverpage.md | 14 + docs/_sidebar.md | 26 ++ docs/api.md | 46 +++ docs/contribute.md | 6 + docs/description.md | 25 ++ docs/discuss.md | 3 + docs/donate.md | 5 + docs/example.md | 120 ++++++ docs/feature.md | 247 +++++++++++ docs/index.html | 39 +- docs/install.md | 17 + docs/introduction.md | 4 + docs/logo.png | Bin 0 -> 889 bytes docs/logo.svg | 1 + docs/npc_extend.md | 36 ++ docs/nps_extend.md | 129 ++++++ docs/server_config.md | 21 + docs/start.md | 33 ++ docs/thanks.md | 5 + docs/use.md | 207 ++++++++++ 21 files changed, 972 insertions(+), 946 deletions(-) create mode 100644 docs/_coverpage.md create mode 100644 docs/_sidebar.md create mode 100644 docs/api.md create mode 100644 docs/contribute.md create mode 100644 docs/description.md create mode 100644 docs/discuss.md create mode 100644 docs/donate.md create mode 100644 docs/example.md create mode 100644 docs/feature.md create mode 100644 docs/install.md create mode 100644 docs/introduction.md create mode 100644 docs/logo.png create mode 100644 docs/logo.svg create mode 100644 docs/npc_extend.md create mode 100644 docs/nps_extend.md create mode 100644 docs/server_config.md create mode 100644 docs/start.md create mode 100644 docs/thanks.md create mode 100644 docs/use.md diff --git a/docs/README.md b/docs/README.md index 4e96f7e..8f94b02 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,3 @@ - # nps ![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) [![Gitter](https://badges.gitter.im/cnlh-nps/community.svg)](https://gitter.im/cnlh-nps/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) @@ -20,936 +19,3 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 4. 在外网使用HTTP代理访问内网站点----> http代理模式 5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 - -## 安装 - -### release安装 -> [releases](https://github.com/cnlh/nps/releases) - -下载对应的系统版本即可,服务端和客户端是单独的 - -### 源码安装 -- 安装源码 -> go get -u github.com/cnlh/nps... -- 编译 -> go build cmd/nps/nps.go - -> go build cmd/npc/npc.go - -### docker安装 -> [server](https://hub.docker.com/r/ffdfgdfg/nps) -> [client](https://hub.docker.com/r/ffdfgdfg/npc) - -## 使用示例 - -### 统一准备工作(必做) -- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中`bridge_port`为8284,配置文件中`web_port`为8080 -- 访问1.1.1.1:8080 -- 在客户端管理中创建一个客户端,记录下验证密钥 -- 内网客户端运行(windows使用cmd运行加.exe) - -```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 -``` -**注意:运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的`bridge_port`端口,telnet,netcat这类的来检查** - -### 域名解析 - -**适用范围:** 小程序开发、微信公众号开发、产品演示 - -**假设场景:** -- 有一个域名proxy.com,有一台公网机器ip为1.1.1.1 -- 两个内网开发站点127.0.0.1:81,127.0.0.1:82 -- 想通过(http|https://)a.proxy.com访问127.0.0.1:81,通过(http|https://)b.proxy.com访问127.0.0.1:82 - -**使用步骤** -- 将*.proxy.com解析到公网服务器1.1.1.1 -- 点击刚才创建的客户端的域名管理,添加两条规则规则:1、域名:`a.proxy.com`,内网目标:`127.0.0.1:81`,2、域名:`b.proxy.com`,内网目标:`127.0.0.1:82` - -现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 - -**https:** 如需使用https请进行相关配置,详见 [使用https](#使用https) - -### tcp隧道 - - -**适用范围:** ssh、远程桌面等tcp连接场景 - -**假设场景:** - 想通过访问公网服务器1.1.1.1的8001端口,连接内网机器10.1.50.101的22端口,实现ssh连接 - -**使用步骤** -- 在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),保存。 -- 访问公网服务器ip(1.1.1.1),填写的监听端口(8001),相当于访问内网ip(10.1.50.101):目标端口(22),例如:`ssh -p 8001 root@1.1.1.1` - -### udp隧道 - -**适用范围:** 内网dns解析等udp连接场景 - -**假设场景:** -内网有一台dns(10.1.50.102:53),在非内网环境下想使用该dns,公网服务器为1.1.1.1 - -**使用步骤** -- 在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。 -- 修改需要使用的dns地址为1.1.1.1,则相当于使用10.1.50.102作为dns服务器 - -### socks5代理 - - -**适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 - -**假设场景:** -想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果 - -**使用步骤** -- 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。 -- 在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理),ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了 - -**注意** -经过socks5代理,当收到socks5数据包时socket已经是accept状态。表现是扫描端口全open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。 - -### http正向代理 - -**适用范围:** 在外网环境下使用http正向代理访问内网站点 - -**假设场景:** -想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站 - -**使用步骤** - -- 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。 -- 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了 - -### 私密代理 - -**适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。 - -**假设场景:** -无需新增多的端口实现访问内网服务器10.1.50.2的22端口 - -**使用步骤** -- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥secrettest和内网目标10.1.50.2:22 -- 在需要连接ssh的机器上以执行命令 - -``` -./npc -server=1.1.1.1:8284 -vkey=vkey -type=tcp -password=secrettest -local_type=secret -``` -如需指定本地端口可加参数`-local_port=xx`,默认为2000 - -**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 - -假设10.1.50.2用户名为root,现在执行`ssh -p 2000 root@1.1.1.1`即可访问ssh - - -### p2p服务 - -**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](#nat类型检测) - -**假设场景:** - -想通过访问使用端机器(访问端,也就是本机)的2000端口---->访问到内网机器 10.2.50.2的22端口 - -**使用步骤** -- 在`nps.conf`中设置`p2p_ip`(nps服务器ip)和`p2p_port`(nps服务器udp端口) -- 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh -- 在使用端机器(本机)执行命令 - -``` -./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.2:22 -``` -如需指定本地端口可加参数`-local_port=xx`,默认为2000 - -**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 - -假设内网机器为10.2.50.2的ssh用户名为root,现在在本机上执行`ssh -p 2000 root@127.0.0.1`即可访问机器2的ssh,如果是网站在浏览器访问127.0.0.1:2000端口即可。 - - - -## web管理 - -![image](https://github.com/cnlh/nps/blob/master/image/web2.png?raw=true) -### 介绍 - -可在网页上配置和管理各个tcp、udp隧道、内网站点代理,http、https解析等,功能强大,操作方便。 - - -**提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** - -### 启动 - - -#### 服务端测试 -```shell - ./nps test -``` -如有错误请及时修改配置文件,无错误可继续进行下去 -#### 服务端启动 -```shell - ./nps start -``` -**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** - -#### web管理 - -进入web界面,公网ip:web界面端口(默认8080),密码默认为123 - -进入web管理界面,有详细的说明 - -#### 服务端配置文件重载 -如果是daemon启动 -```shell - ./nps reload -``` -**说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 - - -#### 服务端停止或重启 -如果是daemon启动 -```shell - ./nps stop|restart -``` - -### 服务端配置文件 -- /conf/nps.conf - -名称 | 含义 ----|--- -web_port | web管理端口 -web_password | web界面管理密码 -web_username | web界面管理账号 -web_base_url | web管理主路径,用于将web管理置于代理子路径后面 -bridge_port | 服务端客户端通信端口 -https_proxy_port | 域名代理https代理监听端口 -http_proxy_port | 域名代理http代理监听端口 -auth_key|web api密钥 -bridge_type|客户端与服务端连接方式kcp或tcp -public_vkey|客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 -ip_limit|是否限制ip访问,true或false或忽略 -flow_store_interval|服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 -log_level|日志输出级别 -auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 -p2p_ip| 服务端Ip,使用p2p模式必填 -p2p_port|p2p模式开启的udp端口 - -### 使用https - -**方式一:** 类似于nginx实现https的处理 - -在配置文件中将https_proxy_port设置为443或者其他你想配置的端口,和在web中对应域名编辑中设置对应的证书路径,将`https_just_proxy`设置为false,然后就和http代理一样了 - -**此外:** 可以在`nps.conf`中设置一个默认的https配置,当遇到未在web中设置https证书的域名解析时,将自动使用默认证书,另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息,nps也将自动使用默认证书 - - -**方式二:** 在内网对应服务器上设置https - -在`nps.conf`中将`https_just_proxy`设置为true,并且打开`https_proxy_port`端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理 - -### 与nginx配合 - -有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等,本代理可和nginx配合使用,在配置文件中将httpProxyPort设置为非80端口,并在nginx中配置代理,例如httpProxyPort为8024时 -``` -server { - listen 80; - server_name *.proxy.com; - location / { - proxy_set_header Host $http_host; - proxy_pass http://127.0.0.1:8024; - } -} -``` -如需使用https也可在nginx监听443端口并配置ssl,并将本代理的httpsProxyPort设置为空关闭https即可,例如httpProxyPort为8024时 - -``` -server { - listen 443; - server_name *.proxy.com; - ssl on; - ssl_certificate certificate.crt; - ssl_certificate_key private.key; - ssl_session_timeout 5m; - ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - location / { - proxy_set_header Host $http_host; - proxy_pass http://127.0.0.1:8024; - } -} -``` - -### web使用Caddy代理 - -如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. - -假设我们想通过 `http://caddy_ip:caddy_port/nps` 来访问后台, Caddyfile 这样配置: - -```Caddyfile -caddy_ip:caddy_port/nps { - #server_ip 为 nps 服务器IP - #web_port 为 nps 后台端口 - proxy / http://server_ip:web_port/nps { - transparent - } -} -``` - -nps.conf 修改 `web_base_url` 为 `/nps` 即可 -``` -web_base_url=/nps -``` - - -### 关闭代理 - -如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。 - -### 将nps安装到系统 -如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 - -``` -(./nps|nps.exe) install -``` -安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 - -``` -sudo systemctl enable|disable|start|stop|restart|status nps -``` -systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 -建议采用此方式启动,能够捕获panic信息,便于排查问题。 - -``` -nps test|start|stop|restart|status -``` -对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 - -``` -nps.exe test|start|stop|restart|status -``` - -### 流量数据持久化 -服务端支持将流量数据持久化,默认情况下是关闭的,如果有需求可以设置`nps.conf`中的`flow_store_interval`参数,单位为分钟 - -**注意:** nps不会持久化通过公钥连接的客户端 -### 系统信息显示 -nps服务端支持在web上显示和统计服务器的相关信息,但默认一些统计图表是关闭的,如需开启请在`nps.conf`中设置`system_info_display=true` - -### 自定义客户端连接密钥 -web上可以自定义客户端连接的密钥,但是必须具有唯一性 -### 关闭公钥访问 -可以将`nps.conf`中的`public_vkey`设置为空或者删除 - -### 关闭web管理 -可以将`nps.conf`中的`web_port`设置为空或者删除 - -### 服务端多用户登陆 -如果将`nps.conf`中的`allow_user_login`设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。 - -### 用户注册功能 -nps服务端支持用户注册功能,可将`nps.conf`中的`allow_user_register`设置为true,开启后登陆页将会有有注册功能, - -### 监听指定ip - -nps支持每个隧道监听不同的服务端端口,在`nps.conf`中设置`allow_multi_ip=true`后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0) -```ini -server_ip=xxx -``` -### 代理到服务端本地 -在使用nps监听80或者443端口时,默认是将所有的请求都会转发到内网上,但有时候我们的nps服务器的上一些服务也需要使用这两个端口,nps提供类似于`nginx` `proxy_pass` 的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。 - -**即:** 假设在nps的vps服务器上有一个服务使用5000端口,这时候nps占用了80端口和443,我们想能使用一个域名通过http(s)访问到5000的服务。 - -**使用方式:** 在`nps.conf`中设置`allow_local_proxy=true`,然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。 -## 客户端 - -### 客户端启动 -#### 无配置文件模式 -此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 -``` - ./npc -server=ip:port -vkey=web界面中显示的密钥 -``` -#### 配置文件模式 -此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 -``` - ./npc -config=npc配置文件路径 -``` -可自行添加systemd service,例如:`npc.service` -``` -[Unit] -Description=npc - convenient proxy server client -Documentation=https://github.com/cnlh/nps/ -After=network-online.target remote-fs.target nss-lookup.target -Wants=network-online.target - -[Service] -Type=simple -KillMode=process -Restart=always -RestartSec=15s -StandardOutput=append:/var/log/nps/npc.log -ExecStartPre=/bin/echo 'Starting npc' -ExecStopPost=/bin/echo 'Stopping npc' -ExecStart=/absolutely path to/npc -server=ip:port -vkey=web界面中显示的密钥 - -[Install] -WantedBy=multi-user.target -``` -#### 配置文件说明 -[示例配置文件](https://github.com/cnlh/nps/tree/master/conf/npc.conf) -##### 全局配置 -```ini -[common] -server_addr=1.1.1.1:8284 -conn_type=tcp -vkey=123 -username=111 -password=222 -compress=true -crypt=true -rate_limit=10000 -flow_limit=100 -remark=test -max_conn=10 -``` -项 | 含义 ----|--- -server_addr | 服务端ip:port -conn_type | 与服务端通信模式(tcp或kcp) -vkey|服务端配置文件中的密钥(非web) -username|socks5或http(s)密码保护用户名(可忽略) -password|socks5或http(s)密码保护密码(可忽略) -compress|是否压缩传输(true或false或忽略) -crypt|是否加密传输(true或false或忽略) -rate_limit|速度限制,可忽略 -flow_limit|流量限制,可忽略 -remark|客户端备注,可忽略 -max_conn|最大连接数,可忽略 -##### 域名代理 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[web1] -host=a.proxy.com -target_addr=127.0.0.1:8080,127.0.0.1:8082 -host_change=www.proxy.com -header_set_proxy=nps -``` -项 | 含义 ----|--- -web1 | 备注 -host | 域名(http|https都可解析) -target_addr|内网目标,负载均衡时多个目标,逗号隔开 -host_change|请求host修改 -header_xxx|请求header修改或添加,header_proxy表示添加header proxy:nps - -##### tcp隧道模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[tcp] -mode=tcp -target_addr=127.0.0.1:8080 -server_port=9001 -``` -项 | 含义 ----|--- -mode | tcp -server_port | 在服务端的代理端口 -tartget_addr|内网目标 - -##### udp隧道模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[udp] -mode=udp -target_addr=127.0.0.1:8080 -server_port=9002 -``` -项 | 含义 ----|--- -mode | udp -server_port | 在服务端的代理端口 -target_addr|内网目标 -##### http代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[http] -mode=httpProxy -server_port=9003 -``` -项 | 含义 ----|--- -mode | httpProxy -server_port | 在服务端的代理端口 -##### socks5代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[socks5] -mode=socks5 -server_port=9004 -multi_account=multi_account.conf -``` -项 | 含义 ----|--- -mode | socks5 -server_port | 在服务端的代理端口 -multi_account | socks5多账号配置文件(可选),配置后使用basic_username和basic_password无法通过认证 -##### 私密代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[secret_ssh] -mode=secret -password=ssh2 -target_addr=10.1.50.2:22 -``` -项 | 含义 ----|--- -mode | secret -password | 唯一密钥 -target_addr|内网目标 - -##### p2p代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[p2p_ssh] -mode=p2p -password=ssh2 -target_addr=10.1.50.2:22 -``` -项 | 含义 ----|--- -mode | p2p -password | 唯一密钥 -target_addr|内网目标 - - -##### 文件访问模式 -利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[file] -mode=file -server_port=9100 -local_path=/tmp/ -strip_pre=/web/ -```` - -项 | 含义 ----|--- -mode | file -server_port | 服务端开启的端口 -local_path|本地文件目录 -strip_pre|前缀 - -对于`strip_pre`,访问公网`ip:9100/web/`相当于访问`/tmp/`目录 - -#### 断线重连 -```ini -[common] -auto_reconnection=true -``` -#### nat类型检测 -``` - ./npc nat -``` -如果p2p双方都是Symmetric Nat,肯定不能成功,其他组合都有较大成功率。 -#### 状态检查 -``` - ./npc status -config=npc配置文件路径 -``` -#### 重载配置文件 -``` - ./npc restart -config=npc配置文件路径 -``` - -#### 通过代理连接nps -有时候运行npc的内网机器无法直接访问外网,此时可以可以通过socks5代理连接nps - -对于配置文件方式启动,设置 -```ini -[common] -proxy_url=socks5://111:222@127.0.0.1:8024 -``` -对于无配置文件模式,加上参数 - -``` --proxy=socks5://111:222@127.0.0.1:8024 -``` -支持socks5和http两种模式 - -即socks5://username:password@ip:port - -或http://username:password@ip:port - -#### 群晖支持 -可在releases中下载spk群晖套件,例如`npc_x64-6.1_0.19.0-1.spk` -## 相关功能 - -### 缓存支持 -对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。 - -即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在`nps.conf`中设置`http_cache=true`,并设置`http_cache_length`(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数) - -### 数据压缩支持 - -由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。 - - -- 所有模式均支持数据压缩 -- 在web管理或客户端配置文件中设置 - - -### 加密传输 - -如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。 -- nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成 -- 在web管理或客户端配置文件中设置 - - - -### 站点保护 -域名代理模式所有客户端共用一个http服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps将通过 Http Basic Auth 来保护,访问时需要输入正确的用户名和密码。 - - -- 在web管理或客户端配置文件中设置 - -### host修改 - -由于内网站点需要的host可能与公网域名不一致,域名代理支持host修改功能,即修改request的header中的host字段。 - -**使用方法:在web管理中设置** - -### 自定义header - -支持对header进行新增或者修改,以配合服务的需要 - -### 404页面配置 -支持域名解析模式的自定义404页面,修改/web/static/page/error.html中内容即可,暂不支持静态文件等内容 - -### 流量限制 - -支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务 -,域名代理会返回404页面,其他代理会拒绝连接,使用该功能需要在`nps.conf`中设置`allow_flow_limit`,默认是关闭的。 - -### 带宽限制 - -支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡,使用该功能需要在`nps.conf`中设置`allow_rate_limit`,默认是关闭的。 - -### 负载均衡 -本代理支持域名解析模式和tcp代理的负载均衡,在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡 - -### 端口白名单 -为了防止服务端上的端口被滥用,可在nps.conf中配置allow_ports限制可开启的端口,忽略或者不填表示端口不受限制,格式: - -```ini -allow_ports=9001-9009,10001,11000-12000 -``` - -### 端口范围映射 -当客户端以配置文件的方式启动时,可以将本地的端口进行范围映射,仅支持tcp和udp模式,例如: - -```ini -[tcp] -mode=tcp -server_port=9001-9009,10001,11000-12000 -target_port=8001-8009,10002,13000-14000 -``` - -逗号分隔,可单个或者范围,注意上下端口的对应关系,无法一一对应将不能成功 -### 端口范围映射到其他机器 -```ini -[tcp] -mode=tcp -server_port=9001-9009,10001,11000-12000 -target_port=8001-8009,10002,13000-14000 -target_ip=10.1.50.2 -``` -填写target_ip后则表示映射的该地址机器的端口,忽略则便是映射本地127.0.0.1,仅范围映射时有效 -### 守护进程 -本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux,darwin,windows。 -``` -./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数 -``` -``` -(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数 -``` -### KCP协议支持 - -KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,在弱网环境下对性能能有一定的提升。可在nps.conf中修改`bridge_type`为kcp -,设置后本代理将开启udp端口(`bridge_port`) - -注意:当服务端为kcp时,客户端连接时也需要使用相同配置,无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp - -### 域名泛解析 -支持域名泛解析,例如将host设置为*.proxy.com,a.proxy.com、b.proxy.com等都将解析到同一目标,在web管理中或客户端配置文件中将host设置为此格式即可。 - -### URL路由 -本代理支持根据URL将同一域名转发到不同的内网服务器,可在web中或客户端配置文件中设置,此参数也可忽略,例如在客户端配置文件中 - -```ini -[web1] -host=a.proxy.com -target_addr=127.0.0.1:7001 -location=/test -[web2] -host=a.proxy.com -target_addr=127.0.0.1:7002 -location=/static -``` -对于`a.proxy.com/test`将转发到`web1`,对于`a.proxy.com/static`将转发到`web2` - -### 限制ip访问 -如果将一些危险性高的端口例如ssh端口暴露在公网上,可能会带来一些风险,本代理支持限制ip访问。 - -**使用方法:** 在配置文件nps.conf中设置`ip_limit`=true,设置后仅通过注册的ip方可访问。 - -**ip注册**: - -**方式一:** -在需要访问的机器上,运行客户端 - -``` -./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2 -``` - -time为有效小时数,例如time=2,在当前时间后的两小时内,本机公网ip都可以访问nps代理. - -**方式二:** -此外nps的web登陆也可提供验证的功能,成功登陆nps web admin后将自动为登陆的ip注册两小时的允许访问权限。 - - -**注意:** 本机公网ip并不是一成不变的,请自行注意有效期的设置,同时同一网络下,多人也可能是在公用同一个公网ip。 -### 客户端最大连接数 -为防止恶意大量长连接,影响服务端程序的稳定性,可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对`socks5`、`http正向代理`、`域名代理`、`tcp代理`、`udp代理`、`私密代理`生效,使用该功能需要在`nps.conf`中设置`allow_connection_num_limit=true`,默认是关闭的。 - -### 客户端最大隧道数限制 -nps支持对客户端的隧道数量进行限制,该功能默认是关闭的,如需开启,请在`nps.conf`中设置`allow_tunnel_num_limit=true`。 -### 端口复用 -在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将`bridge_port`、 `http_proxy_port`、 `https_proxy_port` 、`web_port`都设置为同一端口,也能正常使用。 - -- 使用时将需要复用的端口设置为与`bridge_port`一致即可,将自动识别。 -- 如需将web管理的端口也复用,需要配置`web_host`也就是一个二级域名以便区分 - -### 多路复用 - -nps主要通信默认基于多路复用,无需开启。 - -多路复用基于TCP滑动窗口原理设计,动态计算延迟以及带宽来算出应该往网络管道中打入的流量。 -由于主要通信大多采用TCP协议,并无法探测其实时丢包情况,对于产生丢包重传的情况,采用较大的宽容度, -5分钟的等待时间,超时将会关闭当前隧道连接并重新建立,这将会抛弃当前所有的连接。 -在Linux上,可以通过调节内核参数来适应不同应用场景。 - -对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 -高并发下可根据[Linux系统限制](#Linux系统限制) 调整 - -对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 -`tcp_syn_retries`, `tcp_retries1`, `tcp_retries2` -高并发同上 -nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接 - -### 环境变量渲染 -npc支持环境变量渲染以适应在某些特殊场景下的要求。 - -**在无配置文件启动模式下:** -设置环境变量 -``` -export NPC_SERVER_ADDR=1.1.1.1:8284 -export NPC_SERVER_VKEY=xxxxx -``` -直接执行./npc即可运行 - -**在配置文件启动模式下:** -```ini -[common] -server_addr={{.NPC_SERVER_ADDR}} -conn_type=tcp -vkey={{.NPC_SERVER_VKEY}} -auto_reconnection=true -[web] -host={{.NPC_WEB_HOST}} -target_addr={{.NPC_WEB_TARGET}} -``` -在配置文件中填入相应的环境变量名称,npc将自动进行渲染配置文件替换环境变量 - -### 健康检查 - -当客户端以配置文件模式启动时,支持多节点的健康检查。配置示例如下 - -```ini -[health_check_test1] -health_check_timeout=1 -health_check_max_failed=3 -health_check_interval=1 -health_http_url=/ -health_check_type=http -health_check_target=127.0.0.1:8083,127.0.0.1:8082 - -[health_check_test2] -health_check_timeout=1 -health_check_max_failed=3 -health_check_interval=1 -health_check_type=tcp -health_check_target=127.0.0.1:8083,127.0.0.1:8082 -``` -**health关键词必须在开头存在** - -第一种是http模式,也就是以get的方式请求目标+url,返回状态码为200表示成功 - -第一种是tcp模式,也就是以tcp的方式与目标建立连接,能成功建立连接表示成功 - -如果失败次数超过`health_check_max_failed`,nps则会移除该npc下的所有该目标,如果失败后目标重新上线,nps将自动将目标重新加入。 - -项 | 含义 ----|--- -health_check_timeout | 健康检查超时时间 -health_check_max_failed | 健康检查允许失败次数 -health_check_interval | 健康检查间隔 -health_check_type | 健康检查类型 -health_check_target | 健康检查目标,多个以逗号(,)分隔 -health_check_type | 健康检查类型 -health_http_url | 健康检查url,仅http模式适用 - -### 日志输出 - -#### 日志输出级别 - -**对于npc:** -``` --log_level=0~7 -log_path=npc.log -``` -``` -LevelEmergency->0 LevelAlert->1 - -LevelCritical->2 LevelError->3 - -LevelWarning->4 LevelNotice->5 - -LevelInformational->6 LevelDebug->7 -``` -默认为全输出,级别为0到7 - -**对于nps:** - -在`nps.conf`中设置相关配置即可 - -## 相关说明 - -### 获取用户真实ip - -在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。 - -**本代理前会在每一个http(s)请求中添加了这两个 header。** - -### 热更新支持 -对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端 - -### 客户端地址显示 -在web管理中将显示客户端的连接地址 - -### 流量统计 -可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异 - -### 当前客户端带宽 -可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。 - -### 客户端与服务端版本对比 -为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。 - -### Linux系统限制 -默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 -`tcp_max_syn_backlog` `somaxconn` -酌情调整参数,增强网络性能 - -## webAPI - -### webAPI验证说明 -- 采用auth_key的验证方式 -- 在提交的每个请求后面附带两个参数,`auth_key` 和`timestamp` - -``` -auth_key的生成方式为:md5(配置文件中的auth_key+当前时间戳) -``` - -``` -timestamp为当前时间戳 -``` -``` -curl --request POST \ - --url http://127.0.0.1:8080/client/list \ - --data 'auth_key=2a0000d9229e7dbcf79dd0f5e04bb084×tamp=1553045344&start=0&limit=10' -``` -**注意:** 为保证安全,时间戳的有效范围为20秒内,所以每次提交请求必须重新生成。 - -### 获取服务端时间 -由于服务端与api请求的客户端时间差异不能太大,所以提供了一个可以获取服务端时间的接口 - -``` -POST /auth/gettime -``` - -### 获取服务端authKey - -如果想获取authKey,服务端提供获取authKey的接口 - -``` -POST /auth/getauthkey -``` -将返回加密后的authKey,采用aes cbc加密,请使用与服务端配置文件中cryptKey相同的密钥进行解密 - -**注意:** nps配置文件中`auth_crypt_key`需为16位 -- 解密密钥长度128 -- 偏移量与密钥相同 -- 补码方式pkcs5padding -- 解密串编码方式 十六进制 - -### 详细文档 -- **此文档近期可能更新较慢,建议自行抓包** - -为方便第三方扩展,在web模式下可利用webAPI进行相关操作,详情见 -[webAPI文档](https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3) - -## 贡献 -**欢迎参与到制作docker、图标、文档翻译等工作** -- 如果遇到bug可以直接提交至dev分支 -- 使用遇到问题可以通过issues反馈 -- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 -- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 - -## 捐助 -如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 -## 致谢 -Thanks [jetbrains](https://www.jetbrains.com/?from=nps) for providing development tools for nps - - - - - - -### 支付宝 -![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) -### 微信 -![image](https://github.com/cnlh/nps/blob/master/image/donation_wx.png?raw=true) -## 交流群 - -![二维码.jpeg](https://i.loli.net/2019/02/15/5c66c32a42074.jpeg) diff --git a/docs/_coverpage.md b/docs/_coverpage.md new file mode 100644 index 0000000..53d5a88 --- /dev/null +++ b/docs/_coverpage.md @@ -0,0 +1,14 @@ +![logo](logo.svg) + +# NPS 0.25.1 + +> 一款轻量级、高性能、功能强大的内网穿透代理服务器 + +- 支持tcp、udp流量转发 +- 支持内网http代理、内网socks5代理、p2p +- 简洁方便的WEB管理界面 +- 服务端控制 + + +[GitHub](https://github.com/cnlh/nps/) +[开始使用](#docsify) diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 0000000..7250ad2 --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,26 @@ +* 入门 + * [安装](install.md) + * [使用示例](example.md) +* 服务端 + * [介绍](introduction.md) + * [启动](start.md) + * [配置文件](server_config.md) + * [增强功能](nps_extend.md) + +* 客户端 + + * [基本使用](use.md) + * [增强功能](npc_extend.md) + +* 扩展 + + * [功能](feature.md) + * [说明](description.md) + * [web api](api.md) + +* 其他 + + * [贡献](contribute.md) + * [捐助](donate.md) + * [致谢](thanks.md) + * [交流](discuss.md) diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..eff6be3 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,46 @@ + +# webAPI验证说明 +- 采用auth_key的验证方式 +- 在提交的每个请求后面附带两个参数,`auth_key` 和`timestamp` + +``` +auth_key的生成方式为:md5(配置文件中的auth_key+当前时间戳) +``` + +``` +timestamp为当前时间戳 +``` +``` +curl --request POST \ + --url http://127.0.0.1:8080/client/list \ + --data 'auth_key=2a0000d9229e7dbcf79dd0f5e04bb084×tamp=1553045344&start=0&limit=10' +``` +**注意:** 为保证安全,时间戳的有效范围为20秒内,所以每次提交请求必须重新生成。 + +# 获取服务端时间 +由于服务端与api请求的客户端时间差异不能太大,所以提供了一个可以获取服务端时间的接口 + +``` +POST /auth/gettime +``` + +# 获取服务端authKey + +如果想获取authKey,服务端提供获取authKey的接口 + +``` +POST /auth/getauthkey +``` +将返回加密后的authKey,采用aes cbc加密,请使用与服务端配置文件中cryptKey相同的密钥进行解密 + +**注意:** nps配置文件中`auth_crypt_key`需为16位 +- 解密密钥长度128 +- 偏移量与密钥相同 +- 补码方式pkcs5padding +- 解密串编码方式 十六进制 + +# 详细文档 +- **此文档近期可能更新较慢,建议自行抓包** + +为方便第三方扩展,在web模式下可利用webAPI进行相关操作,详情见 +[webAPI文档](https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3) diff --git a/docs/contribute.md b/docs/contribute.md new file mode 100644 index 0000000..35d5873 --- /dev/null +++ b/docs/contribute.md @@ -0,0 +1,6 @@ +# 贡献 +**欢迎参与到制作docker、图标、文档翻译等工作** +- 如果遇到bug可以直接提交至dev分支 +- 使用遇到问题可以通过issues反馈 +- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 +- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 diff --git a/docs/description.md b/docs/description.md new file mode 100644 index 0000000..61a568f --- /dev/null +++ b/docs/description.md @@ -0,0 +1,25 @@ +# 获取用户真实ip + +在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。 + +**本代理前会在每一个http(s)请求中添加了这两个 header。** + +# 热更新支持 +对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端 + +# 客户端地址显示 +在web管理中将显示客户端的连接地址 + +# 流量统计 +可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异 + +# 当前客户端带宽 +可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。 + +# 客户端与服务端版本对比 +为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。 + +# Linux系统限制 +默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 +`tcp_max_syn_backlog` `somaxconn` +酌情调整参数,增强网络性能 diff --git a/docs/discuss.md b/docs/discuss.md new file mode 100644 index 0000000..a23c291 --- /dev/null +++ b/docs/discuss.md @@ -0,0 +1,3 @@ +# 交流群 + +![二维码.jpeg](https://i.loli.net/2019/02/15/5c66c32a42074.jpeg) diff --git a/docs/donate.md b/docs/donate.md new file mode 100644 index 0000000..5fbb408 --- /dev/null +++ b/docs/donate.md @@ -0,0 +1,5 @@ +如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 +# 支付宝 +![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) +# 微信 +![image](https://github.com/cnlh/nps/blob/master/image/donation_wx.png?raw=true) diff --git a/docs/example.md b/docs/example.md new file mode 100644 index 0000000..5980b06 --- /dev/null +++ b/docs/example.md @@ -0,0 +1,120 @@ +# 统一准备工作(必做) +- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中`bridge_port`为8284,配置文件中`web_port`为8080 +- 访问1.1.1.1:8080 +- 在客户端管理中创建一个客户端,记录下验证密钥 +- 内网客户端运行(windows使用cmd运行加.exe) + +```shell +./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 +``` +**注意:运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的`bridge_port`端口,telnet,netcat这类的来检查** + +# 域名解析 + +**适用范围:** 小程序开发、微信公众号开发、产品演示 + +**假设场景:** +- 有一个域名proxy.com,有一台公网机器ip为1.1.1.1 +- 两个内网开发站点127.0.0.1:81,127.0.0.1:82 +- 想通过(http|https://)a.proxy.com访问127.0.0.1:81,通过(http|https://)b.proxy.com访问127.0.0.1:82 + +**使用步骤** +- 将*.proxy.com解析到公网服务器1.1.1.1 +- 点击刚才创建的客户端的域名管理,添加两条规则规则:1、域名:`a.proxy.com`,内网目标:`127.0.0.1:81`,2、域名:`b.proxy.com`,内网目标:`127.0.0.1:82` + +现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 + +**https:** 如需使用https请进行相关配置,详见 [使用https](#使用https) + +# tcp隧道 + + +**适用范围:** ssh、远程桌面等tcp连接场景 + +**假设场景:** + 想通过访问公网服务器1.1.1.1的8001端口,连接内网机器10.1.50.101的22端口,实现ssh连接 + +**使用步骤** +- 在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),保存。 +- 访问公网服务器ip(1.1.1.1),填写的监听端口(8001),相当于访问内网ip(10.1.50.101):目标端口(22),例如:`ssh -p 8001 root@1.1.1.1` + +# udp隧道 + +**适用范围:** 内网dns解析等udp连接场景 + +**假设场景:** +内网有一台dns(10.1.50.102:53),在非内网环境下想使用该dns,公网服务器为1.1.1.1 + +**使用步骤** +- 在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。 +- 修改需要使用的dns地址为1.1.1.1,则相当于使用10.1.50.102作为dns服务器 + +# socks5代理 + + +**适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 + +**假设场景:** +想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果 + +**使用步骤** +- 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。 +- 在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理),ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了 + +**注意** +经过socks5代理,当收到socks5数据包时socket已经是accept状态。表现是扫描端口全open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。 + +# http正向代理 + +**适用范围:** 在外网环境下使用http正向代理访问内网站点 + +**假设场景:** +想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站 + +**使用步骤** + +- 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。 +- 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了 + +# 私密代理 + +**适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。 + +**假设场景:** +无需新增多的端口实现访问内网服务器10.1.50.2的22端口 + +**使用步骤** +- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥secrettest和内网目标10.1.50.2:22 +- 在需要连接ssh的机器上以执行命令 + +``` +./npc -server=1.1.1.1:8284 -vkey=vkey -type=tcp -password=secrettest -local_type=secret +``` +如需指定本地端口可加参数`-local_port=xx`,默认为2000 + +**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 + +假设10.1.50.2用户名为root,现在执行`ssh -p 2000 root@1.1.1.1`即可访问ssh + + +# p2p服务 + +**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](#nat类型检测) + +**假设场景:** + +想通过访问使用端机器(访问端,也就是本机)的2000端口---->访问到内网机器 10.2.50.2的22端口 + +**使用步骤** +- 在`nps.conf`中设置`p2p_ip`(nps服务器ip)和`p2p_port`(nps服务器udp端口) +- 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh +- 在使用端机器(本机)执行命令 + +``` +./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.2:22 +``` +如需指定本地端口可加参数`-local_port=xx`,默认为2000 + +**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 + +假设内网机器为10.2.50.2的ssh用户名为root,现在在本机上执行`ssh -p 2000 root@127.0.0.1`即可访问机器2的ssh,如果是网站在浏览器访问127.0.0.1:2000端口即可。 diff --git a/docs/feature.md b/docs/feature.md new file mode 100644 index 0000000..c4f6a96 --- /dev/null +++ b/docs/feature.md @@ -0,0 +1,247 @@ + +# 缓存支持 +对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。 + +即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在`nps.conf`中设置`http_cache=true`,并设置`http_cache_length`(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数) + +# 数据压缩支持 + +由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。 + + +- 所有模式均支持数据压缩 +- 在web管理或客户端配置文件中设置 + + +# 加密传输 + +如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。 +- nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成 +- 在web管理或客户端配置文件中设置 + + + +# 站点保护 +域名代理模式所有客户端共用一个http服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps将通过 Http Basic Auth 来保护,访问时需要输入正确的用户名和密码。 + + +- 在web管理或客户端配置文件中设置 + +# host修改 + +由于内网站点需要的host可能与公网域名不一致,域名代理支持host修改功能,即修改request的header中的host字段。 + +**使用方法:在web管理中设置** + +# 自定义header + +支持对header进行新增或者修改,以配合服务的需要 + +# 404页面配置 +支持域名解析模式的自定义404页面,修改/web/static/page/error.html中内容即可,暂不支持静态文件等内容 + +# 流量限制 + +支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务 +,域名代理会返回404页面,其他代理会拒绝连接,使用该功能需要在`nps.conf`中设置`allow_flow_limit`,默认是关闭的。 + +# 带宽限制 + +支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡,使用该功能需要在`nps.conf`中设置`allow_rate_limit`,默认是关闭的。 + +# 负载均衡 +本代理支持域名解析模式和tcp代理的负载均衡,在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡 + +# 端口白名单 +为了防止服务端上的端口被滥用,可在nps.conf中配置allow_ports限制可开启的端口,忽略或者不填表示端口不受限制,格式: + +```ini +allow_ports=9001-9009,10001,11000-12000 +``` + +# 端口范围映射 +当客户端以配置文件的方式启动时,可以将本地的端口进行范围映射,仅支持tcp和udp模式,例如: + +```ini +[tcp] +mode=tcp +server_port=9001-9009,10001,11000-12000 +target_port=8001-8009,10002,13000-14000 +``` + +逗号分隔,可单个或者范围,注意上下端口的对应关系,无法一一对应将不能成功 +# 端口范围映射到其他机器 +```ini +[tcp] +mode=tcp +server_port=9001-9009,10001,11000-12000 +target_port=8001-8009,10002,13000-14000 +target_ip=10.1.50.2 +``` +填写target_ip后则表示映射的该地址机器的端口,忽略则便是映射本地127.0.0.1,仅范围映射时有效 +# 守护进程 +本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux,darwin,windows。 +``` +./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数 +``` +``` +(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数 +``` +# KCP协议支持 + +KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,在弱网环境下对性能能有一定的提升。可在nps.conf中修改`bridge_type`为kcp +,设置后本代理将开启udp端口(`bridge_port`) + +注意:当服务端为kcp时,客户端连接时也需要使用相同配置,无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp + +# 域名泛解析 +支持域名泛解析,例如将host设置为*.proxy.com,a.proxy.com、b.proxy.com等都将解析到同一目标,在web管理中或客户端配置文件中将host设置为此格式即可。 + +# URL路由 +本代理支持根据URL将同一域名转发到不同的内网服务器,可在web中或客户端配置文件中设置,此参数也可忽略,例如在客户端配置文件中 + +```ini +[web1] +host=a.proxy.com +target_addr=127.0.0.1:7001 +location=/test +[web2] +host=a.proxy.com +target_addr=127.0.0.1:7002 +location=/static +``` +对于`a.proxy.com/test`将转发到`web1`,对于`a.proxy.com/static`将转发到`web2` + +# 限制ip访问 +如果将一些危险性高的端口例如ssh端口暴露在公网上,可能会带来一些风险,本代理支持限制ip访问。 + +**使用方法:** 在配置文件nps.conf中设置`ip_limit`=true,设置后仅通过注册的ip方可访问。 + +**ip注册**: + +**方式一:** +在需要访问的机器上,运行客户端 + +``` +./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2 +``` + +time为有效小时数,例如time=2,在当前时间后的两小时内,本机公网ip都可以访问nps代理. + +**方式二:** +此外nps的web登陆也可提供验证的功能,成功登陆nps web admin后将自动为登陆的ip注册两小时的允许访问权限。 + + +**注意:** 本机公网ip并不是一成不变的,请自行注意有效期的设置,同时同一网络下,多人也可能是在公用同一个公网ip。 +# 客户端最大连接数 +为防止恶意大量长连接,影响服务端程序的稳定性,可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对`socks5`、`http正向代理`、`域名代理`、`tcp代理`、`udp代理`、`私密代理`生效,使用该功能需要在`nps.conf`中设置`allow_connection_num_limit=true`,默认是关闭的。 + +# 客户端最大隧道数限制 +nps支持对客户端的隧道数量进行限制,该功能默认是关闭的,如需开启,请在`nps.conf`中设置`allow_tunnel_num_limit=true`。 +# 端口复用 +在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将`bridge_port`、 `http_proxy_port`、 `https_proxy_port` 、`web_port`都设置为同一端口,也能正常使用。 + +- 使用时将需要复用的端口设置为与`bridge_port`一致即可,将自动识别。 +- 如需将web管理的端口也复用,需要配置`web_host`也就是一个二级域名以便区分 + +# 多路复用 + +nps主要通信默认基于多路复用,无需开启。 + +多路复用基于TCP滑动窗口原理设计,动态计算延迟以及带宽来算出应该往网络管道中打入的流量。 +由于主要通信大多采用TCP协议,并无法探测其实时丢包情况,对于产生丢包重传的情况,采用较大的宽容度, +5分钟的等待时间,超时将会关闭当前隧道连接并重新建立,这将会抛弃当前所有的连接。 +在Linux上,可以通过调节内核参数来适应不同应用场景。 + +对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 +高并发下可根据[Linux系统限制](# Linux系统限制) 调整 + +对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 +`tcp_syn_retries`, `tcp_retries1`, `tcp_retries2` +高并发同上 +nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接 + +# 环境变量渲染 +npc支持环境变量渲染以适应在某些特殊场景下的要求。 + +**在无配置文件启动模式下:** +设置环境变量 +``` +export NPC_SERVER_ADDR=1.1.1.1:8284 +export NPC_SERVER_VKEY=xxxxx +``` +直接执行./npc即可运行 + +**在配置文件启动模式下:** +```ini +[common] +server_addr={{.NPC_SERVER_ADDR}} +conn_type=tcp +vkey={{.NPC_SERVER_VKEY}} +auto_reconnection=true +[web] +host={{.NPC_WEB_HOST}} +target_addr={{.NPC_WEB_TARGET}} +``` +在配置文件中填入相应的环境变量名称,npc将自动进行渲染配置文件替换环境变量 + +# 健康检查 + +当客户端以配置文件模式启动时,支持多节点的健康检查。配置示例如下 + +```ini +[health_check_test1] +health_check_timeout=1 +health_check_max_failed=3 +health_check_interval=1 +health_http_url=/ +health_check_type=http +health_check_target=127.0.0.1:8083,127.0.0.1:8082 + +[health_check_test2] +health_check_timeout=1 +health_check_max_failed=3 +health_check_interval=1 +health_check_type=tcp +health_check_target=127.0.0.1:8083,127.0.0.1:8082 +``` +**health关键词必须在开头存在** + +第一种是http模式,也就是以get的方式请求目标+url,返回状态码为200表示成功 + +第一种是tcp模式,也就是以tcp的方式与目标建立连接,能成功建立连接表示成功 + +如果失败次数超过`health_check_max_failed`,nps则会移除该npc下的所有该目标,如果失败后目标重新上线,nps将自动将目标重新加入。 + +项 | 含义 +---|--- +health_check_timeout | 健康检查超时时间 +health_check_max_failed | 健康检查允许失败次数 +health_check_interval | 健康检查间隔 +health_check_type | 健康检查类型 +health_check_target | 健康检查目标,多个以逗号(,)分隔 +health_check_type | 健康检查类型 +health_http_url | 健康检查url,仅http模式适用 + +# 日志输出 + +日志输出级别 + +**对于npc:** +``` +-log_level=0~7 -log_path=npc.log +``` +``` +LevelEmergency->0 LevelAlert->1 + +LevelCritical->2 LevelError->3 + +LevelWarning->4 LevelNotice->5 + +LevelInformational->6 LevelDebug->7 +``` +默认为全输出,级别为0到7 + +**对于nps:** + +在`nps.conf`中设置相关配置即可 diff --git a/docs/index.html b/docs/index.html index f48a914..c86cf55 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,21 +1,36 @@ - - Document - - - - + + Document + + + + -
    - - + + + + + + diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..83b081a --- /dev/null +++ b/docs/install.md @@ -0,0 +1,17 @@ +#release安装 +> [releases](https://github.com/cnlh/nps/releases) + +下载对应的系统版本即可,服务端和客户端是单独的 + +# 源码安装 +- 安装源码 +> go get -u github.com/cnlh/nps... +- 编译 +> go build cmd/nps/nps.go + + +> go build cmd/npc/npc.go + +# docker安装 +> [server](https://hub.docker.com/r/ffdfgdfg/nps) +> [client](https://hub.docker.com/r/ffdfgdfg/npc) diff --git a/docs/introduction.md b/docs/introduction.md new file mode 100644 index 0000000..0656246 --- /dev/null +++ b/docs/introduction.md @@ -0,0 +1,4 @@ +![image](https://github.com/cnlh/nps/blob/master/image/web2.png?raw=true) +# 介绍 + +可在网页上配置和管理各个tcp、udp隧道、内网站点代理,http、https解析等,功能强大,操作方便。 diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20df9d0e24533b524a62990bae56fc06d68225b3 GIT binary patch literal 889 zcmV-<1BU#GP)%*IolM9kg2&Q8B}7Qu+k!!S{OkFrnWG=_Rfo-KOp+Jii*03?&~55Y2+^a zz{nXylrcpih`NaAW229yshjTXJaM)bbK2NCC*0sXFgUz>K7POF_n!AWFQLediX1;o z0&A_Hseq|~&JLJcNM{3ehnouMZlTTurUE(}s5^X_0xicqqYyX2U9t~VXE&$c}6wJw&(Fdpl5UQVC58q{r$x6U! z2M*K%b=AN&2T)U)Q+cDE?#AX8Cap~aH&#o$f&@Ciwtm8{fm zaSx9s2ynpj0f4g*!KW~(u^1L-wSy~ZLY97%92qGip740V=qP0H8n#RV+L~;$`iTRl zKLWf-TR89CjNpuQRW4NB$?~0& z=AoW+hpfZgp}HiIy<32)vNa>)i_Oo6R8_fJ(me7e6GhJBbagr4-T{BlF&+mA7nog% zdH;XdzmLp@dHu7v>x>Gqv6P}HMHHp9 zh#K1xphls@BZH_(IcFD?urXLk?S64M!qh!hXMB$+gLCW5G5e z>QDE-*O1(M-Q(H?FWtns{-%mmXZ&32X?})Z>Q6oiO##@G0KksFcr|#JtJaG1&rvTo*bqEdb(#stf_zzUDT7K=oR<{BuYG|n|Jy) P00000NkvXXu0mjf+XS0= literal 0 HcmV?d00001 diff --git a/docs/logo.svg b/docs/logo.svg new file mode 100644 index 0000000..f53ae1f --- /dev/null +++ b/docs/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/npc_extend.md b/docs/npc_extend.md new file mode 100644 index 0000000..a757f34 --- /dev/null +++ b/docs/npc_extend.md @@ -0,0 +1,36 @@ + +# nat类型检测 +``` + ./npc nat +``` +如果p2p双方都是Symmetric Nat,肯定不能成功,其他组合都有较大成功率。 +# 状态检查 +``` + ./npc status -config=npc配置文件路径 +``` +# 重载配置文件 +``` + ./npc restart -config=npc配置文件路径 +``` + +# 通过代理连接nps +有时候运行npc的内网机器无法直接访问外网,此时可以可以通过socks5代理连接nps + +对于配置文件方式启动,设置 +```ini +[common] +proxy_url=socks5://111:222@127.0.0.1:8024 +``` +对于无配置文件模式,加上参数 + +``` +-proxy=socks5://111:222@127.0.0.1:8024 +``` +支持socks5和http两种模式 + +即socks5://username:password@ip:port + +或http://username:password@ip:port + +# 群晖支持 +可在releases中下载spk群晖套件,例如`npc_x64-6.1_0.19.0-1.spk` diff --git a/docs/nps_extend.md b/docs/nps_extend.md new file mode 100644 index 0000000..2b6d339 --- /dev/null +++ b/docs/nps_extend.md @@ -0,0 +1,129 @@ + +# 使用https + +**方式一:** 类似于nginx实现https的处理 + +在配置文件中将https_proxy_port设置为443或者其他你想配置的端口,和在web中对应域名编辑中设置对应的证书路径,将`https_just_proxy`设置为false,然后就和http代理一样了 + +**此外:** 可以在`nps.conf`中设置一个默认的https配置,当遇到未在web中设置https证书的域名解析时,将自动使用默认证书,另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息,nps也将自动使用默认证书 + + +**方式二:** 在内网对应服务器上设置https + +在`nps.conf`中将`https_just_proxy`设置为true,并且打开`https_proxy_port`端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理 + +# 与nginx配合 + +有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等,本代理可和nginx配合使用,在配置文件中将httpProxyPort设置为非80端口,并在nginx中配置代理,例如httpProxyPort为8024时 +``` +server { + listen 80; + server_name *.proxy.com; + location / { + proxy_set_header Host $http_host; + proxy_pass http://127.0.0.1:8024; + } +} +``` +如需使用https也可在nginx监听443端口并配置ssl,并将本代理的httpsProxyPort设置为空关闭https即可,例如httpProxyPort为8024时 + +``` +server { + listen 443; + server_name *.proxy.com; + ssl on; + ssl_certificate certificate.crt; + ssl_certificate_key private.key; + ssl_session_timeout 5m; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + location / { + proxy_set_header Host $http_host; + proxy_pass http://127.0.0.1:8024; + } +} +``` + +# web使用Caddy代理 + +如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. + +假设我们想通过 `http://caddy_ip:caddy_port/nps` 来访问后台, Caddyfile 这样配置: + +```Caddyfile +caddy_ip:caddy_port/nps { + #server_ip 为 nps 服务器IP + #web_port 为 nps 后台端口 + proxy / http://server_ip:web_port/nps { + transparent + } +} +``` + +nps.conf 修改 `web_base_url` 为 `/nps` 即可 +``` +web_base_url=/nps +``` + + +# 关闭代理 + +如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。 + +# 将nps安装到系统 +如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 + +``` +(./nps|nps.exe) install +``` +安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 + +``` +sudo systemctl enable|disable|start|stop|restart|status nps +``` +systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 +建议采用此方式启动,能够捕获panic信息,便于排查问题。 + +``` +nps test|start|stop|restart|status +``` +对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 + +``` +nps.exe test|start|stop|restart|status +``` + +# 流量数据持久化 +服务端支持将流量数据持久化,默认情况下是关闭的,如果有需求可以设置`nps.conf`中的`flow_store_interval`参数,单位为分钟 + +**注意:** nps不会持久化通过公钥连接的客户端 +# 系统信息显示 +nps服务端支持在web上显示和统计服务器的相关信息,但默认一些统计图表是关闭的,如需开启请在`nps.conf`中设置`system_info_display=true` + +# 自定义客户端连接密钥 +web上可以自定义客户端连接的密钥,但是必须具有唯一性 +# 关闭公钥访问 +可以将`nps.conf`中的`public_vkey`设置为空或者删除 + +# 关闭web管理 +可以将`nps.conf`中的`web_port`设置为空或者删除 + +# 服务端多用户登陆 +如果将`nps.conf`中的`allow_user_login`设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。 + +# 用户注册功能 +nps服务端支持用户注册功能,可将`nps.conf`中的`allow_user_register`设置为true,开启后登陆页将会有有注册功能, + +# 监听指定ip + +nps支持每个隧道监听不同的服务端端口,在`nps.conf`中设置`allow_multi_ip=true`后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0) +```ini +server_ip=xxx +``` +# 代理到服务端本地 +在使用nps监听80或者443端口时,默认是将所有的请求都会转发到内网上,但有时候我们的nps服务器的上一些服务也需要使用这两个端口,nps提供类似于`nginx` `proxy_pass` 的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。 + +**即:** 假设在nps的vps服务器上有一个服务使用5000端口,这时候nps占用了80端口和443,我们想能使用一个域名通过http(s)访问到5000的服务。 + +**使用方式:** 在`nps.conf`中设置`allow_local_proxy=true`,然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。 diff --git a/docs/server_config.md b/docs/server_config.md new file mode 100644 index 0000000..afa85c0 --- /dev/null +++ b/docs/server_config.md @@ -0,0 +1,21 @@ +# 服务端配置文件 +- /conf/nps.conf + +名称 | 含义 +---|--- +web_port | web管理端口 +web_password | web界面管理密码 +web_username | web界面管理账号 +web_base_url | web管理主路径,用于将web管理置于代理子路径后面 +bridge_port | 服务端客户端通信端口 +https_proxy_port | 域名代理https代理监听端口 +http_proxy_port | 域名代理http代理监听端口 +auth_key|web api密钥 +bridge_type|客户端与服务端连接方式kcp或tcp +public_vkey|客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 +ip_limit|是否限制ip访问,true或false或忽略 +flow_store_interval|服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 +log_level|日志输出级别 +auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 +p2p_ip| 服务端Ip,使用p2p模式必填 +p2p_port|p2p模式开启的udp端口 diff --git a/docs/start.md b/docs/start.md new file mode 100644 index 0000000..fc82d13 --- /dev/null +++ b/docs/start.md @@ -0,0 +1,33 @@ +**提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** + + +# 服务端测试 +```shell + ./nps test +``` +如有错误请及时修改配置文件,无错误可继续进行下去 +# 服务端启动 +```shell + ./nps start +``` +**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** + +# web管理 + +进入web界面,公网ip:web界面端口(默认8080),密码默认为123 + +进入web管理界面,有详细的说明 + +# 服务端配置文件重载 +如果是daemon启动 +```shell + ./nps reload +``` +**说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 + + +# 服务端停止或重启 +如果是daemon启动 +```shell + ./nps stop|restart +``` diff --git a/docs/thanks.md b/docs/thanks.md new file mode 100644 index 0000000..a2cbe1e --- /dev/null +++ b/docs/thanks.md @@ -0,0 +1,5 @@ +Thanks [jetbrains](https://www.jetbrains.com/?from=nps) for providing development tools for nps + + + + diff --git a/docs/use.md b/docs/use.md new file mode 100644 index 0000000..cb4f88f --- /dev/null +++ b/docs/use.md @@ -0,0 +1,207 @@ +# 无配置文件模式 +此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 +``` + ./npc -server=ip:port -vkey=web界面中显示的密钥 +``` +# 配置文件模式 +此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 +``` + ./npc -config=npc配置文件路径 +``` +可自行添加systemd service,例如:`npc.service` +``` +[Unit] +Description=npc - convenient proxy server client +Documentation=https://github.com/cnlh/nps/ +After=network-online.target remote-fs.target nss-lookup.target +Wants=network-online.target + +[Service] +Type=simple +KillMode=process +Restart=always +RestartSec=15s +StandardOutput=append:/var/log/nps/npc.log +ExecStartPre=/bin/echo 'Starting npc' +ExecStopPost=/bin/echo 'Stopping npc' +ExecStart=/absolutely path to/npc -server=ip:port -vkey=web界面中显示的密钥 + +[Install] +WantedBy=multi-user.target +``` +# 配置文件说明 +[示例配置文件](https://github.com/cnlh/nps/tree/master/conf/npc.conf) +## 全局配置 +```ini +[common] +server_addr=1.1.1.1:8284 +conn_type=tcp +vkey=123 +username=111 +password=222 +compress=true +crypt=true +rate_limit=10000 +flow_limit=100 +remark=test +max_conn=10 +``` +项 | 含义 +---|--- +server_addr | 服务端ip:port +conn_type | 与服务端通信模式(tcp或kcp) +vkey|服务端配置文件中的密钥(非web) +username|socks5或http(s)密码保护用户名(可忽略) +password|socks5或http(s)密码保护密码(可忽略) +compress|是否压缩传输(true或false或忽略) +crypt|是否加密传输(true或false或忽略) +rate_limit|速度限制,可忽略 +flow_limit|流量限制,可忽略 +remark|客户端备注,可忽略 +max_conn|最大连接数,可忽略 +## 域名代理 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[web1] +host=a.proxy.com +target_addr=127.0.0.1:8080,127.0.0.1:8082 +host_change=www.proxy.com +header_set_proxy=nps +``` +项 | 含义 +---|--- +web1 | 备注 +host | 域名(http|https都可解析) +target_addr|内网目标,负载均衡时多个目标,逗号隔开 +host_change|请求host修改 +header_xxx|请求header修改或添加,header_proxy表示添加header proxy:nps + +## tcp隧道模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[tcp] +mode=tcp +target_addr=127.0.0.1:8080 +server_port=9001 +``` +项 | 含义 +---|--- +mode | tcp +server_port | 在服务端的代理端口 +tartget_addr|内网目标 + +## udp隧道模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[udp] +mode=udp +target_addr=127.0.0.1:8080 +server_port=9002 +``` +项 | 含义 +---|--- +mode | udp +server_port | 在服务端的代理端口 +target_addr|内网目标 +## http代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[http] +mode=httpProxy +server_port=9003 +``` +项 | 含义 +---|--- +mode | httpProxy +server_port | 在服务端的代理端口 +## socks5代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[socks5] +mode=socks5 +server_port=9004 +multi_account=multi_account.conf +``` +项 | 含义 +---|--- +mode | socks5 +server_port | 在服务端的代理端口 +multi_account | socks5多账号配置文件(可选),配置后使用basic_username和basic_password无法通过认证 +## 私密代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[secret_ssh] +mode=secret +password=ssh2 +target_addr=10.1.50.2:22 +``` +项 | 含义 +---|--- +mode | secret +password | 唯一密钥 +target_addr|内网目标 + +## p2p代理模式 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[p2p_ssh] +mode=p2p +password=ssh2 +target_addr=10.1.50.2:22 +``` +项 | 含义 +---|--- +mode | p2p +password | 唯一密钥 +target_addr|内网目标 + + +## 文件访问模式 +利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动 + +```ini +[common] +server_addr=1.1.1.1:8284 +vkey=123 +[file] +mode=file +server_port=9100 +local_path=/tmp/ +strip_pre=/web/ +```` + +项 | 含义 +---|--- +mode | file +server_port | 服务端开启的端口 +local_path|本地文件目录 +strip_pre|前缀 + +对于`strip_pre`,访问公网`ip:9100/web/`相当于访问`/tmp/`目录 + +## 断线重连 +```ini +[common] +auto_reconnection=true +``` From cf9644e902913ceb7a078673d31a82319e954aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 13 Dec 2019 00:08:20 +0800 Subject: [PATCH 083/171] change md --- README.md | 938 +----------------------------------------------------- 1 file changed, 15 insertions(+), 923 deletions(-) diff --git a/README.md b/README.md index 4e96f7e..6bc709e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 1. 做微信公众号开发、小程序开发等----> 域名代理模式 - 2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式 3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式 @@ -21,935 +20,28 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 -## 安装 +## 快速开始 -### release安装 +### 安装 > [releases](https://github.com/cnlh/nps/releases) 下载对应的系统版本即可,服务端和客户端是单独的 -### 源码安装 -- 安装源码 -> go get -u github.com/cnlh/nps... -- 编译 -> go build cmd/nps/nps.go - -> go build cmd/npc/npc.go - -### docker安装 -> [server](https://hub.docker.com/r/ffdfgdfg/nps) -> [client](https://hub.docker.com/r/ffdfgdfg/npc) - -## 使用示例 - -### 统一准备工作(必做) -- 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中`bridge_port`为8284,配置文件中`web_port`为8080 -- 访问1.1.1.1:8080 -- 在客户端管理中创建一个客户端,记录下验证密钥 -- 内网客户端运行(windows使用cmd运行加.exe) +### 服务端启动 +- 进入服务端启动 ```shell -./npc -server=1.1.1.1:8284 -vkey=客户端的密钥 + ./nps ``` -**注意:运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的`bridge_port`端口,telnet,netcat这类的来检查** +如有错误修改配置文件相应端口,无错误可继续进行下去 +- 进入WEB管理 +- 访问服务端ip:web服务端口(默认为8024) +- 在web中创建客户端 -### 域名解析 +### 客户端连接 +- 点击web管理中客户端前的+号,复制启动命令 +- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 -**适用范围:** 小程序开发、微信公众号开发、产品演示 - -**假设场景:** -- 有一个域名proxy.com,有一台公网机器ip为1.1.1.1 -- 两个内网开发站点127.0.0.1:81,127.0.0.1:82 -- 想通过(http|https://)a.proxy.com访问127.0.0.1:81,通过(http|https://)b.proxy.com访问127.0.0.1:82 - -**使用步骤** -- 将*.proxy.com解析到公网服务器1.1.1.1 -- 点击刚才创建的客户端的域名管理,添加两条规则规则:1、域名:`a.proxy.com`,内网目标:`127.0.0.1:81`,2、域名:`b.proxy.com`,内网目标:`127.0.0.1:82` - -现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 - -**https:** 如需使用https请进行相关配置,详见 [使用https](#使用https) - -### tcp隧道 - - -**适用范围:** ssh、远程桌面等tcp连接场景 - -**假设场景:** - 想通过访问公网服务器1.1.1.1的8001端口,连接内网机器10.1.50.101的22端口,实现ssh连接 - -**使用步骤** -- 在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),保存。 -- 访问公网服务器ip(1.1.1.1),填写的监听端口(8001),相当于访问内网ip(10.1.50.101):目标端口(22),例如:`ssh -p 8001 root@1.1.1.1` - -### udp隧道 - -**适用范围:** 内网dns解析等udp连接场景 - -**假设场景:** -内网有一台dns(10.1.50.102:53),在非内网环境下想使用该dns,公网服务器为1.1.1.1 - -**使用步骤** -- 在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。 -- 修改需要使用的dns地址为1.1.1.1,则相当于使用10.1.50.102作为dns服务器 - -### socks5代理 - - -**适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 - -**假设场景:** -想将公网服务器1.1.1.1的8003端口作为socks5代理,达到访问内网任意设备或者资源的效果 - -**使用步骤** -- 在刚才创建的客户端隧道管理中添加一条socks5代理,填写监听的端口(8003),保存。 -- 在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理),ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8003),即可畅享内网了 - -**注意** -经过socks5代理,当收到socks5数据包时socket已经是accept状态。表现是扫描端口全open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。 - -### http正向代理 - -**适用范围:** 在外网环境下使用http正向代理访问内网站点 - -**假设场景:** -想将公网服务器1.1.1.1的8004端口作为http代理,访问内网网站 - -**使用步骤** - -- 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。 -- 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了 - -### 私密代理 - -**适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。 - -**假设场景:** -无需新增多的端口实现访问内网服务器10.1.50.2的22端口 - -**使用步骤** -- 在刚才创建的客户端中添加一条私密代理,并设置唯一密钥secrettest和内网目标10.1.50.2:22 -- 在需要连接ssh的机器上以执行命令 - -``` -./npc -server=1.1.1.1:8284 -vkey=vkey -type=tcp -password=secrettest -local_type=secret -``` -如需指定本地端口可加参数`-local_port=xx`,默认为2000 - -**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 - -假设10.1.50.2用户名为root,现在执行`ssh -p 2000 root@1.1.1.1`即可访问ssh - - -### p2p服务 - -**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](#nat类型检测) - -**假设场景:** - -想通过访问使用端机器(访问端,也就是本机)的2000端口---->访问到内网机器 10.2.50.2的22端口 - -**使用步骤** -- 在`nps.conf`中设置`p2p_ip`(nps服务器ip)和`p2p_port`(nps服务器udp端口) -- 在刚才刚才创建的客户端中添加一条p2p代理,并设置唯一密钥p2pssh -- 在使用端机器(本机)执行命令 - -``` -./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.2:22 -``` -如需指定本地端口可加参数`-local_port=xx`,默认为2000 - -**注意:** password为web管理上添加的唯一密钥,具体命令可查看web管理上的命令提示 - -假设内网机器为10.2.50.2的ssh用户名为root,现在在本机上执行`ssh -p 2000 root@127.0.0.1`即可访问机器2的ssh,如果是网站在浏览器访问127.0.0.1:2000端口即可。 - - - -## web管理 - -![image](https://github.com/cnlh/nps/blob/master/image/web2.png?raw=true) -### 介绍 - -可在网页上配置和管理各个tcp、udp隧道、内网站点代理,http、https解析等,功能强大,操作方便。 - - -**提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** - -### 启动 - - -#### 服务端测试 -```shell - ./nps test -``` -如有错误请及时修改配置文件,无错误可继续进行下去 -#### 服务端启动 -```shell - ./nps start -``` -**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** - -#### web管理 - -进入web界面,公网ip:web界面端口(默认8080),密码默认为123 - -进入web管理界面,有详细的说明 - -#### 服务端配置文件重载 -如果是daemon启动 -```shell - ./nps reload -``` -**说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 - - -#### 服务端停止或重启 -如果是daemon启动 -```shell - ./nps stop|restart -``` - -### 服务端配置文件 -- /conf/nps.conf - -名称 | 含义 ----|--- -web_port | web管理端口 -web_password | web界面管理密码 -web_username | web界面管理账号 -web_base_url | web管理主路径,用于将web管理置于代理子路径后面 -bridge_port | 服务端客户端通信端口 -https_proxy_port | 域名代理https代理监听端口 -http_proxy_port | 域名代理http代理监听端口 -auth_key|web api密钥 -bridge_type|客户端与服务端连接方式kcp或tcp -public_vkey|客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 -ip_limit|是否限制ip访问,true或false或忽略 -flow_store_interval|服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 -log_level|日志输出级别 -auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 -p2p_ip| 服务端Ip,使用p2p模式必填 -p2p_port|p2p模式开启的udp端口 - -### 使用https - -**方式一:** 类似于nginx实现https的处理 - -在配置文件中将https_proxy_port设置为443或者其他你想配置的端口,和在web中对应域名编辑中设置对应的证书路径,将`https_just_proxy`设置为false,然后就和http代理一样了 - -**此外:** 可以在`nps.conf`中设置一个默认的https配置,当遇到未在web中设置https证书的域名解析时,将自动使用默认证书,另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息,nps也将自动使用默认证书 - - -**方式二:** 在内网对应服务器上设置https - -在`nps.conf`中将`https_just_proxy`设置为true,并且打开`https_proxy_port`端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理 - -### 与nginx配合 - -有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等,本代理可和nginx配合使用,在配置文件中将httpProxyPort设置为非80端口,并在nginx中配置代理,例如httpProxyPort为8024时 -``` -server { - listen 80; - server_name *.proxy.com; - location / { - proxy_set_header Host $http_host; - proxy_pass http://127.0.0.1:8024; - } -} -``` -如需使用https也可在nginx监听443端口并配置ssl,并将本代理的httpsProxyPort设置为空关闭https即可,例如httpProxyPort为8024时 - -``` -server { - listen 443; - server_name *.proxy.com; - ssl on; - ssl_certificate certificate.crt; - ssl_certificate_key private.key; - ssl_session_timeout 5m; - ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - location / { - proxy_set_header Host $http_host; - proxy_pass http://127.0.0.1:8024; - } -} -``` - -### web使用Caddy代理 - -如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. - -假设我们想通过 `http://caddy_ip:caddy_port/nps` 来访问后台, Caddyfile 这样配置: - -```Caddyfile -caddy_ip:caddy_port/nps { - #server_ip 为 nps 服务器IP - #web_port 为 nps 后台端口 - proxy / http://server_ip:web_port/nps { - transparent - } -} -``` - -nps.conf 修改 `web_base_url` 为 `/nps` 即可 -``` -web_base_url=/nps -``` - - -### 关闭代理 - -如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。 - -### 将nps安装到系统 -如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 - -``` -(./nps|nps.exe) install -``` -安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 - -``` -sudo systemctl enable|disable|start|stop|restart|status nps -``` -systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 -建议采用此方式启动,能够捕获panic信息,便于排查问题。 - -``` -nps test|start|stop|restart|status -``` -对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 - -``` -nps.exe test|start|stop|restart|status -``` - -### 流量数据持久化 -服务端支持将流量数据持久化,默认情况下是关闭的,如果有需求可以设置`nps.conf`中的`flow_store_interval`参数,单位为分钟 - -**注意:** nps不会持久化通过公钥连接的客户端 -### 系统信息显示 -nps服务端支持在web上显示和统计服务器的相关信息,但默认一些统计图表是关闭的,如需开启请在`nps.conf`中设置`system_info_display=true` - -### 自定义客户端连接密钥 -web上可以自定义客户端连接的密钥,但是必须具有唯一性 -### 关闭公钥访问 -可以将`nps.conf`中的`public_vkey`设置为空或者删除 - -### 关闭web管理 -可以将`nps.conf`中的`web_port`设置为空或者删除 - -### 服务端多用户登陆 -如果将`nps.conf`中的`allow_user_login`设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。 - -### 用户注册功能 -nps服务端支持用户注册功能,可将`nps.conf`中的`allow_user_register`设置为true,开启后登陆页将会有有注册功能, - -### 监听指定ip - -nps支持每个隧道监听不同的服务端端口,在`nps.conf`中设置`allow_multi_ip=true`后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0) -```ini -server_ip=xxx -``` -### 代理到服务端本地 -在使用nps监听80或者443端口时,默认是将所有的请求都会转发到内网上,但有时候我们的nps服务器的上一些服务也需要使用这两个端口,nps提供类似于`nginx` `proxy_pass` 的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。 - -**即:** 假设在nps的vps服务器上有一个服务使用5000端口,这时候nps占用了80端口和443,我们想能使用一个域名通过http(s)访问到5000的服务。 - -**使用方式:** 在`nps.conf`中设置`allow_local_proxy=true`,然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。 -## 客户端 - -### 客户端启动 -#### 无配置文件模式 -此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 -``` - ./npc -server=ip:port -vkey=web界面中显示的密钥 -``` -#### 配置文件模式 -此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 -``` - ./npc -config=npc配置文件路径 -``` -可自行添加systemd service,例如:`npc.service` -``` -[Unit] -Description=npc - convenient proxy server client -Documentation=https://github.com/cnlh/nps/ -After=network-online.target remote-fs.target nss-lookup.target -Wants=network-online.target - -[Service] -Type=simple -KillMode=process -Restart=always -RestartSec=15s -StandardOutput=append:/var/log/nps/npc.log -ExecStartPre=/bin/echo 'Starting npc' -ExecStopPost=/bin/echo 'Stopping npc' -ExecStart=/absolutely path to/npc -server=ip:port -vkey=web界面中显示的密钥 - -[Install] -WantedBy=multi-user.target -``` -#### 配置文件说明 -[示例配置文件](https://github.com/cnlh/nps/tree/master/conf/npc.conf) -##### 全局配置 -```ini -[common] -server_addr=1.1.1.1:8284 -conn_type=tcp -vkey=123 -username=111 -password=222 -compress=true -crypt=true -rate_limit=10000 -flow_limit=100 -remark=test -max_conn=10 -``` -项 | 含义 ----|--- -server_addr | 服务端ip:port -conn_type | 与服务端通信模式(tcp或kcp) -vkey|服务端配置文件中的密钥(非web) -username|socks5或http(s)密码保护用户名(可忽略) -password|socks5或http(s)密码保护密码(可忽略) -compress|是否压缩传输(true或false或忽略) -crypt|是否加密传输(true或false或忽略) -rate_limit|速度限制,可忽略 -flow_limit|流量限制,可忽略 -remark|客户端备注,可忽略 -max_conn|最大连接数,可忽略 -##### 域名代理 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[web1] -host=a.proxy.com -target_addr=127.0.0.1:8080,127.0.0.1:8082 -host_change=www.proxy.com -header_set_proxy=nps -``` -项 | 含义 ----|--- -web1 | 备注 -host | 域名(http|https都可解析) -target_addr|内网目标,负载均衡时多个目标,逗号隔开 -host_change|请求host修改 -header_xxx|请求header修改或添加,header_proxy表示添加header proxy:nps - -##### tcp隧道模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[tcp] -mode=tcp -target_addr=127.0.0.1:8080 -server_port=9001 -``` -项 | 含义 ----|--- -mode | tcp -server_port | 在服务端的代理端口 -tartget_addr|内网目标 - -##### udp隧道模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[udp] -mode=udp -target_addr=127.0.0.1:8080 -server_port=9002 -``` -项 | 含义 ----|--- -mode | udp -server_port | 在服务端的代理端口 -target_addr|内网目标 -##### http代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[http] -mode=httpProxy -server_port=9003 -``` -项 | 含义 ----|--- -mode | httpProxy -server_port | 在服务端的代理端口 -##### socks5代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[socks5] -mode=socks5 -server_port=9004 -multi_account=multi_account.conf -``` -项 | 含义 ----|--- -mode | socks5 -server_port | 在服务端的代理端口 -multi_account | socks5多账号配置文件(可选),配置后使用basic_username和basic_password无法通过认证 -##### 私密代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[secret_ssh] -mode=secret -password=ssh2 -target_addr=10.1.50.2:22 -``` -项 | 含义 ----|--- -mode | secret -password | 唯一密钥 -target_addr|内网目标 - -##### p2p代理模式 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[p2p_ssh] -mode=p2p -password=ssh2 -target_addr=10.1.50.2:22 -``` -项 | 含义 ----|--- -mode | p2p -password | 唯一密钥 -target_addr|内网目标 - - -##### 文件访问模式 -利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动 - -```ini -[common] -server_addr=1.1.1.1:8284 -vkey=123 -[file] -mode=file -server_port=9100 -local_path=/tmp/ -strip_pre=/web/ -```` - -项 | 含义 ----|--- -mode | file -server_port | 服务端开启的端口 -local_path|本地文件目录 -strip_pre|前缀 - -对于`strip_pre`,访问公网`ip:9100/web/`相当于访问`/tmp/`目录 - -#### 断线重连 -```ini -[common] -auto_reconnection=true -``` -#### nat类型检测 -``` - ./npc nat -``` -如果p2p双方都是Symmetric Nat,肯定不能成功,其他组合都有较大成功率。 -#### 状态检查 -``` - ./npc status -config=npc配置文件路径 -``` -#### 重载配置文件 -``` - ./npc restart -config=npc配置文件路径 -``` - -#### 通过代理连接nps -有时候运行npc的内网机器无法直接访问外网,此时可以可以通过socks5代理连接nps - -对于配置文件方式启动,设置 -```ini -[common] -proxy_url=socks5://111:222@127.0.0.1:8024 -``` -对于无配置文件模式,加上参数 - -``` --proxy=socks5://111:222@127.0.0.1:8024 -``` -支持socks5和http两种模式 - -即socks5://username:password@ip:port - -或http://username:password@ip:port - -#### 群晖支持 -可在releases中下载spk群晖套件,例如`npc_x64-6.1_0.19.0-1.spk` -## 相关功能 - -### 缓存支持 -对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。 - -即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在`nps.conf`中设置`http_cache=true`,并设置`http_cache_length`(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数) - -### 数据压缩支持 - -由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。 - - -- 所有模式均支持数据压缩 -- 在web管理或客户端配置文件中设置 - - -### 加密传输 - -如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。 -- nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成 -- 在web管理或客户端配置文件中设置 - - - -### 站点保护 -域名代理模式所有客户端共用一个http服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps将通过 Http Basic Auth 来保护,访问时需要输入正确的用户名和密码。 - - -- 在web管理或客户端配置文件中设置 - -### host修改 - -由于内网站点需要的host可能与公网域名不一致,域名代理支持host修改功能,即修改request的header中的host字段。 - -**使用方法:在web管理中设置** - -### 自定义header - -支持对header进行新增或者修改,以配合服务的需要 - -### 404页面配置 -支持域名解析模式的自定义404页面,修改/web/static/page/error.html中内容即可,暂不支持静态文件等内容 - -### 流量限制 - -支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务 -,域名代理会返回404页面,其他代理会拒绝连接,使用该功能需要在`nps.conf`中设置`allow_flow_limit`,默认是关闭的。 - -### 带宽限制 - -支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡,使用该功能需要在`nps.conf`中设置`allow_rate_limit`,默认是关闭的。 - -### 负载均衡 -本代理支持域名解析模式和tcp代理的负载均衡,在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡 - -### 端口白名单 -为了防止服务端上的端口被滥用,可在nps.conf中配置allow_ports限制可开启的端口,忽略或者不填表示端口不受限制,格式: - -```ini -allow_ports=9001-9009,10001,11000-12000 -``` - -### 端口范围映射 -当客户端以配置文件的方式启动时,可以将本地的端口进行范围映射,仅支持tcp和udp模式,例如: - -```ini -[tcp] -mode=tcp -server_port=9001-9009,10001,11000-12000 -target_port=8001-8009,10002,13000-14000 -``` - -逗号分隔,可单个或者范围,注意上下端口的对应关系,无法一一对应将不能成功 -### 端口范围映射到其他机器 -```ini -[tcp] -mode=tcp -server_port=9001-9009,10001,11000-12000 -target_port=8001-8009,10002,13000-14000 -target_ip=10.1.50.2 -``` -填写target_ip后则表示映射的该地址机器的端口,忽略则便是映射本地127.0.0.1,仅范围映射时有效 -### 守护进程 -本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux,darwin,windows。 -``` -./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数 -``` -``` -(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数 -``` -### KCP协议支持 - -KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,在弱网环境下对性能能有一定的提升。可在nps.conf中修改`bridge_type`为kcp -,设置后本代理将开启udp端口(`bridge_port`) - -注意:当服务端为kcp时,客户端连接时也需要使用相同配置,无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp - -### 域名泛解析 -支持域名泛解析,例如将host设置为*.proxy.com,a.proxy.com、b.proxy.com等都将解析到同一目标,在web管理中或客户端配置文件中将host设置为此格式即可。 - -### URL路由 -本代理支持根据URL将同一域名转发到不同的内网服务器,可在web中或客户端配置文件中设置,此参数也可忽略,例如在客户端配置文件中 - -```ini -[web1] -host=a.proxy.com -target_addr=127.0.0.1:7001 -location=/test -[web2] -host=a.proxy.com -target_addr=127.0.0.1:7002 -location=/static -``` -对于`a.proxy.com/test`将转发到`web1`,对于`a.proxy.com/static`将转发到`web2` - -### 限制ip访问 -如果将一些危险性高的端口例如ssh端口暴露在公网上,可能会带来一些风险,本代理支持限制ip访问。 - -**使用方法:** 在配置文件nps.conf中设置`ip_limit`=true,设置后仅通过注册的ip方可访问。 - -**ip注册**: - -**方式一:** -在需要访问的机器上,运行客户端 - -``` -./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2 -``` - -time为有效小时数,例如time=2,在当前时间后的两小时内,本机公网ip都可以访问nps代理. - -**方式二:** -此外nps的web登陆也可提供验证的功能,成功登陆nps web admin后将自动为登陆的ip注册两小时的允许访问权限。 - - -**注意:** 本机公网ip并不是一成不变的,请自行注意有效期的设置,同时同一网络下,多人也可能是在公用同一个公网ip。 -### 客户端最大连接数 -为防止恶意大量长连接,影响服务端程序的稳定性,可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对`socks5`、`http正向代理`、`域名代理`、`tcp代理`、`udp代理`、`私密代理`生效,使用该功能需要在`nps.conf`中设置`allow_connection_num_limit=true`,默认是关闭的。 - -### 客户端最大隧道数限制 -nps支持对客户端的隧道数量进行限制,该功能默认是关闭的,如需开启,请在`nps.conf`中设置`allow_tunnel_num_limit=true`。 -### 端口复用 -在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将`bridge_port`、 `http_proxy_port`、 `https_proxy_port` 、`web_port`都设置为同一端口,也能正常使用。 - -- 使用时将需要复用的端口设置为与`bridge_port`一致即可,将自动识别。 -- 如需将web管理的端口也复用,需要配置`web_host`也就是一个二级域名以便区分 - -### 多路复用 - -nps主要通信默认基于多路复用,无需开启。 - -多路复用基于TCP滑动窗口原理设计,动态计算延迟以及带宽来算出应该往网络管道中打入的流量。 -由于主要通信大多采用TCP协议,并无法探测其实时丢包情况,对于产生丢包重传的情况,采用较大的宽容度, -5分钟的等待时间,超时将会关闭当前隧道连接并重新建立,这将会抛弃当前所有的连接。 -在Linux上,可以通过调节内核参数来适应不同应用场景。 - -对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 -高并发下可根据[Linux系统限制](#Linux系统限制) 调整 - -对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 -`tcp_syn_retries`, `tcp_retries1`, `tcp_retries2` -高并发同上 -nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接 - -### 环境变量渲染 -npc支持环境变量渲染以适应在某些特殊场景下的要求。 - -**在无配置文件启动模式下:** -设置环境变量 -``` -export NPC_SERVER_ADDR=1.1.1.1:8284 -export NPC_SERVER_VKEY=xxxxx -``` -直接执行./npc即可运行 - -**在配置文件启动模式下:** -```ini -[common] -server_addr={{.NPC_SERVER_ADDR}} -conn_type=tcp -vkey={{.NPC_SERVER_VKEY}} -auto_reconnection=true -[web] -host={{.NPC_WEB_HOST}} -target_addr={{.NPC_WEB_TARGET}} -``` -在配置文件中填入相应的环境变量名称,npc将自动进行渲染配置文件替换环境变量 - -### 健康检查 - -当客户端以配置文件模式启动时,支持多节点的健康检查。配置示例如下 - -```ini -[health_check_test1] -health_check_timeout=1 -health_check_max_failed=3 -health_check_interval=1 -health_http_url=/ -health_check_type=http -health_check_target=127.0.0.1:8083,127.0.0.1:8082 - -[health_check_test2] -health_check_timeout=1 -health_check_max_failed=3 -health_check_interval=1 -health_check_type=tcp -health_check_target=127.0.0.1:8083,127.0.0.1:8082 -``` -**health关键词必须在开头存在** - -第一种是http模式,也就是以get的方式请求目标+url,返回状态码为200表示成功 - -第一种是tcp模式,也就是以tcp的方式与目标建立连接,能成功建立连接表示成功 - -如果失败次数超过`health_check_max_failed`,nps则会移除该npc下的所有该目标,如果失败后目标重新上线,nps将自动将目标重新加入。 - -项 | 含义 ----|--- -health_check_timeout | 健康检查超时时间 -health_check_max_failed | 健康检查允许失败次数 -health_check_interval | 健康检查间隔 -health_check_type | 健康检查类型 -health_check_target | 健康检查目标,多个以逗号(,)分隔 -health_check_type | 健康检查类型 -health_http_url | 健康检查url,仅http模式适用 - -### 日志输出 - -#### 日志输出级别 - -**对于npc:** -``` --log_level=0~7 -log_path=npc.log -``` -``` -LevelEmergency->0 LevelAlert->1 - -LevelCritical->2 LevelError->3 - -LevelWarning->4 LevelNotice->5 - -LevelInformational->6 LevelDebug->7 -``` -默认为全输出,级别为0到7 - -**对于nps:** - -在`nps.conf`中设置相关配置即可 - -## 相关说明 - -### 获取用户真实ip - -在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。 - -**本代理前会在每一个http(s)请求中添加了这两个 header。** - -### 热更新支持 -对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端 - -### 客户端地址显示 -在web管理中将显示客户端的连接地址 - -### 流量统计 -可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异 - -### 当前客户端带宽 -可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。 - -### 客户端与服务端版本对比 -为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。 - -### Linux系统限制 -默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 -`tcp_max_syn_backlog` `somaxconn` -酌情调整参数,增强网络性能 - -## webAPI - -### webAPI验证说明 -- 采用auth_key的验证方式 -- 在提交的每个请求后面附带两个参数,`auth_key` 和`timestamp` - -``` -auth_key的生成方式为:md5(配置文件中的auth_key+当前时间戳) -``` - -``` -timestamp为当前时间戳 -``` -``` -curl --request POST \ - --url http://127.0.0.1:8080/client/list \ - --data 'auth_key=2a0000d9229e7dbcf79dd0f5e04bb084×tamp=1553045344&start=0&limit=10' -``` -**注意:** 为保证安全,时间戳的有效范围为20秒内,所以每次提交请求必须重新生成。 - -### 获取服务端时间 -由于服务端与api请求的客户端时间差异不能太大,所以提供了一个可以获取服务端时间的接口 - -``` -POST /auth/gettime -``` - -### 获取服务端authKey - -如果想获取authKey,服务端提供获取authKey的接口 - -``` -POST /auth/getauthkey -``` -将返回加密后的authKey,采用aes cbc加密,请使用与服务端配置文件中cryptKey相同的密钥进行解密 - -**注意:** nps配置文件中`auth_crypt_key`需为16位 -- 解密密钥长度128 -- 偏移量与密钥相同 -- 补码方式pkcs5padding -- 解密串编码方式 十六进制 - -### 详细文档 -- **此文档近期可能更新较慢,建议自行抓包** - -为方便第三方扩展,在web模式下可利用webAPI进行相关操作,详情见 -[webAPI文档](https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3) - -## 贡献 -**欢迎参与到制作docker、图标、文档翻译等工作** -- 如果遇到bug可以直接提交至dev分支 -- 使用遇到问题可以通过issues反馈 -- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 -- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 - -## 捐助 -如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 -## 致谢 -Thanks [jetbrains](https://www.jetbrains.com/?from=nps) for providing development tools for nps - - - - - - -### 支付宝 -![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) -### 微信 -![image](https://github.com/cnlh/nps/blob/master/image/donation_wx.png?raw=true) -## 交流群 - -![二维码.jpeg](https://i.loli.net/2019/02/15/5c66c32a42074.jpeg) +### 配置 +- 客户端连接后,在web中配置对应穿透服务即可 +- 更多高级用法见[完整文档](https://cnlh.github.io/nps/) From 40c6f014be198169b2e49f7d4789a4765010be85 Mon Sep 17 00:00:00 2001 From: he liu Date: Fri, 13 Dec 2019 00:15:10 +0800 Subject: [PATCH 084/171] Update _coverpage.md --- docs/_coverpage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 53d5a88..f2e8da3 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -11,4 +11,4 @@ [GitHub](https://github.com/cnlh/nps/) -[开始使用](#docsify) +[开始使用](#install) From a1482b15d4cedceb631801108b9336e8c97cb904 Mon Sep 17 00:00:00 2001 From: he liu Date: Fri, 13 Dec 2019 00:18:50 +0800 Subject: [PATCH 085/171] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6bc709e..f8556ec 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 ./nps ``` 如有错误修改配置文件相应端口,无错误可继续进行下去 -- 进入WEB管理 - 访问服务端ip:web服务端口(默认为8024) - 在web中创建客户端 From 347d59ec8dba927158718a2a024aa87b7d7eefe5 Mon Sep 17 00:00:00 2001 From: he liu Date: Fri, 13 Dec 2019 06:10:06 +0800 Subject: [PATCH 086/171] Update _coverpage.md --- docs/_coverpage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_coverpage.md b/docs/_coverpage.md index f2e8da3..f74428e 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -11,4 +11,4 @@ [GitHub](https://github.com/cnlh/nps/) -[开始使用](#install) +[开始使用](#nps) From c759ceff4993317ae0b0809fdd924ff2e4e06090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 13 Dec 2019 08:57:00 +0800 Subject: [PATCH 087/171] cahnge md --- README.md | 19 +++++++++------ docs/_coverpage.md | 2 +- docs/_sidebar.md | 3 ++- docs/api.md | 10 ++++---- docs/contribute.md | 2 +- docs/description.md | 15 ++++++------ docs/donate.md | 6 +++-- docs/example.md | 21 +++++++++-------- docs/feature.md | 54 +++++++++++++++++++++--------------------- docs/install.md | 16 +++++++------ docs/npc_extend.md | 12 +++++----- docs/nps_extend.md | 55 +++++++++++++------------------------------ docs/nps_use.md | 57 +++++++++++++++++++++++++++++++++++++++++++++ docs/run.md | 20 ++++++++++++++++ docs/start.md | 33 -------------------------- docs/use.md | 27 ++++++++++----------- 16 files changed, 193 insertions(+), 159 deletions(-) create mode 100644 docs/nps_use.md create mode 100644 docs/run.md delete mode 100644 docs/start.md diff --git a/README.md b/README.md index 6bc709e..d181930 100644 --- a/README.md +++ b/README.md @@ -27,21 +27,26 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 下载对应的系统版本即可,服务端和客户端是单独的 - ### 服务端启动 -- 进入服务端启动 +1. 进入服务端启动 ```shell ./nps ``` 如有错误修改配置文件相应端口,无错误可继续进行下去 -- 进入WEB管理 -- 访问服务端ip:web服务端口(默认为8024) -- 在web中创建客户端 +2. 访问服务端ip:web服务端口(默认为8024) +3. 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) +4. 在web中创建客户端 ### 客户端连接 -- 点击web管理中客户端前的+号,复制启动命令 -- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 +1. 点击web管理中客户端前的+号,复制启动命令 +2. 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 ### 配置 - 客户端连接后,在web中配置对应穿透服务即可 - 更多高级用法见[完整文档](https://cnlh.github.io/nps/) + +## 贡献 +- 如果遇到bug可以直接提交至dev分支 +- 使用遇到问题可以通过issues反馈 +- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 +- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 53d5a88..f74428e 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -11,4 +11,4 @@ [GitHub](https://github.com/cnlh/nps/) -[开始使用](#docsify) +[开始使用](#nps) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 7250ad2..cfb58fa 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,9 +1,10 @@ * 入门 * [安装](install.md) + * [启动](run.md) * [使用示例](example.md) * 服务端 * [介绍](introduction.md) - * [启动](start.md) + * [使用](nps_use.md) * [配置文件](server_config.md) * [增强功能](nps_extend.md) diff --git a/docs/api.md b/docs/api.md index eff6be3..2b11650 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,5 +1,5 @@ - -# webAPI验证说明 +# web api +## webAPI验证说明 - 采用auth_key的验证方式 - 在提交的每个请求后面附带两个参数,`auth_key` 和`timestamp` @@ -17,14 +17,14 @@ curl --request POST \ ``` **注意:** 为保证安全,时间戳的有效范围为20秒内,所以每次提交请求必须重新生成。 -# 获取服务端时间 +## 获取服务端时间 由于服务端与api请求的客户端时间差异不能太大,所以提供了一个可以获取服务端时间的接口 ``` POST /auth/gettime ``` -# 获取服务端authKey +## 获取服务端authKey 如果想获取authKey,服务端提供获取authKey的接口 @@ -39,7 +39,7 @@ POST /auth/getauthkey - 补码方式pkcs5padding - 解密串编码方式 十六进制 -# 详细文档 +## 详细文档 - **此文档近期可能更新较慢,建议自行抓包** 为方便第三方扩展,在web模式下可利用webAPI进行相关操作,详情见 diff --git a/docs/contribute.md b/docs/contribute.md index 35d5873..fc6e3d3 100644 --- a/docs/contribute.md +++ b/docs/contribute.md @@ -1,5 +1,5 @@ # 贡献 -**欢迎参与到制作docker、图标、文档翻译等工作** + - 如果遇到bug可以直接提交至dev分支 - 使用遇到问题可以通过issues反馈 - 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 diff --git a/docs/description.md b/docs/description.md index 61a568f..0520ad6 100644 --- a/docs/description.md +++ b/docs/description.md @@ -1,25 +1,26 @@ -# 获取用户真实ip +# 说明 +## 获取用户真实ip 在域名代理模式中,可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。 **本代理前会在每一个http(s)请求中添加了这两个 header。** -# 热更新支持 +## 热更新支持 对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端 -# 客户端地址显示 +## 客户端地址显示 在web管理中将显示客户端的连接地址 -# 流量统计 +## 流量统计 可统计显示每个代理使用的流量,由于压缩和加密等原因,会和实际环境中的略有差异 -# 当前客户端带宽 +## 当前客户端带宽 可统计每个客户端当前的带宽,可能和实际有一定差异,仅供参考。 -# 客户端与服务端版本对比 +## 客户端与服务端版本对比 为了程序正常运行,客户端与服务端的核心版本必须一致,否则将导致客户端无法成功连接致服务端。 -# Linux系统限制 +## Linux系统限制 默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 `tcp_max_syn_backlog` `somaxconn` 酌情调整参数,增强网络性能 diff --git a/docs/donate.md b/docs/donate.md index 5fbb408..551e1eb 100644 --- a/docs/donate.md +++ b/docs/donate.md @@ -1,5 +1,7 @@ +# 捐助 如果您觉得nps对你有帮助,欢迎给予我们一定捐助,也是帮助nps更好的发展。 -# 支付宝 + +## 支付宝 ![image](https://github.com/cnlh/nps/blob/master/image/donation_zfb.png?raw=true) -# 微信 +## 微信 ![image](https://github.com/cnlh/nps/blob/master/image/donation_wx.png?raw=true) diff --git a/docs/example.md b/docs/example.md index 5980b06..e37c1f6 100644 --- a/docs/example.md +++ b/docs/example.md @@ -1,4 +1,5 @@ -# 统一准备工作(必做) +# 使用示例 +## 统一准备工作(必做) - 开启服务端,假设公网服务器ip为1.1.1.1,配置文件中`bridge_port`为8284,配置文件中`web_port`为8080 - 访问1.1.1.1:8080 - 在客户端管理中创建一个客户端,记录下验证密钥 @@ -9,7 +10,7 @@ ``` **注意:运行服务端后,请确保能从客户端设备上正常访问配置文件中所配置的`bridge_port`端口,telnet,netcat这类的来检查** -# 域名解析 +## 域名解析 **适用范围:** 小程序开发、微信公众号开发、产品演示 @@ -24,9 +25,9 @@ 现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 -**https:** 如需使用https请进行相关配置,详见 [使用https](#使用https) +**https:** 如需使用https请进行相关配置,详见 [使用https](##使用https) -# tcp隧道 +## tcp隧道 **适用范围:** ssh、远程桌面等tcp连接场景 @@ -38,7 +39,7 @@ - 在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8001)、内网目标ip和目标端口(10.1.50.101:22),保存。 - 访问公网服务器ip(1.1.1.1),填写的监听端口(8001),相当于访问内网ip(10.1.50.101):目标端口(22),例如:`ssh -p 8001 root@1.1.1.1` -# udp隧道 +## udp隧道 **适用范围:** 内网dns解析等udp连接场景 @@ -49,7 +50,7 @@ - 在刚才创建的客户端的隧道管理中添加一条udp隧道,填写监听的端口(53)、内网目标ip和目标端口(10.1.50.102:53),保存。 - 修改需要使用的dns地址为1.1.1.1,则相当于使用10.1.50.102作为dns服务器 -# socks5代理 +## socks5代理 **适用范围:** 在外网环境下如同使用vpn一样访问内网设备或者资源 @@ -64,7 +65,7 @@ **注意** 经过socks5代理,当收到socks5数据包时socket已经是accept状态。表现是扫描端口全open,建立连接后短时间关闭。若想同内网表现一致,建议远程连接一台设备。 -# http正向代理 +## http正向代理 **适用范围:** 在外网环境下使用http正向代理访问内网站点 @@ -76,7 +77,7 @@ - 在刚才创建的客户端隧道管理中添加一条http代理,填写监听的端口(8004),保存。 - 在外网环境的本机配置http代理,ip为公网服务器ip(1.1.1.1),端口为填写的监听端口(8004),即可访问了 -# 私密代理 +## 私密代理 **适用范围:** 无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务,例如ssh。 @@ -97,9 +98,9 @@ 假设10.1.50.2用户名为root,现在执行`ssh -p 2000 root@1.1.1.1`即可访问ssh -# p2p服务 +## p2p服务 -**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](#nat类型检测) +**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](##nat类型检测) **假设场景:** diff --git a/docs/feature.md b/docs/feature.md index c4f6a96..b223f76 100644 --- a/docs/feature.md +++ b/docs/feature.md @@ -1,10 +1,10 @@ - -# 缓存支持 +# 扩展功能 +## 缓存支持 对于web站点来说,一些静态文件往往消耗更大的流量,且在内网穿透中,静态文件还需到客户端获取一次,这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。 即假设一个站点有a.css,nps将只需从npc客户端读取一次该文件,然后把该文件的内容放在内存中,下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的,如需开启请在`nps.conf`中设置`http_cache=true`,并设置`http_cache_length`(缓存文件的个数,消耗内存,不宜过大,0表示不限制个数) -# 数据压缩支持 +## 数据压缩支持 由于是内网穿透,内网客户端与服务端之间的隧道存在大量的数据交换,为节省流量,加快传输速度,由此本程序支持SNNAPY形式的压缩。 @@ -13,7 +13,7 @@ - 在web管理或客户端配置文件中设置 -# 加密传输 +## 加密传输 如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了ssh协议等,通过设置 配置文件,将服务端与客户端之间的通信内容加密传输,将会有效防止流量被拦截。 - nps使用tls加密,所以一定要保留conf目录下的密钥文件,同时也可以自行生成 @@ -21,45 +21,45 @@ -# 站点保护 +## 站点保护 域名代理模式所有客户端共用一个http服务端口,在知道域名后任何人都可访问,一些开发或者测试环境需要保密,所以可以设置用户名和密码,nps将通过 Http Basic Auth 来保护,访问时需要输入正确的用户名和密码。 - 在web管理或客户端配置文件中设置 -# host修改 +## host修改 由于内网站点需要的host可能与公网域名不一致,域名代理支持host修改功能,即修改request的header中的host字段。 **使用方法:在web管理中设置** -# 自定义header +## 自定义header 支持对header进行新增或者修改,以配合服务的需要 -# 404页面配置 +## 404页面配置 支持域名解析模式的自定义404页面,修改/web/static/page/error.html中内容即可,暂不支持静态文件等内容 -# 流量限制 +## 流量限制 支持客户端级流量限制,当该客户端入口流量与出口流量达到设定的总量后会拒绝服务 ,域名代理会返回404页面,其他代理会拒绝连接,使用该功能需要在`nps.conf`中设置`allow_flow_limit`,默认是关闭的。 -# 带宽限制 +## 带宽限制 支持客户端级带宽限制,带宽计算方式为入口和出口总和,权重均衡,使用该功能需要在`nps.conf`中设置`allow_rate_limit`,默认是关闭的。 -# 负载均衡 +## 负载均衡 本代理支持域名解析模式和tcp代理的负载均衡,在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡 -# 端口白名单 +## 端口白名单 为了防止服务端上的端口被滥用,可在nps.conf中配置allow_ports限制可开启的端口,忽略或者不填表示端口不受限制,格式: ```ini allow_ports=9001-9009,10001,11000-12000 ``` -# 端口范围映射 +## 端口范围映射 当客户端以配置文件的方式启动时,可以将本地的端口进行范围映射,仅支持tcp和udp模式,例如: ```ini @@ -70,7 +70,7 @@ target_port=8001-8009,10002,13000-14000 ``` 逗号分隔,可单个或者范围,注意上下端口的对应关系,无法一一对应将不能成功 -# 端口范围映射到其他机器 +## 端口范围映射到其他机器 ```ini [tcp] mode=tcp @@ -79,7 +79,7 @@ target_port=8001-8009,10002,13000-14000 target_ip=10.1.50.2 ``` 填写target_ip后则表示映射的该地址机器的端口,忽略则便是映射本地127.0.0.1,仅范围映射时有效 -# 守护进程 +## 守护进程 本代理支持守护进程,使用示例如下,服务端客户端所有模式通用,支持linux,darwin,windows。 ``` ./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数 @@ -87,17 +87,17 @@ target_ip=10.1.50.2 ``` (nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数 ``` -# KCP协议支持 +## KCP协议支持 KCP 是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,在弱网环境下对性能能有一定的提升。可在nps.conf中修改`bridge_type`为kcp ,设置后本代理将开启udp端口(`bridge_port`) 注意:当服务端为kcp时,客户端连接时也需要使用相同配置,无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp -# 域名泛解析 +## 域名泛解析 支持域名泛解析,例如将host设置为*.proxy.com,a.proxy.com、b.proxy.com等都将解析到同一目标,在web管理中或客户端配置文件中将host设置为此格式即可。 -# URL路由 +## URL路由 本代理支持根据URL将同一域名转发到不同的内网服务器,可在web中或客户端配置文件中设置,此参数也可忽略,例如在客户端配置文件中 ```ini @@ -112,7 +112,7 @@ location=/static ``` 对于`a.proxy.com/test`将转发到`web1`,对于`a.proxy.com/static`将转发到`web2` -# 限制ip访问 +## 限制ip访问 如果将一些危险性高的端口例如ssh端口暴露在公网上,可能会带来一些风险,本代理支持限制ip访问。 **使用方法:** 在配置文件nps.conf中设置`ip_limit`=true,设置后仅通过注册的ip方可访问。 @@ -133,18 +133,18 @@ time为有效小时数,例如time=2,在当前时间后的两小时内,本 **注意:** 本机公网ip并不是一成不变的,请自行注意有效期的设置,同时同一网络下,多人也可能是在公用同一个公网ip。 -# 客户端最大连接数 +## 客户端最大连接数 为防止恶意大量长连接,影响服务端程序的稳定性,可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对`socks5`、`http正向代理`、`域名代理`、`tcp代理`、`udp代理`、`私密代理`生效,使用该功能需要在`nps.conf`中设置`allow_connection_num_limit=true`,默认是关闭的。 -# 客户端最大隧道数限制 +## 客户端最大隧道数限制 nps支持对客户端的隧道数量进行限制,该功能默认是关闭的,如需开启,请在`nps.conf`中设置`allow_tunnel_num_limit=true`。 -# 端口复用 +## 端口复用 在一些严格的网络环境中,对端口的个数等限制较大,nps支持强大端口复用功能。将`bridge_port`、 `http_proxy_port`、 `https_proxy_port` 、`web_port`都设置为同一端口,也能正常使用。 - 使用时将需要复用的端口设置为与`bridge_port`一致即可,将自动识别。 - 如需将web管理的端口也复用,需要配置`web_host`也就是一个二级域名以便区分 -# 多路复用 +## 多路复用 nps主要通信默认基于多路复用,无需开启。 @@ -154,14 +154,14 @@ nps主要通信默认基于多路复用,无需开启。 在Linux上,可以通过调节内核参数来适应不同应用场景。 对于需求大带宽又有一定的丢包的场景,可以保持默认参数不变,尽可能少抛弃连接 -高并发下可根据[Linux系统限制](# Linux系统限制) 调整 +高并发下可根据[Linux系统限制](## Linux系统限制) 调整 对于延迟敏感而又有一定丢包的场景,可以适当调整TCP重传次数 `tcp_syn_retries`, `tcp_retries1`, `tcp_retries2` 高并发同上 nps会在系统主动关闭连接的时候拿到报错,进而重新建立隧道连接 -# 环境变量渲染 +## 环境变量渲染 npc支持环境变量渲染以适应在某些特殊场景下的要求。 **在无配置文件启动模式下:** @@ -185,7 +185,7 @@ target_addr={{.NPC_WEB_TARGET}} ``` 在配置文件中填入相应的环境变量名称,npc将自动进行渲染配置文件替换环境变量 -# 健康检查 +## 健康检查 当客户端以配置文件模式启动时,支持多节点的健康检查。配置示例如下 @@ -223,7 +223,7 @@ health_check_target | 健康检查目标,多个以逗号(,)分隔 health_check_type | 健康检查类型 health_http_url | 健康检查url,仅http模式适用 -# 日志输出 +## 日志输出 日志输出级别 diff --git a/docs/install.md b/docs/install.md index 83b081a..09313e6 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,17 +1,19 @@ -#release安装 -> [releases](https://github.com/cnlh/nps/releases) +# 安装 +## 安装包安装 + [releases](https://github.com/cnlh/nps/releases) 下载对应的系统版本即可,服务端和客户端是单独的 -# 源码安装 +## 源码安装 - 安装源码 -> go get -u github.com/cnlh/nps... +```go get -u github.com/cnlh/nps... +``` - 编译 -> go build cmd/nps/nps.go +服务端```go build cmd/nps/nps.go``` -> go build cmd/npc/npc.go +客户端```go build cmd/npc/npc.go``` -# docker安装 +## docker安装 > [server](https://hub.docker.com/r/ffdfgdfg/nps) > [client](https://hub.docker.com/r/ffdfgdfg/npc) diff --git a/docs/npc_extend.md b/docs/npc_extend.md index a757f34..ac1c6b2 100644 --- a/docs/npc_extend.md +++ b/docs/npc_extend.md @@ -1,19 +1,19 @@ - -# nat类型检测 +# 增强功能 +## nat类型检测 ``` ./npc nat ``` 如果p2p双方都是Symmetric Nat,肯定不能成功,其他组合都有较大成功率。 -# 状态检查 +## 状态检查 ``` ./npc status -config=npc配置文件路径 ``` -# 重载配置文件 +## 重载配置文件 ``` ./npc restart -config=npc配置文件路径 ``` -# 通过代理连接nps +## 通过代理连接nps 有时候运行npc的内网机器无法直接访问外网,此时可以可以通过socks5代理连接nps 对于配置文件方式启动,设置 @@ -32,5 +32,5 @@ proxy_url=socks5://111:222@127.0.0.1:8024 或http://username:password@ip:port -# 群晖支持 +## 群晖支持 可在releases中下载spk群晖套件,例如`npc_x64-6.1_0.19.0-1.spk` diff --git a/docs/nps_extend.md b/docs/nps_extend.md index 2b6d339..e15ca8e 100644 --- a/docs/nps_extend.md +++ b/docs/nps_extend.md @@ -1,5 +1,5 @@ - -# 使用https +# 增强功能 +## 使用https **方式一:** 类似于nginx实现https的处理 @@ -12,7 +12,7 @@ 在`nps.conf`中将`https_just_proxy`设置为true,并且打开`https_proxy_port`端口,然后nps将直接转发https请求到内网服务器上,由内网服务器进行https处理 -# 与nginx配合 +## 与nginx配合 有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等,本代理可和nginx配合使用,在配置文件中将httpProxyPort设置为非80端口,并在nginx中配置代理,例如httpProxyPort为8024时 ``` @@ -45,7 +45,7 @@ server { } ``` -# web使用Caddy代理 +## web使用Caddy代理 如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. @@ -53,8 +53,8 @@ server { ```Caddyfile caddy_ip:caddy_port/nps { - #server_ip 为 nps 服务器IP - #web_port 为 nps 后台端口 + ##server_ip 为 nps 服务器IP + ##web_port 为 nps 后台端口 proxy / http://server_ip:web_port/nps { transparent } @@ -67,61 +67,38 @@ web_base_url=/nps ``` -# 关闭代理 +## 关闭代理 如需关闭http代理可在配置文件中将http_proxy_port设置为空,如需关闭https代理可在配置文件中将https_proxy_port设置为空。 -# 将nps安装到系统 -如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 - -``` -(./nps|nps.exe) install -``` -安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 - -``` -sudo systemctl enable|disable|start|stop|restart|status nps -``` -systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 -建议采用此方式启动,能够捕获panic信息,便于排查问题。 - -``` -nps test|start|stop|restart|status -``` -对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 - -``` -nps.exe test|start|stop|restart|status -``` - -# 流量数据持久化 +## 流量数据持久化 服务端支持将流量数据持久化,默认情况下是关闭的,如果有需求可以设置`nps.conf`中的`flow_store_interval`参数,单位为分钟 **注意:** nps不会持久化通过公钥连接的客户端 -# 系统信息显示 +## 系统信息显示 nps服务端支持在web上显示和统计服务器的相关信息,但默认一些统计图表是关闭的,如需开启请在`nps.conf`中设置`system_info_display=true` -# 自定义客户端连接密钥 +## 自定义客户端连接密钥 web上可以自定义客户端连接的密钥,但是必须具有唯一性 -# 关闭公钥访问 +## 关闭公钥访问 可以将`nps.conf`中的`public_vkey`设置为空或者删除 -# 关闭web管理 +## 关闭web管理 可以将`nps.conf`中的`web_port`设置为空或者删除 -# 服务端多用户登陆 +## 服务端多用户登陆 如果将`nps.conf`中的`allow_user_login`设置为true,服务端web将支持多用户登陆,登陆用户名为user,默认密码为每个客户端的验证密钥,登陆后可以进入客户端编辑修改web登陆的用户名和密码,默认该功能是关闭的。 -# 用户注册功能 +## 用户注册功能 nps服务端支持用户注册功能,可将`nps.conf`中的`allow_user_register`设置为true,开启后登陆页将会有有注册功能, -# 监听指定ip +## 监听指定ip nps支持每个隧道监听不同的服务端端口,在`nps.conf`中设置`allow_multi_ip=true`后,可在web中控制,或者npc配置文件中(可忽略,默认为0.0.0.0) ```ini server_ip=xxx ``` -# 代理到服务端本地 +## 代理到服务端本地 在使用nps监听80或者443端口时,默认是将所有的请求都会转发到内网上,但有时候我们的nps服务器的上一些服务也需要使用这两个端口,nps提供类似于`nginx` `proxy_pass` 的功能,支持将代理到服务器本地,该功能支持域名解析,tcp、udp隧道,默认关闭。 **即:** 假设在nps的vps服务器上有一个服务使用5000端口,这时候nps占用了80端口和443,我们想能使用一个域名通过http(s)访问到5000的服务。 diff --git a/docs/nps_use.md b/docs/nps_use.md new file mode 100644 index 0000000..1985811 --- /dev/null +++ b/docs/nps_use.md @@ -0,0 +1,57 @@ +**提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** + + +# 服务端测试 +```shell + ./nps test +``` +如有错误请及时修改配置文件,无错误可继续进行下去 +# 服务端启动 +```shell + ./nps start +``` +**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** + +# web管理 + +进入web界面,公网ip:web界面端口(默认8080),密码默认为123 + +进入web管理界面,有详细的说明 + +# 服务端配置文件重载 +如果是daemon启动 +```shell + ./nps reload +``` +**说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 + + +# 服务端停止或重启 +如果是daemon启动 +```shell + ./nps stop|restart +``` + +# 将nps安装到系统 +如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 + +``` +(./nps|nps.exe) install +``` +安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 + +``` +sudo systemctl enable|disable|start|stop|restart|status nps +``` +systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 +建议采用此方式启动,能够捕获panic信息,便于排查问题。 + +``` +nps test|start|stop|restart|status +``` +对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 + +``` +nps.exe test|start|stop|restart|status +``` + diff --git a/docs/run.md b/docs/run.md new file mode 100644 index 0000000..c0aec66 --- /dev/null +++ b/docs/run.md @@ -0,0 +1,20 @@ +# 启动 +## 服务端 +下载完服务器压缩包后,解压,然后进入解压后的文件夹 +1. 执行命令启动 +```shell + ./nps +``` +**如有错误(E)修改配置文件相应端口**,无错误可继续进行下去 +2. 访问服务端ip:web服务端口(默认为8024) +3. 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) +4. 创建客户端 + +## 客户端 +1. 下载客户端安装包并解压,进入到解压目录 +1. 点击web管理中客户端前的+号,复制启动命令 +2. 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 + +## 配置 +- 客户端连接后,在web中配置对应穿透服务即可 +- 可以查看[使用示例](/example) diff --git a/docs/start.md b/docs/start.md deleted file mode 100644 index fc82d13..0000000 --- a/docs/start.md +++ /dev/null @@ -1,33 +0,0 @@ -**提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** - - -# 服务端测试 -```shell - ./nps test -``` -如有错误请及时修改配置文件,无错误可继续进行下去 -# 服务端启动 -```shell - ./nps start -``` -**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** - -# web管理 - -进入web界面,公网ip:web界面端口(默认8080),密码默认为123 - -进入web管理界面,有详细的说明 - -# 服务端配置文件重载 -如果是daemon启动 -```shell - ./nps reload -``` -**说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 - - -# 服务端停止或重启 -如果是daemon启动 -```shell - ./nps stop|restart -``` diff --git a/docs/use.md b/docs/use.md index cb4f88f..183d41e 100644 --- a/docs/use.md +++ b/docs/use.md @@ -1,9 +1,10 @@ -# 无配置文件模式 +# 基本使用 +## 无配置文件模式 此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 ``` ./npc -server=ip:port -vkey=web界面中显示的密钥 ``` -# 配置文件模式 +## 配置文件模式 此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 ``` ./npc -config=npc配置文件路径 @@ -29,9 +30,9 @@ ExecStart=/absolutely path to/npc -server=ip:port -vkey=web界面中显示的密 [Install] WantedBy=multi-user.target ``` -# 配置文件说明 +## 配置文件说明 [示例配置文件](https://github.com/cnlh/nps/tree/master/conf/npc.conf) -## 全局配置 +#### 全局配置 ```ini [common] server_addr=1.1.1.1:8284 @@ -59,7 +60,7 @@ rate_limit|速度限制,可忽略 flow_limit|流量限制,可忽略 remark|客户端备注,可忽略 max_conn|最大连接数,可忽略 -## 域名代理 +#### 域名代理 ```ini [common] @@ -79,7 +80,7 @@ target_addr|内网目标,负载均衡时多个目标,逗号隔开 host_change|请求host修改 header_xxx|请求header修改或添加,header_proxy表示添加header proxy:nps -## tcp隧道模式 +#### tcp隧道模式 ```ini [common] @@ -96,7 +97,7 @@ mode | tcp server_port | 在服务端的代理端口 tartget_addr|内网目标 -## udp隧道模式 +#### udp隧道模式 ```ini [common] @@ -112,7 +113,7 @@ server_port=9002 mode | udp server_port | 在服务端的代理端口 target_addr|内网目标 -## http代理模式 +#### http代理模式 ```ini [common] @@ -126,7 +127,7 @@ server_port=9003 ---|--- mode | httpProxy server_port | 在服务端的代理端口 -## socks5代理模式 +#### socks5代理模式 ```ini [common] @@ -142,7 +143,7 @@ multi_account=multi_account.conf mode | socks5 server_port | 在服务端的代理端口 multi_account | socks5多账号配置文件(可选),配置后使用basic_username和basic_password无法通过认证 -## 私密代理模式 +#### 私密代理模式 ```ini [common] @@ -159,7 +160,7 @@ mode | secret password | 唯一密钥 target_addr|内网目标 -## p2p代理模式 +#### p2p代理模式 ```ini [common] @@ -177,7 +178,7 @@ password | 唯一密钥 target_addr|内网目标 -## 文件访问模式 +#### 文件访问模式 利用nps提供一个公网可访问的本地文件服务,此模式仅客户端使用配置文件模式方可启动 ```ini @@ -200,7 +201,7 @@ strip_pre|前缀 对于`strip_pre`,访问公网`ip:9100/web/`相当于访问`/tmp/`目录 -## 断线重连 +#### 断线重连 ```ini [common] auto_reconnection=true From f1a7a8c9d7d047f509d97ac98d3a284472c37b81 Mon Sep 17 00:00:00 2001 From: he liu Date: Fri, 13 Dec 2019 09:21:45 +0800 Subject: [PATCH 088/171] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d181930..8ef2b90 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 ./nps ``` 如有错误修改配置文件相应端口,无错误可继续进行下去 + 2. 访问服务端ip:web服务端口(默认为8024) 3. 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) 4. 在web中创建客户端 From fa3beabfafddb29d83689c1474d81d68fdd648b0 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Fri, 13 Dec 2019 22:26:41 +0800 Subject: [PATCH 089/171] fix mux conn release race condition, add gui --- go.mod | 8 +-- go.sum | 55 ++++++++++----- gui/npc/npc.go | 178 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/mux/conn.go | 14 ++-- 4 files changed, 225 insertions(+), 30 deletions(-) create mode 100644 gui/npc/npc.go diff --git a/go.mod b/go.mod index a2b0199..563a6d6 100644 --- a/go.mod +++ b/go.mod @@ -3,26 +3,24 @@ module github.com/cnlh/nps go 1.12 require ( + fyne.io/fyne v1.2.0-beta2 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/astaxie/beego v1.12.0 - github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff // indirect github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d github.com/go-ole/go-ole v1.2.4 // indirect github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db github.com/klauspost/cpuid v1.2.1 // indirect github.com/klauspost/reedsolomon v1.9.2 // indirect - github.com/onsi/gomega v1.5.0 // indirect github.com/panjf2000/ants/v2 v2.2.2 - github.com/pkg/errors v0.8.0 + github.com/pkg/errors v0.8.1 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect github.com/shirou/gopsutil v2.19.11+incompatible - github.com/stretchr/testify v1.3.0 // indirect github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b // indirect github.com/tjfoc/gmsm v1.0.1 // indirect github.com/xtaci/kcp-go v5.4.4+incompatible github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae // indirect - golang.org/x/net v0.0.0-20181114220301-adae6a3d119a + golang.org/x/net v0.0.0-20181220203305-927f97764cc3 golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa // indirect ) diff --git a/go.sum b/go.sum index 428e5a8..e4f4325 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,13 @@ +fyne.io/fyne v1.2.0-beta2 h1:MEZlRmQc+lyYOoD9Yy9E7JLHxEY6JvwDvO/c/S+gP8M= +fyne.io/fyne v1.2.0-beta2/go.mod h1:Ab+3DIB/FVteW0y4DXfmZv4N3JdnCBh2lHkINI02BOU= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/astaxie/beego v1.12.0 h1:MRhVoeeye5N+Flul5PoVfD9CslfdoH+xqC/xvSQ5u2Y= -github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= -github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d h1:As4937T5NVbJ/DmZT9z33pyLEprMd6CUSfhbmMY57Io= @@ -23,47 +24,58 @@ github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3C github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/exfly/beego v1.12.0-export-init h1:VQNYKdXhAwZGUaFmQv8Aj921O3rQJZRIF8xeGrhsjrI= github.com/exfly/beego v1.12.0-export-init/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= -github.com/exfly/beego v1.12.0 h1:OXwIwngaAx35Mga+jLiZmArusBxj8/H0jYXzGDAdwOg= -github.com/exfly/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= +github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f h1:7MsFMbSn8Lcw0blK4+NEOf8DuHoOBDhJsHz04yh13pM= +github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8= +github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= +github.com/josephspurrier/goversioninfo v0.0.0-20190124120936-8611f5a5ff3f/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/reedsolomon v1.9.2 h1:E9CMS2Pqbv+C7tsrYad4YC9MfhnMVWhMRsTi7U0UB18= github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/panjf2000/ants/v2 v2.2.2 h1:TWzusBjq/IflXhy+/S6u5wmMLCBdJnB9tPIx9Zmhvok= github.com/panjf2000/ants/v2 v2.2.2/go.mod h1:1GFm8bV8nyCQvU5K4WvBCTG1/YBFOD2VzjffD8fV55A= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= -github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= -github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.19.11+incompatible h1:lJHR0foqAjI4exXqWsU3DbH7bX1xvdhGdnXTIARA9W4= github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/srwiley/oksvg v0.0.0-20190829233741-58e08c8fe40e h1:LJUrNHytcMXWKxnULIHPe5SCb1jDpO9o672VB1x2EuQ= +github.com/srwiley/oksvg v0.0.0-20190829233741-58e08c8fe40e/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= +github.com/srwiley/rasterx v0.0.0-20181219215540-696f7edb7a7e h1:FFotfUvew9Eg02LYRl8YybAnm0HCwjjfY5JlOI1oB00= +github.com/srwiley/rasterx v0.0.0-20181219215540-696f7edb7a7e/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709 h1:Ko2LQMrRU+Oy/+EDBwX7eZ2jp3C47eDBB8EIhKTun+I= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 h1:89CEmDvlq/F7SJEOqkIdNDGJXrQIhuIx9D2DBXjavSU= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= @@ -78,17 +90,24 @@ github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+A github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:et7+NAX3lLIk5qUCTA9QelBjGE/NkhzYw/mhnr0s7nI= golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8 h1:idBdZTd9UioThJp8KpM/rTSinK/ChZFBE43/WtIy8zg= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gui/npc/npc.go b/gui/npc/npc.go new file mode 100644 index 0000000..b9761a9 --- /dev/null +++ b/gui/npc/npc.go @@ -0,0 +1,178 @@ +package main + +import ( + "fmt" + "fyne.io/fyne" + "fyne.io/fyne/app" + "fyne.io/fyne/layout" + "fyne.io/fyne/widget" + "github.com/astaxie/beego/logs" + "github.com/cnlh/nps/client" + "github.com/cnlh/nps/lib/common" + "github.com/cnlh/nps/lib/daemon" + "github.com/cnlh/nps/lib/version" + "io/ioutil" + "os" + "path" + "runtime" + "strings" + "time" +) + +func main() { + daemon.InitDaemon("npc", common.GetRunPath(), common.GetTmpPath()) + logs.SetLogger("store") + application := app.New() + window := application.NewWindow("Npc " + version.VERSION) + window.SetContent(WidgetScreen()) + window.Resize(fyne.NewSize(910, 350)) + + window.ShowAndRun() + +} + +var ( + start bool + status = "Start!" + connType = "tcp" + cl = new(client.TRPClient) +) + +func WidgetScreen() fyne.CanvasObject { + return fyne.NewContainerWithLayout(layout.NewBorderLayout(nil, nil, nil, nil), + makeMainTab(), + ) +} + +func makeMainTab() fyne.Widget { + serverPort := widget.NewEntry() + serverPort.SetPlaceHolder("Server:Port") + + vKey := widget.NewEntry() + vKey.SetPlaceHolder("Vkey") + + radio := widget.NewRadio([]string{"tcp", "kcp"}, func(s string) { connType = s }) + radio.Horizontal = true + + refreshCh := make(chan struct{}) + button := widget.NewButton(status, func() { + start = !start + if start { + status = "Stop!" + // init the npc + fmt.Println("submit", serverPort.Text, vKey.Text, connType) + sp, vk, ct := loadConfig() + if sp != serverPort.Text || vk != vKey.Text || ct != connType { + saveConfig(serverPort.Text, vKey.Text, connType) + } + cl = client.NewRPClient(serverPort.Text, vKey.Text, connType, "", nil) + go cl.Start() + } else { + // close the npc + status = "Start!" + if cl != nil { + go cl.Close() + cl = nil + } + } + refreshCh <- struct{}{} + }) + go func() { + for { + <-refreshCh + button.SetText(status) + } + }() + + lo := widget.NewMultiLineEntry() + lo.SetReadOnly(true) + lo.Resize(fyne.NewSize(910, 250)) + slo := widget.NewScrollContainer(lo) + slo.Resize(fyne.NewSize(910, 250)) + go func() { + for { + time.Sleep(time.Second) + lo.SetText(common.GetLogMsg()) + slo.Resize(fyne.NewSize(910, 250)) + } + }() + + sp, vk, ct := loadConfig() + if sp != "" && vk != "" && ct != "" { + serverPort.SetText(sp) + vKey.SetText(vk) + connType = ct + radio.SetSelected(ct) + } + + return widget.NewVBox( + widget.NewLabel("Npc "+version.VERSION), + serverPort, + vKey, + radio, + button, + slo, + ) +} + +func getDir() (dir string, err error) { + if runtime.GOOS != "android" { + dir, err = os.UserConfigDir() + if err != nil { + return + } + } else { + dir, err = os.UserHomeDir() + if err != nil { + return + } + dir = path.Dir(dir) + dir = path.Join(dir, "files") + } + return +} + +func saveConfig(host, vkey, connType string) { + data := strings.Join([]string{host, vkey, connType}, "\n") + ph, err := getDir() + if err != nil { + logs.Warn("not found config dir") + return + } + _ = os.Remove(ph + "npc.conf") + f, err := os.OpenFile(ph+"npc.conf", os.O_CREATE|os.O_WRONLY, 0644) + defer f.Close() + if err != nil { + logs.Error(err) + return + } + if _, err := f.Write([]byte(data)); err != nil { + f.Close() // ignore error; Write error takes precedence + logs.Error(err) + return + } +} + +func loadConfig() (host, vkey, connType string) { + ph, err := getDir() + if err != nil { + logs.Warn("not found config dir") + return + } + f, err := os.OpenFile(ph+"npc.conf", os.O_RDONLY, 0644) + defer f.Close() + if err != nil { + logs.Error(err) + return + } + data, err := ioutil.ReadAll(f) + if err != nil { + logs.Error(err) + return + } + li := strings.Split(string(data), "\n") + host = li[0] + vkey = li[1] + connType = li[2] + return +} diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 92d9b2c..28ec1de 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -293,8 +293,8 @@ copyData: // reset to 60s if timeout and data still available Self.off = 0 if err != nil { - Self.CloseWindow() // also close the window, to avoid read twice - return // queue receive stop or time out, break the loop and return + Self.CloseWindow() // also close the window, to avoid read twice + return // queue receive stop or time out, break the loop and return } //logs.Warn("pop element", Self.element.l, Self.element.part) } @@ -362,14 +362,14 @@ func (Self *ReceiveWindow) release() { // common.ListElementPool.Put(Self.element) //} for { - Self.element = Self.bufQueue.TryPop() - if Self.element == nil { + ele := Self.bufQueue.TryPop() + if ele == nil { return } - if Self.element.Buf != nil { - common.WindowBuff.Put(Self.element.Buf) + if ele.Buf != nil { + common.WindowBuff.Put(ele.Buf) } - common.ListElementPool.Put(Self.element) + common.ListElementPool.Put(ele) } // release resource } From 28f5bdea8ea66b42c03444b6bdf1d89edff6f5f8 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Fri, 13 Dec 2019 23:06:15 +0800 Subject: [PATCH 090/171] fix config path --- gui/npc/npc.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/npc/npc.go b/gui/npc/npc.go index b9761a9..46369ac 100644 --- a/gui/npc/npc.go +++ b/gui/npc/npc.go @@ -139,8 +139,8 @@ func saveConfig(host, vkey, connType string) { logs.Warn("not found config dir") return } - _ = os.Remove(ph + "npc.conf") - f, err := os.OpenFile(ph+"npc.conf", os.O_CREATE|os.O_WRONLY, 0644) + _ = os.Remove(path.Join(ph, "npc.conf")) + f, err := os.OpenFile(path.Join(ph, "npc.conf"), os.O_CREATE|os.O_WRONLY, 0644) defer f.Close() if err != nil { logs.Error(err) @@ -159,7 +159,7 @@ func loadConfig() (host, vkey, connType string) { logs.Warn("not found config dir") return } - f, err := os.OpenFile(ph+"npc.conf", os.O_RDONLY, 0644) + f, err := os.OpenFile(path.Join(ph, "npc.conf"), os.O_RDONLY, 0644) defer f.Close() if err != nil { logs.Error(err) From 6ebd5e35bd3b5230700327aa668c01416badcf38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 12:25:03 +0800 Subject: [PATCH 091/171] modify filename on macos and windows && update version --- .travis.yml | 12 ++++++------ build.sh | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index f076c5c..7208fd3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,12 +44,12 @@ deploy: - linux_mipsle_server.tar.gz - linux_mips_client.tar.gz - linux_mips_server.tar.gz - - macos_client.tar.gz - - macos_server.tar.gz - - win_386_client.tar.gz - - win_386_server.tar.gz - - win_amd64_client.tar.gz - - win_amd64_server.tar.gz + - darwin_amd64_client.tar.gz + - darwin_amd64_server.tar.gz + - windows_386_client.tar.gz + - windows_386_server.tar.gz + - windows_amd64_client.tar.gz + - windows_amd64_server.tar.gz - npc_syno.spk - npc_sdk.tar.gz on: diff --git a/build.sh b/build.sh index df967c4..b4bdca0 100644 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #/bash/sh -export VERSION=0.25.1 +export VERSION=0.25.2 sudo apt-get install gcc-mingw-w64-i686 env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go @@ -69,17 +69,17 @@ tar -czvf linux_mips_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf conf/multi_account.conf +tar -czvf windows_386_client.tar.gz npc.exe conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf conf/multi_account.conf +tar -czvf windows_amd64_client.tar.gz npc.exe conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf macos_client.tar.gz npc conf/npc.conf conf/multi_account.conf +tar -czvf darwin_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go @@ -146,17 +146,17 @@ tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +tar -czvf darwin_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe +tar -czvf windows_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe +tar -czvf windows_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" From fd3ae7fa9b25d68e7aa2793103a8ae93cca2994c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 12:25:24 +0800 Subject: [PATCH 092/171] change default log path --- conf/nps.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nps.conf b/conf/nps.conf index 8c22ab1..d93d48f 100755 --- a/conf/nps.conf +++ b/conf/nps.conf @@ -26,7 +26,7 @@ public_vkey=123 # log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7 log_level=7 -log_path=nps.log +#log_path=nps.log #Whether to restrict IP access, true or false or ignore #ip_limit=true From 3354a48c35085843975376031bccac9da150285e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 12:25:52 +0800 Subject: [PATCH 093/171] change default log path --- lib/common/run.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/common/run.go b/lib/common/run.go index 30c63c1..bfc4858 100644 --- a/lib/common/run.go +++ b/lib/common/run.go @@ -48,9 +48,9 @@ func IsWindows() bool { func GetLogPath() string { var path string if IsWindows() { - path = GetAppPath() + path = filepath.Join(GetAppPath(), "nps.log") } else { - path = "/tmp" + path = "/var/log/nps.log" } return path } From a1200ae0ec8c3697bd1b06c6289485b4151c465a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 12:26:36 +0800 Subject: [PATCH 094/171] add package service and gzip --- go.mod | 4 ++++ go.sum | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/go.mod b/go.mod index 563a6d6..1bf3f8f 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,14 @@ require ( fyne.io/fyne v1.2.0-beta2 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/astaxie/beego v1.12.0 + github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d + github.com/dsnet/compress v0.0.1 // indirect github.com/go-ole/go-ole v1.2.4 // indirect github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db + github.com/kardianos/service v1.0.0 // indirect github.com/klauspost/cpuid v1.2.1 // indirect + github.com/klauspost/pgzip v1.2.1 // indirect github.com/klauspost/reedsolomon v1.9.2 // indirect github.com/panjf2000/ants/v2 v2.2.2 github.com/pkg/errors v0.8.1 diff --git a/go.sum b/go.sum index e4f4325..01ef3ad 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkK github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= +github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c h1:aprLqMn7gSPT+vdDSl+/E6NLEuArwD/J7IWd8bJt5lQ= +github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c/go.mod h1:Ie6SubJv/NTO9Q0UBH0QCl3Ve50lu9hjbi5YJUw03TE= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d h1:As4937T5NVbJ/DmZT9z33pyLEprMd6CUSfhbmMY57Io= github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d/go.mod h1:3FK1bMar37f7jqVY7q/63k3OMX1c47pGCufzt3X0sYE= @@ -19,6 +21,9 @@ github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFl github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= @@ -26,6 +31,8 @@ github.com/exfly/beego v1.12.0-export-init h1:VQNYKdXhAwZGUaFmQv8Aj921O3rQJZRIF8 github.com/exfly/beego v1.12.0-export-init/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gen2brain/go-unarr v0.0.0-20190203132630-dd30f8db8e40 h1:rnd7FAy39Y3+YOboqzQmGj62n9lJMoMr1TlIc1FTd/o= +github.com/gen2brain/go-unarr v0.0.0-20190203132630-dd30f8db8e40/go.mod h1:29wlntTq0xoOBDzoKlxLhCDh/G2GqMBam0P17/tMslE= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f h1:7MsFMbSn8Lcw0blK4+NEOf8DuHoOBDhJsHz04yh13pM= @@ -42,8 +49,15 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= github.com/josephspurrier/goversioninfo v0.0.0-20190124120936-8611f5a5ff3f/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= +github.com/kardianos/service v1.0.0 h1:HgQS3mFfOlyntWX8Oke98JcJLqt1DBcHR4kxShpYef0= +github.com/kardianos/service v1.0.0/go.mod h1:8CzDhVuCuugtsHyZoTvsOBuvonN/UDBvl0kH+BUxvbo= +github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM= +github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.9.2 h1:E9CMS2Pqbv+C7tsrYad4YC9MfhnMVWhMRsTi7U0UB18= github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -83,6 +97,8 @@ github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b h1:mnG1fcsIB1d/3vbkB github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= github.com/tjfoc/gmsm v1.0.1 h1:R11HlqhXkDospckjZEihx9SW/2VW0RgdwrykyWMFOQU= github.com/tjfoc/gmsm v1.0.1/go.mod h1:XxO4hdhhrzAd+G4CjDqaOkd0hUzmtPR/d3EiBBMn/wc= +github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= github.com/xtaci/kcp-go v5.4.4+incompatible h1:QIJ0a0Q0N1G20yLHL2+fpdzyy2v/Cb3PI+xiwx/KK9c= github.com/xtaci/kcp-go v5.4.4+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= @@ -101,6 +117,7 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4r golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= From 4c964af58a7763ffa506d6a1ff9b6556f9bfe580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 12:27:38 +0800 Subject: [PATCH 095/171] add service --- lib/install/install.go | 147 ++++++++++++++++++++++++----------------- lib/version/version.go | 2 +- 2 files changed, 87 insertions(+), 62 deletions(-) diff --git a/lib/install/install.go b/lib/install/install.go index 7b03581..5f98338 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -1,99 +1,123 @@ package install import ( + "encoding/json" "errors" "fmt" + "github.com/c4milo/unpackit" + "github.com/cnlh/nps/lib/common" "io" "io/ioutil" "log" + "net/http" "os" "path/filepath" + "runtime" "strings" - - "github.com/cnlh/nps/lib/common" ) -func InstallNps() { - unit := `[Unit] -Description=nps - convenient proxy server -Documentation=https://github.com/cnlh/nps/ -After=network-online.target remote-fs.target nss-lookup.target -Wants=network-online.target` - service := `[Service] -Type=simple -KillMode=process -Restart=always -RestartSec=15s -StandardOutput=append:/var/log/nps/nps.log -ExecStartPre=/bin/echo 'Starting nps' -ExecStopPost=/bin/echo 'Stopping nps' -ExecStart=` - install := `[Install] -WantedBy=multi-user.target` +func Update() { + downloadLatest() +} - path := common.GetInstallPath() - if common.FileExists(path) { - log.Fatalf("the path %s has exist, does not support install", path) +type release struct { + TagName string `json:"tag_name"` +} + +func downloadLatest() { + // get version + data, err := http.Get("https://api.github.com/repos/cnlh/nps/releases/latest") + if err != nil { + log.Fatal(err.Error()) } - MkidrDirAll(path, "conf", "web/static", "web/views") + b, err := ioutil.ReadAll(data.Body) + if err != nil { + log.Fatal(err) + } + rl := new(release) + json.Unmarshal(b, &rl) + version := rl.TagName + fmt.Println("the latest version is", version) + filename := runtime.GOOS + "_" + runtime.GOARCH + "_server" + ".tar.gz" + // download latest package + downloadUrl := fmt.Sprintf("https://github.com/cnlh/nps/releases/download/%s/%s", version, filename) + fmt.Println("download package from ", downloadUrl) + resp, err := http.Get(downloadUrl) + if err != nil { + log.Fatal(err.Error()) + } + destPath, err := unpackit.Unpack(resp.Body, "") + if err != nil { + log.Fatal(err) + } + destPath = strings.Replace(destPath, "/web", "", -1) + destPath = strings.Replace(destPath, `\web`, "", -1) + destPath = strings.Replace(destPath, "/views", "", -1) + destPath = strings.Replace(destPath, `\views`, "", -1) //复制文件到对应目录 - if err := CopyDir(filepath.Join(common.GetAppPath(), "web", "views"), filepath.Join(path, "web", "views")); err != nil { - log.Fatalln(err) - } - if err := CopyDir(filepath.Join(common.GetAppPath(), "web", "static"), filepath.Join(path, "web", "static")); err != nil { - log.Fatalln(err) - } - if err := CopyDir(filepath.Join(common.GetAppPath(), "conf"), filepath.Join(path, "conf")); err != nil { - log.Fatalln(err) + copyStaticFile(destPath) + fmt.Println("Update completed, please restart") + if common.IsWindows() { + fmt.Println("windows 请将nps_new.exe替换成nps.exe") } +} +func copyStaticFile(srcPath string) string { + path := common.GetInstallPath() + //复制文件到对应目录 + if err := CopyDir(filepath.Join(srcPath, "web", "views"), filepath.Join(path, "web", "views")); err != nil { + log.Fatalln(err) + } + os.Chmod(filepath.Join(path, "web", "views"), 0766) + if err := CopyDir(filepath.Join(srcPath, "web", "static"), filepath.Join(path, "web", "static")); err != nil { + log.Fatalln(err) + } + os.Chmod(filepath.Join(path, "web", "static"), 0766) + binPath, _ := filepath.Abs(os.Args[0]) if !common.IsWindows() { - if _, err := copyFile(filepath.Join(common.GetAppPath(), "nps"), "/usr/bin/nps"); err != nil { - if _, err := copyFile(filepath.Join(common.GetAppPath(), "nps"), "/usr/local/bin/nps"); err != nil { + if _, err := copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/nps"); err != nil { + if _, err := copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/nps"); err != nil { log.Fatalln(err) } else { - os.Chmod("/usr/local/bin/nps", 0755) - service += "/usr/local/bin/nps" - log.Println("Executable files have been copied to", "/usr/local/bin/nps") + binPath = "/usr/local/bin/nps" } } else { - os.Chmod("/usr/bin/nps", 0755) - service += "/usr/bin/nps" - log.Println("Executable files have been copied to", "/usr/bin/nps") + binPath = "/usr/bin/nps" } - systemd := unit + "\n\n" + service + "\n\n" + install - if _, err := os.Stat("/usr/lib/systemd/system"); os.IsExist(err) { - _ = os.Remove("/usr/lib/systemd/system/nps.service") - err := ioutil.WriteFile("/usr/lib/systemd/system/nps.service", []byte(systemd), 0644) - if err != nil { - log.Println("Write systemd service err ", err) - } - } else if _, err := os.Stat("/lib/systemd/system"); os.IsExist(err) { - _ = os.Remove("/lib/systemd/system/nps.service") - err := ioutil.WriteFile("/lib/systemd/system/nps.service", []byte(systemd), 0644) - if err != nil { - log.Println("Write systemd service err ", err) - } - } else { - log.Println("Write systemd service fail, not found the systemd system path ") - } - - _ = os.Mkdir("/var/log/nps", 644) + } else { + copyFile(filepath.Join(srcPath, "nps.exe"), filepath.Join(common.GetAppPath(), "nps_new.exe")) } + os.Chmod(binPath, 0755) + return binPath +} + +func InstallNps() string { + path := common.GetInstallPath() + if common.FileExists(path) { + MkidrDirAll(path, "web/static", "web/views") + } else { + MkidrDirAll(path, "conf", "web/static", "web/views") + // not copy config if the config file is exist + if err := CopyDir(filepath.Join(common.GetAppPath(), "conf"), filepath.Join(path, "conf")); err != nil { + log.Fatalln(err) + } + os.Chmod(filepath.Join(path, "conf"), 0766) + } + binPath := copyStaticFile(common.GetAppPath()) log.Println("install ok!") log.Println("Static files and configuration files in the current directory will be useless") log.Println("The new configuration file is located in", path, "you can edit them") if !common.IsWindows() { log.Println(`You can start with: -sudo systemctl enable|disable|start|stop|restart|status nps -or: -nps test|start|stop|restart|status +nps start|stop|restart|uninstall|update anywhere!`) } else { log.Println(`You can copy executable files to any directory and start working with: -nps.exe test|start|stop|restart|status +nps.exe start|stop|restart|uninstall|update now!`) } + os.Chmod(common.GetLogPath(), 0777) + return binPath } func MkidrDirAll(path string, v ...string) { for _, item := range v { @@ -130,6 +154,7 @@ func CopyDir(srcPath string, destPath string) error { destNewPath := strings.Replace(path, srcPath, destPath, -1) log.Println("copy file ::" + path + " to " + destNewPath) copyFile(path, destNewPath) + os.Chmod(destNewPath, 0766) } return nil }) diff --git a/lib/version/version.go b/lib/version/version.go index b3ffbb1..5c80ede 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,6 +1,6 @@ package version -const VERSION = "0.25.1" +const VERSION = "0.25.2" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { From f86b4c873e7108df5b9effa9dffac74bc5416ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 12:28:01 +0800 Subject: [PATCH 096/171] add service --- cmd/nps/nps.go | 116 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 95 insertions(+), 21 deletions(-) diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 98f13af..72f0d40 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -2,9 +2,11 @@ package main import ( "flag" + "github.com/cnlh/nps/lib/install" "log" "os" "path/filepath" + "strings" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" @@ -12,14 +14,13 @@ import ( "github.com/cnlh/nps/lib/crypt" "github.com/cnlh/nps/lib/daemon" "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/install" "github.com/cnlh/nps/lib/version" "github.com/cnlh/nps/server" "github.com/cnlh/nps/server/connection" - "github.com/cnlh/nps/server/test" "github.com/cnlh/nps/server/tool" "github.com/cnlh/nps/web/routers" + "github.com/kardianos/service" ) var ( @@ -29,20 +30,9 @@ var ( func main() { flag.Parse() - beego.LoadAppConfig("ini", filepath.Join(common.GetRunPath(), "conf", "nps.conf")) - routers.Init() - if len(os.Args) > 1 { - switch os.Args[1] { - case "test": - test.TestServerConfig() - log.Println("test ok, no error") - return - case "start", "restart", "stop", "status", "reload": - daemon.InitDaemon("nps", common.GetRunPath(), common.GetTmpPath()) - case "install": - install.InstallNps() - return - } + // init log + if err := beego.LoadAppConfig("ini", filepath.Join(common.GetRunPath(), "conf", "nps.conf")); err != nil { + log.Fatalln("load config file error", err.Error()) } if level = beego.AppConfig.String("log_level"); level == "" { level = "7" @@ -50,11 +40,90 @@ func main() { logs.Reset() logs.EnableFuncCallDepth(true) logs.SetLogFuncCallDepth(3) - if *logType == "stdout" { - logs.SetLogger(logs.AdapterConsole, `{"level":`+level+`,"color":true}`) - } else { - logs.SetLogger(logs.AdapterFile, `{"level":`+level+`,"filename":"`+beego.AppConfig.String("log_path")+`","daily":false,"maxlines":100000,"color":true}`) + logPath := beego.AppConfig.String("log_path") + if logPath == "" { + logPath = common.GetLogPath() } + if common.IsWindows() { + logPath = strings.Replace(logPath, "\\", "\\\\", -1) + } + logs.SetLogger(logs.AdapterFile, `{"level":`+level+`,"filename":"`+logPath+`","daily":false,"maxlines":100000,"color":true}`) + // init service + options := make(service.KeyValue) + options["Restart"] = "on-success" + options["SuccessExitStatus"] = "1 2 8 SIGKILL" + svcConfig := &service.Config{ + Name: "Nps", + DisplayName: "nps内网穿透代理服务器", + Description: "一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。", + Option: options, + } + if !common.IsWindows() { + svcConfig.Dependencies = []string{ + "Requires=network.target", + "After=network-online.target syslog.target"} + } + prg := &nps{} + s, err := service.New(prg, svcConfig) + if err != nil { + logs.Error(err) + return + } + if len(os.Args) > 1 { + switch os.Args[1] { + case "debug": + logs.SetLogger(logs.AdapterConsole, `{"level":`+level+`,"color":true}`) + case "reload": + daemon.InitDaemon("nps", common.GetRunPath(), common.GetTmpPath()) + return + case "install": + // uninstall before + service.Control(s, "uninstall") + + binPath := install.InstallNps() + svcConfig.Executable = binPath + s, err := service.New(prg, svcConfig) + if err != nil { + logs.Error(err) + return + } + err = service.Control(s, os.Args[1]) + if err != nil { + logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + } + return + case "start", "restart", "stop", "uninstall": + err := service.Control(s, os.Args[1]) + if err != nil { + logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + } + return + case "update": + install.Update() + return + default: + logs.Error("command is not support") + return + } + } + s.Run() +} + +type nps struct { + exit chan struct{} +} + +func (p *nps) Start(s service.Service) error { + p.run() + return nil +} +func (p *nps) Stop(s service.Service) error { + close(p.exit) + return nil +} + +func (p *nps) run() error { + routers.Init() task := &file.Tunnel{ Mode: "webServer", } @@ -68,5 +137,10 @@ func main() { crypt.InitTls(filepath.Join(common.GetRunPath(), "conf", "server.pem"), filepath.Join(common.GetRunPath(), "conf", "server.key")) tool.InitAllowPort() tool.StartSystemInfo() - server.StartNewServer(bridgePort, task, beego.AppConfig.String("bridge_type")) + go server.StartNewServer(bridgePort, task, beego.AppConfig.String("bridge_type")) + select { + case <-p.exit: + logs.Warning("stop...") + } + return nil } From 3b24752e06271632f01179a5fbc69877422e4b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 15:55:19 +0800 Subject: [PATCH 097/171] catch panic --- cmd/nps/nps.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 72f0d40..7ce6d8b 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -6,6 +6,7 @@ import ( "log" "os" "path/filepath" + "runtime" "strings" "github.com/astaxie/beego" @@ -64,6 +65,7 @@ func main() { "After=network-online.target syslog.target"} } prg := &nps{} + prg.exit = make(chan struct{}) s, err := service.New(prg, svcConfig) if err != nil { logs.Error(err) @@ -123,6 +125,14 @@ func (p *nps) Stop(s service.Service) error { } func (p *nps) run() error { + defer func() { + if err := recover(); err != nil { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + logs.Warning("nps: panic serving %v: %v\n%s", err, string(buf)) + } + }() routers.Init() task := &file.Tunnel{ Mode: "webServer", From fcb386455807e8f7fb50d9516bc0dedb8287381c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 16:14:49 +0800 Subject: [PATCH 098/171] add edit on github in md --- docs/index.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index c86cf55..caaab9b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -11,7 +11,10 @@
    + + - From f70a0dab5ff950e5915a8ef5bb18fe158745943f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 17:27:00 +0800 Subject: [PATCH 099/171] change md --- README.md | 31 +++++++++++++++++++++---------- docs/nps_use.md | 46 +++++----------------------------------------- docs/run.md | 33 ++++++++++++++++++++++----------- 3 files changed, 48 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 8ef2b90..005c574 100644 --- a/README.md +++ b/README.md @@ -28,19 +28,30 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 下载对应的系统版本即可,服务端和客户端是单独的 ### 服务端启动 -1. 进入服务端启动 -```shell - ./nps -``` -如有错误修改配置文件相应端口,无错误可继续进行下去 +下载完服务器压缩包后,解压,然后进入解压后的文件夹 -2. 访问服务端ip:web服务端口(默认为8024) -3. 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) -4. 在web中创建客户端 +- 执行安装命令 + +对于linux|darwin ```sudo ./nps install``` + +对于windows,管理员身份运行cmd,进入安装目录 ```nps.exe install``` + +- 启动 + +对于linux|darwin ```sudo nps start``` + +对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` + +停止和重启可用,start和restart + +**如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** +- 访问服务端ip:web服务端口(默认为8080) +- 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) +- 创建客户端 ### 客户端连接 -1. 点击web管理中客户端前的+号,复制启动命令 -2. 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 +- 点击web管理中客户端前的+号,复制启动命令 +- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 ### 配置 - 客户端连接后,在web中配置对应穿透服务即可 diff --git a/docs/nps_use.md b/docs/nps_use.md index 1985811..a20a6bd 100644 --- a/docs/nps_use.md +++ b/docs/nps_use.md @@ -1,57 +1,21 @@ +# 使用 **提示:使用web模式时,服务端执行文件必须在项目根目录,否则无法正确加载配置文件** - -# 服务端测试 -```shell - ./nps test -``` -如有错误请及时修改配置文件,无错误可继续进行下去 -# 服务端启动 -```shell - ./nps start -``` -**如果无需daemon运行或者打开后无法正常访问web管理,去掉start查看日志运行即可** - -# web管理 +## web管理 进入web界面,公网ip:web界面端口(默认8080),密码默认为123 进入web管理界面,有详细的说明 -# 服务端配置文件重载 -如果是daemon启动 +## 服务端配置文件重载 ```shell - ./nps reload + sudo nps reload ``` **说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 -# 服务端停止或重启 +## 服务端停止或重启 如果是daemon启动 ```shell ./nps stop|restart ``` - -# 将nps安装到系统 -如果需要长期并且方便的运行nps服务端,可将nps安装到操作系统中,可执行命令 - -``` -(./nps|nps.exe) install -``` -安装成功后,对于linux,darwin,将会把配置文件和静态文件放置于/etc/nps/,并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps,安装成功后可在任何位置执行,同时也会添加systemd配置。 - -``` -sudo systemctl enable|disable|start|stop|restart|status nps -``` -systemd,带有开机自启,自动重启配置,当进程结束后15秒会启动,日志输出至/var/log/nps/nps.log。 -建议采用此方式启动,能够捕获panic信息,便于排查问题。 - -``` -nps test|start|stop|restart|status -``` -对于windows系统,将会把配置文件和静态文件放置于C:\Program Files\nps,安装成功后可将可执行文件nps.exe复制到任何位置执行 - -``` -nps.exe test|start|stop|restart|status -``` - diff --git a/docs/run.md b/docs/run.md index c0aec66..9f8fc92 100644 --- a/docs/run.md +++ b/docs/run.md @@ -1,19 +1,30 @@ # 启动 ## 服务端 下载完服务器压缩包后,解压,然后进入解压后的文件夹 -1. 执行命令启动 -```shell - ./nps -``` -**如有错误(E)修改配置文件相应端口**,无错误可继续进行下去 -2. 访问服务端ip:web服务端口(默认为8024) -3. 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) -4. 创建客户端 + +- 执行安装命令 + +对于linux|darwin ```sudo ./nps install``` + +对于windows,管理员身份运行cmd,进入安装目录 ```nps.exe install``` + +- 启动 + +对于linux|darwin ```sudo nps start``` + +对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` + +停止和重启可用,start和restart + +**如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** +- 访问服务端ip:web服务端口(默认为8080) +- 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) +- 创建客户端 ## 客户端 -1. 下载客户端安装包并解压,进入到解压目录 -1. 点击web管理中客户端前的+号,复制启动命令 -2. 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 +- 下载客户端安装包并解压,进入到解压目录 +- 点击web管理中客户端前的+号,复制启动命令 +- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 ## 配置 - 客户端连接后,在web中配置对应穿透服务即可 From 90e78bf41334603e93f2fde2233067347eeb43b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 17:39:46 +0800 Subject: [PATCH 100/171] add web https --- conf/nps.conf | 3 +++ docs/nps_extend.md | 3 ++- server/proxy/tcp.go | 14 +++++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/conf/nps.conf b/conf/nps.conf index d93d48f..01f3e27 100755 --- a/conf/nps.conf +++ b/conf/nps.conf @@ -42,6 +42,9 @@ web_password=123 web_port = 8080 web_ip=0.0.0.0 web_base_url= +web_open_ssl=false +web_cert_file=conf/server.pem +web_key_file=conf/server.key # if web under proxy use sub path. like http://host/nps need this. #web_base_url=/nps diff --git a/docs/nps_extend.md b/docs/nps_extend.md index e15ca8e..5208667 100644 --- a/docs/nps_extend.md +++ b/docs/nps_extend.md @@ -44,7 +44,8 @@ server { } } ``` - +## web管理使用https +如果web管理需要使用https,可以在配置文件`nps.conf`中设置`web_open_ssl=true`,并配置`web_cert_file`和`web_key_file` ## web使用Caddy代理 如果将web配置到Caddy代理,实现子路径访问nps,可以这样配置. diff --git a/server/proxy/tcp.go b/server/proxy/tcp.go index 5b04252..1f593ba 100755 --- a/server/proxy/tcp.go +++ b/server/proxy/tcp.go @@ -65,13 +65,21 @@ func (s *WebServer) Start() error { beego.BConfig.WebConfig.Session.SessionOn = true beego.SetStaticPath(beego.AppConfig.String("web_base_url")+"/static", filepath.Join(common.GetRunPath(), "web", "static")) beego.SetViewsPath(filepath.Join(common.GetRunPath(), "web", "views")) - if l, err := connection.GetWebManagerListener(); err == nil { + err := errors.New("Web management startup failure ") + var l net.Listener + if l, err = connection.GetWebManagerListener(); err == nil { beego.InitBeforeHTTPRun() - http.Serve(l, beego.BeeApp.Handlers) + if beego.AppConfig.String("web_open_ssl") == "true" { + keyPath := beego.AppConfig.String("web_key_file") + certPath := beego.AppConfig.String("web_cert_file") + err = http.ServeTLS(l, beego.BeeApp.Handlers, certPath, keyPath) + } else { + err = http.Serve(l, beego.BeeApp.Handlers) + } } else { logs.Error(err) } - return errors.New("Web management startup failure") + return err } func (s *WebServer) Close() error { From ab67dd5b8afb0f0efef7a5802ccb81c568a6d106 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sat, 14 Dec 2019 18:35:27 +0800 Subject: [PATCH 101/171] bump fyne version --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 563a6d6..a229460 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ module github.com/cnlh/nps -go 1.12 +go 1.13 require ( - fyne.io/fyne v1.2.0-beta2 + fyne.io/fyne v1.2.0 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/astaxie/beego v1.12.0 github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d diff --git a/go.sum b/go.sum index e4f4325..7d7700c 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -fyne.io/fyne v1.2.0-beta2 h1:MEZlRmQc+lyYOoD9Yy9E7JLHxEY6JvwDvO/c/S+gP8M= -fyne.io/fyne v1.2.0-beta2/go.mod h1:Ab+3DIB/FVteW0y4DXfmZv4N3JdnCBh2lHkINI02BOU= +fyne.io/fyne v1.2.0 h1:mdp7Cs7QmSJTeazYxEDa9wWeJNig7paBcjm0dooFtLE= +fyne.io/fyne v1.2.0/go.mod h1:Ab+3DIB/FVteW0y4DXfmZv4N3JdnCBh2lHkINI02BOU= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= From ba081c02c29343550c54952517c7d78cab179115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Sat, 14 Dec 2019 22:20:17 +0800 Subject: [PATCH 102/171] protecting web management --- docs/description.md | 3 +++ web/controllers/login.go | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/docs/description.md b/docs/description.md index 0520ad6..584f5b0 100644 --- a/docs/description.md +++ b/docs/description.md @@ -24,3 +24,6 @@ 默认情况下linux对连接数量有限制,对于性能好的机器完全可以调整内核参数以处理更多的连接。 `tcp_max_syn_backlog` `somaxconn` 酌情调整参数,增强网络性能 + +## web管理保护 +当一个ip连续登陆失败次数超过10次,将在一分钟内禁止该ip再次尝试。 diff --git a/web/controllers/login.go b/web/controllers/login.go index 10da8d7..39c5c55 100755 --- a/web/controllers/login.go +++ b/web/controllers/login.go @@ -1,6 +1,9 @@ package controllers import ( + "math/rand" + "net" + "sync" "time" "github.com/astaxie/beego" @@ -13,12 +16,32 @@ type LoginController struct { beego.Controller } +var ipRecord sync.Map + +type record struct { + hasLoginFailTimes int + lastLoginTime time.Time +} + func (self *LoginController) Index() { self.Data["web_base_url"] = beego.AppConfig.String("web_base_url") self.Data["register_allow"], _ = beego.AppConfig.Bool("allow_user_register") self.TplName = "login/index.html" } func (self *LoginController) Verify() { + clearIprecord() + ip, _, _ := net.SplitHostPort(self.Ctx.Request.RemoteAddr) + if v, ok := ipRecord.Load(ip); ok { + vv := v.(*record) + if (time.Now().Unix() - vv.lastLoginTime.Unix()) >= 60 { + vv.hasLoginFailTimes = 0 + } + if vv.hasLoginFailTimes >= 10 { + self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"} + self.ServeJSON() + return + } + } var auth bool if self.GetString("password") == beego.AppConfig.String("web_password") && self.GetString("username") == beego.AppConfig.String("web_username") { self.SetSession("isAdmin", true) @@ -56,7 +79,14 @@ func (self *LoginController) Verify() { if auth { self.SetSession("auth", true) self.Data["json"] = map[string]interface{}{"status": 1, "msg": "login success"} + ipRecord.Delete(ip) } else { + if v, load := ipRecord.LoadOrStore(ip, &record{hasLoginFailTimes: 1, lastLoginTime: time.Now()}); load { + vv := v.(*record) + vv.lastLoginTime = time.Now() + vv.hasLoginFailTimes += 1 + ipRecord.Store(ip, vv) + } self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"} } self.ServeJSON() @@ -97,3 +127,17 @@ func (self *LoginController) Out() { self.SetSession("auth", false) self.Redirect(beego.AppConfig.String("web_base_url")+"/login/index", 302) } + +func clearIprecord() { + rand.Seed(time.Now().UnixNano()) + x := rand.Intn(100) + if x == 1 { + ipRecord.Range(func(key, value interface{}) bool { + v := value.(*record) + if time.Now().Unix()-v.lastLoginTime.Unix() >= 60 { + ipRecord.Delete(key) + } + return true + }) + } +} From 8d93fbcca99451938266a32ad033c49b672ac66a Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Dec 2019 11:28:23 +0800 Subject: [PATCH 103/171] nps update support --- lib/install/install.go | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/install/install.go b/lib/install/install.go index 5f98338..4d769d7 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -57,9 +57,6 @@ func downloadLatest() { //复制文件到对应目录 copyStaticFile(destPath) fmt.Println("Update completed, please restart") - if common.IsWindows() { - fmt.Println("windows 请将nps_new.exe替换成nps.exe") - } } func copyStaticFile(srcPath string) string { @@ -68,26 +65,29 @@ func copyStaticFile(srcPath string) string { if err := CopyDir(filepath.Join(srcPath, "web", "views"), filepath.Join(path, "web", "views")); err != nil { log.Fatalln(err) } - os.Chmod(filepath.Join(path, "web", "views"), 0766) + chMod(filepath.Join(path, "web", "views"), 0766) if err := CopyDir(filepath.Join(srcPath, "web", "static"), filepath.Join(path, "web", "static")); err != nil { log.Fatalln(err) } - os.Chmod(filepath.Join(path, "web", "static"), 0766) + chMod(filepath.Join(path, "web", "static"), 0766) binPath, _ := filepath.Abs(os.Args[0]) if !common.IsWindows() { if _, err := copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/nps"); err != nil { if _, err := copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/nps"); err != nil { log.Fatalln(err) } else { + copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/nps-update") binPath = "/usr/local/bin/nps" } } else { + copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/nps-update") binPath = "/usr/bin/nps" } } else { - copyFile(filepath.Join(srcPath, "nps.exe"), filepath.Join(common.GetAppPath(), "nps_new.exe")) + copyFile(filepath.Join(srcPath, "nps.exe"), filepath.Join(common.GetAppPath(), "nps-update.exe")) + copyFile(filepath.Join(srcPath, "nps.exe"), filepath.Join(common.GetAppPath(), "nps.exe")) } - os.Chmod(binPath, 0755) + chMod(binPath, 0755) return binPath } @@ -101,7 +101,7 @@ func InstallNps() string { if err := CopyDir(filepath.Join(common.GetAppPath(), "conf"), filepath.Join(path, "conf")); err != nil { log.Fatalln(err) } - os.Chmod(filepath.Join(path, "conf"), 0766) + chMod(filepath.Join(path, "conf"), 0766) } binPath := copyStaticFile(common.GetAppPath()) log.Println("install ok!") @@ -109,14 +109,14 @@ func InstallNps() string { log.Println("The new configuration file is located in", path, "you can edit them") if !common.IsWindows() { log.Println(`You can start with: -nps start|stop|restart|uninstall|update +nps start|stop|restart|uninstall|update or nps-update update anywhere!`) } else { log.Println(`You can copy executable files to any directory and start working with: -nps.exe start|stop|restart|uninstall|update +nps.exe start|stop|restart|uninstall|update or nps-update.exe update now!`) } - os.Chmod(common.GetLogPath(), 0777) + chMod(common.GetLogPath(), 0777) return binPath } func MkidrDirAll(path string, v ...string) { @@ -154,7 +154,9 @@ func CopyDir(srcPath string, destPath string) error { destNewPath := strings.Replace(path, srcPath, destPath, -1) log.Println("copy file ::" + path + " to " + destNewPath) copyFile(path, destNewPath) - os.Chmod(destNewPath, 0766) + if !common.IsWindows(){ + chMod(destNewPath, 0766) + } } return nil }) @@ -207,3 +209,9 @@ func pathExists(path string) (bool, error) { } return false, err } + +func chMod(name string, mode os.FileMode) { + if !common.IsWindows(){ + os.Chmod(name, mode) + } +} From 4ef73d7fe9c10a40bed52996593c2b023221238b Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Dec 2019 11:34:52 +0800 Subject: [PATCH 104/171] update md --- docs/nps_use.md | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/nps_use.md b/docs/nps_use.md index a20a6bd..4058869 100644 --- a/docs/nps_use.md +++ b/docs/nps_use.md @@ -8,14 +8,36 @@ 进入web管理界面,有详细的说明 ## 服务端配置文件重载 +对于linux、darwin ```shell sudo nps reload ``` +对于windows +```shell + nps.exe reload +``` **说明:** 仅支持部分配置重载,例如`allow_user_login` `auth_crypt_key` `auth_key` `web_username` `web_password` 等,未来将支持更多 ## 服务端停止或重启 -如果是daemon启动 +对于linux、darwin ```shell - ./nps stop|restart + sudo nps stop|restart ``` +对于windows +```shell + nps.exe stop|restart +``` +## 服务端更新 +请首先执行`sudo nps stop`或者`nps.exe stop`停止运行,然后 + +对于linux +```shell + sudo nps-update update +``` +对于windows +```shell + nps-update.exe update +``` + +更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 \ No newline at end of file From 0d94b7c39eff137366f3db133c8d3fb8a3bb641c Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Dec 2019 11:37:53 +0800 Subject: [PATCH 105/171] change md --- README.md | 2 +- docs/run.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 005c574..e12f47a 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` -停止和重启可用,start和restart +停止和重启可用,stop和restart **如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** - 访问服务端ip:web服务端口(默认为8080) diff --git a/docs/run.md b/docs/run.md index 9f8fc92..a1b7c9c 100644 --- a/docs/run.md +++ b/docs/run.md @@ -14,7 +14,7 @@ 对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` -停止和重启可用,start和restart +停止和重启可用,stop和restart **如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** - 访问服务端ip:web服务端口(默认为8080) From 55a8466d83d0f065a77eea9313cab6195c6ab5bc Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Dec 2019 16:16:49 +0800 Subject: [PATCH 106/171] change nps service --- cmd/nps/nps.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 7ce6d8b..508cd40 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -121,6 +121,9 @@ func (p *nps) Start(s service.Service) error { } func (p *nps) Stop(s service.Service) error { close(p.exit) + if service.Interactive() { + os.Exit(0) + } return nil } From 39921584dff8377b6f0f6f7adb4119e4fb7ffe0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 01:13:22 +0800 Subject: [PATCH 107/171] update md --- docs/example.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/example.md b/docs/example.md index e37c1f6..acaab93 100644 --- a/docs/example.md +++ b/docs/example.md @@ -25,7 +25,7 @@ 现在访问(http|https://)`a.proxy.com`,`b.proxy.com`即可成功 -**https:** 如需使用https请进行相关配置,详见 [使用https](##使用https) +**https:** 如需使用https请进行相关配置,详见 [使用https](/nps_extend?id=使用https) ## tcp隧道 @@ -100,7 +100,7 @@ ## p2p服务 -**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](##nat类型检测) +**适用范围:** 大流量传输场景,流量不经过公网服务器,但是由于p2p穿透和nat类型关系较大,不保证100%成功,支持大部分nat类型。[nat类型检测](/npc_extend?id=nat类型检测) **假设场景:** From 72b61c4c4f788eaaf62b49f186e47afd7a6e0cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 01:23:46 +0800 Subject: [PATCH 108/171] update md --- docs/run.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/run.md b/docs/run.md index a1b7c9c..f3e566b 100644 --- a/docs/run.md +++ b/docs/run.md @@ -16,7 +16,7 @@ 停止和重启可用,stop和restart -**如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** +**如果发现没有启动成功,可以使用`nps(.exe) debug`运行调试,或查看日志**(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log) - 访问服务端ip:web服务端口(默认为8080) - 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) - 创建客户端 From d930d9f0034be67e3b0ec28fab855a7004a42be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 02:28:31 +0800 Subject: [PATCH 109/171] npc service init --- cmd/npc/npc.go | 124 ++++++++++++++++++++++++++++++++++++++-------- lib/common/run.go | 11 ++++ 2 files changed, 113 insertions(+), 22 deletions(-) diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index fe5b3f5..7de5850 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -3,18 +3,18 @@ package main import ( "flag" "fmt" - "os" - "strings" - "time" - "github.com/astaxie/beego/logs" "github.com/ccding/go-stun/stun" "github.com/cnlh/nps/client" "github.com/cnlh/nps/lib/common" "github.com/cnlh/nps/lib/config" - "github.com/cnlh/nps/lib/daemon" "github.com/cnlh/nps/lib/file" "github.com/cnlh/nps/lib/version" + "github.com/kardianos/service" + "os" + "runtime" + "strings" + "time" ) var ( @@ -30,11 +30,56 @@ var ( password = flag.String("password", "", "p2p password flag") target = flag.String("target", "", "p2p target") localType = flag.String("local_type", "p2p", "p2p target") - logPath = flag.String("log_path", "npc.log", "npc log path") + logPath = flag.String("log_path", "", "npc log path") + debug = flag.Bool("debug", false, "npc debug") + srv = flag.String("service", "", "npc debug") ) func main() { flag.Parse() + logs.Reset() + logs.EnableFuncCallDepth(true) + logs.SetLogFuncCallDepth(3) + if *logPath == "" { + *logPath = common.GetNpcLogPath() + } + if common.IsWindows() { + *logPath = strings.Replace(*logPath, "\\", "\\\\", -1) + } + if *debug { + logs.SetLogger(logs.AdapterConsole, `{"level":`+*logLevel+`,"color":true}`) + } else { + logs.SetLogger(logs.AdapterFile, `{"level":`+*logLevel+`,"filename":"`+*logPath+`","daily":false,"maxlines":100000,"color":true}`) + } + + // init service + options := make(service.KeyValue) + options["Restart"] = "on-success" + options["SuccessExitStatus"] = "1 2 8 SIGKILL" + svcConfig := &service.Config{ + Name: "Npc", + DisplayName: "nps内网穿透客户端", + Description: "一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。", + Option: options, + } + if !common.IsWindows() { + svcConfig.Dependencies = []string{ + "Requires=network.target", + "After=network-online.target syslog.target"} + } + for _, v := range os.Args[1:] { + if !strings.Contains(v, "-service=") { + svcConfig.Arguments = append(svcConfig.Arguments, v) + } + } + prg := &npc{ + exit: make(chan struct{}), + } + s, err := service.New(prg, svcConfig) + if err != nil { + logs.Error(err) + return + } if len(os.Args) >= 2 { switch os.Args[1] { case "status": @@ -55,14 +100,42 @@ func main() { os.Exit(0) } } - daemon.InitDaemon("npc", common.GetRunPath(), common.GetTmpPath()) - logs.EnableFuncCallDepth(true) - logs.SetLogFuncCallDepth(3) - if *logType == "stdout" { - logs.SetLogger(logs.AdapterConsole, `{"level":`+*logLevel+`,"color":true}`) - } else { - logs.SetLogger(logs.AdapterFile, `{"level":`+*logLevel+`,"filename":"`+*logPath+`","daily":false,"maxlines":100000,"color":true}`) + + if *srv != "" { + err := service.Control(s, *srv) + if err != nil { + logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + } + return } + s.Run() +} + +type npc struct { + exit chan struct{} +} + +func (p *npc) Start(s service.Service) error { + p.run() + return nil +} +func (p *npc) Stop(s service.Service) error { + close(p.exit) + if service.Interactive() { + os.Exit(0) + } + return nil +} + +func (p *npc) run() error { + defer func() { + if err := recover(); err != nil { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + logs.Warning("npc: panic serving %v: %v\n%s", err, string(buf)) + } + }() //p2p or secret command if *password != "" { commonConfig := new(config.CommonConfig) @@ -76,8 +149,8 @@ func main() { localServer.Port = *localPort commonConfig.Client = new(file.Client) commonConfig.Client.Cnf = new(file.Config) - client.StartLocalServer(localServer, commonConfig) - return + go client.StartLocalServer(localServer, commonConfig) + return nil } env := common.GetEnvMap() if *serverAddr == "" { @@ -88,15 +161,22 @@ func main() { } logs.Info("the version of client is %s, the core version of client is %s", version.VERSION, version.GetVersion()) if *verifyKey != "" && *serverAddr != "" && *configPath == "" { - for { - client.NewRPClient(*serverAddr, *verifyKey, *connType, *proxyUrl, nil).Start() - logs.Info("It will be reconnected in five seconds") - time.Sleep(time.Second * 5) - } + go func() { + for { + client.NewRPClient(*serverAddr, *verifyKey, *connType, *proxyUrl, nil).Start() + logs.Info("It will be reconnected in five seconds") + time.Sleep(time.Second * 5) + } + }() } else { if *configPath == "" { - *configPath = "npc.conf" + *configPath = "conf/npc.conf" } - client.StartFromFile(*configPath) + go client.StartFromFile(*configPath) } + select { + case <-p.exit: + logs.Warning("stop...") + } + return nil } diff --git a/lib/common/run.go b/lib/common/run.go index bfc4858..569ff5c 100644 --- a/lib/common/run.go +++ b/lib/common/run.go @@ -55,6 +55,17 @@ func GetLogPath() string { return path } +//interface npc log file path +func GetNpcLogPath() string { + var path string + if IsWindows() { + path = filepath.Join(GetAppPath(), "npc.log") + } else { + path = "/var/log/npc.log" + } + return path +} + //interface pid file path func GetTmpPath() string { var path string From 90ff08ed98b77c2525ae93427c07028fb2425dc1 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 16 Dec 2019 10:43:46 +0800 Subject: [PATCH 110/171] test gui --- gui/fyne_demo/data/bundled-scene.go | 14 +++ gui/fyne_demo/data/fyne_scene_dark.png | Bin 0 -> 42648 bytes gui/fyne_demo/data/fyne_scene_light.png | Bin 0 -> 41770 bytes gui/fyne_demo/data/gen.go | 57 +++++++++ gui/fyne_demo/data/icons.go | 40 ++++++ gui/fyne_demo/main.go | 76 ++++++++++++ gui/fyne_demo/screens/advanced.go | 65 ++++++++++ gui/fyne_demo/screens/graphics.go | 50 ++++++++ gui/fyne_demo/screens/icons.go | 144 ++++++++++++++++++++++ gui/fyne_demo/screens/layout.go | 72 +++++++++++ gui/fyne_demo/screens/theme.go | 118 ++++++++++++++++++ gui/fyne_demo/screens/widget.go | 157 ++++++++++++++++++++++++ gui/fyne_demo/screens/window.go | 84 +++++++++++++ 13 files changed, 877 insertions(+) create mode 100644 gui/fyne_demo/data/bundled-scene.go create mode 100644 gui/fyne_demo/data/fyne_scene_dark.png create mode 100644 gui/fyne_demo/data/fyne_scene_light.png create mode 100644 gui/fyne_demo/data/gen.go create mode 100644 gui/fyne_demo/data/icons.go create mode 100644 gui/fyne_demo/main.go create mode 100644 gui/fyne_demo/screens/advanced.go create mode 100644 gui/fyne_demo/screens/graphics.go create mode 100644 gui/fyne_demo/screens/icons.go create mode 100644 gui/fyne_demo/screens/layout.go create mode 100644 gui/fyne_demo/screens/theme.go create mode 100644 gui/fyne_demo/screens/widget.go create mode 100644 gui/fyne_demo/screens/window.go diff --git a/gui/fyne_demo/data/bundled-scene.go b/gui/fyne_demo/data/bundled-scene.go new file mode 100644 index 0000000..f4e06d5 --- /dev/null +++ b/gui/fyne_demo/data/bundled-scene.go @@ -0,0 +1,14 @@ +// **** THIS FILE IS AUTO-GENERATED, PLEASE DO NOT EDIT IT **** // + +package data + +import "fyne.io/fyne" + +var fynescenedark = &fyne.StaticResource{ + StaticName: "fyne_scene_dark.png", + StaticContent: []byte{ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1, 201, 0, 0, 1, 79, 8, 6, 0, 0, 0, 38, 214, 53, 180, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 150, 101, 88, 73, 102, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 26, 0, 5, 0, 0, 0, 1, 0, 0, 0, 74, 1, 27, 0, 5, 0, 0, 0, 1, 0, 0, 0, 82, 1, 49, 0, 2, 0, 0, 0, 17, 0, 0, 0, 90, 135, 105, 0, 4, 0, 0, 0, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 0, 0, 0, 3, 160, 1, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 160, 2, 0, 4, 0, 0, 0, 1, 0, 0, 1, 201, 160, 3, 0, 4, 0, 0, 0, 1, 0, 0, 1, 79, 0, 0, 0, 0, 52, 31, 119, 147, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 18, 116, 0, 0, 18, 116, 1, 222, 102, 31, 120, 0, 0, 1, 203, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 24, 203, 85, 88, 0, 0, 163, 196, 73, 68, 65, 84, 120, 218, 236, 93, 7, 124, 20, 69, 251, 62, 154, 88, 63, 253, 252, 44, 127, 123, 239, 138, 5, 20, 129, 16, 58, 82, 44, 32, 32, 189, 215, 16, 16, 66, 239, 6, 164, 131, 32, 69, 148, 222, 68, 16, 164, 73, 239, 72, 239, 189, 247, 78, 32, 189, 222, 237, 109, 153, 255, 188, 115, 51, 199, 176, 94, 114, 151, 100, 47, 112, 199, 251, 252, 126, 227, 197, 144, 219, 219, 155, 221, 157, 103, 222, 246, 188, 54, 27, 2, 129, 64, 220, 33, 16, 66, 114, 209, 145, 143, 142, 252, 116, 220, 71, 71, 110, 47, 127, 251, 56, 29, 111, 208, 81, 140, 142, 234, 116, 180, 166, 163, 47, 29, 227, 232, 152, 77, 199, 74, 58, 182, 210, 177, 159, 142, 147, 116, 92, 162, 35, 150, 142, 84, 58, 20, 58, 52, 58, 116, 254, 115, 10, 29, 209, 116, 92, 160, 227, 40, 29, 123, 232, 216, 64, 199, 98, 58, 166, 209, 241, 19, 29, 61, 232, 104, 74, 199, 87, 116, 124, 206, 63, 251, 81, 58, 242, 192, 57, 227, 21, 68, 32, 16, 8, 132, 213, 196, 152, 155, 19, 226, 125, 233, 252, 59, 252, 219, 43, 116, 148, 161, 35, 140, 147, 213, 223, 156, 248, 162, 232, 80, 201, 157, 3, 144, 109, 28, 39, 223, 138, 252, 124, 243, 224, 85, 69, 32, 16, 8, 68, 86, 45, 197, 92, 220, 242, 202, 235, 201, 82, 164, 191, 123, 158, 142, 202, 116, 244, 161, 227, 47, 58, 142, 209, 145, 236, 133, 172, 12, 78, 150, 138, 105, 56, 249, 80, 37, 171, 81, 231, 127, 111, 120, 56, 134, 206, 255, 78, 227, 239, 113, 74, 199, 114, 240, 225, 228, 255, 174, 72, 239, 13, 147, 191, 35, 94, 105, 4, 2, 129, 64, 100, 134, 28, 243, 112, 55, 106, 30, 15, 255, 246, 28, 119, 149, 142, 166, 99, 55, 29, 73, 25, 144, 161, 42, 17, 150, 34, 145, 159, 145, 131, 214, 163, 46, 17, 228, 121, 58, 62, 64, 130, 68, 32, 16, 8, 68, 86, 172, 70, 112, 149, 230, 51, 253, 30, 126, 247, 25, 29, 189, 233, 216, 204, 99, 129, 233, 89, 134, 178, 37, 168, 231, 48, 25, 154, 207, 135, 72, 164, 12, 88, 67, 199, 127, 248, 119, 202, 159, 81, 252, 20, 129, 64, 32, 16, 8, 51, 57, 230, 146, 126, 7, 36, 82, 138, 199, 19, 143, 167, 99, 33, 202, 46, 81, 227, 14, 18, 98, 122, 112, 74, 63, 255, 36, 147, 62, 94, 117, 4, 2, 129, 64, 120, 35, 70, 72, 192, 201, 107, 250, 125, 65, 58, 134, 210, 113, 194, 131, 101, 38, 226, 123, 119, 27, 25, 122, 130, 28, 127, 108, 32, 125, 191, 188, 120, 245, 17, 8, 4, 2, 145, 30, 57, 230, 230, 177, 70, 217, 106, 124, 140, 142, 22, 116, 108, 241, 64, 54, 34, 150, 168, 147, 192, 128, 28, 127, 188, 2, 164, 207, 191, 99, 62, 204, 98, 69, 32, 16, 8, 68, 70, 150, 99, 126, 19, 57, 190, 67, 199, 72, 94, 107, 104, 118, 165, 58, 3, 136, 24, 137, 135, 248, 227, 122, 32, 127, 254, 61, 243, 99, 130, 14, 2, 129, 64, 32, 210, 35, 200, 124, 114, 146, 10, 253, 57, 148, 142, 185, 233, 16, 140, 65, 2, 19, 114, 252, 113, 148, 252, 221, 241, 14, 64, 32, 16, 8, 132, 39, 114, 204, 35, 187, 24, 233, 207, 229, 232, 88, 229, 193, 157, 170, 147, 192, 134, 28, 127, 108, 44, 125, 95, 140, 63, 34, 16, 8, 4, 226, 95, 228, 152, 87, 38, 8, 250, 115, 8, 29, 107, 131, 144, 28, 229, 248, 227, 53, 58, 62, 149, 44, 103, 140, 63, 34, 16, 8, 4, 226, 54, 114, 204, 37, 235, 145, 242, 152, 227, 95, 166, 12, 85, 127, 196, 26, 141, 59, 80, 2, 162, 73, 241, 199, 127, 64, 19, 150, 127, 231, 251, 48, 254, 136, 64, 32, 16, 8, 79, 214, 99, 110, 254, 51, 100, 171, 14, 151, 72, 75, 231, 49, 71, 35, 11, 150, 154, 102, 146, 122, 147, 229, 227, 84, 137, 172, 50, 146, 135, 83, 44, 22, 24, 144, 227, 143, 99, 165, 57, 192, 248, 35, 2, 129, 64, 32, 254, 101, 61, 230, 147, 254, 191, 33, 29, 87, 77, 110, 85, 111, 86, 160, 46, 17, 169, 156, 33, 234, 111, 87, 105, 86, 4, 9, 228, 248, 99, 51, 121, 147, 128, 119, 3, 2, 129, 64, 32, 108, 158, 44, 39, 250, 243, 107, 116, 172, 54, 145, 163, 230, 69, 92, 220, 233, 133, 16, 99, 232, 56, 194, 143, 59, 141, 139, 12, 116, 229, 53, 149, 181, 233, 168, 2, 157, 52, 232, 40, 79, 71, 89, 158, 24, 4, 255, 95, 149, 142, 250, 116, 132, 211, 241, 3, 111, 131, 181, 136, 142, 93, 188, 118, 209, 233, 165, 140, 67, 182, 58, 229, 115, 22, 4, 9, 157, 68, 62, 151, 44, 104, 140, 63, 34, 16, 8, 4, 226, 54, 130, 148, 99, 143, 237, 164, 246, 83, 154, 169, 21, 149, 97, 138, 227, 121, 74, 216, 129, 191, 57, 195, 137, 236, 7, 78, 114, 239, 211, 241, 95, 63, 156, 247, 131, 116, 188, 202, 73, 245, 123, 58, 38, 115, 242, 140, 203, 32, 49, 199, 33, 125, 39, 16, 60, 120, 130, 31, 11, 227, 143, 8, 4, 2, 129, 184, 141, 100, 114, 11, 11, 146, 190, 190, 104, 202, 90, 117, 102, 144, 228, 162, 152, 126, 7, 214, 216, 124, 110, 237, 125, 148, 145, 158, 169, 144, 175, 75, 103, 228, 241, 48, 210, 251, 187, 92, 25, 124, 198, 255, 113, 139, 244, 7, 94, 166, 18, 237, 225, 123, 252, 42, 253, 61, 234, 175, 34, 16, 8, 4, 226, 54, 34, 145, 203, 58, 106, 75, 61, 27, 149, 116, 172, 67, 179, 85, 9, 221, 59, 230, 240, 54, 87, 79, 120, 56, 126, 30, 209, 76, 57, 189, 222, 145, 22, 124, 135, 92, 82, 27, 174, 251, 210, 75, 182, 225, 164, 249, 37, 111, 199, 5, 58, 178, 109, 60, 205, 3, 2, 129, 64, 32, 16, 183, 89, 78, 244, 231, 223, 188, 36, 230, 168, 38, 114, 4, 87, 106, 103, 104, 142, 236, 193, 66, 20, 164, 152, 231, 14, 126, 183, 92, 156, 148, 243, 123, 178, 16, 165, 172, 221, 92, 24, 127, 68, 32, 16, 8, 132, 153, 64, 242, 243, 159, 193, 189, 186, 55, 157, 216, 163, 220, 169, 67, 0, 44, 176, 38, 38, 11, 84, 118, 157, 230, 186, 75, 191, 179, 124, 142, 185, 37, 43, 23, 251, 63, 34, 16, 8, 4, 226, 54, 178, 200, 195, 127, 134, 204, 209, 36, 201, 122, 52, 50, 40, 174, 143, 225, 201, 60, 178, 94, 107, 62, 126, 188, 92, 1, 54, 7, 185, 48, 57, 7, 129, 64, 32, 16, 102, 114, 144, 53, 87, 219, 122, 113, 175, 202, 9, 59, 51, 232, 120, 90, 122, 47, 118, 192, 64, 32, 16, 8, 68, 80, 17, 164, 92, 255, 248, 115, 6, 217, 171, 114, 237, 32, 36, 241, 212, 48, 145, 35, 198, 239, 16, 8, 4, 2, 17, 84, 4, 41, 39, 232, 252, 229, 161, 79, 162, 39, 130, 220, 7, 241, 74, 97, 129, 98, 246, 39, 2, 129, 64, 32, 130, 214, 130, 228, 217, 166, 27, 164, 242, 14, 195, 3, 65, 10, 171, 114, 161, 39, 130, 69, 32, 16, 8, 4, 34, 232, 44, 72, 250, 250, 176, 148, 193, 234, 72, 71, 82, 78, 16, 228, 20, 36, 72, 4, 2, 129, 64, 4, 59, 65, 138, 18, 143, 199, 184, 86, 42, 192, 238, 69, 224, 123, 170, 217, 2, 69, 32, 16, 8, 4, 34, 88, 45, 72, 32, 200, 227, 62, 18, 228, 98, 233, 253, 24, 127, 68, 32, 16, 8, 68, 80, 18, 164, 136, 65, 62, 44, 89, 144, 14, 47, 4, 121, 80, 46, 176, 199, 89, 68, 32, 16, 8, 68, 48, 18, 100, 94, 241, 74, 199, 110, 47, 4, 41, 148, 117, 210, 160, 131, 134, 76, 176, 8, 4, 2, 129, 64, 4, 37, 65, 242, 159, 215, 122, 33, 72, 67, 42, 255, 168, 199, 223, 147, 31, 103, 17, 129, 64, 32, 16, 193, 72, 144, 110, 105, 56, 250, 250, 135, 23, 130, 148, 5, 4, 230, 73, 150, 39, 42, 232, 32, 16, 8, 4, 34, 120, 173, 72, 250, 58, 52, 131, 58, 72, 185, 233, 48, 225, 154, 173, 207, 240, 247, 161, 155, 21, 129, 64, 32, 16, 65, 73, 144, 34, 147, 181, 133, 36, 74, 110, 248, 96, 69, 70, 200, 239, 71, 32, 16, 8, 4, 34, 216, 8, 82, 212, 66, 150, 240, 96, 41, 102, 68, 144, 199, 177, 69, 20, 2, 129, 64, 32, 130, 153, 32, 69, 169, 199, 179, 188, 141, 149, 39, 177, 114, 115, 178, 142, 200, 104, 173, 201, 223, 139, 245, 144, 8, 4, 2, 129, 8, 58, 130, 148, 123, 58, 110, 243, 33, 81, 71, 174, 137, 220, 227, 233, 56, 8, 4, 2, 129, 64, 4, 11, 73, 138, 68, 157, 145, 62, 18, 164, 92, 242, 81, 87, 182, 68, 17, 8, 4, 2, 129, 8, 38, 130, 20, 137, 58, 85, 125, 76, 212, 145, 133, 3, 142, 75, 110, 90, 84, 214, 65, 32, 16, 8, 68, 80, 90, 144, 207, 208, 145, 32, 145, 164, 55, 136, 191, 233, 200, 223, 143, 194, 1, 8, 4, 2, 129, 8, 42, 130, 148, 5, 3, 86, 153, 226, 140, 222, 92, 173, 128, 120, 58, 158, 148, 201, 22, 129, 64, 32, 16, 136, 96, 33, 73, 225, 102, 109, 43, 185, 80, 13, 31, 72, 82, 100, 188, 78, 228, 239, 199, 88, 36, 2, 129, 64, 32, 130, 138, 32, 133, 155, 245, 117, 41, 73, 71, 37, 190, 65, 212, 77, 22, 69, 43, 18, 129, 64, 32, 16, 193, 72, 146, 102, 55, 171, 221, 71, 130, 20, 86, 228, 94, 156, 69, 4, 2, 129, 64, 4, 35, 65, 138, 108, 212, 198, 62, 8, 6, 152, 33, 172, 206, 206, 104, 69, 34, 16, 8, 4, 34, 216, 8, 50, 15, 127, 125, 92, 82, 213, 209, 125, 36, 72, 77, 114, 203, 190, 37, 31, 15, 129, 64, 32, 16, 136, 96, 178, 34, 39, 100, 195, 138, 92, 47, 29, 15, 21, 118, 16, 8, 4, 2, 17, 20, 4, 41, 178, 89, 63, 247, 81, 188, 60, 61, 157, 214, 8, 153, 112, 17, 8, 4, 2, 129, 8, 116, 130, 148, 181, 89, 215, 103, 162, 38, 210, 236, 106, 5, 203, 243, 93, 36, 73, 4, 2, 129, 64, 4, 19, 73, 138, 146, 143, 106, 18, 233, 233, 153, 32, 73, 97, 69, 238, 240, 68, 188, 8, 4, 2, 129, 64, 4, 42, 65, 138, 114, 15, 80, 216, 57, 146, 5, 43, 82, 38, 201, 254, 252, 88, 216, 88, 25, 129, 64, 32, 16, 65, 65, 146, 34, 89, 167, 121, 22, 9, 82, 86, 225, 9, 69, 146, 68, 32, 16, 8, 68, 176, 89, 145, 249, 232, 184, 144, 9, 1, 115, 79, 10, 59, 151, 232, 120, 64, 88, 165, 56, 187, 8, 4, 2, 129, 8, 116, 146, 204, 207, 95, 219, 102, 82, 122, 206, 147, 171, 117, 14, 63, 22, 10, 8, 32, 16, 8, 4, 34, 224, 9, 82, 8, 7, 228, 167, 227, 108, 22, 173, 72, 185, 150, 178, 185, 176, 74, 113, 118, 17, 8, 4, 2, 17, 232, 36, 41, 234, 34, 91, 102, 162, 153, 114, 70, 241, 200, 119, 100, 242, 69, 32, 16, 8, 4, 34, 208, 173, 72, 200, 104, 61, 152, 5, 117, 29, 179, 171, 245, 56, 198, 33, 17, 8, 4, 2, 17, 44, 36, 41, 234, 34, 191, 205, 134, 21, 41, 75, 209, 77, 65, 43, 18, 129, 64, 32, 16, 193, 70, 150, 107, 77, 100, 151, 213, 120, 100, 83, 153, 124, 17, 8, 4, 2, 129, 8, 84, 98, 20, 174, 214, 194, 82, 92, 49, 43, 86, 164, 156, 228, 243, 33, 90, 146, 8, 4, 2, 129, 8, 6, 146, 20, 226, 1, 147, 178, 40, 30, 96, 182, 34, 207, 209, 241, 16, 63, 38, 198, 37, 17, 8, 4, 2, 17, 176, 4, 153, 155, 191, 62, 77, 71, 146, 135, 12, 213, 172, 196, 35, 23, 74, 199, 207, 133, 179, 140, 64, 32, 16, 136, 64, 37, 73, 33, 30, 208, 62, 27, 226, 1, 130, 88, 133, 37, 217, 155, 31, 19, 227, 145, 8, 4, 2, 129, 8, 108, 43, 146, 255, 188, 59, 27, 226, 1, 66, 138, 78, 88, 160, 149, 249, 49, 81, 68, 0, 129, 64, 32, 16, 1, 75, 146, 66, 60, 160, 88, 22, 154, 42, 167, 151, 180, 147, 66, 199, 171, 72, 146, 8, 4, 2, 129, 8, 100, 130, 204, 37, 213, 70, 142, 202, 134, 120, 128, 89, 68, 224, 176, 148, 45, 139, 153, 173, 8, 4, 2, 129, 8, 72, 146, 20, 68, 246, 48, 207, 70, 181, 138, 36, 231, 137, 227, 99, 210, 14, 2, 129, 64, 4, 135, 69, 149, 235, 30, 252, 222, 194, 138, 172, 44, 185, 89, 245, 108, 144, 164, 102, 74, 218, 193, 254, 145, 8, 4, 2, 17, 224, 68, 145, 219, 211, 207, 247, 210, 119, 151, 106, 35, 29, 217, 32, 72, 89, 124, 224, 27, 126, 220, 252, 120, 135, 33, 16, 8, 68, 224, 146, 68, 30, 79, 86, 229, 189, 98, 61, 243, 215, 71, 232, 184, 154, 205, 210, 15, 185, 174, 18, 220, 181, 111, 241, 99, 99, 210, 14, 2, 129, 64, 4, 40, 73, 184, 23, 112, 195, 48, 86, 210, 255, 63, 74, 199, 243, 247, 138, 69, 41, 197, 35, 43, 90, 64, 144, 114, 70, 236, 69, 58, 30, 184, 23, 45, 115, 4, 2, 129, 8, 70, 130, 92, 45, 45, 244, 101, 210, 179, 48, 131, 112, 14, 68, 60, 242, 183, 108, 202, 208, 153, 227, 145, 27, 144, 32, 17, 8, 4, 34, 8, 8, 146, 254, 188, 6, 86, 245, 196, 196, 68, 59, 95, 224, 139, 223, 11, 36, 41, 185, 90, 243, 210, 113, 54, 155, 2, 2, 102, 205, 214, 113, 230, 121, 70, 32, 16, 8, 68, 128, 17, 164, 166, 105, 172, 29, 212, 218, 181, 107, 237, 139, 22, 45, 98, 241, 52, 85, 85, 67, 239, 17, 146, 20, 98, 230, 69, 178, 169, 211, 234, 137, 36, 219, 240, 99, 99, 102, 43, 2, 129, 64, 4, 50, 65, 238, 220, 185, 211, 78, 255, 215, 88, 182, 108, 25, 139, 167, 217, 237, 246, 123, 133, 36, 133, 86, 107, 164, 69, 241, 72, 217, 18, 45, 43, 172, 84, 188, 235, 16, 8, 4, 34, 64, 9, 114, 219, 182, 109, 142, 247, 223, 127, 159, 60, 242, 200, 35, 198, 202, 149, 43, 239, 25, 146, 148, 107, 66, 233, 235, 63, 22, 185, 90, 13, 137, 108, 133, 28, 29, 198, 36, 17, 8, 4, 34, 144, 8, 210, 48, 12, 70, 144, 219, 183, 111, 87, 158, 126, 250, 105, 82, 189, 122, 117, 242, 127, 255, 247, 127, 198, 242, 229, 203, 239, 37, 146, 20, 174, 214, 23, 32, 28, 155, 77, 173, 86, 179, 21, 121, 153, 142, 7, 5, 25, 227, 221, 135, 64, 32, 16, 129, 99, 65, 174, 19, 22, 228, 147, 79, 62, 73, 190, 250, 234, 43, 82, 179, 102, 77, 2, 220, 121, 143, 145, 164, 112, 181, 86, 247, 32, 2, 144, 85, 136, 204, 216, 205, 72, 144, 8, 4, 2, 17, 88, 4, 153, 139, 90, 144, 130, 32, 237, 96, 65, 2, 65, 86, 169, 82, 133, 84, 173, 90, 149, 228, 201, 147, 231, 158, 33, 201, 116, 4, 205, 173, 136, 71, 10, 165, 158, 105, 193, 190, 201, 64, 32, 16, 136, 160, 34, 72, 106, 65, 174, 135, 213, 123, 235, 214, 173, 142, 167, 158, 122, 138, 17, 228, 55, 223, 124, 67, 42, 85, 170, 68, 170, 85, 171, 70, 114, 229, 202, 117, 47, 145, 100, 30, 233, 231, 157, 22, 8, 154, 155, 73, 178, 23, 63, 54, 38, 237, 32, 16, 8, 196, 93, 78, 144, 54, 65, 144, 212, 130, 84, 158, 120, 226, 137, 219, 8, 178, 114, 229, 202, 247, 34, 73, 10, 43, 242, 101, 58, 146, 45, 180, 36, 197, 49, 106, 163, 37, 137, 64, 32, 16, 1, 64, 144, 134, 97, 184, 45, 200, 255, 253, 239, 127, 255, 34, 200, 123, 156, 36, 191, 177, 168, 235, 135, 57, 233, 167, 40, 146, 36, 2, 129, 64, 220, 221, 4, 153, 75, 34, 72, 187, 236, 98, 173, 88, 177, 162, 155, 32, 239, 81, 146, 20, 122, 173, 3, 44, 146, 162, 147, 173, 200, 84, 176, 80, 3, 125, 254, 106, 212, 168, 145, 167, 96, 193, 130, 249, 224, 21, 159, 42, 4, 2, 17, 116, 4, 169, 105, 218, 6, 97, 65, 138, 44, 86, 179, 5, 153, 30, 73, 170, 170, 122, 175, 200, 210, 173, 178, 160, 53, 150, 89, 105, 231, 60, 52, 111, 230, 199, 15, 212, 26, 201, 219, 178, 114, 75, 150, 44, 137, 177, 85, 4, 2, 17, 124, 4, 9, 49, 200, 244, 92, 172, 94, 44, 201, 146, 252, 152, 247, 193, 66, 15, 100, 25, 68, 67, 184, 90, 31, 179, 168, 53, 150, 185, 252, 99, 187, 16, 42, 224, 154, 176, 1, 53, 63, 27, 54, 108, 96, 243, 211, 162, 69, 139, 103, 202, 149, 43, 215, 149, 142, 55, 184, 101, 137, 242, 122, 8, 4, 34, 240, 9, 210, 48, 12, 183, 5, 249, 248, 227, 143, 123, 37, 72, 79, 36, 153, 150, 150, 246, 217, 61, 48, 103, 239, 121, 80, 202, 177, 34, 179, 245, 247, 32, 153, 162, 31, 31, 123, 236, 49, 242, 201, 39, 159, 156, 110, 208, 160, 193, 115, 72, 148, 8, 4, 34, 160, 9, 50, 50, 50, 50, 55, 181, 32, 55, 194, 42, 189, 101, 203, 22, 187, 156, 197, 106, 142, 65, 122, 34, 201, 251, 238, 187, 79, 214, 110, 173, 23, 27, 27, 251, 66, 114, 114, 242, 123, 73, 73, 73, 111, 7, 211, 80, 20, 229, 189, 212, 212, 212, 103, 232, 215, 236, 108, 161, 21, 233, 118, 183, 234, 186, 62, 53, 58, 58, 250, 89, 152, 59, 58, 222, 9, 164, 185, 113, 56, 28, 111, 69, 69, 69, 125, 64, 191, 198, 211, 131, 7, 15, 158, 222, 179, 103, 79, 82, 166, 76, 25, 242, 206, 59, 239, 92, 234, 210, 165, 203, 179, 72, 148, 8, 4, 34, 24, 8, 146, 101, 177, 126, 253, 245, 215, 94, 45, 72, 153, 36, 225, 112, 107, 215, 174, 37, 38, 245, 153, 96, 30, 132, 90, 221, 196, 74, 240, 227, 233, 65, 50, 63, 236, 123, 28, 57, 114, 68, 129, 123, 227, 211, 79, 63, 117, 19, 37, 221, 116, 229, 199, 167, 15, 129, 64, 4, 146, 139, 117, 35, 119, 177, 42, 255, 253, 239, 127, 51, 69, 144, 48, 224, 111, 11, 21, 42, 68, 70, 143, 30, 77, 246, 236, 217, 3, 177, 76, 178, 99, 199, 142, 160, 29, 116, 158, 8, 181, 242, 136, 63, 136, 242, 228, 201, 147, 100, 243, 230, 205, 208, 89, 37, 32, 231, 6, 206, 27, 206, 255, 212, 169, 83, 238, 239, 116, 224, 192, 1, 70, 148, 5, 11, 22, 188, 212, 164, 73, 19, 36, 74, 4, 2, 17, 24, 4, 9, 201, 33, 212, 130, 252, 71, 88, 144, 64, 144, 190, 196, 32, 205, 3, 254, 22, 136, 245, 243, 207, 63, 103, 22, 37, 29, 70, 48, 14, 144, 222, 131, 215, 215, 94, 123, 205, 136, 143, 143, 183, 140, 36, 229, 99, 80, 171, 158, 205, 223, 155, 111, 190, 25, 144, 115, 244, 202, 43, 175, 176, 215, 177, 99, 199, 18, 158, 233, 44, 136, 210, 193, 137, 242, 114, 171, 86, 173, 48, 70, 137, 64, 32, 238, 110, 130, 156, 59, 119, 110, 30, 186, 56, 11, 130, 180, 67, 146, 142, 176, 32, 189, 197, 32, 51, 34, 74, 112, 189, 6, 227, 248, 246, 219, 111, 73, 173, 90, 181, 72, 104, 104, 40, 233, 219, 183, 175, 165, 22, 164, 56, 150, 195, 225, 32, 221, 186, 117, 35, 37, 74, 148, 32, 117, 235, 214, 101, 159, 25, 104, 115, 84, 167, 78, 29, 82, 160, 64, 1, 50, 125, 250, 116, 194, 99, 172, 108, 0, 14, 30, 60, 104, 231, 174, 215, 203, 61, 123, 246, 68, 162, 68, 32, 16, 119, 63, 65, 110, 222, 188, 217, 33, 19, 100, 102, 44, 72, 79, 227, 203, 47, 191, 12, 202, 1, 243, 242, 221, 119, 223, 17, 168, 25, 157, 52, 105, 146, 165, 174, 86, 65, 34, 9, 9, 9, 164, 94, 189, 122, 164, 100, 201, 146, 140, 112, 2, 109, 62, 97, 142, 160, 109, 218, 243, 207, 63, 79, 166, 78, 157, 234, 158, 35, 24, 18, 81, 50, 139, 242, 179, 207, 62, 187, 28, 17, 17, 241, 28, 186, 94, 17, 8, 196, 93, 69, 144, 144, 164, 35, 89, 144, 202, 163, 143, 62, 106, 25, 65, 6, 243, 0, 235, 154, 183, 4, 35, 43, 86, 172, 184, 141, 220, 172, 34, 201, 171, 87, 175, 50, 130, 132, 207, 10, 196, 235, 1, 231, 13, 22, 229, 51, 207, 60, 227, 38, 73, 241, 221, 76, 68, 169, 152, 93, 175, 72, 148, 8, 4, 226, 142, 225, 232, 209, 163, 247, 73, 4, 185, 73, 88, 144, 72, 144, 153, 115, 39, 215, 168, 81, 131, 145, 228, 190, 125, 251, 252, 66, 146, 39, 78, 156, 32, 47, 191, 252, 50, 107, 63, 6, 177, 225, 64, 156, 163, 244, 72, 210, 252, 93, 133, 69, 249, 201, 39, 159, 92, 193, 24, 37, 2, 129, 184, 147, 22, 164, 80, 136, 201, 35, 17, 164, 29, 10, 189, 179, 19, 131, 188, 215, 6, 184, 19, 97, 174, 222, 127, 255, 125, 114, 225, 194, 5, 191, 184, 91, 33, 59, 20, 46, 21, 144, 113, 160, 110, 36, 188, 145, 164, 108, 81, 30, 58, 116, 200, 29, 163, 236, 210, 165, 203, 243, 72, 148, 8, 4, 34, 167, 9, 82, 104, 167, 66, 153, 199, 102, 97, 65, 62, 248, 224, 131, 104, 65, 102, 114, 241, 7, 235, 174, 108, 217, 178, 236, 53, 46, 46, 206, 82, 146, 20, 199, 89, 190, 124, 57, 35, 73, 112, 235, 6, 226, 117, 241, 133, 36, 61, 16, 165, 136, 81, 94, 105, 219, 182, 237, 243, 232, 122, 69, 32, 16, 57, 69, 144, 185, 249, 235, 67, 116, 81, 218, 3, 11, 210, 186, 117, 235, 88, 44, 168, 106, 213, 170, 140, 36, 145, 32, 51, 183, 248, 83, 139, 135, 124, 255, 253, 247, 44, 11, 213, 31, 36, 9, 25, 161, 130, 36, 3, 209, 186, 247, 68, 146, 233, 205, 145, 167, 24, 37, 184, 94, 155, 53, 107, 134, 68, 137, 64, 32, 114, 148, 36, 239, 151, 220, 172, 206, 231, 158, 123, 142, 89, 144, 96, 17, 33, 73, 250, 190, 248, 67, 102, 235, 171, 175, 190, 74, 6, 15, 30, 236, 94, 248, 173, 22, 18, 24, 54, 108, 24, 121, 229, 149, 87, 152, 187, 53, 216, 73, 210, 236, 106, 22, 22, 229, 199, 31, 127, 236, 182, 40, 209, 245, 138, 64, 32, 114, 132, 40, 1, 116, 177, 98, 109, 157, 118, 237, 218, 229, 0, 162, 132, 24, 27, 16, 37, 198, 35, 125, 91, 252, 193, 186, 203, 147, 39, 143, 123, 241, 183, 90, 72, 64, 81, 20, 18, 17, 17, 193, 172, 85, 40, 255, 8, 22, 119, 171, 183, 57, 242, 228, 122, 45, 88, 176, 224, 149, 14, 29, 58, 188, 128, 68, 137, 64, 32, 114, 130, 40, 243, 72, 68, 185, 18, 22, 163, 157, 59, 119, 218, 95, 120, 225, 5, 182, 176, 33, 81, 250, 54, 192, 146, 132, 233, 92, 186, 116, 169, 95, 92, 173, 137, 137, 137, 236, 51, 64, 16, 60, 80, 99, 197, 89, 33, 73, 51, 81, 30, 62, 124, 152, 17, 101, 161, 66, 133, 174, 10, 162, 68, 215, 43, 2, 129, 240, 55, 81, 230, 51, 19, 37, 181, 40, 21, 176, 40, 5, 81, 162, 235, 53, 227, 204, 86, 33, 226, 14, 186, 180, 86, 150, 127, 8, 18, 185, 118, 237, 26, 41, 82, 164, 8, 43, 253, 128, 207, 11, 150, 236, 86, 95, 55, 19, 38, 139, 82, 225, 174, 215, 171, 141, 27, 55, 70, 162, 68, 32, 16, 57, 75, 148, 154, 166, 185, 137, 18, 44, 74, 225, 122, 69, 162, 244, 60, 132, 158, 237, 107, 175, 189, 70, 142, 29, 59, 230, 183, 26, 201, 167, 158, 122, 138, 145, 76, 160, 94, 7, 79, 98, 2, 153, 181, 184, 205, 22, 37, 16, 101, 235, 214, 173, 209, 245, 138, 64, 32, 114, 156, 40, 87, 136, 24, 229, 203, 47, 191, 108, 96, 140, 50, 227, 46, 39, 48, 47, 165, 74, 149, 34, 87, 174, 92, 241, 11, 73, 202, 53, 146, 129, 74, 146, 194, 146, 124, 246, 217, 103, 51, 44, 1, 201, 172, 235, 181, 96, 193, 130, 87, 187, 118, 237, 250, 34, 18, 37, 2, 129, 184, 83, 68, 105, 127, 233, 165, 151, 178, 21, 163, 132, 5, 18, 200, 4, 22, 121, 208, 239, 12, 166, 81, 187, 118, 109, 246, 29, 27, 53, 106, 68, 68, 247, 15, 171, 73, 18, 164, 238, 32, 179, 181, 126, 253, 250, 44, 113, 39, 16, 231, 9, 8, 18, 132, 217, 63, 250, 232, 35, 50, 99, 198, 140, 44, 199, 110, 77, 68, 201, 92, 175, 133, 10, 21, 186, 214, 174, 93, 187, 23, 209, 245, 138, 64, 32, 238, 20, 81, 42, 32, 76, 45, 10, 231, 179, 217, 42, 43, 168, 198, 139, 47, 190, 200, 94, 27, 54, 108, 232, 174, 145, 180, 58, 38, 57, 106, 212, 40, 246, 25, 80, 102, 18, 200, 115, 5, 68, 15, 175, 162, 85, 86, 86, 231, 201, 19, 81, 126, 252, 241, 199, 215, 90, 180, 104, 129, 68, 137, 64, 32, 114, 156, 40, 151, 195, 98, 180, 123, 247, 110, 5, 8, 1, 136, 15, 4, 7, 50, 211, 116, 153, 46, 96, 100, 220, 184, 113, 176, 160, 177, 198, 203, 123, 247, 238, 13, 154, 1, 90, 173, 116, 19, 65, 142, 31, 63, 238, 183, 26, 73, 104, 182, 12, 159, 1, 159, 21, 232, 115, 5, 141, 151, 207, 158, 61, 107, 201, 60, 9, 162, 60, 114, 228, 8, 115, 189, 82, 43, 213, 109, 81, 162, 235, 21, 129, 64, 220, 9, 162, 116, 64, 227, 220, 204, 196, 40, 69, 230, 231, 154, 53, 107, 8, 2, 97, 117, 29, 41, 189, 55, 111, 35, 202, 79, 62, 249, 228, 90, 199, 142, 29, 95, 66, 139, 18, 129, 64, 220, 49, 162, 132, 110, 20, 194, 245, 234, 141, 40, 33, 134, 246, 240, 195, 15, 51, 237, 81, 0, 44, 106, 162, 217, 110, 48, 13, 171, 173, 71, 79, 238, 69, 241, 26, 200, 115, 100, 245, 92, 201, 174, 87, 74, 148, 162, 205, 214, 181, 240, 240, 112, 36, 74, 4, 2, 145, 179, 68, 73, 23, 164, 101, 178, 235, 213, 151, 24, 37, 88, 146, 15, 60, 240, 128, 229, 125, 22, 17, 136, 140, 136, 242, 195, 15, 63, 188, 222, 180, 105, 83, 36, 74, 4, 2, 145, 227, 22, 37, 35, 202, 61, 123, 246, 40, 96, 81, 122, 139, 81, 34, 73, 34, 114, 10, 226, 222, 58, 122, 244, 40, 115, 189, 22, 40, 80, 224, 186, 176, 40, 49, 70, 137, 64, 32, 252, 10, 74, 138, 110, 162, 84, 85, 85, 16, 165, 227, 181, 215, 94, 51, 4, 81, 122, 114, 189, 34, 73, 34, 114, 210, 162, 52, 199, 40, 129, 40, 91, 181, 106, 245, 50, 220, 183, 5, 11, 22, 204, 135, 79, 50, 2, 129, 240, 167, 69, 153, 87, 114, 189, 46, 21, 68, 9, 165, 9, 233, 197, 40, 145, 36, 17, 119, 144, 40, 21, 78, 148, 81, 13, 26, 52, 96, 89, 175, 37, 75, 150, 204, 139, 79, 50, 2, 129, 200, 17, 162, 164, 139, 145, 32, 74, 5, 4, 7, 128, 32, 205, 49, 74, 36, 73, 196, 157, 128, 32, 202, 147, 39, 79, 42, 31, 126, 248, 33, 41, 92, 184, 112, 28, 37, 200, 183, 145, 40, 17, 8, 68, 142, 186, 94, 101, 162, 52, 199, 40, 133, 248, 55, 146, 36, 226, 78, 37, 242, 236, 223, 191, 95, 121, 247, 221, 119, 65, 204, 226, 124, 233, 210, 165, 95, 66, 146, 68, 32, 16, 119, 194, 162, 92, 2, 11, 210, 222, 189, 123, 111, 139, 81, 10, 189, 206, 251, 239, 191, 31, 73, 18, 145, 227, 4, 185, 115, 231, 78, 209, 90, 235, 100, 251, 246, 237, 31, 67, 130, 68, 32, 16, 119, 156, 40, 121, 50, 15, 35, 72, 32, 74, 24, 15, 61, 244, 16, 146, 36, 34, 167, 9, 210, 14, 183, 104, 225, 194, 133, 79, 70, 68, 68, 60, 142, 4, 137, 64, 32, 238, 38, 139, 82, 17, 130, 3, 53, 107, 214, 36, 185, 114, 229, 66, 146, 68, 228, 184, 5, 9, 4, 217, 173, 91, 183, 255, 194, 189, 137, 37, 32, 8, 4, 226, 110, 33, 202, 191, 5, 81, 130, 69, 9, 138, 59, 64, 152, 66, 113, 7, 73, 18, 145, 19, 4, 89, 180, 104, 209, 147, 97, 97, 97, 140, 32, 81, 76, 0, 129, 64, 220, 149, 68, 185, 111, 223, 62, 71, 161, 66, 133, 72, 254, 252, 249, 201, 170, 85, 171, 144, 36, 17, 57, 66, 144, 33, 33, 33, 39, 34, 35, 35, 31, 71, 11, 18, 129, 64, 220, 245, 68, 121, 224, 192, 1, 182, 112, 45, 91, 198, 244, 7, 136, 170, 170, 65, 167, 219, 234, 47, 4, 163, 198, 173, 149, 243, 38, 19, 228, 142, 29, 59, 236, 220, 130, 60, 49, 104, 208, 32, 116, 177, 34, 16, 136, 187, 159, 40, 233, 34, 182, 24, 22, 176, 205, 155, 55, 43, 127, 255, 253, 55, 154, 61, 8, 191, 88, 144, 219, 183, 111, 103, 27, 177, 34, 69, 138, 156, 16, 46, 86, 36, 72, 4, 2, 145, 29, 34, 203, 149, 83, 68, 73, 127, 102, 68, 153, 156, 156, 172, 208, 23, 45, 37, 37, 69, 141, 143, 143, 55, 18, 19, 19, 73, 124, 66, 2, 161, 63, 7, 236, 136, 139, 139, 131, 239, 229, 55, 18, 72, 76, 74, 98, 159, 145, 153, 115, 74, 160, 115, 10, 115, 75, 7, 204, 177, 70, 135, 154, 153, 65, 223, 111, 240, 247, 251, 253, 250, 136, 130, 127, 43, 8, 146, 90, 144, 199, 69, 153, 7, 198, 32, 17, 8, 68, 182, 8, 140, 142, 60, 116, 228, 206, 65, 139, 114, 145, 88, 224, 38, 79, 158, 44, 58, 213, 235, 47, 61, 255, 28, 249, 162, 76, 41, 82, 182, 100, 9, 82, 46, 128, 70, 153, 208, 226, 164, 202, 87, 95, 178, 239, 49, 115, 198, 12, 247, 194, 109, 9, 57, 242, 197, 223, 158, 150, 70, 194, 91, 181, 34, 239, 189, 246, 10, 249, 186, 82, 69, 82, 182, 68, 104, 186, 231, 83, 182, 100, 40, 41, 95, 186, 20, 41, 92, 240, 19, 49, 183, 6, 116, 105, 249, 250, 235, 175, 89, 157, 234, 23, 95, 124, 65, 42, 84, 168, 192, 20, 145, 60, 13, 248, 119, 168, 109, 165, 214, 23, 144, 13, 123, 63, 28, 231, 101, 122, 125, 202, 149, 178, 102, 206, 224, 26, 151, 47, 85, 146, 157, 231, 135, 5, 62, 96, 202, 76, 49, 49, 49, 153, 142, 83, 123, 34, 200, 144, 144, 144, 227, 152, 197, 138, 64, 32, 178, 109, 61, 154, 44, 188, 92, 57, 73, 148, 14, 135, 3, 130, 146, 187, 191, 171, 94, 61, 178, 91, 247, 238, 155, 214, 173, 93, 75, 198, 79, 156, 164, 189, 94, 225, 43, 242, 201, 215, 213, 72, 65, 58, 62, 9, 144, 241, 225, 151, 85, 73, 153, 218, 245, 41, 153, 60, 73, 150, 173, 94, 99, 105, 66, 146, 56, 78, 44, 181, 32, 75, 214, 172, 71, 94, 46, 87, 153, 20, 171, 94, 139, 124, 252, 213, 183, 30, 207, 5, 230, 237, 179, 42, 53, 200, 11, 244, 239, 34, 7, 13, 38, 43, 87, 44, 55, 150, 45, 93, 74, 70, 141, 30, 125, 148, 78, 123, 127, 58, 134, 83, 130, 156, 244, 254, 251, 239, 255, 242, 234, 171, 175, 142, 125, 231, 157, 119, 126, 121, 235, 173, 183, 216, 128, 159, 95, 120, 225, 133, 49, 161, 161, 161, 227, 139, 21, 43, 246, 27, 253, 219, 200, 250, 13, 27, 206, 158, 61, 103, 142, 182, 122, 229, 74, 50, 125, 230, 76, 163, 120, 141, 218, 228, 131, 202, 85, 73, 161, 111, 170, 103, 121, 190, 62, 230, 231, 248, 74, 121, 74, 196, 45, 90, 147, 150, 97, 173, 201, 71, 5, 10, 100, 154, 36, 77, 4, 41, 98, 144, 199, 35, 35, 35, 31, 67, 130, 68, 32, 16, 150, 16, 164, 166, 105, 213, 232, 66, 51, 80, 250, 183, 60, 126, 254, 236, 60, 252, 53, 55, 127, 125, 152, 142, 179, 176, 208, 141, 251, 115, 190, 246, 98, 203, 246, 164, 124, 231, 222, 164, 68, 135, 30, 1, 51, 66, 35, 122, 144, 47, 187, 253, 64, 108, 181, 155, 145, 93, 135, 142, 184, 22, 122, 139, 44, 73, 93, 119, 29, 231, 210, 181, 235, 228, 141, 176, 14, 236, 243, 202, 118, 234, 149, 225, 249, 148, 238, 216, 147, 20, 105, 215, 141, 52, 234, 63, 148, 108, 221, 127, 80, 156, 8, 248, 129, 7, 103, 242, 90, 21, 131, 234, 29, 120, 243, 245, 152, 88, 99, 232, 180, 223, 217, 113, 225, 248, 37, 179, 57, 103, 165, 232, 49, 138, 182, 235, 74, 170, 246, 25, 64, 234, 134, 183, 35, 37, 138, 124, 78, 98, 98, 99, 125, 38, 201, 116, 98, 144, 110, 23, 43, 18, 36, 2, 129, 200, 182, 53, 71, 23, 153, 86, 146, 197, 50, 34, 7, 137, 242, 126, 120, 141, 139, 139, 123, 148, 46, 118, 87, 224, 243, 71, 255, 62, 71, 181, 85, 174, 69, 42, 116, 232, 78, 138, 183, 237, 28, 80, 35, 244, 251, 206, 164, 92, 68, 55, 98, 171, 211, 140, 156, 58, 119, 193, 82, 119, 171, 32, 201, 35, 39, 79, 19, 91, 173, 166, 236, 115, 74, 124, 223, 37, 195, 243, 9, 161, 163, 100, 187, 46, 228, 245, 102, 109, 9, 204, 105, 155, 33, 35, 140, 179, 151, 46, 139, 67, 198, 167, 166, 166, 182, 16, 215, 98, 201, 146, 37, 15, 142, 30, 61, 58, 255, 212, 13, 27, 238, 95, 78, 95, 225, 119, 39, 78, 156, 120, 86, 85, 213, 121, 226, 13, 179, 151, 174, 208, 109, 117, 154, 19, 91, 205, 38, 94, 63, 59, 83, 243, 6, 35, 162, 59, 121, 180, 116, 5, 230, 130, 245, 213, 146, 76, 39, 6, 121, 172, 107, 215, 174, 143, 34, 65, 34, 16, 136, 236, 144, 147, 123, 241, 160, 139, 224, 72, 88, 100, 110, 196, 196, 24, 103, 46, 94, 114, 192, 207, 212, 170, 252, 197, 19, 153, 90, 124, 14, 249, 132, 37, 73, 23, 187, 93, 240, 185, 127, 174, 88, 109, 183, 85, 107, 64, 190, 236, 220, 139, 20, 167, 139, 112, 8, 44, 196, 1, 50, 224, 92, 75, 181, 239, 198, 136, 233, 131, 86, 17, 228, 250, 205, 104, 107, 99, 146, 252, 56, 155, 247, 236, 37, 182, 106, 13, 73, 165, 78, 61, 125, 59, 47, 122, 62, 101, 41, 1, 193, 223, 63, 219, 180, 13, 177, 213, 111, 169, 79, 93, 248, 183, 67, 189, 69, 64, 107, 99, 146, 146, 222, 54, 95, 31, 167, 211, 89, 31, 188, 187, 240, 7, 199, 207, 158, 211, 27, 68, 14, 82, 24, 57, 82, 171, 175, 162, 143, 159, 237, 243, 220, 193, 57, 82, 171, 184, 96, 149, 26, 164, 76, 241, 16, 74, 146, 222, 45, 73, 153, 32, 183, 109, 219, 198, 8, 178, 120, 241, 226, 199, 208, 197, 138, 64, 32, 178, 75, 78, 204, 74, 56, 125, 250, 116, 126, 209, 169, 227, 226, 213, 107, 42, 93, 248, 180, 23, 154, 182, 5, 162, 84, 225, 119, 116, 145, 156, 232, 47, 139, 82, 142, 121, 210, 115, 96, 201, 59, 107, 182, 82, 75, 128, 46, 254, 95, 116, 236, 17, 112, 4, 233, 90, 232, 187, 144, 114, 212, 250, 253, 160, 85, 123, 82, 181, 123, 36, 73, 76, 78, 241, 11, 73, 46, 90, 187, 158, 216, 190, 133, 141, 68, 111, 82, 12, 44, 49, 31, 207, 13, 94, 225, 252, 202, 80, 34, 183, 125, 215, 152, 124, 213, 165, 183, 182, 235, 224, 97, 85, 28, 95, 81, 85, 202, 47, 145, 185, 175, 197, 197, 189, 72, 63, 107, 25, 255, 29, 153, 50, 127, 145, 147, 146, 163, 254, 118, 139, 118, 164, 98, 199, 158, 116, 35, 208, 149, 145, 154, 165, 243, 71, 143, 87, 134, 146, 228, 7, 95, 125, 203, 146, 159, 188, 89, 146, 158, 98, 144, 33, 33, 33, 71, 7, 15, 30, 204, 44, 200, 247, 222, 123, 15, 9, 18, 129, 64, 100, 221, 130, 140, 143, 143, 127, 137, 254, 124, 20, 22, 153, 221, 135, 143, 40, 207, 83, 114, 44, 212, 186, 35, 41, 210, 166, 19, 121, 163, 69, 59, 227, 228, 185, 243, 78, 70, 148, 154, 54, 205, 106, 139, 82, 78, 12, 162, 199, 31, 199, 164, 234, 142, 28, 83, 32, 142, 87, 154, 46, 224, 96, 169, 20, 15, 48, 130, 20, 214, 80, 5, 74, 34, 143, 55, 110, 77, 218, 13, 251, 153, 40, 78, 167, 165, 36, 41, 48, 97, 238, 2, 98, 171, 209, 152, 89, 219, 197, 178, 72, 86, 96, 9, 22, 160, 214, 174, 173, 122, 35, 50, 100, 242, 116, 231, 205, 216, 56, 113, 248, 67, 224, 84, 112, 93, 147, 163, 206, 26, 61, 250, 234, 240, 55, 130, 92, 45, 39, 71, 19, 73, 22, 248, 170, 218, 109, 36, 169, 121, 32, 73, 152, 79, 49, 167, 194, 130, 44, 82, 164, 136, 219, 197, 138, 4, 137, 64, 32, 178, 100, 185, 9, 146, 179, 219, 213, 226, 244, 231, 4, 88, 100, 150, 172, 223, 104, 135, 248, 86, 209, 54, 157, 217, 66, 8, 227, 147, 176, 14, 228, 165, 102, 109, 141, 99, 167, 207, 42, 124, 161, 154, 101, 37, 81, 10, 55, 171, 162, 40, 61, 225, 248, 167, 169, 229, 250, 92, 211, 54, 108, 193, 47, 19, 209, 61, 224, 44, 72, 49, 224, 252, 43, 83, 226, 130, 152, 221, 224, 201, 211, 255, 101, 1, 90, 133, 126, 191, 77, 38, 182, 122, 45, 24, 209, 101, 133, 36, 67, 233, 40, 202, 231, 26, 44, 67, 91, 221, 22, 228, 195, 176, 14, 250, 146, 245, 255, 176, 235, 157, 166, 40, 100, 228, 244, 63, 28, 16, 87, 125, 183, 101, 123, 70, 198, 33, 124, 19, 224, 183, 249, 243, 145, 36, 61, 185, 88, 193, 130, 108, 209, 162, 5, 198, 32, 17, 8, 68, 150, 73, 201, 77, 108, 118, 187, 189, 137, 88, 112, 126, 153, 61, 207, 1, 86, 2, 196, 171, 96, 192, 130, 11, 139, 103, 249, 14, 61, 200, 103, 225, 29, 201, 147, 77, 194, 141, 195, 39, 79, 139, 24, 229, 92, 113, 12, 185, 177, 114, 86, 93, 189, 244, 60, 26, 193, 113, 163, 162, 99, 244, 226, 237, 186, 234, 31, 82, 171, 6, 220, 172, 197, 252, 185, 16, 231, 128, 37, 9, 132, 98, 171, 209, 136, 76, 93, 120, 75, 69, 200, 176, 208, 213, 234, 160, 4, 214, 114, 192, 48, 242, 114, 179, 182, 236, 58, 101, 135, 184, 196, 92, 67, 172, 242, 243, 54, 157, 152, 11, 182, 237, 208, 145, 206, 154, 189, 126, 84, 33, 246, 8, 199, 135, 81, 52, 39, 174, 137, 15, 36, 41, 19, 228, 214, 173, 91, 69, 12, 210, 237, 98, 69, 130, 68, 32, 16, 89, 118, 175, 114, 203, 109, 16, 44, 48, 41, 105, 105, 164, 235, 168, 113, 16, 103, 98, 214, 72, 201, 118, 183, 199, 152, 138, 113, 162, 132, 133, 51, 119, 163, 48, 227, 192, 241, 19, 204, 194, 80, 53, 109, 145, 217, 26, 204, 10, 65, 58, 28, 142, 242, 226, 60, 106, 245, 254, 81, 125, 166, 73, 27, 230, 166, 44, 26, 192, 4, 41, 70, 101, 186, 208, 67, 92, 117, 233, 134, 77, 126, 137, 71, 38, 36, 37, 209, 205, 68, 79, 2, 174, 113, 112, 77, 135, 88, 20, 75, 133, 99, 193, 53, 127, 173, 249, 247, 228, 163, 176, 8, 122, 61, 122, 48, 183, 119, 72, 78, 93, 147, 244, 72, 146, 43, 239, 152, 98, 144, 170, 205, 149, 197, 122, 4, 99, 144, 8, 4, 34, 219, 4, 25, 73, 72, 110, 186, 216, 204, 135, 5, 230, 242, 245, 40, 173, 70, 207, 190, 58, 184, 235, 42, 115, 55, 90, 122, 86, 17, 184, 94, 33, 70, 105, 107, 208, 138, 197, 12, 249, 162, 181, 44, 43, 68, 41, 206, 37, 37, 37, 165, 0, 132, 58, 225, 88, 29, 126, 26, 237, 180, 213, 111, 201, 136, 186, 40, 43, 159, 8, 108, 130, 132, 243, 7, 107, 24, 226, 133, 219, 246, 29, 176, 84, 72, 64, 144, 228, 149, 168, 27, 228, 5, 106, 69, 194, 198, 38, 180, 157, 245, 223, 1, 200, 146, 109, 154, 114, 122, 254, 210, 33, 73, 152, 63, 57, 6, 73, 45, 72, 205, 230, 82, 14, 218, 62, 107, 214, 44, 166, 164, 83, 176, 96, 193, 124, 248, 180, 35, 16, 136, 44, 17, 100, 106, 106, 234, 51, 244, 231, 253, 172, 235, 198, 177, 19, 142, 247, 90, 182, 55, 192, 85, 87, 137, 46, 72, 222, 44, 183, 98, 188, 116, 0, 226, 149, 182, 122, 45, 201, 174, 131, 135, 93, 174, 87, 195, 88, 157, 25, 162, 20, 127, 19, 29, 29, 253, 140, 72, 10, 25, 50, 101, 38, 75, 212, 169, 204, 147, 79, 2, 157, 32, 97, 0, 185, 0, 201, 0, 241, 31, 59, 115, 214, 47, 106, 59, 112, 92, 136, 33, 3, 25, 135, 4, 129, 229, 237, 141, 36, 161, 51, 140, 32, 200, 45, 91, 183, 130, 36, 158, 54, 118, 236, 24, 248, 247, 70, 112, 79, 205, 152, 49, 227, 33, 124, 218, 17, 8, 68, 102, 200, 49, 183, 32, 165, 196, 180, 180, 194, 244, 103, 86, 172, 183, 98, 211, 22, 7, 36, 148, 128, 11, 53, 51, 174, 205, 162, 156, 40, 225, 103, 91, 221, 230, 212, 66, 58, 104, 231, 22, 229, 134, 26, 53, 230, 230, 241, 70, 148, 226, 223, 206, 159, 63, 127, 63, 93, 236, 88, 54, 237, 212, 5, 139, 21, 136, 219, 125, 213, 185, 119, 192, 38, 233, 120, 26, 144, 253, 9, 150, 247, 71, 97, 29, 192, 98, 247, 11, 73, 110, 221, 187, 223, 93, 35, 89, 44, 88, 73, 18, 234, 36, 185, 226, 14, 144, 36, 239, 22, 195, 180, 103, 223, 248, 188, 152, 22, 27, 207, 114, 206, 28, 215, 175, 95, 255, 212, 28, 82, 64, 32, 16, 136, 140, 8, 210, 45, 78, 110, 183, 219, 235, 184, 133, 195, 255, 90, 164, 192, 194, 42, 39, 232, 100, 54, 193, 3, 222, 7, 49, 42, 176, 254, 54, 239, 221, 231, 224, 46, 192, 205, 34, 137, 231, 232, 209, 163, 247, 121, 56, 31, 89, 200, 124, 61, 207, 166, 117, 64, 141, 31, 44, 242, 161, 1, 88, 11, 153, 145, 144, 64, 57, 58, 71, 31, 180, 108, 79, 170, 116, 251, 129, 196, 39, 38, 250, 133, 36, 23, 175, 219, 64, 108, 213, 131, 151, 36, 161, 78, 178, 92, 137, 80, 183, 37, 41, 19, 100, 153, 47, 191, 38, 111, 55, 107, 75, 134, 78, 157, 233, 228, 255, 68, 121, 242, 250, 147, 230, 123, 13, 129, 64, 32, 108, 25, 17, 18, 20, 133, 179, 84, 126, 135, 131, 244, 25, 55, 193, 9, 4, 9, 169, 254, 174, 68, 140, 172, 103, 110, 150, 137, 112, 197, 171, 108, 53, 155, 146, 141, 187, 246, 8, 162, 220, 1, 162, 4, 230, 29, 61, 183, 104, 89, 219, 45, 167, 166, 205, 98, 238, 178, 189, 251, 29, 96, 65, 2, 225, 6, 19, 65, 138, 1, 137, 47, 80, 202, 18, 62, 120, 4, 203, 66, 245, 71, 76, 114, 226, 188, 133, 116, 163, 210, 148, 37, 214, 4, 35, 73, 126, 248, 117, 117, 82, 178, 88, 17, 18, 29, 237, 82, 43, 218, 176, 97, 3, 35, 200, 98, 229, 43, 144, 210, 48, 199, 80, 178, 82, 181, 62, 153, 177, 120, 169, 194, 167, 102, 167, 188, 73, 196, 149, 0, 129, 64, 120, 34, 72, 55, 57, 105, 154, 246, 7, 172, 28, 215, 110, 220, 212, 235, 245, 25, 168, 65, 13, 28, 75, 208, 1, 29, 79, 11, 234, 0, 33, 230, 86, 138, 17, 101, 19, 178, 110, 219, 14, 59, 95, 192, 247, 94, 187, 118, 237, 65, 249, 92, 196, 130, 165, 170, 234, 16, 166, 55, 122, 234, 180, 98, 107, 208, 202, 0, 162, 46, 217, 190, 107, 208, 17, 36, 140, 47, 40, 73, 66, 146, 83, 255, 241, 83, 252, 86, 35, 249, 227, 248, 201, 36, 79, 195, 48, 182, 209, 8, 182, 152, 36, 200, 210, 189, 83, 185, 10, 41, 85, 172, 40, 73, 77, 77, 37, 187, 118, 239, 102, 4, 25, 90, 161, 50, 41, 245, 125, 103, 82, 140, 222, 59, 37, 184, 16, 2, 148, 46, 173, 219, 182, 83, 148, 39, 205, 230, 247, 156, 223, 187, 215, 32, 16, 136, 192, 35, 72, 102, 197, 81, 146, 122, 130, 46, 200, 59, 97, 209, 56, 124, 242, 148, 179, 96, 120, 71, 253, 213, 102, 223, 187, 10, 193, 45, 92, 76, 5, 81, 50, 105, 51, 74, 148, 171, 54, 111, 181, 243, 245, 251, 96, 108, 108, 236, 127, 248, 57, 49, 194, 116, 56, 157, 223, 115, 201, 59, 173, 64, 171, 8, 163, 112, 120, 39, 150, 49, 27, 84, 22, 144, 153, 36, 235, 52, 39, 19, 230, 45, 248, 151, 50, 140, 21, 86, 164, 83, 85, 73, 171, 65, 195, 201, 155, 205, 191, 119, 105, 196, 6, 211, 252, 209, 123, 2, 186, 129, 188, 94, 241, 27, 82, 171, 122, 53, 50, 123, 206, 159, 228, 205, 231, 159, 33, 5, 66, 74, 144, 178, 116, 83, 5, 4, 25, 234, 22, 108, 231, 9, 82, 117, 155, 27, 244, 94, 103, 22, 165, 162, 40, 125, 249, 189, 151, 207, 223, 141, 195, 17, 8, 68, 96, 144, 99, 46, 119, 89, 133, 211, 249, 17, 24, 143, 176, 88, 192, 238, 218, 86, 167, 153, 241, 105, 235, 142, 44, 65, 199, 31, 132, 20, 194, 137, 18, 172, 25, 40, 119, 88, 182, 113, 147, 131, 175, 231, 71, 111, 220, 184, 241, 52, 115, 249, 42, 74, 77, 214, 251, 48, 62, 129, 90, 178, 189, 245, 55, 232, 194, 94, 177, 99, 207, 160, 37, 72, 225, 110, 133, 204, 211, 133, 107, 214, 251, 197, 213, 154, 152, 156, 204, 244, 90, 65, 232, 193, 31, 229, 31, 119, 154, 36, 139, 67, 188, 188, 122, 109, 242, 217, 199, 31, 49, 11, 242, 243, 178, 229, 153, 139, 53, 4, 100, 10, 77, 117, 188, 224, 250, 255, 148, 206, 195, 71, 97, 29, 52, 240, 154, 176, 102, 212, 118, 123, 93, 179, 103, 5, 129, 64, 220, 155, 4, 153, 91, 184, 149, 210, 20, 165, 26, 172, 199, 176, 72, 204, 88, 188, 148, 9, 132, 195, 78, 27, 22, 17, 127, 18, 146, 232, 120, 1, 201, 42, 144, 72, 242, 247, 186, 141, 130, 40, 247, 36, 167, 165, 1, 65, 42, 112, 82, 205, 251, 15, 85, 109, 13, 195, 220, 181, 144, 193, 74, 144, 16, 99, 101, 155, 134, 218, 205, 200, 166, 221, 123, 210, 213, 29, 205, 78, 210, 206, 213, 27, 55, 152, 76, 92, 160, 106, 219, 250, 66, 146, 69, 107, 214, 35, 159, 189, 241, 50, 41, 81, 249, 43, 18, 218, 166, 19, 41, 222, 174, 219, 109, 4, 41, 111, 212, 96, 83, 242, 82, 179, 182, 164, 78, 159, 1, 170, 157, 199, 128, 211, 210, 210, 10, 35, 81, 34, 16, 247, 54, 65, 222, 74, 208, 81, 148, 238, 46, 37, 28, 157, 244, 159, 48, 85, 1, 89, 49, 176, 214, 128, 36, 115, 194, 98, 19, 174, 47, 112, 161, 66, 140, 104, 209, 154, 245, 238, 142, 18, 208, 104, 184, 239, 175, 147, 88, 239, 65, 86, 147, 217, 38, 56, 106, 33, 211, 37, 73, 58, 15, 176, 105, 128, 152, 228, 225, 147, 167, 110, 83, 139, 201, 46, 4, 217, 30, 135, 26, 201, 250, 45, 217, 6, 40, 36, 40, 231, 145, 146, 127, 155, 142, 164, 88, 131, 102, 36, 36, 44, 130, 20, 111, 239, 153, 32, 111, 211, 202, 5, 133, 163, 122, 45, 73, 239, 95, 198, 139, 123, 47, 6, 106, 131, 145, 40, 17, 136, 123, 147, 32, 243, 139, 159, 53, 77, 159, 226, 234, 1, 25, 107, 52, 233, 55, 88, 133, 4, 29, 136, 63, 134, 230, 164, 148, 24, 95, 168, 128, 40, 153, 210, 76, 149, 250, 100, 254, 234, 181, 192, 12, 250, 175, 115, 230, 177, 238, 17, 217, 233, 84, 17, 72, 67, 100, 14, 131, 165, 119, 241, 234, 53, 107, 73, 146, 31, 7, 84, 124, 88, 179, 229, 14, 221, 131, 148, 36, 233, 0, 43, 25, 234, 114, 77, 46, 214, 140, 54, 106, 80, 111, 11, 89, 211, 147, 254, 90, 40, 50, 94, 247, 207, 157, 235, 174, 225, 197, 210, 16, 4, 226, 94, 34, 200, 248, 248, 248, 199, 232, 207, 155, 120, 35, 92, 103, 145, 182, 157, 245, 39, 26, 135, 179, 186, 185, 144, 59, 84, 86, 17, 194, 213, 102, 224, 231, 183, 90, 180, 35, 109, 134, 142, 52, 160, 167, 98, 137, 118, 93, 130, 211, 53, 152, 142, 218, 14, 196, 129, 193, 173, 28, 151, 96, 109, 141, 164, 176, 36, 151, 110, 248, 135, 185, 115, 203, 69, 4, 49, 73, 10, 215, 107, 38, 239, 63, 150, 241, 250, 109, 3, 178, 226, 159, 45, 34, 227, 117, 129, 20, 187, 199, 140, 87, 4, 34, 200, 9, 146, 21, 236, 39, 39, 39, 191, 7, 201, 162, 176, 8, 108, 218, 181, 7, 74, 42, 152, 24, 245, 221, 208, 61, 35, 132, 91, 83, 64, 22, 175, 8, 109, 209, 32, 172, 133, 76, 111, 64, 35, 226, 119, 233, 6, 161, 89, 255, 33, 183, 106, 36, 45, 42, 255, 16, 199, 25, 55, 103, 30, 171, 145, 12, 58, 73, 58, 139, 98, 194, 44, 227, 186, 86, 83, 99, 255, 177, 227, 10, 87, 235, 25, 140, 214, 36, 2, 17, 220, 228, 152, 71, 212, 27, 166, 58, 28, 95, 130, 20, 23, 60, 252, 115, 150, 173, 116, 216, 190, 107, 226, 142, 7, 222, 109, 226, 224, 66, 198, 238, 94, 26, 144, 237, 251, 36, 181, 232, 123, 255, 50, 222, 242, 26, 73, 93, 103, 199, 49, 142, 159, 61, 167, 61, 216, 168, 53, 187, 214, 37, 179, 33, 12, 17, 140, 35, 68, 146, 5, 124, 183, 101, 123, 227, 210, 181, 235, 204, 71, 109, 119, 58, 155, 96, 124, 18, 129, 8, 98, 235, 17, 224, 112, 56, 34, 92, 22, 5, 33, 67, 167, 204, 96, 61, 32, 65, 113, 5, 22, 133, 187, 49, 222, 119, 175, 89, 57, 33, 34, 179, 181, 94, 11, 242, 203, 236, 185, 254, 16, 17, 112, 31, 108, 243, 238, 189, 42, 196, 223, 224, 250, 223, 75, 150, 186, 175, 241, 113, 72, 92, 131, 58, 210, 26, 61, 250, 105, 73, 41, 169, 108, 206, 146, 147, 147, 75, 152, 99, 250, 8, 4, 34, 176, 9, 210, 189, 235, 117, 106, 218, 175, 44, 101, 47, 46, 158, 132, 13, 250, 73, 133, 196, 13, 183, 238, 41, 186, 220, 238, 154, 197, 89, 212, 72, 206, 91, 185, 198, 210, 120, 36, 132, 215, 248, 235, 57, 58, 118, 193, 15, 127, 46, 95, 165, 66, 217, 77, 70, 173, 206, 238, 213, 1, 94, 21, 152, 23, 216, 176, 116, 25, 53, 78, 104, 188, 38, 216, 237, 246, 151, 208, 162, 68, 32, 130, 136, 32, 163, 162, 162, 30, 162, 214, 8, 91, 113, 79, 95, 188, 164, 150, 239, 216, 67, 7, 87, 27, 148, 83, 20, 67, 114, 188, 235, 72, 146, 101, 247, 126, 215, 152, 108, 216, 185, 203, 210, 26, 73, 225, 98, 167, 216, 24, 23, 23, 247, 40, 125, 61, 207, 90, 141, 77, 158, 238, 100, 173, 198, 58, 245, 66, 183, 171, 39, 162, 132, 210, 16, 106, 113, 143, 155, 61, 87, 100, 188, 30, 147, 52, 134, 49, 70, 137, 64, 4, 32, 57, 186, 21, 116, 18, 29, 142, 215, 129, 27, 89, 107, 164, 125, 7, 28, 143, 53, 14, 103, 217, 162, 149, 130, 188, 32, 63, 224, 45, 73, 74, 90, 7, 79, 156, 180, 154, 36, 197, 34, 191, 4, 238, 141, 228, 228, 228, 247, 33, 39, 5, 92, 239, 45, 7, 14, 119, 66, 102, 115, 208, 137, 157, 91, 229, 122, 229, 26, 175, 127, 175, 223, 104, 231, 125, 80, 229, 134, 225, 152, 241, 138, 64, 4, 16, 65, 230, 21, 187, 219, 148, 148, 148, 114, 244, 103, 22, 76, 249, 107, 245, 90, 59, 88, 39, 66, 23, 20, 9, 242, 46, 141, 73, 182, 117, 37, 238, 60, 78, 9, 235, 2, 175, 145, 212, 173, 39, 201, 81, 226, 126, 73, 77, 77, 253, 6, 126, 17, 29, 23, 103, 148, 108, 215, 85, 251, 56, 172, 67, 150, 90, 160, 221, 11, 181, 171, 229, 59, 184, 84, 144, 118, 31, 58, 226, 224, 250, 183, 63, 163, 53, 137, 64, 4, 16, 160, 25, 177, 248, 217, 225, 112, 132, 137, 149, 241, 231, 153, 179, 89, 15, 72, 120, 200, 97, 1, 198, 248, 227, 221, 93, 126, 192, 50, 140, 233, 162, 28, 155, 144, 96, 101, 226, 14, 28, 68, 196, 213, 58, 241, 197, 157, 137, 199, 171, 170, 218, 9, 126, 121, 242, 220, 121, 39, 116, 87, 9, 229, 50, 129, 120, 159, 220, 158, 64, 6, 155, 7, 184, 54, 47, 52, 109, 107, 156, 187, 124, 133, 197, 119, 157, 78, 103, 107, 140, 79, 34, 16, 129, 97, 61, 186, 93, 62, 176, 195, 101, 25, 6, 73, 201, 36, 98, 248, 104, 21, 58, 108, 64, 92, 37, 20, 23, 187, 187, 62, 179, 21, 200, 233, 253, 150, 237, 73, 253, 200, 129, 196, 238, 112, 88, 73, 146, 186, 208, 229, 165, 168, 197, 239, 155, 252, 226, 190, 209, 52, 109, 18, 203, 120, 221, 179, 79, 129, 248, 27, 184, 124, 153, 242, 15, 94, 151, 127, 197, 139, 65, 96, 31, 132, 246, 19, 146, 146, 92, 129, 94, 135, 90, 78, 204, 39, 174, 70, 8, 196, 221, 21, 119, 204, 35, 55, 135, 85, 20, 165, 58, 116, 207, 128, 7, 247, 60, 221, 233, 126, 213, 165, 143, 6, 34, 1, 247, 138, 156, 91, 48, 88, 43, 80, 171, 250, 88, 163, 214, 164, 251, 232, 95, 173, 46, 253, 144, 125, 182, 197, 249, 61, 148, 79, 222, 92, 209, 207, 251, 135, 215, 206, 42, 16, 127, 131, 141, 21, 94, 23, 147, 149, 223, 198, 85, 26, 98, 107, 216, 138, 180, 27, 54, 74, 88, 230, 169, 137, 137, 142, 55, 208, 162, 68, 32, 238, 30, 130, 204, 39, 199, 65, 146, 146, 236, 33, 244, 255, 255, 17, 43, 224, 170, 205, 219, 156, 239, 183, 138, 208, 223, 110, 209, 142, 37, 232, 32, 65, 6, 86, 109, 30, 196, 189, 198, 204, 154, 99, 117, 141, 164, 40, 255, 128, 24, 181, 88, 208, 243, 241, 215, 7, 92, 247, 81, 210, 19, 208, 32, 4, 254, 104, 216, 212, 153, 78, 240, 64, 148, 239, 208, 29, 173, 73, 15, 238, 112, 86, 26, 66, 175, 211, 200, 25, 127, 136, 140, 225, 51, 71, 111, 222, 124, 24, 99, 148, 8, 196, 157, 37, 199, 220, 178, 75, 39, 54, 57, 249, 93, 40, 117, 19, 171, 224, 206, 131, 135, 180, 6, 145, 3, 85, 136, 63, 194, 195, 92, 46, 216, 58, 206, 223, 3, 36, 201, 22, 95, 122, 253, 230, 174, 88, 101, 53, 73, 138, 206, 22, 151, 233, 120, 76, 114, 211, 223, 214, 84, 24, 122, 120, 210, 223, 93, 87, 117, 157, 180, 25, 50, 82, 3, 215, 98, 233, 246, 221, 144, 40, 61, 12, 216, 128, 130, 107, 250, 175, 85, 107, 132, 198, 235, 58, 249, 89, 197, 21, 11, 129, 200, 89, 130, 116, 187, 113, 162, 83, 83, 159, 213, 116, 125, 140, 112, 161, 29, 61, 125, 70, 239, 250, 243, 47, 140, 28, 95, 107, 246, 253, 45, 129, 0, 92, 200, 2, 147, 36, 171, 214, 39, 235, 183, 239, 180, 58, 179, 85, 144, 228, 62, 57, 150, 205, 95, 223, 166, 163, 10, 29, 77, 233, 104, 77, 23, 251, 173, 240, 135, 215, 110, 220, 212, 30, 107, 28, 206, 72, 18, 227, 217, 158, 133, 248, 89, 198, 235, 119, 141, 161, 171, 138, 194, 137, 242, 55, 62, 167, 121, 204, 27, 16, 4, 2, 225, 159, 184, 163, 219, 117, 115, 249, 242, 229, 7, 84, 85, 239, 67, 127, 23, 207, 76, 130, 168, 40, 50, 104, 226, 52, 7, 244, 192, 187, 175, 145, 171, 25, 177, 208, 95, 197, 133, 44, 48, 23, 94, 230, 110, 173, 209, 152, 28, 56, 118, 194, 82, 97, 115, 137, 36, 151, 154, 92, 173, 175, 210, 145, 232, 161, 57, 179, 190, 117, 239, 126, 214, 115, 178, 28, 186, 92, 211, 221, 212, 192, 6, 2, 126, 206, 219, 40, 204, 56, 117, 225, 162, 234, 74, 228, 113, 116, 192, 248, 36, 2, 225, 127, 114, 188, 237, 1, 115, 58, 181, 102, 220, 85, 70, 18, 83, 82, 201, 196, 121, 11, 20, 91, 195, 48, 150, 152, 3, 15, 42, 16, 164, 120, 112, 113, 1, 187, 243, 139, 103, 86, 174, 3, 100, 147, 194, 181, 164, 215, 21, 18, 175, 252, 229, 110, 21, 150, 206, 253, 252, 245, 21, 144, 36, 101, 10, 3, 27, 254, 177, 119, 27, 53, 78, 237, 62, 230, 55, 163, 113, 191, 193, 228, 147, 214, 29, 200, 231, 109, 58, 177, 114, 20, 188, 174, 233, 95, 107, 216, 68, 124, 216, 42, 130, 148, 142, 232, 166, 197, 196, 199, 179, 11, 150, 154, 154, 250, 21, 159, 95, 204, 120, 69, 32, 44, 38, 200, 219, 146, 114, 224, 97, 131, 198, 175, 172, 38, 75, 211, 200, 130, 213, 235, 212, 2, 173, 34, 52, 208, 246, 132, 114, 1, 112, 247, 148, 180, 184, 57, 114, 136, 233, 21, 71, 230, 230, 14, 202, 4, 50, 219, 130, 42, 132, 119, 255, 248, 60, 188, 19, 41, 70, 127, 142, 142, 139, 243, 87, 226, 78, 15, 97, 229, 8, 107, 82, 85, 213, 178, 240, 15, 87, 163, 110, 24, 143, 55, 9, 215, 160, 233, 118, 97, 56, 15, 86, 175, 233, 223, 185, 10, 134, 77, 29, 124, 135, 10, 29, 123, 50, 1, 136, 86, 131, 126, 114, 242, 43, 230, 140, 75, 78, 126, 31, 45, 74, 4, 194, 58, 114, 204, 45, 63, 76, 105, 105, 105, 197, 232, 255, 175, 22, 43, 220, 218, 237, 59, 149, 170, 221, 126, 208, 33, 94, 37, 30, 74, 127, 41, 190, 0, 249, 150, 137, 232, 198, 58, 131, 96, 108, 51, 243, 109, 174, 30, 106, 212, 154, 220, 223, 40, 140, 21, 159, 251, 74, 148, 33, 92, 142, 14, 186, 78, 212, 251, 97, 0, 73, 77, 75, 179, 90, 72, 64, 4, 55, 235, 203, 22, 142, 32, 74, 167, 211, 25, 225, 18, 20, 184, 168, 62, 212, 184, 53, 251, 30, 112, 15, 132, 248, 145, 32, 225, 248, 95, 240, 14, 36, 193, 160, 148, 196, 52, 94, 107, 55, 131, 238, 58, 162, 52, 228, 210, 249, 248, 120, 150, 36, 181, 103, 207, 158, 124, 184, 202, 33, 16, 89, 39, 71, 183, 229, 232, 112, 56, 222, 208, 117, 125, 182, 88, 221, 118, 29, 58, 172, 53, 235, 63, 84, 129, 116, 124, 40, 50, 135, 154, 71, 176, 28, 253, 17, 119, 4, 242, 5, 98, 164, 150, 42, 115, 249, 61, 70, 23, 75, 225, 6, 196, 44, 89, 223, 8, 242, 85, 74, 114, 221, 70, 141, 211, 187, 143, 254, 149, 137, 200, 131, 43, 206, 23, 107, 201, 173, 15, 218, 160, 21, 188, 31, 18, 64, 172, 38, 73, 129, 146, 102, 55, 160, 168, 181, 165, 68, 57, 5, 254, 96, 221, 246, 93, 14, 136, 139, 86, 240, 19, 129, 21, 227, 234, 53, 47, 54, 109, 203, 72, 165, 184, 187, 167, 101, 231, 128, 247, 34, 84, 238, 220, 203, 128, 174, 42, 179, 151, 174, 80, 92, 215, 143, 108, 150, 230, 25, 75, 67, 16, 136, 172, 90, 142, 167, 79, 159, 126, 146, 254, 255, 72, 225, 22, 59, 121, 238, 2, 233, 50, 114, 172, 98, 251, 174, 177, 1, 105, 248, 176, 96, 129, 165, 1, 11, 76, 136, 31, 93, 70, 176, 176, 119, 252, 105, 12, 185, 30, 29, 173, 109, 223, 127, 128, 45, 244, 96, 89, 150, 68, 245, 149, 12, 173, 8, 150, 112, 67, 9, 238, 199, 241, 147, 221, 233, 168, 131, 39, 79, 215, 88, 119, 13, 186, 177, 241, 182, 169, 113, 103, 182, 214, 106, 74, 70, 205, 156, 109, 117, 179, 101, 67, 210, 110, 125, 83, 182, 32, 197, 189, 40, 126, 166, 159, 183, 29, 254, 112, 202, 252, 197, 118, 161, 212, 100, 101, 35, 238, 162, 220, 98, 126, 186, 73, 56, 8, 38, 24, 19, 230, 45, 80, 225, 247, 208, 224, 184, 84, 128, 151, 154, 132, 240, 58, 74, 120, 86, 65, 140, 97, 227, 174, 61, 14, 30, 38, 153, 38, 54, 35, 88, 26, 130, 64, 248, 70, 144, 238, 93, 252, 182, 109, 219, 30, 80, 85, 181, 179, 200, 88, 189, 122, 227, 38, 25, 49, 125, 22, 244, 122, 212, 161, 43, 3, 44, 40, 176, 235, 14, 229, 139, 177, 191, 30, 110, 176, 130, 74, 208, 215, 103, 154, 182, 33, 231, 175, 92, 21, 241, 43, 242, 231, 138, 85, 26, 88, 21, 168, 190, 146, 254, 128, 197, 253, 211, 240, 142, 240, 170, 39, 166, 164, 192, 180, 193, 127, 210, 52, 86, 107, 56, 66, 207, 71, 173, 114, 111, 109, 201, 224, 218, 130, 151, 128, 89, 33, 203, 86, 90, 29, 143, 20, 196, 125, 67, 170, 145, 204, 99, 142, 133, 195, 107, 114, 114, 242, 83, 252, 239, 128, 196, 156, 144, 221, 10, 22, 46, 40, 205, 132, 90, 176, 17, 131, 251, 249, 117, 186, 233, 171, 219, 103, 160, 145, 154, 102, 231, 226, 23, 91, 53, 40, 163, 168, 232, 167, 16, 66, 78, 111, 152, 96, 67, 9, 195, 86, 175, 133, 113, 236, 204, 89, 230, 122, 85, 20, 165, 135, 121, 115, 130, 64, 32, 254, 77, 142, 121, 229, 197, 201, 238, 116, 54, 166, 255, 127, 214, 149, 177, 154, 66, 166, 45, 252, 91, 121, 182, 105, 27, 3, 172, 143, 47, 56, 57, 230, 84, 127, 63, 230, 234, 163, 100, 184, 96, 205, 122, 246, 80, 219, 21, 101, 26, 125, 57, 0, 63, 119, 252, 105, 180, 242, 48, 181, 40, 93, 201, 40, 72, 138, 255, 210, 243, 236, 192, 44, 7, 99, 247, 161, 35, 78, 46, 122, 221, 220, 110, 183, 151, 130, 159, 227, 18, 19, 73, 165, 206, 189, 244, 119, 91, 182, 99, 4, 145, 145, 75, 145, 21, 167, 87, 107, 72, 214, 108, 221, 238, 47, 146, 60, 44, 221, 139, 255, 170, 225, 19, 61, 18, 211, 210, 210, 138, 48, 166, 79, 75, 35, 85, 187, 69, 106, 175, 53, 107, 203, 174, 125, 118, 146, 108, 92, 186, 180, 60, 123, 183, 94, 11, 114, 234, 194, 69, 222, 5, 204, 136, 130, 31, 134, 79, 251, 93, 179, 213, 105, 206, 188, 25, 129, 158, 204, 3, 207, 8, 60, 187, 159, 132, 117, 32, 69, 191, 239, 162, 223, 136, 137, 101, 23, 50, 77, 81, 170, 243, 185, 199, 68, 30, 4, 66, 94, 140, 204, 26, 171, 154, 166, 85, 162, 255, 191, 71, 172, 96, 11, 86, 175, 83, 232, 46, 157, 101, 172, 194, 67, 230, 106, 126, 219, 57, 71, 98, 52, 176, 120, 65, 220, 236, 133, 166, 109, 73, 155, 193, 35, 68, 43, 165, 11, 124, 177, 252, 28, 254, 39, 42, 38, 134, 124, 24, 22, 161, 21, 161, 214, 4, 186, 93, 61, 116, 174, 167, 155, 11, 40, 201, 225, 196, 182, 92, 92, 231, 52, 135, 131, 37, 195, 156, 187, 124, 69, 133, 206, 17, 162, 174, 46, 36, 163, 86, 76, 244, 30, 216, 115, 248, 168, 213, 66, 2, 194, 51, 176, 202, 147, 21, 41, 185, 255, 243, 136, 206, 32, 64, 244, 236, 70, 184, 114, 213, 120, 134, 110, 220, 10, 182, 118, 181, 208, 202, 206, 181, 119, 53, 47, 166, 27, 177, 213, 107, 29, 252, 251, 253, 18, 31, 31, 255, 50, 236, 43, 28, 138, 147, 124, 213, 181, 143, 10, 189, 78, 33, 161, 39, 208, 137, 82, 72, 12, 210, 77, 47, 105, 242, 227, 16, 205, 169, 178, 10, 28, 61, 33, 53, 245, 19, 179, 55, 9, 129, 184, 215, 45, 71, 185, 156, 163, 32, 44, 84, 98, 229, 218, 184, 115, 183, 246, 85, 151, 222, 78, 88, 24, 33, 229, 30, 44, 9, 88, 68, 115, 90, 12, 128, 215, 230, 233, 116, 49, 103, 171, 114, 138, 195, 81, 86, 156, 179, 162, 170, 189, 224, 119, 219, 247, 31, 0, 209, 107, 163, 98, 71, 212, 130, 149, 99, 184, 175, 80, 43, 171, 97, 223, 193, 26, 47, 250, 143, 75, 73, 73, 121, 154, 95, 251, 7, 56, 217, 140, 130, 127, 216, 115, 248, 136, 3, 174, 51, 16, 141, 43, 17, 234, 223, 46, 91, 248, 253, 163, 141, 195, 201, 105, 151, 149, 229, 15, 181, 157, 73, 158, 92, 126, 233, 197, 201, 210, 236, 246, 65, 240, 166, 109, 251, 14, 168, 175, 53, 255, 158, 148, 162, 231, 87, 34, 11, 53, 147, 240, 93, 193, 18, 125, 162, 73, 56, 233, 52, 98, 140, 216, 136, 157, 61, 113, 226, 196, 35, 220, 163, 2, 74, 63, 228, 248, 217, 115, 42, 181, 38, 13, 22, 94, 104, 23, 248, 89, 213, 112, 143, 48, 23, 58, 181, 144, 127, 28, 63, 89, 100, 188, 94, 79, 78, 78, 126, 18, 45, 74, 4, 38, 229, 72, 59, 197, 27, 9, 9, 175, 209, 5, 111, 154, 88, 177, 246, 31, 59, 174, 135, 13, 26, 174, 218, 170, 214, 55, 160, 201, 45, 184, 235, 132, 114, 71, 78, 46, 12, 16, 103, 130, 88, 25, 184, 248, 254, 90, 185, 70, 200, 106, 253, 34, 118, 186, 194, 37, 71, 173, 163, 117, 240, 111, 19, 230, 206, 135, 68, 34, 246, 224, 223, 235, 170, 62, 34, 153, 41, 111, 163, 214, 228, 204, 197, 75, 26, 119, 167, 125, 43, 22, 63, 153, 120, 232, 156, 46, 129, 127, 95, 190, 113, 179, 3, 230, 218, 83, 236, 173, 12, 37, 6, 136, 107, 194, 245, 143, 138, 142, 177, 154, 36, 197, 2, 221, 219, 188, 56, 11, 171, 146, 190, 190, 7, 125, 38, 233, 232, 75, 199, 120, 58, 230, 210, 177, 94, 28, 160, 199, 152, 223, 140, 255, 81, 2, 7, 2, 203, 138, 72, 2, 120, 69, 222, 106, 217, 78, 187, 118, 51, 154, 29, 47, 41, 41, 41, 68, 222, 76, 104, 186, 62, 29, 126, 191, 104, 237, 122, 214, 251, 20, 44, 244, 144, 32, 217, 76, 9, 61, 222, 105, 139, 150, 8, 49, 244, 93, 230, 249, 71, 32, 238, 41, 130, 20, 63, 211, 133, 224, 127, 170, 170, 14, 5, 165, 42, 120, 50, 78, 157, 191, 96, 244, 25, 55, 209, 9, 68, 243, 124, 211, 54, 204, 114, 188, 83, 238, 75, 151, 37, 68, 119, 247, 116, 225, 11, 27, 56, 92, 88, 26, 231, 65, 250, 78, 60, 188, 194, 10, 142, 142, 142, 126, 6, 218, 83, 130, 173, 4, 174, 163, 103, 155, 180, 97, 86, 212, 221, 146, 178, 31, 202, 71, 78, 126, 38, 203, 102, 165, 215, 113, 241, 218, 13, 194, 117, 40, 148, 108, 242, 202, 158, 4, 120, 221, 176, 97, 3, 120, 20, 14, 186, 178, 70, 23, 185, 218, 80, 73, 36, 32, 92, 222, 111, 181, 104, 71, 234, 244, 233, 79, 146, 92, 201, 63, 254, 176, 36, 27, 200, 36, 41, 223, 171, 244, 231, 67, 255, 242, 209, 210, 11, 126, 51, 54, 214, 216, 121, 240, 16, 35, 113, 80, 223, 41, 153, 73, 75, 210, 93, 218, 66, 55, 132, 255, 236, 218, 195, 54, 98, 244, 153, 232, 107, 142, 209, 67, 29, 33, 253, 249, 52, 252, 59, 123, 70, 234, 181, 100, 207, 71, 48, 148, 30, 133, 240, 103, 141, 199, 155, 29, 60, 24, 59, 91, 10, 199, 160, 198, 43, 226, 158, 33, 72, 246, 192, 71, 210, 197, 135, 119, 123, 191, 201, 82, 10, 99, 227, 200, 136, 233, 127, 56, 160, 235, 59, 100, 11, 138, 114, 142, 172, 88, 99, 66, 88, 25, 118, 244, 48, 178, 66, 178, 162, 185, 47, 36, 82, 64, 217, 2, 181, 132, 116, 174, 57, 89, 193, 28, 47, 17, 11, 106, 106, 106, 106, 21, 198, 162, 87, 174, 106, 79, 55, 105, 227, 238, 94, 127, 55, 52, 41, 22, 11, 145, 63, 139, 223, 205, 137, 58, 160, 149, 219, 109, 212, 56, 225, 58, 60, 49, 119, 238, 220, 251, 60, 185, 46, 133, 107, 147, 206, 31, 108, 52, 152, 25, 213, 239, 183, 73, 78, 80, 181, 97, 68, 201, 239, 1, 184, 31, 30, 111, 220, 26, 220, 145, 132, 199, 175, 172, 212, 109, 21, 108, 91, 74, 38, 111, 190, 64, 179, 243, 165, 132, 252, 19, 252, 193, 149, 235, 81, 201, 53, 123, 245, 119, 84, 233, 218, 199, 241, 69, 199, 30, 78, 176, 110, 159, 108, 18, 78, 10, 211, 215, 204, 186, 90, 139, 74, 101, 45, 195, 167, 206, 20, 214, 236, 54, 15, 86, 44, 155, 163, 132, 132, 132, 130, 34, 217, 9, 36, 222, 32, 14, 90, 38, 11, 150, 235, 221, 56, 74, 10, 201, 65, 74, 254, 135, 79, 158, 82, 120, 198, 107, 63, 79, 238, 111, 4, 34, 168, 9, 146, 187, 39, 215, 48, 253, 70, 187, 157, 76, 95, 180, 212, 249, 108, 179, 182, 170, 173, 126, 43, 70, 74, 21, 121, 135, 142, 172, 196, 245, 224, 61, 112, 12, 120, 63, 44, 178, 182, 186, 205, 249, 239, 50, 159, 232, 192, 50, 41, 107, 54, 129, 150, 76, 162, 205, 207, 132, 244, 30, 88, 73, 149, 133, 197, 215, 86, 110, 218, 226, 96, 41, 251, 188, 87, 101, 232, 29, 218, 157, 195, 162, 3, 11, 233, 71, 97, 17, 70, 161, 214, 29, 141, 119, 91, 182, 207, 242, 230, 195, 215, 207, 100, 66, 14, 109, 58, 147, 143, 195, 58, 104, 66, 58, 46, 49, 45, 173, 112, 70, 49, 38, 105, 163, 81, 8, 114, 123, 128, 4, 155, 254, 56, 68, 133, 164, 14, 176, 200, 139, 242, 142, 247, 176, 128, 14, 159, 246, 187, 191, 106, 36, 129, 40, 223, 50, 223, 171, 178, 21, 67, 137, 114, 38, 252, 33, 88, 124, 160, 236, 36, 238, 57, 81, 210, 16, 146, 201, 185, 130, 107, 1, 194, 20, 95, 117, 233, 163, 167, 184, 20, 132, 148, 244, 154, 19, 139, 255, 167, 27, 181, 118, 44, 36, 113, 244, 184, 66, 201, 213, 96, 25, 193, 65, 210, 80, 27, 18, 179, 96, 179, 81, 144, 222, 171, 87, 163, 110, 176, 141, 139, 221, 110, 175, 135, 137, 60, 136, 123, 129, 32, 221, 221, 58, 156, 154, 54, 26, 110, 254, 221, 135, 142, 56, 94, 105, 222, 78, 181, 213, 106, 194, 51, 23, 123, 100, 75, 85, 36, 132, 147, 97, 209, 54, 157, 200, 251, 116, 225, 217, 188, 103, 159, 186, 125, 255, 65, 21, 126, 7, 169, 230, 153, 41, 23, 129, 191, 133, 68, 140, 230, 3, 134, 185, 229, 179, 14, 30, 60, 248, 80, 122, 73, 28, 38, 183, 220, 62, 120, 195, 192, 73, 211, 20, 32, 106, 177, 200, 135, 230, 176, 5, 9, 243, 9, 238, 201, 90, 189, 250, 27, 151, 175, 71, 25, 81, 209, 49, 122, 227, 31, 135, 24, 174, 154, 196, 158, 126, 33, 74, 119, 151, 142, 106, 13, 201, 182, 125, 251, 157, 220, 117, 216, 195, 151, 36, 12, 241, 239, 212, 122, 168, 6, 239, 187, 25, 27, 167, 211, 251, 66, 3, 97, 236, 114, 220, 43, 0, 165, 63, 51, 22, 47, 117, 19, 164, 69, 36, 41, 172, 72, 8, 116, 62, 110, 38, 70, 243, 245, 165, 159, 201, 164, 16, 87, 111, 217, 102, 7, 11, 16, 226, 207, 37, 178, 224, 173, 40, 193, 189, 29, 176, 145, 59, 120, 252, 164, 171, 172, 200, 233, 108, 158, 222, 92, 241, 56, 62, 59, 47, 205, 48, 22, 194, 223, 207, 90, 178, 220, 193, 92, 211, 32, 104, 208, 38, 56, 52, 94, 97, 99, 249, 92, 147, 54, 164, 78, 239, 1, 90, 154, 195, 21, 162, 132, 146, 27, 36, 74, 68, 176, 147, 36, 123, 232, 233, 174, 176, 190, 43, 176, 119, 5, 68, 162, 117, 88, 0, 173, 40, 194, 103, 74, 30, 116, 209, 17, 74, 30, 27, 118, 238, 22, 49, 38, 178, 227, 192, 33, 16, 30, 96, 11, 173, 175, 238, 176, 50, 174, 90, 53, 253, 212, 249, 11, 58, 239, 88, 80, 217, 155, 219, 71, 124, 199, 100, 69, 121, 7, 184, 33, 213, 238, 128, 164, 31, 237, 61, 106, 189, 193, 98, 152, 147, 25, 175, 240, 61, 97, 115, 96, 171, 223, 210, 56, 126, 246, 156, 155, 73, 98, 226, 226, 73, 213, 238, 145, 58, 196, 123, 133, 149, 107, 165, 37, 192, 50, 21, 191, 107, 66, 198, 254, 49, 87, 108, 46, 54, 121, 34, 154, 12, 54, 82, 66, 80, 188, 59, 188, 249, 244, 133, 139, 186, 173, 97, 24, 43, 13, 97, 9, 84, 212, 178, 95, 254, 207, 102, 127, 197, 35, 143, 101, 20, 251, 114, 199, 79, 233, 43, 37, 74, 38, 168, 63, 103, 217, 74, 135, 237, 219, 6, 108, 46, 51, 37, 214, 206, 203, 31, 224, 251, 136, 100, 21, 122, 204, 191, 188, 205, 147, 152, 159, 184, 184, 184, 71, 65, 87, 3, 222, 215, 126, 248, 40, 21, 66, 2, 21, 253, 180, 241, 185, 19, 101, 67, 204, 139, 83, 167, 57, 233, 57, 246, 55, 113, 31, 197, 210, 103, 240, 89, 116, 189, 34, 130, 149, 32, 217, 77, 157, 146, 146, 242, 1, 172, 109, 118, 135, 66, 106, 244, 232, 167, 65, 189, 23, 60, 216, 32, 183, 21, 106, 1, 73, 186, 22, 232, 198, 76, 112, 128, 91, 48, 107, 233, 96, 59, 238, 63, 151, 175, 114, 64, 135, 244, 74, 94, 136, 1, 118, 227, 149, 185, 170, 203, 31, 75, 150, 43, 124, 49, 158, 34, 37, 234, 228, 242, 242, 93, 243, 115, 183, 43, 171, 161, 59, 118, 250, 172, 78, 173, 31, 163, 116, 14, 202, 214, 21, 19, 139, 12, 221, 44, 44, 94, 183, 129, 73, 182, 56, 156, 206, 95, 232, 34, 211, 138, 229, 215, 71, 71, 235, 165, 35, 186, 235, 64, 222, 21, 178, 89, 0, 111, 182, 92, 33, 97, 169, 70, 207, 126, 186, 83, 101, 201, 172, 55, 47, 94, 188, 248, 95, 179, 251, 210, 215, 164, 46, 69, 85, 135, 240, 210, 26, 166, 54, 195, 54, 64, 245, 90, 208, 77, 207, 65, 87, 210, 140, 102, 25, 73, 138, 184, 233, 26, 31, 72, 138, 109, 132, 18, 19, 19, 31, 135, 18, 73, 120, 211, 184, 217, 243, 88, 162, 209, 151, 157, 123, 251, 76, 144, 176, 105, 130, 76, 216, 102, 253, 135, 10, 18, 136, 142, 138, 138, 122, 202, 151, 185, 146, 220, 174, 172, 51, 201, 141, 152, 88, 168, 209, 53, 32, 105, 40, 39, 197, 53, 252, 153, 100, 198, 98, 181, 157, 92, 27, 174, 9, 243, 22, 56, 184, 235, 224, 96, 100, 100, 164, 136, 21, 231, 21, 241, 98, 15, 35, 79, 22, 70, 94, 15, 67, 254, 119, 76, 28, 66, 248, 141, 32, 217, 77, 13, 25, 161, 244, 231, 51, 112, 175, 15, 152, 48, 213, 9, 139, 29, 144, 81, 118, 227, 117, 161, 50, 41, 208, 221, 116, 143, 49, 238, 157, 103, 244, 217, 179, 103, 31, 221, 227, 106, 171, 197, 138, 234, 126, 156, 48, 133, 185, 63, 43, 165, 35, 33, 86, 140, 199, 189, 238, 107, 24, 70, 26, 247, 27, 44, 138, 203, 47, 196, 198, 198, 254, 71, 254, 46, 190, 198, 94, 41, 185, 78, 130, 3, 252, 181, 106, 141, 106, 171, 214, 32, 71, 36, 197, 224, 123, 177, 76, 73, 58, 191, 125, 127, 155, 44, 22, 255, 227, 130, 188, 21, 69, 137, 132, 95, 92, 188, 122, 77, 253, 184, 117, 71, 29, 226, 149, 66, 239, 54, 52, 155, 150, 43, 44, 254, 133, 194, 59, 146, 19, 103, 207, 169, 60, 150, 52, 144, 190, 64, 33, 252, 199, 158, 226, 123, 158, 44, 73, 254, 10, 239, 249, 148, 110, 112, 74, 104, 186, 126, 137, 245, 113, 220, 184, 9, 44, 74, 230, 2, 63, 113, 238, 60, 39, 73, 205, 42, 146, 20, 101, 7, 83, 124, 36, 41, 150, 221, 156, 156, 156, 12, 30, 3, 22, 72, 236, 63, 97, 10, 243, 86, 192, 253, 227, 203, 61, 11, 242, 134, 47, 55, 255, 30, 234, 110, 217, 242, 31, 155, 148, 84, 196, 151, 57, 50, 111, 60, 233, 230, 167, 61, 175, 211, 212, 192, 162, 21, 155, 177, 96, 41, 35, 170, 196, 85, 174, 160, 52, 136, 95, 243, 133, 190, 122, 38, 252, 21, 46, 66, 32, 172, 188, 177, 114, 75, 117, 132, 204, 162, 155, 191, 106, 173, 2, 15, 51, 88, 125, 150, 53, 116, 165, 187, 231, 119, 90, 180, 35, 85, 186, 71, 170, 201, 169, 174, 246, 73, 116, 167, 255, 185, 56, 15, 106, 193, 22, 128, 231, 139, 46, 40, 44, 206, 241, 82, 83, 151, 132, 152, 217, 53, 37, 146, 47, 64, 55, 243, 4, 119, 81, 82, 82, 169, 146, 217, 7, 82, 60, 76, 244, 189, 239, 67, 185, 27, 28, 39, 242, 215, 137, 58, 88, 14, 229, 252, 152, 137, 40, 116, 63, 63, 104, 9, 22, 122, 47, 61, 41, 53, 149, 25, 194, 41, 78, 231, 135, 252, 188, 238, 231, 174, 204, 97, 188, 220, 134, 73, 252, 65, 162, 68, 118, 221, 193, 165, 120, 103, 148, 218, 189, 127, 36, 14, 69, 17, 113, 62, 85, 34, 162, 14, 25, 17, 144, 152, 95, 250, 10, 196, 147, 106, 142, 23, 110, 221, 187, 159, 101, 128, 130, 75, 253, 218, 205, 155, 132, 151, 8, 88, 77, 146, 63, 100, 180, 25, 50, 75, 38, 2, 110, 38, 38, 190, 14, 22, 179, 74, 173, 218, 14, 63, 141, 214, 65, 56, 1, 50, 136, 189, 22, 207, 211, 103, 96, 222, 202, 53, 226, 11, 64, 163, 240, 206, 116, 83, 213, 150, 190, 190, 155, 209, 253, 38, 205, 19, 88, 55, 95, 208, 29, 225, 231, 244, 125, 174, 210, 153, 5, 127, 171, 143, 54, 110, 29, 52, 217, 174, 34, 51, 27, 230, 19, 98, 209, 251, 142, 30, 19, 26, 175, 195, 50, 120, 252, 242, 182, 29, 61, 58, 255, 170, 85, 171, 30, 218, 3, 155, 228, 147, 39, 159, 56, 127, 243, 230, 255, 93, 187, 118, 237, 197, 27, 55, 110, 188, 22, 147, 148, 244, 54, 172, 7, 144, 32, 150, 148, 148, 86, 12, 164, 17, 33, 99, 93, 209, 180, 111, 40, 1, 127, 71, 183, 93, 245, 233, 107, 115, 226, 186, 22, 29, 32, 209, 154, 126, 94, 45, 179, 167, 8, 129, 176, 212, 205, 170, 168, 106, 79, 158, 141, 7, 245, 143, 150, 169, 133, 132, 72, 89, 171, 116, 113, 48, 132, 232, 184, 221, 238, 108, 42, 220, 82, 146, 5, 85, 155, 101, 223, 92, 187, 174, 83, 18, 148, 92, 83, 157, 221, 138, 39, 44, 230, 85, 167, 25, 25, 62, 213, 157, 61, 153, 194, 107, 247, 102, 73, 93, 234, 115, 251, 242, 157, 233, 107, 33, 186, 49, 72, 16, 114, 103, 35, 103, 252, 193, 74, 91, 128, 196, 50, 147, 18, 239, 107, 9, 201, 109, 186, 159, 117, 155, 147, 35, 167, 78, 171, 92, 35, 181, 149, 52, 23, 183, 18, 63, 52, 109, 60, 19, 42, 61, 121, 74, 129, 243, 18, 173, 153, 178, 74, 148, 161, 252, 243, 33, 214, 57, 122, 214, 28, 80, 74, 34, 43, 55, 111, 37, 246, 91, 140, 217, 203, 11, 73, 138, 86, 84, 133, 196, 228, 175, 217, 186, 195, 57, 115, 241, 82, 112, 159, 147, 26, 61, 250, 18, 216, 220, 124, 215, 179, 31, 73, 76, 182, 188, 70, 82, 120, 31, 26, 167, 71, 146, 38, 235, 46, 215, 245, 235, 215, 159, 76, 160, 11, 45, 221, 112, 20, 167, 247, 247, 34, 22, 239, 141, 79, 80, 97, 227, 149, 145, 85, 46, 50, 90, 243, 82, 171, 120, 192, 132, 169, 36, 57, 53, 213, 252, 37, 78, 101, 100, 81, 74, 247, 87, 184, 244, 158, 20, 238, 118, 53, 192, 210, 14, 13, 18, 43, 82, 110, 25, 246, 25, 221, 200, 189, 217, 162, 157, 65, 159, 95, 241, 157, 33, 123, 235, 47, 174, 206, 5, 66, 30, 91, 32, 23, 144, 63, 175, 199, 185, 222, 51, 120, 33, 64, 247, 54, 150, 111, 86, 211, 248, 198, 45, 211, 217, 94, 244, 94, 155, 21, 29, 29, 253, 136, 244, 44, 161, 251, 21, 97, 77, 162, 14, 221, 165, 125, 33, 30, 224, 66, 225, 29, 181, 194, 174, 78, 16, 217, 46, 128, 14, 225, 46, 62, 86, 22, 80, 163, 17, 184, 155, 68, 28, 114, 148, 28, 179, 48, 145, 53, 139, 113, 237, 60, 112, 8, 82, 231, 89, 186, 185, 72, 228, 17, 13, 110, 193, 253, 248, 77, 215, 62, 64, 50, 44, 118, 231, 94, 69, 157, 164, 144, 47, 46, 87, 169, 8, 189, 18, 179, 104, 147, 147, 201, 144, 41, 51, 12, 200, 174, 5, 210, 11, 205, 68, 233, 6, 40, 13, 129, 85, 91, 218, 199, 198, 206, 204, 53, 245, 93, 99, 50, 127, 245, 58, 59, 119, 77, 253, 97, 38, 38, 147, 62, 46, 235, 55, 181, 235, 224, 97, 5, 118, 234, 64, 114, 172, 142, 50, 27, 217, 197, 112, 174, 208, 20, 217, 246, 122, 113, 136, 135, 10, 11, 109, 166, 228, 178, 202, 237, 205, 2, 167, 68, 217, 132, 17, 248, 169, 51, 154, 173, 108, 53, 29, 220, 109, 112, 124, 200, 212, 109, 59, 100, 164, 187, 70, 210, 15, 205, 150, 203, 122, 34, 114, 169, 86, 177, 46, 253, 204, 181, 92, 212, 254, 166, 201, 82, 214, 143, 158, 62, 3, 11, 185, 87, 119, 167, 184, 119, 33, 105, 13, 200, 191, 65, 223, 65, 198, 217, 75, 151, 147, 249, 53, 147, 231, 42, 35, 146, 100, 25, 192, 48, 23, 244, 222, 103, 158, 143, 73, 127, 45, 100, 253, 77, 75, 223, 225, 218, 92, 127, 36, 242, 192, 198, 226, 85, 106, 165, 215, 238, 61, 192, 136, 142, 141, 251, 215, 238, 200, 73, 55, 76, 105, 138, 147, 36, 167, 217, 73, 108, 98, 18, 137, 138, 141, 35, 87, 110, 220, 132, 154, 101, 114, 226, 252, 5, 114, 132, 94, 155, 253, 199, 78, 144, 237, 7, 14, 145, 77, 187, 247, 146, 117, 219, 118, 144, 165, 27, 55, 129, 122, 145, 49, 111, 197, 106, 253, 247, 191, 151, 105, 147, 23, 44, 86, 199, 207, 157, 175, 142, 250, 125, 182, 115, 232, 212, 153, 202, 192, 137, 83, 149, 94, 99, 199, 219, 15, 157, 56, 37, 174, 243, 37, 89, 142, 18, 221, 175, 136, 108, 199, 33, 99, 99, 99, 159, 7, 21, 26, 184, 187, 90, 15, 30, 225, 124, 166, 73, 155, 108, 119, 74, 240, 148, 168, 3, 25, 134, 46, 245, 19, 99, 157, 167, 120, 133, 188, 216, 208, 69, 110, 5, 111, 111, 101, 135, 247, 86, 238, 244, 239, 184, 40, 171, 177, 252, 186, 46, 25, 52, 121, 186, 136, 233, 205, 205, 100, 188, 72, 44, 170, 51, 224, 205, 163, 126, 159, 163, 136, 158, 137, 33, 62, 244, 76, 4, 119, 25, 52, 143, 134, 210, 141, 240, 193, 35, 116, 168, 109, 44, 197, 137, 50, 189, 152, 44, 139, 67, 82, 235, 132, 62, 212, 226, 156, 207, 111, 216, 176, 193, 163, 245, 107, 34, 74, 214, 115, 138, 46, 28, 26, 100, 90, 130, 59, 184, 116, 22, 55, 49, 238, 107, 66, 173, 241, 121, 43, 87, 59, 210, 43, 140, 247, 18, 247, 17, 133, 251, 63, 243, 134, 218, 10, 196, 154, 171, 208, 141, 75, 254, 70, 97, 132, 46, 92, 86, 215, 72, 106, 18, 89, 190, 151, 209, 166, 66, 100, 147, 130, 75, 255, 204, 165, 203, 100, 231, 193, 195, 32, 85, 104, 208, 235, 75, 58, 143, 28, 203, 136, 239, 51, 31, 4, 5, 96, 110, 225, 111, 88, 118, 235, 55, 245, 64, 97, 198, 206, 191, 207, 223, 62, 198, 110, 243, 242, 57, 98, 186, 177, 203, 54, 110, 114, 216, 138, 84, 102, 155, 170, 96, 178, 34, 205, 137, 60, 112, 111, 66, 178, 31, 37, 76, 163, 86, 175, 31, 149, 114, 29, 123, 40, 197, 219, 117, 85, 62, 107, 211, 73, 121, 167, 101, 123, 229, 153, 166, 109, 149, 135, 26, 133, 131, 103, 68, 177, 213, 105, 238, 180, 213, 110, 234, 164, 247, 180, 147, 110, 178, 84, 91, 117, 24, 13, 97, 104, 174, 209, 8, 218, 219, 233, 116, 13, 128, 97, 64, 189, 41, 36, 216, 129, 46, 46, 196, 243, 193, 187, 2, 165, 82, 249, 27, 181, 134, 122, 107, 99, 54, 95, 99, 248, 70, 124, 168, 188, 41, 198, 254, 151, 136, 76, 199, 33, 165, 159, 119, 193, 77, 245, 235, 156, 121, 204, 114, 115, 145, 68, 246, 31, 24, 119, 162, 14, 189, 153, 251, 141, 159, 34, 72, 225, 18, 36, 234, 100, 224, 46, 99, 191, 59, 17, 29, 253, 8, 16, 8, 75, 182, 24, 63, 197, 1, 174, 73, 185, 102, 176, 4, 183, 246, 222, 111, 21, 161, 199, 38, 36, 178, 120, 85, 162, 195, 241, 186, 108, 37, 250, 58, 7, 215, 174, 93, 123, 2, 196, 81, 32, 94, 85, 173, 123, 95, 150, 205, 155, 145, 174, 39, 139, 175, 118, 112, 17, 36, 88, 179, 49, 241, 76, 229, 142, 252, 242, 199, 92, 157, 53, 247, 245, 48, 127, 66, 69, 231, 181, 102, 223, 147, 146, 237, 187, 106, 60, 38, 155, 2, 113, 23, 217, 242, 72, 143, 200, 93, 68, 105, 204, 115, 185, 55, 183, 171, 16, 43, 19, 139, 120, 72, 38, 221, 98, 140, 32, 233, 102, 0, 118, 225, 252, 154, 92, 60, 127, 254, 252, 99, 25, 157, 71, 70, 231, 37, 234, 17, 89, 102, 50, 61, 238, 139, 77, 219, 144, 201, 243, 23, 113, 247, 151, 101, 74, 59, 170, 84, 35, 249, 84, 70, 155, 10, 74, 74, 109, 88, 199, 146, 75, 151, 33, 174, 174, 218, 42, 213, 132, 204, 101, 29, 22, 214, 23, 232, 185, 65, 150, 182, 119, 130, 148, 60, 32, 213, 26, 146, 149, 155, 183, 137, 185, 218, 156, 137, 205, 132, 252, 140, 109, 113, 63, 99, 144, 12, 215, 169, 87, 208, 118, 160, 129, 185, 131, 13, 28, 52, 58, 128, 103, 233, 211, 214, 29, 217, 207, 48, 239, 33, 124, 163, 91, 130, 231, 21, 192, 223, 149, 102, 241, 76, 87, 125, 45, 16, 44, 60, 91, 48, 192, 42, 189, 125, 220, 250, 55, 247, 224, 239, 19, 189, 106, 225, 90, 181, 25, 50, 66, 189, 116, 237, 186, 184, 241, 246, 197, 37, 39, 191, 47, 229, 94, 160, 85, 137, 240, 105, 129, 203, 37, 30, 112, 17, 243, 90, 183, 125, 167, 34, 4, 171, 67, 45, 140, 81, 64, 169, 65, 237, 222, 253, 85, 145, 188, 65, 73, 225, 35, 111, 139, 177, 32, 57, 167, 211, 249, 33, 183, 60, 225, 24, 218, 35, 116, 183, 8, 15, 3, 180, 185, 98, 11, 125, 213, 250, 100, 233, 134, 127, 156, 60, 22, 17, 153, 25, 130, 52, 187, 197, 236, 118, 123, 67, 38, 156, 112, 248, 8, 236, 106, 13, 120, 32, 67, 50, 200, 16, 101, 173, 160, 40, 33, 30, 56, 118, 66, 60, 140, 134, 170, 105, 164, 229, 128, 97, 250, 255, 113, 75, 92, 38, 202, 18, 188, 235, 4, 181, 54, 141, 67, 39, 79, 105, 188, 203, 251, 24, 79, 11, 106, 122, 137, 50, 244, 90, 53, 163, 132, 196, 210, 44, 255, 94, 183, 81, 131, 150, 96, 101, 50, 225, 178, 19, 9, 67, 176, 251, 134, 133, 68, 156, 55, 189, 38, 31, 102, 113, 238, 216, 223, 95, 190, 124, 249, 113, 97, 189, 129, 100, 155, 237, 211, 10, 144, 229, 104, 117, 210, 142, 34, 213, 72, 222, 151, 222, 156, 9, 203, 142, 90, 17, 3, 121, 55, 14, 39, 184, 194, 193, 130, 135, 145, 158, 165, 239, 201, 205, 202, 106, 112, 191, 174, 75, 230, 175, 94, 43, 230, 106, 151, 89, 126, 206, 87, 111, 77, 84, 66, 194, 43, 16, 107, 131, 155, 165, 222, 15, 3, 84, 56, 167, 114, 29, 186, 7, 117, 171, 54, 65, 132, 108, 67, 219, 206, 191, 186, 196, 33, 124, 64, 190, 194, 131, 116, 157, 120, 169, 89, 91, 99, 245, 150, 109, 194, 170, 52, 64, 253, 200, 124, 223, 34, 16, 25, 61, 184, 162, 70, 176, 25, 43, 4, 191, 120, 9, 138, 156, 13, 87, 2, 74, 87, 75, 226, 144, 112, 44, 216, 57, 22, 8, 235, 160, 139, 32, 190, 162, 40, 85, 229, 207, 247, 114, 142, 247, 243, 88, 105, 121, 94, 10, 1, 199, 101, 137, 60, 64, 144, 47, 82, 130, 104, 250, 227, 16, 225, 130, 59, 19, 25, 185, 33, 175, 47, 9, 59, 233, 108, 24, 68, 102, 239, 114, 190, 208, 59, 100, 5, 30, 243, 119, 99, 214, 49, 181, 184, 39, 205, 95, 36, 4, 193, 127, 79, 76, 77, 101, 177, 205, 171, 55, 110, 26, 239, 180, 108, 175, 65, 137, 71, 41, 222, 111, 49, 132, 183, 162, 250, 79, 35, 151, 158, 169, 180, 232, 3, 131, 108, 148, 226, 87, 185, 60, 45, 248, 244, 245, 63, 116, 196, 243, 247, 185, 51, 74, 191, 31, 250, 51, 121, 170, 113, 184, 79, 2, 237, 226, 154, 128, 171, 175, 102, 207, 126, 122, 28, 183, 190, 99, 18, 19, 63, 205, 32, 241, 197, 39, 43, 137, 89, 254, 151, 46, 61, 11, 86, 30, 37, 126, 82, 161, 83, 79, 13, 226, 73, 126, 202, 108, 93, 231, 37, 97, 198, 157, 244, 68, 207, 133, 185, 209, 183, 236, 221, 207, 106, 111, 89, 34, 154, 15, 49, 227, 80, 174, 228, 4, 27, 188, 63, 150, 46, 215, 185, 139, 245, 92, 108, 108, 236, 11, 89, 217, 144, 138, 159, 83, 29, 142, 138, 188, 39, 167, 65, 159, 55, 221, 23, 139, 214, 124, 94, 165, 125, 32, 249, 123, 186, 47, 106, 155, 206, 238, 18, 46, 168, 221, 132, 114, 178, 68, 46, 178, 79, 247, 218, 203, 146, 147, 147, 159, 146, 114, 33, 176, 107, 9, 34, 253, 221, 127, 66, 2, 211, 222, 100, 113, 27, 214, 32, 214, 98, 181, 25, 22, 123, 163, 11, 211, 214, 189, 251, 53, 30, 31, 0, 151, 220, 195, 153, 89, 128, 233, 43, 168, 149, 124, 43, 220, 174, 75, 55, 110, 214, 225, 152, 16, 247, 130, 120, 218, 254, 227, 39, 52, 46, 133, 85, 45, 51, 187, 251, 244, 54, 13, 148, 196, 223, 101, 165, 24, 105, 118, 136, 89, 105, 133, 90, 119, 224, 201, 75, 183, 136, 166, 44, 47, 99, 169, 31, 57, 208, 201, 77, 200, 216, 155, 55, 111, 254, 31, 183, 94, 6, 184, 19, 142, 106, 52, 118, 89, 147, 114, 205, 29, 79, 2, 1, 37, 154, 211, 23, 46, 10, 203, 232, 170, 152, 151, 12, 72, 50, 55, 93, 164, 55, 136, 186, 201, 131, 39, 78, 178, 36, 16, 56, 150, 56, 174, 207, 194, 5, 213, 26, 144, 189, 71, 142, 9, 230, 130, 121, 237, 67, 7, 164, 209, 127, 77, 199, 35, 190, 108, 52, 164, 235, 243, 6, 221, 32, 64, 143, 78, 40, 85, 25, 73, 207, 241, 36, 28, 244, 224, 137, 83, 218, 254, 99, 199, 253, 69, 146, 211, 205, 100, 152, 158, 245, 198, 55, 62, 107, 89, 253, 230, 250, 141, 118, 240, 148, 192, 28, 120, 107, 227, 6, 110, 113, 112, 15, 22, 166, 36, 22, 159, 152, 40, 60, 5, 32, 110, 123, 130, 30, 15, 118, 23, 157, 50, 57, 79, 111, 211, 81, 154, 142, 103, 232, 61, 54, 155, 75, 229, 169, 182, 134, 173, 50, 213, 252, 25, 254, 22, 136, 181, 76, 144, 244, 168, 244, 103, 2, 17, 92, 67, 182, 6, 213, 111, 73, 138, 183, 235, 170, 238, 57, 124, 84, 100, 70, 199, 41, 188, 13, 28, 90, 149, 136, 116, 227, 72, 209, 174, 120, 31, 43, 220, 239, 61, 118, 2, 43, 45, 176, 178, 1, 177, 171, 76, 195, 149, 193, 185, 108, 227, 38, 145, 108, 33, 92, 86, 195, 51, 178, 88, 100, 87, 48, 239, 5, 72, 84, 77, 51, 18, 147, 83, 244, 65, 147, 166, 177, 198, 192, 247, 83, 139, 108, 240, 173, 100, 29, 145, 25, 154, 47, 43, 129, 121, 243, 121, 80, 235, 186, 33, 23, 198, 214, 109, 223, 54, 48, 152, 140, 153, 100, 141, 177, 90, 176, 122, 45, 244, 147, 231, 47, 120, 36, 104, 186, 136, 174, 228, 90, 157, 238, 94, 130, 98, 94, 221, 238, 206, 34, 149, 140, 13, 59, 118, 105, 220, 186, 174, 145, 94, 124, 86, 190, 102, 208, 220, 22, 132, 23, 20, 85, 37, 229, 59, 246, 116, 130, 171, 185, 116, 38, 93, 173, 95, 112, 37, 28, 200, 174, 76, 74, 73, 209, 61, 16, 216, 56, 105, 46, 115, 121, 75, 218, 225, 233, 253, 183, 130, 134, 154, 78, 210, 236, 118, 125, 246, 178, 149, 32, 103, 104, 117, 249, 135, 184, 222, 253, 197, 188, 120, 73, 154, 97, 215, 227, 252, 249, 243, 247, 83, 19, 226, 168, 171, 181, 215, 98, 174, 184, 211, 203, 8, 241, 98, 177, 193, 117, 134, 90, 198, 169, 11, 254, 6, 81, 4, 227, 228, 185, 11, 228, 70, 108, 172, 56, 151, 189, 190, 186, 89, 233, 235, 255, 120, 28, 85, 36, 31, 37, 138, 174, 40, 181, 123, 247, 103, 181, 178, 174, 76, 229, 140, 159, 39, 248, 27, 40, 219, 129, 228, 48, 72, 172, 11, 182, 204, 88, 127, 184, 95, 225, 21, 238, 121, 136, 137, 66, 147, 117, 122, 223, 43, 162, 27, 13, 52, 65, 56, 125, 250, 116, 126, 41, 169, 7, 75, 69, 144, 32, 111, 221, 4, 26, 119, 43, 206, 89, 182, 146, 89, 60, 98, 119, 109, 117, 60, 66, 184, 147, 122, 141, 29, 79, 73, 103, 183, 59, 113, 135, 158, 66, 46, 95, 226, 165, 116, 129, 101, 2, 235, 107, 183, 110, 119, 60, 222, 36, 156, 237, 16, 193, 221, 74, 23, 8, 29, 36, 190, 152, 25, 151, 152, 88, 33, 35, 55, 160, 47, 115, 194, 73, 161, 20, 29, 95, 81, 146, 108, 45, 22, 178, 126, 227, 39, 179, 154, 201, 74, 92, 146, 143, 201, 111, 125, 219, 128, 204, 93, 177, 218, 213, 212, 89, 215, 166, 72, 86, 13, 219, 145, 202, 90, 157, 61, 70, 255, 170, 138, 36, 13, 120, 191, 32, 169, 65, 147, 220, 4, 191, 210, 151, 243, 150, 202, 116, 152, 75, 247, 218, 205, 155, 198, 91, 45, 218, 233, 162, 147, 71, 72, 38, 203, 113, 160, 70, 175, 106, 183, 31, 72, 205, 158, 63, 26, 125, 127, 155, 228, 72, 78, 77, 181, 115, 66, 235, 225, 35, 1, 229, 230, 241, 108, 38, 233, 103, 119, 56, 156, 145, 191, 78, 78, 171, 208, 169, 167, 94, 173, 123, 36, 189, 70, 157, 89, 73, 141, 197, 229, 31, 98, 147, 213, 194, 87, 175, 129, 169, 181, 23, 83, 54, 24, 60, 105, 186, 147, 101, 48, 119, 202, 56, 131, 89, 184, 167, 129, 40, 225, 25, 177, 125, 93, 87, 59, 123, 233, 178, 193, 21, 138, 74, 120, 75, 220, 145, 54, 122, 255, 17, 250, 177, 177, 9, 9, 42, 148, 54, 208, 227, 144, 149, 155, 182, 146, 231, 154, 186, 200, 46, 196, 75, 242, 91, 5, 174, 29, 59, 101, 193, 98, 35, 62, 41, 73, 155, 183, 98, 181, 193, 60, 21, 126, 236, 42, 18, 234, 99, 25, 84, 32, 116, 44, 1, 111, 16, 147, 74, 164, 155, 246, 134, 125, 7, 105, 167, 46, 92, 20, 97, 154, 83, 116, 147, 91, 212, 147, 7, 2, 113, 15, 187, 89, 169, 37, 210, 143, 39, 168, 40, 240, 224, 129, 101, 83, 194, 15, 242, 88, 176, 251, 21, 117, 104, 182, 47, 107, 235, 199, 206, 156, 117, 245, 121, 212, 180, 175, 125, 88, 96, 216, 205, 26, 31, 31, 255, 24, 20, 25, 131, 251, 179, 112, 120, 39, 13, 22, 12, 32, 27, 200, 40, 133, 214, 93, 124, 103, 14, 110, 176, 211, 116, 33, 2, 171, 230, 181, 204, 220, 236, 210, 110, 127, 152, 121, 85, 166, 196, 65, 218, 13, 253, 153, 45, 100, 144, 96, 193, 30, 50, 74, 152, 237, 134, 253, 44, 22, 235, 43, 55, 111, 222, 124, 216, 116, 28, 54, 199, 208, 9, 193, 85, 123, 153, 66, 137, 177, 167, 14, 25, 173, 21, 88, 34, 79, 103, 242, 104, 147, 112, 61, 138, 19, 124, 138, 162, 20, 200, 68, 140, 54, 63, 191, 126, 195, 120, 41, 136, 106, 171, 82, 143, 157, 91, 104, 38, 19, 170, 128, 32, 94, 162, 223, 43, 119, 195, 48, 106, 33, 157, 215, 56, 65, 14, 48, 199, 104, 189, 108, 100, 68, 9, 8, 211, 153, 141, 138, 142, 38, 149, 58, 247, 210, 32, 209, 165, 253, 240, 81, 68, 113, 58, 111, 235, 109, 101, 65, 247, 15, 113, 168, 202, 190, 146, 164, 124, 77, 32, 57, 73, 16, 109, 187, 97, 163, 156, 80, 134, 227, 77, 56, 30, 18, 196, 152, 107, 191, 118, 83, 178, 118, 251, 78, 81, 223, 59, 208, 151, 141, 132, 124, 95, 196, 185, 194, 6, 167, 184, 126, 172, 221, 22, 250, 13, 115, 149, 135, 120, 145, 24, 148, 5, 196, 251, 143, 159, 114, 155, 73, 78, 173, 98, 40, 145, 112, 151, 70, 89, 41, 10, 0, 196, 45, 186, 225, 88, 145, 163, 112, 55, 88, 149, 162, 236, 233, 229, 102, 109, 161, 4, 203, 152, 191, 198, 85, 163, 204, 175, 105, 164, 188, 177, 66, 171, 242, 30, 78, 212, 161, 150, 200, 215, 220, 18, 209, 223, 107, 21, 161, 139, 248, 134, 63, 186, 94, 184, 99, 96, 53, 26, 145, 245, 59, 119, 139, 4, 151, 145, 222, 226, 73, 30, 146, 139, 88, 58, 255, 134, 29, 187, 88, 217, 195, 215, 93, 122, 179, 34, 248, 62, 227, 38, 26, 235, 183, 239, 36, 7, 79, 158, 2, 81, 112, 225, 218, 235, 149, 153, 56, 131, 88, 196, 52, 93, 255, 205, 37, 255, 118, 209, 62, 116, 202, 12, 50, 108, 202, 76, 72, 10, 98, 69, 241, 66, 77, 7, 190, 79, 193, 214, 29, 12, 72, 32, 2, 114, 142, 191, 149, 165, 123, 191, 167, 99, 210, 185, 238, 232, 18, 78, 63, 163, 66, 179, 95, 102, 133, 86, 107, 8, 117, 137, 46, 181, 33, 69, 233, 229, 107, 194, 140, 249, 223, 84, 77, 91, 6, 199, 248, 237, 207, 191, 52, 232, 219, 200, 18, 119, 124, 172, 97, 131, 77, 17, 156, 79, 161, 240, 78, 250, 249, 203, 87, 132, 48, 252, 176, 44, 36, 238, 228, 146, 234, 0, 217, 53, 138, 79, 76, 210, 233, 121, 104, 221, 70, 141, 35, 22, 67, 147, 200, 242, 227, 204, 198, 159, 165, 251, 191, 130, 216, 188, 84, 239, 217, 87, 133, 205, 139, 39, 217, 195, 91, 4, 213, 139, 89, 254, 63, 142, 159, 236, 52, 187, 89, 51, 33, 4, 207, 230, 8, 226, 214, 92, 214, 142, 76, 156, 183, 128, 181, 238, 250, 138, 222, 203, 233, 17, 80, 81, 222, 125, 4, 74, 86, 32, 27, 86, 115, 149, 210, 36, 199, 37, 38, 214, 230, 42, 53, 204, 35, 33, 90, 128, 89, 241, 12, 23, 229, 165, 77, 32, 168, 1, 27, 231, 79, 90, 119, 116, 199, 247, 138, 181, 13, 142, 246, 94, 112, 189, 225, 153, 6, 171, 178, 243, 136, 177, 202, 141, 24, 225, 9, 39, 91, 111, 36, 36, 136, 77, 118, 238, 61, 123, 246, 96, 7, 147, 123, 136, 32, 69, 137, 195, 43, 66, 22, 171, 105, 255, 161, 46, 193, 0, 63, 53, 245, 45, 42, 215, 226, 77, 153, 33, 22, 152, 221, 153, 89, 96, 228, 197, 154, 75, 88, 145, 240, 193, 63, 169, 112, 222, 64, 10, 160, 63, 106, 43, 92, 145, 212, 234, 253, 163, 194, 23, 16, 88, 128, 158, 207, 228, 2, 198, 62, 3, 58, 22, 240, 210, 2, 16, 76, 87, 108, 95, 215, 97, 110, 93, 81, 131, 88, 145, 199, 87, 231, 44, 91, 233, 78, 120, 161, 171, 118, 83, 250, 250, 172, 201, 181, 38, 94, 187, 83, 226, 184, 46, 44, 151, 230, 3, 134, 177, 194, 231, 22, 3, 134, 9, 189, 84, 38, 124, 0, 249, 27, 16, 83, 165, 227, 193, 244, 8, 74, 138, 255, 189, 0, 241, 56, 104, 127, 201, 37, 190, 88, 92, 177, 44, 93, 212, 64, 125, 168, 172, 23, 29, 80, 65, 144, 133, 232, 194, 247, 124, 179, 182, 238, 214, 98, 80, 2, 36, 200, 62, 179, 122, 151, 156, 40, 217, 123, 40, 233, 247, 224, 114, 130, 228, 143, 165, 43, 116, 11, 93, 173, 114, 141, 36, 152, 224, 207, 101, 37, 73, 75, 106, 1, 199, 50, 186, 175, 221, 184, 169, 125, 74, 55, 10, 31, 135, 69, 184, 133, 227, 101, 23, 29, 144, 5, 108, 38, 232, 239, 141, 152, 248, 4, 81, 42, 83, 32, 43, 201, 30, 98, 142, 146, 146, 146, 222, 20, 26, 193, 163, 127, 159, 227, 132, 248, 168, 167, 110, 55, 224, 133, 41, 199, 37, 222, 62, 161, 27, 51, 122, 174, 58, 151, 46, 172, 207, 61, 21, 159, 137, 24, 109, 199, 159, 70, 179, 246, 91, 149, 179, 73, 148, 178, 172, 220, 43, 116, 19, 122, 238, 242, 21, 231, 182, 125, 7, 216, 198, 180, 44, 37, 73, 43, 212, 183, 172, 140, 53, 102, 215, 195, 5, 207, 52, 148, 148, 189, 221, 178, 189, 190, 105, 247, 94, 177, 70, 57, 232, 253, 209, 212, 124, 221, 16, 193, 77, 144, 34, 206, 5, 139, 25, 139, 139, 140, 154, 57, 199, 1, 238, 35, 225, 106, 10, 245, 67, 12, 0, 118, 107, 224, 166, 252, 186, 107, 31, 221, 161, 184, 202, 24, 147, 21, 229, 253, 44, 88, 0, 249, 228, 88, 220, 129, 227, 39, 116, 209, 70, 139, 107, 184, 26, 188, 148, 1, 226, 68, 161, 89, 92, 192, 242, 242, 133, 167, 48, 107, 73, 18, 23, 15, 139, 163, 38, 178, 70, 225, 161, 132, 205, 196, 67, 244, 129, 138, 252, 117, 34, 137, 137, 143, 215, 21, 167, 43, 177, 21, 116, 34, 37, 215, 155, 92, 56, 206, 178, 60, 79, 93, 184, 164, 66, 146, 12, 16, 212, 71, 116, 49, 174, 217, 171, 31, 225, 177, 212, 219, 216, 67, 85, 213, 146, 233, 145, 187, 228, 202, 157, 46, 191, 39, 205, 238, 208, 55, 239, 222, 11, 245, 96, 110, 193, 119, 111, 45, 159, 222, 109, 217, 14, 106, 200, 12, 225, 250, 166, 159, 59, 36, 131, 123, 38, 211, 112, 106, 90, 83, 215, 113, 53, 89, 66, 206, 74, 146, 60, 37, 105, 243, 230, 205, 2, 161, 179, 247, 208, 239, 221, 23, 14, 118, 146, 110, 20, 192, 245, 246, 57, 243, 168, 220, 138, 13, 186, 155, 44, 83, 130, 160, 68, 33, 26, 82, 119, 207, 226, 253, 117, 219, 198, 39, 38, 38, 230, 57, 145, 52, 55, 120, 242, 116, 222, 90, 236, 246, 18, 30, 81, 100, 239, 106, 242, 124, 66, 124, 126, 95, 126, 188, 135, 248, 51, 193, 74, 163, 82, 211, 236, 172, 25, 0, 60, 111, 89, 109, 167, 38, 18, 131, 152, 130, 85, 253, 150, 228, 224, 137, 147, 110, 25, 191, 117, 219, 119, 170, 16, 255, 116, 19, 229, 29, 38, 73, 56, 79, 43, 90, 217, 9, 171, 18, 188, 105, 224, 225, 25, 49, 125, 150, 194, 67, 56, 176, 113, 156, 151, 144, 144, 240, 95, 116, 191, 222, 27, 36, 41, 4, 3, 152, 70, 216, 202, 77, 91, 28, 240, 80, 86, 236, 228, 191, 86, 80, 98, 177, 134, 122, 60, 177, 24, 83, 2, 170, 158, 157, 68, 35, 0, 72, 129, 113, 1, 114, 5, 136, 1, 118, 207, 251, 142, 30, 103, 11, 136, 67, 85, 59, 101, 101, 1, 51, 147, 177, 162, 40, 125, 88, 188, 111, 215, 30, 200, 30, 53, 196, 70, 66, 60, 80, 79, 55, 9, 39, 165, 34, 186, 235, 81, 49, 49, 66, 192, 160, 163, 137, 200, 68, 87, 145, 239, 220, 113, 195, 210, 223, 50, 146, 133, 69, 23, 178, 19, 155, 245, 31, 74, 90, 13, 28, 78, 38, 204, 91, 152, 196, 215, 161, 37, 25, 185, 58, 165, 107, 88, 85, 36, 201, 244, 24, 243, 155, 189, 24, 223, 85, 67, 153, 138, 183, 69, 67, 196, 149, 96, 145, 59, 40, 132, 12, 156, 206, 45, 116, 124, 68, 127, 4, 23, 100, 93, 222, 73, 161, 146, 175, 113, 73, 233, 252, 192, 141, 24, 66, 7, 52, 233, 238, 45, 101, 114, 250, 131, 36, 55, 101, 135, 204, 229, 205, 140, 83, 85, 127, 114, 247, 192, 108, 24, 198, 230, 70, 196, 230, 225, 90, 221, 215, 40, 12, 226, 135, 78, 185, 201, 114, 86, 19, 195, 248, 207, 47, 211, 249, 254, 148, 222, 27, 111, 211, 241, 35, 215, 115, 53, 96, 227, 245, 223, 198, 173, 217, 61, 34, 44, 37, 38, 131, 87, 189, 33, 89, 241, 143, 187, 237, 212, 92, 83, 162, 153, 176, 138, 27, 177, 102, 160, 177, 113, 164, 100, 251, 110, 26, 100, 202, 130, 5, 156, 25, 162, 20, 29, 60, 216, 166, 160, 86, 83, 183, 182, 50, 221, 8, 206, 210, 52, 99, 21, 87, 120, 98, 210, 144, 240, 55, 119, 42, 70, 9, 37, 47, 112, 125, 192, 250, 3, 235, 159, 9, 49, 100, 67, 21, 76, 132, 31, 224, 187, 87, 228, 113, 223, 175, 187, 244, 214, 232, 166, 68, 220, 107, 215, 233, 70, 164, 162, 121, 141, 64, 4, 99, 28, 210, 233, 100, 93, 8, 78, 156, 61, 231, 4, 98, 129, 29, 170, 63, 119, 132, 112, 243, 2, 153, 116, 24, 49, 198, 144, 22, 184, 197, 116, 128, 104, 249, 155, 190, 44, 52, 114, 155, 33, 74, 68, 63, 128, 20, 24, 220, 180, 112, 176, 85, 155, 183, 26, 182, 2, 101, 201, 130, 213, 107, 21, 190, 128, 44, 201, 238, 77, 204, 119, 139, 162, 132, 99, 59, 28, 151, 238, 44, 157, 176, 80, 193, 3, 36, 4, 207, 65, 112, 225, 192, 177, 19, 58, 39, 200, 159, 51, 138, 175, 66, 82, 174, 91, 152, 160, 94, 75, 54, 47, 162, 198, 146, 46, 202, 106, 92, 162, 171, 152, 159, 194, 107, 178, 145, 91, 80, 92, 211, 234, 115, 17, 122, 189, 84, 68, 55, 166, 218, 2, 110, 54, 72, 48, 201, 232, 154, 176, 236, 72, 186, 8, 140, 153, 245, 231, 109, 198, 104, 58, 101, 22, 79, 251, 112, 62, 194, 173, 220, 200, 236, 80, 165, 36, 78, 132, 165, 237, 7, 146, 156, 237, 107, 210, 76, 70, 132, 149, 148, 148, 244, 191, 228, 228, 228, 80, 122, 13, 111, 240, 44, 111, 13, 230, 7, 174, 81, 113, 94, 176, 15, 98, 18, 34, 169, 137, 222, 99, 112, 255, 126, 33, 213, 145, 250, 186, 129, 16, 155, 167, 65, 166, 216, 170, 123, 19, 65, 239, 51, 118, 109, 132, 219, 149, 149, 8, 81, 11, 118, 226, 188, 5, 194, 47, 127, 148, 226, 62, 211, 241, 114, 73, 25, 207, 29, 152, 255, 255, 242, 21, 253, 197, 102, 109, 13, 104, 208, 237, 171, 166, 111, 8, 207, 98, 173, 192, 155, 15, 172, 222, 178, 45, 141, 43, 92, 173, 133, 99, 67, 143, 87, 250, 60, 236, 230, 207, 157, 29, 254, 166, 28, 39, 202, 156, 142, 81, 194, 243, 7, 61, 80, 251, 140, 155, 168, 213, 238, 253, 163, 254, 0, 37, 75, 151, 71, 169, 115, 182, 61, 95, 112, 108, 200, 25, 248, 136, 110, 236, 65, 27, 118, 198, 226, 165, 178, 254, 43, 60, 231, 238, 205, 9, 234, 191, 6, 25, 65, 166, 169, 42, 203, 178, 76, 72, 74, 6, 75, 72, 7, 173, 81, 115, 252, 197, 31, 150, 36, 60, 124, 16, 39, 91, 181, 101, 155, 113, 253, 102, 52, 81, 185, 126, 167, 193, 31, 62, 31, 186, 76, 136, 69, 161, 164, 184, 89, 161, 75, 192, 214, 189, 251, 141, 242, 244, 129, 238, 53, 246, 55, 183, 76, 152, 175, 201, 47, 62, 184, 164, 25, 160, 235, 60, 228, 160, 64, 143, 199, 134, 125, 7, 233, 144, 133, 200, 118, 154, 53, 155, 64, 237, 164, 200, 4, 157, 144, 158, 197, 37, 200, 246, 208, 197, 139, 255, 133, 227, 68, 199, 199, 67, 2, 144, 6, 110, 29, 150, 200, 244, 109, 3, 131, 126, 15, 118, 254, 170, 174, 251, 100, 1, 243, 207, 97, 199, 165, 239, 233, 32, 172, 7, 186, 192, 233, 208, 113, 193, 181, 171, 78, 255, 154, 194, 162, 9, 201, 24, 95, 118, 238, 205, 250, 61, 66, 161, 255, 22, 250, 74, 23, 69, 50, 243, 239, 101, 250, 205, 216, 216, 52, 254, 189, 230, 200, 2, 6, 222, 72, 146, 254, 61, 147, 126, 75, 165, 38, 205, 212, 5, 139, 181, 222, 191, 76, 208, 106, 244, 236, 71, 46, 115, 133, 37, 63, 196, 36, 135, 102, 49, 30, 41, 72, 189, 40, 61, 167, 3, 162, 196, 135, 215, 43, 26, 99, 255, 248, 147, 121, 38, 68, 92, 23, 92, 122, 160, 182, 3, 4, 70, 239, 95, 93, 170, 67, 129, 76, 234, 122, 190, 196, 189, 77, 245, 164, 139, 89, 58, 244, 141, 27, 206, 133, 107, 214, 145, 69, 107, 55, 192, 188, 147, 161, 83, 102, 178, 24, 177, 88, 168, 203, 113, 111, 3, 204, 35, 255, 200, 147, 123, 246, 92, 123, 208, 83, 124, 76, 190, 239, 168, 133, 58, 141, 137, 148, 30, 59, 174, 65, 28, 53, 84, 242, 232, 120, 27, 172, 44, 169, 106, 125, 232, 72, 227, 78, 78, 154, 59, 119, 174, 44, 22, 159, 159, 78, 209, 30, 248, 135, 21, 155, 183, 178, 58, 83, 23, 81, 250, 63, 70, 41, 172, 61, 81, 2, 51, 127, 245, 90, 118, 45, 96, 131, 25, 62, 100, 4, 219, 216, 88, 149, 180, 228, 114, 57, 187, 180, 96, 97, 115, 220, 114, 224, 48, 245, 194, 149, 171, 226, 218, 31, 142, 79, 77, 253, 24, 173, 202, 224, 33, 72, 182, 219, 4, 159, 58, 228, 39, 192, 21, 238, 58, 106, 156, 19, 172, 153, 138, 30, 100, 214, 252, 117, 115, 23, 119, 89, 94, 196, 86, 169, 22, 104, 149, 166, 113, 82, 248, 193, 23, 75, 64, 90, 212, 30, 134, 135, 22, 222, 219, 11, 68, 15, 62, 41, 207, 122, 213, 209, 69, 93, 36, 50, 204, 164, 59, 189, 18, 188, 1, 112, 158, 204, 18, 165, 41, 142, 248, 26, 61, 94, 3, 200, 169, 16, 53, 117, 147, 254, 90, 4, 29, 7, 200, 219, 212, 250, 155, 191, 106, 173, 32, 72, 72, 16, 250, 208, 211, 231, 73, 139, 34, 8, 166, 87, 163, 22, 8, 179, 74, 233, 162, 168, 230, 110, 24, 198, 44, 236, 254, 19, 166, 136, 5, 112, 153, 47, 27, 6, 79, 231, 234, 224, 25, 191, 80, 183, 7, 137, 37, 69, 92, 181, 163, 94, 235, 35, 33, 246, 6, 223, 7, 92, 103, 160, 79, 107, 123, 61, 212, 109, 145, 131, 8, 130, 175, 137, 85, 242, 185, 64, 92, 150, 187, 45, 21, 91, 233, 170, 44, 161, 42, 33, 41, 201, 234, 26, 73, 49, 103, 109, 178, 146, 80, 33, 145, 250, 56, 87, 118, 119, 180, 182, 100, 253, 63, 212, 90, 91, 200, 90, 122, 153, 187, 114, 132, 240, 141, 5, 104, 128, 2, 233, 180, 26, 52, 92, 59, 116, 226, 84, 178, 60, 79, 62, 102, 104, 179, 207, 77, 32, 4, 158, 197, 43, 240, 69, 64, 199, 216, 86, 164, 18, 179, 84, 97, 145, 15, 189, 173, 39, 105, 87, 214, 33, 230, 42, 79, 212, 161, 159, 5, 201, 93, 224, 18, 255, 143, 201, 221, 42, 238, 189, 250, 60, 153, 233, 180, 152, 44, 102, 153, 250, 216, 201, 166, 2, 23, 111, 159, 182, 240, 111, 49, 191, 59, 233, 38, 241, 33, 177, 142, 8, 50, 184, 124, 249, 242, 3, 192, 193, 140, 40, 55, 109, 81, 225, 61, 37, 188, 196, 193, 45, 107, 212, 78, 55, 128, 207, 209, 13, 75, 235, 193, 35, 196, 205, 20, 13, 143, 190, 193, 132, 80, 198, 171, 96, 221, 202, 130, 31, 214, 8, 161, 244, 34, 255, 71, 159, 213, 167, 233, 231, 46, 255, 103, 179, 34, 89, 149, 157, 204, 27, 121, 68, 224, 17, 164, 220, 106, 106, 13, 92, 88, 112, 29, 192, 162, 40, 58, 104, 132, 230, 80, 170, 53, 88, 45, 144, 32, 36, 10, 239, 65, 147, 59, 51, 113, 29, 241, 128, 38, 39, 39, 131, 84, 28, 235, 154, 81, 255, 135, 129, 208, 205, 129, 89, 67, 212, 2, 208, 77, 110, 66, 232, 178, 240, 168, 47, 139, 188, 105, 161, 121, 142, 191, 215, 93, 55, 21, 79, 45, 239, 205, 123, 246, 233, 144, 162, 207, 200, 158, 46, 104, 107, 182, 110, 23, 15, 169, 221, 131, 134, 104, 110, 147, 59, 108, 166, 36, 201, 102, 64, 51, 98, 200, 110, 45, 16, 22, 65, 174, 68, 69, 137, 164, 153, 206, 89, 184, 190, 144, 129, 250, 38, 125, 111, 25, 167, 83, 99, 101, 0, 219, 246, 29, 96, 59, 106, 161, 75, 234, 45, 174, 3, 11, 227, 183, 221, 126, 96, 9, 26, 208, 186, 137, 127, 151, 237, 244, 240, 185, 51, 147, 16, 35, 207, 49, 37, 31, 230, 199, 221, 119, 228, 152, 82, 183, 207, 64, 3, 92, 174, 22, 147, 164, 56, 208, 55, 217, 33, 73, 136, 7, 130, 33, 18, 79, 73, 220, 214, 168, 181, 19, 234, 76, 193, 18, 247, 92, 35, 233, 170, 199, 189, 159, 146, 86, 245, 30, 125, 213, 52, 7, 187, 141, 129, 253, 63, 200, 228, 60, 229, 227, 137, 97, 69, 153, 87, 39, 57, 153, 84, 233, 22, 169, 193, 245, 130, 227, 203, 27, 75, 32, 4, 184, 46, 171, 168, 133, 239, 80, 20, 67, 234, 160, 50, 207, 19, 73, 210, 121, 31, 203, 124, 246, 138, 66, 142, 159, 57, 7, 181, 207, 172, 172, 4, 188, 56, 165, 189, 132, 84, 32, 6, 10, 155, 216, 81, 191, 207, 17, 31, 162, 211, 77, 98, 35, 243, 6, 64, 156, 63, 168, 211, 112, 43, 28, 132, 16, 84, 16, 164, 40, 229, 103, 29, 217, 18, 34, 129, 169, 86, 83, 227, 212, 133, 139, 46, 33, 7, 85, 45, 109, 183, 219, 75, 137, 137, 25, 57, 115, 182, 10, 235, 91, 102, 235, 133, 189, 101, 130, 131, 245, 10, 159, 15, 73, 75, 125, 198, 77, 80, 68, 130, 32, 132, 104, 33, 249, 74, 218, 236, 163, 254, 107, 128, 145, 164, 203, 37, 167, 170, 131, 217, 2, 186, 255, 160, 3, 130, 241, 224, 82, 9, 205, 65, 133, 11, 216, 197, 2, 41, 244, 253, 117, 146, 112, 147, 157, 187, 118, 205, 237, 54, 202, 155, 137, 239, 35, 226, 46, 97, 112, 144, 35, 167, 206, 0, 73, 26, 176, 243, 111, 55, 236, 103, 112, 75, 145, 45, 123, 246, 41, 210, 130, 250, 158, 175, 238, 16, 177, 208, 210, 215, 234, 60, 91, 148, 252, 190, 100, 185, 222, 110, 232, 207, 10, 93, 32, 13, 200, 44, 4, 57, 43, 88, 8, 96, 209, 249, 174, 103, 63, 104, 45, 229, 206, 252, 163, 11, 198, 77, 105, 135, 127, 91, 226, 142, 170, 186, 250, 7, 94, 188, 122, 205, 209, 124, 192, 48, 166, 3, 42, 22, 165, 157, 7, 15, 185, 179, 91, 233, 49, 64, 172, 188, 81, 70, 196, 46, 145, 121, 7, 158, 20, 227, 144, 9, 228, 175, 85, 107, 217, 92, 123, 43, 1, 17, 187, 100, 86, 175, 73, 119, 223, 244, 187, 138, 222, 136, 199, 36, 235, 33, 179, 110, 76, 89, 35, 149, 181, 241, 186, 120, 237, 186, 211, 45, 36, 96, 29, 73, 10, 20, 202, 234, 46, 94, 124, 55, 74, 4, 44, 3, 247, 232, 233, 51, 106, 174, 134, 97, 6, 136, 5, 132, 154, 18, 159, 88, 162, 22, 189, 94, 144, 145, 92, 190, 99, 15, 61, 54, 193, 213, 10, 205, 161, 105, 95, 101, 113, 158, 92, 34, 19, 14, 71, 123, 56, 206, 161, 147, 167, 160, 111, 169, 33, 119, 112, 9, 145, 244, 125, 109, 95, 214, 102, 130, 12, 241, 137, 73, 34, 113, 104, 149, 39, 75, 158, 91, 120, 172, 205, 221, 232, 89, 127, 42, 208, 171, 82, 180, 144, 243, 102, 89, 177, 16, 2, 221, 196, 78, 152, 59, 223, 172, 141, 59, 75, 38, 74, 233, 254, 171, 168, 106, 90, 2, 119, 119, 26, 96, 97, 23, 205, 164, 64, 123, 102, 75, 61, 68, 35, 129, 153, 139, 151, 170, 220, 139, 51, 67, 204, 65, 178, 221, 30, 42, 74, 218, 38, 207, 95, 164, 61, 73, 45, 63, 95, 158, 129, 204, 138, 42, 176, 36, 42, 250, 220, 22, 110, 211, 73, 219, 113, 224, 160, 112, 73, 39, 209, 77, 79, 109, 180, 42, 3, 52, 14, 73, 119, 203, 213, 121, 189, 154, 254, 70, 139, 118, 6, 168, 226, 103, 70, 68, 57, 187, 55, 54, 236, 232, 160, 67, 7, 236, 150, 83, 237, 174, 231, 46, 49, 45, 237, 243, 44, 46, 46, 185, 37, 101, 23, 86, 240, 63, 119, 229, 26, 39, 107, 182, 74, 199, 151, 93, 251, 168, 66, 158, 78, 211, 180, 122, 153, 220, 225, 203, 110, 210, 133, 112, 12, 32, 14, 91, 185, 234, 236, 193, 128, 57, 3, 119, 18, 236, 42, 97, 119, 14, 214, 90, 157, 62, 253, 85, 80, 255, 129, 5, 133, 46, 182, 133, 204, 159, 103, 58, 230, 18, 183, 134, 43, 175, 135, 131, 133, 165, 116, 68, 55, 210, 229, 231, 95, 200, 133, 43, 87, 83, 249, 2, 184, 216, 75, 2, 80, 110, 57, 161, 40, 42, 58, 198, 254, 199, 210, 21, 4, 226, 104, 173, 6, 13, 103, 174, 194, 226, 62, 180, 32, 18, 74, 59, 112, 46, 208, 211, 144, 63, 236, 151, 165, 174, 8, 89, 205, 12, 150, 137, 114, 190, 20, 67, 180, 42, 32, 41, 142, 147, 36, 213, 72, 230, 205, 194, 121, 186, 23, 124, 65, 232, 51, 255, 94, 198, 244, 117, 205, 113, 45, 216, 24, 177, 130, 115, 106, 69, 66, 171, 45, 158, 97, 213, 57, 27, 4, 157, 75, 146, 242, 155, 227, 114, 193, 175, 119, 8, 193, 117, 89, 221, 6, 50, 55, 251, 79, 152, 2, 33, 5, 141, 127, 249, 69, 158, 226, 196, 226, 60, 152, 54, 173, 91, 92, 96, 154, 6, 207, 158, 120, 222, 67, 188, 228, 14, 128, 251, 29, 114, 20, 122, 140, 249, 13, 18, 251, 120, 38, 173, 177, 80, 142, 183, 139, 207, 161, 207, 223, 80, 151, 213, 234, 76, 29, 70, 55, 139, 207, 115, 37, 42, 127, 173, 35, 162, 102, 179, 72, 219, 206, 58, 136, 63, 64, 8, 4, 250, 190, 242, 115, 123, 0, 94, 175, 220, 188, 9, 174, 232, 196, 184, 196, 36, 242, 122, 243, 239, 153, 34, 151, 149, 46, 96, 89, 255, 149, 133, 42, 170, 55, 52, 32, 227, 25, 58, 221, 240, 53, 103, 154, 180, 249, 199, 164, 158, 187, 156, 32, 133, 197, 245, 38, 171, 136, 208, 116, 210, 160, 239, 32, 13, 252, 234, 21, 44, 20, 46, 247, 69, 239, 177, 152, 75, 95, 21, 4, 161, 121, 249, 135, 82, 45, 43, 137, 53, 38, 194, 185, 47, 33, 33, 225, 19, 186, 184, 49, 70, 236, 56, 98, 172, 86, 163, 71, 63, 45, 141, 187, 245, 64, 148, 220, 87, 55, 174, 39, 43, 13, 212, 53, 192, 80, 229, 42, 54, 76, 174, 79, 44, 94, 229, 185, 5, 8, 243, 169, 114, 177, 110, 58, 207, 95, 166, 183, 88, 139, 99, 46, 95, 190, 60, 191, 136, 167, 14, 158, 52, 93, 5, 151, 45, 115, 115, 86, 169, 71, 134, 79, 251, 221, 221, 236, 24, 74, 3, 188, 88, 146, 185, 249, 181, 125, 75, 196, 152, 135, 76, 158, 225, 176, 125, 88, 150, 89, 184, 33, 62, 62, 236, 204, 186, 255, 174, 9, 188, 87, 236, 134, 227, 233, 49, 95, 181, 98, 39, 44, 207, 131, 102, 24, 43, 76, 201, 54, 86, 72, 210, 137, 142, 37, 249, 179, 114, 157, 205, 231, 9, 13, 166, 33, 73, 152, 9, 193, 14, 28, 166, 185, 4, 42, 122, 220, 182, 40, 194, 102, 98, 3, 87, 138, 162, 139, 225, 148, 236, 124, 174, 201, 219, 112, 159, 168, 163, 29, 48, 97, 42, 211, 145, 133, 24, 24, 88, 45, 194, 115, 145, 102, 119, 8, 79, 131, 147, 14, 104, 145, 22, 97, 114, 235, 11, 210, 132, 88, 231, 247, 66, 8, 99, 207, 225, 163, 186, 237, 171, 58, 140, 244, 93, 9, 72, 221, 211, 45, 15, 114, 43, 10, 209, 207, 111, 49, 96, 168, 184, 86, 215, 64, 123, 216, 116, 190, 185, 36, 215, 34, 203, 216, 94, 182, 113, 147, 19, 44, 60, 95, 218, 118, 133, 102, 145, 156, 224, 185, 3, 197, 171, 239, 122, 245, 83, 76, 46, 231, 124, 166, 215, 191, 224, 31, 191, 238, 210, 219, 1, 150, 127, 73, 191, 72, 108, 118, 134, 70, 233, 46, 171, 242, 187, 198, 172, 183, 237, 177, 51, 103, 197, 156, 157, 183, 219, 237, 37, 61, 61, 11, 136, 187, 44, 81, 71, 94, 232, 135, 77, 155, 169, 136, 135, 175, 104, 155, 156, 75, 213, 134, 27, 20, 50, 104, 27, 246, 29, 100, 72, 41, 239, 160, 40, 83, 143, 142, 39, 179, 176, 160, 64, 66, 206, 118, 78, 14, 9, 66, 101, 100, 206, 242, 85, 78, 40, 250, 231, 34, 2, 194, 93, 153, 165, 162, 95, 145, 94, 31, 31, 31, 255, 18, 255, 12, 210, 121, 228, 88, 69, 168, 152, 124, 212, 42, 130, 212, 234, 245, 163, 16, 84, 215, 83, 83, 83, 43, 250, 250, 48, 216, 121, 191, 206, 148, 180, 52, 3, 50, 101, 97, 1, 27, 51, 235, 79, 241, 208, 199, 36, 36, 56, 124, 210, 154, 149, 164, 238, 94, 231, 137, 11, 100, 234, 194, 191, 153, 43, 189, 50, 95, 16, 67, 50, 120, 192, 153, 107, 173, 110, 115, 210, 115, 236, 111, 34, 65, 195, 41, 178, 245, 172, 80, 21, 225, 86, 176, 32, 176, 206, 22, 91, 147, 226, 156, 119, 200, 22, 78, 118, 67, 18, 244, 58, 86, 230, 189, 29, 181, 199, 26, 183, 54, 68, 153, 15, 219, 76, 84, 111, 72, 166, 243, 50, 0, 74, 82, 91, 125, 77, 104, 242, 117, 51, 75, 63, 251, 99, 238, 142, 128, 120, 167, 254, 66, 211, 54, 238, 24, 24, 104, 139, 174, 219, 182, 131, 156, 58, 127, 129, 216, 29, 74, 42, 119, 51, 254, 153, 78, 236, 187, 141, 136, 73, 30, 62, 121, 90, 135, 70, 2, 112, 44, 87, 99, 242, 78, 36, 31, 181, 132, 33, 171, 217, 85, 219, 248, 111, 75, 13, 72, 229, 155, 174, 125, 12, 222, 111, 49, 57, 49, 49, 241, 117, 79, 247, 132, 252, 189, 133, 135, 4, 146, 209, 96, 141, 129, 108, 208, 16, 15, 61, 87, 67, 121, 60, 81, 244, 192, 204, 44, 73, 130, 187, 251, 69, 58, 23, 205, 251, 15, 21, 207, 203, 100, 211, 119, 23, 115, 193, 44, 220, 174, 63, 143, 83, 158, 162, 70, 129, 191, 186, 163, 136, 190, 176, 176, 1, 129, 210, 43, 136, 29, 255, 185, 98, 181, 172, 255, 58, 80, 190, 199, 80, 128, 224, 46, 74, 212, 145, 138, 205, 103, 185, 250, 230, 253, 99, 23, 170, 52, 119, 66, 111, 17, 22, 27, 200, 112, 156, 181, 100, 185, 113, 37, 42, 74, 94, 236, 192, 130, 105, 43, 237, 74, 115, 121, 91, 76, 196, 130, 75, 73, 134, 28, 56, 113, 146, 172, 220, 188, 149, 204, 93, 181, 198, 153, 192, 59, 76, 80, 130, 108, 34, 237, 206, 179, 179, 112, 186, 164, 213, 236, 246, 18, 92, 238, 13, 212, 130, 180, 162, 60, 27, 20, 146, 99, 36, 203, 15, 122, 47, 86, 146, 148, 95, 114, 121, 32, 247, 112, 110, 1, 192, 119, 214, 33, 101, 29, 92, 119, 3, 39, 78, 19, 15, 124, 74, 108, 114, 242, 123, 153, 33, 41, 241, 121, 137, 18, 81, 142, 255, 115, 190, 104, 253, 228, 49, 14, 37, 228, 213, 128, 240, 219, 12, 29, 169, 169, 46, 55, 145, 145, 226, 112, 148, 181, 42, 150, 98, 46, 152, 135, 46, 99, 22, 91, 146, 226, 56, 127, 89, 181, 83, 119, 107, 246, 106, 26, 235, 128, 189, 120, 221, 6, 7, 204, 227, 119, 61, 251, 178, 235, 221, 111, 252, 100, 119, 175, 79, 168, 169, 244, 71, 220, 41, 41, 53, 149, 233, 40, 159, 60, 119, 222, 120, 165, 89, 91, 35, 132, 199, 192, 88, 198, 105, 137, 111, 200, 108, 186, 17, 228, 231, 176, 197, 3, 49, 228, 113, 197, 87, 73, 97, 81, 239, 218, 29, 58, 206, 84, 172, 201, 54, 198, 224, 166, 132, 141, 209, 143, 227, 39, 147, 6, 145, 3, 25, 25, 2, 81, 202, 30, 31, 230, 33, 169, 217, 132, 137, 41, 240, 69, 30, 146, 114, 106, 64, 207, 75, 79, 86, 51, 95, 248, 219, 208, 251, 122, 129, 184, 48, 19, 255, 90, 200, 178, 191, 205, 66, 241, 130, 24, 159, 165, 132, 77, 135, 1, 164, 194, 92, 192, 109, 125, 39, 36, 152, 135, 135, 27, 181, 38, 93, 232, 134, 213, 84, 254, 147, 215, 116, 13, 155, 176, 103, 97, 222, 2, 32, 109, 131, 149, 67, 229, 128, 254, 43, 196, 147, 97, 254, 218, 13, 251, 89, 185, 122, 227, 166, 152, 146, 93, 244, 126, 121, 75, 218, 56, 98, 169, 200, 93, 227, 102, 117, 58, 35, 88, 49, 207, 201, 83, 44, 94, 87, 134, 199, 84, 238, 148, 116, 20, 75, 62, 160, 86, 14, 100, 192, 213, 164, 86, 216, 190, 163, 199, 83, 184, 219, 106, 173, 47, 214, 128, 88, 4, 18, 9, 121, 28, 220, 25, 208, 67, 209, 214, 176, 181, 250, 104, 227, 112, 45, 58, 46, 206, 69, 144, 78, 103, 83, 43, 119, 109, 146, 160, 122, 51, 158, 116, 163, 125, 20, 214, 129, 105, 174, 142, 253, 99, 46, 212, 154, 234, 66, 72, 157, 163, 135, 153, 228, 164, 152, 215, 78, 248, 131, 51, 23, 47, 57, 127, 253, 243, 47, 2, 250, 170, 221, 70, 255, 42, 222, 236, 76, 76, 77, 253, 52, 43, 11, 175, 248, 123, 174, 1, 26, 227, 114, 15, 207, 119, 192, 166, 72, 88, 148, 230, 50, 6, 40, 46, 111, 214, 127, 168, 30, 159, 148, 100, 152, 213, 143, 178, 27, 67, 145, 22, 44, 136, 131, 31, 144, 44, 71, 43, 213, 118, 196, 188, 141, 176, 144, 216, 101, 55, 251, 49, 119, 95, 85, 74, 50, 205, 6, 12, 213, 184, 148, 162, 65, 45, 190, 79, 172, 180, 182, 249, 43, 180, 237, 170, 3, 9, 91, 212, 66, 188, 192, 154, 137, 111, 248, 199, 93, 243, 103, 251, 166, 46, 104, 223, 138, 141, 193, 129, 40, 46, 67, 103, 222, 28, 72, 18, 123, 197, 68, 221, 103, 223, 95, 39, 49, 171, 20, 238, 217, 185, 43, 86, 179, 71, 142, 90, 152, 70, 94, 74, 54, 165, 76, 37, 27, 98, 243, 52, 99, 241, 82, 146, 148, 156, 98, 104, 188, 241, 39, 125, 153, 104, 186, 182, 34, 113, 231, 163, 91, 146, 136, 118, 246, 44, 12, 153, 50, 131, 89, 84, 95, 72, 114, 120, 33, 60, 233, 9, 8, 100, 209, 218, 245, 144, 244, 164, 142, 153, 245, 39, 75, 132, 51, 203, 239, 121, 45, 79, 161, 199, 30, 54, 101, 134, 72, 40, 234, 98, 58, 47, 145, 53, 92, 140, 181, 211, 163, 214, 183, 173, 90, 67, 237, 139, 142, 61, 252, 110, 28, 136, 22, 117, 176, 57, 0, 181, 36, 208, 66, 94, 191, 99, 151, 32, 115, 13, 18, 13, 205, 235, 10, 226, 14, 18, 164, 176, 126, 98, 227, 19, 72, 233, 136, 238, 58, 184, 7, 253, 189, 155, 242, 154, 66, 221, 166, 51, 139, 191, 61, 78, 111, 160, 198, 125, 7, 171, 138, 147, 61, 243, 137, 138, 162, 188, 235, 171, 53, 32, 110, 46, 74, 172, 223, 242, 154, 192, 52, 145, 164, 67, 191, 115, 115, 127, 248, 255, 165, 133, 103, 56, 143, 241, 40, 240, 112, 195, 67, 7, 68, 68, 23, 20, 197, 184, 69, 4, 245, 61, 36, 238, 176, 133, 48, 213, 233, 44, 200, 78, 83, 81, 64, 198, 78, 109, 210, 111, 136, 219, 170, 146, 122, 17, 222, 151, 157, 235, 158, 156, 156, 252, 62, 184, 200, 24, 81, 206, 249, 139, 53, 97, 150, 19, 180, 92, 53, 102, 174, 120, 42, 36, 130, 72, 132, 179, 133, 39, 65, 61, 103, 97, 156, 109, 11, 243, 215, 165, 164, 58, 232, 2, 106, 88, 44, 36, 32, 72, 178, 157, 149, 22, 157, 59, 227, 212, 233, 44, 204, 85, 140, 96, 190, 180, 171, 81, 55, 132, 148, 98, 45, 11, 73, 89, 78, 184, 89, 123, 91, 86, 18, 197, 212, 5, 139, 201, 147, 141, 195, 89, 12, 110, 226, 188, 5, 98, 131, 113, 67, 88, 37, 222, 190, 3, 221, 216, 53, 225, 106, 71, 70, 135, 159, 198, 24, 182, 106, 13, 32, 113, 207, 125, 1, 134, 78, 153, 161, 219, 234, 183, 98, 214, 163, 220, 43, 179, 68, 187, 46, 196, 86, 174, 26, 153, 189, 108, 165, 172, 4, 212, 200, 68, 142, 110, 181, 25, 122, 170, 11, 121, 150, 185, 90, 169, 115, 111, 22, 90, 97, 174, 92, 115, 114, 216, 237, 181, 151, 172, 109, 90, 235, 33, 35, 140, 255, 80, 178, 246, 69, 54, 47, 148, 199, 36, 109, 223, 53, 54, 86, 109, 217, 198, 230, 35, 197, 110, 47, 99, 58, 47, 70, 146, 55, 111, 38, 190, 1, 151, 235, 192, 241, 147, 196, 246, 109, 253, 28, 33, 73, 217, 170, 132, 243, 4, 210, 132, 239, 60, 100, 242, 116, 39, 136, 144, 8, 149, 166, 235, 201, 201, 79, 138, 231, 4, 147, 122, 238, 16, 65, 70, 37, 39, 63, 37, 10, 223, 59, 141, 24, 195, 186, 1, 84, 178, 184, 191, 92, 86, 110, 28, 216, 49, 190, 201, 36, 211, 122, 235, 194, 53, 234, 80, 213, 242, 242, 205, 157, 73, 183, 152, 91, 79, 141, 238, 96, 91, 250, 203, 239, 111, 170, 51, 253, 155, 239, 242, 29, 182, 146, 85, 200, 228, 249, 139, 197, 142, 214, 208, 50, 232, 137, 41, 126, 231, 208, 180, 138, 46, 181, 163, 36, 35, 201, 21, 243, 129, 132, 159, 74, 86, 236, 46, 69, 71, 245, 232, 232, 104, 176, 74, 46, 112, 215, 171, 246, 52, 79, 131, 15, 49, 45, 56, 144, 85, 75, 23, 45, 99, 255, 177, 19, 110, 245, 35, 201, 50, 203, 159, 221, 197, 31, 106, 7, 69, 60, 92, 88, 36, 126, 144, 164, 171, 146, 217, 251, 199, 215, 231, 136, 190, 246, 225, 61, 68, 69, 140, 169, 175, 149, 159, 37, 123, 78, 232, 244, 252, 14, 31, 112, 252, 204, 217, 100, 40, 99, 234, 240, 211, 104, 150, 161, 204, 220, 119, 212, 154, 60, 126, 246, 156, 184, 64, 224, 174, 63, 193, 59, 224, 188, 107, 38, 46, 185, 52, 136, 222, 171, 201, 172, 192, 158, 110, 76, 154, 247, 31, 202, 186, 206, 112, 171, 16, 222, 27, 115, 37, 234, 6, 108, 150, 52, 17, 175, 19, 66, 0, 111, 80, 82, 94, 178, 126, 147, 184, 94, 87, 232, 230, 48, 52, 29, 87, 171, 188, 17, 156, 203, 138, 158, 215, 109, 84, 133, 74, 17, 184, 81, 221, 154, 179, 223, 53, 38, 3, 38, 76, 19, 215, 236, 100, 92, 98, 98, 107, 22, 128, 167, 155, 248, 207, 194, 59, 106, 114, 119, 157, 140, 66, 54, 92, 6, 210, 121, 35, 150, 121, 142, 174, 47, 223, 177, 195, 44, 168, 112, 91, 253, 105, 78, 90, 146, 230, 166, 216, 144, 108, 37, 218, 170, 209, 207, 215, 246, 29, 61, 38, 54, 118, 55, 169, 97, 240, 141, 57, 30, 142, 240, 63, 65, 230, 145, 22, 114, 22, 255, 153, 188, 96, 49, 115, 185, 129, 187, 166, 232, 29, 36, 200, 16, 46, 233, 5, 63, 191, 208, 172, 173, 65, 173, 63, 149, 147, 67, 184, 188, 184, 103, 97, 17, 126, 130, 62, 240, 147, 41, 57, 213, 151, 98, 154, 185, 253, 52, 191, 108, 65, 88, 78, 207, 85, 44, 252, 123, 142, 28, 19, 149, 196, 209, 116, 215, 254, 137, 183, 36, 14, 201, 117, 219, 220, 157, 125, 162, 105, 213, 172, 116, 191, 128, 8, 17, 104, 69, 136, 115, 116, 170, 170, 254, 109, 247, 72, 82, 160, 85, 251, 127, 137, 63, 51, 241, 234, 154, 77, 96, 209, 209, 175, 223, 140, 22, 162, 240, 101, 173, 176, 198, 165, 107, 116, 191, 200, 52, 228, 201, 54, 86, 151, 128, 20, 178, 218, 123, 96, 218, 20, 173, 55, 117, 118, 201, 101, 229, 61, 102, 74, 126, 97, 122, 168, 63, 77, 159, 165, 216, 42, 124, 199, 122, 164, 194, 115, 3, 202, 50, 189, 127, 25, 79, 118, 29, 60, 108, 28, 62, 117, 90, 158, 131, 112, 147, 229, 238, 38, 93, 131, 103, 19, 111, 217, 187, 223, 209, 245, 231, 95, 8, 148, 48, 45, 223, 184, 89, 229, 113, 198, 114, 244, 251, 12, 118, 41, 241, 252, 193, 52, 132, 203, 115, 177, 125, 91, 157, 102, 100, 225, 154, 245, 134, 180, 241, 107, 148, 78, 156, 89, 144, 210, 99, 60, 22, 223, 71, 36, 83, 129, 213, 11, 97, 21, 112, 59, 66, 38, 45, 132, 87, 34, 134, 143, 210, 185, 136, 134, 6, 45, 189, 224, 189, 138, 162, 66, 139, 55, 38, 235, 8, 177, 223, 138, 94, 52, 87, 129, 204, 223, 160, 199, 106, 57, 112, 152, 216, 152, 254, 110, 254, 222, 238, 166, 4, 92, 248, 127, 230, 226, 165, 58, 88, 158, 194, 178, 203, 209, 117, 143, 127, 30, 228, 129, 64, 162, 20, 156, 199, 228, 249, 139, 220, 245, 204, 160, 244, 180, 97, 195, 6, 57, 187, 25, 173, 74, 63, 147, 164, 75, 236, 90, 85, 71, 242, 78, 19, 44, 233, 128, 165, 176, 223, 5, 253, 222, 88, 172, 131, 46, 200, 59, 15, 28, 18, 233, 243, 163, 189, 145, 138, 175, 174, 42, 95, 146, 126, 44, 118, 101, 191, 204, 101, 191, 88, 124, 40, 58, 53, 85, 244, 143, 204, 239, 173, 73, 178, 219, 117, 171, 235, 195, 232, 67, 210, 214, 138, 157, 164, 100, 61, 188, 35, 30, 64, 168, 219, 140, 141, 79, 48, 182, 237, 59, 64, 94, 109, 246, 189, 107, 23, 206, 99, 79, 161, 166, 248, 211, 129, 99, 255, 234, 154, 146, 215, 162, 249, 18, 73, 76, 159, 75, 196, 166, 91, 72, 144, 105, 82, 175, 208, 220, 22, 95, 107, 49, 167, 255, 3, 15, 129, 148, 165, 155, 199, 15, 247, 149, 176, 126, 64, 229, 41, 206, 149, 149, 249, 11, 147, 44, 20, 217, 173, 5, 97, 145, 125, 173, 184, 156, 57, 185, 84, 58, 199, 220, 230, 99, 209, 123, 52, 132, 53, 247, 62, 115, 150, 216, 158, 47, 98, 116, 31, 53, 206, 221, 123, 83, 186, 135, 149, 168, 152, 24, 136, 241, 105, 238, 54, 96, 244, 126, 248, 237, 207, 191, 132, 42, 148, 198, 93, 191, 16, 231, 46, 42, 31, 95, 170, 147, 140, 116, 251, 191, 85, 21, 50, 111, 141, 190, 191, 78, 34, 247, 209, 115, 175, 200, 155, 126, 63, 221, 36, 220, 56, 127, 153, 169, 239, 145, 164, 164, 164, 42, 226, 92, 185, 232, 193, 205, 203, 215, 163, 32, 49, 74, 47, 231, 69, 29, 74, 156, 223, 144, 201, 211, 5, 209, 252, 156, 158, 37, 45, 54, 1, 67, 167, 204, 80, 32, 134, 153, 83, 53, 225, 233, 234, 191, 82, 130, 47, 15, 207, 27, 181, 168, 155, 244, 27, 172, 82, 67, 65, 60, 7, 199, 19, 249, 166, 1, 173, 202, 156, 88, 188, 21, 5, 2, 255, 80, 144, 14, 53, 94, 70, 8, 47, 68, 190, 211, 93, 191, 185, 128, 55, 89, 176, 102, 157, 195, 131, 30, 104, 118, 98, 95, 185, 248, 14, 44, 111, 14, 206, 181, 88, 44, 43, 209, 197, 115, 153, 40, 96, 246, 53, 70, 229, 65, 248, 60, 183, 5, 231, 228, 106, 18, 77, 143, 5, 61, 239, 120, 191, 191, 52, 120, 32, 33, 131, 145, 21, 165, 183, 187, 165, 222, 82, 84, 92, 19, 186, 137, 154, 179, 108, 165, 184, 38, 11, 204, 187, 114, 171, 54, 110, 244, 181, 153, 159, 202, 63, 46, 73, 243, 159, 203, 15, 215, 58, 183, 213, 215, 202, 107, 76, 217, 110, 47, 233, 146, 64, 76, 34, 21, 58, 245, 212, 63, 104, 213, 158, 128, 250, 15, 200, 160, 209, 107, 37, 146, 64, 14, 64, 114, 145, 167, 13, 141, 188, 17, 163, 175, 76, 224, 124, 254, 154, 117, 105, 34, 177, 45, 197, 225, 40, 47, 254, 150, 18, 201, 40, 248, 221, 148, 5, 127, 171, 162, 6, 24, 158, 215, 207, 194, 59, 49, 247, 236, 232, 223, 231, 24, 137, 201, 201, 66, 155, 56, 220, 228, 138, 22, 33, 143, 218, 34, 214, 60, 107, 201, 114, 181, 40, 191, 199, 68, 11, 171, 82, 174, 254, 151, 218, 177, 179, 231, 216, 199, 159, 228, 133, 255, 0, 158, 32, 117, 234, 102, 92, 60, 200, 1, 234, 222, 250, 159, 194, 191, 65, 103, 155, 194, 109, 58, 169, 220, 221, 154, 112, 37, 54, 214, 189, 73, 18, 215, 39, 46, 46, 238, 69, 248, 44, 16, 19, 40, 29, 209, 93, 5, 101, 171, 59, 153, 176, 104, 86, 182, 130, 150, 126, 185, 26, 133, 129, 107, 218, 109, 85, 42, 170, 218, 211, 124, 47, 32, 172, 126, 184, 146, 147, 223, 131, 69, 8, 146, 66, 160, 217, 42, 184, 37, 190, 96, 86, 228, 157, 188, 41, 184, 82, 127, 181, 134, 80, 7, 40, 252, 241, 167, 97, 7, 25, 200, 187, 38, 79, 105, 240, 89, 32, 247, 220, 86, 90, 37, 226, 88, 208, 169, 65, 52, 210, 158, 56, 111, 161, 3, 22, 63, 225, 110, 23, 4, 201, 234, 35, 233, 238, 186, 251, 168, 95, 197, 162, 123, 33, 58, 58, 250, 17, 63, 184, 45, 243, 200, 177, 61, 81, 207, 106, 97, 210, 206, 174, 156, 8, 99, 120, 243, 16, 88, 253, 44, 59, 28, 14, 86, 231, 120, 234, 252, 5, 231, 43, 205, 191, 103, 13, 197, 71, 206, 252, 195, 93, 126, 114, 253, 250, 245, 39, 51, 90, 76, 37, 146, 124, 142, 75, 28, 10, 215, 126, 19, 217, 194, 167, 150, 235, 11, 96, 220, 93, 2, 75, 174, 110, 115, 38, 135, 7, 155, 106, 150, 100, 83, 186, 42, 36, 238, 136, 207, 156, 159, 142, 203, 245, 182, 158, 166, 144, 109, 222, 115, 236, 120, 38, 40, 32, 60, 88, 21, 121, 167, 142, 223, 255, 94, 38, 90, 216, 213, 55, 157, 227, 158, 52, 197, 73, 10, 182, 238, 168, 9, 65, 254, 140, 44, 190, 74, 60, 1, 104, 246, 178, 21, 162, 67, 77, 127, 113, 60, 201, 138, 236, 200, 69, 221, 237, 32, 229, 7, 202, 88, 197, 238, 2, 111, 154, 72, 94, 132, 117, 153, 41, 55, 209, 235, 10, 207, 224, 77, 23, 225, 51, 207, 115, 124, 124, 252, 203, 210, 125, 135, 250, 175, 86, 237, 212, 185, 4, 213, 41, 46, 65, 229, 132, 184, 66, 86, 91, 197, 136, 102, 194, 64, 174, 217, 185, 177, 132, 58, 198, 75, 77, 219, 130, 235, 72, 104, 50, 95, 130, 226, 252, 96, 216, 45, 153, 53, 44, 179, 19, 247, 178, 122, 145, 77, 73, 73, 129, 134, 199, 172, 24, 21, 106, 251, 68, 25, 1, 44, 66, 224, 98, 125, 139, 110, 160, 232, 14, 91, 75, 78, 115, 181, 142, 76, 115, 58, 63, 179, 50, 46, 106, 142, 221, 65, 227, 20, 147, 14, 104, 118, 33, 22, 239, 5, 254, 182, 240, 114, 248, 158, 146, 235, 155, 199, 195, 23, 92, 189, 101, 155, 61, 124, 240, 8, 225, 98, 77, 139, 73, 78, 126, 199, 151, 231, 71, 178, 248, 160, 54, 215, 160, 196, 209, 203, 76, 38, 27, 54, 108, 184, 159, 85, 53, 221, 184, 9, 155, 38, 29, 8, 138, 137, 38, 80, 82, 155, 50, 127, 145, 216, 136, 28, 146, 172, 214, 60, 233, 185, 138, 233, 249, 86, 186, 77, 92, 188, 122, 35, 246, 252, 179, 14, 38, 117, 154, 27, 7, 142, 187, 250, 173, 58, 28, 90, 37, 147, 43, 158, 37, 223, 181, 25, 50, 66, 125, 146, 43, 129, 165, 23, 30, 18, 173, 221, 42, 116, 234, 37, 250, 174, 170, 169, 183, 202, 166, 114, 139, 245, 144, 126, 215, 238, 108, 177, 185, 30, 229, 132, 46, 33, 47, 241, 182, 113, 119, 11, 81, 22, 147, 154, 58, 67, 71, 153, 143, 194, 58, 104, 91, 246, 238, 115, 222, 170, 164, 177, 55, 52, 123, 174, 16, 89, 95, 164, 133, 126, 39, 75, 140, 88, 184, 102, 189, 3, 220, 154, 149, 51, 145, 201, 42, 200, 16, 70, 9, 94, 76, 12, 15, 10, 28, 3, 118, 129, 226, 162, 102, 246, 70, 96, 29, 221, 233, 235, 99, 141, 195, 201, 149, 235, 81, 42, 79, 249, 158, 230, 79, 146, 184, 19, 139, 218, 93, 120, 78, 183, 245, 12, 133, 149, 169, 201, 143, 67, 52, 72, 206, 128, 93, 56, 236, 96, 255, 71, 23, 163, 195, 39, 79, 137, 182, 98, 173, 229, 69, 203, 31, 115, 3, 13, 34, 44, 38, 73, 113, 156, 145, 86, 91, 191, 119, 203, 198, 151, 255, 188, 69, 234, 26, 67, 132, 204, 89, 102, 93, 251, 242, 181, 149, 137, 24, 4, 17, 32, 193, 244, 244, 197, 75, 44, 169, 4, 18, 133, 192, 195, 32, 245, 101, 77, 136, 141, 141, 125, 193, 155, 183, 68, 28, 159, 215, 233, 70, 113, 25, 71, 29, 90, 201, 65, 102, 53, 36, 34, 241, 227, 77, 247, 16, 175, 174, 195, 5, 8, 88, 215, 142, 244, 90, 121, 137, 228, 63, 91, 141, 198, 198, 222, 163, 199, 53, 158, 209, 254, 175, 196, 37, 254, 250, 8, 157, 179, 9, 204, 109, 157, 152, 196, 178, 233, 93, 10, 67, 221, 252, 226, 89, 11, 225, 107, 100, 72, 22, 245, 95, 89, 41, 217, 183, 13, 140, 81, 51, 103, 59, 193, 19, 200, 45, 228, 63, 232, 220, 139, 204, 93, 76, 234, 201, 226, 195, 228, 202, 226, 82, 148, 110, 44, 72, 113, 236, 132, 19, 122, 1, 250, 170, 120, 47, 26, 176, 194, 223, 195, 238, 237, 11, 46, 89, 245, 40, 221, 217, 128, 252, 150, 173, 74, 61, 166, 154, 1, 187, 183, 172, 8, 22, 139, 118, 54, 247, 211, 227, 129, 34, 142, 83, 85, 157, 178, 98, 63, 106, 25, 250, 255, 222, 72, 118, 213, 202, 234, 215, 163, 99, 72, 141, 30, 253, 12, 182, 171, 175, 215, 130, 140, 159, 59, 159, 171, 169, 232, 7, 253, 69, 250, 38, 109, 207, 195, 22, 187, 91, 197, 113, 34, 130, 241, 94, 146, 218, 193, 61, 201, 181, 105, 193, 77, 153, 165, 250, 76, 233, 58, 200, 25, 160, 108, 190, 120, 169, 80, 2, 75, 238, 169, 221, 12, 122, 144, 146, 6, 145, 131, 52, 46, 214, 239, 76, 73, 73, 249, 192, 155, 53, 35, 29, 243, 85, 58, 154, 10, 17, 134, 147, 231, 206, 235, 96, 145, 190, 223, 42, 66, 143, 138, 142, 97, 126, 36, 106, 245, 85, 50, 19, 46, 253, 94, 140, 36, 119, 28, 56, 8, 89, 168, 108, 29, 10, 245, 164, 102, 3, 245, 145, 117, 154, 147, 233, 139, 150, 58, 61, 196, 208, 115, 123, 10, 133, 164, 57, 28, 76, 76, 101, 231, 193, 67, 26, 24, 15, 21, 58, 246, 180, 60, 121, 71, 136, 115, 136, 76, 222, 208, 172, 10, 16, 112, 183, 116, 181, 238, 145, 250, 145, 83, 167, 133, 85, 121, 197, 33, 197, 144, 113, 205, 204, 154, 91, 173, 156, 171, 27, 125, 172, 81, 180, 109, 103, 29, 100, 167, 74, 243, 206, 224, 172, 70, 137, 239, 200, 224, 34, 192, 46, 12, 200, 14, 50, 172, 32, 139, 172, 4, 151, 137, 163, 59, 71, 131, 222, 64, 16, 247, 208, 32, 32, 222, 225, 167, 209, 234, 244, 69, 75, 244, 29, 251, 15, 146, 223, 230, 206, 87, 109, 181, 154, 106, 176, 187, 20, 239, 103, 194, 200, 62, 88, 150, 162, 161, 47, 187, 185, 191, 172, 77, 182, 239, 119, 181, 147, 81, 117, 125, 56, 94, 112, 255, 90, 182, 124, 225, 128, 150, 65, 157, 68, 189, 236, 159, 203, 87, 233, 64, 144, 144, 8, 210, 99, 204, 111, 70, 170, 221, 46, 18, 96, 160, 84, 164, 137, 167, 142, 18, 22, 157, 203, 227, 66, 52, 220, 34, 73, 58, 67, 58, 78, 181, 244, 220, 128, 193, 98, 81, 66, 55, 22, 104, 80, 32, 187, 248, 179, 226, 117, 242, 68, 194, 188, 241, 129, 186, 243, 224, 97, 98, 171, 92, 139, 145, 81, 143, 49, 191, 234, 146, 181, 254, 147, 228, 182, 77, 183, 19, 13, 125, 133, 186, 236, 203, 34, 46, 121, 244, 244, 25, 189, 231, 152, 223, 152, 170, 211, 155, 212, 154, 220, 127, 236, 184, 16, 146, 112, 247, 221, 228, 239, 27, 35, 98, 204, 167, 46, 92, 164, 247, 102, 4, 91, 91, 74, 153, 116, 86, 139, 137, 56, 122, 213, 250, 250, 9, 87, 2, 144, 51, 233, 214, 156, 220, 231, 105, 238, 164, 120, 248, 70, 38, 203, 243, 243, 47, 106, 62, 145, 113, 107, 129, 219, 85, 156, 39, 172, 111, 80, 226, 66, 207, 205, 128, 140, 94, 209, 241, 8, 134, 208, 168, 13, 241, 98, 101, 134, 184, 123, 237, 246, 34, 239, 210, 57, 3, 175, 207, 172, 37, 203, 29, 146, 254, 235, 112, 249, 218, 161, 85, 233, 227, 46, 51, 58, 58, 245, 89, 94, 88, 76, 190, 31, 250, 179, 10, 122, 134, 21, 184, 233, 206, 46, 30, 253, 185, 18, 119, 153, 150, 230, 189, 15, 161, 163, 54, 235, 64, 95, 163, 177, 150, 167, 81, 152, 179, 70, 207, 126, 202, 208, 41, 51, 156, 203, 54, 110, 34, 103, 46, 93, 38, 170, 135, 122, 239, 203, 81, 55, 200, 224, 73, 211, 28, 116, 129, 213, 192, 127, 94, 134, 21, 200, 122, 119, 195, 134, 8, 149, 13, 186, 48, 15, 159, 58, 83, 236, 140, 118, 166, 247, 224, 34, 44, 185, 55, 196, 194, 208, 67, 86, 53, 57, 117, 254, 130, 209, 106, 224, 112, 242, 14, 93, 176, 224, 30, 129, 164, 174, 218, 189, 251, 27, 155, 118, 239, 149, 235, 49, 182, 90, 153, 41, 42, 45, 160, 111, 73, 217, 168, 86, 148, 127, 200, 199, 248, 60, 88, 73, 210, 252, 189, 172, 44, 113, 146, 238, 147, 39, 69, 201, 73, 159, 113, 19, 156, 96, 169, 65, 210, 205, 223, 235, 255, 73, 147, 230, 248, 149, 244, 158, 87, 241, 59, 187, 221, 14, 217, 164, 169, 160, 1, 220, 114, 224, 112, 166, 27, 12, 174, 86, 240, 82, 129, 96, 197, 199, 225, 29, 245, 27, 49, 46, 107, 146, 254, 109, 168, 244, 254, 153, 226, 67, 86, 111, 217, 166, 193, 90, 1, 155, 248, 80, 83, 38, 170, 16, 34, 161, 231, 166, 31, 61, 205, 186, 127, 197, 165, 222, 42, 187, 202, 155, 81, 216, 193, 174, 170, 101, 224, 13, 208, 44, 157, 213, 98, 242, 16, 82, 118, 5, 205, 43, 242, 53, 16, 44, 212, 142, 35, 198, 56, 215, 108, 221, 174, 245, 251, 109, 146, 243, 133, 166, 109, 21, 112, 93, 63, 68, 215, 74, 16, 72, 168, 192, 214, 97, 215, 26, 44, 194, 90, 25, 234, 191, 138, 122, 85, 106, 85, 182, 26, 244, 147, 83, 82, 72, 58, 0, 106, 90, 210, 38, 24, 75, 69, 188, 61, 52, 116, 87, 182, 131, 41, 170, 204, 157, 207, 90, 56, 85, 239, 30, 201, 72, 17, 46, 8, 236, 94, 160, 179, 58, 187, 233, 107, 52, 34, 182, 186, 45, 116, 106, 213, 57, 233, 197, 116, 76, 95, 184, 212, 9, 13, 126, 227, 146, 146, 205, 139, 15, 60, 44, 112, 204, 241, 154, 166, 53, 76, 75, 75, 43, 194, 101, 202, 116, 87, 166, 221, 69, 210, 247, 215, 137, 14, 214, 179, 177, 65, 43, 118, 241, 33, 126, 153, 158, 72, 1, 92, 104, 176, 84, 191, 233, 218, 71, 244, 143, 116, 38, 38, 38, 190, 129, 86, 164, 255, 172, 72, 41, 187, 79, 52, 119, 78, 45, 25, 209, 205, 0, 79, 0, 148, 130, 48, 69, 147, 182, 46, 11, 31, 174, 155, 45, 244, 107, 210, 105, 228, 88, 247, 130, 72, 175, 185, 101, 53, 135, 210, 66, 92, 66, 34, 55, 43, 203, 63, 210, 50, 90, 192, 131, 232, 186, 230, 38, 254, 169, 205, 204, 203, 9, 142, 149, 156, 0, 193, 133, 15, 25, 161, 141, 155, 61, 79, 209, 111, 21, 187, 247, 240, 117, 211, 46, 4, 50, 118, 30, 56, 196, 4, 197, 97, 29, 18, 98, 233, 115, 87, 172, 22, 181, 209, 99, 204, 207, 63, 181, 146, 202, 243, 6, 1, 100, 192, 132, 41, 234, 99, 141, 91, 51, 162, 52, 147, 199, 55, 80, 6, 83, 186, 42, 36, 0, 49, 17, 164, 132, 132, 132, 87, 205, 174, 91, 79, 158, 12, 158, 156, 116, 245, 218, 205, 104, 114, 95, 163, 214, 58, 72, 238, 149, 202, 98, 71, 16, 145, 183, 81, 185, 115, 47, 3, 26, 19, 60, 215, 180, 141, 177, 96, 245, 186, 219, 66, 8, 105, 138, 2, 229, 87, 122, 239, 95, 198, 59, 10, 132, 117, 96, 113, 86, 144, 254, 19, 150, 34, 24, 47, 197, 51, 136, 97, 134, 240, 207, 0, 50, 135, 120, 238, 163, 77, 194, 245, 85, 91, 182, 43, 146, 178, 88, 59, 243, 70, 0, 113, 251, 34, 232, 170, 77, 210, 245, 113, 92, 48, 64, 129, 157, 95, 217, 136, 110, 36, 15, 189, 104, 144, 26, 13, 1, 224, 103, 155, 182, 213, 27, 68, 14, 82, 71, 78, 159, 229, 92, 177, 105, 139, 6, 129, 121, 237, 223, 46, 171, 51, 144, 218, 13, 141, 2, 192, 239, 29, 19, 19, 243, 156, 167, 207, 77, 86, 148, 247, 232, 195, 226, 222, 241, 49, 87, 10, 164, 121, 215, 104, 76, 158, 104, 28, 206, 118, 84, 158, 218, 208, 176, 221, 16, 125, 88, 14, 159, 60, 165, 114, 225, 241, 38, 25, 221, 212, 8, 107, 22, 84, 105, 19, 181, 152, 245, 248, 251, 103, 51, 187, 71, 196, 230, 9, 30, 78, 136, 157, 64, 143, 194, 114, 29, 186, 235, 98, 167, 74, 23, 176, 198, 86, 90, 101, 82, 50, 69, 93, 83, 217, 134, 85, 229, 31, 224, 222, 251, 15, 122, 37, 178, 127, 141, 20, 69, 169, 234, 74, 171, 116, 136, 77, 76, 12, 168, 242, 152, 9, 199, 219, 61, 71, 127, 94, 14, 111, 30, 59, 235, 79, 39, 104, 27, 131, 247, 170, 229, 160, 225, 226, 122, 157, 133, 44, 124, 217, 42, 22, 239, 189, 17, 31, 255, 33, 172, 73, 116, 83, 199, 106, 42, 229, 245, 36, 68, 244, 241, 164, 100, 243, 195, 184, 9, 194, 205, 158, 36, 117, 97, 201, 235, 131, 55, 131, 169, 38, 81, 107, 212, 249, 97, 22, 53, 172, 97, 115, 89, 158, 199, 75, 193, 122, 4, 247, 45, 61, 95, 49, 95, 199, 232, 102, 163, 30, 111, 207, 117, 86, 220, 168, 137, 41, 169, 208, 222, 76, 235, 51, 110, 162, 243, 237, 150, 237, 117, 232, 25, 11, 6, 134, 16, 65, 207, 168, 239, 102, 49, 222, 169, 7, 146, 31, 97, 93, 239, 63, 97, 138, 51, 129, 27, 54, 244, 217, 94, 30, 157, 154, 250, 140, 228, 90, 198, 251, 95, 190, 25, 132, 104, 241, 145, 147, 167, 85, 91, 177, 47, 53, 186, 83, 211, 74, 180, 239, 170, 130, 66, 199, 172, 37, 203, 245, 221, 135, 143, 144, 216, 132, 68, 243, 194, 146, 192, 251, 47, 142, 166, 139, 97, 221, 56, 106, 182, 143, 95, 178, 228, 193, 244, 118, 134, 188, 46, 44, 191, 124, 3, 198, 187, 122, 221, 9, 121, 49, 66, 119, 116, 70, 251, 225, 163, 84, 91, 181, 6, 58, 232, 177, 10, 89, 43, 119, 252, 160, 122, 67, 119, 161, 58, 253, 204, 217, 217, 137, 169, 32, 50, 127, 159, 68, 70, 70, 230, 22, 50, 103, 244, 190, 80, 68, 183, 123, 145, 216, 69, 31, 86, 227, 248, 217, 115, 34, 153, 234, 7, 171, 175, 143, 68, 146, 61, 252, 148, 180, 179, 27, 93, 247, 150, 92, 39, 22, 211, 19, 173, 165, 64, 135, 66, 174, 195, 244, 229, 126, 16, 27, 95, 200, 132, 5, 43, 15, 50, 52, 169, 229, 167, 195, 134, 253, 210, 53, 23, 145, 208, 141, 120, 57, 179, 245, 195, 239, 183, 7, 184, 247, 99, 34, 203, 114, 157, 187, 192, 14, 155, 58, 176, 186, 68, 25, 25, 196, 252, 6, 78, 156, 42, 100, 237, 84, 199, 255, 183, 119, 37, 96, 81, 86, 235, 255, 176, 218, 106, 251, 114, 187, 117, 91, 180, 123, 51, 187, 253, 187, 89, 153, 102, 229, 82, 42, 34, 42, 200, 176, 111, 130, 128, 178, 168, 136, 130, 10, 232, 184, 231, 146, 22, 166, 134, 75, 46, 169, 41, 165, 230, 146, 185, 100, 184, 148, 43, 106, 106, 184, 225, 174, 32, 42, 40, 2, 34, 51, 204, 112, 254, 231, 253, 56, 31, 30, 63, 103, 134, 25, 24, 4, 225, 253, 61, 207, 251, 204, 254, 205, 183, 156, 239, 252, 206, 187, 235, 116, 206, 230, 44, 232, 132, 49, 40, 245, 150, 76, 154, 62, 171, 4, 52, 64, 89, 155, 51, 215, 247, 216, 158, 187, 175, 72, 96, 31, 250, 114, 239, 126, 186, 245, 219, 255, 212, 10, 254, 194, 47, 101, 242, 7, 204, 99, 154, 107, 225, 173, 91, 237, 97, 174, 149, 131, 174, 202, 139, 67, 20, 2, 97, 150, 65, 228, 240, 83, 193, 81, 165, 16, 7, 242, 60, 211, 20, 193, 180, 44, 250, 48, 197, 114, 118, 31, 241, 166, 206, 206, 131, 152, 230, 234, 23, 14, 228, 170, 219, 115, 232, 176, 60, 254, 175, 107, 52, 58, 149, 242, 26, 52, 120, 51, 43, 35, 72, 104, 75, 163, 185, 89, 92, 172, 75, 89, 182, 252, 22, 211, 18, 232, 185, 236, 28, 165, 163, 71, 207, 87, 51, 80, 153, 63, 158, 93, 196, 118, 39, 79, 158, 124, 214, 148, 118, 202, 111, 6, 7, 3, 14, 126, 27, 229, 251, 5, 197, 197, 173, 132, 144, 126, 169, 158, 100, 200, 232, 9, 96, 242, 149, 250, 195, 65, 151, 15, 136, 144, 5, 2, 21, 122, 45, 62, 130, 102, 214, 123, 58, 94, 164, 27, 230, 194, 141, 27, 79, 242, 170, 52, 82, 50, 58, 152, 223, 165, 234, 45, 208, 47, 240, 175, 131, 242, 2, 102, 174, 48, 97, 89, 179, 38, 169, 60, 65, 165, 88, 153, 36, 229, 128, 134, 159, 205, 209, 116, 16, 230, 91, 31, 216, 92, 209, 65, 110, 54, 94, 133, 40, 90, 222, 123, 85, 27, 34, 57, 184, 247, 31, 208, 44, 91, 183, 161, 132, 47, 194, 190, 49, 54, 145, 203, 115, 219, 77, 166, 25, 73, 26, 44, 35, 66, 183, 33, 106, 29, 116, 62, 1, 162, 236, 30, 55, 92, 242, 147, 130, 207, 146, 251, 52, 3, 204, 157, 75, 4, 77, 82, 106, 74, 208, 111, 210, 87, 90, 152, 163, 204, 137, 214, 151, 137, 10, 226, 42, 192, 183, 8, 154, 108, 226, 180, 20, 169, 140, 31, 199, 223, 80, 68, 93, 92, 108, 40, 73, 59, 58, 57, 185, 17, 91, 28, 124, 6, 25, 49, 178, 73, 89, 210, 88, 10, 139, 216, 241, 236, 44, 131, 38, 238, 207, 4, 71, 73, 89, 9, 208, 24, 250, 35, 94, 124, 1, 148, 12, 136, 68, 135, 215, 173, 133, 250, 175, 239, 69, 196, 74, 169, 58, 223, 166, 46, 47, 209, 243, 110, 58, 58, 157, 126, 46, 152, 148, 5, 5, 199, 174, 33, 14, 98, 27, 225, 4, 156, 51, 48, 105, 92, 229, 65, 23, 211, 160, 154, 5, 152, 71, 83, 120, 242, 175, 161, 1, 41, 136, 217, 90, 131, 236, 239, 18, 47, 0, 191, 248, 105, 242, 78, 108, 219, 187, 175, 148, 145, 165, 150, 184, 6, 64, 233, 168, 178, 203, 121, 82, 105, 83, 157, 144, 219, 133, 246, 243, 90, 208, 16, 160, 173, 18, 4, 85, 192, 197, 72, 152, 246, 173, 150, 180, 113, 161, 235, 182, 110, 151, 75, 209, 109, 172, 41, 109, 76, 240, 73, 174, 179, 178, 185, 85, 38, 219, 105, 162, 233, 14, 175, 120, 245, 230, 24, 133, 217, 212, 190, 138, 219, 145, 73, 105, 141, 112, 189, 78, 11, 245, 94, 109, 77, 17, 44, 83, 2, 252, 165, 234, 5, 199, 142, 151, 16, 23, 31, 201, 183, 73, 252, 194, 202, 200, 71, 46, 250, 217, 63, 174, 184, 197, 23, 117, 78, 230, 236, 163, 252, 57, 35, 50, 169, 229, 217, 233, 139, 89, 165, 196, 51, 68, 50, 111, 150, 119, 40, 25, 108, 52, 53, 174, 53, 215, 30, 165, 180, 12, 223, 48, 250, 81, 191, 56, 253, 230, 219, 125, 33, 33, 192, 113, 180, 194, 242, 102, 43, 158, 71, 67, 213, 114, 128, 200, 216, 156, 9, 29, 128, 102, 201, 29, 122, 100, 13, 147, 221, 143, 186, 65, 83, 191, 41, 121, 165, 119, 180, 14, 220, 88, 224, 58, 3, 51, 43, 44, 18, 202, 11, 179, 223, 222, 39, 73, 163, 101, 139, 92, 223, 225, 99, 117, 39, 206, 158, 147, 189, 104, 39, 161, 127, 38, 106, 149, 229, 7, 191, 24, 156, 208, 252, 113, 112, 97, 97, 97, 251, 203, 69, 69, 207, 25, 27, 36, 114, 93, 83, 43, 231, 191, 217, 43, 200, 210, 133, 189, 222, 33, 95, 244, 181, 105, 91, 75, 191, 156, 191, 88, 94, 237, 175, 70, 83, 64, 237, 19, 165, 92, 15, 20, 124, 26, 203, 55, 108, 46, 144, 87, 194, 114, 247, 149, 154, 92, 125, 194, 156, 103, 229, 244, 15, 173, 161, 102, 187, 8, 171, 221, 219, 54, 213, 248, 189, 188, 48, 250, 135, 220, 252, 155, 105, 167, 31, 87, 54, 7, 220, 209, 226, 139, 247, 166, 132, 64, 27, 8, 48, 220, 186, 39, 157, 30, 63, 115, 142, 222, 40, 44, 146, 199, 192, 8, 115, 230, 20, 129, 184, 158, 96, 139, 193, 29, 229, 245, 140, 247, 72, 65, 142, 160, 165, 181, 53, 210, 150, 171, 141, 212, 216, 57, 65, 242, 167, 130, 239, 17, 162, 255, 161, 39, 47, 199, 46, 185, 225, 182, 153, 251, 32, 91, 234, 238, 248, 222, 177, 99, 199, 30, 101, 243, 166, 51, 39, 204, 243, 21, 218, 206, 181, 235, 64, 152, 165, 113, 95, 77, 215, 50, 13, 83, 242, 97, 66, 239, 93, 200, 40, 128, 125, 106, 199, 75, 246, 129, 118, 251, 42, 4, 102, 250, 135, 211, 229, 27, 127, 19, 83, 69, 70, 42, 239, 253, 134, 168, 77, 218, 200, 166, 75, 67, 38, 54, 238, 71, 188, 39, 121, 52, 74, 205, 176, 88, 163, 233, 201, 187, 208, 75, 169, 36, 208, 17, 0, 198, 58, 148, 72, 171, 233, 137, 24, 81, 249, 117, 210, 232, 116, 190, 2, 217, 228, 220, 188, 73, 95, 168, 169, 155, 73, 24, 175, 141, 229, 10, 44, 86, 236, 254, 33, 111, 199, 27, 23, 96, 117, 215, 124, 203, 30, 95, 145, 115, 34, 205, 153, 143, 68, 130, 229, 173, 254, 46, 10, 145, 204, 192, 82, 135, 216, 251, 144, 243, 232, 106, 238, 124, 34, 54, 98, 150, 23, 242, 140, 40, 75, 228, 96, 71, 177, 127, 101, 27, 174, 97, 74, 17, 185, 190, 161, 224, 11, 212, 237, 60, 240, 151, 188, 176, 211, 105, 52, 154, 56, 133, 105, 213, 214, 210, 243, 34, 207, 207, 226, 251, 187, 118, 237, 106, 124, 179, 156, 48, 231, 66, 127, 76, 121, 160, 67, 1, 247, 95, 182, 110, 215, 67, 222, 58, 241, 239, 83, 74, 122, 6, 234, 33, 99, 161, 45, 47, 210, 2, 245, 104, 33, 223, 29, 204, 192, 177, 95, 38, 107, 46, 93, 185, 42, 255, 116, 167, 144, 69, 96, 43, 183, 226, 106, 80, 131, 79, 177, 66, 113, 172, 205, 228, 82, 126, 225, 239, 152, 100, 181, 58, 93, 128, 92, 71, 150, 35, 4, 205, 173, 181, 62, 118, 164, 27, 83, 175, 215, 71, 177, 137, 102, 59, 123, 253, 191, 154, 188, 38, 194, 228, 244, 154, 160, 249, 89, 35, 253, 67, 36, 218, 79, 144, 36, 235, 236, 120, 179, 51, 52, 111, 89, 50, 199, 165, 238, 216, 241, 32, 148, 185, 99, 139, 236, 119, 50, 51, 165, 64, 34, 91, 229, 34, 204, 146, 177, 15, 245, 103, 101, 141, 114, 253, 246, 63, 75, 196, 156, 201, 79, 184, 118, 6, 133, 54, 24, 129, 150, 125, 245, 253, 15, 37, 60, 109, 13, 176, 229, 106, 65, 193, 127, 172, 169, 161, 9, 115, 247, 29, 231, 38, 45, 35, 227, 17, 157, 78, 231, 194, 251, 193, 202, 139, 75, 10, 93, 82, 86, 255, 190, 85, 31, 57, 97, 10, 4, 30, 65, 1, 249, 178, 231, 131, 163, 36, 178, 84, 13, 83, 75, 69, 24, 154, 133, 15, 208, 165, 237, 222, 43, 223, 107, 154, 91, 90, 109, 168, 49, 133, 166, 222, 107, 148, 117, 49, 66, 84, 44, 46, 44, 188, 55, 24, 154, 162, 66, 197, 21, 75, 111, 22, 68, 205, 140, 27, 99, 19, 89, 77, 145, 50, 123, 108, 99, 69, 45, 82, 153, 35, 249, 111, 36, 201, 186, 189, 168, 175, 202, 24, 51, 53, 191, 85, 163, 226, 144, 68, 108, 160, 85, 49, 162, 220, 7, 3, 8, 218, 142, 65, 196, 183, 107, 252, 136, 138, 124, 78, 215, 161, 234, 210, 244, 195, 25, 50, 209, 220, 212, 106, 181, 81, 10, 75, 157, 109, 77, 220, 151, 134, 124, 152, 80, 183, 85, 83, 110, 157, 91, 36, 106, 152, 57, 76, 195, 92, 185, 233, 247, 210, 168, 9, 83, 75, 30, 237, 21, 169, 7, 31, 38, 20, 110, 104, 7, 93, 69, 124, 67, 203, 166, 46, 92, 172, 45, 188, 89, 44, 167, 138, 44, 191, 120, 241, 226, 83, 53, 181, 255, 136, 170, 95, 120, 71, 83, 43, 68, 68, 237, 174, 240, 239, 69, 94, 149, 80, 202, 204, 91, 65, 110, 213, 133, 108, 254, 2, 191, 252, 19, 242, 170, 28, 175, 108, 189, 86, 8, 172, 18, 152, 37, 47, 166, 206, 157, 203, 127, 66, 14, 156, 153, 185, 244, 39, 13, 233, 226, 69, 33, 45, 100, 206, 79, 43, 53, 154, 114, 23, 17, 144, 203, 26, 161, 101, 149, 205, 189, 26, 99, 66, 54, 193, 29, 11, 63, 32, 58, 70, 152, 238, 156, 48, 229, 18, 143, 20, 186, 183, 0, 97, 70, 79, 152, 90, 10, 41, 93, 82, 53, 53, 118, 60, 61, 135, 141, 212, 31, 58, 126, 66, 38, 251, 156, 146, 146, 146, 174, 247, 98, 113, 140, 176, 124, 53, 232, 128, 61, 209, 26, 236, 245, 151, 3, 130, 226, 173, 24, 180, 35, 110, 231, 128, 88, 64, 29, 207, 56, 194, 146, 197, 91, 126, 73, 73, 19, 200, 245, 151, 66, 164, 151, 164, 22, 239, 207, 56, 42, 91, 58, 242, 149, 109, 170, 106, 203, 106, 39, 244, 49, 189, 131, 160, 143, 222, 38, 204, 31, 228, 146, 130, 82, 37, 244, 156, 203, 16, 196, 163, 143, 129, 220, 117, 183, 0, 29, 249, 160, 115, 217, 172, 31, 87, 84, 216, 140, 245, 122, 125, 50, 18, 101, 29, 93, 13, 226, 89, 104, 184, 147, 17, 123, 156, 81, 67, 36, 185, 78, 212, 54, 240, 140, 35, 44, 93, 192, 21, 23, 75, 173, 228, 68, 11, 71, 234, 165, 194, 194, 103, 68, 141, 174, 14, 105, 212, 246, 134, 204, 165, 25, 23, 46, 60, 9, 221, 97, 120, 145, 151, 235, 242, 129, 64, 100, 240, 242, 13, 191, 233, 62, 25, 16, 175, 113, 26, 156, 88, 124, 54, 43, 251, 22, 215, 144, 143, 179, 7, 57, 144, 18, 239, 27, 4, 162, 22, 111, 108, 57, 112, 103, 77, 13, 145, 228, 44, 190, 125, 123, 92, 136, 33, 170, 74, 148, 140, 96, 84, 80, 222, 144, 61, 122, 8, 159, 57, 212, 213, 49, 101, 202, 135, 9, 109, 213, 32, 79, 30, 26, 145, 51, 201, 147, 111, 24, 232, 174, 146, 203, 83, 88, 24, 73, 130, 169, 182, 41, 146, 36, 2, 81, 187, 55, 178, 24, 133, 184, 207, 202, 62, 73, 121, 59, 137, 162, 198, 138, 64, 84, 129, 108, 42, 138, 180, 200, 227, 246, 126, 51, 67, 10, 62, 204, 59, 76, 178, 87, 175, 94, 125, 65, 171, 213, 6, 112, 13, 19, 10, 190, 102, 233, 245, 122, 8, 164, 124, 8, 9, 18, 129, 168, 59, 90, 228, 35, 114, 143, 193, 26, 200, 145, 12, 16, 53, 2, 4, 162, 58, 11, 186, 250, 176, 216, 18, 124, 152, 119, 16, 125, 118, 118, 246, 203, 217, 217, 5, 79, 27, 90, 196, 34, 16, 136, 218, 185, 89, 229, 149, 249, 171, 114, 57, 60, 43, 146, 164, 140, 118, 168, 73, 34, 172, 185, 168, 171, 103, 90, 178, 131, 210, 108, 108, 72, 227, 68, 32, 16, 181, 115, 147, 202, 65, 59, 173, 141, 20, 1, 168, 46, 73, 106, 48, 71, 18, 129, 48, 155, 48, 237, 80, 123, 68, 32, 234, 214, 141, 41, 167, 127, 120, 8, 228, 102, 205, 106, 59, 80, 137, 228, 177, 250, 168, 5, 32, 16, 8, 4, 162, 225, 104, 146, 177, 66, 176, 141, 53, 73, 242, 144, 184, 82, 198, 51, 142, 64, 32, 16, 136, 251, 133, 32, 109, 132, 62, 146, 95, 215, 80, 250, 199, 47, 168, 69, 34, 16, 8, 4, 226, 126, 36, 73, 91, 33, 180, 126, 165, 149, 251, 72, 106, 21, 125, 36, 49, 104, 7, 129, 64, 32, 16, 247, 21, 73, 138, 221, 31, 246, 212, 16, 73, 14, 64, 146, 68, 32, 238, 239, 137, 194, 6, 5, 197, 152, 152, 34, 152, 122, 32, 114, 208, 206, 19, 66, 51, 89, 173, 149, 205, 173, 114, 63, 193, 7, 204, 220, 39, 27, 188, 135, 81, 80, 234, 200, 220, 39, 87, 109, 80, 171, 213, 182, 252, 57, 10, 138, 36, 234, 219, 207, 237, 12, 77, 202, 245, 108, 161, 248, 47, 33, 71, 210, 26, 62, 73, 49, 240, 231, 223, 247, 66, 35, 198, 49, 139, 130, 98, 85, 177, 163, 24, 104, 135, 176, 68, 83, 81, 62, 79, 77, 77, 125, 48, 243, 210, 165, 103, 160, 202, 255, 241, 227, 199, 159, 190, 31, 229, 204, 153, 51, 207, 147, 230, 42, 71, 157, 78, 231, 108, 229, 28, 73, 61, 175, 61, 121, 237, 202, 149, 27, 77, 55, 165, 167, 63, 150, 153, 153, 249, 140, 201, 253, 201, 206, 126, 26, 10, 64, 87, 225, 242, 96, 78, 25, 2, 81, 131, 147, 223, 75, 76, 190, 99, 178, 152, 201, 2, 38, 223, 163, 160, 112, 129, 110, 227, 169, 76, 58, 136, 230, 85, 254, 252, 113, 38, 59, 121, 235, 27, 40, 229, 150, 125, 31, 203, 69, 161, 133, 79, 153, 149, 76, 173, 101, 130, 233, 54, 203, 204, 253, 56, 207, 235, 86, 6, 243, 115, 108, 78, 225, 1, 57, 232, 168, 63, 15, 60, 154, 135, 227, 22, 5, 165, 90, 178, 128, 215, 144, 29, 46, 221, 97, 127, 236, 219, 231, 182, 235, 232, 9, 250, 243, 214, 63, 233, 218, 63, 119, 209, 213, 219, 118, 208, 85, 236, 249, 207, 91, 255, 144, 30, 37, 217, 102, 101, 217, 90, 197, 207, 148, 223, 217, 170, 120, 94, 213, 109, 223, 203, 99, 220, 106, 224, 117, 117, 207, 71, 117, 246, 107, 171, 241, 239, 172, 248, 125, 43, 221, 114, 48, 131, 110, 252, 99, 231, 124, 174, 57, 58, 66, 167, 116, 233, 121, 90, 218, 243, 251, 255, 62, 162, 185, 146, 95, 64, 207, 100, 101, 211, 243, 151, 175, 208, 243, 57, 92, 46, 95, 185, 243, 117, 142, 226, 179, 156, 43, 119, 127, 95, 249, 219, 203, 6, 94, 95, 54, 177, 61, 99, 255, 93, 201, 111, 47, 48, 57, 123, 41, 135, 22, 148, 119, 70, 103, 138, 159, 117, 56, 146, 111, 167, 172, 168, 184, 152, 158, 205, 206, 145, 254, 199, 212, 190, 195, 231, 112, 30, 111, 148, 104, 232, 250, 109, 127, 206, 131, 115, 156, 94, 9, 73, 178, 235, 33, 45, 88, 90, 71, 14, 106, 117, 173, 176, 136, 34, 16, 8, 235, 33, 159, 221, 83, 227, 103, 207, 111, 65, 136, 179, 170, 5, 249, 200, 37, 147, 180, 234, 114, 140, 184, 248, 156, 38, 158, 193, 23, 137, 95, 216, 37, 226, 221, 251, 18, 81, 5, 93, 36, 221, 253, 206, 145, 238, 190, 103, 73, 55, 223, 115, 210, 243, 30, 254, 229, 34, 61, 23, 68, 249, 186, 135, 137, 207, 13, 253, 182, 178, 223, 139, 191, 51, 246, 88, 217, 126, 152, 220, 103, 126, 92, 70, 159, 155, 122, 207, 223, 130, 239, 249, 25, 121, 237, 87, 197, 255, 49, 231, 187, 166, 254, 211, 208, 103, 21, 239, 157, 97, 215, 254, 26, 233, 226, 17, 41, 205, 202, 97, 97, 14, 68, 165, 226, 254, 201, 166, 141, 73, 87, 239, 109, 196, 61, 232, 10, 113, 11, 60, 67, 122, 6, 158, 175, 84, 220, 204, 248, 142, 57, 223, 119, 51, 240, 218, 173, 42, 219, 10, 58, 79, 188, 130, 207, 147, 55, 219, 157, 221, 245, 215, 161, 2, 222, 232, 213, 42, 44, 169, 227, 219, 249, 35, 125, 255, 13, 210, 228, 227, 179, 236, 126, 98, 251, 16, 112, 231, 254, 42, 165, 39, 59, 143, 174, 1, 215, 137, 155, 255, 4, 233, 20, 183, 109, 107, 178, 110, 101, 91, 181, 90, 250, 252, 63, 225, 49, 221, 63, 233, 31, 159, 239, 51, 98, 236, 41, 207, 164, 209, 231, 80, 80, 80, 140, 139, 71, 226, 168, 115, 170, 196, 209, 103, 125, 134, 143, 189, 208, 107, 212, 132, 75, 65, 163, 190, 200, 118, 27, 170, 62, 245, 223, 190, 3, 15, 147, 192, 190, 7, 58, 13, 74, 60, 157, 240, 77, 138, 46, 108, 236, 164, 155, 228, 51, 183, 15, 165, 155, 237, 100, 86, 214, 75, 127, 101, 100, 52, 103, 79, 31, 18, 111, 194, 48, 117, 202, 67, 235, 119, 236, 120, 50, 45, 45, 253, 233, 181, 107, 215, 62, 49, 119, 213, 170, 71, 213, 211, 83, 31, 153, 158, 154, 250, 200, 132, 185, 115, 31, 157, 59, 119, 213, 163, 19, 234, 129, 192, 241, 76, 231, 199, 133, 114, 91, 224, 26, 79, 90, 184, 240, 97, 19, 166, 122, 91, 117, 114, 114, 99, 24, 19, 113, 19, 230, 62, 122, 191, 73, 249, 248, 157, 251, 40, 59, 20, 123, 166, 249, 173, 231, 252, 86, 98, 205, 244, 143, 155, 55, 111, 134, 193, 185, 90, 153, 150, 246, 56, 252, 87, 229, 178, 234, 81, 11, 61, 38, 178, 175, 248, 1, 38, 141, 153, 60, 194, 228, 81, 20, 20, 20, 131, 194, 238, 143, 215, 30, 11, 83, 171, 159, 230, 175, 101, 60, 113, 225, 210, 37, 39, 182, 72, 158, 198, 110, 219, 191, 229, 166, 214, 226, 100, 55, 155, 71, 246, 253, 198, 171, 142, 120, 203, 141, 46, 17, 8, 161, 66, 191, 189, 44, 25, 25, 25, 142, 245, 169, 8, 49, 59, 150, 3, 66, 49, 114, 107, 149, 163, 3, 124, 80, 133, 125, 177, 5, 83, 170, 37, 81, 120, 56, 74, 17, 136, 42, 221, 247, 111, 50, 73, 98, 178, 23, 162, 218, 75, 245, 101, 244, 239, 204, 83, 116, 221, 142, 61, 244, 155, 69, 203, 126, 173, 248, 226, 244, 37, 203, 86, 111, 61, 152, 65, 143, 156, 62, 75, 75, 116, 21, 189, 102, 97, 69, 125, 152, 7, 2, 4, 23, 20, 20, 188, 161, 252, 3, 149, 42, 213, 14, 38, 203, 204, 204, 204, 70, 240, 40, 249, 171, 202, 205, 113, 182, 240, 168, 170, 195, 2, 251, 199, 125, 58, 24, 25, 216, 192, 161, 78, 77, 117, 100, 154, 228, 21, 43, 166, 127, 200, 219, 200, 103, 247, 205, 83, 120, 134, 173, 124, 189, 192, 204, 204, 239, 97, 75, 133, 223, 243, 24, 214, 95, 199, 16, 6, 174, 28, 181, 218, 182, 170, 215, 149, 8, 243, 58, 159, 211, 109, 83, 82, 82, 28, 214, 173, 91, 39, 113, 147, 120, 205, 207, 158, 61, 251, 15, 118, 111, 70, 50, 217, 46, 55, 69, 63, 196, 136, 113, 242, 162, 101, 244, 157, 126, 241, 148, 116, 243, 189, 70, 156, 60, 247, 146, 14, 110, 177, 183, 247, 176, 179, 106, 32, 113, 242, 56, 196, 62, 204, 126, 52, 56, 138, 134, 126, 49, 149, 46, 88, 243, 43, 61, 120, 226, 36, 45, 186, 85, 97, 125, 130, 200, 128, 116, 38, 201, 144, 28, 93, 92, 92, 252, 79, 3, 172, 12, 9, 152, 142, 92, 235, 184, 47, 200, 135, 55, 253, 116, 103, 210, 155, 73, 160, 78, 167, 235, 133, 114, 167, 176, 243, 98, 80, 234, 193, 113, 5, 51, 241, 101, 18, 39, 16, 155, 53, 210, 63, 100, 109, 244, 64, 126, 126, 126, 147, 220, 220, 220, 55, 242, 10, 11, 223, 204, 205, 45, 108, 198, 158, 55, 187, 253, 40, 74, 225, 237, 247, 11, 11, 45, 151, 92, 75, 37, 87, 241, 104, 234, 59, 213, 145, 92, 3, 175, 13, 29, 183, 113, 129, 5, 58, 72, 33, 59, 135, 57, 57, 57, 15, 87, 247, 158, 135, 69, 61, 108, 175, 252, 188, 153, 58, 15, 185, 85, 56, 15, 185, 102, 108, 35, 215, 140, 247, 205, 185, 22, 230, 156, 195, 202, 142, 193, 212, 245, 177, 100, 31, 114, 171, 112, 78, 10, 222, 184, 86, 88, 248, 22, 187, 79, 158, 148, 249, 195, 74, 115, 186, 157, 129, 234, 86, 240, 94, 71, 30, 177, 47, 45, 136, 79, 103, 101, 211, 111, 151, 175, 162, 45, 251, 15, 161, 196, 197, 231, 42, 113, 11, 248, 177, 121, 88, 127, 159, 97, 83, 83, 254, 97, 124, 133, 54, 125, 250, 243, 159, 199, 12, 233, 72, 124, 67, 135, 19, 103, 239, 95, 137, 179, 87, 22, 9, 236, 75, 67, 39, 76, 165, 139, 214, 109, 84, 106, 154, 215, 153, 252, 206, 100, 4, 147, 182, 233, 233, 233, 143, 25, 216, 89, 71, 46, 182, 117, 144, 28, 237, 4, 117, 27, 129, 168, 137, 244, 143, 76, 38, 151, 57, 1, 223, 226, 214, 25, 148, 170, 73, 1, 63, 167, 95, 139, 247, 175, 133, 247, 188, 220, 237, 37, 70, 88, 248, 107, 240, 220, 214, 154, 200, 33, 217, 59, 173, 232, 22, 186, 131, 28, 53, 26, 205, 27, 220, 156, 42, 249, 25, 111, 20, 23, 211, 95, 182, 239, 160, 190, 163, 39, 82, 210, 221, 175, 132, 201, 111, 239, 69, 12, 12, 55, 64, 140, 54, 146, 102, 91, 17, 37, 215, 86, 138, 146, 187, 139, 197, 83, 150, 172, 121, 186, 71, 220, 240, 14, 196, 59, 100, 56, 211, 52, 55, 50, 210, 188, 242, 98, 216, 0, 26, 155, 252, 45, 253, 57, 109, 59, 61, 119, 233, 178, 56, 49, 156, 229, 57, 117, 125, 10, 53, 154, 55, 13, 28, 128, 236, 207, 178, 173, 11, 85, 12, 228, 200, 64, 231, 193, 137, 223, 206, 92, 177, 134, 206, 102, 43, 138, 20, 38, 179, 80, 26, 140, 204, 89, 185, 134, 78, 93, 156, 74, 119, 28, 56, 40, 105, 144, 86, 78, 255, 208, 239, 63, 122, 140, 110, 222, 187, 143, 30, 60, 113, 138, 238, 59, 122, 156, 201, 9, 186, 255, 88, 185, 136, 207, 37, 169, 236, 181, 41, 81, 124, 183, 98, 219, 71, 205, 251, 237, 190, 163, 150, 255, 135, 161, 109, 239, 179, 100, 159, 149, 219, 56, 106, 250, 59, 123, 51, 142, 210, 140, 51, 231, 164, 251, 148, 56, 190, 219, 140, 155, 93, 45, 89, 124, 87, 204, 57, 211, 22, 45, 61, 114, 236, 124, 150, 180, 205, 187, 246, 251, 168, 153, 251, 165, 252, 238, 81, 11, 174, 89, 101, 219, 63, 106, 226, 124, 30, 173, 252, 119, 166, 246, 99, 223, 81, 197, 248, 48, 115, 95, 42, 198, 137, 114, 12, 91, 112, 13, 149, 255, 153, 126, 228, 184, 100, 173, 220, 184, 119, 63, 125, 183, 239, 192, 73, 112, 109, 90, 128, 217, 213, 66, 255, 61, 39, 71, 27, 193, 82, 208, 152, 91, 136, 126, 225, 139, 83, 122, 128, 253, 223, 136, 89, 243, 40, 241, 239, 67, 73, 23, 207, 35, 15, 5, 69, 140, 138, 249, 98, 202, 127, 149, 156, 208, 34, 44, 197, 129, 152, 24, 87, 54, 240, 37, 167, 232, 232, 70, 205, 213, 106, 71, 67, 164, 57, 125, 94, 234, 243, 173, 163, 7, 57, 147, 158, 65, 19, 137, 147, 231, 78, 226, 234, 95, 248, 241, 192, 97, 116, 252, 252, 197, 116, 219, 190, 191, 104, 94, 65, 161, 60, 79, 20, 115, 71, 232, 100, 80, 113, 51, 51, 243, 26, 27, 81, 137, 237, 107, 173, 244, 15, 79, 101, 248, 191, 240, 152, 62, 164, 103, 224, 239, 76, 221, 94, 73, 186, 249, 174, 97, 43, 139, 213, 119, 60, 42, 197, 216, 251, 230, 126, 79, 249, 190, 248, 90, 124, 238, 226, 179, 186, 65, 139, 57, 231, 184, 178, 243, 106, 232, 26, 200, 239, 193, 127, 120, 133, 172, 37, 228, 249, 229, 219, 246, 238, 203, 228, 233, 31, 122, 235, 112, 100, 57, 217, 166, 174, 219, 176, 139, 13, 177, 31, 137, 42, 104, 53, 233, 172, 250, 185, 65, 72, 167, 154, 18, 143, 149, 164, 189, 219, 106, 226, 26, 176, 172, 107, 76, 194, 63, 149, 196, 103, 17, 92, 188, 71, 146, 207, 122, 174, 103, 251, 187, 162, 230, 246, 183, 46, 136, 123, 249, 99, 103, 213, 170, 186, 57, 94, 60, 86, 145, 207, 221, 151, 147, 110, 62, 155, 62, 140, 30, 28, 36, 199, 185, 84, 182, 216, 17, 184, 195, 86, 193, 41, 45, 161, 227, 14, 87, 216, 104, 118, 110, 158, 228, 54, 252, 52, 54, 17, 204, 169, 121, 196, 61, 240, 123, 231, 216, 97, 157, 148, 218, 38, 112, 158, 172, 52, 89, 234, 28, 183, 45, 103, 86, 198, 236, 70, 242, 181, 250, 142, 31, 255, 218, 191, 122, 71, 7, 144, 158, 1, 243, 25, 59, 31, 103, 147, 142, 222, 119, 212, 4, 58, 159, 237, 216, 81, 182, 234, 211, 222, 78, 57, 187, 192, 181, 204, 144, 146, 146, 146, 38, 70, 180, 76, 240, 13, 218, 223, 99, 170, 68, 7, 62, 2, 198, 223, 183, 86, 140, 108, 213, 113, 166, 44, 197, 8, 241, 26, 187, 94, 54, 103, 206, 156, 121, 64, 112, 231, 152, 43, 141, 204, 172, 98, 132, 168, 29, 216, 84, 162, 49, 58, 42, 175, 31, 196, 198, 176, 247, 162, 153, 236, 128, 219, 174, 164, 84, 71, 183, 164, 239, 167, 17, 147, 146, 41, 113, 15, 210, 147, 238, 190, 59, 154, 132, 68, 71, 169, 167, 207, 123, 254, 78, 83, 98, 91, 137, 219, 44, 180, 70, 84, 58, 50, 109, 212, 114, 244, 145, 1, 210, 132, 8, 34, 183, 56, 245, 135, 142, 129, 125, 135, 178, 149, 218, 70, 210, 213, 59, 183, 89, 68, 44, 85, 207, 94, 64, 211, 152, 58, 125, 173, 176, 80, 12, 0, 130, 168, 162, 225, 76, 90, 1, 139, 27, 34, 76, 185, 154, 200, 61, 8, 149, 179, 173, 83, 66, 136, 237, 61, 59, 246, 58, 140, 138, 200, 99, 11, 206, 89, 6, 187, 137, 210, 211, 211, 29, 36, 97, 55, 83, 122, 186, 97, 73, 101, 99, 21, 190, 3, 19, 45, 31, 115, 105, 86, 236, 254, 33, 7, 0, 157, 185, 126, 253, 250, 227, 176, 125, 182, 66, 124, 48, 253, 118, 26, 77, 93, 19, 41, 102, 0, 238, 237, 106, 75, 61, 74, 9, 170, 79, 128, 172, 3, 171, 92, 223, 26, 20, 99, 38, 78, 177, 83, 143, 140, 41, 169, 169, 15, 178, 247, 92, 152, 44, 133, 8, 114, 184, 217, 78, 156, 191, 64, 191, 90, 242, 35, 125, 38, 108, 0, 37, 93, 188, 206, 18, 255, 62, 95, 123, 37, 141, 106, 121, 151, 245, 144, 9, 39, 198, 123, 164, 32, 177, 63, 3, 27, 174, 33, 59, 242, 132, 217, 179, 95, 108, 19, 53, 88, 69, 92, 3, 102, 49, 149, 255, 40, 211, 50, 105, 208, 184, 201, 244, 135, 245, 191, 209, 211, 89, 151, 196, 73, 133, 205, 109, 116, 58, 28, 52, 155, 180, 30, 55, 98, 146, 109, 48, 55, 159, 108, 122, 206, 201, 201, 121, 182, 184, 184, 180, 149, 86, 171, 253, 128, 173, 150, 90, 54, 16, 129, 99, 109, 157, 151, 151, 247, 162, 37, 209, 110, 213, 53, 215, 179, 223, 31, 19, 181, 64, 107, 144, 36, 211, 36, 87, 212, 135, 21, 188, 165, 40, 214, 106, 91, 106, 116, 58, 79, 157, 78, 231, 170, 209, 104, 122, 162, 212, 134, 232, 220, 248, 115, 136, 218, 127, 170, 10, 254, 219, 90, 159, 3, 229, 24, 22, 241, 125, 54, 23, 182, 96, 239, 77, 96, 114, 92, 138, 28, 45, 44, 162, 43, 127, 223, 74, 221, 71, 140, 163, 76, 99, 44, 38, 221, 253, 214, 126, 62, 96, 136, 119, 234, 166, 77, 98, 16, 169, 141, 228, 62, 172, 11, 199, 15, 23, 65, 197, 118, 134, 251, 51, 149, 7, 221, 200, 107, 40, 99, 117, 239, 222, 9, 164, 139, 247, 22, 210, 195, 175, 240, 147, 216, 4, 41, 104, 2, 2, 26, 110, 149, 86, 164, 166, 65, 129, 231, 37, 224, 116, 45, 42, 42, 122, 206, 216, 137, 171, 175, 164, 201, 143, 209, 150, 63, 159, 37, 228, 171, 150, 53, 16, 145, 7, 194, 122, 121, 76, 85, 70, 128, 194, 249, 130, 113, 49, 149, 201, 106, 190, 194, 252, 177, 18, 129, 2, 198, 203, 152, 172, 18, 170, 236, 148, 89, 49, 178, 245, 4, 111, 26, 240, 147, 25, 251, 82, 27, 2, 231, 104, 13, 76, 58, 213, 93, 108, 8, 145, 226, 142, 242, 4, 134, 168, 27, 40, 213, 235, 71, 11, 10, 135, 77, 29, 158, 247, 42, 98, 84, 20, 230, 212, 23, 185, 57, 21, 172, 143, 165, 176, 138, 221, 117, 56, 131, 14, 153, 62, 139, 18, 159, 80, 208, 26, 15, 146, 192, 62, 9, 67, 191, 249, 230, 142, 118, 116, 160, 184, 169, 140, 196, 214, 212, 9, 168, 37, 13, 51, 76, 214, 48, 239, 34, 180, 62, 227, 167, 190, 242, 114, 72, 116, 48, 113, 245, 251, 145, 116, 245, 206, 122, 178, 119, 63, 58, 108, 198, 28, 250, 251, 158, 125, 210, 234, 128, 35, 151, 79, 120, 161, 183, 110, 221, 122, 217, 192, 137, 117, 84, 70, 53, 221, 239, 16, 86, 123, 246, 169, 235, 54, 252, 184, 109, 239, 62, 186, 117, 247, 222, 27, 91, 118, 239, 189, 185, 181, 1, 200, 150, 93, 123, 11, 183, 238, 73, 167, 107, 126, 223, 178, 137, 157, 131, 70, 230, 172, 128, 193, 108, 10, 143, 75, 214, 173, 107, 175, 173, 94, 217, 213, 50, 43, 206, 77, 250, 251, 101, 18, 101, 154, 31, 141, 157, 252, 77, 239, 234, 144, 164, 234, 182, 123, 192, 102, 198, 15, 169, 39, 127, 249, 99, 23, 77, 221, 240, 27, 253, 105, 83, 26, 74, 173, 200, 239, 229, 143, 27, 55, 211, 152, 228, 20, 250, 98, 112, 228, 196, 114, 107, 99, 221, 114, 227, 8, 126, 198, 59, 52, 198, 188, 188, 188, 198, 60, 119, 125, 185, 108, 78, 61, 121, 33, 139, 78, 79, 93, 73, 223, 138, 26, 76, 25, 103, 92, 34, 94, 33, 115, 59, 13, 28, 214, 78, 185, 77, 224, 156, 42, 5, 225, 212, 182, 41, 71, 225, 203, 188, 227, 70, 156, 50, 103, 206, 147, 237, 250, 197, 119, 39, 30, 193, 51, 137, 147, 231, 49, 88, 29, 68, 76, 78, 166, 107, 182, 253, 73, 47, 95, 187, 46, 223, 203, 144, 35, 5, 181, 53, 35, 111, 220, 184, 209, 212, 192, 137, 110, 84, 47, 74, 115, 241, 136, 91, 231, 65, 195, 222, 34, 254, 225, 101, 164, 187, 31, 37, 174, 254, 122, 38, 148, 244, 104, 8, 226, 87, 126, 204, 108, 12, 116, 137, 73, 120, 15, 206, 69, 115, 213, 221, 150, 9, 67, 231, 236, 159, 189, 162, 18, 58, 196, 171, 169, 42, 97, 148, 198, 109, 232, 200, 50, 83, 226, 58, 68, 93, 230, 51, 124, 108, 89, 243, 62, 49, 101, 115, 150, 255, 172, 179, 86, 247, 15, 190, 133, 50, 168, 109, 62, 50, 229, 59, 218, 58, 122, 176, 244, 63, 174, 149, 236, 79, 109, 8, 236, 147, 71, 226, 168, 82, 176, 232, 252, 175, 111, 204, 185, 10, 235, 76, 213, 136, 242, 246, 111, 218, 245, 24, 42, 69, 161, 182, 119, 253, 129, 201, 50, 133, 164, 114, 89, 102, 224, 81, 249, 185, 248, 218, 216, 239, 82, 13, 252, 198, 208, 103, 149, 253, 222, 212, 127, 43, 183, 187, 204, 200, 239, 82, 141, 124, 175, 178, 227, 50, 103, 187, 166, 182, 111, 252, 28, 124, 220, 109, 201, 75, 189, 163, 214, 119, 140, 29, 226, 91, 151, 76, 174, 134, 242, 25, 217, 190, 65, 32, 214, 103, 60, 136, 238, 130, 164, 37, 221, 40, 160, 43, 54, 131, 57, 117, 124, 185, 57, 181, 135, 223, 134, 150, 145, 3, 131, 199, 45, 88, 240, 148, 50, 8, 71, 170, 182, 83, 175, 26, 36, 179, 139, 5, 147, 159, 146, 241, 33, 144, 194, 59, 105, 212, 167, 196, 187, 247, 120, 210, 89, 181, 159, 168, 122, 233, 3, 198, 78, 166, 63, 254, 150, 70, 179, 174, 230, 201, 115, 17, 68, 0, 109, 96, 18, 149, 95, 82, 242, 154, 129, 160, 31, 251, 250, 160, 93, 6, 142, 250, 162, 121, 244, 184, 41, 31, 71, 79, 248, 242, 195, 136, 49, 95, 182, 142, 248, 130, 137, 252, 88, 71, 37, 114, 220, 212, 86, 210, 62, 90, 32, 226, 111, 34, 199, 77, 106, 21, 241, 197, 228, 54, 97, 163, 238, 204, 95, 50, 103, 130, 142, 80, 79, 127, 228, 209, 128, 240, 86, 164, 163, 123, 107, 182, 210, 108, 69, 156, 189, 90, 27, 149, 79, 93, 91, 125, 30, 51, 248, 83, 246, 179, 102, 39, 207, 159, 159, 204, 125, 136, 58, 107, 105, 144, 58, 157, 238, 52, 241, 14, 110, 69, 222, 254, 236, 67, 226, 17, 242, 17, 27, 203, 166, 247, 167, 182, 164, 131, 107, 171, 87, 123, 71, 127, 236, 18, 175, 254, 151, 21, 124, 147, 24, 41, 94, 183, 125, 57, 54, 181, 247, 215, 21, 230, 212, 187, 98, 87, 74, 75, 75, 91, 179, 247, 39, 49, 57, 90, 110, 217, 40, 149, 162, 83, 7, 124, 53, 131, 66, 28, 11, 233, 226, 113, 224, 153, 94, 145, 137, 177, 147, 147, 223, 172, 15, 26, 99, 21, 149, 167, 84, 59, 41, 194, 85, 17, 252, 3, 43, 219, 192, 164, 241, 45, 152, 86, 145, 72, 186, 120, 237, 34, 61, 3, 181, 30, 108, 69, 1, 129, 63, 23, 174, 92, 149, 39, 165, 27, 76, 214, 65, 73, 185, 162, 162, 162, 231, 141, 4, 253, 96, 241, 231, 250, 15, 155, 106, 220, 192, 35, 106, 160, 102, 235, 226, 6, 124, 45, 236, 185, 139, 5, 165, 122, 98, 103, 5, 145, 44, 120, 247, 154, 76, 76, 249, 24, 1, 60, 0, 103, 52, 111, 42, 80, 86, 90, 86, 38, 21, 118, 24, 53, 103, 1, 181, 13, 142, 166, 108, 1, 7, 45, 27, 147, 85, 9, 234, 54, 10, 133, 199, 6, 184, 66, 213, 144, 163, 255, 225, 224, 91, 220, 209, 179, 240, 54, 252, 213, 99, 223, 34, 129, 225, 67, 73, 55, 223, 63, 137, 91, 128, 70, 197, 8, 115, 217, 134, 205, 162, 134, 153, 199, 3, 18, 220, 161, 226, 130, 33, 255, 229, 61, 24, 28, 118, 220, 244, 235, 88, 77, 105, 116, 240, 224, 193, 135, 211, 210, 50, 30, 73, 75, 75, 171, 211, 34, 237, 103, 70, 198, 35, 107, 210, 211, 31, 146, 253, 208, 97, 82, 196, 179, 105, 9, 227, 81, 209, 97, 41, 41, 14, 80, 96, 252, 14, 81, 131, 148, 7, 237, 152, 43, 144, 2, 18, 29, 157, 220, 8, 156, 245, 230, 8, 236, 47, 92, 51, 166, 245, 253, 100, 69, 146, 148, 83, 72, 250, 193, 182, 51, 216, 121, 33, 229, 185, 88, 142, 42, 43, 9, 108, 75, 50, 65, 183, 96, 247, 73, 152, 117, 100, 199, 142, 29, 15, 90, 105, 220, 74, 99, 151, 231, 48, 54, 66, 169, 146, 60, 192, 253, 236, 210, 184, 38, 213, 21, 114, 239, 52, 72, 83, 249, 238, 236, 189, 119, 249, 130, 52, 93, 138, 39, 130, 238, 25, 39, 79, 209, 41, 139, 83, 233, 155, 145, 131, 202, 253, 140, 30, 65, 139, 218, 68, 15, 114, 217, 113, 225, 194, 131, 74, 115, 170, 245, 115, 26, 235, 129, 102, 96, 42, 39, 51, 64, 61, 246, 237, 231, 122, 69, 37, 144, 174, 62, 59, 153, 134, 169, 11, 28, 59, 153, 174, 222, 250, 7, 205, 187, 81, 40, 22, 47, 152, 193, 228, 83, 34, 4, 14, 201, 133, 111, 107, 194, 28, 75, 235, 149, 61, 252, 158, 175, 56, 109, 44, 104, 11, 101, 13, 177, 19, 162, 98, 255, 180, 98, 250, 135, 236, 216, 108, 41, 248, 94, 172, 125, 108, 54, 117, 57, 82, 17, 209, 176, 230, 19, 65, 49, 184, 99, 158, 134, 5, 43, 123, 239, 35, 38, 99, 153, 236, 151, 93, 17, 80, 100, 6, 2, 112, 62, 28, 48, 20, 52, 198, 60, 166, 240, 172, 104, 29, 25, 235, 175, 78, 73, 121, 90, 73, 140, 66, 78, 35, 194, 60, 179, 172, 202, 206, 80, 72, 111, 248, 152, 9, 239, 17, 191, 62, 163, 72, 103, 207, 131, 196, 187, 55, 141, 249, 122, 38, 221, 146, 126, 128, 150, 148, 86, 204, 121, 251, 152, 12, 49, 224, 191, 180, 90, 167, 18, 121, 64, 23, 22, 22, 62, 83, 90, 90, 218, 142, 201, 167, 13, 72, 62, 97, 210, 161, 164, 164, 228, 117, 75, 110, 238, 186, 50, 9, 176, 253, 56, 101, 165, 136, 84, 185, 210, 206, 153, 123, 184, 239, 182, 214, 24, 183, 90, 173, 246, 67, 222, 25, 197, 135, 137, 31, 164, 96, 137, 143, 202, 231, 230, 136, 57, 223, 55, 181, 125, 99, 191, 55, 244, 62, 175, 211, 233, 107, 201, 126, 26, 251, 111, 113, 91, 149, 109, 207, 212, 255, 26, 122, 173, 252, 174, 248, 200, 5, 206, 127, 16, 187, 151, 154, 214, 69, 162, 20, 44, 55, 118, 134, 50, 11, 32, 207, 157, 189, 231, 204, 228, 27, 158, 255, 46, 173, 26, 51, 78, 157, 161, 211, 127, 92, 73, 219, 12, 76, 96, 196, 232, 157, 79, 92, 124, 214, 188, 23, 17, 19, 50, 97, 246, 162, 23, 149, 126, 70, 158, 17, 129, 11, 192, 234, 106, 153, 134, 242, 49, 225, 194, 185, 15, 29, 245, 49, 216, 178, 73, 23, 175, 51, 141, 123, 247, 163, 95, 204, 95, 204, 84, 250, 211, 98, 132, 236, 10, 40, 90, 32, 94, 4, 190, 58, 175, 86, 238, 165, 108, 202, 101, 143, 51, 27, 112, 74, 214, 73, 225, 60, 216, 153, 51, 185, 243, 27, 45, 133, 201, 22, 30, 189, 188, 241, 30, 8, 4, 125, 109, 98, 242, 43, 84, 218, 97, 164, 166, 181, 82, 10, 136, 76, 178, 215, 248, 182, 229, 255, 178, 230, 190, 175, 231, 157, 119, 32, 151, 248, 97, 115, 206, 181, 57, 36, 201, 30, 255, 194, 140, 194, 58, 133, 100, 217, 124, 89, 155, 243, 172, 48, 55, 26, 141, 237, 96, 239, 55, 129, 52, 61, 238, 234, 146, 162, 82, 33, 239, 61, 253, 200, 49, 58, 121, 209, 82, 250, 46, 244, 103, 132, 186, 169, 221, 124, 87, 189, 22, 26, 29, 60, 230, 187, 239, 94, 82, 108, 194, 182, 193, 251, 25, 107, 90, 187, 52, 84, 91, 22, 252, 77, 31, 70, 199, 186, 17, 85, 224, 79, 236, 226, 92, 239, 24, 63, 130, 46, 221, 240, 27, 189, 122, 253, 134, 88, 229, 103, 136, 216, 19, 83, 232, 133, 105, 83, 133, 201, 70, 186, 192, 87, 174, 92, 105, 147, 119, 45, 127, 82, 110, 126, 254, 24, 38, 99, 65, 174, 241, 71, 229, 115, 67, 114, 77, 144, 170, 124, 150, 107, 226, 59, 134, 246, 229, 154, 226, 125, 83, 219, 48, 118, 28, 121, 215, 111, 140, 202, 187, 126, 253, 203, 27, 55, 10, 189, 204, 213, 18, 5, 146, 116, 44, 209, 104, 164, 106, 55, 26, 109, 41, 213, 233, 245, 144, 252, 44, 61, 42, 159, 27, 146, 82, 225, 59, 165, 38, 62, 211, 25, 248, 94, 169, 78, 87, 19, 57, 146, 58, 109, 105, 169, 22, 182, 93, 170, 171, 252, 88, 74, 77, 28, 163, 242, 216, 96, 123, 90, 94, 116, 227, 102, 241, 173, 162, 191, 50, 50, 154, 87, 151, 36, 101, 83, 214, 185, 236, 236, 54, 151, 174, 92, 137, 204, 185, 114, 37, 36, 59, 231, 106, 40, 74, 109, 72, 78, 40, 156, 255, 172, 203, 151, 35, 78, 93, 184, 240, 186, 120, 125, 238, 177, 235, 195, 209, 80, 238, 162, 140, 236, 236, 130, 167, 121, 95, 70, 168, 124, 179, 75, 110, 119, 5, 233, 26, 144, 231, 158, 48, 115, 46, 125, 150, 41, 40, 144, 255, 78, 92, 253, 83, 223, 12, 239, 239, 103, 176, 63, 163, 172, 53, 162, 219, 160, 246, 125, 152, 241, 95, 167, 252, 171, 89, 88, 255, 193, 236, 162, 165, 51, 45, 147, 14, 157, 49, 71, 106, 211, 34, 119, 142, 103, 50, 71, 171, 213, 190, 175, 36, 75, 115, 255, 88, 46, 201, 215, 115, 136, 250, 181, 7, 130, 34, 174, 176, 85, 83, 9, 233, 238, 155, 79, 186, 251, 21, 176, 199, 194, 242, 71, 89, 148, 175, 149, 2, 159, 203, 223, 49, 244, 91, 241, 115, 99, 191, 173, 236, 115, 67, 251, 162, 252, 79, 67, 219, 49, 182, 63, 126, 215, 217, 66, 68, 75, 60, 130, 79, 127, 30, 21, 247, 2, 95, 189, 152, 158, 184, 229, 107, 244, 92, 235, 103, 223, 233, 59, 240, 154, 235, 136, 241, 180, 235, 208, 145, 212, 101, 216, 168, 26, 23, 103, 38, 222, 35, 191, 160, 36, 180, 63, 93, 184, 250, 151, 10, 13, 176, 58, 121, 146, 252, 167, 210, 118, 146, 151, 254, 68, 223, 142, 142, 167, 110, 73, 99, 172, 190, 239, 93, 153, 116, 79, 24, 77, 63, 100, 171, 243, 255, 69, 199, 209, 78, 131, 18, 186, 139, 99, 208, 18, 200, 191, 233, 60, 40, 169, 213, 131, 65, 125, 117, 164, 103, 96, 49, 241, 232, 85, 76, 84, 65, 40, 181, 35, 183, 152, 20, 17, 247, 160, 178, 87, 122, 71, 159, 28, 52, 105, 210, 195, 124, 66, 178, 169, 65, 66, 116, 16, 2, 182, 12, 18, 242, 201, 156, 156, 103, 217, 103, 237, 153, 36, 112, 75, 70, 142, 180, 26, 44, 43, 175, 151, 186, 228, 215, 77, 20, 98, 66, 216, 220, 90, 70, 58, 123, 30, 37, 158, 189, 82, 218, 197, 196, 119, 159, 177, 120, 241, 19, 138, 21, 153, 45, 220, 247, 210, 60, 141, 196, 88, 55, 72, 211, 80, 30, 141, 207, 240, 177, 237, 136, 87, 200, 124, 210, 197, 43, 255, 243, 120, 53, 93, 177, 121, 11, 45, 42, 209, 200, 154, 196, 90, 38, 157, 148, 102, 88, 115, 180, 89, 120, 108, 26, 29, 221, 184, 211, 192, 132, 169, 174, 241, 35, 150, 245, 24, 50, 124, 161, 235, 144, 225, 139, 26, 134, 140, 88, 224, 58, 68, 157, 218, 45, 110, 248, 228, 183, 7, 13, 122, 216, 156, 21, 176, 252, 57, 228, 54, 182, 142, 26, 60, 161, 105, 104, 191, 185, 111, 132, 245, 255, 246, 223, 97, 3, 82, 254, 29, 218, 127, 86, 77, 202, 235, 97, 253, 82, 62, 31, 56, 116, 14, 121, 252, 253, 175, 255, 220, 127, 96, 183, 220, 219, 170, 122, 36, 89, 158, 99, 89, 124, 235, 86, 174, 115, 92, 82, 10, 241, 11, 79, 121, 55, 98, 160, 213, 247, 253, 13, 38, 77, 66, 163, 191, 253, 32, 50, 118, 110, 251, 1, 67, 230, 181, 138, 138, 125, 67, 28, 131, 150, 90, 97, 224, 177, 101, 116, 244, 139, 157, 99, 135, 205, 238, 30, 159, 180, 216, 37, 110, 248, 194, 110, 241, 73, 223, 163, 212, 154, 44, 96, 146, 250, 249, 192, 97, 163, 76, 45, 52, 21, 145, 221, 98, 48, 154, 108, 26, 53, 84, 200, 190, 210, 116, 184, 121, 105, 105, 15, 104, 52, 26, 104, 66, 239, 201, 100, 34, 147, 205, 76, 42, 10, 109, 67, 38, 193, 134, 157, 187, 169, 122, 246, 124, 250, 182, 84, 249, 198, 231, 58, 233, 236, 241, 59, 241, 15, 79, 12, 72, 26, 215, 42, 51, 243, 206, 66, 228, 48, 255, 74, 145, 216, 24, 124, 83, 183, 33, 247, 200, 20, 223, 3, 135, 241, 139, 193, 209, 160, 93, 30, 33, 193, 81, 52, 249, 135, 159, 232, 165, 220, 107, 242, 88, 216, 10, 206, 103, 69, 244, 150, 125, 37, 75, 51, 92, 25, 221, 62, 25, 230, 157, 139, 58, 112, 206, 216, 117, 29, 103, 165, 244, 15, 185, 246, 235, 188, 123, 126, 16, 213, 153, 128, 112, 242, 170, 219, 119, 82, 249, 220, 35, 146, 159, 85, 250, 239, 102, 103, 103, 63, 116, 139, 210, 87, 216, 118, 62, 97, 18, 204, 251, 254, 254, 194, 235, 238, 22, 75, 55, 4, 91, 52, 158, 203, 185, 76, 55, 236, 216, 77, 199, 126, 247, 61, 109, 63, 40, 145, 146, 158, 1, 197, 196, 201, 227, 0, 233, 17, 48, 227, 237, 240, 1, 238, 208, 196, 194, 192, 132, 107, 143, 62, 198, 251, 221, 127, 169, 72, 9, 249, 180, 255, 16, 21, 113, 15, 216, 66, 220, 131, 232, 240, 148, 239, 232, 169, 139, 89, 242, 196, 7, 1, 18, 109, 132, 239, 154, 246, 87, 178, 207, 128, 144, 165, 40, 220, 6, 40, 92, 107, 183, 177, 112, 22, 176, 225, 43, 102, 118, 77, 212, 247, 64, 136, 173, 186, 188, 109, 144, 180, 232, 97, 26, 224, 207, 86, 104, 145, 85, 38, 164, 143, 248, 195, 118, 51, 51, 51, 27, 149, 19, 80, 13, 9, 52, 19, 128, 58, 156, 214, 32, 57, 216, 22, 155, 208, 26, 234, 184, 189, 215, 114, 123, 188, 151, 11, 188, 151, 146, 158, 238, 0, 99, 230, 194, 133, 11, 15, 130, 240, 188, 213, 74, 175, 237, 134, 131, 7, 31, 230, 253, 20, 255, 11, 233, 110, 76, 220, 152, 244, 130, 60, 93, 38, 131, 153, 12, 99, 50, 138, 201, 20, 88, 192, 241, 130, 246, 224, 71, 60, 205, 11, 177, 148, 15, 126, 125, 153, 212, 160, 24, 10, 135, 207, 95, 179, 142, 246, 159, 50, 157, 54, 143, 136, 133, 82, 145, 55, 136, 147, 231, 126, 226, 22, 48, 251, 249, 224, 136, 32, 191, 196, 209, 255, 49, 230, 62, 145, 10, 138, 35, 49, 214, 51, 255, 101, 91, 165, 41, 118, 100, 59, 226, 29, 178, 10, 106, 136, 66, 177, 245, 115, 151, 46, 203, 99, 232, 251, 155, 55, 111, 190, 32, 172, 236, 76, 13, 94, 155, 6, 46, 85, 186, 30, 247, 82, 160, 183, 158, 176, 240, 217, 107, 5, 146, 212, 9, 229, 18, 95, 133, 237, 66, 111, 213, 58, 124, 190, 113, 220, 214, 226, 125, 1, 243, 7, 20, 11, 16, 138, 7, 56, 84, 162, 245, 61, 173, 209, 208, 183, 121, 255, 68, 232, 134, 241, 37, 239, 44, 179, 147, 71, 148, 231, 153, 106, 22, 174, 231, 36, 88, 80, 124, 139, 230, 92, 187, 78, 143, 157, 61, 79, 255, 56, 112, 136, 166, 110, 252, 157, 78, 88, 176, 132, 6, 141, 157, 76, 255, 211, 119, 32, 104, 137, 69, 164, 147, 234, 4, 113, 246, 90, 75, 188, 130, 199, 126, 24, 17, 235, 214, 119, 252, 212, 215, 140, 104, 28, 229, 100, 143, 254, 197, 134, 1, 168, 254, 34, 174, 200, 161, 6, 41, 35, 203, 213, 108, 245, 68, 199, 207, 91, 68, 111, 220, 148, 172, 15, 80, 105, 61, 88, 212, 64, 241, 204, 221, 183, 38, 44, 123, 254, 248, 36, 184, 89, 172, 96, 110, 149, 127, 187, 69, 156, 8, 241, 76, 55, 248, 113, 102, 163, 40, 207, 102, 50, 47, 251, 242, 229, 203, 207, 65, 239, 88, 158, 47, 57, 138, 183, 113, 219, 195, 199, 104, 137, 168, 245, 65, 36, 41, 4, 205, 236, 56, 120, 152, 254, 188, 101, 59, 157, 179, 114, 13, 29, 199, 230, 170, 129, 95, 207, 148, 130, 104, 122, 36, 140, 150, 2, 225, 218, 198, 38, 208, 22, 209, 131, 105, 19, 104, 68, 236, 23, 166, 39, 61, 3, 139, 72, 23, 175, 108, 210, 81, 117, 152, 116, 116, 223, 64, 92, 124, 191, 37, 62, 33, 131, 160, 202, 205, 128, 9, 83, 155, 165, 243, 42, 84, 119, 207, 145, 97, 14, 224, 91, 172, 138, 239, 27, 81, 143, 180, 75, 238, 183, 172, 24, 196, 189, 212, 227, 219, 19, 85, 208, 78, 226, 223, 135, 174, 220, 188, 69, 30, 163, 11, 132, 155, 192, 225, 62, 186, 89, 237, 27, 176, 216, 26, 33, 201, 183, 4, 130, 211, 89, 193, 212, 58, 84, 54, 203, 215, 128, 95, 170, 161, 94, 59, 187, 251, 228, 254, 178, 53, 53, 230, 68, 128, 41, 85, 163, 209, 52, 99, 223, 113, 229, 17, 163, 75, 184, 69, 35, 71, 30, 143, 160, 253, 229, 21, 20, 210, 35, 167, 207, 210, 141, 187, 246, 208, 217, 140, 4, 135, 78, 159, 77, 123, 38, 141, 161, 77, 194, 25, 225, 121, 4, 151, 16, 23, 239, 28, 210, 217, 35, 131, 105, 127, 105, 196, 201, 115, 41, 123, 157, 76, 122, 248, 141, 96, 115, 86, 127, 226, 27, 26, 76, 124, 195, 124, 158, 12, 140, 244, 104, 18, 18, 213, 227, 127, 125, 99, 62, 235, 26, 151, 240, 65, 248, 196, 137, 175, 39, 167, 166, 62, 83, 201, 220, 5, 46, 16, 71, 152, 15, 49, 69, 3, 97, 208, 71, 38, 105, 150, 130, 137, 196, 105, 112, 98, 95, 226, 226, 115, 61, 96, 244, 68, 90, 84, 34, 45, 232, 54, 11, 55, 200, 3, 117, 253, 6, 198, 139, 122, 231, 121, 16, 72, 210, 69, 32, 58, 125, 53, 72, 82, 126, 124, 199, 218, 36, 137, 215, 175, 78, 47, 58, 229, 124, 66, 163, 68, 126, 225, 194, 5, 176, 86, 188, 207, 36, 144, 155, 73, 55, 112, 19, 105, 177, 60, 128, 174, 23, 221, 148, 200, 112, 221, 31, 59, 233, 180, 165, 203, 105, 196, 164, 175, 105, 203, 254, 241, 148, 120, 5, 107, 24, 241, 101, 19, 39, 143, 116, 210, 213, 251, 39, 210, 51, 104, 34, 211, 6, 195, 223, 10, 139, 233, 216, 51, 62, 169, 57, 148, 113, 179, 66, 177, 1, 91, 217, 159, 40, 103, 3, 96, 25, 56, 132, 217, 154, 165, 24, 136, 34, 149, 79, 10, 236, 147, 70, 252, 194, 101, 95, 229, 42, 225, 166, 113, 172, 229, 202, 24, 38, 1, 254, 177, 146, 18, 157, 139, 86, 167, 243, 103, 43, 88, 111, 141, 78, 231, 195, 30, 185, 232, 12, 136, 198, 200, 115, 67, 191, 211, 24, 121, 52, 182, 77, 77, 21, 254, 79, 103, 198, 62, 8, 219, 135, 227, 211, 233, 188, 217, 115, 95, 56, 222, 2, 74, 159, 18, 9, 71, 32, 201, 65, 86, 244, 71, 238, 183, 54, 177, 201, 218, 72, 161, 70, 243, 22, 187, 118, 1, 229, 199, 100, 224, 120, 13, 94, 75, 67, 215, 197, 216, 181, 209, 153, 113, 206, 45, 253, 142, 198, 204, 49, 97, 244, 250, 122, 179, 99, 14, 44, 214, 106, 91, 214, 246, 98, 65, 32, 197, 70, 166, 22, 64, 57, 229, 249, 132, 80, 171, 52, 156, 215, 141, 222, 198, 77, 165, 101, 178, 153, 244, 226, 213, 92, 186, 227, 224, 223, 116, 254, 154, 95, 233, 224, 105, 41, 229, 17, 163, 222, 33, 58, 226, 204, 200, 176, 147, 106, 23, 233, 230, 179, 136, 189, 30, 254, 127, 17, 253, 61, 189, 134, 140, 250, 223, 93, 125, 19, 141, 107, 126, 118, 21, 57, 226, 162, 200, 239, 139, 62, 68, 89, 202, 207, 41, 46, 194, 16, 213, 135, 83, 116, 114, 69, 250, 200, 135, 145, 177, 179, 137, 103, 111, 122, 250, 98, 54, 140, 251, 61, 90, 173, 246, 93, 81, 67, 169, 75, 189, 44, 133, 170, 54, 175, 54, 240, 18, 95, 62, 10, 114, 148, 207, 203, 60, 69, 250, 70, 117, 186, 126, 140, 168, 1, 45, 82, 222, 223, 197, 13, 248, 218, 237, 85, 142, 231, 26, 38, 67, 209, 116, 106, 212, 135, 8, 193, 52, 156, 16, 251, 240, 38, 193, 127, 136, 249, 132, 183, 180, 165, 244, 116, 246, 37, 186, 121, 119, 58, 157, 182, 108, 57, 237, 253, 197, 20, 250, 122, 159, 24, 136, 22, 133, 224, 152, 99, 164, 179, 199, 106, 210, 51, 96, 124, 211, 208, 126, 254, 62, 9, 99, 62, 152, 185, 112, 197, 179, 38, 119, 174, 109, 121, 190, 33, 148, 226, 148, 162, 72, 235, 93, 131, 97, 196, 125, 15, 149, 80, 39, 246, 163, 126, 131, 191, 127, 46, 98, 48, 61, 156, 121, 74, 14, 218, 248, 142, 173, 124, 155, 43, 110, 184, 90, 239, 101, 41, 147, 245, 212, 121, 243, 30, 79, 63, 148, 49, 48, 227, 120, 230, 136, 67, 199, 142, 37, 50, 73, 106, 0, 146, 120, 232, 232, 241, 225, 135, 142, 28, 75, 60, 114, 228, 200, 63, 196, 73, 80, 56, 63, 187, 249, 156, 166, 177, 194, 100, 254, 182, 124, 221, 173, 125, 253, 210, 246, 236, 233, 124, 232, 216, 137, 209, 135, 79, 156, 72, 104, 8, 215, 238, 239, 99, 39, 18, 15, 31, 63, 62, 236, 224, 209, 227, 99, 217, 49, 59, 11, 231, 194, 198, 202, 132, 104, 103, 78, 238, 225, 177, 99, 199, 30, 101, 159, 181, 224, 249, 132, 223, 240, 60, 234, 44, 217, 68, 127, 83, 163, 165, 39, 47, 100, 209, 245, 59, 118, 211, 47, 23, 45, 165, 62, 163, 38, 208, 39, 67, 162, 40, 233, 238, 123, 77, 106, 28, 223, 213, 123, 17, 241, 232, 21, 247, 78, 248, 192, 46, 49, 227, 167, 52, 173, 196, 69, 99, 7, 100, 40, 229, 25, 170, 121, 83, 122, 36, 67, 196, 253, 2, 177, 122, 79, 155, 126, 113, 211, 137, 42, 152, 78, 91, 250, 19, 45, 40, 143, 126, 213, 240, 226, 233, 93, 84, 119, 23, 94, 119, 168, 204, 119, 81, 19, 144, 203, 142, 65, 117, 22, 18, 58, 0, 186, 124, 151, 17, 223, 48, 74, 124, 67, 105, 249, 163, 44, 202, 215, 166, 36, 84, 248, 126, 168, 129, 247, 204, 249, 93, 101, 223, 11, 179, 112, 127, 194, 12, 236, 15, 123, 244, 238, 173, 39, 193, 253, 232, 11, 33, 145, 35, 229, 213, 184, 96, 114, 125, 142, 23, 34, 175, 78, 100, 171, 172, 69, 238, 176, 182, 73, 80, 46, 222, 239, 50, 120, 216, 187, 255, 236, 29, 93, 126, 60, 62, 161, 22, 156, 167, 234, 156, 199, 154, 248, 190, 185, 219, 168, 184, 118, 101, 36, 160, 47, 37, 1, 125, 46, 116, 138, 81, 63, 89, 190, 82, 85, 217, 85, 147, 20, 43, 245, 35, 206, 155, 55, 15, 250, 96, 66, 80, 141, 7, 175, 77, 10, 69, 229, 207, 201, 99, 164, 164, 148, 105, 136, 89, 217, 116, 227, 206, 61, 116, 202, 226, 101, 82, 121, 67, 251, 94, 17, 148, 116, 243, 205, 37, 78, 158, 123, 73, 15, 191, 249, 108, 255, 7, 124, 16, 53, 168, 125, 204, 152, 41, 255, 172, 100, 233, 109, 71, 4, 95, 32, 143, 28, 69, 66, 68, 220, 231, 26, 165, 112, 163, 122, 13, 27, 233, 76, 84, 65, 127, 65, 197, 30, 8, 193, 190, 154, 95, 145, 155, 123, 148, 87, 114, 121, 159, 220, 157, 35, 229, 96, 170, 78, 162, 53, 33, 59, 224, 59, 196, 12, 253, 216, 105, 80, 194, 36, 151, 184, 225, 163, 156, 227, 18, 199, 56, 15, 98, 18, 87, 207, 133, 29, 35, 28, 111, 215, 65, 137, 19, 157, 99, 135, 180, 224, 167, 196, 86, 158, 28, 161, 72, 132, 16, 112, 83, 213, 122, 116, 178, 6, 26, 45, 154, 71, 173, 121, 237, 90, 66, 169, 195, 216, 161, 113, 93, 7, 39, 141, 103, 50, 186, 222, 95, 55, 89, 6, 39, 141, 236, 26, 55, 124, 98, 151, 65, 137, 225, 21, 228, 104, 193, 34, 196, 0, 41, 26, 250, 173, 205, 245, 235, 183, 94, 102, 159, 57, 241, 164, 251, 229, 188, 226, 76, 137, 236, 108, 190, 120, 37, 151, 110, 221, 247, 151, 212, 230, 169, 215, 184, 47, 233, 83, 33, 108, 193, 210, 205, 135, 105, 136, 30, 251, 152, 166, 184, 144, 17, 249, 192, 207, 7, 14, 235, 16, 55, 109, 218, 11, 38, 38, 13, 187, 10, 255, 32, 250, 3, 17, 13, 2, 188, 178, 142, 252, 178, 75, 108, 130, 63, 187, 97, 118, 49, 77, 141, 14, 155, 57, 87, 106, 17, 163, 191, 61, 1, 167, 243, 166, 163, 109, 12, 104, 152, 182, 156, 52, 237, 148, 166, 64, 43, 50, 37, 70, 170, 9, 164, 35, 248, 249, 250, 85, 211, 212, 42, 107, 159, 208, 1, 225, 37, 249, 122, 90, 123, 156, 225, 149, 187, 77, 104, 149, 16, 162, 173, 80, 176, 219, 160, 150, 120, 177, 160, 224, 41, 190, 56, 138, 226, 254, 232, 116, 158, 255, 44, 225, 234, 141, 2, 186, 39, 227, 168, 20, 84, 211, 111, 234, 116, 250, 223, 200, 65, 220, 135, 232, 254, 55, 233, 226, 181, 148, 105, 242, 241, 159, 197, 14, 235, 52, 230, 155, 57, 47, 27, 187, 87, 165, 124, 66, 217, 76, 138, 247, 30, 162, 161, 67, 89, 15, 214, 43, 81, 221, 150, 184, 7, 205, 39, 93, 189, 175, 64, 15, 53, 232, 6, 1, 205, 70, 133, 220, 2, 208, 48, 103, 49, 81, 201, 21, 124, 12, 220, 236, 118, 230, 228, 90, 89, 106, 38, 6, 130, 110, 104, 2, 147, 21, 92, 35, 113, 65, 35, 144, 228, 146, 106, 146, 164, 28, 236, 243, 131, 112, 237, 106, 100, 145, 211, 16, 175, 93, 69, 191, 88, 149, 74, 92, 88, 154, 157, 143, 8, 17, 221, 16, 39, 192, 19, 243, 191, 226, 253, 74, 43, 34, 77, 161, 250, 12, 220, 155, 203, 55, 111, 161, 73, 223, 126, 71, 59, 64, 148, 169, 103, 176, 134, 116, 241, 60, 197, 100, 13, 233, 25, 56, 242, 205, 240, 152, 238, 49, 83, 36, 31, 162, 163, 49, 115, 105, 83, 54, 190, 42, 198, 24, 46, 106, 16, 8, 195, 230, 87, 101, 155, 162, 201, 75, 150, 60, 221, 188, 207, 128, 32, 226, 234, 191, 134, 184, 120, 231, 189, 223, 63, 94, 106, 62, 186, 151, 173, 82, 111, 150, 84, 204, 201, 121, 188, 54, 236, 8, 38, 237, 242, 243, 243, 159, 48, 178, 74, 150, 203, 87, 57, 96, 21, 23, 107, 41, 104, 210, 66, 228, 68, 53, 138, 8, 232, 5, 19, 173, 147, 124, 157, 240, 204, 214, 200, 181, 178, 21, 239, 1, 99, 223, 43, 46, 46, 126, 17, 58, 248, 240, 228, 252, 21, 220, 108, 122, 75, 90, 5, 233, 244, 244, 76, 118, 142, 228, 71, 252, 114, 209, 50, 170, 26, 62, 142, 18, 255, 112, 104, 4, 156, 205, 8, 113, 43, 113, 15, 72, 126, 54, 36, 210, 191, 123, 124, 210, 127, 33, 209, 223, 168, 38, 43, 228, 19, 162, 255, 16, 129, 168, 138, 105, 236, 118, 241, 226, 10, 36, 76, 153, 249, 207, 247, 35, 6, 6, 17, 183, 128, 165, 196, 201, 227, 2, 233, 21, 73, 99, 190, 154, 73, 87, 109, 217, 78, 207, 229, 92, 17, 39, 222, 44, 94, 133, 31, 110, 242, 14, 144, 115, 101, 100, 210, 176, 71, 210, 172, 58, 57, 242, 199, 55, 171, 25, 201, 42, 155, 90, 255, 18, 2, 129, 176, 92, 151, 245, 73, 209, 222, 136, 150, 248, 36, 213, 106, 63, 228, 233, 23, 179, 121, 181, 154, 219, 102, 211, 252, 2, 186, 251, 239, 35, 244, 187, 85, 191, 208, 190, 147, 146, 233, 43, 80, 161, 6, 122, 158, 66, 164, 105, 119, 191, 5, 141, 131, 34, 250, 119, 137, 77, 248, 4, 146, 241, 141, 105, 239, 70, 124, 136, 8, 4, 194, 90, 132, 201, 77, 69, 119, 76, 156, 139, 215, 174, 125, 162, 203, 224, 196, 206, 196, 51, 120, 162, 148, 56, 220, 221, 239, 102, 155, 129, 9, 82, 205, 197, 205, 123, 246, 209, 75, 121, 215, 196, 137, 248, 18, 239, 229, 6, 17, 118, 61, 75, 74, 74, 154, 24, 153, 84, 108, 148, 97, 236, 88, 165, 197, 232, 4, 236, 200, 31, 67, 171, 25, 213, 42, 107, 159, 253, 249, 246, 26, 225, 217, 181, 248, 90, 216, 24, 112, 47, 220, 61, 110, 153, 214, 166, 209, 104, 222, 16, 250, 27, 110, 98, 114, 94, 214, 228, 33, 253, 226, 232, 217, 243, 244, 231, 180, 109, 116, 196, 172, 121, 180, 253, 160, 36, 74, 60, 122, 105, 73, 103, 143, 147, 108, 81, 186, 138, 120, 4, 143, 248, 52, 58, 222, 37, 113, 218, 236, 87, 141, 5, 239, 72, 249, 135, 183, 235, 146, 226, 189, 131, 64, 220, 75, 8, 189, 44, 239, 210, 52, 98, 166, 76, 111, 250, 98, 239, 40, 63, 70, 150, 179, 137, 147, 231, 33, 210, 51, 176, 4, 42, 112, 64, 239, 54, 200, 185, 130, 94, 110, 186, 219, 113, 151, 5, 76, 14, 48, 89, 8, 147, 51, 4, 32, 20, 20, 20, 60, 85, 201, 138, 220, 170, 61, 232, 234, 193, 196, 44, 251, 35, 127, 168, 6, 73, 202, 46, 102, 40, 187, 244, 56, 106, 145, 102, 19, 162, 157, 57, 245, 88, 139, 138, 138, 32, 53, 167, 3, 147, 56, 38, 169, 76, 142, 240, 224, 40, 90, 202, 238, 133, 243, 151, 175, 208, 223, 247, 238, 167, 95, 255, 240, 147, 148, 143, 72, 2, 251, 130, 217, 244, 50, 233, 236, 185, 141, 184, 250, 127, 253, 120, 80, 164, 127, 128, 122, 236, 219, 7, 15, 30, 124, 216, 240, 63, 148, 251, 17, 43, 114, 16, 145, 20, 17, 136, 186, 163, 93, 194, 77, 89, 238, 191, 188, 59, 223, 11, 72, 205, 51, 113, 116, 179, 231, 67, 34, 3, 161, 119, 27, 35, 205, 125, 164, 135, 127, 1, 68, 216, 13, 74, 254, 150, 46, 221, 240, 27, 61, 148, 121, 74, 238, 72, 34, 3, 10, 34, 111, 103, 50, 157, 73, 111, 38, 45, 161, 18, 136, 153, 166, 44, 199, 134, 68, 156, 130, 169, 21, 250, 244, 157, 85, 16, 94, 85, 114, 35, 199, 138, 218, 41, 194, 228, 56, 51, 232, 22, 200, 204, 204, 108, 204, 62, 123, 151, 39, 233, 207, 228, 173, 159, 174, 86, 56, 237, 11, 10, 105, 250, 145, 227, 116, 225, 218, 245, 180, 255, 212, 233, 244, 45, 232, 111, 232, 234, 95, 32, 45, 40, 187, 251, 46, 38, 254, 97, 49, 159, 244, 143, 55, 110, 54, 149, 86, 169, 232, 71, 68, 32, 238, 71, 216, 84, 248, 58, 100, 223, 135, 1, 132, 141, 158, 216, 164, 101, 68, 172, 187, 100, 158, 117, 242, 216, 76, 186, 120, 94, 132, 100, 107, 183, 164, 177, 116, 210, 247, 75, 165, 142, 225, 167, 178, 178, 105, 73, 169, 78, 105, 166, 221, 206, 107, 71, 246, 133, 70, 172, 121, 121, 121, 208, 61, 220, 214, 196, 42, 95, 12, 14, 170, 151, 196, 41, 155, 68, 121, 99, 90, 101, 113, 114, 75, 181, 72, 232, 27, 249, 188, 76, 8, 72, 138, 149, 7, 215, 128, 53, 133, 155, 77, 221, 121, 14, 241, 122, 158, 164, 175, 151, 203, 184, 101, 158, 191, 72, 215, 110, 223, 65, 199, 204, 253, 158, 58, 13, 81, 83, 226, 25, 82, 202, 52, 196, 179, 164, 139, 215, 58, 226, 21, 50, 238, 195, 232, 88, 183, 136, 242, 138, 53, 182, 6, 239, 41, 177, 94, 41, 250, 17, 17, 136, 250, 7, 88, 233, 202, 181, 25, 13, 125, 190, 96, 197, 138, 167, 60, 134, 142, 250, 200, 54, 176, 111, 36, 113, 241, 249, 142, 116, 116, 223, 203, 30, 175, 65, 130, 115, 192, 152, 73, 244, 171, 37, 63, 74, 17, 124, 64, 156, 48, 233, 8, 200, 101, 178, 143, 215, 0, 133, 192, 32, 87, 8, 143, 207, 200, 200, 120, 164, 146, 137, 79, 52, 213, 218, 10, 254, 206, 251, 110, 242, 145, 39, 111, 62, 65, 87, 213, 212, 42, 167, 125, 124, 193, 183, 101, 223, 144, 198, 167, 217, 126, 68, 134, 188, 219, 209, 166, 67, 184, 217, 52, 3, 92, 136, 242, 74, 35, 235, 106, 30, 221, 182, 255, 47, 58, 227, 199, 149, 52, 104, 220, 151, 244, 209, 224, 40, 48, 155, 230, 146, 142, 170, 157, 76, 75, 156, 249, 66, 72, 100, 111, 223, 164, 81, 239, 167, 110, 218, 244, 152, 65, 5, 145, 167, 53, 97, 234, 5, 2, 209, 112, 151, 231, 54, 64, 150, 146, 63, 211, 8, 105, 2, 212, 179, 103, 191, 216, 170, 95, 92, 7, 182, 210, 142, 33, 93, 125, 22, 242, 74, 32, 121, 141, 217, 164, 227, 165, 30, 47, 117, 30, 95, 189, 229, 15, 250, 247, 169, 51, 82, 75, 30, 1, 96, 183, 61, 205, 131, 131, 166, 243, 142, 231, 159, 221, 186, 117, 235, 85, 200, 49, 51, 67, 115, 176, 51, 224, 243, 180, 173, 139, 90, 168, 232, 3, 227, 9, 228, 85, 233, 252, 33, 147, 42, 68, 81, 62, 87, 159, 181, 72, 35, 253, 17, 141, 250, 17, 111, 220, 184, 1, 237, 160, 90, 243, 36, 253, 239, 120, 163, 224, 92, 209, 108, 186, 239, 232, 113, 250, 253, 47, 27, 232, 128, 175, 102, 208, 255, 69, 13, 166, 164, 103, 64, 17, 211, 18, 255, 38, 93, 189, 150, 18, 207, 224, 193, 31, 179, 49, 60, 97, 238, 220, 23, 140, 90, 94, 132, 254, 134, 216, 202, 9, 129, 64, 220, 77, 134, 108, 98, 168, 240, 105, 182, 149, 2, 14, 140, 78, 20, 113, 19, 166, 189, 208, 50, 34, 174, 29, 241, 15, 235, 71, 92, 253, 102, 147, 46, 158, 127, 144, 174, 222, 89, 196, 187, 183, 14, 2, 131, 160, 69, 207, 188, 213, 235, 232, 246, 253, 7, 165, 182, 95, 10, 173, 179, 128, 231, 152, 129, 57, 108, 26, 147, 72, 38, 29, 75, 74, 74, 94, 79, 75, 51, 174, 121, 10, 147, 171, 92, 10, 76, 246, 71, 217, 215, 54, 121, 10, 90, 100, 11, 3, 17, 170, 230, 246, 140, 148, 19, 92, 19, 234, 155, 22, 105, 160, 132, 155, 209, 99, 59, 117, 237, 218, 99, 252, 60, 246, 226, 197, 190, 183, 137, 221, 47, 10, 111, 149, 208, 163, 103, 206, 73, 209, 166, 35, 103, 207, 167, 29, 227, 134, 67, 205, 96, 45, 233, 226, 117, 134, 56, 123, 255, 10, 102, 211, 215, 195, 7, 184, 249, 169, 199, 55, 53, 65, 188, 182, 4, 251, 27, 34, 16, 136, 106, 226, 182, 95, 83, 172, 13, 105, 4, 83, 230, 164, 62, 217, 35, 78, 253, 65, 179, 240, 254, 1, 196, 163, 215, 4, 70, 156, 171, 73, 39, 85, 6, 211, 58, 243, 65, 235, 116, 31, 62, 150, 142, 154, 179, 128, 46, 219, 176, 153, 238, 249, 251, 8, 205, 186, 154, 75, 75, 116, 119, 240, 8, 168, 161, 208, 246, 36, 141, 201, 28, 38, 67, 161, 114, 16, 147, 247, 174, 94, 189, 10, 93, 54, 236, 205, 208, 62, 29, 20, 228, 121, 79, 252, 159, 66, 208, 142, 186, 138, 85, 118, 228, 85, 196, 25, 38, 15, 221, 239, 36, 105, 110, 130, 254, 153, 51, 103, 30, 231, 132, 24, 192, 100, 42, 183, 58, 156, 151, 253, 136, 224, 11, 63, 157, 117, 169, 34, 73, 223, 99, 196, 248, 242, 36, 125, 103, 175, 28, 226, 228, 241, 7, 233, 25, 56, 163, 105, 239, 254, 33, 170, 164, 81, 45, 230, 174, 90, 245, 168, 193, 63, 49, 84, 215, 20, 131, 107, 16, 8, 68, 13, 171, 157, 182, 178, 207, 166, 133, 9, 83, 45, 144, 213, 144, 169, 51, 94, 235, 20, 51, 228, 51, 18, 16, 30, 65, 186, 249, 77, 35, 29, 221, 55, 144, 206, 30, 199, 137, 171, 127, 225, 179, 189, 251, 81, 213, 136, 113, 84, 205, 52, 130, 197, 191, 110, 164, 127, 254, 117, 152, 158, 189, 148, 67, 139, 74, 52, 202, 156, 193, 203, 60, 177, 126, 13, 147, 100, 38, 3, 152, 116, 211, 106, 181, 239, 20, 20, 20, 60, 93, 217, 164, 167, 200, 245, 52, 232, 7, 173, 42, 153, 10, 201, 254, 176, 173, 67, 85, 36, 73, 121, 181, 224, 207, 183, 85, 231, 243, 34, 21, 189, 17, 43, 76, 227, 198, 190, 127, 46, 63, 255, 9, 118, 189, 62, 224, 145, 166, 80, 198, 237, 55, 177, 251, 133, 86, 175, 167, 231, 115, 174, 208, 45, 233, 7, 232, 244, 212, 21, 82, 177, 239, 103, 216, 248, 32, 221, 124, 175, 147, 142, 170, 116, 226, 226, 51, 143, 248, 247, 233, 231, 58, 56, 233, 211, 137, 243, 230, 61, 111, 108, 92, 222, 209, 15, 17, 129, 64, 32, 234, 138, 214, 41, 147, 166, 224, 227, 52, 74, 58, 233, 233, 233, 15, 69, 79, 76, 110, 210, 42, 50, 174, 3, 241, 13, 237, 67, 186, 249, 124, 197, 136, 243, 23, 38, 76, 243, 244, 187, 70, 2, 250, 148, 125, 62, 56, 73, 10, 203, 255, 102, 217, 10, 250, 203, 246, 29, 244, 224, 137, 147, 82, 49, 4, 69, 164, 45, 4, 186, 100, 115, 2, 93, 203, 35, 110, 7, 243, 8, 199, 247, 139, 41, 125, 49, 45, 45, 237, 1, 11, 38, 125, 59, 3, 190, 80, 123, 225, 253, 187, 204, 186, 66, 131, 229, 79, 13, 148, 148, 179, 36, 229, 227, 119, 129, 108, 235, 74, 83, 109, 27, 35, 254, 97, 147, 230, 73, 158, 139, 248, 49, 143, 126, 158, 201, 235, 154, 94, 144, 9, 17, 202, 184, 65, 142, 46, 16, 34, 4, 214, 132, 126, 49, 149, 54, 13, 151, 26, 6, 223, 96, 99, 224, 16, 113, 246, 254, 1, 252, 136, 31, 69, 198, 126, 158, 48, 125, 250, 75, 70, 207, 7, 211, 16, 229, 190, 136, 72, 138, 8, 4, 226, 62, 83, 54, 213, 182, 170, 212, 84, 59, 57, 135, 140, 251, 57, 237, 42, 153, 148, 237, 99, 166, 76, 249, 231, 167, 3, 6, 181, 122, 162, 87, 95, 63, 226, 217, 107, 36, 113, 241, 93, 66, 156, 60, 118, 16, 103, 175, 115, 196, 61, 176, 232, 31, 189, 163, 105, 143, 132, 209, 116, 200, 244, 89, 116, 214, 138, 213, 82, 81, 4, 32, 208, 236, 220, 60, 90, 172, 213, 42, 181, 51, 8, 130, 201, 228, 41, 43, 144, 224, 255, 5, 159, 184, 93, 192, 204, 87, 92, 92, 252, 210, 134, 13, 27, 30, 182, 144, 52, 236, 132, 118, 100, 32, 15, 243, 207, 230, 86, 65, 139, 20, 201, 180, 185, 124, 14, 106, 137, 16, 109, 13, 249, 123, 77, 253, 102, 195, 193, 131, 15, 151, 148, 148, 252, 135, 159, 79, 136, 50, 93, 196, 75, 184, 85, 228, 34, 194, 53, 1, 147, 233, 230, 221, 233, 116, 218, 178, 229, 52, 152, 105, 136, 175, 132, 245, 167, 196, 53, 32, 159, 56, 121, 30, 102, 11, 164, 84, 226, 211, 123, 24, 52, 12, 142, 28, 51, 249, 101, 19, 11, 4, 91, 57, 39, 17, 253, 136, 8, 4, 162, 222, 106, 156, 82, 56, 189, 210, 215, 9, 82, 201, 164, 151, 188, 104, 93, 227, 224, 209, 19, 254, 211, 62, 102, 72, 199, 167, 123, 69, 132, 19, 85, 208, 68, 210, 213, 235, 71, 210, 81, 181, 155, 145, 232, 57, 226, 22, 80, 232, 216, 43, 82, 202, 127, 139, 249, 106, 134, 212, 33, 101, 197, 239, 91, 233, 206, 67, 127, 211, 83, 23, 179, 233, 245, 194, 34, 101, 36, 141, 76, 162, 39, 153, 252, 201, 228, 39, 30, 72, 20, 15, 102, 79, 136, 196, 213, 104, 52, 255, 189, 122, 245, 234, 11, 149, 17, 41, 84, 198, 225, 185, 141, 150, 230, 70, 202, 132, 58, 156, 111, 167, 198, 138, 152, 27, 104, 247, 36, 146, 161, 201, 197, 75, 202, 154, 53, 15, 229, 231, 231, 55, 129, 115, 194, 3, 173, 166, 241, 242, 109, 167, 120, 20, 179, 4, 40, 68, 1, 65, 53, 144, 139, 56, 113, 225, 15, 82, 195, 224, 70, 193, 145, 96, 50, 189, 70, 58, 169, 14, 48, 66, 252, 129, 248, 135, 14, 253, 120, 64, 188, 115, 212, 164, 105, 175, 26, 213, 72, 209, 143, 136, 64, 32, 16, 70, 85, 80, 201, 223, 41, 213, 187, 188, 93, 218, 203, 36, 86, 166, 165, 61, 222, 127, 194, 87, 255, 113, 26, 148, 216, 254, 153, 94, 81, 189, 136, 42, 112, 36, 233, 226, 185, 128, 116, 116, 223, 204, 72, 244, 8, 113, 241, 185, 66, 188, 67, 180, 80, 81, 197, 83, 61, 158, 198, 51, 45, 244, 155, 212, 21, 18, 137, 238, 56, 248, 55, 205, 188, 112, 145, 230, 222, 40, 80, 154, 114, 41, 239, 242, 112, 133, 119, 244, 128, 106, 45, 171, 121, 43, 178, 81, 76, 34, 152, 248, 48, 121, 155, 215, 191, 181, 52, 55, 82, 34, 200, 178, 178, 178, 221, 2, 145, 217, 153, 48, 249, 86, 85, 204, 14, 94, 186, 120, 241, 226, 83, 176, 48, 224, 154, 97, 12, 55, 149, 110, 228, 209, 200, 21, 29, 191, 225, 60, 93, 184, 124, 85, 58, 119, 223, 255, 178, 158, 105, 245, 179, 233, 231, 16, 101, 234, 19, 170, 39, 93, 188, 46, 177, 243, 190, 131, 157, 243, 217, 196, 47, 188, 127, 167, 65, 137, 159, 241, 254, 136, 118, 70, 174, 119, 133, 111, 27, 181, 67, 4, 2, 129, 168, 154, 26, 100, 163, 82, 165, 218, 133, 133, 165, 72, 121, 157, 77, 111, 251, 61, 109, 43, 255, 41, 109, 52, 54, 229, 251, 127, 168, 134, 169, 223, 121, 35, 180, 127, 87, 226, 21, 218, 135, 184, 250, 141, 101, 147, 249, 66, 210, 89, 181, 89, 242, 131, 186, 248, 228, 16, 207, 224, 91, 207, 133, 68, 211, 142, 113, 73, 52, 108, 194, 84, 41, 18, 119, 238, 207, 107, 233, 218, 109, 127, 74, 218, 232, 177, 179, 231, 37, 159, 40, 4, 21, 233, 43, 55, 157, 154, 85, 89, 135, 17, 164, 174, 180, 180, 244, 99, 190, 171, 53, 75, 16, 76, 43, 131, 118, 105, 236, 111, 155, 240, 156, 67, 136, 28, 142, 229, 129, 80, 171, 120, 49, 136, 44, 185, 253, 147, 100, 42, 213, 104, 165, 90, 166, 187, 15, 103, 208, 101, 27, 55, 211, 209, 115, 23, 82, 143, 17, 227, 232, 115, 189, 163, 161, 124, 219, 13, 210, 217, 243, 168, 212, 27, 209, 205, 127, 130, 157, 127, 31, 127, 151, 33, 73, 239, 39, 167, 166, 62, 99, 98, 47, 236, 96, 241, 131, 249, 136, 8, 4, 2, 113, 207, 200, 83, 101, 39, 231, 119, 74, 190, 207, 219, 181, 107, 109, 205, 219, 4, 181, 31, 154, 156, 252, 76, 247, 161, 234, 55, 91, 68, 12, 108, 247, 48, 248, 66, 189, 66, 226, 217, 196, 159, 76, 156, 189, 150, 51, 18, 221, 78, 156, 60, 143, 72, 189, 1, 221, 3, 139, 72, 64, 31, 218, 178, 95, 60, 13, 28, 51, 73, 210, 74, 211, 118, 239, 229, 124, 87, 102, 105, 202, 135, 134, 107, 103, 39, 120, 179, 236, 61, 60, 192, 229, 23, 94, 65, 102, 62, 15, 68, 154, 2, 117, 92, 193, 36, 203, 77, 193, 177, 188, 0, 125, 20, 55, 125, 70, 242, 66, 13, 3, 120, 208, 82, 18, 147, 241, 156, 252, 22, 112, 237, 119, 59, 175, 72, 147, 197, 205, 194, 101, 162, 86, 120, 249, 218, 117, 169, 24, 4, 164, 90, 204, 97, 11, 131, 161, 51, 102, 211, 238, 9, 163, 232, 3, 189, 34, 203, 131, 105, 156, 60, 143, 51, 50, 220, 68, 220, 2, 166, 19, 255, 176, 200, 247, 35, 7, 118, 8, 82, 143, 127, 165, 18, 243, 176, 237, 93, 117, 77, 177, 114, 13, 2, 129, 64, 212, 25, 220, 237, 255, 20, 125, 160, 22, 76, 218, 64, 6, 147, 83, 150, 60, 13, 62, 209, 78, 131, 135, 126, 252, 89, 204, 48, 15, 226, 21, 220, 135, 116, 247, 31, 159, 115, 245, 106, 1, 103, 73, 179, 138, 153, 131, 246, 40, 85, 142, 103, 196, 180, 116, 253, 111, 116, 199, 193, 195, 82, 181, 152, 35, 167, 207, 74, 233, 47, 144, 63, 122, 173, 160, 72, 242, 239, 65, 17, 6, 232, 76, 81, 170, 183, 172, 4, 108, 41, 35, 108, 136, 32, 133, 109, 0, 1, 158, 188, 152, 37, 253, 199, 166, 93, 123, 233, 226, 95, 55, 73, 13, 186, 33, 114, 184, 235, 208, 145, 229, 90, 161, 123, 208, 77, 226, 228, 117, 65, 42, 67, 8, 11, 3, 247, 192, 73, 207, 246, 138, 8, 239, 56, 96, 72, 251, 168, 73, 147, 94, 205, 204, 204, 52, 158, 146, 34, 215, 7, 190, 187, 166, 41, 18, 34, 2, 129, 64, 212, 11, 64, 36, 46, 215, 72, 165, 190, 127, 234, 242, 254, 127, 210, 196, 111, 98, 178, 103, 124, 212, 78, 80, 35, 245, 102, 16, 164, 228, 179, 212, 235, 245, 87, 2, 70, 142, 255, 153, 188, 219, 241, 79, 166, 161, 29, 96, 228, 116, 130, 116, 97, 36, 213, 205, 231, 170, 100, 198, 244, 12, 46, 33, 62, 97, 165, 141, 152, 38, 215, 52, 124, 0, 109, 30, 17, 75, 63, 138, 25, 74, 157, 226, 71, 80, 231, 33, 106, 234, 194, 200, 173, 123, 194, 104, 234, 154, 56, 134, 201, 104, 73, 235, 235, 58, 84, 77, 187, 12, 25, 65, 63, 29, 152, 64, 155, 247, 141, 165, 16, 5, 76, 124, 66, 117, 146, 246, 11, 173, 158, 58, 169, 50, 217, 255, 236, 102, 143, 107, 73, 87, 239, 217, 140, 24, 71, 60, 30, 20, 25, 220, 161, 255, 176, 207, 163, 199, 77, 126, 19, 234, 246, 86, 114, 146, 108, 155, 171, 84, 142, 232, 63, 68, 32, 16, 8, 196, 29, 26, 169, 92, 178, 47, 44, 37, 197, 33, 57, 57, 25, 180, 42, 7, 245, 188, 121, 15, 148, 234, 245, 199, 44, 72, 251, 168, 8, 234, 185, 85, 90, 218, 70, 32, 90, 187, 244, 236, 236, 135, 230, 164, 174, 127, 82, 61, 109, 238, 11, 209, 19, 39, 54, 241, 78, 26, 213, 188, 91, 92, 194, 123, 109, 251, 199, 183, 249, 111, 223, 152, 207, 222, 234, 211, 191, 235, 179, 65, 17, 110, 196, 63, 212, 139, 137, 63, 241, 11, 239, 69, 252, 194, 122, 19, 223, 208, 80, 73, 252, 195, 67, 136, 127, 159, 32, 18, 16, 230, 243, 88, 96, 84, 207, 102, 97, 3, 156, 63, 140, 26, 212, 182, 199, 144, 164, 22, 161, 234, 113, 255, 134, 228, 123, 227, 253, 15, 239, 130, 84, 178, 13, 252, 190, 178, 239, 16, 115, 16, 17, 8, 4, 2, 97, 22, 132, 198, 202, 125, 44, 32, 72, 189, 64, 146, 225, 226, 118, 106, 9, 229, 38, 210, 22, 229, 254, 66, 57, 247, 16, 253, 134, 8, 4, 2, 129, 168, 14, 65, 202, 213, 117, 30, 19, 18, 230, 117, 22, 228, 67, 126, 45, 19, 100, 106, 106, 106, 121, 131, 94, 217, 103, 170, 20, 217, 135, 42, 138, 236, 251, 51, 37, 202, 223, 136, 219, 4, 2, 68, 127, 33, 2, 129, 64, 32, 106, 136, 36, 29, 249, 227, 76, 11, 218, 97, 201, 4, 185, 70, 73, 182, 8, 4, 2, 129, 64, 212, 23, 130, 108, 196, 31, 63, 181, 32, 55, 82, 110, 162, 188, 79, 232, 20, 130, 254, 61, 4, 2, 129, 64, 212, 43, 130, 148, 9, 14, 42, 216, 28, 49, 83, 139, 148, 147, 242, 161, 241, 244, 19, 252, 247, 14, 120, 54, 17, 8, 4, 2, 81, 223, 72, 82, 14, 214, 153, 166, 208, 16, 43, 211, 32, 161, 197, 215, 75, 252, 183, 142, 120, 38, 17, 8, 4, 2, 81, 223, 8, 82, 246, 67, 246, 52, 179, 21, 150, 236, 131, 132, 226, 233, 175, 35, 65, 34, 16, 8, 4, 162, 190, 19, 100, 83, 161, 219, 133, 206, 12, 13, 50, 159, 201, 155, 252, 183, 141, 240, 76, 34, 16, 8, 4, 162, 190, 18, 228, 3, 76, 142, 153, 225, 135, 148, 125, 144, 121, 76, 154, 161, 6, 137, 64, 32, 16, 136, 250, 74, 144, 246, 194, 243, 205, 102, 20, 13, 144, 53, 200, 75, 208, 101, 3, 9, 18, 129, 64, 32, 16, 245, 149, 32, 237, 132, 231, 203, 44, 32, 200, 76, 38, 47, 240, 223, 161, 137, 21, 129, 64, 32, 16, 245, 142, 32, 29, 132, 231, 11, 43, 33, 72, 189, 240, 217, 46, 38, 141, 81, 131, 68, 32, 16, 8, 68, 125, 37, 200, 70, 194, 243, 165, 130, 15, 178, 204, 72, 177, 114, 185, 22, 235, 74, 202, 235, 157, 34, 65, 34, 16, 8, 4, 162, 62, 18, 228, 3, 50, 81, 50, 217, 36, 104, 144, 134, 8, 82, 12, 222, 153, 106, 72, 11, 69, 32, 16, 8, 4, 162, 62, 144, 163, 173, 80, 40, 0, 210, 60, 142, 86, 98, 98, 21, 223, 239, 35, 108, 7, 75, 205, 33, 16, 8, 4, 162, 222, 144, 163, 141, 194, 255, 232, 33, 228, 65, 150, 84, 226, 127, 132, 20, 143, 79, 249, 239, 236, 177, 88, 57, 2, 129, 64, 32, 234, 19, 65, 58, 10, 45, 175, 30, 100, 50, 203, 136, 166, 40, 154, 87, 229, 2, 2, 59, 152, 60, 47, 108, 7, 91, 78, 33, 16, 8, 4, 162, 94, 144, 163, 189, 66, 123, 236, 206, 228, 172, 80, 69, 71, 87, 137, 121, 245, 107, 145, 104, 241, 140, 34, 16, 8, 4, 66, 36, 25, 155, 251, 77, 115, 226, 251, 108, 167, 40, 14, 240, 54, 147, 85, 6, 242, 28, 141, 153, 87, 11, 153, 168, 68, 178, 197, 209, 128, 64, 32, 16, 8, 165, 22, 102, 35, 7, 186, 112, 177, 171, 139, 164, 41, 238, 163, 226, 253, 55, 152, 124, 39, 68, 172, 234, 13, 148, 153, 43, 83, 188, 183, 85, 232, 226, 225, 128, 1, 58, 8, 4, 2, 129, 80, 106, 98, 142, 38, 62, 183, 227, 105, 19, 142, 50, 145, 214, 210, 126, 218, 241, 125, 112, 52, 240, 217, 39, 76, 126, 80, 164, 115, 104, 57, 73, 138, 208, 41, 204, 171, 9, 194, 54, 208, 255, 136, 64, 32, 16, 136, 187, 53, 50, 254, 188, 25, 147, 117, 76, 82, 152, 184, 243, 116, 9, 27, 35, 191, 115, 224, 164, 226, 80, 19, 218, 166, 96, 66, 149, 255, 199, 206, 192, 119, 254, 205, 100, 32, 147, 189, 6, 138, 0, 232, 43, 241, 61, 30, 96, 242, 158, 72, 192, 56, 26, 16, 8, 4, 2, 113, 7, 209, 9, 207, 125, 152, 220, 84, 144, 10, 188, 222, 207, 100, 14, 228, 11, 50, 105, 201, 228, 9, 115, 72, 215, 128, 216, 25, 17, 67, 223, 51, 70, 204, 15, 49, 105, 197, 100, 24, 147, 52, 161, 35, 135, 232, 95, 44, 51, 226, 123, 20, 205, 171, 106, 212, 30, 17, 8, 4, 2, 97, 74, 75, 115, 20, 94, 207, 20, 8, 164, 152, 7, 185, 24, 235, 167, 152, 195, 228, 79, 78, 156, 49, 76, 156, 184, 31, 240, 49, 43, 239, 35, 16, 226, 235, 76, 186, 50, 73, 228, 65, 56, 103, 141, 164, 110, 24, 35, 71, 157, 130, 28, 183, 65, 64, 143, 72, 144, 56, 26, 16, 8, 4, 2, 33, 146, 143, 157, 96, 94, 5, 115, 229, 95, 2, 161, 148, 42, 130, 91, 74, 57, 201, 104, 43, 105, 66, 12, 223, 189, 194, 228, 48, 147, 245, 76, 230, 49, 153, 192, 100, 16, 147, 96, 158, 196, 15, 100, 215, 145, 201, 103, 76, 62, 103, 210, 153, 167, 103, 128, 6, 219, 23, 124, 131, 76, 146, 153, 44, 103, 178, 155, 73, 150, 137, 255, 44, 53, 178, 79, 101, 194, 163, 24, 205, 154, 203, 36, 76, 56, 7, 246, 104, 94, 69, 32, 16, 8, 132, 146, 32, 69, 243, 170, 159, 224, 163, 51, 166, 137, 41, 9, 168, 140, 155, 46, 117, 66, 241, 111, 29, 173, 89, 136, 255, 165, 23, 246, 195, 24, 148, 228, 57, 157, 201, 147, 130, 6, 141, 169, 29, 8, 4, 2, 129, 184, 139, 32, 29, 5, 162, 168, 172, 250, 76, 85, 160, 23, 52, 60, 141, 32, 90, 129, 76, 117, 2, 201, 234, 140, 124, 95, 99, 34, 240, 198, 20, 129, 43, 53, 225, 53, 76, 254, 167, 60, 126, 4, 2, 129, 64, 32, 68, 114, 180, 147, 77, 139, 220, 119, 120, 200, 136, 121, 245, 94, 161, 204, 12, 173, 213, 18, 98, 86, 166, 121, 236, 4, 115, 174, 168, 61, 163, 246, 136, 64, 32, 16, 8, 67, 4, 41, 246, 78, 12, 20, 72, 81, 99, 69, 162, 170, 13, 232, 185, 207, 81, 60, 134, 125, 76, 122, 10, 199, 107, 195, 9, 18, 35, 87, 17, 8, 4, 2, 97, 152, 32, 185, 38, 57, 199, 72, 159, 196, 251, 149, 28, 69, 64, 164, 173, 187, 130, 28, 237, 145, 28, 17, 8, 4, 2, 97, 136, 28, 109, 5, 243, 106, 115, 38, 127, 11, 17, 161, 186, 251, 144, 24, 203, 12, 164, 114, 0, 214, 66, 132, 172, 226, 216, 209, 239, 136, 64, 32, 16, 8, 163, 4, 41, 230, 62, 6, 11, 230, 213, 146, 251, 204, 188, 170, 23, 2, 126, 68, 92, 103, 50, 131, 201, 59, 74, 173, 25, 251, 61, 34, 16, 8, 4, 194, 24, 57, 218, 8, 230, 85, 7, 158, 167, 104, 237, 232, 213, 123, 161, 49, 106, 141, 16, 250, 30, 38, 81, 76, 158, 86, 28, 179, 3, 146, 35, 2, 129, 64, 32, 76, 17, 164, 104, 94, 133, 246, 80, 71, 238, 51, 243, 106, 41, 39, 70, 101, 202, 199, 41, 232, 237, 200, 164, 181, 226, 120, 235, 108, 103, 18, 4, 2, 129, 64, 212, 45, 130, 180, 19, 158, 135, 10, 68, 83, 82, 71, 53, 197, 50, 33, 159, 210, 80, 250, 201, 25, 94, 92, 29, 74, 221, 61, 172, 56, 86, 71, 212, 26, 17, 8, 4, 2, 97, 182, 6, 201, 31, 31, 102, 178, 64, 240, 229, 221, 172, 3, 254, 199, 50, 69, 177, 0, 99, 197, 1, 202, 120, 89, 188, 73, 76, 218, 27, 32, 70, 7, 44, 64, 142, 64, 32, 16, 8, 75, 9, 210, 134, 63, 62, 193, 147, 231, 13, 5, 190, 104, 184, 70, 169, 181, 176, 122, 77, 85, 201, 80, 254, 63, 141, 9, 51, 47, 236, 71, 38, 239, 251, 24, 6, 197, 13, 12, 145, 63, 22, 0, 64, 32, 16, 8, 132, 53, 200, 178, 17, 47, 82, 238, 198, 228, 27, 38, 233, 6, 218, 93, 137, 190, 63, 101, 233, 55, 157, 66, 235, 84, 214, 103, 53, 84, 58, 174, 196, 130, 210, 113, 151, 153, 252, 193, 35, 82, 131, 185, 207, 212, 193, 192, 113, 84, 248, 25, 81, 107, 68, 32, 16, 8, 132, 213, 180, 73, 3, 239, 55, 225, 164, 57, 142, 119, 228, 56, 87, 131, 154, 164, 76, 190, 57, 156, 160, 127, 100, 50, 150, 73, 0, 239, 61, 249, 140, 145, 125, 180, 55, 214, 72, 25, 129, 64, 32, 16, 8, 171, 17, 37, 55, 77, 54, 50, 102, 158, 100, 239, 63, 194, 164, 25, 19, 23, 38, 177, 92, 171, 91, 195, 211, 42, 32, 130, 52, 95, 40, 60, 174, 229, 154, 40, 180, 150, 58, 207, 35, 101, 129, 252, 182, 48, 249, 153, 201, 92, 38, 95, 240, 62, 146, 158, 76, 62, 225, 154, 108, 101, 141, 152, 237, 249, 62, 34, 49, 34, 16, 136, 6, 139, 255, 7, 49, 107, 77, 53, 30, 9, 206, 77, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130}} +var fynescenelight = &fyne.StaticResource{ + StaticName: "fyne_scene_light.png", + StaticContent: []byte{ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1, 201, 0, 0, 1, 79, 8, 6, 0, 0, 0, 38, 214, 53, 180, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 150, 101, 88, 73, 102, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 26, 0, 5, 0, 0, 0, 1, 0, 0, 0, 74, 1, 27, 0, 5, 0, 0, 0, 1, 0, 0, 0, 82, 1, 49, 0, 2, 0, 0, 0, 17, 0, 0, 0, 90, 135, 105, 0, 4, 0, 0, 0, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 0, 0, 0, 3, 160, 1, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 160, 2, 0, 4, 0, 0, 0, 1, 0, 0, 1, 201, 160, 3, 0, 4, 0, 0, 0, 1, 0, 0, 1, 79, 0, 0, 0, 0, 52, 31, 119, 147, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 18, 116, 0, 0, 18, 116, 1, 222, 102, 31, 120, 0, 0, 1, 203, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 24, 203, 85, 88, 0, 0, 160, 86, 73, 68, 65, 84, 120, 218, 236, 125, 7, 152, 28, 89, 121, 237, 40, 108, 208, 42, 167, 201, 221, 85, 93, 85, 157, 195, 116, 79, 206, 26, 173, 178, 180, 74, 43, 141, 114, 206, 57, 172, 36, 150, 93, 130, 215, 126, 126, 14, 96, 63, 12, 216, 60, 112, 224, 225, 128, 177, 1, 155, 140, 201, 24, 131, 31, 54, 193, 192, 51, 209, 54, 94, 88, 50, 44, 11, 108, 82, 231, 122, 255, 185, 93, 213, 83, 211, 234, 153, 233, 158, 169, 25, 105, 90, 255, 249, 190, 187, 163, 149, 122, 170, 171, 110, 85, 221, 115, 255, 116, 254, 170, 42, 6, 131, 193, 184, 125, 152, 209, 210, 210, 114, 143, 166, 105, 247, 5, 131, 193, 123, 233, 255, 103, 142, 246, 217, 198, 198, 198, 37, 138, 162, 184, 85, 85, 237, 113, 185, 92, 59, 233, 207, 231, 104, 252, 186, 44, 203, 111, 160, 159, 111, 163, 191, 251, 16, 253, 252, 103, 250, 249, 37, 26, 223, 162, 241, 20, 141, 159, 211, 120, 129, 70, 130, 70, 154, 70, 198, 248, 243, 243, 52, 126, 70, 227, 59, 244, 59, 95, 163, 159, 95, 160, 241, 73, 26, 239, 161, 241, 22, 26, 191, 79, 227, 113, 26, 199, 105, 108, 166, 239, 232, 196, 119, 211, 88, 72, 231, 50, 11, 231, 204, 183, 143, 193, 96, 48, 24, 118, 99, 38, 8, 209, 32, 197, 91, 128, 191, 151, 36, 201, 69, 100, 180, 138, 198, 89, 131, 172, 222, 107, 16, 223, 143, 105, 164, 232, 239, 117, 34, 74, 157, 136, 42, 63, 240, 255, 214, 129, 207, 152, 131, 126, 167, 232, 176, 126, 198, 250, 187, 197, 142, 107, 28, 7, 100, 251, 12, 200, 151, 206, 113, 131, 113, 202, 179, 248, 150, 50, 24, 12, 6, 99, 92, 150, 162, 49, 102, 13, 12, 12, 204, 46, 102, 41, 18, 17, 53, 18, 1, 109, 34, 75, 237, 149, 68, 62, 239, 164, 241, 117, 26, 207, 89, 137, 176, 128, 168, 48, 178, 32, 75, 195, 34, 180, 142, 36, 6, 125, 46, 101, 177, 26, 51, 198, 231, 179, 5, 36, 153, 53, 254, 45, 109, 140, 148, 241, 251, 230, 177, 226, 198, 72, 26, 255, 158, 176, 144, 239, 217, 130, 107, 100, 48, 24, 12, 6, 163, 100, 204, 130, 27, 181, 152, 149, 213, 216, 216, 216, 0, 87, 41, 141, 215, 209, 248, 60, 141, 103, 11, 45, 57, 11, 25, 166, 44, 132, 149, 48, 254, 63, 93, 132, 240, 38, 115, 100, 76, 130, 164, 159, 79, 210, 185, 133, 153, 32, 25, 12, 6, 131, 81, 182, 213, 8, 87, 169, 65, 142, 121, 224, 239, 136, 92, 218, 105, 188, 130, 198, 167, 17, 11, 44, 66, 136, 89, 195, 250, 179, 90, 130, 153, 41, 38, 195, 66, 43, 211, 36, 233, 52, 172, 89, 250, 249, 81, 250, 185, 192, 176, 126, 239, 171, 26, 61, 126, 202, 96, 48, 24, 12, 198, 16, 57, 90, 173, 42, 144, 136, 36, 73, 43, 141, 120, 226, 55, 64, 132, 166, 219, 212, 136, 5, 166, 44, 86, 225, 72, 238, 208, 219, 61, 64, 216, 230, 57, 255, 190, 149, 244, 249, 150, 51, 24, 12, 6, 99, 84, 98, 132, 37, 101, 196, 25, 243, 32, 66, 105, 33, 66, 121, 21, 141, 111, 22, 16, 99, 214, 18, 223, 187, 211, 200, 176, 216, 72, 88, 92, 190, 135, 44, 151, 56, 155, 111, 61, 131, 193, 96, 48, 70, 194, 76, 195, 157, 154, 183, 26, 101, 89, 94, 68, 68, 114, 138, 198, 103, 76, 203, 203, 66, 48, 102, 44, 49, 51, 13, 136, 113, 88, 252, 145, 174, 225, 251, 32, 125, 92, 227, 72, 241, 85, 6, 131, 193, 96, 48, 132, 229, 104, 196, 225, 242, 228, 40, 73, 146, 159, 8, 242, 53, 168, 53, 52, 227, 139, 150, 56, 94, 114, 26, 17, 163, 213, 5, 44, 226, 143, 244, 231, 79, 128, 252, 113, 157, 133, 215, 205, 96, 48, 24, 12, 70, 30, 134, 21, 149, 79, 82, 33, 34, 233, 167, 241, 118, 16, 139, 65, 40, 250, 109, 202, 58, 157, 172, 248, 227, 107, 11, 174, 157, 193, 96, 48, 24, 140, 91, 48, 171, 202, 226, 98, 36, 242, 88, 67, 227, 195, 102, 172, 209, 226, 78, 205, 76, 83, 98, 188, 37, 254, 72, 63, 143, 154, 215, 91, 24, 111, 101, 48, 24, 12, 6, 3, 152, 93, 101, 73, 80, 33, 226, 232, 37, 2, 249, 152, 89, 203, 88, 65, 228, 104, 173, 127, 252, 33, 93, 95, 155, 197, 122, 228, 248, 35, 131, 193, 96, 48, 134, 97, 134, 85, 143, 20, 49, 71, 40, 224, 88, 200, 49, 59, 73, 177, 198, 236, 109, 40, 1, 73, 91, 234, 31, 63, 5, 77, 88, 92, 115, 97, 41, 11, 131, 193, 96, 48, 24, 85, 86, 201, 56, 35, 91, 245, 247, 64, 90, 6, 57, 102, 140, 152, 99, 118, 28, 150, 90, 186, 64, 234, 45, 47, 31, 103, 145, 142, 75, 143, 33, 15, 103, 202, 205, 217, 37, 48, 96, 141, 63, 254, 161, 57, 7, 28, 127, 100, 48, 24, 12, 198, 45, 214, 163, 149, 28, 136, 32, 15, 19, 113, 252, 160, 32, 230, 56, 150, 21, 40, 244, 81, 11, 4, 2, 134, 9, 135, 91, 5, 195, 139, 137, 145, 23, 27, 163, 136, 140, 91, 137, 187, 92, 65, 2, 107, 253, 227, 137, 130, 77, 2, 131, 193, 96, 48, 24, 183, 90, 78, 68, 68, 42, 145, 198, 71, 44, 68, 20, 55, 201, 110, 4, 98, 76, 89, 132, 191, 111, 233, 162, 97, 124, 238, 105, 34, 221, 175, 226, 184, 70, 235, 169, 87, 209, 255, 63, 138, 154, 74, 250, 252, 94, 250, 243, 54, 116, 210, 160, 255, 95, 75, 255, 191, 26, 137, 65, 248, 127, 250, 253, 237, 244, 231, 131, 52, 206, 211, 103, 126, 13, 109, 176, 232, 207, 239, 166, 241, 57, 212, 46, 26, 86, 104, 81, 173, 87, 139, 180, 93, 170, 192, 45, 156, 181, 196, 31, 127, 140, 182, 87, 22, 114, 228, 248, 35, 131, 193, 96, 48, 134, 96, 141, 61, 18, 97, 92, 6, 169, 24, 4, 98, 186, 59, 11, 53, 76, 205, 127, 139, 27, 86, 163, 149, 16, 161, 187, 250, 95, 32, 50, 144, 26, 72, 142, 70, 200, 233, 116, 46, 182, 251, 188, 235, 235, 235, 31, 160, 227, 42, 32, 85, 250, 174, 75, 52, 254, 12, 228, 137, 246, 85, 214, 115, 50, 72, 211, 236, 27, 25, 7, 121, 26, 214, 241, 103, 60, 30, 207, 50, 28, 139, 227, 143, 12, 6, 131, 193, 40, 132, 169, 152, 131, 172, 85, 39, 178, 86, 45, 174, 213, 228, 40, 73, 46, 137, 2, 153, 57, 88, 99, 127, 103, 88, 123, 209, 49, 244, 76, 17, 235, 156, 13, 171, 205, 28, 85, 67, 25, 180, 179, 138, 140, 217, 69, 62, 63, 107, 52, 66, 163, 115, 168, 133, 69, 10, 146, 70, 153, 138, 41, 112, 80, 224, 170, 253, 223, 230, 231, 89, 127, 149, 193, 96, 48, 24, 195, 96, 141, 187, 193, 221, 137, 158, 141, 6, 225, 21, 147, 141, 203, 154, 86, 165, 165, 46, 242, 121, 26, 127, 131, 54, 87, 166, 53, 86, 128, 89, 150, 102, 202, 69, 123, 71, 218, 0, 209, 155, 18, 68, 95, 172, 227, 136, 149, 52, 233, 188, 31, 50, 218, 113, 125, 147, 198, 133, 98, 243, 192, 96, 48, 24, 12, 198, 48, 203, 137, 200, 227, 141, 5, 177, 199, 66, 203, 17, 196, 152, 50, 221, 151, 134, 43, 245, 6, 154, 35, 23, 90, 136, 22, 82, 188, 157, 113, 189, 25, 32, 62, 184, 144, 71, 176, 16, 103, 90, 9, 150, 159, 6, 6, 131, 193, 96, 228, 9, 196, 140, 63, 194, 189, 74, 22, 214, 23, 13, 171, 176, 48, 246, 152, 239, 212, 97, 169, 139, 68, 39, 143, 99, 85, 195, 59, 95, 204, 180, 184, 75, 239, 212, 120, 222, 76, 139, 155, 214, 36, 200, 89, 85, 220, 255, 145, 193, 96, 48, 24, 5, 22, 148, 176, 156, 12, 73, 185, 103, 13, 242, 139, 23, 41, 149, 176, 22, 215, 35, 43, 245, 178, 149, 84, 44, 250, 173, 211, 45, 209, 101, 70, 21, 39, 231, 48, 24, 12, 6, 163, 0, 86, 205, 213, 139, 102, 205, 226, 8, 238, 213, 164, 197, 122, 252, 11, 26, 53, 230, 239, 114, 7, 12, 6, 131, 193, 96, 84, 20, 172, 201, 44, 68, 126, 127, 96, 169, 91, 76, 22, 113, 175, 154, 181, 131, 207, 209, 24, 44, 32, 71, 142, 223, 49, 24, 12, 6, 163, 114, 96, 77, 92, 129, 238, 170, 225, 62, 77, 21, 17, 6, 176, 18, 228, 191, 33, 94, 105, 90, 160, 156, 253, 201, 96, 48, 24, 140, 138, 181, 32, 65, 148, 68, 124, 159, 52, 8, 50, 81, 36, 254, 40, 132, 202, 141, 94, 144, 239, 42, 70, 176, 12, 6, 131, 193, 96, 84, 156, 5, 73, 63, 231, 17, 241, 153, 25, 172, 241, 17, 36, 229, 4, 65, 202, 178, 252, 102, 38, 72, 6, 131, 193, 96, 84, 52, 204, 18, 15, 116, 239, 128, 86, 170, 225, 66, 189, 57, 146, 192, 183, 81, 251, 248, 127, 10, 45, 80, 6, 131, 193, 96, 48, 42, 210, 130, 52, 218, 91, 125, 163, 20, 130, 164, 159, 239, 49, 127, 159, 227, 143, 12, 6, 131, 193, 168, 72, 88, 98, 144, 243, 44, 22, 100, 124, 12, 130, 252, 74, 213, 240, 2, 123, 6, 131, 193, 96, 48, 42, 11, 166, 5, 136, 159, 68, 124, 159, 31, 131, 32, 83, 70, 141, 228, 139, 232, 160, 97, 37, 88, 6, 131, 193, 96, 48, 42, 146, 32, 1, 116, 241, 24, 131, 32, 133, 80, 185, 241, 153, 3, 248, 29, 107, 155, 44, 6, 131, 193, 96, 48, 42, 9, 121, 105, 56, 178, 14, 255, 122, 148, 44, 214, 188, 128, 128, 65, 144, 239, 48, 126, 255, 78, 214, 92, 101, 48, 24, 12, 6, 99, 66, 152, 109, 88, 144, 175, 26, 165, 14, 210, 28, 25, 195, 205, 250, 172, 36, 73, 117, 248, 61, 118, 179, 50, 24, 12, 6, 163, 34, 97, 102, 178, 18, 233, 157, 50, 172, 195, 244, 40, 4, 169, 91, 4, 3, 174, 90, 127, 159, 193, 96, 48, 24, 140, 138, 130, 165, 22, 114, 133, 97, 29, 234, 69, 26, 37, 223, 34, 90, 142, 178, 144, 42, 110, 17, 197, 96, 48, 24, 140, 74, 133, 233, 34, 117, 56, 28, 245, 104, 99, 101, 144, 95, 114, 20, 130, 132, 117, 153, 130, 181, 73, 164, 186, 27, 191, 203, 245, 144, 12, 6, 131, 193, 168, 68, 228, 173, 64, 34, 190, 255, 59, 70, 38, 107, 97, 77, 228, 23, 138, 29, 135, 193, 96, 48, 24, 140, 74, 129, 176, 0, 201, 122, 124, 77, 9, 153, 172, 195, 74, 62, 232, 119, 246, 91, 45, 81, 6, 131, 193, 96, 48, 42, 6, 102, 162, 13, 17, 222, 246, 18, 19, 117, 64, 140, 166, 112, 192, 55, 44, 228, 200, 202, 58, 12, 6, 131, 193, 168, 28, 152, 49, 68, 148, 110, 16, 225, 253, 210, 32, 190, 244, 24, 86, 164, 110, 17, 14, 184, 134, 223, 103, 225, 0, 6, 131, 193, 96, 84, 26, 242, 130, 1, 68, 118, 31, 54, 72, 47, 81, 2, 65, 102, 13, 50, 253, 5, 145, 227, 114, 227, 88, 156, 176, 195, 96, 48, 24, 140, 202, 129, 165, 30, 242, 162, 65, 144, 169, 177, 220, 172, 5, 234, 58, 127, 130, 223, 231, 88, 36, 131, 193, 96, 48, 42, 10, 166, 155, 149, 200, 78, 67, 146, 142, 97, 25, 166, 74, 32, 200, 188, 194, 14, 253, 110, 55, 91, 145, 12, 6, 131, 193, 168, 68, 20, 186, 89, 111, 150, 72, 144, 73, 35, 163, 245, 139, 60, 133, 12, 6, 131, 193, 168, 56, 152, 238, 81, 34, 186, 163, 70, 185, 71, 178, 68, 130, 20, 165, 33, 198, 239, 220, 96, 43, 146, 193, 96, 48, 24, 149, 6, 81, 166, 209, 216, 216, 184, 196, 162, 170, 147, 41, 145, 32, 205, 172, 87, 184, 101, 189, 214, 227, 49, 24, 12, 6, 131, 81, 49, 86, 36, 145, 220, 31, 27, 110, 214, 178, 172, 72, 195, 213, 250, 9, 203, 33, 89, 97, 135, 193, 96, 48, 24, 211, 31, 102, 54, 171, 44, 203, 157, 214, 36, 156, 18, 9, 50, 175, 211, 106, 118, 251, 224, 172, 86, 6, 131, 193, 96, 84, 10, 242, 22, 31, 44, 193, 50, 106, 34, 11, 93, 173, 73, 167, 211, 25, 96, 146, 100, 48, 24, 12, 70, 197, 192, 44, 249, 32, 130, 220, 97, 145, 158, 203, 148, 65, 146, 41, 227, 247, 254, 165, 24, 241, 50, 24, 12, 6, 131, 49, 93, 49, 195, 36, 53, 89, 150, 191, 58, 14, 43, 82, 104, 181, 26, 191, 247, 155, 56, 16, 55, 86, 102, 48, 24, 12, 70, 69, 192, 146, 172, 115, 210, 40, 223, 40, 139, 32, 77, 21, 30, 35, 19, 182, 159, 73, 146, 193, 96, 48, 24, 21, 101, 69, 130, 40, 137, 224, 190, 83, 134, 128, 249, 45, 10, 59, 244, 243, 169, 198, 198, 198, 57, 166, 85, 202, 83, 203, 96, 48, 24, 140, 105, 13, 179, 59, 71, 129, 62, 171, 94, 230, 48, 93, 173, 127, 131, 99, 153, 241, 77, 6, 131, 193, 96, 48, 166, 51, 102, 153, 68, 73, 4, 247, 237, 113, 90, 145, 86, 65, 243, 147, 166, 85, 202, 83, 203, 96, 48, 24, 140, 105, 13, 75, 93, 228, 233, 82, 155, 41, 143, 20, 143, 196, 144, 36, 201, 111, 37, 95, 6, 131, 193, 96, 48, 166, 181, 21, 73, 152, 73, 4, 247, 149, 113, 168, 235, 228, 93, 173, 134, 5, 250, 141, 42, 142, 67, 50, 24, 12, 6, 163, 18, 96, 169, 139, 124, 120, 2, 86, 100, 94, 208, 156, 172, 209, 55, 179, 21, 201, 96, 48, 24, 140, 138, 2, 145, 220, 199, 12, 146, 140, 143, 131, 32, 173, 241, 200, 227, 198, 33, 57, 105, 135, 193, 96, 48, 24, 211, 26, 194, 218, 35, 235, 175, 195, 112, 149, 102, 199, 105, 69, 90, 147, 124, 154, 216, 146, 100, 48, 24, 12, 198, 180, 135, 69, 60, 224, 79, 199, 41, 30, 144, 183, 34, 13, 146, 253, 239, 154, 154, 154, 185, 198, 225, 57, 46, 201, 96, 48, 24, 140, 105, 139, 153, 6, 65, 214, 208, 120, 182, 48, 67, 181, 220, 120, 164, 209, 245, 227, 93, 150, 227, 207, 224, 41, 102, 48, 24, 12, 198, 180, 132, 41, 30, 32, 203, 242, 149, 9, 136, 7, 152, 196, 106, 198, 35, 95, 129, 99, 178, 136, 0, 131, 193, 96, 48, 166, 189, 21, 105, 88, 146, 159, 159, 128, 120, 128, 217, 103, 50, 139, 99, 208, 216, 132, 99, 178, 136, 0, 131, 193, 96, 48, 166, 45, 76, 241, 0, 178, 254, 122, 198, 209, 84, 249, 150, 164, 29, 131, 100, 159, 119, 58, 157, 10, 147, 36, 131, 193, 96, 48, 166, 51, 102, 152, 238, 80, 34, 182, 215, 78, 64, 60, 160, 80, 68, 224, 223, 171, 134, 50, 90, 57, 179, 149, 193, 96, 48, 24, 211, 18, 179, 12, 107, 114, 30, 178, 81, 13, 130, 155, 16, 73, 26, 68, 251, 14, 203, 241, 57, 105, 135, 193, 96, 48, 166, 187, 69, 117, 55, 46, 230, 22, 133, 157, 77, 6, 65, 102, 38, 224, 106, 21, 238, 86, 107, 210, 14, 247, 143, 100, 48, 24, 140, 233, 143, 153, 35, 252, 249, 174, 185, 118, 75, 109, 100, 124, 2, 4, 153, 53, 147, 118, 100, 89, 222, 138, 227, 154, 89, 179, 12, 6, 131, 193, 152, 158, 152, 53, 130, 85, 121, 183, 88, 207, 85, 94, 175, 119, 62, 145, 219, 15, 12, 75, 50, 53, 65, 146, 52, 221, 181, 94, 28, 155, 147, 118, 24, 12, 6, 99, 154, 194, 186, 128, 171, 170, 250, 33, 34, 137, 175, 145, 229, 211, 120, 23, 89, 148, 98, 131, 32, 73, 210, 6, 163, 248, 127, 34, 4, 41, 92, 181, 6, 209, 126, 183, 177, 177, 113, 206, 93, 106, 153, 51, 24, 12, 70, 101, 17, 36, 45, 236, 31, 193, 34, 15, 119, 35, 253, 121, 213, 40, 22, 102, 69, 193, 18, 143, 124, 227, 4, 101, 232, 10, 227, 145, 159, 100, 130, 100, 48, 24, 140, 10, 32, 72, 90, 208, 63, 10, 235, 199, 231, 243, 221, 52, 172, 160, 190, 187, 132, 36, 77, 151, 242, 108, 186, 230, 111, 79, 80, 64, 96, 88, 231, 15, 89, 150, 223, 80, 56, 207, 12, 6, 131, 193, 152, 126, 22, 228, 199, 26, 27, 27, 245, 158, 158, 158, 155, 253, 253, 253, 89, 252, 217, 237, 118, 247, 223, 13, 36, 105, 206, 131, 36, 73, 93, 150, 142, 31, 186, 29, 36, 73, 63, 47, 224, 216, 156, 217, 202, 96, 48, 24, 211, 152, 32, 29, 14, 135, 222, 217, 217, 121, 115, 203, 150, 45, 217, 190, 190, 190, 204, 221, 68, 146, 102, 214, 41, 205, 195, 19, 19, 212, 106, 189, 69, 109, 135, 198, 106, 28, 155, 53, 91, 25, 12, 6, 99, 26, 18, 36, 145, 130, 73, 144, 241, 135, 30, 122, 72, 223, 188, 121, 115, 182, 183, 183, 55, 131, 191, 187, 75, 72, 50, 95, 19, 74, 196, 246, 41, 131, 36, 39, 234, 106, 53, 45, 209, 148, 41, 71, 87, 197, 49, 73, 6, 131, 193, 152, 158, 4, 217, 209, 209, 145, 32, 114, 212, 55, 110, 220, 152, 39, 201, 187, 197, 146, 52, 231, 131, 230, 194, 65, 164, 246, 43, 139, 136, 192, 132, 173, 72, 250, 249, 189, 250, 250, 250, 7, 44, 100, 204, 96, 48, 24, 140, 233, 64, 144, 180, 136, 127, 220, 180, 32, 65, 144, 155, 54, 109, 186, 43, 73, 210, 116, 181, 18, 161, 237, 180, 196, 35, 39, 26, 147, 76, 24, 22, 233, 167, 153, 32, 25, 12, 6, 99, 122, 17, 228, 12, 90, 192, 77, 130, 188, 105, 18, 164, 57, 238, 50, 146, 44, 38, 104, 110, 71, 60, 50, 110, 148, 145, 188, 165, 210, 55, 25, 12, 6, 131, 81, 105, 4, 249, 9, 16, 100, 87, 87, 87, 188, 144, 32, 239, 66, 75, 50, 127, 93, 68, 104, 255, 106, 67, 215, 143, 66, 146, 124, 185, 113, 120, 78, 218, 97, 48, 24, 140, 59, 156, 32, 171, 76, 130, 36, 11, 50, 81, 72, 144, 119, 35, 73, 154, 86, 164, 76, 32, 66, 123, 206, 6, 41, 186, 97, 221, 63, 232, 120, 123, 217, 146, 100, 48, 24, 140, 105, 68, 144, 197, 44, 72, 38, 73, 121, 171, 97, 69, 102, 108, 72, 218, 17, 191, 15, 194, 165, 99, 118, 51, 73, 50, 24, 12, 198, 157, 77, 144, 51, 44, 22, 228, 205, 145, 8, 242, 110, 118, 183, 18, 169, 253, 79, 155, 164, 232, 132, 230, 171, 97, 145, 190, 0, 11, 117, 186, 207, 223, 224, 224, 224, 44, 60, 75, 248, 201, 111, 21, 131, 193, 168, 68, 130, 252, 228, 88, 22, 228, 72, 36, 233, 241, 120, 238, 10, 89, 58, 34, 180, 15, 27, 150, 100, 220, 14, 165, 29, 131, 36, 159, 68, 243, 102, 227, 43, 166, 107, 141, 228, 140, 98, 150, 55, 131, 193, 96, 84, 20, 65, 142, 20, 131, 28, 139, 36, 201, 186, 26, 192, 129, 12, 73, 181, 153, 6, 89, 86, 202, 48, 93, 173, 139, 108, 106, 141, 85, 88, 254, 241, 89, 131, 100, 204, 12, 218, 105, 53, 63, 38, 33, 210, 243, 84, 71, 207, 207, 163, 29, 29, 29, 110, 203, 179, 192, 96, 48, 24, 119, 143, 5, 89, 140, 36, 241, 187, 100, 73, 182, 87, 250, 156, 209, 70, 32, 104, 16, 164, 93, 154, 173, 102, 102, 235, 95, 85, 194, 252, 16, 65, 254, 143, 149, 43, 87, 66, 112, 226, 63, 233, 89, 106, 96, 162, 100, 48, 24, 211, 154, 32, 159, 120, 226, 137, 153, 68, 144, 255, 104, 16, 228, 205, 82, 9, 210, 74, 146, 208, 110, 117, 58, 157, 186, 215, 235, 61, 16, 10, 133, 28, 129, 64, 32, 72, 132, 233, 171, 164, 129, 107, 242, 251, 253, 117, 68, 102, 55, 108, 172, 143, 204, 11, 155, 19, 241, 254, 31, 154, 191, 122, 124, 143, 219, 237, 246, 79, 167, 185, 161, 243, 246, 250, 124, 190, 112, 117, 117, 117, 13, 61, 87, 127, 222, 222, 222, 142, 103, 9, 68, 249, 84, 44, 22, 171, 103, 162, 100, 48, 24, 149, 64, 144, 241, 114, 8, 210, 66, 146, 232, 4, 162, 47, 93, 186, 84, 167, 227, 100, 27, 26, 26, 42, 122, 200, 178, 172, 219, 68, 142, 195, 6, 205, 93, 166, 18, 230, 7, 215, 65, 115, 148, 37, 178, 79, 224, 185, 176, 18, 165, 169, 86, 196, 96, 48, 24, 211, 197, 197, 250, 143, 229, 196, 32, 139, 13, 136, 156, 175, 90, 181, 10, 139, 161, 176, 30, 42, 125, 144, 209, 164, 75, 146, 100, 43, 65, 130, 120, 233, 190, 232, 221, 221, 221, 184, 23, 211, 114, 94, 112, 222, 56, 127, 92, 7, 230, 7, 131, 137, 146, 193, 96, 76, 91, 130, 84, 20, 229, 83, 227, 181, 32, 139, 17, 37, 142, 1, 215, 107, 37, 15, 186, 206, 172, 223, 239, 215, 225, 90, 182, 196, 37, 39, 82, 254, 33, 8, 18, 99, 237, 218, 181, 250, 214, 173, 91, 197, 119, 76, 215, 185, 193, 249, 99, 195, 132, 36, 46, 92, 27, 230, 137, 136, 50, 110, 16, 229, 247, 56, 70, 201, 96, 48, 238, 120, 130, 68, 253, 154, 133, 32, 111, 78, 148, 32, 173, 174, 215, 74, 30, 216, 8, 128, 200, 236, 180, 32, 65, 36, 176, 184, 144, 184, 179, 110, 221, 58, 241, 29, 211, 125, 142, 144, 180, 99, 146, 36, 174, 209, 176, 40, 111, 50, 81, 50, 24, 140, 233, 70, 144, 113, 187, 8, 178, 210, 135, 25, 123, 5, 1, 96, 238, 236, 176, 34, 77, 146, 132, 181, 5, 235, 116, 195, 134, 13, 121, 146, 156, 238, 115, 100, 37, 73, 115, 35, 80, 204, 162, 100, 215, 43, 131, 193, 184, 147, 92, 172, 51, 77, 130, 156, 72, 12, 242, 110, 38, 201, 222, 222, 222, 97, 4, 96, 7, 73, 226, 126, 68, 34, 145, 138, 218, 72, 20, 206, 145, 197, 245, 154, 96, 162, 100, 48, 24, 119, 12, 76, 151, 22, 178, 88, 105, 161, 250, 39, 182, 32, 39, 70, 0, 40, 109, 176, 155, 36, 113, 60, 36, 187, 192, 138, 172, 84, 146, 52, 71, 129, 69, 249, 125, 118, 189, 50, 24, 140, 219, 6, 83, 1, 197, 112, 177, 254, 147, 221, 49, 200, 187, 109, 128, 196, 162, 209, 168, 237, 238, 86, 16, 10, 50, 67, 113, 95, 166, 171, 171, 181, 84, 146, 180, 184, 94, 243, 49, 74, 26, 141, 76, 148, 12, 6, 99, 170, 97, 106, 167, 34, 139, 245, 211, 108, 65, 218, 67, 2, 180, 184, 219, 150, 217, 106, 37, 73, 184, 113, 239, 6, 146, 28, 33, 70, 249, 125, 147, 40, 217, 245, 202, 96, 48, 166, 2, 66, 28, 59, 18, 137, 204, 165, 5, 233, 11, 40, 47, 232, 238, 238, 230, 24, 228, 4, 22, 127, 88, 145, 235, 215, 175, 71, 151, 19, 177, 192, 219, 69, 146, 134, 136, 128, 32, 150, 187, 133, 36, 71, 136, 81, 50, 81, 50, 24, 140, 169, 37, 73, 34, 199, 251, 225, 102, 5, 73, 146, 21, 153, 100, 146, 156, 216, 226, 191, 102, 205, 154, 124, 225, 191, 221, 66, 2, 171, 87, 175, 190, 171, 72, 114, 164, 24, 37, 187, 94, 25, 12, 198, 148, 18, 37, 64, 139, 213, 135, 177, 104, 181, 183, 183, 199, 167, 123, 114, 200, 237, 94, 252, 97, 253, 216, 77, 144, 133, 53, 146, 119, 19, 73, 22, 115, 189, 182, 181, 181, 57, 152, 40, 25, 12, 198, 84, 32, 223, 211, 81, 85, 213, 15, 193, 173, 71, 139, 208, 77, 38, 202, 241, 45, 254, 125, 125, 125, 182, 102, 182, 154, 150, 148, 207, 231, 155, 214, 228, 56, 17, 146, 28, 129, 40, 127, 96, 18, 37, 187, 94, 25, 12, 198, 164, 194, 82, 35, 105, 37, 74, 142, 79, 142, 99, 241, 71, 6, 106, 67, 67, 131, 237, 53, 146, 225, 112, 88, 175, 132, 141, 203, 120, 73, 178, 88, 140, 146, 230, 154, 137, 146, 193, 96, 220, 25, 68, 89, 9, 86, 204, 84, 148, 127, 160, 150, 113, 178, 106, 36, 167, 123, 60, 114, 162, 36, 89, 44, 70, 105, 37, 74, 118, 189, 50, 24, 140, 169, 36, 202, 127, 0, 81, 26, 49, 202, 44, 147, 96, 105, 3, 170, 56, 118, 147, 36, 44, 211, 74, 168, 145, 180, 139, 36, 11, 93, 175, 32, 74, 122, 118, 157, 76, 148, 12, 6, 227, 182, 16, 165, 157, 49, 202, 74, 21, 54, 199, 181, 65, 87, 213, 206, 238, 31, 86, 146, 180, 214, 72, 86, 130, 8, 252, 68, 245, 109, 45, 68, 105, 150, 135, 252, 208, 36, 74, 118, 189, 50, 24, 140, 219, 97, 81, 38, 108, 108, 149, 85, 113, 99, 203, 150, 45, 130, 36, 145, 133, 106, 103, 141, 164, 233, 110, 69, 107, 169, 173, 91, 183, 78, 251, 57, 196, 249, 227, 58, 172, 173, 178, 38, 42, 252, 206, 68, 201, 96, 48, 110, 55, 81, 126, 208, 36, 74, 211, 162, 44, 215, 237, 103, 54, 93, 110, 109, 109, 21, 141, 151, 161, 111, 90, 73, 3, 215, 132, 184, 161, 157, 165, 31, 214, 18, 144, 230, 230, 230, 138, 153, 55, 92, 71, 44, 22, 179, 165, 41, 117, 145, 172, 215, 31, 178, 235, 149, 193, 96, 220, 78, 162, 204, 199, 40, 75, 37, 74, 51, 14, 133, 69, 108, 217, 178, 101, 194, 205, 6, 43, 162, 146, 6, 92, 162, 184, 174, 201, 32, 73, 83, 113, 7, 223, 193, 115, 85, 26, 81, 18, 9, 75, 108, 81, 50, 24, 140, 219, 73, 148, 227, 174, 33, 164, 227, 136, 133, 173, 18, 199, 100, 145, 36, 207, 85, 249, 49, 74, 38, 74, 6, 131, 113, 59, 136, 242, 3, 229, 198, 40, 173, 36, 105, 103, 13, 33, 15, 30, 99, 196, 40, 127, 196, 68, 201, 96, 48, 110, 43, 81, 150, 18, 163, 100, 146, 228, 49, 149, 68, 89, 224, 122, 253, 81, 119, 119, 183, 32, 74, 142, 81, 50, 24, 140, 219, 65, 148, 99, 198, 40, 153, 36, 121, 220, 14, 162, 244, 251, 253, 113, 34, 72, 65, 148, 157, 157, 157, 114, 225, 51, 204, 96, 48, 24, 182, 195, 108, 210, 108, 16, 229, 251, 75, 137, 81, 50, 73, 242, 184, 141, 22, 165, 233, 122, 253, 177, 153, 245, 106, 125, 134, 25, 12, 6, 99, 170, 136, 50, 49, 18, 81, 50, 73, 242, 184, 157, 49, 74, 178, 40, 19, 93, 93, 93, 32, 202, 103, 232, 167, 143, 137, 146, 193, 96, 76, 181, 235, 245, 253, 163, 197, 40, 153, 36, 121, 220, 78, 107, 50, 24, 12, 38, 12, 183, 235, 147, 102, 124, 146, 73, 146, 193, 96, 76, 169, 69, 169, 105, 218, 251, 70, 138, 81, 50, 73, 242, 184, 141, 4, 25, 135, 164, 31, 17, 228, 183, 162, 209, 232, 34, 38, 72, 6, 131, 113, 219, 136, 146, 22, 166, 247, 21, 198, 40, 77, 162, 100, 146, 228, 49, 149, 195, 32, 200, 155, 38, 65, 118, 117, 117, 45, 97, 130, 100, 48, 24, 119, 18, 81, 14, 115, 189, 50, 73, 242, 152, 170, 129, 56, 164, 213, 130, 164, 159, 139, 241, 108, 114, 9, 8, 131, 193, 184, 83, 92, 175, 239, 45, 36, 74, 38, 73, 30, 83, 73, 144, 70, 70, 107, 158, 32, 89, 76, 128, 193, 96, 220, 169, 68, 25, 55, 59, 87, 96, 103, 207, 36, 201, 99, 146, 93, 172, 166, 5, 249, 77, 211, 197, 202, 22, 36, 131, 193, 184, 83, 93, 175, 130, 40, 219, 218, 218, 226, 104, 37, 101, 90, 146, 166, 118, 107, 126, 129, 195, 159, 167, 233, 152, 10, 194, 87, 202, 57, 167, 201, 56, 135, 201, 152, 187, 201, 141, 65, 126, 147, 93, 172, 12, 6, 99, 90, 16, 37, 17, 226, 123, 32, 106, 78, 187, 250, 132, 73, 146, 102, 251, 167, 138, 24, 180, 56, 227, 231, 100, 17, 164, 245, 59, 42, 113, 76, 66, 12, 242, 155, 225, 112, 152, 9, 146, 193, 96, 76, 24, 51, 166, 138, 40, 105, 33, 123, 15, 172, 33, 175, 215, 155, 160, 133, 49, 173, 105, 90, 138, 70, 22, 13, 138, 221, 110, 143, 238, 246, 122, 117, 183, 199, 155, 251, 57, 157, 134, 113, 206, 154, 219, 61, 73, 36, 169, 232, 154, 167, 204, 249, 161, 207, 227, 124, 48, 183, 198, 28, 167, 221, 110, 119, 170, 156, 97, 222, 27, 113, 127, 204, 239, 183, 123, 208, 57, 186, 233, 248, 19, 181, 196, 11, 8, 242, 27, 102, 153, 7, 199, 32, 25, 12, 198, 68, 24, 12, 4, 54, 139, 198, 204, 41, 180, 40, 223, 109, 46, 136, 104, 188, 219, 13, 5, 148, 174, 174, 76, 7, 26, 241, 54, 69, 244, 246, 232, 244, 28, 29, 177, 38, 61, 26, 14, 233, 146, 205, 214, 164, 76, 67, 165, 209, 26, 9, 137, 239, 24, 251, 92, 114, 159, 233, 104, 105, 214, 59, 105, 110, 105, 100, 59, 59, 59, 117, 20, 209, 35, 137, 5, 63, 75, 25, 248, 44, 212, 105, 232, 119, 179, 157, 40, 192, 111, 111, 179, 113, 190, 154, 242, 63, 59, 140, 6, 204, 32, 75, 184, 74, 199, 67, 150, 5, 49, 200, 111, 176, 5, 201, 96, 48, 38, 108, 61, 22, 212, 137, 205, 152, 98, 162, 252, 0, 45, 110, 159, 111, 111, 109, 125, 162, 173, 163, 227, 159, 154, 130, 1, 189, 185, 171, 59, 221, 189, 115, 143, 222, 189, 99, 247, 52, 27, 123, 244, 174, 135, 119, 233, 61, 187, 246, 233, 209, 129, 85, 186, 179, 190, 86, 119, 41, 170, 77, 49, 64, 85, 151, 28, 141, 186, 39, 220, 68, 223, 97, 126, 87, 9, 231, 180, 115, 175, 222, 250, 224, 26, 61, 172, 185, 178, 77, 145, 176, 222, 220, 222, 254, 53, 34, 190, 223, 36, 194, 251, 61, 34, 164, 63, 37, 34, 249, 35, 26, 127, 104, 252, 204, 15, 250, 247, 215, 211, 207, 55, 209, 120, 99, 119, 119, 39, 221, 155, 206, 183, 69, 155, 91, 210, 97, 77, 209, 163, 173, 109, 217, 174, 237, 131, 226, 28, 38, 58, 103, 226, 26, 232, 94, 119, 110, 27, 212, 219, 136, 192, 65, 148, 176, 84, 199, 67, 146, 5, 49, 200, 188, 5, 201, 4, 201, 96, 48, 198, 239, 94, 53, 8, 75, 113, 251, 118, 40, 30, 207, 111, 89, 254, 109, 214, 36, 127, 183, 121, 252, 28, 33, 7, 7, 230, 57, 234, 106, 191, 141, 88, 91, 199, 241, 115, 233, 254, 107, 47, 211, 251, 174, 60, 166, 247, 93, 157, 102, 227, 202, 75, 245, 21, 55, 94, 161, 55, 109, 221, 169, 59, 23, 62, 160, 43, 154, 102, 79, 162, 14, 29, 71, 90, 182, 88, 15, 172, 120, 80, 239, 127, 228, 113, 227, 187, 198, 62, 159, 254, 171, 143, 235, 189, 23, 111, 232, 209, 135, 247, 100, 37, 34, 157, 250, 251, 102, 60, 231, 84, 180, 223, 41, 231, 70, 213, 123, 131, 61, 142, 218, 234, 47, 54, 204, 153, 165, 251, 86, 172, 202, 118, 158, 188, 72, 199, 126, 220, 198, 57, 163, 65, 247, 27, 68, 9, 171, 210, 227, 243, 149, 77, 146, 112, 177, 134, 66, 161, 56, 19, 36, 131, 193, 176, 221, 154, 83, 188, 129, 51, 50, 89, 61, 74, 125, 141, 174, 120, 124, 255, 107, 170, 136, 82, 150, 229, 251, 197, 247, 183, 180, 44, 84, 100, 249, 251, 74, 99, 189, 222, 113, 232, 84, 106, 5, 145, 64, 239, 133, 235, 122, 31, 45, 238, 211, 111, 92, 215, 251, 137, 40, 131, 15, 174, 213, 157, 68, 106, 138, 106, 31, 73, 58, 151, 44, 208, 195, 235, 54, 137, 227, 227, 123, 74, 61, 167, 254, 203, 143, 234, 152, 211, 238, 83, 151, 178, 161, 85, 235, 116, 101, 217, 34, 93, 110, 108, 248, 133, 39, 24, 60, 101, 222, 139, 150, 150, 150, 7, 16, 179, 163, 231, 226, 126, 51, 118, 231, 141, 245, 212, 43, 110, 247, 59, 92, 75, 23, 232, 238, 64, 72, 111, 221, 123, 36, 131, 239, 238, 7, 169, 217, 57, 103, 184, 215, 116, 204, 238, 93, 251, 245, 246, 166, 48, 145, 164, 191, 44, 146, 44, 32, 200, 175, 211, 181, 44, 100, 130, 100, 48, 24, 227, 134, 117, 241, 80, 252, 254, 215, 200, 11, 231, 232, 190, 174, 222, 108, 96, 229, 154, 184, 188, 120, 174, 174, 120, 253, 127, 100, 249, 248, 164, 72, 118, 229, 197, 208, 159, 120, 98, 166, 162, 170, 159, 147, 105, 225, 110, 221, 123, 248, 166, 32, 72, 44, 156, 151, 94, 50, 173, 135, 175, 187, 79, 151, 106, 150, 235, 46, 213, 30, 119, 43, 200, 214, 185, 120, 158, 30, 221, 58, 168, 151, 61, 71, 244, 89, 124, 94, 144, 235, 149, 151, 102, 218, 14, 30, 143, 187, 155, 98, 186, 188, 100, 62, 142, 253, 49, 79, 75, 174, 11, 134, 21, 90, 40, 116, 80, 106, 168, 255, 185, 171, 122, 169, 30, 90, 179, 49, 211, 115, 246, 145, 4, 172, 82, 28, 207, 246, 251, 131, 227, 145, 69, 9, 215, 48, 98, 209, 229, 144, 36, 62, 103, 37, 72, 182, 32, 25, 12, 198, 132, 96, 90, 9, 218, 134, 13, 247, 41, 30, 207, 251, 229, 133, 247, 195, 133, 151, 162, 221, 124, 186, 239, 242, 163, 217, 224, 202, 53, 41, 121, 209, 3, 186, 234, 247, 255, 201, 36, 90, 148, 249, 152, 167, 234, 241, 190, 27, 231, 16, 123, 120, 119, 124, 5, 22, 225, 233, 76, 144, 56, 119, 178, 218, 122, 207, 95, 211, 221, 209, 22, 93, 110, 168, 183, 47, 38, 73, 100, 235, 92, 186, 80, 111, 217, 125, 80, 31, 247, 70, 194, 248, 29, 204, 51, 157, 99, 186, 105, 211, 182, 148, 226, 104, 20, 110, 92, 197, 23, 120, 226, 9, 108, 88, 90, 122, 157, 138, 162, 126, 64, 94, 52, 87, 7, 145, 18, 161, 38, 251, 175, 62, 150, 233, 191, 252, 210, 201, 187, 55, 38, 73, 14, 238, 43, 203, 146, 52, 8, 210, 140, 65, 126, 141, 45, 72, 6, 131, 97, 139, 5, 233, 138, 197, 36, 90, 128, 190, 6, 50, 140, 108, 218, 150, 0, 57, 98, 113, 55, 22, 45, 184, 228, 146, 32, 46, 213, 227, 123, 139, 197, 63, 107, 151, 69, 153, 79, 12, 34, 139, 245, 13, 242, 130, 251, 244, 200, 198, 173, 100, 165, 60, 54, 237, 173, 199, 62, 195, 90, 235, 62, 125, 153, 172, 113, 159, 46, 59, 29, 246, 21, 201, 163, 131, 69, 109, 181, 222, 126, 232, 100, 142, 228, 38, 64, 88, 189, 6, 153, 227, 56, 157, 199, 206, 38, 97, 245, 226, 126, 187, 100, 249, 255, 201, 181, 213, 63, 81, 234, 170, 233, 158, 108, 75, 246, 156, 191, 150, 1, 33, 231, 221, 162, 147, 185, 185, 16, 36, 185, 183, 100, 146, 100, 23, 43, 131, 193, 176, 213, 114, 51, 99, 144, 158, 72, 164, 79, 118, 52, 254, 210, 69, 11, 110, 203, 174, 3, 55, 243, 228, 100, 46, 132, 32, 75, 34, 205, 208, 218, 141, 9, 16, 24, 45, 246, 111, 29, 226, 201, 137, 19, 165, 233, 102, 85, 253, 161, 151, 201, 139, 231, 233, 176, 92, 243, 4, 61, 205, 221, 172, 194, 165, 73, 243, 73, 196, 67, 4, 233, 4, 233, 216, 68, 146, 74, 238, 88, 178, 164, 119, 157, 56, 47, 190, 99, 194, 46, 79, 211, 5, 155, 187, 255, 153, 230, 93, 251, 19, 170, 166, 233, 158, 150, 54, 189, 243, 232, 153, 56, 254, 30, 177, 204, 94, 196, 62, 167, 194, 2, 47, 195, 146, 44, 112, 177, 178, 5, 201, 96, 48, 198, 143, 97, 218, 169, 161, 208, 49, 178, 20, 116, 44, 134, 237, 135, 79, 197, 139, 90, 9, 22, 162, 12, 175, 219, 20, 7, 81, 170, 94, 255, 219, 11, 73, 110, 34, 174, 94, 53, 24, 62, 34, 47, 95, 162, 123, 59, 123, 50, 180, 80, 103, 132, 139, 178, 2, 226, 144, 184, 6, 88, 103, 109, 7, 142, 231, 226, 145, 118, 201, 173, 209, 49, 96, 149, 170, 254, 128, 222, 115, 246, 138, 145, 184, 115, 195, 182, 115, 54, 173, 74, 178, 128, 147, 189, 231, 175, 165, 166, 196, 122, 28, 23, 73, 42, 76, 144, 12, 6, 195, 126, 247, 170, 32, 168, 64, 240, 183, 145, 28, 227, 142, 54, 235, 93, 167, 46, 38, 71, 141, 107, 25, 11, 103, 63, 136, 114, 195, 230, 68, 142, 40, 189, 239, 158, 8, 81, 230, 99, 161, 161, 166, 181, 32, 106, 156, 71, 239, 249, 71, 82, 88, 240, 43, 129, 32, 243, 36, 73, 243, 218, 60, 184, 95, 100, 162, 218, 149, 180, 35, 72, 178, 161, 78, 247, 52, 183, 229, 178, 126, 177, 137, 177, 115, 206, 204, 44, 88, 144, 175, 221, 199, 182, 145, 36, 165, 156, 139, 53, 213, 219, 215, 7, 130, 252, 42, 19, 36, 131, 193, 152, 56, 65, 34, 25, 195, 227, 249, 59, 196, 156, 252, 125, 43, 211, 136, 51, 229, 220, 117, 215, 75, 74, 242, 192, 194, 137, 152, 161, 112, 189, 186, 61, 31, 24, 15, 81, 154, 231, 226, 109, 110, 142, 200, 13, 245, 73, 34, 92, 178, 90, 46, 37, 109, 113, 27, 222, 105, 49, 73, 186, 166, 166, 45, 59, 116, 231, 162, 185, 182, 213, 72, 130, 108, 165, 234, 101, 186, 191, 119, 133, 112, 129, 86, 204, 124, 149, 65, 146, 136, 65, 134, 35, 145, 116, 119, 79, 143, 222, 217, 217, 241, 89, 83, 73, 103, 34, 158, 13, 6, 131, 113, 151, 19, 164, 191, 165, 165, 142, 172, 144, 47, 129, 32, 195, 27, 182, 196, 145, 148, 83, 150, 229, 102, 37, 202, 135, 182, 199, 115, 68, 233, 254, 72, 57, 68, 105, 126, 198, 223, 210, 87, 231, 146, 164, 159, 40, 78, 7, 98, 118, 137, 156, 37, 123, 189, 226, 22, 124, 204, 85, 104, 205, 70, 221, 185, 120, 62, 145, 164, 29, 250, 173, 114, 190, 70, 18, 199, 21, 49, 196, 74, 218, 88, 148, 64, 146, 34, 73, 39, 18, 201, 118, 181, 183, 165, 219, 90, 90, 116, 119, 48, 120, 4, 207, 84, 36, 18, 153, 203, 111, 59, 131, 193, 40, 7, 51, 77, 82, 114, 71, 90, 58, 92, 78, 199, 207, 92, 53, 203, 244, 216, 206, 189, 113, 81, 0, 62, 158, 216, 159, 133, 40, 155, 54, 239, 184, 41, 178, 32, 221, 238, 79, 14, 14, 14, 206, 26, 139, 40, 205, 127, 147, 7, 6, 238, 87, 20, 245, 107, 174, 154, 229, 122, 219, 129, 99, 137, 188, 88, 64, 165, 45, 244, 198, 159, 253, 189, 3, 185, 178, 10, 59, 72, 82, 150, 197, 113, 156, 11, 231, 232, 209, 45, 59, 245, 74, 169, 35, 29, 139, 36, 101, 131, 36, 133, 5, 217, 20, 213, 59, 155, 99, 122, 215, 154, 117, 105, 111, 75, 155, 238, 172, 94, 26, 247, 68, 219, 218, 216, 213, 202, 96, 48, 202, 65, 94, 156, 220, 29, 14, 239, 147, 234, 106, 196, 34, 211, 118, 240, 120, 34, 151, 136, 49, 129, 236, 81, 147, 40, 105, 33, 139, 110, 221, 25, 135, 248, 128, 226, 246, 124, 218, 36, 193, 162, 11, 149, 85, 209, 71, 243, 124, 66, 94, 50, 79, 111, 30, 60, 16, 175, 200, 69, 222, 90, 35, 121, 225, 154, 200, 16, 69, 185, 134, 221, 36, 217, 178, 235, 192, 93, 69, 146, 176, 38, 115, 4, 73, 227, 193, 53, 226, 115, 157, 39, 206, 39, 85, 201, 137, 127, 255, 145, 22, 235, 91, 158, 123, 212, 6, 102, 243, 235, 207, 96, 48, 70, 196, 48, 137, 57, 95, 224, 9, 121, 233, 66, 221, 29, 137, 234, 93, 39, 47, 36, 109, 91, 84, 173, 68, 185, 109, 87, 28, 53, 150, 46, 77, 251, 23, 136, 18, 20, 33, 74, 144, 181, 104, 187, 165, 120, 189, 111, 149, 231, 223, 139, 56, 93, 188, 34, 93, 133, 133, 53, 146, 103, 174, 136, 44, 84, 185, 177, 193, 158, 152, 36, 72, 82, 133, 110, 235, 34, 189, 253, 208, 137, 10, 119, 183, 14, 213, 73, 58, 104, 254, 194, 81, 131, 32, 87, 173, 21, 2, 13, 102, 22, 110, 219, 254, 99, 9, 215, 242, 197, 186, 75, 209, 254, 181, 96, 147, 200, 96, 48, 24, 195, 49, 76, 98, 206, 227, 251, 107, 33, 49, 215, 221, 151, 233, 57, 123, 53, 93, 82, 130, 206, 56, 21, 91, 154, 119, 236, 185, 9, 162, 84, 84, 245, 139, 208, 253, 44, 56, 23, 177, 96, 169, 254, 224, 239, 138, 120, 232, 186, 77, 9, 34, 144, 108, 69, 146, 227, 48, 146, 124, 76, 239, 60, 126, 94, 119, 145, 5, 36, 134, 157, 217, 173, 68, 26, 157, 168, 145, 188, 242, 210, 138, 143, 73, 162, 95, 102, 48, 18, 17, 46, 214, 206, 213, 107, 245, 62, 178, 206, 251, 140, 235, 54, 51, 136, 161, 208, 36, 47, 154, 163, 43, 30, 207, 219, 140, 103, 110, 210, 187, 215, 48, 24, 140, 105, 6, 179, 172, 194, 211, 50, 176, 140, 172, 186, 127, 5, 105, 133, 215, 110, 74, 162, 56, 60, 151, 160, 115, 125, 210, 98, 111, 32, 224, 230, 157, 123, 111, 66, 16, 128, 200, 224, 43, 90, 71, 199, 2, 156, 75, 189, 65, 152, 106, 40, 116, 9, 22, 173, 191, 127, 101, 26, 9, 67, 183, 165, 180, 224, 54, 100, 182, 66, 17, 71, 170, 94, 106, 115, 141, 164, 147, 200, 192, 171, 247, 144, 149, 42, 228, 225, 42, 56, 187, 181, 45, 18, 70, 43, 46, 189, 35, 218, 68, 4, 185, 46, 103, 65, 22, 217, 24, 96, 211, 21, 94, 247, 80, 2, 207, 188, 22, 8, 252, 58, 158, 57, 195, 253, 63, 131, 87, 6, 6, 131, 49, 195, 180, 218, 220, 209, 104, 84, 150, 156, 63, 116, 85, 47, 17, 187, 107, 97, 177, 77, 118, 113, 190, 81, 87, 39, 44, 202, 157, 251, 226, 242, 210, 5, 176, 40, 191, 230, 234, 232, 168, 49, 8, 114, 183, 92, 189, 76, 247, 180, 118, 32, 65, 39, 83, 73, 181, 144, 99, 145, 36, 180, 85, 157, 11, 230, 216, 148, 217, 154, 43, 255, 144, 235, 235, 116, 119, 172, 101, 168, 70, 178, 82, 73, 114, 231, 30, 189, 131, 172, 71, 209, 36, 186, 192, 130, 44, 90, 199, 123, 233, 37, 105, 120, 77, 80, 255, 171, 133, 195, 251, 139, 184, 253, 25, 12, 198, 93, 136, 153, 166, 91, 201, 29, 140, 236, 144, 234, 106, 50, 138, 36, 33, 107, 52, 167, 160, 51, 101, 242, 110, 6, 81, 162, 120, 126, 215, 193, 184, 107, 217, 98, 44, 234, 95, 80, 67, 77, 187, 165, 218, 234, 132, 59, 20, 209, 123, 206, 94, 77, 193, 5, 89, 241, 4, 105, 33, 201, 232, 182, 65, 221, 49, 119, 54, 18, 155, 108, 75, 218, 145, 150, 47, 209, 253, 61, 253, 149, 73, 144, 86, 146, 220, 125, 64, 111, 119, 203, 122, 231, 154, 245, 35, 19, 100, 65, 12, 24, 130, 20, 136, 191, 35, 81, 10, 25, 221, 76, 148, 12, 198, 93, 140, 97, 18, 115, 129, 192, 99, 114, 245, 82, 93, 11, 134, 17, 7, 75, 220, 182, 172, 71, 131, 40, 91, 118, 29, 72, 201, 144, 98, 107, 168, 131, 85, 137, 248, 89, 166, 226, 196, 2, 74, 168, 145, 12, 175, 123, 72, 119, 206, 187, 23, 177, 50, 81, 227, 56, 97, 146, 36, 178, 69, 102, 107, 104, 205, 134, 202, 140, 71, 230, 199, 163, 130, 24, 123, 14, 157, 208, 123, 207, 93, 29, 157, 32, 243, 10, 71, 215, 197, 198, 164, 235, 228, 133, 20, 50, 185, 101, 135, 227, 105, 212, 6, 51, 81, 50, 24, 119, 33, 204, 248, 35, 160, 120, 125, 111, 70, 47, 64, 111, 71, 119, 86, 88, 107, 87, 111, 115, 221, 161, 65, 148, 173, 123, 14, 165, 165, 186, 218, 76, 251, 225, 83, 153, 74, 21, 11, 24, 117, 144, 165, 231, 239, 127, 80, 119, 210, 189, 17, 150, 164, 108, 3, 73, 18, 217, 58, 30, 152, 37, 84, 124, 42, 58, 59, 216, 152, 63, 88, 148, 229, 196, 175, 241, 220, 227, 89, 67, 169, 147, 171, 86, 232, 229, 126, 201, 172, 225, 229, 210, 16, 6, 227, 46, 35, 72, 57, 58, 176, 136, 172, 180, 127, 66, 198, 104, 104, 245, 250, 36, 196, 193, 239, 168, 120, 31, 45, 110, 221, 167, 47, 101, 43, 214, 45, 56, 198, 181, 99, 193, 246, 180, 182, 11, 113, 243, 92, 76, 82, 158, 120, 179, 101, 88, 146, 100, 153, 54, 239, 218, 95, 249, 36, 57, 206, 80, 65, 94, 51, 119, 231, 94, 81, 154, 68, 27, 139, 191, 55, 99, 247, 85, 156, 241, 202, 96, 84, 54, 204, 130, 125, 173, 169, 41, 72, 150, 197, 119, 229, 37, 11, 16, 247, 74, 220, 54, 49, 234, 18, 92, 142, 119, 29, 65, 226, 186, 233, 94, 144, 85, 175, 171, 254, 160, 40, 215, 112, 169, 246, 232, 182, 10, 73, 186, 69, 115, 245, 246, 195, 39, 239, 14, 146, 156, 208, 179, 247, 88, 54, 178, 113, 139, 208, 25, 214, 252, 254, 223, 49, 94, 33, 182, 38, 25, 140, 10, 197, 44, 99, 84, 185, 67, 77, 15, 209, 194, 27, 71, 23, 249, 214, 189, 71, 166, 56, 65, 103, 242, 45, 129, 74, 17, 18, 232, 58, 121, 65, 119, 73, 118, 246, 145, 204, 145, 164, 84, 189, 52, 27, 94, 179, 49, 125, 183, 110, 64, 74, 127, 238, 132, 7, 35, 11, 33, 127, 100, 92, 107, 161, 166, 99, 28, 159, 100, 48, 42, 216, 122, 20, 22, 100, 48, 120, 85, 174, 89, 70, 59, 227, 0, 132, 193, 227, 83, 222, 235, 143, 71, 201, 153, 173, 29, 135, 79, 137, 76, 84, 219, 68, 4, 114, 2, 231, 89, 97, 77, 206, 187, 7, 146, 128, 41, 148, 221, 240, 189, 31, 165, 233, 181, 200, 120, 189, 150, 70, 201, 140, 92, 91, 163, 107, 225, 216, 138, 194, 152, 62, 131, 193, 152, 198, 176, 238, 122, 85, 191, 255, 127, 163, 88, 223, 219, 214, 9, 185, 51, 177, 64, 246, 242, 2, 121, 199, 146, 100, 235, 222, 195, 186, 115, 190, 232, 148, 50, 241, 164, 157, 220, 72, 27, 157, 48, 254, 91, 81, 213, 207, 65, 156, 129, 190, 35, 117, 87, 38, 69, 149, 76, 148, 70, 198, 235, 169, 139, 73, 149, 238, 131, 236, 112, 252, 210, 31, 139, 73, 108, 81, 50, 24, 21, 68, 144, 104, 1, 68, 11, 237, 71, 17, 91, 9, 62, 184, 54, 149, 75, 208, 121, 140, 9, 242, 142, 38, 201, 199, 245, 216, 246, 93, 67, 53, 146, 246, 144, 100, 92, 205, 89, 165, 255, 168, 180, 172, 94, 40, 75, 210, 147, 70, 171, 177, 36, 111, 152, 198, 78, 228, 105, 63, 124, 50, 225, 170, 173, 198, 252, 125, 221, 212, 24, 230, 140, 87, 6, 99, 122, 34, 175, 160, 163, 54, 55, 107, 244, 82, 255, 39, 74, 60, 132, 40, 248, 229, 71, 179, 253, 147, 173, 160, 195, 195, 22, 75, 50, 188, 126, 179, 238, 92, 112, 191, 157, 150, 100, 194, 32, 201, 247, 137, 103, 35, 210, 26, 146, 234, 235, 82, 90, 32, 168, 247, 156, 189, 146, 228, 141, 211, 216, 68, 217, 178, 251, 64, 78, 99, 216, 210, 48, 188, 138, 51, 94, 25, 140, 233, 3, 99, 103, 43, 118, 183, 238, 80, 116, 141, 220, 216, 240, 2, 10, 242, 91, 247, 28, 186, 41, 178, 25, 239, 214, 100, 152, 105, 40, 36, 16, 88, 241, 160, 238, 20, 125, 36, 53, 219, 72, 82, 203, 117, 18, 121, 109, 62, 70, 29, 142, 110, 133, 136, 132, 183, 189, 43, 75, 207, 69, 186, 226, 53, 113, 109, 216, 188, 136, 134, 225, 11, 239, 71, 230, 241, 31, 176, 53, 201, 96, 76, 35, 200, 178, 124, 127, 126, 241, 11, 69, 206, 66, 177, 70, 245, 122, 245, 142, 35, 167, 19, 156, 160, 51, 253, 22, 100, 104, 213, 162, 143, 167, 77, 137, 59, 89, 26, 73, 195, 146, 188, 142, 103, 164, 190, 190, 62, 39, 30, 31, 8, 93, 71, 172, 58, 180, 106, 93, 50, 223, 93, 133, 159, 147, 145, 51, 173, 47, 63, 154, 13, 14, 172, 78, 35, 166, 171, 5, 131, 231, 56, 62, 201, 96, 76, 15, 235, 49, 239, 242, 193, 14, 23, 238, 85, 52, 235, 237, 62, 125, 57, 85, 177, 141, 137, 43, 88, 72, 160, 231, 220, 35, 58, 145, 23, 18, 69, 236, 42, 255, 200, 96, 128, 36, 105, 51, 181, 71, 108, 164, 114, 25, 154, 226, 185, 81, 188, 222, 63, 133, 117, 20, 221, 186, 115, 104, 67, 197, 247, 162, 184, 53, 121, 249, 165, 66, 104, 31, 239, 23, 54, 162, 238, 80, 104, 141, 101, 62, 25, 12, 198, 157, 18, 119, 172, 170, 26, 204, 215, 62, 2, 46, 111, 112, 167, 236, 116, 126, 77, 186, 175, 74, 199, 78, 183, 247, 194, 53, 251, 123, 64, 242, 152, 154, 26, 201, 83, 23, 115, 46, 86, 123, 220, 172, 38, 73, 154, 127, 238, 195, 243, 98, 148, 6, 229, 55, 87, 46, 205, 253, 41, 87, 46, 227, 53, 193, 27, 171, 49, 74, 67, 32, 160, 126, 250, 82, 18, 158, 26, 185, 161, 254, 5, 37, 26, 117, 179, 69, 201, 96, 220, 33, 16, 139, 155, 37, 14, 226, 105, 106, 233, 117, 57, 157, 159, 130, 122, 14, 234, 31, 155, 119, 238, 75, 146, 53, 114, 119, 180, 148, 170, 212, 26, 201, 35, 167, 69, 39, 10, 151, 98, 91, 141, 164, 89, 254, 241, 2, 253, 116, 91, 72, 178, 170, 177, 177, 113, 142, 120, 142, 90, 6, 150, 145, 149, 249, 3, 197, 217, 168, 119, 28, 59, 147, 228, 26, 202, 49, 18, 121, 104, 126, 58, 143, 158, 137, 35, 230, 79, 243, 246, 95, 193, 129, 129, 121, 28, 163, 100, 48, 110, 47, 102, 90, 93, 58, 90, 71, 71, 128, 22, 189, 191, 149, 22, 205, 213, 85, 77, 211, 155, 30, 218, 158, 238, 57, 247, 72, 174, 64, 156, 227, 74, 211, 58, 139, 82, 212, 72, 46, 65, 95, 77, 205, 46, 146, 76, 25, 36, 249, 61, 90, 208, 23, 89, 22, 243, 97, 77, 133, 67, 29, 171, 106, 228, 250, 186, 31, 161, 27, 76, 207, 233, 203, 105, 209, 148, 153, 159, 163, 209, 51, 94, 247, 28, 142, 35, 188, 161, 104, 218, 199, 173, 239, 42, 47, 87, 12, 198, 20, 194, 234, 198, 241, 198, 98, 245, 170, 199, 243, 122, 231, 226, 249, 25, 165, 177, 94, 15, 173, 221, 148, 233, 58, 117, 81, 196, 30, 217, 122, 172, 140, 133, 55, 182, 125, 183, 208, 88, 85, 52, 251, 72, 210, 72, 218, 249, 55, 203, 99, 37, 44, 30, 34, 77, 31, 141, 109, 46, 77, 59, 78, 68, 122, 78, 209, 60, 255, 236, 188, 175, 74, 247, 245, 244, 167, 251, 239, 70, 113, 249, 114, 59, 214, 208, 166, 180, 105, 203, 142, 132, 200, 120, 245, 250, 222, 104, 204, 237, 172, 194, 13, 8, 131, 193, 152, 132, 184, 163, 213, 117, 211, 213, 53, 56, 71, 241, 120, 94, 41, 213, 44, 255, 133, 107, 249, 98, 61, 176, 98, 149, 222, 121, 252, 92, 28, 196, 152, 239, 181, 200, 4, 89, 17, 66, 2, 145, 13, 91, 114, 45, 178, 84, 219, 73, 242, 253, 86, 87, 171, 211, 233, 84, 232, 239, 126, 5, 79, 132, 139, 54, 92, 74, 125, 141, 14, 101, 25, 196, 48, 163, 91, 118, 86, 120, 207, 73, 251, 50, 94, 81, 127, 12, 161, 14, 100, 9, 107, 193, 224, 35, 28, 159, 100, 48, 38, 153, 28, 11, 95, 48, 205, 31, 60, 33, 213, 215, 125, 15, 105, 231, 190, 142, 110, 189, 253, 208, 137, 4, 189, 152, 105, 179, 246, 145, 173, 199, 10, 171, 145, 28, 88, 109, 183, 110, 171, 32, 73, 178, 20, 223, 104, 88, 143, 162, 92, 72, 146, 36, 23, 253, 221, 115, 46, 71, 163, 222, 178, 107, 255, 205, 238, 83, 151, 82, 93, 39, 47, 100, 123, 208, 168, 152, 239, 69, 233, 68, 9, 139, 251, 194, 245, 180, 183, 173, 51, 43, 154, 151, 71, 34, 155, 197, 123, 203, 25, 175, 12, 134, 189, 192, 14, 223, 106, 61, 106, 145, 230, 205, 114, 99, 195, 151, 176, 67, 245, 68, 155, 245, 150, 221, 7, 83, 244, 98, 166, 89, 24, 224, 14, 95, 52, 199, 115, 95, 204, 223, 161, 159, 222, 142, 46, 59, 107, 36, 69, 226, 142, 97, 73, 62, 110, 90, 57, 166, 53, 169, 120, 252, 171, 229, 250, 90, 221, 223, 187, 34, 107, 221, 120, 241, 40, 87, 12, 253, 49, 104, 34, 39, 145, 60, 39, 55, 212, 39, 161, 104, 196, 22, 37, 131, 97, 31, 102, 14, 19, 35, 143, 70, 123, 104, 65, 251, 136, 52, 239, 30, 145, 177, 26, 123, 120, 79, 162, 231, 252, 181, 204, 148, 182, 181, 98, 2, 30, 119, 9, 199, 184, 220, 148, 70, 13, 30, 106, 36, 181, 112, 83, 174, 143, 164, 98, 155, 144, 64, 198, 32, 201, 131, 86, 11, 39, 79, 148, 126, 255, 85, 105, 238, 44, 8, 10, 164, 242, 45, 180, 38, 251, 254, 87, 88, 120, 192, 140, 39, 67, 11, 23, 109, 232, 92, 178, 252, 20, 26, 155, 91, 231, 153, 193, 96, 140, 131, 28, 173, 150, 35, 234, 173, 20, 85, 125, 155, 180, 100, 129, 174, 202, 114, 46, 99, 245, 236, 213, 4, 146, 3, 114, 154, 171, 215, 167, 196, 117, 148, 95, 232, 153, 248, 202, 38, 185, 174, 83, 23, 145, 72, 149, 41, 151, 40, 77, 107, 4, 53, 146, 72, 216, 145, 209, 75, 210, 30, 33, 129, 172, 232, 37, 73, 199, 146, 101, 121, 160, 136, 27, 80, 212, 218, 42, 62, 223, 155, 161, 75, 26, 219, 190, 59, 62, 233, 130, 2, 230, 102, 162, 194, 172, 86, 122, 63, 179, 34, 59, 121, 223, 145, 132, 188, 108, 145, 78, 239, 242, 167, 243, 179, 204, 165, 33, 12, 198, 248, 45, 71, 173, 175, 111, 57, 45, 140, 175, 113, 46, 95, 146, 86, 26, 234, 244, 208, 234, 245, 180, 88, 94, 74, 208, 34, 146, 205, 47, 182, 83, 176, 179, 199, 119, 117, 159, 190, 164, 123, 187, 122, 211, 77, 91, 118, 100, 152, 40, 203, 43, 48, 239, 60, 126, 62, 227, 146, 37, 221, 37, 73, 176, 40, 210, 185, 238, 26, 215, 203, 58, 6, 106, 36, 133, 21, 9, 130, 179, 145, 36, 161, 221, 74, 68, 233, 41, 98, 217, 88, 4, 5, 180, 207, 186, 150, 47, 209, 219, 15, 30, 191, 57, 105, 130, 2, 249, 166, 210, 23, 179, 237, 135, 78, 165, 42, 53, 227, 53, 186, 109, 48, 46, 47, 156, 163, 171, 30, 223, 91, 44, 155, 17, 46, 13, 97, 48, 198, 130, 117, 23, 223, 53, 56, 56, 71, 245, 135, 110, 72, 203, 151, 254, 194, 85, 179, 76, 247, 247, 13, 232, 29, 71, 207, 164, 104, 177, 204, 76, 25, 57, 14, 203, 210, 123, 169, 80, 235, 113, 206, 174, 210, 157, 244, 130, 183, 238, 61, 156, 102, 245, 149, 210, 172, 111, 180, 32, 67, 175, 78, 169, 122, 217, 243, 178, 211, 241, 162, 234, 15, 232, 221, 103, 46, 151, 220, 150, 44, 95, 35, 185, 239, 72, 46, 105, 7, 4, 105, 147, 36, 157, 81, 35, 249, 19, 179, 70, 178, 202, 162, 212, 100, 37, 77, 181, 187, 187, 218, 229, 116, 254, 4, 159, 239, 58, 121, 33, 153, 207, 154, 182, 217, 218, 238, 57, 119, 53, 171, 133, 35, 122, 99, 85, 149, 222, 188, 99, 111, 186, 18, 91, 117, 65, 7, 55, 180, 122, 67, 18, 214, 185, 22, 8, 61, 206, 110, 87, 6, 99, 108, 204, 182, 46, 78, 74, 32, 124, 84, 106, 168, 253, 54, 234, 171, 124, 29, 93, 122, 219, 129, 99, 9, 136, 39, 11, 23, 212, 20, 199, 107, 134, 90, 1, 29, 20, 47, 181, 26, 12, 191, 133, 172, 161, 47, 163, 52, 192, 176, 104, 57, 70, 57, 186, 74, 78, 54, 178, 105, 123, 82, 94, 112, 63, 230, 238, 164, 26, 108, 90, 41, 211, 166, 7, 34, 229, 208, 249, 44, 165, 40, 63, 95, 35, 185, 99, 175, 238, 92, 60, 207, 206, 242, 15, 147, 36, 255, 221, 242, 44, 206, 24, 105, 243, 166, 133, 195, 93, 80, 251, 113, 199, 90, 244, 222, 243, 215, 210, 118, 151, 129, 224, 120, 193, 85, 235, 116, 231, 210, 69, 105, 197, 237, 249, 177, 92, 87, 3, 229, 154, 180, 237, 132, 124, 39, 108, 156, 46, 209, 198, 169, 179, 39, 43, 47, 95, 140, 140, 215, 157, 152, 95, 78, 228, 97, 48, 134, 99, 134, 65, 140, 67, 228, 232, 15, 111, 164, 221, 250, 23, 224, 138, 241, 68, 162, 32, 166, 4, 218, 20, 153, 73, 57, 83, 190, 80, 152, 110, 214, 51, 87, 18, 170, 199, 171, 203, 206, 198, 239, 136, 197, 50, 210, 220, 41, 147, 69, 227, 235, 234, 197, 231, 210, 125, 151, 184, 176, 188, 88, 231, 122, 209, 144, 247, 224, 137, 132, 171, 122, 41, 98, 137, 31, 204, 147, 78, 48, 124, 21, 74, 44, 100, 153, 167, 104, 238, 198, 238, 174, 97, 182, 98, 218, 180, 205, 110, 33, 1, 51, 179, 245, 195, 197, 172, 72, 139, 203, 117, 86, 190, 51, 72, 48, 120, 18, 229, 70, 129, 21, 171, 178, 216, 184, 217, 209, 66, 203, 170, 80, 3, 141, 88, 69, 243, 252, 145, 175, 179, 83, 150, 235, 107, 146, 238, 166, 24, 54, 19, 169, 254, 10, 106, 213, 213, 107, 188, 87, 61, 103, 175, 164, 181, 80, 88, 151, 234, 107, 51, 90, 164, 165, 185, 72, 76, 152, 193, 184, 59, 129, 132, 28, 107, 82, 142, 175, 185, 163, 197, 37, 59, 63, 140, 164, 28, 205, 235, 211, 99, 219, 118, 65, 132, 92, 184, 180, 250, 204, 70, 200, 183, 107, 129, 184, 242, 210, 76, 96, 229, 154, 12, 206, 205, 19, 139, 173, 54, 207, 89, 245, 7, 95, 14, 50, 135, 162, 8, 172, 37, 118, 187, 22, 91, 4, 175, 166, 33, 227, 38, 55, 54, 60, 227, 234, 232, 168, 193, 188, 153, 122, 168, 170, 47, 240, 90, 88, 151, 68, 124, 241, 82, 172, 113, 97, 101, 61, 184, 54, 39, 73, 167, 185, 237, 22, 18, 248, 211, 17, 92, 126, 69, 227, 100, 90, 184, 233, 183, 229, 234, 101, 122, 116, 203, 142, 212, 132, 149, 119, 242, 73, 73, 151, 18, 240, 78, 200, 78, 231, 183, 189, 61, 91, 230, 139, 239, 9, 133, 142, 99, 51, 17, 90, 189, 62, 37, 90, 117, 85, 82, 198, 235, 133, 235, 57, 141, 215, 227, 231, 146, 138, 44, 235, 178, 36, 253, 72, 139, 197, 150, 179, 69, 201, 184, 219, 49, 92, 99, 181, 187, 91, 117, 169, 234, 91, 164, 197, 243, 116, 149, 22, 173, 240, 198, 45, 25, 218, 93, 166, 250, 175, 62, 62, 180, 67, 191, 77, 11, 195, 208, 238, 254, 80, 66, 94, 76, 214, 139, 215, 251, 71, 150, 157, 174, 112, 201, 41, 170, 250, 113, 196, 75, 33, 96, 32, 226, 147, 23, 184, 171, 72, 1, 169, 137, 222, 130, 74, 168, 233, 97, 203, 226, 151, 39, 30, 197, 237, 121, 31, 92, 216, 205, 59, 247, 197, 71, 140, 239, 154, 5, 233, 244, 19, 150, 187, 180, 124, 169, 157, 36, 105, 246, 145, 124, 69, 145, 197, 121, 150, 113, 191, 131, 232, 51, 41, 215, 215, 255, 186, 92, 83, 253, 38, 231, 242, 101, 111, 151, 106, 150, 127, 2, 22, 173, 115, 254, 125, 136, 79, 102, 39, 234, 118, 237, 191, 252, 146, 180, 175, 187, 79, 151, 150, 45, 214, 33, 202, 63, 108, 51, 225, 241, 252, 57, 136, 178, 101, 247, 1, 163, 3, 201, 245, 138, 218, 76, 225, 154, 218, 14, 28, 143, 187, 114, 2, 17, 159, 27, 154, 254, 193, 89, 188, 92, 50, 238, 58, 130, 204, 91, 142, 237, 237, 75, 85, 175, 247, 85, 210, 178, 133, 113, 200, 125, 5, 87, 173, 203, 118, 157, 200, 37, 67, 220, 17, 26, 171, 67, 238, 160, 148, 104, 249, 227, 116, 60, 217, 216, 213, 53, 199, 92, 60, 77, 43, 216, 223, 210, 82, 71, 86, 210, 47, 181, 64, 72, 88, 77, 172, 15, 107, 217, 92, 236, 58, 24, 7, 1, 210, 230, 226, 141, 150, 184, 115, 222, 147, 96, 254, 116, 41, 202, 87, 176, 209, 104, 59, 120, 188, 120, 27, 42, 145, 208, 146, 235, 35, 233, 110, 106, 214, 165, 186, 218, 201, 208, 109, 61, 84, 64, 146, 67, 89, 173, 46, 215, 255, 115, 187, 53, 221, 29, 8, 234, 158, 96, 72, 247, 70, 99, 186, 159, 200, 26, 241, 180, 166, 135, 182, 79, 108, 19, 151, 203, 246, 204, 70, 183, 239, 74, 200, 11, 238, 211, 181, 64, 224, 215, 45, 243, 35, 72, 162, 229, 212, 169, 123, 92, 78, 231, 127, 42, 46, 121, 114, 18, 134, 238, 132, 140, 87, 196, 155, 31, 222, 29, 199, 28, 40, 30, 223, 219, 44, 225, 24, 214, 120, 101, 220, 53, 48, 119, 133, 51, 85, 183, 239, 186, 92, 87, 251, 83, 236, 142, 253, 189, 43, 68, 75, 29, 184, 146, 108, 75, 202, 153, 232, 49, 204, 108, 86, 72, 160, 61, 184, 54, 131, 154, 46, 53, 24, 89, 95, 24, 47, 49, 23, 84, 53, 28, 221, 6, 107, 9, 153, 175, 34, 70, 117, 39, 138, 13, 76, 213, 249, 24, 177, 195, 174, 147, 23, 19, 10, 72, 72, 146, 190, 25, 28, 28, 188, 183, 152, 235, 210, 116, 109, 98, 163, 65, 36, 240, 51, 144, 64, 231, 137, 243, 201, 91, 178, 57, 205, 184, 240, 169, 75, 180, 128, 122, 68, 179, 101, 187, 19, 119, 36, 73, 90, 105, 37, 111, 99, 113, 206, 53, 93, 214, 60, 191, 143, 150, 79, 244, 172, 62, 215, 123, 238, 145, 120, 239, 133, 107, 52, 174, 39, 205, 103, 100, 66, 49, 91, 186, 214, 142, 163, 103, 146, 174, 134, 122, 156, 203, 255, 45, 124, 95, 242, 153, 181, 205, 205, 45, 18, 109, 36, 188, 109, 29, 152, 143, 116, 95, 5, 197, 39, 173, 158, 135, 240, 250, 135, 18, 162, 52, 196, 31, 252, 141, 17, 220, 223, 12, 70, 69, 19, 100, 149, 226, 118, 127, 84, 169, 171, 209, 61, 45, 237, 200, 88, 77, 210, 139, 145, 178, 91, 99, 85, 88, 163, 19, 144, 166, 27, 106, 201, 116, 36, 238, 2, 65, 122, 60, 127, 60, 210, 11, 155, 95, 196, 124, 190, 215, 34, 19, 55, 182, 99, 111, 252, 142, 72, 217, 55, 93, 148, 151, 94, 2, 210, 206, 78, 113, 210, 71, 218, 219, 209, 141, 114, 15, 221, 29, 105, 233, 24, 45, 198, 100, 254, 189, 55, 214, 222, 42, 213, 215, 102, 145, 196, 65, 22, 121, 106, 152, 69, 110, 214, 89, 30, 59, 155, 171, 145, 68, 179, 101, 251, 212, 118, 204, 166, 203, 222, 34, 137, 59, 121, 43, 134, 136, 242, 47, 241, 220, 70, 183, 13, 146, 181, 251, 50, 125, 194, 137, 90, 102, 134, 231, 133, 235, 25, 79, 172, 85, 151, 235, 107, 19, 35, 53, 39, 54, 255, 95, 9, 69, 46, 131, 64, 34, 27, 183, 36, 250, 175, 60, 86, 81, 241, 73, 139, 75, 61, 235, 235, 238, 207, 136, 140, 215, 80, 232, 0, 39, 242, 48, 238, 6, 228, 187, 117, 168, 30, 223, 235, 92, 203, 22, 234, 145, 135, 182, 199, 105, 209, 78, 217, 170, 177, 122, 209, 248, 73, 47, 90, 116, 235, 206, 84, 211, 230, 135, 83, 214, 88, 214, 56, 220, 172, 57, 157, 201, 198, 134, 167, 34, 107, 215, 206, 29, 37, 137, 195, 234, 150, 251, 55, 180, 231, 162, 197, 60, 113, 91, 93, 98, 67, 18, 110, 89, 104, 142, 122, 59, 123, 16, 231, 205, 150, 90, 147, 56, 209, 102, 187, 77, 91, 118, 228, 234, 223, 124, 129, 199, 75, 73, 194, 48, 255, 221, 29, 137, 236, 64, 198, 176, 183, 163, 43, 51, 204, 90, 50, 72, 146, 54, 85, 186, 147, 44, 118, 161, 217, 106, 111, 141, 228, 211, 141, 141, 141, 75, 10, 137, 241, 150, 251, 171, 40, 31, 145, 30, 152, 169, 55, 239, 220, 123, 115, 194, 247, 215, 184, 166, 240, 250, 45, 52, 87, 115, 69, 105, 204, 40, 115, 53, 51, 31, 3, 215, 60, 239, 66, 3, 241, 214, 125, 199, 226, 149, 86, 163, 107, 38, 123, 145, 181, 158, 118, 71, 162, 58, 202, 95, 80, 114, 195, 68, 201, 168, 104, 152, 47, 189, 22, 106, 58, 104, 164, 252, 167, 105, 177, 206, 228, 51, 86, 237, 142, 107, 108, 223, 149, 114, 206, 172, 210, 29, 85, 85, 144, 173, 75, 141, 167, 134, 17, 231, 23, 92, 181, 46, 131, 134, 205, 238, 104, 116, 211, 88, 110, 159, 252, 34, 31, 106, 246, 75, 181, 213, 41, 15, 106, 232, 46, 92, 79, 223, 206, 148, 125, 163, 88, 59, 235, 152, 85, 165, 35, 43, 23, 133, 252, 189, 23, 174, 101, 38, 43, 102, 106, 150, 123, 116, 28, 62, 149, 68, 140, 153, 8, 229, 159, 138, 17, 205, 72, 27, 41, 115, 126, 137, 88, 31, 115, 45, 158, 135, 24, 117, 166, 223, 112, 93, 155, 106, 59, 205, 131, 251, 117, 231, 252, 123, 117, 197, 237, 182, 187, 217, 242, 215, 71, 139, 125, 21, 196, 79, 191, 4, 247, 59, 188, 12, 227, 37, 169, 97, 201, 42, 72, 106, 114, 187, 223, 57, 214, 60, 229, 117, 100, 91, 90, 22, 202, 78, 199, 15, 208, 178, 171, 251, 244, 229, 212, 100, 111, 124, 110, 151, 58, 19, 98, 175, 66, 42, 208, 209, 248, 115, 244, 136, 101, 215, 43, 163, 34, 97, 62, 212, 190, 150, 150, 48, 145, 71, 70, 212, 123, 209, 46, 177, 223, 102, 130, 28, 90, 116, 142, 37, 144, 33, 167, 120, 189, 31, 83, 3, 129, 119, 33, 35, 181, 156, 197, 204, 162, 234, 146, 112, 161, 204, 192, 235, 125, 179, 197, 5, 55, 106, 2, 129, 185, 211, 205, 213, 208, 45, 16, 205, 158, 133, 75, 236, 118, 37, 205, 236, 62, 120, 211, 181, 112, 142, 174, 248, 131, 127, 68, 243, 126, 70, 180, 17, 235, 234, 205, 64, 249, 6, 86, 166, 237, 74, 49, 176, 190, 207, 95, 163, 123, 76, 22, 64, 125, 221, 79, 195, 189, 155, 22, 23, 113, 95, 142, 134, 60, 65, 168, 254, 224, 239, 74, 116, 238, 209, 205, 15, 167, 205, 77, 14, 200, 160, 105, 243, 195, 186, 99, 238, 108, 34, 21, 143, 93, 36, 153, 48, 146, 118, 62, 58, 22, 73, 153, 27, 161, 96, 176, 107, 137, 75, 150, 191, 131, 24, 101, 251, 225, 147, 229, 103, 52, 91, 61, 21, 62, 191, 46, 53, 54, 252, 12, 74, 62, 165, 204, 149, 121, 14, 158, 112, 120, 53, 196, 24, 144, 13, 107, 184, 211, 43, 82, 12, 189, 237, 208, 137, 56, 18, 186, 144, 216, 101, 221, 168, 88, 226, 197, 133, 99, 214, 56, 198, 236, 34, 195, 250, 239, 156, 56, 196, 152, 52, 136, 135, 186, 171, 171, 107, 142, 44, 75, 255, 165, 72, 78, 81, 15, 149, 115, 83, 93, 159, 180, 157, 167, 72, 0, 105, 89, 189, 16, 4, 77, 139, 217, 119, 21, 167, 3, 154, 161, 99, 187, 63, 173, 197, 205, 112, 179, 58, 27, 191, 163, 117, 116, 44, 40, 72, 230, 24, 29, 131, 185, 148, 117, 197, 227, 253, 83, 144, 82, 235, 158, 67, 169, 169, 116, 137, 89, 52, 82, 19, 138, 211, 137, 216, 221, 55, 180, 13, 27, 114, 74, 49, 161, 208, 19, 104, 41, 22, 232, 127, 16, 122, 160, 153, 201, 72, 252, 64, 45, 159, 171, 102, 185, 174, 133, 34, 191, 37, 215, 214, 202, 146, 164, 197, 138, 197, 247, 138, 89, 146, 248, 143, 76, 80, 28, 142, 54, 89, 243, 173, 160, 57, 124, 74, 90, 248, 0, 172, 71, 33, 93, 135, 243, 133, 102, 175, 115, 193, 253, 34, 121, 71, 196, 37, 39, 78, 146, 113, 13, 117, 137, 178, 252, 230, 82, 72, 202, 44, 201, 112, 55, 55, 251, 133, 180, 30, 17, 108, 231, 137, 243, 41, 184, 152, 203, 154, 203, 203, 143, 102, 130, 43, 215, 32, 102, 155, 213, 98, 237, 93, 37, 206, 209, 112, 139, 50, 24, 188, 34, 209, 92, 96, 35, 145, 239, 126, 83, 129, 25, 210, 40, 13, 18, 25, 210, 30, 239, 187, 202, 240, 76, 76, 74, 184, 136, 193, 176, 19, 195, 99, 40, 100, 89, 161, 214, 208, 246, 26, 47, 35, 246, 6, 53, 18, 119, 180, 69, 151, 106, 105, 129, 142, 52, 119, 154, 39, 225, 13, 53, 71, 164, 186, 218, 180, 59, 220, 148, 179, 96, 199, 170, 101, 19, 11, 241, 134, 44, 98, 33, 106, 56, 188, 109, 28, 47, 100, 46, 246, 26, 137, 132, 92, 146, 244, 172, 146, 91, 68, 51, 83, 210, 193, 222, 154, 8, 210, 220, 170, 195, 114, 247, 4, 99, 77, 6, 249, 136, 38, 194, 170, 47, 240, 106, 36, 126, 4, 87, 173, 79, 228, 178, 112, 109, 34, 74, 163, 60, 3, 122, 172, 141, 85, 85, 25, 231, 178, 197, 41, 151, 75, 214, 141, 70, 198, 143, 140, 65, 64, 98, 126, 37, 73, 242, 19, 241, 189, 32, 138, 233, 137, 104, 165, 154, 229, 25, 104, 151, 70, 183, 236, 208, 77, 107, 18, 150, 147, 19, 221, 35, 220, 182, 147, 228, 175, 89, 239, 223, 8, 247, 117, 216, 249, 171, 205, 93, 154, 92, 91, 243, 83, 148, 254, 116, 157, 190, 84, 210, 61, 182, 168, 234, 100, 16, 14, 160, 103, 228, 123, 116, 159, 110, 184, 84, 245, 162, 211, 233, 12, 140, 241, 188, 153, 127, 63, 139, 206, 119, 157, 166, 249, 59, 21, 175, 239, 43, 46, 218, 4, 182, 31, 56, 158, 154, 146, 103, 236, 54, 244, 29, 21, 42, 75, 27, 182, 38, 229, 69, 115, 116, 53, 16, 120, 245, 136, 46, 241, 39, 158, 152, 189, 225, 226, 197, 251, 34, 7, 15, 206, 109, 25, 28, 92, 232, 25, 216, 188, 44, 56, 176, 177, 54, 216, 187, 218, 25, 234, 238, 86, 61, 93, 93, 62, 111, 71, 71, 4, 9, 98, 106, 180, 181, 71, 109, 106, 90, 137, 140, 117, 45, 16, 216, 170, 121, 3, 187, 92, 30, 207, 65, 186, 15, 39, 113, 47, 20, 73, 122, 132, 158, 141, 223, 80, 253, 193, 61, 133, 158, 34, 6, 195, 86, 55, 171, 234, 247, 191, 76, 100, 227, 109, 216, 2, 11, 210, 222, 108, 60, 243, 88, 180, 216, 35, 206, 137, 120, 167, 230, 15, 29, 55, 221, 82, 230, 67, 173, 4, 35, 123, 17, 67, 242, 247, 174, 204, 140, 36, 127, 150, 239, 48, 113, 244, 140, 238, 184, 191, 74, 119, 46, 158, 255, 60, 189, 36, 95, 161, 5, 254, 173, 38, 193, 140, 69, 150, 249, 29, 190, 195, 209, 74, 47, 218, 47, 101, 201, 153, 134, 198, 40, 29, 83, 36, 204, 76, 238, 2, 118, 35, 159, 213, 27, 94, 187, 49, 5, 139, 81, 9, 132, 206, 88, 92, 116, 249, 77, 139, 234, 243, 189, 9, 42, 55, 72, 181, 183, 179, 55, 34, 142, 213, 113, 228, 20, 90, 73, 137, 216, 161, 22, 12, 37, 84, 34, 74, 154, 139, 151, 143, 65, 146, 57, 235, 91, 81, 90, 133, 39, 64, 114, 162, 63, 104, 178, 237, 192, 113, 196, 236, 160, 143, 154, 75, 230, 160, 159, 238, 168, 237, 53, 146, 66, 72, 128, 238, 241, 209, 81, 72, 114, 200, 186, 211, 245, 25, 162, 35, 77, 44, 214, 234, 10, 68, 250, 212, 64, 240, 221, 112, 11, 123, 219, 58, 83, 230, 61, 40, 197, 213, 218, 121, 252, 28, 109, 230, 162, 25, 213, 235, 19, 181, 151, 238, 220, 245, 252, 199, 104, 22, 165, 249, 124, 209, 231, 206, 107, 136, 201, 210, 38, 193, 185, 124, 201, 243, 245, 116, 86, 168, 215, 236, 187, 92, 129, 178, 136, 150, 12, 109, 127, 223, 74, 221, 57, 119, 54, 60, 69, 239, 151, 170, 151, 190, 211, 89, 189, 244, 195, 210, 178, 69, 31, 119, 46, 89, 240, 25, 231, 146, 249, 159, 119, 44, 124, 224, 43, 206, 5, 247, 127, 195, 57, 255, 190, 111, 59, 230, 206, 122, 202, 249, 192, 204, 31, 59, 30, 152, 249, 115, 231, 253, 51, 158, 117, 220, 63, 227, 69, 199, 156, 153, 41, 199, 3, 179, 178, 56, 134, 115, 222, 61, 58, 172, 112, 228, 28, 96, 221, 192, 250, 32, 220, 186, 180, 57, 70, 151, 33, 149, 158, 65, 149, 54, 31, 72, 34, 83, 52, 247, 91, 189, 61, 61, 243, 45, 239, 18, 187, 95, 25, 54, 37, 234, 52, 53, 173, 19, 218, 166, 120, 129, 161, 109, 106, 183, 123, 111, 40, 147, 50, 33, 68, 199, 189, 190, 215, 22, 196, 44, 44, 100, 29, 252, 93, 33, 31, 247, 208, 246, 226, 98, 228, 67, 86, 24, 145, 204, 38, 221, 215, 213, 151, 193, 226, 165, 42, 162, 207, 96, 235, 24, 86, 198, 176, 235, 86, 60, 158, 141, 112, 45, 195, 178, 237, 36, 130, 44, 187, 84, 192, 210, 179, 178, 236, 146, 149, 61, 135, 110, 202, 75, 230, 193, 210, 250, 235, 34, 196, 148, 255, 51, 17, 229, 219, 80, 174, 18, 121, 104, 91, 194, 182, 12, 99, 163, 224, 127, 224, 198, 43, 245, 230, 93, 7, 226, 162, 177, 174, 162, 252, 165, 101, 209, 159, 57, 86, 98, 140, 226, 245, 30, 195, 66, 69, 247, 32, 189, 226, 218, 203, 242, 77, 180, 113, 220, 238, 51, 151, 115, 53, 146, 180, 120, 185, 84, 251, 154, 45, 131, 152, 105, 172, 30, 129, 200, 77, 2, 223, 79, 215, 242, 49, 169, 174, 250, 203, 142, 121, 247, 252, 212, 177, 224, 254, 148, 68, 207, 156, 220, 80, 47, 44, 246, 208, 218, 141, 122, 89, 36, 133, 103, 141, 72, 191, 231, 236, 213, 108, 96, 197, 170, 231, 196, 226, 236, 241, 88, 231, 106, 68, 146, 164, 115, 217, 1, 9, 55, 16, 108, 116, 235, 78, 225, 249, 104, 63, 120, 194, 120, 94, 110, 84, 36, 81, 138, 48, 200, 185, 71, 178, 222, 246, 174, 140, 27, 98, 14, 205, 173, 186, 175, 181, 93, 247, 119, 116, 11, 81, 135, 64, 207, 10, 61, 184, 226, 65, 29, 46, 236, 208, 170, 117, 216, 40, 234, 145, 245, 15, 97, 115, 142, 119, 94, 120, 35, 162, 91, 7, 115, 27, 184, 157, 123, 197, 38, 174, 101, 247, 193, 108, 235, 190, 35, 153, 182, 253, 71, 211, 237, 7, 78, 164, 208, 150, 172, 227, 200, 233, 36, 109, 106, 19, 8, 87, 116, 157, 188, 112, 51, 188, 238, 161, 20, 214, 22, 151, 195, 241, 20, 226, 192, 133, 207, 43, 131, 81, 54, 204, 135, 71, 235, 232, 104, 148, 29, 141, 191, 164, 197, 24, 139, 91, 210, 110, 87, 144, 153, 73, 217, 186, 247, 104, 92, 52, 111, 213, 180, 143, 143, 16, 175, 200, 47, 54, 46, 143, 231, 31, 176, 107, 108, 219, 119, 100, 212, 94, 128, 168, 129, 235, 56, 118, 38, 33, 22, 121, 85, 125, 123, 57, 241, 34, 115, 81, 165, 197, 247, 47, 84, 89, 66, 239, 195, 242, 92, 204, 6, 65, 98, 65, 232, 62, 115, 37, 83, 74, 118, 108, 62, 38, 123, 226, 130, 176, 220, 100, 73, 122, 82, 30, 24, 24, 201, 250, 29, 34, 74, 175, 247, 67, 174, 69, 115, 176, 208, 166, 237, 16, 113, 48, 117, 56, 91, 247, 28, 17, 125, 2, 201, 58, 251, 191, 197, 190, 119, 148, 152, 100, 174, 112, 223, 237, 254, 3, 233, 222, 42, 148, 9, 9, 75, 23, 199, 53, 173, 47, 57, 87, 112, 111, 87, 249, 71, 218, 36, 75, 200, 206, 141, 182, 169, 160, 207, 252, 64, 163, 207, 250, 104, 81, 198, 226, 27, 221, 178, 147, 174, 243, 112, 22, 189, 45, 33, 112, 80, 246, 188, 153, 241, 182, 29, 123, 111, 42, 245, 181, 186, 75, 211, 222, 91, 202, 115, 150, 223, 76, 104, 218, 111, 131, 88, 17, 175, 27, 184, 254, 10, 189, 34, 173, 200, 226, 155, 216, 108, 207, 133, 107, 9, 122, 230, 19, 189, 151, 110, 36, 250, 46, 191, 4, 97, 131, 68, 223, 21, 140, 151, 98, 195, 135, 103, 6, 94, 43, 115, 32, 39, 32, 55, 174, 62, 150, 206, 141, 199, 211, 253, 143, 60, 158, 17, 3, 253, 104, 135, 15, 221, 84, 252, 130, 247, 7, 25, 226, 173, 251, 142, 198, 85, 108, 206, 104, 195, 175, 122, 253, 175, 42, 216, 20, 115, 255, 75, 70, 217, 113, 200, 220, 162, 162, 40, 159, 115, 213, 86, 235, 237, 135, 78, 38, 236, 78, 92, 25, 150, 156, 130, 238, 244, 78, 231, 83, 202, 234, 213, 11, 141, 85, 100, 246, 72, 11, 11, 92, 38, 46, 34, 16, 36, 242, 116, 157, 56, 31, 31, 37, 145, 39, 67, 214, 175, 46, 85, 47, 141, 171, 205, 205, 154, 213, 74, 44, 117, 14, 60, 3, 3, 203, 164, 154, 165, 207, 184, 35, 77, 100, 49, 60, 82, 90, 41, 136, 185, 16, 144, 133, 225, 105, 235, 200, 130, 16, 218, 15, 159, 202, 140, 218, 152, 216, 216, 101, 247, 93, 188, 158, 134, 56, 131, 179, 122, 217, 243, 222, 230, 230, 136, 213, 242, 40, 146, 93, 52, 36, 236, 160, 185, 223, 33, 45, 184, 79, 111, 126, 120, 79, 46, 249, 100, 162, 229, 31, 180, 11, 119, 57, 26, 16, 107, 251, 110, 116, 96, 96, 209, 232, 231, 81, 124, 131, 97, 156, 215, 71, 68, 226, 19, 50, 147, 233, 188, 16, 119, 134, 181, 148, 19, 54, 215, 236, 46, 255, 120, 90, 85, 213, 234, 209, 54, 21, 170, 199, 119, 193, 85, 87, 171, 7, 86, 172, 78, 208, 249, 164, 96, 229, 138, 158, 166, 102, 211, 239, 113, 120, 64, 98, 59, 246, 38, 228, 185, 179, 232, 251, 149, 79, 151, 177, 153, 24, 122, 199, 36, 233, 51, 232, 172, 130, 12, 219, 254, 171, 149, 165, 231, 58, 70, 120, 101, 104, 148, 171, 192, 53, 142, 129, 231, 154, 54, 250, 41, 127, 223, 64, 22, 86, 37, 109, 254, 254, 77, 109, 109, 13, 153, 247, 131, 173, 74, 70, 169, 152, 97, 102, 118, 210, 130, 242, 38, 60, 76, 177, 135, 119, 219, 78, 144, 38, 41, 16, 241, 164, 80, 108, 44, 209, 110, 218, 29, 141, 70, 199, 90, 140, 243, 169, 243, 193, 88, 147, 76, 59, 119, 252, 110, 239, 185, 171, 195, 18, 121, 204, 133, 190, 101, 215, 129, 36, 44, 78, 197, 227, 123, 162, 76, 130, 28, 30, 143, 141, 68, 14, 203, 243, 239, 213, 155, 54, 109, 47, 45, 30, 155, 47, 46, 223, 156, 117, 230, 92, 121, 217, 92, 99, 226, 43, 99, 37, 133, 100, 195, 235, 31, 74, 67, 161, 132, 44, 247, 215, 143, 96, 81, 23, 79, 148, 113, 185, 78, 16, 33, 125, 31, 137, 50, 116, 221, 233, 82, 250, 58, 142, 116, 222, 88, 72, 68, 86, 112, 125, 93, 214, 19, 203, 37, 12, 149, 59, 119, 249, 50, 139, 174, 174, 37, 100, 17, 255, 64, 100, 68, 31, 59, 147, 28, 184, 241, 10, 225, 34, 115, 204, 187, 199, 206, 164, 29, 179, 252, 227, 235, 197, 244, 90, 11, 45, 59, 122, 30, 126, 11, 247, 51, 180, 122, 125, 210, 12, 29, 228, 158, 237, 27, 101, 197, 142, 225, 169, 104, 221, 125, 48, 133, 77, 0, 54, 147, 131, 198, 123, 83, 198, 102, 34, 183, 233, 107, 111, 119, 73, 245, 117, 47, 186, 67, 17, 120, 30, 42, 47, 113, 231, 14, 19, 56, 64, 238, 67, 108, 199, 30, 17, 70, 144, 106, 150, 101, 21, 127, 232, 114, 225, 115, 203, 96, 140, 136, 124, 67, 218, 96, 240, 132, 16, 12, 120, 112, 109, 174, 173, 207, 100, 60, 184, 151, 31, 205, 32, 136, 47, 45, 93, 164, 171, 161, 166, 237, 214, 239, 31, 13, 102, 2, 142, 22, 106, 90, 139, 206, 246, 129, 254, 7, 133, 4, 150, 233, 42, 204, 151, 127, 4, 130, 168, 93, 251, 47, 203, 14, 113, 102, 217, 27, 134, 161, 14, 33, 31, 132, 91, 172, 243, 216, 217, 81, 91, 65, 13, 175, 11, 19, 29, 46, 254, 202, 211, 218, 177, 17, 174, 100, 95, 79, 127, 182, 95, 244, 171, 44, 136, 27, 90, 244, 76, 37, 90, 112, 157, 139, 231, 39, 104, 209, 133, 188, 218, 63, 90, 22, 220, 25, 197, 22, 124, 154, 175, 5, 244, 185, 95, 136, 76, 210, 198, 198, 23, 28, 247, 84, 33, 182, 134, 226, 116, 189, 236, 197, 22, 238, 225, 243, 143, 100, 188, 237, 157, 56, 70, 220, 211, 214, 221, 54, 98, 226, 75, 137, 86, 146, 32, 129, 53, 107, 234, 229, 198, 134, 167, 53, 34, 1, 8, 51, 68, 183, 13, 138, 164, 42, 59, 51, 91, 141, 164, 157, 143, 143, 113, 174, 67, 73, 79, 94, 239, 95, 32, 150, 219, 180, 101, 71, 188, 108, 145, 10, 227, 126, 181, 238, 59, 154, 113, 53, 214, 235, 46, 205, 253, 223, 106, 91, 155, 99, 92, 27, 82, 3, 180, 25, 217, 128, 238, 57, 129, 129, 213, 89, 180, 115, 155, 72, 210, 23, 143, 209, 137, 50, 23, 138, 121, 92, 120, 176, 60, 173, 237, 58, 84, 146, 20, 213, 253, 1, 75, 141, 235, 236, 170, 210, 107, 130, 25, 119, 99, 162, 14, 50, 254, 176, 208, 26, 106, 51, 246, 55, 136, 21, 22, 203, 227, 8, 194, 167, 157, 247, 209, 98, 233, 243, 127, 100, 121, 85, 213, 188, 114, 22, 96, 69, 81, 22, 210, 120, 216, 229, 82, 158, 68, 121, 1, 106, 240, 132, 59, 83, 144, 36, 82, 205, 183, 164, 145, 248, 226, 14, 70, 118, 148, 185, 187, 47, 190, 105, 136, 197, 2, 82, 109, 77, 6, 106, 55, 35, 138, 82, 15, 37, 38, 36, 161, 91, 74, 22, 228, 207, 131, 109, 3, 181, 98, 81, 14, 4, 254, 167, 88, 148, 71, 74, 56, 50, 72, 170, 121, 112, 31, 54, 38, 100, 25, 9, 247, 225, 15, 232, 158, 204, 27, 141, 36, 49, 31, 46, 77, 251, 36, 36, 244, 2, 253, 43, 83, 100, 189, 234, 77, 155, 119, 148, 29, 219, 50, 201, 61, 178, 113, 171, 40, 215, 32, 146, 126, 210, 185, 108, 201, 43, 93, 206, 198, 139, 116, 30, 91, 188, 94, 239, 252, 18, 55, 26, 230, 253, 113, 187, 92, 234, 203, 93, 14, 199, 171, 157, 139, 230, 190, 198, 165, 170, 223, 106, 160, 227, 70, 200, 82, 70, 18, 134, 99, 158, 161, 182, 99, 99, 249, 7, 253, 252, 243, 66, 50, 44, 18, 12, 204, 187, 212, 136, 164, 63, 134, 236, 97, 178, 188, 111, 150, 236, 41, 17, 159, 201, 205, 173, 167, 165, 45, 139, 185, 146, 106, 151, 63, 35, 85, 47, 251, 166, 75, 81, 127, 133, 54, 92, 229, 204, 19, 17, 187, 79, 146, 164, 7, 105, 212, 169, 193, 208, 219, 92, 181, 203, 245, 230, 29, 123, 202, 183, 38, 45, 218, 184, 76, 134, 99, 207, 149, 25, 234, 161, 141, 69, 42, 178, 113, 91, 18, 25, 177, 244, 190, 62, 227, 54, 218, 192, 177, 85, 201, 24, 49, 142, 100, 196, 251, 190, 139, 172, 187, 206, 19, 23, 38, 69, 183, 116, 152, 52, 217, 210, 69, 89, 169, 174, 38, 165, 228, 68, 174, 127, 111, 12, 139, 101, 134, 37, 161, 230, 77, 30, 175, 23, 133, 201, 89, 119, 180, 57, 131, 100, 16, 184, 24, 65, 144, 208, 91, 117, 213, 215, 234, 178, 162, 136, 204, 208, 150, 170, 170, 123, 198, 25, 152, 31, 118, 30, 170, 47, 120, 24, 169, 230, 209, 109, 187, 64, 200, 69, 27, 51, 35, 190, 21, 90, 189, 62, 141, 221, 41, 244, 75, 173, 4, 77, 100, 246, 33, 33, 131, 182, 239, 72, 241, 36, 32, 16, 213, 181, 151, 103, 209, 164, 90, 148, 193, 4, 194, 131, 214, 88, 236, 72, 247, 12, 165, 12, 82, 67, 253, 207, 32, 174, 141, 142, 22, 34, 147, 116, 156, 174, 86, 196, 11, 49, 159, 90, 48, 164, 187, 189, 62, 93, 243, 120, 69, 89, 3, 205, 229, 27, 44, 215, 50, 99, 172, 164, 29, 34, 217, 247, 123, 136, 4, 161, 68, 227, 109, 138, 9, 183, 56, 109, 28, 50, 116, 237, 176, 150, 116, 231, 146, 133, 185, 152, 164, 77, 238, 86, 131, 36, 127, 211, 50, 47, 51, 198, 114, 163, 35, 41, 138, 200, 252, 107, 162, 181, 215, 129, 227, 166, 226, 78, 182, 84, 75, 18, 101, 45, 104, 11, 23, 217, 176, 89, 247, 117, 247, 139, 114, 3, 69, 85, 191, 88, 106, 82, 92, 67, 67, 195, 82, 186, 254, 167, 133, 23, 192, 225, 72, 59, 231, 206, 250, 21, 60, 1, 184, 38, 212, 170, 150, 156, 69, 62, 228, 70, 156, 80, 39, 147, 187, 145, 44, 197, 156, 93, 125, 12, 89, 197, 9, 209, 80, 156, 222, 59, 213, 231, 251, 99, 83, 184, 131, 75, 69, 24, 183, 144, 1, 45, 92, 31, 132, 96, 64, 235, 222, 195, 137, 73, 87, 152, 161, 99, 119, 157, 188, 40, 186, 49, 40, 142, 6, 157, 136, 242, 169, 170, 177, 213, 92, 140, 120, 169, 231, 117, 200, 82, 67, 223, 58, 107, 55, 121, 72, 181, 161, 153, 175, 220, 80, 167, 123, 219, 186, 214, 143, 230, 6, 44, 101, 78, 176, 160, 162, 245, 18, 17, 220, 102, 197, 31, 60, 71, 139, 218, 175, 92, 142, 70, 100, 104, 102, 173, 27, 136, 161, 110, 35, 135, 115, 77, 157, 221, 121, 25, 188, 153, 121, 11, 93, 104, 117, 58, 127, 0, 215, 96, 215, 169, 139, 169, 97, 27, 144, 161, 238, 24, 9, 81, 231, 229, 114, 125, 168, 148, 243, 206, 31, 59, 28, 222, 40, 205, 191, 15, 69, 250, 168, 179, 203, 140, 187, 70, 82, 100, 30, 94, 19, 89, 185, 93, 199, 207, 197, 181, 112, 211, 77, 69, 146, 144, 181, 249, 120, 41, 4, 148, 39, 73, 20, 115, 19, 105, 104, 129, 80, 178, 235, 196, 249, 23, 113, 95, 144, 200, 132, 235, 116, 199, 90, 16, 239, 180, 173, 251, 7, 17, 157, 217, 71, 242, 84, 169, 94, 131, 97, 173, 189, 36, 199, 79, 115, 49, 211, 179, 201, 114, 158, 121, 16, 18, 188, 23, 200, 180, 132, 155, 84, 170, 94, 10, 17, 239, 21, 37, 36, 238, 204, 202, 187, 202, 21, 229, 75, 72, 64, 243, 182, 182, 167, 98, 219, 119, 137, 210, 7, 148, 54, 148, 26, 83, 238, 53, 188, 50, 68, 216, 89, 119, 75, 123, 26, 153, 186, 101, 171, 6, 49, 89, 138, 119, 183, 231, 220, 213, 116, 104, 213, 186, 180, 40, 21, 145, 157, 255, 161, 134, 162, 221, 133, 27, 27, 198, 93, 238, 102, 85, 253, 254, 223, 192, 3, 130, 154, 187, 21, 87, 31, 155, 146, 23, 173, 255, 145, 151, 161, 54, 45, 35, 99, 129, 9, 6, 183, 140, 181, 192, 152, 15, 171, 28, 141, 46, 146, 235, 106, 126, 140, 84, 126, 225, 254, 52, 23, 13, 90, 136, 181, 112, 4, 106, 49, 105, 231, 194, 185, 207, 16, 161, 253, 39, 172, 26, 205, 225, 80, 173, 201, 18, 165, 238, 246, 105, 225, 125, 53, 118, 250, 80, 67, 65, 140, 17, 125, 0, 181, 72, 211, 240, 152, 159, 37, 225, 69, 164, 152, 59, 157, 223, 15, 6, 7, 230, 89, 143, 147, 175, 57, 141, 197, 186, 164, 154, 229, 58, 98, 33, 66, 123, 213, 42, 82, 126, 229, 165, 25, 244, 228, 20, 189, 6, 67, 185, 204, 214, 82, 98, 180, 121, 173, 89, 95, 224, 213, 46, 34, 104, 116, 78, 25, 151, 53, 105, 73, 110, 128, 32, 121, 104, 245, 134, 180, 210, 216, 160, 171, 154, 231, 127, 22, 198, 104, 199, 216, 92, 152, 37, 32, 103, 208, 91, 81, 232, 146, 94, 184, 142, 122, 73, 49, 111, 10, 89, 168, 50, 178, 153, 109, 234, 254, 97, 16, 37, 106, 36, 55, 149, 74, 146, 195, 146, 192, 98, 177, 38, 169, 161, 46, 165, 146, 213, 75, 231, 87, 114, 35, 100, 225, 218, 167, 207, 34, 177, 77, 126, 96, 38, 18, 196, 126, 171, 196, 141, 196, 80, 9, 8, 109, 156, 32, 62, 160, 106, 110, 189, 227, 240, 201, 155, 3, 215, 95, 94, 178, 171, 124, 40, 59, 252, 92, 6, 27, 18, 81, 84, 79, 207, 78, 251, 193, 227, 233, 73, 219, 224, 86, 40, 249, 154, 185, 12, 162, 84, 100, 207, 161, 155, 42, 250, 146, 210, 154, 164, 248, 114, 73, 127, 37, 120, 81, 24, 149, 159, 168, 19, 217, 2, 162, 162, 5, 45, 147, 183, 68, 166, 160, 21, 83, 116, 251, 174, 56, 106, 233, 200, 242, 122, 205, 152, 241, 164, 91, 72, 193, 119, 65, 154, 59, 75, 143, 109, 219, 149, 50, 197, 169, 97, 9, 117, 157, 184, 144, 141, 61, 188, 71, 136, 104, 67, 136, 221, 141, 197, 216, 80, 139, 41, 53, 206, 144, 95, 196, 220, 238, 55, 162, 254, 45, 248, 224, 218, 155, 232, 129, 136, 209, 115, 246, 170, 158, 183, 94, 135, 230, 8, 197, 228, 186, 179, 122, 105, 218, 204, 210, 181, 40, 252, 12, 59, 166, 26, 8, 93, 131, 21, 28, 94, 179, 49, 53, 92, 64, 224, 112, 26, 49, 41, 53, 24, 124, 121, 25, 9, 51, 195, 254, 77, 241, 120, 63, 0, 171, 168, 227, 208, 201, 244, 120, 18, 82, 140, 5, 58, 131, 18, 9, 220, 23, 213, 237, 125, 245, 56, 18, 119, 172, 45, 213, 46, 96, 241, 246, 52, 183, 138, 150, 89, 72, 78, 18, 86, 164, 75, 177, 171, 252, 195, 172, 145, 204, 144, 197, 31, 43, 55, 254, 156, 127, 150, 34, 205, 235, 101, 154, 123, 88, 185, 180, 209, 74, 141, 213, 97, 197, 66, 80, 73, 100, 73, 210, 189, 254, 98, 161, 165, 88, 234, 51, 38, 183, 181, 213, 186, 26, 27, 191, 7, 161, 243, 246, 67, 39, 110, 174, 40, 161, 12, 164, 119, 40, 254, 157, 66, 121, 146, 84, 87, 243, 156, 187, 181, 125, 175, 236, 116, 124, 91, 132, 74, 142, 157, 45, 95, 176, 189, 244, 62, 145, 21, 73, 154, 214, 164, 158, 174, 83, 151, 18, 194, 35, 133, 164, 30, 69, 249, 103, 173, 165, 219, 220, 100, 207, 228, 14, 38, 119, 17, 204, 155, 237, 141, 180, 187, 164, 134, 250, 231, 53, 127, 16, 4, 144, 156, 236, 20, 116, 44, 0, 112, 17, 193, 189, 229, 66, 227, 93, 69, 249, 124, 153, 11, 76, 126, 177, 150, 29, 141, 95, 65, 220, 171, 231, 204, 149, 161, 133, 13, 106, 49, 215, 95, 65, 215, 242, 136, 136, 51, 144, 53, 249, 61, 77, 139, 52, 150, 179, 128, 153, 223, 49, 48, 240, 196, 108, 217, 209, 240, 117, 168, 131, 116, 159, 189, 154, 128, 53, 84, 140, 236, 161, 248, 33, 18, 94, 100, 249, 73, 151, 166, 29, 119, 56, 28, 245, 5, 223, 151, 83, 124, 145, 229, 199, 20, 205, 243, 35, 199, 3, 179, 82, 176, 78, 69, 111, 72, 90, 108, 233, 252, 209, 193, 29, 58, 167, 72, 32, 120, 59, 29, 231, 35, 244, 114, 254, 117, 125, 125, 253, 3, 163, 16, 148, 176, 216, 84, 85, 117, 208, 38, 224, 55, 229, 134, 134, 223, 162, 249, 248, 176, 147, 200, 141, 54, 7, 153, 178, 122, 112, 154, 159, 133, 96, 247, 170, 245, 25, 23, 148, 143, 124, 129, 55, 153, 100, 63, 14, 189, 203, 25, 249, 13, 88, 40, 242, 184, 60, 119, 54, 90, 171, 137, 121, 66, 233, 142, 77, 86, 36, 22, 48, 179, 70, 242, 231, 141, 141, 141, 13, 227, 73, 210, 202, 91, 249, 200, 232, 206, 101, 33, 167, 123, 71, 19, 142, 55, 235, 96, 47, 222, 128, 114, 12, 238, 89, 214, 180, 252, 203, 77, 246, 200, 75, 46, 54, 53, 121, 92, 206, 198, 103, 17, 118, 128, 90, 204, 168, 150, 160, 69, 226, 13, 155, 90, 163, 169, 241, 65, 97, 21, 55, 53, 181, 211, 243, 147, 128, 138, 79, 247, 233, 75, 41, 219, 154, 16, 152, 241, 59, 26, 180, 25, 76, 70, 183, 236, 24, 242, 86, 84, 152, 117, 217, 107, 116, 170, 193, 187, 16, 221, 54, 152, 68, 82, 28, 109, 66, 226, 244, 28, 31, 47, 188, 111, 140, 202, 70, 46, 206, 165, 235, 51, 104, 129, 249, 146, 40, 111, 56, 122, 58, 158, 219, 197, 78, 110, 28, 210, 80, 95, 201, 120, 32, 100, 94, 87, 147, 129, 136, 120, 185, 139, 155, 249, 89, 79, 56, 186, 17, 29, 38, 194, 27, 182, 100, 134, 197, 8, 47, 92, 203, 122, 90, 59, 68, 121, 137, 59, 28, 238, 31, 207, 2, 102, 238, 244, 221, 45, 45, 29, 78, 250, 14, 47, 92, 187, 102, 9, 71, 193, 245, 144, 245, 10, 221, 207, 140, 234, 243, 103, 61, 112, 185, 42, 202, 91, 45, 228, 104, 109, 230, 252, 45, 36, 153, 160, 180, 134, 172, 134, 97, 210, 102, 56, 62, 145, 92, 22, 82, 93, 154, 215, 171, 107, 40, 107, 208, 180, 129, 81, 200, 221, 112, 9, 171, 127, 142, 36, 25, 183, 63, 160, 123, 91, 218, 116, 178, 84, 51, 144, 238, 234, 47, 53, 195, 117, 104, 1, 204, 134, 214, 108, 204, 72, 243, 239, 133, 34, 201, 239, 142, 248, 204, 140, 3, 46, 175, 247, 56, 68, 21, 20, 183, 39, 107, 148, 183, 216, 45, 36, 240, 31, 22, 203, 189, 220, 248, 81, 222, 242, 213, 2, 129, 95, 135, 203, 58, 184, 122, 61, 218, 144, 21, 111, 93, 101, 88, 254, 68, 20, 73, 108, 38, 20, 95, 224, 177, 241, 60, 95, 133, 27, 31, 79, 83, 87, 131, 220, 216, 240, 93, 133, 174, 139, 54, 144, 233, 209, 98, 139, 88, 196, 195, 235, 54, 39, 161, 136, 132, 115, 198, 239, 215, 212, 212, 136, 134, 226, 90, 83, 211, 90, 185, 182, 90, 207, 183, 179, 155, 104, 223, 81, 227, 119, 113, 156, 240, 250, 135, 82, 120, 62, 80, 27, 26, 219, 190, 123, 168, 107, 202, 157, 64, 148, 147, 160, 39, 109, 10, 107, 32, 211, 31, 58, 201, 138, 219, 253, 14, 103, 56, 188, 152, 221, 175, 119, 7, 140, 86, 80, 190, 255, 131, 23, 173, 121, 199, 222, 41, 237, 142, 158, 143, 67, 70, 98, 59, 39, 146, 104, 148, 75, 54, 114, 191, 87, 149, 101, 33, 29, 103, 196, 21, 132, 16, 59, 18, 104, 136, 48, 174, 143, 115, 1, 27, 70, 198, 74, 48, 248, 74, 196, 107, 163, 219, 118, 37, 111, 201, 108, 53, 137, 31, 73, 67, 157, 61, 73, 81, 59, 167, 122, 174, 89, 23, 108, 203, 34, 188, 11, 11, 140, 136, 27, 94, 123, 249, 80, 76, 83, 212, 118, 94, 133, 101, 9, 151, 219, 179, 134, 133, 253, 190, 49, 92, 157, 102, 18, 211, 118, 232, 160, 146, 37, 138, 36, 153, 155, 214, 146, 146, 114, 22, 133, 200, 250, 205, 105, 212, 105, 146, 5, 249, 25, 119, 48, 26, 85, 85, 239, 122, 69, 146, 246, 163, 251, 7, 141, 141, 101, 196, 37, 171, 12, 11, 180, 86, 81, 156, 189, 46, 151, 118, 144, 72, 236, 21, 178, 228, 124, 90, 196, 118, 115, 113, 68, 219, 72, 210, 72, 218, 249, 167, 9, 146, 121, 126, 51, 163, 4, 2, 191, 159, 239, 129, 89, 152, 45, 106, 220, 171, 118, 52, 164, 166, 107, 161, 103, 239, 157, 19, 73, 12, 51, 230, 137, 246, 84, 74, 155, 28, 14, 251, 212, 96, 248, 127, 96, 142, 176, 153, 160, 123, 121, 107, 173, 107, 190, 237, 212, 222, 56, 74, 138, 84, 175, 247, 237, 214, 227, 229, 243, 11, 194, 225, 35, 174, 156, 222, 178, 136, 217, 143, 187, 140, 235, 226, 144, 224, 190, 208, 86, 94, 112, 31, 145, 114, 240, 173, 68, 22, 31, 198, 102, 2, 114, 124, 67, 100, 126, 123, 137, 210, 204, 240, 181, 141, 44, 141, 82, 17, 97, 56, 156, 191, 150, 198, 6, 193, 181, 116, 1, 52, 135, 127, 68, 243, 187, 161, 112, 141, 96, 84, 100, 28, 50, 120, 94, 94, 178, 64, 40, 143, 216, 217, 69, 98, 44, 43, 178, 251, 212, 165, 172, 92, 87, 171, 59, 230, 223, 151, 146, 29, 13, 239, 161, 5, 226, 119, 105, 120, 74, 92, 104, 134, 218, 12, 41, 202, 175, 185, 36, 233, 211, 82, 205, 178, 31, 161, 6, 47, 182, 99, 111, 22, 138, 46, 45, 187, 15, 38, 92, 80, 218, 113, 123, 4, 201, 24, 37, 32, 227, 118, 73, 231, 75, 56, 84, 245, 179, 104, 208, 75, 59, 203, 91, 220, 97, 8, 248, 135, 55, 110, 205, 40, 117, 213, 216, 109, 254, 193, 104, 241, 85, 90, 208, 63, 134, 56, 231, 48, 97, 2, 163, 85, 24, 29, 39, 37, 164, 244, 106, 150, 199, 181, 150, 22, 213, 74, 176, 35, 32, 103, 77, 162, 61, 16, 29, 211, 219, 217, 3, 55, 171, 225, 122, 190, 94, 114, 233, 7, 186, 126, 192, 93, 236, 36, 203, 91, 90, 190, 228, 69, 88, 206, 242, 178, 197, 112, 103, 234, 70, 121, 69, 130, 70, 77, 9, 231, 51, 203, 88, 248, 143, 228, 137, 140, 172, 26, 16, 10, 196, 4, 96, 105, 187, 100, 73, 183, 155, 36, 233, 60, 223, 86, 106, 210, 204, 104, 132, 229, 243, 181, 47, 117, 135, 99, 253, 244, 236, 252, 4, 45, 176, 218, 246, 30, 41, 136, 237, 230, 92, 113, 40, 243, 193, 124, 17, 73, 189, 71, 118, 56, 214, 89, 234, 72, 75, 250, 238, 124, 60, 82, 150, 127, 27, 229, 79, 100, 65, 166, 65, 204, 16, 199, 144, 170, 151, 101, 144, 128, 131, 78, 54, 133, 25, 208, 120, 238, 80, 174, 128, 216, 181, 162, 170, 95, 11, 6, 7, 239, 53, 14, 104, 222, 147, 25, 67, 238, 227, 240, 35, 18, 17, 89, 96, 197, 234, 140, 104, 232, 60, 30, 2, 49, 72, 130, 200, 240, 69, 108, 166, 21, 143, 231, 99, 230, 123, 161, 168, 218, 231, 177, 17, 37, 194, 190, 3, 136, 18, 185, 8, 231, 211, 16, 195, 192, 253, 177, 91, 62, 51, 87, 94, 243, 88, 182, 237, 192, 177, 56, 194, 59, 112, 113, 43, 94, 239, 31, 192, 19, 103, 217, 156, 176, 254, 107, 69, 17, 100, 56, 220, 37, 4, 3, 90, 218, 133, 235, 179, 127, 18, 26, 247, 142, 54, 232, 165, 203, 250, 122, 250, 133, 123, 208, 163, 169, 176, 154, 62, 102, 89, 100, 198, 44, 121, 128, 27, 82, 83, 21, 225, 98, 12, 174, 90, 135, 93, 110, 54, 87, 82, 114, 33, 165, 160, 173, 147, 211, 249, 185, 50, 146, 95, 198, 34, 100, 1, 40, 114, 208, 46, 242, 23, 222, 214, 14, 36, 76, 100, 140, 184, 84, 46, 195, 113, 219, 160, 16, 70, 112, 105, 218, 31, 143, 100, 113, 153, 100, 27, 222, 180, 105, 177, 115, 241, 252, 95, 248, 233, 250, 77, 5, 30, 35, 149, 63, 27, 221, 178, 51, 37, 207, 187, 7, 214, 92, 169, 22, 240, 140, 188, 181, 235, 243, 61, 130, 221, 61, 178, 73, 205, 204, 217, 146, 117, 102, 47, 92, 199, 28, 138, 110, 11, 177, 109, 187, 32, 184, 173, 183, 238, 63, 154, 241, 182, 119, 189, 104, 8, 196, 255, 141, 229, 122, 102, 142, 233, 161, 80, 148, 223, 210, 20, 23, 218, 108, 221, 164, 133, 37, 77, 247, 37, 141, 218, 63, 127, 223, 0, 72, 192, 174, 238, 31, 186, 165, 252, 227, 85, 227, 220, 213, 139, 243, 149, 36, 169, 219, 165, 104, 95, 150, 107, 107, 126, 229, 132, 59, 49, 39, 192, 158, 197, 230, 97, 216, 60, 26, 27, 61, 16, 152, 175, 171, 55, 35, 8, 218, 41, 186, 164, 60, 67, 159, 63, 80, 98, 220, 123, 168, 158, 84, 213, 222, 131, 249, 165, 103, 33, 217, 178, 251, 16, 122, 181, 234, 109, 251, 143, 137, 4, 177, 17, 220, 250, 105, 213, 227, 133, 91, 254, 91, 45, 155, 55, 63, 48, 66, 124, 44, 255, 220, 209, 166, 228, 45, 72, 8, 138, 108, 220, 146, 30, 111, 105, 4, 157, 83, 210, 181, 116, 161, 168, 1, 53, 165, 247, 196, 247, 110, 216, 112, 31, 253, 221, 23, 32, 200, 64, 68, 153, 184, 45, 49, 74, 227, 253, 163, 115, 204, 56, 102, 85, 33, 228, 161, 247, 156, 190, 156, 182, 93, 3, 215, 162, 255, 218, 115, 246, 74, 202, 223, 191, 42, 35, 74, 69, 36, 233, 223, 181, 166, 214, 24, 91, 149, 21, 2, 115, 247, 26, 238, 237, 93, 76, 139, 253, 15, 97, 37, 116, 157, 188, 152, 156, 12, 193, 128, 146, 106, 204, 30, 121, 60, 27, 94, 251, 208, 139, 120, 137, 105, 135, 250, 107, 37, 90, 2, 179, 12, 242, 152, 135, 140, 66, 113, 13, 39, 46, 36, 208, 214, 9, 61, 38, 209, 130, 7, 245, 130, 138, 63, 240, 151, 178, 230, 91, 1, 93, 83, 203, 162, 53, 99, 60, 4, 73, 139, 144, 170, 250, 253, 135, 104, 17, 124, 29, 45, 240, 63, 133, 5, 209, 118, 240, 120, 174, 211, 0, 17, 76, 235, 158, 67, 105, 9, 130, 221, 110, 207, 247, 200, 162, 107, 26, 225, 251, 114, 130, 233, 30, 207, 50, 69, 146, 118, 168, 110, 207, 103, 65, 170, 45, 187, 14, 164, 76, 23, 113, 215, 241, 115, 105, 133, 172, 44, 186, 174, 15, 148, 178, 97, 40, 118, 174, 106, 48, 124, 193, 185, 224, 126, 61, 176, 114, 77, 214, 148, 234, 43, 117, 119, 159, 239, 156, 112, 245, 177, 44, 230, 19, 22, 185, 138, 26, 73, 85, 253, 80, 25, 137, 85, 249, 115, 65, 15, 79, 85, 114, 8, 55, 157, 112, 45, 211, 92, 161, 137, 180, 157, 53, 146, 200, 110, 53, 72, 242, 194, 56, 19, 42, 114, 164, 238, 118, 191, 193, 77, 231, 234, 235, 238, 79, 211, 61, 17, 162, 10, 104, 233, 85, 212, 101, 109, 22, 239, 211, 159, 123, 206, 92, 78, 211, 51, 252, 156, 218, 80, 7, 121, 186, 15, 141, 230, 65, 40, 246, 189, 226, 93, 116, 52, 126, 31, 98, 11, 200, 84, 133, 39, 196, 188, 15, 197, 222, 25, 36, 234, 56, 137, 12, 84, 143, 231, 237, 244, 156, 68, 81, 107, 89, 240, 172, 153, 98, 27, 7, 137, 184, 127, 78, 139, 248, 127, 66, 39, 23, 207, 236, 45, 150, 105, 9, 4, 217, 126, 224, 120, 90, 206, 213, 237, 254, 107, 36, 18, 153, 107, 174, 35, 38, 25, 52, 118, 117, 205, 33, 162, 255, 55, 131, 40, 83, 102, 75, 180, 169, 108, 189, 213, 125, 250, 114, 86, 8, 83, 72, 210, 207, 200, 18, 79, 34, 89, 15, 155, 229, 201, 8, 31, 89, 74, 164, 176, 145, 20, 141, 25, 176, 233, 51, 195, 58, 19, 9, 237, 48, 110, 63, 134, 4, 3, 84, 247, 71, 69, 103, 134, 3, 199, 166, 52, 14, 57, 188, 190, 44, 87, 120, 143, 132, 33, 122, 153, 223, 91, 78, 92, 199, 124, 65, 181, 96, 44, 32, 213, 44, 79, 67, 105, 6, 150, 29, 22, 0, 244, 155, 67, 204, 11, 137, 11, 24, 116, 108, 184, 9, 63, 3, 25, 187, 18, 23, 249, 252, 103, 60, 141, 141, 13, 244, 123, 159, 161, 151, 239, 38, 148, 118, 224, 118, 68, 93, 102, 116, 219, 96, 198, 76, 173, 207, 213, 201, 237, 201, 194, 221, 43, 75, 206, 155, 40, 109, 40, 208, 16, 157, 105, 221, 160, 208, 185, 252, 165, 219, 237, 70, 44, 11, 250, 168, 89, 168, 182, 152, 11, 162, 191, 119, 69, 70, 196, 4, 189, 254, 27, 229, 222, 92, 36, 173, 192, 101, 77, 155, 141, 85, 100, 133, 126, 27, 139, 34, 100, 255, 202, 42, 3, 65, 12, 198, 168, 253, 67, 235, 38, 233, 30, 92, 147, 244, 217, 170, 39, 158, 152, 89, 130, 155, 181, 170, 24, 145, 18, 193, 254, 173, 19, 114, 116, 155, 182, 38, 208, 115, 145, 22, 147, 156, 149, 102, 31, 73, 138, 26, 73, 186, 254, 173, 19, 33, 73, 79, 56, 236, 147, 234, 106, 159, 65, 182, 42, 45, 128, 73, 136, 151, 139, 130, 254, 49, 106, 36, 123, 47, 92, 75, 121, 91, 218, 113, 77, 207, 146, 37, 31, 54, 182, 163, 37, 205, 83, 94, 64, 63, 26, 237, 198, 243, 133, 13, 4, 98, 95, 230, 241, 139, 17, 66, 243, 142, 189, 186, 234, 15, 100, 21, 178, 38, 53, 77, 204, 225, 59, 138, 146, 164, 162, 253, 33, 74, 159, 180, 112, 147, 30, 90, 179, 129, 230, 127, 91, 238, 152, 37, 118, 177, 129, 203, 178, 227, 200, 233, 172, 220, 216, 128, 231, 58, 163, 250, 124, 71, 10, 55, 0, 249, 247, 144, 44, 74, 151, 166, 125, 89, 90, 60, 95, 16, 101, 255, 20, 182, 251, 130, 11, 20, 170, 71, 8, 13, 168, 193, 200, 131, 106, 83, 211, 74, 108, 194, 68, 221, 233, 209, 51, 227, 174, 23, 46, 89, 255, 149, 54, 232, 120, 102, 228, 69, 115, 96, 105, 127, 20, 201, 87, 150, 251, 192, 250, 175, 211, 9, 249, 7, 218, 31, 252, 29, 209, 180, 120, 243, 56, 132, 157, 109, 43, 255, 64, 207, 196, 243, 41, 236, 194, 104, 23, 253, 223, 166, 219, 168, 28, 85, 139, 188, 210, 140, 63, 116, 22, 189, 20, 67, 235, 54, 33, 22, 33, 226, 46, 40, 88, 167, 157, 36, 72, 34, 1, 117, 28, 122, 120, 117, 179, 207, 96, 41, 238, 16, 115, 161, 165, 23, 127, 39, 122, 15, 66, 135, 21, 174, 199, 238, 211, 87, 18, 176, 206, 114, 164, 246, 232, 176, 150, 88, 112, 143, 161, 177, 43, 138, 239, 21, 69, 253, 169, 101, 135, 63, 219, 250, 147, 72, 236, 183, 17, 143, 244, 247, 175, 140, 35, 73, 199, 186, 0, 162, 169, 44, 89, 129, 217, 156, 84, 155, 242, 2, 226, 122, 99, 16, 123, 206, 10, 146, 164, 71, 92, 46, 245, 105, 217, 233, 136, 139, 14, 237, 232, 196, 238, 116, 160, 40, 90, 47, 231, 30, 231, 197, 217, 247, 31, 189, 137, 214, 77, 68, 112, 95, 143, 172, 93, 59, 119, 60, 110, 36, 235, 189, 164, 121, 124, 7, 230, 197, 223, 55, 144, 68, 193, 190, 236, 116, 218, 85, 39, 153, 181, 184, 93, 91, 199, 187, 139, 31, 122, 55, 252, 199, 209, 110, 44, 188, 118, 163, 16, 245, 31, 177, 198, 112, 168, 4, 36, 227, 105, 237, 200, 66, 152, 92, 11, 6, 55, 143, 103, 158, 134, 226, 135, 145, 43, 112, 223, 133, 215, 63, 148, 16, 207, 241, 8, 247, 8, 228, 221, 125, 250, 18, 17, 106, 155, 72, 28, 162, 185, 253, 112, 49, 75, 94, 88, 120, 46, 215, 231, 16, 122, 232, 56, 124, 42, 33, 122, 85, 150, 41, 27, 217, 126, 232, 36, 158, 71, 148, 53, 197, 65, 58, 244, 60, 190, 181, 128, 40, 115, 174, 234, 198, 198, 13, 138, 215, 247, 75, 39, 145, 164, 167, 165, 61, 59, 85, 101, 26, 136, 131, 182, 237, 63, 150, 66, 124, 150, 230, 225, 47, 204, 9, 112, 199, 98, 253, 114, 99, 227, 243, 72, 126, 131, 176, 194, 164, 148, 180, 89, 245, 95, 47, 222, 72, 55, 109, 126, 56, 137, 243, 32, 130, 126, 86, 9, 70, 246, 178, 85, 57, 109, 19, 117, 34, 59, 177, 227, 242, 247, 174, 204, 5, 242, 167, 186, 24, 56, 223, 30, 235, 90, 90, 164, 84, 147, 21, 169, 53, 55, 119, 142, 211, 151, 63, 179, 42, 175, 236, 226, 125, 35, 210, 179, 201, 50, 77, 98, 7, 108, 8, 157, 139, 4, 24, 209, 19, 81, 243, 30, 40, 32, 172, 210, 173, 110, 69, 125, 23, 22, 35, 16, 135, 80, 67, 41, 136, 185, 152, 13, 138, 225, 42, 163, 133, 11, 157, 56, 226, 138, 55, 212, 90, 132, 244, 135, 154, 70, 43, 218, 251, 84, 122, 129, 137, 120, 135, 75, 255, 209, 79, 20, 219, 7, 250, 31, 124, 65, 203, 117, 151, 120, 207, 24, 238, 187, 153, 6, 9, 125, 86, 131, 180, 89, 103, 207, 77, 58, 79, 145, 132, 211, 125, 230, 202, 184, 4, 206, 209, 55, 20, 9, 64, 100, 61, 127, 79, 141, 68, 170, 39, 244, 162, 91, 197, 196, 85, 245, 239, 20, 184, 36, 37, 41, 101, 37, 55, 27, 36, 233, 240, 243, 89, 143, 199, 211, 80, 238, 70, 171, 224, 222, 228, 54, 28, 68, 232, 174, 101, 139, 112, 191, 71, 104, 178, 61, 84, 14, 129, 132, 55, 184, 25, 85, 127, 232, 198, 4, 230, 105, 40, 62, 233, 241, 252, 13, 136, 178, 101, 247, 193, 226, 30, 30, 34, 102, 200, 33, 210, 125, 78, 231, 50, 168, 213, 119, 23, 139, 19, 231, 227, 246, 3, 3, 247, 211, 243, 248, 109, 213, 235, 197, 239, 149, 77, 22, 189, 185, 24, 191, 30, 92, 181, 62, 142, 123, 71, 115, 243, 46, 107, 188, 221, 252, 30, 151, 234, 126, 149, 27, 177, 89, 159, 255, 5, 108, 22, 39, 189, 213, 151, 185, 73, 65, 191, 216, 142, 110, 93, 90, 190, 244, 167, 232, 251, 42, 54, 7, 141, 141, 115, 196, 28, 116, 15, 68, 157, 243, 239, 251, 21, 214, 0, 178, 108, 211, 147, 125, 46, 66, 255, 245, 240, 201, 164, 155, 44, 119, 232, 191, 186, 60, 190, 183, 152, 155, 127, 78, 234, 185, 195, 145, 183, 184, 154, 154, 60, 114, 67, 93, 28, 86, 81, 207, 217, 171, 19, 175, 157, 26, 255, 67, 149, 69, 13, 26, 200, 218, 29, 137, 237, 24, 103, 98, 205, 12, 235, 245, 249, 91, 58, 155, 137, 40, 16, 127, 193, 46, 59, 141, 230, 200, 200, 164, 132, 85, 5, 81, 242, 82, 221, 184, 197, 172, 180, 150, 83, 167, 238, 33, 203, 231, 171, 120, 240, 219, 15, 157, 184, 133, 212, 132, 16, 0, 205, 103, 238, 229, 88, 160, 187, 67, 161, 135, 70, 89, 172, 103, 153, 238, 41, 217, 225, 248, 34, 50, 101, 105, 81, 201, 21, 124, 131, 108, 201, 74, 64, 77, 22, 122, 57, 66, 100, 94, 246, 249, 228, 49, 44, 201, 220, 226, 234, 245, 122, 101, 73, 250, 33, 126, 15, 25, 179, 34, 62, 91, 134, 203, 203, 236, 191, 9, 113, 7, 17, 19, 117, 58, 126, 225, 9, 183, 41, 118, 236, 132, 135, 89, 148, 170, 246, 15, 70, 252, 48, 101, 19, 73, 102, 12, 146, 124, 210, 226, 102, 29, 239, 98, 52, 219, 32, 150, 69, 114, 67, 253, 79, 48, 151, 61, 103, 174, 220, 250, 158, 88, 148, 162, 208, 147, 146, 44, 168, 55, 79, 240, 123, 45, 210, 133, 131, 247, 146, 213, 246, 45, 108, 202, 160, 228, 211, 111, 214, 44, 15, 89, 174, 72, 132, 202, 214, 85, 85, 129, 176, 146, 104, 145, 166, 200, 242, 213, 130, 239, 23, 239, 134, 211, 233, 92, 44, 171, 234, 37, 120, 3, 234, 133, 187, 123, 91, 166, 240, 217, 45, 69, 19, 22, 73, 42, 158, 72, 20, 2, 236, 63, 132, 132, 94, 193, 61, 21, 223, 133, 100, 30, 36, 222, 193, 235, 210, 188, 107, 127, 178, 88, 60, 117, 50, 54, 219, 61, 23, 174, 37, 188, 180, 217, 150, 170, 151, 11, 151, 179, 153, 197, 110, 254, 148, 106, 171, 223, 137, 154, 227, 222, 11, 215, 226, 125, 147, 236, 2, 54, 55, 153, 168, 75, 13, 173, 217, 144, 66, 214, 47, 173, 27, 79, 106, 161, 232, 64, 177, 119, 129, 113, 231, 100, 234, 204, 54, 173, 52, 89, 86, 190, 106, 148, 47, 36, 250, 175, 62, 126, 123, 8, 18, 253, 10, 207, 94, 205, 202, 142, 70, 221, 177, 96, 78, 26, 138, 50, 46, 167, 243, 0, 45, 112, 203, 203, 93, 80, 68, 163, 97, 85, 253, 44, 237, 148, 127, 232, 124, 96, 214, 47, 29, 247, 207, 72, 64, 107, 17, 214, 164, 183, 163, 71, 135, 72, 187, 59, 28, 61, 98, 177, 82, 103, 140, 119, 131, 225, 143, 117, 75, 68, 28, 191, 84, 221, 110, 33, 87, 149, 87, 49, 17, 253, 23, 175, 101, 124, 157, 189, 34, 109, 223, 19, 107, 221, 80, 104, 65, 141, 104, 221, 251, 131, 39, 16, 239, 209, 194, 77, 89, 196, 83, 161, 228, 211, 126, 248, 148, 136, 209, 74, 117, 53, 79, 107, 161, 80, 41, 229, 31, 67, 82, 119, 193, 160, 38, 213, 213, 254, 12, 155, 143, 182, 131, 199, 227, 165, 222, 99, 211, 101, 132, 236, 83, 213, 237, 65, 41, 66, 210, 204, 214, 179, 73, 85, 100, 102, 222, 125, 237, 114, 221, 208, 134, 72, 210, 14, 107, 210, 76, 218, 249, 23, 171, 133, 51, 209, 144, 132, 59, 26, 221, 132, 13, 79, 112, 229, 26, 180, 68, 203, 22, 46, 132, 136, 229, 195, 218, 84, 84, 237, 159, 203, 72, 104, 42, 205, 237, 218, 212, 20, 67, 121, 148, 39, 218, 44, 158, 45, 43, 73, 35, 214, 7, 185, 197, 224, 131, 107, 145, 40, 242, 2, 172, 55, 196, 124, 139, 198, 190, 85, 245, 2, 178, 198, 213, 64, 16, 46, 220, 12, 26, 9, 88, 45, 188, 124, 77, 225, 104, 150, 218, 121, 8, 114, 180, 235, 142, 133, 115, 158, 83, 155, 187, 180, 17, 158, 137, 161, 248, 179, 211, 249, 62, 8, 13, 136, 100, 180, 49, 221, 252, 19, 104, 237, 101, 38, 236, 156, 185, 154, 240, 208, 166, 95, 170, 173, 249, 179, 2, 79, 81, 110, 243, 40, 73, 175, 82, 21, 87, 238, 157, 157, 130, 70, 214, 34, 148, 100, 36, 225, 209, 58, 116, 19, 154, 207, 40, 233, 81, 124, 121, 77, 95, 22, 32, 184, 3, 19, 117, 114, 46, 36, 175, 239, 173, 8, 44, 151, 213, 55, 111, 18, 137, 178, 109, 255, 209, 172, 191, 119, 64, 215, 60, 30, 29, 113, 73, 34, 75, 236, 138, 47, 90, 94, 186, 25, 99, 45, 38, 180, 8, 220, 208, 92, 50, 98, 51, 66, 163, 21, 25, 137, 173, 123, 14, 37, 69, 135, 137, 154, 229, 232, 62, 113, 204, 242, 249, 113, 63, 148, 67, 37, 51, 177, 21, 66, 197, 36, 167, 237, 153, 70, 76, 210, 72, 20, 74, 55, 228, 228, 232, 190, 235, 106, 108, 188, 136, 162, 123, 139, 242, 203, 140, 66, 50, 163, 235, 60, 79, 187, 238, 95, 128, 140, 28, 115, 102, 102, 60, 45, 109, 226, 165, 66, 3, 88, 196, 143, 136, 140, 159, 215, 218, 218, 130, 229, 144, 148, 249, 125, 88, 200, 144, 225, 7, 23, 243, 144, 213, 123, 125, 204, 244, 121, 164, 204, 139, 6, 213, 181, 53, 89, 79, 44, 182, 218, 198, 88, 202, 176, 130, 121, 186, 246, 79, 41, 185, 154, 198, 148, 205, 66, 2, 239, 180, 107, 167, 62, 96, 44, 180, 170, 47, 240, 122, 33, 178, 177, 235, 64, 206, 245, 121, 254, 154, 176, 32, 197, 125, 146, 101, 36, 52, 253, 192, 215, 222, 190, 116, 50, 226, 78, 90, 44, 182, 5, 9, 92, 72, 72, 201, 147, 180, 89, 130, 112, 237, 229, 98, 35, 168, 230, 222, 155, 207, 20, 105, 40, 158, 171, 83, 117, 187, 59, 100, 201, 249, 162, 230, 243, 137, 142, 51, 216, 132, 89, 59, 214, 208, 117, 12, 181, 227, 26, 169, 223, 235, 230, 29, 162, 22, 84, 241, 122, 191, 76, 115, 60, 136, 158, 151, 197, 172, 102, 44, 252, 244, 220, 93, 80, 220, 238, 191, 23, 27, 224, 123, 171, 144, 29, 156, 29, 45, 147, 214, 32, 233, 108, 255, 56, 107, 55, 17, 86, 1, 249, 97, 13, 145, 26, 235, 95, 101, 189, 119, 121, 221, 101, 111, 224, 24, 234, 25, 219, 15, 157, 4, 105, 103, 167, 36, 180, 100, 38, 245, 208, 252, 117, 159, 190, 156, 64, 153, 23, 92, 242, 136, 15, 123, 91, 123, 188, 230, 252, 113, 169, 200, 29, 228, 102, 213, 130, 225, 171, 34, 33, 96, 237, 166, 228, 157, 210, 107, 78, 236, 50, 133, 21, 246, 72, 38, 188, 126, 243, 243, 72, 100, 161, 23, 236, 99, 37, 90, 3, 102, 9, 200, 18, 185, 161, 254, 73, 119, 83, 20, 59, 108, 100, 212, 165, 189, 157, 100, 65, 214, 18, 65, 250, 67, 199, 237, 220, 181, 89, 196, 23, 78, 32, 43, 216, 191, 226, 65, 196, 56, 178, 102, 17, 62, 17, 103, 6, 49, 86, 141, 44, 49, 119, 174, 240, 254, 241, 34, 36, 55, 203, 136, 31, 254, 43, 226, 145, 100, 165, 36, 59, 14, 159, 50, 219, 133, 37, 65, 30, 32, 78, 79, 52, 218, 54, 158, 133, 215, 252, 188, 175, 169, 221, 35, 59, 157, 79, 35, 102, 213, 126, 248, 228, 40, 217, 203, 55, 76, 203, 62, 227, 105, 110, 205, 34, 193, 137, 22, 231, 157, 133, 174, 220, 9, 192, 220, 20, 236, 164, 241, 101, 218, 68, 100, 149, 161, 174, 29, 118, 9, 9, 36, 65, 146, 196, 191, 255, 203, 70, 178, 154, 149, 247, 190, 72, 210, 215, 113, 206, 40, 49, 2, 57, 245, 156, 189, 146, 206, 137, 137, 215, 102, 181, 72, 75, 179, 157, 214, 182, 225, 29, 169, 35, 226, 219, 39, 59, 28, 71, 20, 143, 231, 59, 16, 51, 104, 25, 220, 159, 54, 201, 70, 36, 85, 237, 59, 154, 130, 190, 44, 145, 210, 151, 173, 37, 25, 69, 189, 11, 222, 96, 15, 89, 165, 191, 66, 121, 68, 231, 137, 243, 194, 42, 197, 177, 136, 100, 245, 250, 170, 170, 116, 104, 237, 166, 108, 209, 53, 33, 223, 47, 243, 152, 238, 110, 106, 206, 42, 154, 59, 3, 169, 69, 154, 239, 63, 41, 248, 62, 83, 56, 34, 42, 50, 182, 81, 23, 27, 142, 64, 154, 81, 207, 197, 38, 31, 43, 46, 233, 71, 4, 210, 178, 251, 96, 6, 237, 193, 232, 29, 200, 142, 71, 136, 223, 104, 43, 23, 87, 145, 164, 38, 203, 47, 177, 146, 100, 94, 147, 58, 218, 218, 227, 156, 119, 143, 200, 8, 166, 185, 75, 79, 101, 254, 69, 239, 80, 143, 207, 76, 108, 251, 238, 4, 106, 97, 165, 154, 101, 105, 45, 20, 58, 91, 184, 174, 48, 110, 39, 65, 194, 250, 65, 219, 165, 182, 78, 145, 137, 215, 55, 197, 130, 1, 99, 181, 165, 233, 57, 119, 53, 37, 234, 230, 28, 141, 191, 34, 2, 10, 148, 236, 170, 52, 69, 161, 221, 238, 135, 225, 94, 12, 14, 172, 126, 81, 168, 212, 220, 87, 133, 14, 26, 39, 39, 195, 255, 159, 95, 120, 124, 129, 223, 131, 28, 88, 100, 211, 182, 132, 25, 123, 17, 46, 184, 125, 71, 19, 130, 8, 16, 35, 211, 180, 131, 69, 206, 33, 39, 70, 30, 14, 183, 16, 25, 222, 196, 117, 67, 25, 7, 115, 32, 218, 107, 209, 70, 193, 236, 69, 56, 222, 197, 62, 47, 73, 22, 137, 132, 92, 14, 199, 115, 16, 203, 70, 50, 65, 209, 52, 120, 99, 55, 142, 68, 16, 199, 236, 42, 221, 57, 247, 158, 164, 84, 83, 253, 25, 34, 235, 55, 154, 66, 225, 118, 196, 217, 200, 106, 254, 140, 135, 22, 105, 45, 18, 141, 171, 193, 80, 22, 153, 183, 118, 137, 155, 91, 72, 242, 178, 157, 22, 157, 121, 28, 119, 36, 210, 33, 65, 240, 28, 226, 12, 23, 174, 165, 81, 162, 35, 154, 242, 6, 35, 123, 108, 252, 62, 171, 174, 239, 199, 64, 54, 112, 235, 35, 190, 238, 146, 156, 217, 182, 131, 199, 243, 117, 121, 100, 17, 101, 68, 230, 179, 162, 254, 196, 21, 137, 120, 75, 202, 69, 8, 4, 142, 33, 203, 83, 245, 7, 179, 221, 167, 47, 137, 94, 147, 254, 190, 129, 44, 220, 128, 176, 250, 58, 142, 157, 205, 140, 68, 82, 176, 62, 137, 80, 211, 240, 112, 136, 50, 27, 85, 61, 82, 224, 98, 205, 171, 205, 40, 154, 231, 93, 74, 93, 141, 200, 12, 70, 63, 210, 98, 22, 106, 62, 57, 236, 192, 177, 180, 80, 22, 154, 51, 67, 180, 77, 67, 157, 99, 89, 238, 208, 28, 73, 102, 99, 59, 247, 102, 160, 82, 164, 68, 34, 171, 10, 55, 56, 34, 76, 210, 209, 239, 118, 60, 48, 235, 69, 120, 154, 208, 243, 115, 202, 215, 62, 107, 169, 200, 177, 179, 73, 120, 141, 32, 235, 135, 132, 60, 218, 144, 46, 183, 188, 39, 156, 212, 115, 59, 8, 18, 153, 137, 180, 80, 254, 20, 47, 220, 80, 55, 128, 59, 128, 32, 173, 2, 231, 177, 86, 93, 34, 43, 151, 118, 87, 107, 173, 15, 119, 89, 139, 176, 166, 253, 173, 6, 197, 19, 44, 4, 129, 192, 233, 73, 244, 251, 15, 101, 188, 186, 189, 239, 133, 117, 222, 60, 120, 32, 142, 140, 215, 182, 67, 39, 226, 72, 244, 32, 11, 46, 235, 210, 188, 163, 245, 196, 204, 105, 173, 6, 194, 27, 240, 114, 187, 99, 173, 89, 119, 180, 89, 212, 115, 162, 105, 178, 29, 187, 75, 243, 247, 69, 51, 97, 89, 250, 14, 44, 33, 209, 54, 107, 148, 69, 136, 44, 134, 44, 234, 232, 104, 103, 47, 218, 138, 209, 130, 248, 191, 108, 56, 151, 92, 230, 177, 162, 132, 137, 196, 190, 170, 209, 98, 72, 247, 42, 183, 200, 219, 100, 73, 154, 106, 59, 116, 252, 109, 229, 62, 63, 165, 190, 71, 244, 29, 175, 68, 111, 65, 45, 18, 187, 9, 125, 96, 178, 202, 126, 221, 230, 239, 202, 123, 78, 200, 98, 251, 43, 196, 164, 67, 171, 214, 63, 135, 50, 15, 12, 171, 247, 37, 180, 122, 67, 22, 73, 56, 82, 205, 242, 95, 208, 60, 126, 147, 230, 224, 43, 78, 167, 51, 80, 132, 184, 76, 213, 163, 71, 20, 85, 123, 78, 90, 186, 40, 137, 126, 147, 134, 54, 176, 144, 5, 84, 60, 222, 175, 56, 23, 62, 240, 116, 232, 193, 181, 120, 31, 211, 197, 154, 111, 55, 239, 58, 144, 193, 243, 35, 203, 210, 247, 93, 110, 119, 255, 8, 27, 39, 75, 98, 150, 250, 118, 184, 250, 77, 129, 140, 97, 89, 224, 6, 65, 210, 166, 44, 165, 66, 17, 75, 114, 124, 139, 72, 227, 28, 54, 33, 112, 73, 222, 210, 56, 96, 108, 49, 146, 36, 26, 84, 59, 231, 223, 255, 163, 142, 13, 251, 135, 9, 42, 12, 213, 159, 182, 117, 223, 46, 75, 178, 88, 220, 31, 61, 85, 35, 27, 182, 38, 93, 203, 23, 195, 107, 244, 83, 45, 16, 222, 90, 24, 15, 103, 76, 62, 134, 130, 232, 154, 246, 41, 87, 245, 18, 189, 237, 224, 137, 248, 152, 177, 169, 169, 86, 233, 191, 252, 104, 150, 172, 191, 20, 92, 151, 100, 61, 157, 31, 231, 130, 44, 94, 214, 250, 250, 250, 101, 100, 81, 254, 153, 230, 241, 31, 180, 204, 193, 164, 236, 204, 242, 34, 229, 200, 78, 117, 58, 191, 10, 247, 106, 211, 198, 173, 191, 66, 54, 162, 179, 102, 249, 207, 52, 191, 191, 121, 172, 36, 14, 75, 47, 204, 147, 162, 206, 13, 98, 214, 190, 224, 14, 59, 221, 47, 180, 120, 190, 156, 198, 95, 144, 165, 240, 85, 231, 253, 85, 88, 16, 51, 136, 169, 21, 245, 36, 24, 139, 23, 26, 62, 147, 197, 148, 132, 84, 161, 226, 15, 175, 46, 92, 0, 39, 66, 148, 136, 153, 146, 101, 244, 78, 101, 168, 255, 163, 173, 37, 32, 102, 141, 164, 13, 231, 91, 124, 83, 164, 170, 159, 112, 187, 4, 65, 190, 213, 242, 111, 51, 39, 229, 189, 117, 185, 62, 15, 82, 238, 56, 122, 90, 184, 120, 69, 173, 166, 41, 73, 119, 242, 2, 106, 105, 179, 144, 14, 68, 43, 44, 225, 218, 215, 180, 243, 5, 215, 158, 39, 93, 250, 183, 127, 80, 137, 180, 154, 182, 236, 136, 119, 157, 186, 168, 15, 208, 241, 154, 7, 247, 137, 247, 206, 229, 247, 175, 81, 60, 158, 223, 129, 214, 112, 231, 209, 51, 195, 53, 132, 33, 243, 182, 251, 160, 33, 144, 33, 101, 45, 22, 100, 85, 193, 230, 115, 134, 113, 127, 23, 25, 177, 248, 87, 74, 117, 53, 34, 142, 73, 27, 199, 161, 174, 60, 230, 249, 159, 190, 148, 129, 26, 142, 84, 95, 155, 246, 52, 181, 182, 139, 247, 192, 31, 252, 77, 137, 136, 44, 182, 109, 87, 186, 164, 100, 179, 124, 51, 128, 43, 113, 180, 175, 147, 234, 235, 255, 170, 240, 186, 243, 36, 25, 10, 109, 23, 162, 41, 251, 143, 101, 166, 44, 38, 57, 150, 254, 43, 157, 7, 214, 100, 228, 0, 224, 220, 104, 195, 253, 134, 129, 39, 158, 176, 54, 102, 103, 171, 114, 50, 97, 250, 228, 21, 191, 255, 53, 48, 235, 163, 91, 7, 69, 150, 227, 29, 211, 239, 205, 120, 1, 155, 54, 63, 44, 210, 231, 85, 95, 224, 117, 99, 145, 74, 169, 174, 42, 203, 113, 38, 53, 115, 44, 95, 131, 230, 243, 201, 180, 155, 255, 185, 66, 27, 17, 196, 220, 188, 177, 88, 189, 133, 232, 198, 104, 146, 108, 102, 32, 186, 95, 77, 59, 244, 139, 54, 237, 36, 115, 133, 221, 110, 183, 95, 203, 137, 39, 232, 190, 246, 46, 29, 197, 238, 208, 100, 237, 31, 37, 147, 49, 215, 2, 105, 75, 82, 220, 147, 64, 78, 51, 118, 192, 38, 194, 49, 147, 138, 100, 77, 235, 84, 114, 42, 59, 89, 155, 226, 146, 38, 209, 190, 72, 215, 218, 104, 83, 28, 181, 232, 156, 250, 124, 190, 165, 46, 175, 119, 139, 101, 19, 99, 187, 146, 74, 190, 245, 91, 83, 87, 131, 84, 95, 247, 12, 98, 212, 221, 167, 46, 14, 247, 0, 161, 79, 234, 141, 87, 138, 204, 73, 67, 180, 226, 253, 150, 115, 153, 89, 120, 44, 37, 216, 212, 11, 193, 250, 240, 218, 77, 248, 189, 44, 18, 120, 196, 226, 236, 116, 252, 92, 92, 87, 180, 83, 150, 150, 45, 73, 64, 79, 55, 111, 77, 26, 110, 120, 8, 9, 184, 114, 113, 242, 180, 97, 253, 63, 173, 74, 82, 183, 245, 248, 22, 107, 251, 9, 143, 225, 38, 70, 54, 45, 92, 187, 183, 116, 48, 161, 141, 113, 96, 96, 117, 214, 249, 192, 44, 221, 19, 109, 217, 102, 158, 107, 215, 224, 224, 28, 105, 217, 226, 159, 134, 86, 173, 195, 218, 144, 41, 85, 13, 136, 44, 210, 184, 11, 114, 150, 170, 250, 7, 35, 90, 210, 154, 231, 119, 32, 138, 129, 6, 212, 69, 227, 163, 183, 195, 72, 48, 245, 95, 207, 93, 77, 5, 86, 174, 201, 160, 84, 132, 54, 144, 223, 48, 55, 13, 108, 85, 78, 193, 226, 237, 14, 135, 247, 33, 110, 226, 95, 177, 106, 88, 250, 250, 157, 224, 102, 21, 98, 201, 187, 15, 197, 197, 131, 49, 164, 115, 57, 209, 197, 205, 44, 106, 158, 178, 26, 164, 124, 76, 148, 118, 207, 138, 219, 243, 129, 124, 1, 115, 233, 49, 170, 25, 99, 144, 253, 68, 44, 159, 153, 232, 121, 135, 5, 36, 182, 125, 247, 139, 43, 140, 36, 169, 209, 238, 73, 235, 222, 35, 113, 100, 224, 209, 181, 252, 125, 225, 174, 220, 6, 152, 9, 60, 39, 212, 161, 204, 86, 91, 202, 63, 140, 26, 201, 167, 204, 249, 159, 164, 13, 210, 204, 73, 184, 87, 163, 231, 18, 68, 163, 3, 200, 37, 176, 54, 31, 200, 213, 209, 230, 164, 28, 133, 176, 182, 44, 125, 217, 92, 76, 139, 196, 223, 103, 152, 177, 125, 34, 184, 183, 192, 133, 75, 150, 225, 139, 190, 174, 94, 29, 110, 126, 45, 212, 180, 54, 111, 185, 186, 221, 175, 117, 213, 44, 135, 70, 235, 45, 33, 25, 40, 66, 117, 28, 57, 149, 117, 199, 90, 210, 26, 136, 210, 176, 90, 45, 207, 249, 108, 35, 55, 96, 111, 206, 75, 32, 235, 109, 123, 143, 166, 70, 112, 143, 166, 97, 1, 59, 23, 206, 121, 222, 51, 176, 121, 89, 158, 16, 78, 157, 186, 199, 185, 108, 209, 127, 160, 33, 55, 188, 25, 101, 172, 41, 169, 64, 255, 74, 244, 139, 253, 165, 214, 49, 96, 221, 36, 137, 251, 19, 236, 237, 117, 58, 151, 45, 126, 222, 223, 221, 39, 98, 255, 125, 83, 40, 149, 87, 178, 254, 43, 100, 6, 119, 29, 140, 35, 225, 9, 229, 107, 170, 223, 255, 178, 194, 103, 129, 97, 247, 203, 213, 212, 22, 148, 234, 106, 83, 16, 75, 54, 155, 173, 222, 41, 205, 80, 69, 243, 210, 35, 167, 69, 151, 111, 90, 216, 254, 19, 178, 89, 211, 124, 215, 52, 179, 152, 37, 80, 38, 169, 205, 180, 217, 42, 17, 199, 18, 197, 221, 46, 215, 151, 148, 134, 122, 17, 47, 45, 230, 110, 31, 170, 143, 188, 152, 16, 11, 156, 36, 125, 199, 219, 211, 51, 127, 132, 69, 119, 194, 231, 4, 87, 156, 165, 229, 150, 109, 73, 59, 72, 173, 159, 138, 48, 70, 9, 30, 2, 91, 223, 101, 8, 213, 99, 227, 18, 124, 112, 93, 18, 25, 146, 66, 104, 226, 200, 233, 132, 146, 203, 230, 252, 129, 22, 235, 91, 62, 218, 98, 106, 222, 67, 40, 17, 185, 20, 229, 5, 196, 236, 69, 185, 149, 215, 123, 204, 106, 225, 171, 109, 109, 14, 34, 154, 103, 17, 223, 131, 20, 159, 85, 114, 13, 241, 118, 144, 178, 81, 166, 245, 119, 35, 108, 242, 242, 61, 77, 17, 58, 64, 140, 189, 235, 228, 133, 164, 181, 97, 180, 69, 238, 48, 129, 250, 101, 75, 104, 36, 87, 243, 92, 179, 236, 11, 126, 244, 189, 52, 227, 146, 37, 8, 29, 136, 164, 162, 125, 71, 94, 68, 215, 27, 213, 235, 255, 77, 203, 241, 114, 89, 228, 30, 207, 53, 88, 145, 52, 103, 55, 69, 249, 203, 133, 235, 119, 12, 73, 22, 38, 245, 224, 29, 68, 226, 33, 18, 2, 233, 94, 125, 10, 22, 190, 101, 110, 89, 255, 213, 174, 56, 25, 36, 168, 208, 157, 93, 168, 117, 28, 59, 155, 52, 164, 217, 238, 12, 23, 43, 226, 17, 167, 46, 102, 132, 171, 167, 161, 254, 41, 20, 231, 87, 200, 110, 105, 152, 134, 229, 68, 226, 94, 182, 187, 131, 131, 109, 181, 52, 215, 63, 118, 9, 245, 150, 243, 137, 97, 173, 131, 140, 222, 149, 208, 156, 244, 182, 117, 136, 196, 33, 79, 83, 83, 187, 157, 113, 209, 194, 216, 29, 61, 155, 127, 106, 144, 100, 220, 38, 146, 76, 24, 73, 59, 127, 63, 217, 22, 222, 20, 35, 255, 60, 169, 62, 223, 155, 228, 185, 179, 68, 191, 198, 238, 211, 151, 111, 162, 148, 67, 110, 108, 120, 209, 221, 220, 233, 47, 229, 253, 201, 215, 20, 231, 106, 115, 179, 46, 213, 253, 114, 139, 43, 125, 150, 185, 110, 72, 75, 23, 126, 87, 184, 59, 175, 60, 150, 177, 42, 48, 181, 29, 60, 158, 20, 18, 107, 78, 231, 255, 131, 197, 55, 146, 171, 57, 239, 222, 245, 120, 54, 138, 226, 121, 89, 186, 69, 92, 220, 236, 183, 138, 242, 21, 51, 73, 45, 239, 138, 119, 52, 252, 45, 90, 222, 117, 159, 185, 156, 26, 115, 99, 63, 164, 62, 148, 242, 66, 146, 174, 174, 38, 165, 4, 115, 101, 83, 198, 51, 144, 179, 110, 53, 237, 49, 183, 170, 8, 189, 224, 178, 179, 103, 167, 112, 109, 204, 39, 245, 208, 6, 33, 186, 117, 103, 18, 146, 144, 82, 125, 221, 139, 106, 48, 114, 184, 208, 115, 197, 24, 255, 34, 109, 234, 151, 190, 19, 59, 79, 184, 51, 39, 44, 24, 96, 220, 60, 115, 216, 209, 22, 139, 30, 214, 20, 234, 190, 84, 127, 240, 45, 147, 73, 18, 183, 105, 81, 187, 163, 96, 17, 64, 232, 146, 27, 234, 116, 119, 56, 34, 106, 252, 172, 238, 52, 144, 100, 120, 253, 230, 140, 180, 224, 126, 93, 243, 7, 207, 89, 23, 173, 201, 152, 27, 90, 168, 63, 100, 88, 126, 118, 145, 100, 28, 164, 75, 22, 206, 107, 172, 86, 73, 133, 108, 125, 103, 91, 230, 237, 51, 152, 55, 21, 217, 211, 13, 245, 200, 4, 31, 24, 143, 107, 31, 100, 88, 140, 136, 33, 136, 224, 92, 60, 255, 233, 240, 218, 141, 162, 163, 70, 190, 1, 193, 201, 11, 185, 204, 97, 40, 77, 145, 181, 57, 150, 183, 196, 124, 118, 232, 120, 30, 151, 228, 252, 49, 98, 170, 237, 135, 79, 10, 87, 177, 209, 127, 51, 225, 170, 171, 198, 125, 251, 243, 194, 223, 65, 109, 40, 92, 194, 237, 7, 79, 148, 212, 222, 10, 201, 47, 232, 143, 137, 13, 4, 61, 187, 231, 11, 188, 31, 226, 122, 189, 203, 150, 205, 119, 105, 158, 63, 118, 204, 153, 161, 163, 244, 2, 110, 235, 59, 165, 4, 110, 20, 1, 130, 44, 188, 109, 34, 227, 157, 44, 100, 197, 237, 249, 107, 173, 163, 99, 129, 229, 126, 115, 82, 79, 185, 24, 106, 25, 21, 124, 41, 18, 117, 144, 124, 33, 58, 8, 140, 67, 193, 194, 42, 220, 109, 244, 122, 20, 253, 30, 243, 58, 140, 227, 125, 184, 204, 22, 63, 59, 247, 33, 35, 47, 169, 161, 6, 204, 229, 250, 139, 73, 112, 235, 49, 138, 61, 27, 177, 216, 10, 231, 178, 37, 200, 92, 133, 120, 67, 214, 44, 39, 104, 63, 116, 34, 45, 205, 157, 13, 247, 219, 87, 38, 145, 244, 243, 237, 155, 232, 158, 255, 187, 65, 146, 118, 185, 91, 19, 6, 73, 94, 173, 60, 146, 180, 220, 63, 77, 91, 238, 146, 229, 39, 81, 194, 161, 122, 60, 227, 173, 207, 156, 97, 249, 57, 195, 112, 65, 137, 249, 66, 169, 144, 115, 241, 188, 95, 18, 233, 228, 221, 173, 189, 231, 174, 166, 177, 80, 75, 53, 203, 147, 190, 150, 150, 112, 9, 214, 76, 78, 47, 214, 227, 81, 92, 146, 116, 156, 238, 141, 208, 139, 133, 70, 179, 33, 28, 146, 241, 117, 245, 138, 110, 41, 74, 56, 186, 177, 144, 112, 21, 95, 112, 31, 116, 150, 155, 182, 236, 200, 140, 154, 104, 104, 88, 93, 109, 7, 200, 194, 93, 182, 24, 2, 36, 127, 95, 232, 177, 40, 244, 42, 104, 225, 240, 85, 100, 207, 54, 61, 180, 61, 189, 98, 178, 229, 56, 39, 216, 112, 218, 116, 75, 67, 142, 16, 226, 47, 242, 146, 121, 168, 101, 253, 190, 53, 134, 204, 107, 230, 56, 220, 106, 238, 104, 116, 141, 188, 124, 137, 238, 237, 232, 206, 246, 94, 26, 67, 48, 192, 74, 134, 150, 140, 57, 16, 107, 255, 35, 143, 103, 68, 193, 237, 165, 151, 164, 186, 79, 95, 78, 181, 29, 56, 150, 65, 17, 110, 251, 161, 83, 41, 252, 253, 132, 200, 82, 220, 252, 151, 233, 162, 157, 12, 2, 212, 154, 231, 247, 248, 134, 79, 186, 101, 59, 131, 22, 171, 126, 90, 180, 174, 211, 34, 251, 83, 164, 243, 183, 238, 59, 98, 46, 90, 136, 131, 100, 145, 142, 239, 152, 51, 51, 45, 53, 214, 127, 149, 200, 230, 88, 85, 145, 142, 18, 118, 156, 75, 99, 99, 227, 18, 58, 151, 159, 24, 137, 54, 41, 155, 50, 91, 83, 70, 34, 208, 142, 145, 220, 128, 149, 18, 74, 161, 235, 172, 86, 124, 77, 158, 2, 23, 255, 120, 188, 78, 183, 144, 176, 175, 169, 201, 227, 88, 52, 55, 133, 54, 109, 120, 71, 241, 190, 34, 52, 2, 93, 97, 151, 162, 192, 234, 255, 125, 11, 41, 143, 216, 137, 6, 231, 72, 159, 253, 158, 219, 227, 209, 33, 246, 143, 214, 117, 208, 139, 21, 235, 17, 141, 240, 134, 205, 89, 137, 172, 69, 69, 211, 158, 69, 237, 172, 197, 82, 126, 61, 178, 98, 209, 44, 25, 154, 180, 183, 148, 139, 21, 198, 209, 105, 157, 10, 175, 223, 172, 59, 23, 205, 77, 194, 106, 29, 105, 211, 32, 230, 110, 112, 48, 23, 159, 148, 229, 127, 132, 142, 170, 168, 23, 191, 98, 119, 189, 248, 80, 137, 11, 17, 252, 144, 130, 81, 225, 58, 91, 142, 254, 235, 101, 67, 255, 117, 223, 209, 184, 234, 241, 234, 88, 223, 85, 159, 239, 247, 10, 238, 29, 91, 149, 165, 236, 50, 189, 177, 158, 122, 218, 105, 252, 2, 53, 83, 194, 159, 111, 205, 78, 51, 110, 80, 239, 45, 132, 152, 147, 166, 18, 196, 119, 249, 209, 36, 237, 90, 18, 136, 97, 54, 15, 238, 215, 195, 235, 54, 233, 190, 246, 78, 81, 62, 128, 236, 58, 52, 81, 133, 143, 28, 153, 103, 93, 199, 207, 197, 145, 161, 150, 171, 167, 122, 73, 201, 15, 154, 233, 115, 239, 56, 122, 38, 9, 177, 97, 122, 96, 255, 117, 164, 23, 151, 97, 11, 204, 206, 244, 143, 139, 82, 16, 122, 54, 64, 134, 180, 0, 101, 69, 255, 74, 99, 19, 5, 55, 88, 207, 185, 71, 178, 177, 237, 187, 116, 79, 52, 166, 27, 86, 217, 63, 219, 156, 41, 106, 198, 35, 189, 70, 125, 164, 93, 178, 116, 25, 67, 76, 0, 49, 201, 206, 74, 37, 201, 34, 215, 101, 103, 137, 211, 44, 195, 211, 176, 92, 118, 58, 159, 209, 2, 33, 244, 120, 21, 185, 12, 34, 11, 125, 112, 255, 139, 66, 226, 17, 218, 168, 94, 175, 107, 148, 247, 53, 23, 238, 9, 182, 56, 101, 135, 227, 5, 184, 133, 209, 119, 85, 196, 35, 47, 15, 245, 92, 165, 181, 32, 131, 141, 60, 220, 170, 238, 112, 184, 63, 79, 146, 138, 242, 151, 32, 86, 196, 197, 155, 31, 222, 51, 106, 147, 112, 99, 45, 201, 52, 109, 218, 78, 36, 57, 239, 25, 172, 127, 163, 109, 182, 243, 89, 232, 129, 200, 42, 105, 201, 124, 209, 44, 221, 78, 237, 106, 107, 243, 101, 34, 224, 36, 206, 191, 147, 230, 176, 239, 202, 75, 161, 198, 149, 21, 101, 39, 198, 28, 244, 150, 67, 152, 150, 82, 17, 90, 215, 147, 254, 190, 149, 89, 161, 255, 42, 203, 95, 246, 183, 182, 134, 204, 247, 147, 75, 69, 74, 120, 105, 92, 138, 246, 47, 194, 151, 111, 138, 89, 95, 184, 54, 44, 142, 40, 220, 166, 198, 67, 143, 160, 60, 253, 125, 146, 110, 102, 28, 238, 138, 232, 150, 157, 122, 112, 197, 42, 221, 67, 187, 62, 244, 138, 67, 179, 89, 231, 194, 7, 158, 145, 106, 170, 255, 133, 110, 198, 155, 84, 143, 231, 176, 22, 14, 119, 65, 166, 204, 185, 116, 81, 6, 250, 170, 161, 213, 235, 241, 34, 197, 77, 162, 29, 115, 167, 100, 44, 198, 16, 4, 23, 238, 27, 218, 45, 250, 59, 58, 220, 86, 119, 15, 195, 118, 43, 50, 87, 35, 134, 230, 206, 116, 95, 3, 189, 43, 95, 232, 189, 112, 61, 59, 82, 215, 7, 100, 48, 118, 159, 186, 248, 162, 176, 242, 100, 89, 215, 34, 17, 59, 107, 14, 205, 204, 214, 21, 134, 21, 153, 177, 185, 252, 227, 69, 73, 146, 92, 119, 193, 134, 203, 238, 44, 232, 42, 171, 139, 26, 113, 78, 9, 77, 1, 130, 33, 72, 196, 165, 219, 15, 159, 76, 32, 67, 30, 9, 56, 46, 77, 123, 188, 212, 77, 59, 4, 50, 144, 152, 67, 86, 105, 42, 23, 223, 180, 136, 19, 236, 57, 44, 234, 26, 85, 205, 243, 250, 66, 247, 184, 230, 243, 173, 117, 73, 142, 239, 226, 158, 18, 201, 140, 152, 188, 35, 202, 96, 174, 189, 76, 168, 67, 57, 22, 220, 255, 156, 167, 45, 215, 206, 109, 20, 178, 16, 27, 138, 129, 35, 71, 238, 119, 46, 153, 255, 3, 100, 240, 14, 149, 153, 220, 152, 104, 199, 143, 172, 225, 149, 201, 182, 236, 62, 152, 192, 102, 84, 200, 236, 73, 78, 29, 101, 39, 177, 135, 247, 144, 37, 125, 1, 45, 186, 82, 88, 131, 77, 79, 92, 57, 100, 153, 215, 127, 165, 115, 142, 237, 216, 43, 178, 140, 81, 42, 162, 132, 66, 151, 11, 55, 2, 140, 97, 55, 221, 80, 184, 119, 123, 223, 32, 221, 95, 133, 221, 145, 161, 33, 122, 35, 31, 75, 132, 217, 143, 56, 0, 26, 1, 195, 130, 107, 25, 220, 151, 70, 65, 49, 26, 148, 66, 37, 6, 15, 178, 227, 129, 89, 89, 231, 194, 57, 255, 37, 213, 213, 254, 29, 50, 193, 224, 247, 246, 116, 117, 53, 20, 221, 145, 53, 53, 5, 233, 101, 249, 75, 34, 81, 93, 149, 36, 195, 149, 114, 65, 244, 141, 203, 63, 208, 35, 171, 253, 103, 233, 187, 83, 72, 111, 166, 239, 56, 54, 198, 67, 205, 176, 201, 122, 19, 155, 40, 85, 125, 15, 244, 91, 155, 7, 247, 37, 110, 145, 37, 28, 202, 18, 204, 96, 167, 138, 54, 106, 138, 215, 123, 212, 102, 171, 44, 247, 172, 42, 202, 126, 35, 30, 153, 180, 171, 252, 195, 32, 201, 239, 209, 34, 177, 128, 189, 18, 54, 184, 116, 253, 254, 237, 120, 6, 160, 175, 11, 173, 86, 231, 242, 37, 79, 187, 220, 238, 53, 69, 220, 248, 163, 62, 115, 116, 95, 62, 40, 74, 47, 14, 159, 74, 154, 174, 253, 238, 51, 87, 146, 170, 230, 70, 67, 242, 111, 91, 18, 136, 76, 171, 88, 252, 174, 167, 189, 183, 201, 49, 239, 222, 108, 128, 54, 238, 197, 100, 242, 76, 97, 116, 36, 20, 33, 17, 205, 229, 116, 62, 11, 145, 135, 18, 194, 54, 57, 241, 248, 229, 139, 63, 225, 107, 237, 0, 209, 38, 251, 39, 146, 192, 99, 181, 30, 79, 93, 74, 249, 251, 31, 204, 162, 12, 133, 172, 232, 175, 211, 250, 118, 128, 158, 201, 87, 57, 151, 45, 250, 54, 226, 160, 144, 223, 131, 228, 30, 44, 76, 88, 233, 185, 82, 158, 199, 115, 194, 239, 165, 198, 48, 173, 250, 175, 199, 207, 37, 161, 195, 141, 6, 243, 180, 102, 127, 16, 241, 100, 203, 245, 243, 243, 111, 125, 24, 32, 90, 140, 22, 48, 32, 159, 129, 107, 47, 75, 231, 98, 137, 55, 82, 184, 105, 173, 251, 143, 102, 154, 30, 122, 88, 15, 244, 173, 204, 89, 137, 78, 135, 14, 87, 3, 17, 226, 47, 165, 165, 11, 63, 43, 53, 54, 190, 78, 241, 6, 246, 251, 91, 187, 67, 45, 155, 79, 61, 48, 210, 206, 16, 59, 20, 12, 235, 3, 168, 181, 118, 197, 208, 150, 8, 1, 120, 85, 85, 144, 29, 153, 69, 252, 18, 113, 130, 66, 178, 28, 86, 168, 78, 223, 79, 150, 205, 219, 38, 24, 83, 97, 148, 73, 78, 85, 79, 60, 49, 211, 37, 57, 63, 143, 76, 185, 214, 125, 71, 134, 26, 70, 91, 210, 242, 67, 171, 215, 39, 101, 36, 240, 120, 60, 191, 102, 247, 253, 177, 180, 7, 123, 220, 230, 26, 201, 132, 65, 186, 159, 103, 215, 253, 196, 145, 87, 206, 241, 122, 143, 161, 5, 23, 89, 254, 31, 215, 250, 134, 213, 97, 142, 249, 60, 228, 173, 73, 212, 93, 214, 215, 61, 231, 142, 198, 114, 66, 8, 87, 31, 203, 10, 119, 225, 242, 37, 104, 72, 190, 166, 136, 245, 51, 211, 116, 241, 171, 30, 207, 159, 40, 181, 203, 225, 25, 187, 89, 172, 100, 137, 72, 34, 131, 208, 146, 84, 91, 157, 82, 252, 254, 77, 165, 108, 232, 6, 204, 90, 76, 167, 51, 215, 91, 146, 172, 187, 178, 187, 142, 88, 8, 77, 24, 6, 151, 31, 77, 55, 239, 220, 151, 84, 85, 77, 71, 75, 51, 197, 231, 251, 125, 121, 224, 72, 62, 123, 24, 150, 171, 55, 210, 252, 160, 75, 146, 94, 231, 92, 178, 224, 201, 220, 122, 169, 10, 194, 140, 61, 188, 59, 219, 117, 242, 34, 172, 229, 161, 117, 179, 132, 24, 102, 222, 114, 189, 120, 35, 77, 150, 122, 2, 27, 17, 185, 177, 225, 23, 90, 32, 60, 88, 120, 15, 238, 122, 55, 171, 59, 24, 140, 202, 142, 198, 132, 26, 138, 164, 241, 48, 161, 143, 34, 220, 160, 94, 218, 37, 137, 148, 109, 154, 60, 231, 226, 121, 25, 231, 242, 197, 223, 150, 235, 235, 222, 69, 15, 252, 163, 106, 48, 184, 50, 210, 189, 182, 122, 36, 235, 20, 139, 25, 94, 134, 17, 2, 194, 51, 10, 255, 94, 139, 197, 186, 100, 167, 243, 67, 210, 210, 5, 58, 2, 226, 145, 77, 219, 178, 104, 128, 154, 243, 195, 191, 52, 223, 229, 3, 129, 114, 163, 163, 193, 119, 131, 3, 3, 243, 74, 216, 245, 49, 108, 66, 94, 58, 172, 107, 29, 146, 102, 158, 66, 49, 57, 138, 209, 205, 250, 217, 188, 60, 32, 186, 40, 248, 253, 127, 102, 33, 26, 219, 200, 198, 66, 146, 111, 178, 153, 36, 227, 6, 73, 190, 187, 68, 75, 135, 81, 162, 247, 129, 54, 224, 171, 130, 193, 193, 123, 173, 228, 89, 42, 242, 165, 71, 254, 208, 113, 105, 238, 44, 61, 186, 117, 103, 162, 117, 207, 225, 56, 26, 88, 147, 229, 243, 135, 35, 46, 228, 70, 130, 13, 44, 35, 169, 161, 254, 105, 180, 35, 235, 61, 159, 19, 67, 17, 225, 35, 241, 188, 62, 14, 161, 242, 52, 188, 103, 106, 36, 118, 168, 208, 101, 59, 214, 181, 201, 245, 181, 239, 133, 209, 64, 155, 250, 100, 185, 53, 147, 166, 238, 170, 176, 100, 79, 92, 72, 32, 83, 28, 27, 127, 232, 55, 171, 209, 104, 119, 193, 102, 99, 24, 105, 107, 23, 47, 222, 7, 45, 100, 250, 236, 27, 165, 234, 165, 223, 133, 193, 162, 210, 51, 236, 239, 89, 161, 199, 118, 236, 205, 162, 39, 38, 29, 59, 105, 174, 157, 230, 247, 245, 142, 144, 184, 100, 234, 191, 162, 13, 158, 22, 10, 139, 230, 242, 138, 219, 251, 103, 38, 73, 27, 243, 123, 87, 10, 16, 228, 133, 123, 105, 97, 248, 174, 72, 200, 240, 249, 133, 255, 219, 121, 255, 12, 4, 177, 127, 38, 213, 85, 255, 51, 145, 209, 235, 93, 30, 207, 65, 184, 71, 45, 197, 191, 197, 200, 214, 28, 229, 88, 13, 51, 170, 10, 20, 32, 112, 243, 93, 178, 252, 73, 33, 117, 229, 245, 226, 165, 72, 245, 156, 189, 146, 20, 89, 114, 23, 111, 100, 33, 131, 229, 172, 94, 154, 54, 107, 187, 216, 127, 126, 123, 44, 4, 111, 107, 171, 151, 118, 157, 47, 192, 229, 5, 55, 249, 192, 141, 87, 160, 36, 199, 144, 162, 115, 127, 100, 18, 173, 49, 179, 27, 197, 7, 109, 118, 183, 38, 12, 210, 125, 125, 129, 235, 142, 49, 177, 53, 102, 166, 101, 135, 51, 222, 205, 172, 153, 172, 245, 62, 8, 181, 27, 162, 246, 255, 109, 33, 199, 153, 99, 16, 236, 65, 144, 106, 120, 253, 67, 168, 247, 22, 177, 77, 120, 60, 86, 92, 127, 121, 166, 253, 224, 137, 155, 72, 40, 36, 139, 115, 67, 41, 36, 105, 110, 210, 208, 242, 12, 150, 87, 96, 197, 170, 84, 89, 89, 250, 249, 98, 127, 218, 88, 94, 186, 145, 235, 11, 41, 57, 114, 18, 114, 94, 255, 255, 40, 216, 144, 206, 44, 152, 199, 91, 212, 114, 224, 106, 86, 3, 129, 13, 52, 31, 127, 44, 85, 47, 249, 142, 244, 255, 219, 251, 18, 248, 56, 234, 178, 255, 201, 38, 77, 122, 38, 109, 210, 52, 71, 119, 103, 246, 206, 177, 57, 155, 54, 215, 158, 61, 104, 9, 37, 45, 165, 77, 161, 45, 45, 189, 72, 219, 36, 155, 100, 119, 115, 110, 2, 68, 20, 21, 245, 125, 125, 65, 1, 241, 66, 84, 60, 10, 168, 128, 239, 43, 234, 171, 120, 188, 2, 10, 136, 127, 84, 20, 69, 78, 57, 69, 238, 163, 109, 142, 249, 63, 207, 111, 103, 210, 201, 118, 119, 179, 73, 54, 247, 243, 253, 244, 233, 108, 146, 221, 217, 153, 223, 204, 252, 190, 191, 231, 94, 150, 196, 8, 19, 173, 126, 232, 18, 195, 120, 17, 212, 82, 3, 46, 179, 48, 62, 76, 57, 168, 7, 143, 169, 193, 51, 80, 176, 113, 203, 128, 46, 64, 216, 79, 97, 255, 76, 210, 42, 57, 22, 4, 113, 59, 12, 242, 139, 90, 65, 115, 187, 206, 96, 104, 55, 128, 90, 95, 80, 177, 49, 35, 156, 217, 13, 39, 74, 151, 139, 221, 76, 49, 155, 68, 164, 155, 111, 248, 6, 48, 22, 21, 213, 106, 121, 245, 3, 120, 209, 145, 188, 203, 234, 246, 245, 99, 103, 1, 156, 148, 117, 188, 230, 30, 50, 5, 76, 63, 81, 26, 11, 74, 92, 88, 13, 5, 125, 26, 107, 47, 57, 240, 14, 54, 129, 213, 10, 194, 159, 176, 163, 73, 52, 102, 171, 137, 0, 238, 215, 199, 165, 110, 29, 177, 74, 255, 144, 251, 72, 118, 144, 117, 98, 82, 76, 245, 19, 153, 43, 2, 133, 246, 243, 242, 178, 96, 1, 253, 186, 33, 224, 59, 182, 71, 49, 7, 40, 91, 124, 125, 223, 168, 215, 33, 169, 137, 37, 219, 118, 98, 220, 133, 88, 116, 126, 45, 139, 169, 48, 7, 162, 176, 175, 142, 114, 78, 97, 196, 197, 23, 22, 174, 208, 25, 140, 15, 224, 61, 95, 186, 99, 247, 112, 31, 216, 81, 205, 171, 168, 61, 74, 189, 32, 177, 186, 15, 54, 0, 128, 115, 122, 8, 230, 187, 53, 99, 32, 35, 102, 169, 11, 126, 31, 150, 128, 52, 21, 148, 108, 69, 194, 228, 87, 44, 125, 30, 3, 39, 113, 225, 151, 239, 216, 128, 11, 216, 254, 234, 122, 55, 70, 201, 74, 62, 204, 174, 115, 136, 93, 89, 255, 21, 11, 200, 224, 243, 32, 172, 92, 1, 243, 111, 254, 71, 130, 159, 253, 121, 167, 77, 226, 214, 146, 158, 190, 52, 156, 137, 13, 87, 100, 83, 149, 71, 19, 172, 25, 154, 138, 74, 119, 106, 179, 179, 254, 128, 62, 48, 115, 201, 26, 49, 208, 113, 128, 127, 9, 38, 179, 204, 201, 158, 136, 9, 163, 95, 39, 125, 78, 206, 62, 86, 135, 51, 147, 85, 62, 121, 37, 39, 39, 208, 185, 100, 146, 30, 166, 56, 233, 187, 147, 241, 187, 20, 209, 173, 177, 32, 201, 65, 41, 71, 114, 15, 45, 192, 102, 174, 249, 22, 59, 229, 232, 245, 185, 133, 99, 176, 82, 4, 8, 86, 0, 130, 213, 235, 127, 9, 228, 241, 79, 77, 242, 194, 1, 126, 249, 18, 145, 95, 150, 248, 22, 191, 42, 237, 113, 184, 246, 191, 16, 4, 97, 199, 24, 230, 147, 225, 70, 204, 48, 15, 61, 160, 93, 190, 72, 44, 217, 177, 251, 84, 88, 162, 84, 248, 30, 237, 238, 182, 129, 226, 218, 139, 251, 145, 92, 65, 123, 28, 48, 228, 89, 58, 130, 8, 104, 172, 115, 172, 74, 49, 63, 15, 163, 162, 166, 38, 25, 9, 83, 171, 209, 124, 133, 95, 177, 236, 229, 64, 125, 91, 179, 136, 5, 220, 215, 212, 237, 27, 100, 113, 31, 158, 238, 115, 124, 152, 114, 27, 53, 86, 255, 181, 190, 57, 96, 6, 198, 250, 175, 58, 221, 131, 250, 146, 18, 211, 240, 184, 207, 179, 69, 164, 42, 120, 133, 18, 193, 151, 56, 101, 199, 20, 60, 201, 26, 242, 242, 14, 104, 87, 103, 255, 13, 77, 45, 166, 64, 133, 157, 35, 100, 110, 157, 94, 200, 15, 166, 206, 108, 110, 210, 27, 76, 191, 134, 107, 81, 58, 201, 215, 132, 77, 78, 60, 207, 235, 21, 102, 214, 161, 88, 230, 72, 98, 177, 4, 34, 201, 25, 139, 248, 48, 243, 86, 212, 115, 28, 182, 209, 194, 130, 1, 166, 146, 146, 18, 163, 189, 38, 189, 175, 175, 79, 21, 66, 105, 136, 250, 222, 47, 43, 171, 95, 160, 51, 26, 31, 64, 34, 41, 221, 121, 233, 57, 229, 59, 109, 82, 202, 26, 250, 252, 42, 15, 29, 59, 101, 94, 179, 78, 100, 249, 137, 64, 204, 232, 178, 136, 165, 134, 38, 207, 221, 193, 99, 99, 169, 171, 91, 106, 204, 181, 212, 10, 188, 250, 235, 66, 122, 234, 43, 90, 41, 238, 35, 223, 9, 26, 230, 37, 251, 7, 173, 199, 91, 49, 5, 111, 164, 15, 19, 125, 182, 120, 220, 205, 29, 3, 160, 41, 159, 193, 54, 106, 218, 172, 204, 211, 6, 75, 225, 21, 225, 20, 154, 249, 160, 81, 206, 196, 8, 81, 85, 176, 217, 11, 110, 174, 118, 144, 111, 98, 197, 149, 113, 60, 44, 132, 201, 185, 111, 194, 77, 100, 147, 66, 202, 64, 102, 182, 24, 106, 145, 35, 114, 36, 97, 107, 38, 146, 156, 241, 139, 250, 248, 113, 126, 46, 110, 28, 127, 11, 11, 153, 216, 112, 142, 210, 27, 12, 143, 98, 26, 28, 118, 56, 193, 248, 9, 165, 70, 6, 175, 251, 139, 46, 184, 232, 140, 46, 51, 29, 139, 167, 191, 111, 200, 181, 52, 5, 221, 211, 170, 73, 122, 46, 207, 241, 97, 26, 43, 106, 146, 245, 185, 185, 59, 117, 130, 240, 77, 97, 229, 138, 151, 89, 157, 101, 80, 58, 44, 235, 55, 97, 235, 179, 126, 235, 241, 150, 83, 195, 38, 217, 150, 46, 41, 98, 189, 123, 168, 226, 208, 177, 51, 230, 53, 107, 165, 250, 175, 166, 187, 176, 62, 239, 36, 30, 63, 97, 60, 8, 179, 210, 162, 139, 51, 67, 86, 248, 83, 145, 87, 53, 220, 141, 68, 171, 221, 35, 5, 237, 12, 196, 136, 36, 251, 37, 146, 124, 17, 180, 212, 21, 242, 196, 71, 151, 117, 78, 47, 236, 98, 18, 152, 37, 47, 166, 10, 109, 182, 21, 58, 173, 246, 89, 93, 118, 22, 54, 151, 62, 237, 244, 245, 50, 223, 94, 249, 254, 163, 167, 209, 77, 132, 154, 166, 222, 104, 188, 55, 183, 164, 68, 43, 31, 199, 20, 222, 99, 44, 155, 32, 120, 225, 135, 68, 103, 180, 20, 237, 210, 9, 252, 55, 249, 148, 197, 175, 98, 79, 81, 83, 110, 174, 136, 5, 18, 144, 48, 89, 197, 181, 150, 78, 150, 38, 130, 231, 195, 234, 191, 110, 217, 122, 70, 203, 114, 56, 87, 191, 98, 42, 40, 184, 112, 42, 22, 199, 132, 49, 174, 6, 21, 225, 200, 116, 81, 230, 25, 100, 243, 14, 75, 65, 10, 144, 100, 127, 172, 72, 82, 218, 223, 99, 138, 137, 147, 238, 47, 194, 152, 22, 111, 198, 178, 50, 131, 86, 157, 253, 182, 193, 108, 198, 194, 7, 31, 96, 27, 47, 29, 104, 151, 66, 102, 198, 91, 134, 162, 115, 218, 84, 77, 151, 213, 46, 208, 199, 52, 136, 160, 115, 55, 238, 96, 132, 169, 93, 157, 253, 109, 44, 207, 167, 101, 1, 59, 121, 1, 194, 188, 244, 0, 243, 97, 58, 61, 254, 1, 87, 91, 239, 16, 44, 2, 78, 225, 223, 48, 42, 88, 103, 50, 221, 64, 68, 57, 115, 87, 131, 132, 121, 58, 25, 1, 73, 222, 52, 25, 36, 137, 105, 37, 65, 218, 6, 129, 48, 166, 5, 156, 49, 55, 183, 74, 43, 240, 3, 88, 105, 136, 145, 136, 206, 112, 82, 46, 162, 192, 205, 172, 218, 168, 202, 8, 217, 145, 62, 204, 45, 91, 82, 13, 230, 188, 75, 117, 234, 213, 119, 10, 105, 203, 223, 68, 51, 178, 17, 53, 76, 215, 38, 113, 237, 165, 151, 15, 216, 154, 219, 79, 219, 154, 218, 62, 200, 115, 108, 248, 144, 53, 188, 55, 24, 158, 84, 4, 82, 210, 115, 67, 32, 76, 35, 228, 66, 235, 247, 74, 164, 22, 107, 77, 242, 139, 184, 127, 201, 12, 70, 11, 49, 194, 184, 136, 82, 103, 52, 214, 233, 13, 134, 23, 140, 57, 57, 187, 229, 191, 73, 100, 52, 83, 239, 169, 240, 62, 204, 82, 123, 186, 209, 156, 183, 95, 43, 104, 190, 199, 167, 166, 252, 91, 72, 9, 248, 48, 49, 125, 6, 139, 23, 96, 148, 174, 78, 111, 120, 213, 160, 86, 27, 137, 36, 9, 132, 233, 133, 178, 150, 231, 163, 146, 15, 49, 86, 62, 201, 1, 137, 36, 123, 149, 26, 43, 129, 48, 14, 178, 137, 83, 144, 34, 199, 77, 94, 33, 249, 73, 61, 15, 60, 254, 96, 159, 41, 118, 72, 49, 228, 89, 14, 232, 120, 245, 157, 154, 36, 238, 93, 126, 101, 234, 139, 58, 147, 169, 61, 59, 59, 123, 49, 17, 36, 129, 48, 67, 180, 72, 32, 176, 165, 88, 132, 124, 50, 114, 36, 97, 123, 64, 169, 17, 16, 8, 19, 89, 208, 205, 145, 197, 86, 188, 244, 60, 140, 32, 250, 188, 13, 27, 4, 179, 203, 181, 50, 212, 34, 150, 64, 32, 76, 3, 228, 149, 57, 182, 177, 2, 188, 31, 99, 146, 100, 57, 146, 176, 239, 245, 164, 73, 18, 98, 185, 168, 155, 75, 90, 178, 34, 66, 54, 46, 232, 185, 164, 72, 112, 2, 97, 186, 33, 19, 23, 104, 124, 213, 193, 69, 0, 98, 65, 146, 88, 187, 149, 114, 36, 9, 132, 232, 8, 147, 59, 91, 167, 155, 64, 32, 204, 4, 12, 7, 69, 232, 116, 187, 37, 45, 114, 40, 86, 213, 118, 164, 253, 97, 153, 187, 148, 57, 170, 5, 16, 8, 4, 2, 97, 62, 104, 146, 64, 102, 62, 69, 33, 129, 88, 146, 228, 227, 65, 43, 101, 2, 129, 64, 32, 16, 102, 5, 226, 20, 125, 36, 175, 143, 101, 142, 36, 166, 145, 72, 221, 63, 254, 155, 180, 72, 2, 129, 64, 32, 204, 70, 12, 215, 214, 196, 150, 71, 49, 238, 35, 121, 70, 218, 223, 231, 148, 26, 43, 129, 64, 32, 16, 8, 179, 5, 195, 218, 29, 144, 217, 239, 38, 131, 36, 65, 147, 108, 37, 146, 36, 16, 102, 55, 226, 72, 72, 34, 72, 120, 130, 169, 171, 147, 43, 105, 204, 74, 145, 131, 118, 176, 248, 56, 144, 218, 243, 146, 15, 241, 76, 44, 205, 173, 130, 193, 192, 250, 9, 2, 89, 46, 28, 245, 152, 2, 227, 25, 71, 207, 48, 9, 201, 204, 153, 251, 84, 129, 7, 179, 79, 197, 245, 145, 144, 132, 144, 208, 190, 180, 57, 21, 128, 2, 132, 198, 203, 57, 146, 49, 42, 73, 55, 28, 248, 163, 95, 189, 218, 60, 69, 26, 177, 138, 132, 132, 36, 102, 18, 207, 81, 160, 29, 97, 140, 154, 202, 136, 215, 85, 117, 158, 69, 165, 53, 53, 233, 88, 229, 223, 236, 170, 93, 57, 27, 197, 226, 114, 101, 214, 245, 245, 37, 234, 243, 242, 182, 198, 56, 71, 114, 16, 155, 120, 235, 244, 134, 55, 44, 85, 46, 99, 217, 166, 186, 20, 28, 171, 81, 143, 103, 75, 93, 234, 152, 175, 204, 200, 230, 190, 4, 2, 33, 150, 128, 39, 82, 179, 154, 227, 190, 170, 89, 192, 221, 174, 81, 113, 183, 169, 85, 220, 55, 72, 72, 152, 196, 115, 95, 215, 112, 220, 201, 12, 142, 219, 168, 208, 86, 152, 86, 185, 28, 254, 169, 57, 238, 65, 205, 162, 184, 55, 52, 11, 185, 23, 64, 94, 154, 157, 18, 247, 146, 38, 129, 251, 167, 144, 149, 241, 6, 16, 26, 144, 155, 118, 40, 54, 254, 72, 216, 15, 236, 79, 187, 58, 251, 12, 236, 255, 69, 246, 61, 163, 31, 207, 243, 154, 68, 238, 221, 108, 142, 59, 140, 99, 92, 198, 113, 163, 23, 30, 16, 69, 182, 96, 129, 107, 209, 162, 85, 103, 127, 159, 207, 76, 191, 21, 206, 229, 27, 36, 36, 36, 227, 19, 109, 230, 170, 219, 132, 172, 172, 59, 225, 153, 186, 138, 61, 99, 197, 219, 118, 93, 108, 63, 222, 34, 90, 175, 104, 98, 82, 77, 66, 34, 203, 145, 6, 209, 209, 232, 21, 75, 119, 238, 249, 26, 11, 60, 169, 171, 75, 148, 211, 37, 214, 29, 60, 152, 89, 180, 245, 162, 211, 165, 181, 59, 196, 226, 11, 182, 137, 197, 91, 183, 207, 78, 185, 96, 187, 88, 82, 123, 177, 152, 87, 101, 67, 66, 27, 10, 16, 101, 12, 72, 210, 192, 8, 114, 200, 92, 86, 46, 150, 92, 184, 131, 125, 79, 164, 227, 40, 217, 122, 145, 88, 84, 179, 77, 44, 219, 113, 137, 184, 166, 110, 239, 173, 140, 36, 203, 234, 35, 146, 100, 93, 192, 127, 201, 57, 91, 219, 170, 10, 207, 171, 17, 205, 150, 2, 49, 119, 205, 90, 49, 183, 180, 140, 132, 132, 100, 156, 146, 83, 178, 70, 204, 41, 46, 21, 45, 206, 13, 98, 197, 209, 19, 101, 220, 122, 223, 149, 101, 46, 223, 149, 127, 119, 181, 95, 249, 87, 167, 183, 231, 105, 167, 199, 255, 79, 167, 167, 251, 101, 7, 8, 123, 237, 245, 63, 231, 244, 245, 60, 235, 192, 45, 201, 188, 16, 197, 181, 126, 6, 228, 13, 151, 183, 183, 145, 77, 218, 245, 245, 11, 228, 137, 185, 198, 221, 151, 12, 127, 251, 21, 220, 35, 175, 193, 253, 242, 12, 124, 230, 249, 80, 226, 12, 243, 179, 51, 194, 235, 80, 239, 11, 245, 158, 112, 251, 119, 70, 248, 121, 196, 103, 60, 1, 113, 181, 93, 249, 108, 113, 237, 197, 239, 240, 203, 146, 68, 189, 201, 60, 113, 77, 82, 171, 101, 251, 225, 151, 37, 138, 37, 219, 235, 222, 134, 103, 235, 89, 120, 158, 158, 15, 55, 70, 120, 12, 236, 56, 97, 28, 97, 251, 38, 60, 135, 215, 225, 24, 187, 250, 250, 34, 214, 173, 148, 255, 110, 247, 116, 110, 183, 187, 219, 223, 178, 54, 120, 255, 97, 107, 244, 62, 103, 149, 196, 54, 137, 50, 217, 251, 31, 235, 177, 88, 35, 28, 151, 53, 134, 231, 101, 157, 194, 49, 176, 198, 120, 220, 173, 147, 48, 30, 19, 217, 135, 117, 154, 238, 167, 192, 253, 226, 123, 214, 214, 224, 121, 193, 122, 194, 243, 50, 200, 75, 182, 70, 223, 63, 108, 205, 237, 127, 116, 180, 118, 62, 102, 111, 106, 123, 186, 234, 104, 227, 64, 245, 241, 150, 247, 93, 222, 158, 74, 246, 176, 21, 56, 54, 107, 138, 107, 107, 45, 181, 125, 183, 44, 86, 62, 132, 48, 41, 46, 6, 237, 33, 181, 172, 118, 207, 202, 194, 189, 123, 87, 88, 15, 31, 94, 230, 106, 104, 88, 138, 130, 175, 231, 138, 200, 231, 68, 50, 82, 112, 108, 138, 246, 239, 95, 18, 97, 158, 86, 85, 184, 221, 201, 179, 247, 126, 232, 96, 226, 186, 255, 254, 4, 208, 252, 238, 147, 210, 63, 78, 197, 68, 147, 212, 235, 207, 24, 12, 122, 209, 80, 88, 82, 143, 3, 85, 114, 240, 224, 114, 229, 119, 70, 146, 241, 248, 138, 129, 48, 23, 214, 244, 221, 144, 236, 234, 187, 113, 233, 182, 235, 174, 91, 70, 66, 66, 50, 82, 172, 32, 248, 124, 108, 234, 252, 100, 138, 171, 222, 183, 18, 127, 39, 63, 68, 91, 63, 241, 137, 21, 249, 27, 54, 215, 24, 114, 243, 63, 167, 21, 132, 63, 233, 120, 141, 200, 167, 38, 159, 28, 126, 202, 212, 28, 247, 37, 144, 247, 179, 57, 238, 127, 65, 174, 215, 112, 220, 30, 117, 122, 178, 145, 60, 182, 132, 128, 217, 47, 80, 161, 223, 197, 113, 9, 146, 185, 53, 65, 202, 249, 155, 51, 1, 35, 160, 253, 61, 38, 145, 228, 233, 88, 4, 237, 200, 221, 63, 212, 105, 201, 229, 227, 56, 28, 41, 226, 60, 186, 40, 60, 89, 187, 39, 16, 8, 99, 3, 207, 113, 249, 171, 57, 238, 74, 224, 189, 135, 249, 21, 75, 251, 115, 214, 86, 136, 37, 219, 118, 138, 214, 99, 205, 98, 229, 225, 99, 63, 26, 126, 99, 249, 193, 99, 247, 216, 79, 120, 196, 53, 59, 118, 139, 5, 174, 141, 162, 49, 47, 95, 20, 210, 82, 78, 105, 18, 185, 63, 242, 201, 11, 111, 21, 52, 154, 195, 230, 178, 178, 220, 80, 62, 17, 244, 83, 25, 107, 106, 146, 152, 191, 170, 175, 47, 1, 127, 215, 215, 215, 199, 30, 220, 217, 32, 125, 20, 25, 56, 239, 129, 247, 46, 104, 126, 175, 5, 114, 36, 99, 146, 254, 209, 207, 246, 165, 215, 191, 149, 91, 94, 158, 70, 35, 28, 91, 200, 243, 204, 120, 69, 14, 118, 34, 204, 160, 133, 120, 125, 253, 130, 88, 241, 6, 238, 7, 5, 247, 41, 115, 147, 242, 154, 231, 217, 237, 89, 192, 105, 141, 154, 133, 113, 191, 230, 211, 83, 7, 242, 42, 171, 197, 181, 187, 47, 19, 237, 77, 62, 209, 213, 118, 165, 232, 244, 249, 223, 112, 122, 123, 30, 118, 249, 122, 125, 195, 7, 8, 191, 240, 130, 60, 14, 242, 146, 211, 211, 45, 58, 90, 187, 196, 234, 122, 183, 88, 86, 183, 79, 180, 0, 105, 26, 114, 114, 69, 62, 101, 225, 123, 160, 97, 62, 162, 94, 192, 221, 32, 172, 74, 219, 97, 46, 46, 94, 29, 202, 244, 99, 225, 184, 68, 41, 42, 111, 86, 144, 15, 168, 203, 73, 58, 158, 223, 165, 51, 26, 143, 106, 13, 134, 203, 245, 38, 211, 33, 189, 158, 100, 132, 152, 34, 200, 108, 62, 47, 163, 241, 48, 200, 62, 173, 86, 219, 161, 168, 215, 26, 139, 244, 143, 211, 146, 86, 250, 152, 177, 172, 218, 96, 46, 171, 202, 53, 86, 84, 228, 155, 214, 84, 230, 69, 37, 149, 227, 148, 53, 115, 83, 112, 252, 228, 49, 44, 42, 42, 90, 50, 225, 103, 30, 38, 78, 220, 223, 92, 29, 175, 217, 116, 93, 243, 214, 86, 23, 88, 170, 170, 82, 149, 174, 131, 24, 32, 30, 121, 104, 132, 66, 119, 242, 100, 188, 46, 123, 213, 102, 22, 177, 191, 40, 238, 53, 99, 190, 133, 5, 236, 89, 143, 181, 136, 46, 95, 143, 8, 220, 247, 47, 167, 199, 127, 135, 163, 165, 115, 175, 189, 190, 53, 43, 252, 10, 173, 161, 61, 211, 225, 110, 223, 12, 68, 121, 21, 124, 232, 71, 192, 168, 47, 194, 7, 69, 36, 78, 70, 154, 59, 247, 136, 249, 54, 151, 168, 135, 9, 128, 95, 146, 240, 166, 154, 227, 126, 174, 94, 200, 93, 13, 147, 140, 11, 243, 192, 206, 89, 161, 91, 44, 137, 51, 216, 44, 23, 47, 171, 219, 186, 172, 85, 162, 118, 197, 82, 81, 155, 150, 2, 146, 44, 109, 73, 230, 133, 192, 117, 215, 169, 179, 81, 235, 19, 99, 212, 249, 131, 237, 135, 105, 146, 106, 245, 223, 213, 113, 220, 171, 240, 156, 244, 107, 226, 184, 15, 65, 78, 145, 140, 79, 96, 12, 223, 225, 65, 7, 132, 237, 245, 146, 25, 107, 204, 38, 102, 185, 44, 32, 172, 238, 61, 188, 138, 237, 235, 61, 216, 247, 105, 26, 223, 105, 186, 166, 113, 28, 42, 94, 162, 102, 33, 247, 96, 172, 220, 66, 193, 165, 31, 205, 133, 101, 185, 154, 197, 170, 43, 53, 42, 238, 79, 160, 12, 137, 5, 235, 207, 19, 43, 47, 175, 23, 93, 94, 224, 53, 175, 255, 148, 195, 235, 255, 95, 32, 198, 99, 231, 16, 35, 104, 158, 35, 172, 140, 82, 148, 92, 92, 8, 21, 120, 165, 189, 185, 99, 35, 35, 77, 95, 207, 79, 128, 56, 95, 3, 17, 97, 167, 98, 213, 225, 19, 98, 233, 182, 157, 98, 110, 121, 165, 168, 93, 157, 37, 194, 9, 63, 139, 57, 117, 154, 149, 43, 142, 27, 45, 165, 249, 33, 206, 33, 193, 21, 232, 50, 173, 226, 102, 64, 21, 3, 57, 50, 208, 230, 110, 255, 130, 179, 165, 67, 172, 132, 243, 169, 190, 194, 77, 105, 31, 243, 72, 170, 142, 54, 138, 214, 227, 45, 98, 233, 69, 117, 34, 159, 182, 124, 16, 180, 202, 152, 165, 127, 240, 43, 151, 15, 174, 185, 248, 18, 177, 242, 224, 49, 113, 237, 37, 251, 197, 117, 123, 46, 39, 153, 136, 92, 122, 128, 9, 94, 51, 71, 71, 111, 30, 62, 187, 99, 115, 149, 156, 53, 183, 85, 28, 58, 254, 68, 229, 254, 163, 116, 93, 166, 245, 122, 226, 246, 32, 179, 86, 218, 79, 180, 138, 246, 230, 206, 79, 203, 102, 215, 177, 250, 239, 165, 70, 230, 113, 10, 75, 65, 178, 144, 149, 181, 15, 22, 65, 255, 205, 167, 44, 254, 48, 119, 109, 69, 224, 123, 220, 237, 162, 171, 173, 23, 181, 198, 39, 156, 173, 254, 107, 170, 234, 61, 133, 193, 156, 80, 86, 127, 203, 130, 72, 197, 57, 226, 240, 77, 53, 110, 119, 18, 86, 32, 9, 69, 100, 235, 14, 54, 100, 218, 221, 157, 91, 65, 195, 252, 20, 144, 230, 131, 240, 101, 239, 2, 27, 139, 246, 70, 159, 88, 126, 217, 97, 177, 104, 243, 5, 162, 201, 82, 32, 242, 203, 23, 125, 0, 7, 248, 176, 102, 73, 194, 103, 116, 26, 205, 102, 99, 69, 77, 114, 24, 77, 46, 129, 155, 166, 210, 63, 114, 176, 3, 44, 2, 142, 195, 57, 252, 220, 233, 235, 253, 62, 156, 207, 189, 112, 94, 247, 140, 216, 6, 75, 184, 223, 71, 251, 190, 224, 223, 43, 127, 14, 126, 61, 159, 37, 154, 49, 30, 109, 92, 67, 237, 71, 113, 125, 29, 30, 255, 15, 215, 119, 246, 221, 85, 122, 209, 238, 191, 11, 160, 85, 234, 140, 198, 65, 157, 78, 59, 65, 146, 212, 179, 92, 75, 33, 115, 149, 184, 118, 207, 193, 135, 54, 116, 246, 221, 225, 244, 248, 239, 113, 121, 123, 126, 64, 50, 126, 129, 57, 231, 251, 236, 218, 121, 252, 223, 173, 242, 120, 86, 203, 171, 253, 241, 60, 251, 176, 159, 143, 184, 124, 61, 247, 193, 125, 240, 189, 121, 49, 118, 94, 255, 221, 51, 244, 154, 222, 13, 243, 238, 93, 112, 61, 126, 106, 111, 237, 58, 24, 152, 151, 79, 142, 102, 33, 136, 83, 112, 199, 8, 50, 211, 106, 77, 21, 160, 53, 126, 78, 173, 226, 158, 53, 152, 76, 98, 113, 205, 54, 182, 24, 150, 204, 169, 255, 134, 113, 248, 134, 189, 169, 115, 75, 176, 41, 22, 57, 111, 180, 116, 171, 208, 0, 54, 13, 48, 107, 253, 130, 112, 59, 176, 157, 240, 232, 65, 171, 60, 0, 7, 241, 53, 56, 136, 39, 29, 158, 238, 65, 217, 52, 187, 230, 226, 75, 89, 130, 182, 78, 163, 22, 53, 137, 220, 11, 154, 120, 238, 164, 144, 186, 236, 136, 177, 160, 192, 16, 74, 203, 196, 66, 211, 114, 162, 250, 20, 130, 28, 248, 4, 142, 95, 177, 236, 11, 70, 120, 168, 98, 20, 217, 58, 16, 136, 108, 53, 244, 167, 51, 151, 55, 97, 50, 158, 91, 173, 203, 181, 80, 118, 231, 68, 43, 56, 199, 68, 85, 197, 136, 48, 61, 136, 188, 232, 81, 73, 166, 212, 17, 215, 207, 92, 92, 181, 154, 95, 190, 212, 173, 142, 231, 30, 16, 86, 173, 28, 202, 183, 58, 196, 242, 125, 135, 152, 181, 19, 22, 193, 131, 64, 196, 15, 216, 91, 186, 154, 214, 53, 52, 100, 158, 171, 53, 214, 47, 136, 109, 73, 71, 201, 70, 139, 76, 31, 138, 52, 45, 150, 186, 68, 171, 219, 91, 233, 108, 237, 234, 102, 166, 89, 95, 207, 235, 32, 162, 3, 84, 220, 138, 253, 71, 68, 172, 8, 98, 202, 183, 128, 150, 185, 248, 61, 88, 6, 254, 90, 189, 144, 187, 74, 48, 26, 171, 144, 197, 67, 17, 38, 55, 69, 13, 106, 229, 72, 40, 78, 218, 78, 183, 112, 82, 132, 215, 124, 127, 94, 216, 24, 140, 113, 204, 48, 138, 13, 111, 252, 209, 68, 126, 31, 78, 180, 248, 93, 58, 131, 225, 254, 24, 182, 200, 234, 151, 58, 137, 60, 163, 45, 41, 89, 142, 251, 87, 87, 85, 45, 146, 211, 104, 102, 154, 224, 115, 27, 227, 98, 248, 132, 153, 22, 13, 140, 202, 199, 12, 110, 160, 48, 252, 28, 135, 137, 29, 145, 59, 245, 200, 192, 154, 209, 186, 236, 236, 90, 13, 199, 125, 135, 95, 154, 240, 150, 169, 176, 88, 44, 221, 190, 75, 180, 53, 120, 152, 57, 213, 133, 197, 111, 60, 221, 215, 219, 26, 219, 42, 70, 206, 41, 39, 227, 153, 166, 26, 248, 174, 169, 81, 144, 2, 97, 182, 183, 44, 8, 101, 71, 174, 56, 234, 86, 59, 91, 186, 234, 64, 195, 252, 34, 144, 229, 95, 224, 160, 3, 1, 64, 71, 155, 216, 9, 229, 174, 171, 96, 38, 41, 56, 209, 63, 131, 150, 121, 163, 142, 231, 107, 75, 92, 23, 45, 15, 30, 32, 87, 8, 181, 122, 174, 175, 146, 241, 63, 67, 117, 245, 42, 99, 97, 105, 149, 185, 184, 184, 220, 84, 84, 84, 49, 31, 4, 207, 213, 80, 80, 82, 109, 172, 168, 80, 143, 81, 211, 159, 208, 13, 15, 132, 246, 87, 137, 216, 6, 98, 65, 146, 72, 184, 176, 191, 239, 205, 145, 21, 252, 152, 160, 205, 207, 175, 48, 228, 229, 93, 2, 178, 67, 159, 107, 217, 73, 50, 29, 146, 123, 49, 110, 117, 57, 150, 93, 160, 144, 200, 41, 72, 170, 89, 54, 7, 38, 72, 50, 12, 67, 110, 110, 25, 191, 72, 117, 29, 76, 14, 79, 98, 243, 128, 194, 77, 231, 139, 149, 135, 142, 139, 46, 47, 154, 83, 253, 31, 160, 251, 196, 230, 110, 223, 83, 86, 55, 34, 136, 52, 206, 130, 238, 195, 25, 177, 128, 131, 131, 192, 131, 145, 252, 153, 35, 128, 43, 1, 100, 117, 135, 215, 223, 3, 76, 255, 11, 56, 161, 119, 209, 78, 140, 204, 143, 206, 115, 139, 221, 37, 234, 4, 94, 4, 149, 249, 121, 205, 2, 238, 91, 66, 214, 170, 125, 186, 138, 138, 140, 8, 3, 167, 154, 179, 4, 41, 93, 204, 108, 142, 251, 162, 118, 89, 162, 200, 47, 142, 63, 165, 89, 146, 48, 52, 47, 100, 113, 66, 191, 0, 231, 12, 15, 193, 125, 242, 61, 21, 5, 1, 202, 247, 66, 130, 102, 145, 234, 179, 218, 204, 140, 123, 248, 140, 149, 223, 17, 86, 165, 223, 17, 81, 50, 211, 239, 132, 247, 125, 87, 155, 157, 121, 183, 162, 202, 206, 80, 172, 34, 91, 181, 171, 179, 255, 38, 172, 74, 187, 29, 191, 103, 212, 99, 153, 106, 201, 76, 191, 131, 141, 81, 118, 198, 189, 124, 34, 119, 93, 12, 22, 27, 241, 1, 107, 146, 37, 81, 147, 178, 232, 73, 109, 114, 146, 136, 37, 249, 176, 204, 95, 96, 59, 151, 36, 105, 6, 239, 87, 218, 7, 142, 255, 210, 5, 162, 46, 101, 161, 168, 51, 153, 62, 170, 184, 70, 113, 51, 152, 20, 149, 49, 42, 103, 185, 163, 168, 72, 205, 167, 47, 119, 107, 226, 184, 95, 243, 105, 41, 253, 121, 149, 86, 22, 192, 133, 22, 74, 12, 34, 5, 5, 236, 255, 57, 90, 187, 122, 108, 141, 222, 17, 237, 232, 152, 197, 40, 76, 108, 205, 204, 128, 148, 200, 41, 39, 136, 6, 255, 185, 242, 120, 171, 22, 78, 236, 48, 230, 165, 176, 52, 19, 175, 95, 116, 52, 119, 136, 229, 151, 29, 17, 11, 55, 110, 17, 13, 38, 179, 168, 89, 20, 247, 58, 104, 152, 247, 240, 169, 203, 174, 208, 149, 150, 10, 231, 154, 119, 185, 196, 224, 168, 166, 89, 15, 105, 172, 92, 125, 247, 39, 172, 221, 115, 232, 142, 210, 29, 151, 136, 32, 111, 151, 238, 216, 253, 254, 124, 144, 146, 29, 151, 188, 11, 91, 88, 56, 29, 248, 105, 205, 13, 55, 36, 201, 214, 138, 72, 67, 38, 221, 3, 92, 249, 158, 67, 27, 242, 109, 78, 209, 92, 84, 44, 154, 177, 64, 113, 52, 82, 90, 198, 222, 31, 67, 130, 148, 107, 183, 14, 26, 45, 133, 108, 255, 57, 209, 30, 203, 84, 11, 158, 123, 65, 145, 104, 113, 172, 23, 173, 39, 90, 143, 78, 132, 36, 135, 221, 3, 160, 145, 150, 95, 94, 255, 148, 181, 190, 153, 173, 240, 49, 2, 158, 100, 250, 4, 35, 171, 215, 183, 245, 138, 246, 150, 174, 79, 201, 230, 198, 25, 54, 227, 201, 126, 198, 17, 26, 35, 70, 167, 242, 233, 233, 187, 64, 105, 186, 139, 95, 146, 240, 150, 9, 238, 83, 204, 164, 176, 30, 111, 13, 4, 225, 248, 122, 94, 6, 133, 235, 43, 214, 230, 142, 245, 231, 204, 7, 17, 98, 104, 102, 188, 118, 132, 15, 82, 168, 84, 147, 170, 35, 71, 82, 237, 205, 109, 219, 65, 85, 190, 25, 6, 224, 175, 44, 47, 179, 181, 11, 30, 178, 99, 98, 209, 249, 181, 129, 104, 217, 228, 164, 119, 80, 187, 208, 36, 47, 110, 52, 172, 89, 19, 28, 12, 161, 154, 74, 31, 230, 164, 251, 225, 0, 213, 205, 109, 5, 176, 136, 24, 194, 234, 15, 112, 51, 12, 178, 21, 211, 188, 16, 255, 144, 203, 215, 43, 162, 105, 222, 218, 212, 177, 150, 45, 134, 66, 88, 38, 130, 253, 12, 184, 197, 213, 228, 250, 246, 43, 69, 107, 163, 239, 52, 172, 42, 135, 2, 226, 83, 136, 119, 196, 214, 218, 224, 25, 178, 55, 119, 12, 193, 194, 108, 64, 200, 72, 31, 210, 25, 12, 177, 168, 215, 42, 106, 5, 126, 72, 15, 139, 188, 170, 163, 77, 162, 205, 221, 14, 223, 227, 13, 250, 126, 95, 152, 159, 67, 73, 52, 239, 137, 244, 57, 239, 104, 251, 237, 71, 83, 149, 189, 165, 243, 185, 97, 115, 212, 120, 76, 175, 138, 207, 56, 219, 122, 187, 157, 109, 61, 247, 184, 218, 122, 191, 13, 175, 191, 59, 82, 122, 78, 6, 68, 126, 173, 220, 6, 255, 93, 249, 115, 184, 207, 5, 255, 45, 220, 231, 70, 251, 124, 164, 239, 14, 222, 111, 168, 243, 8, 245, 217, 112, 239, 15, 247, 221, 145, 246, 27, 105, 255, 17, 198, 192, 215, 251, 45, 71, 107, 247, 125, 14, 119, 199, 190, 104, 22, 156, 83, 133, 80, 249, 140, 174, 131, 7, 23, 234, 121, 126, 147, 70, 197, 125, 1, 3, 61, 13, 70, 163, 88, 120, 222, 5, 140, 236, 101, 115, 42, 204, 17, 63, 134, 103, 234, 112, 249, 129, 198, 180, 224, 32, 156, 57, 87, 73, 9, 47, 150, 165, 174, 47, 49, 152, 241, 49, 144, 194, 238, 110, 119, 58, 60, 61, 159, 128, 11, 252, 123, 22, 157, 4, 164, 89, 117, 164, 129, 181, 18, 50, 23, 22, 139, 154, 228, 164, 119, 129, 48, 127, 44, 164, 173, 104, 50, 175, 91, 167, 15, 14, 250, 145, 100, 214, 15, 150, 181, 209, 99, 177, 158, 240, 216, 173, 39, 188, 149, 85, 13, 205, 213, 179, 65, 170, 27, 91, 171, 38, 242, 153, 234, 99, 173, 85, 182, 6, 159, 205, 209, 52, 50, 127, 41, 26, 127, 36, 22, 89, 119, 182, 118, 87, 109, 240, 246, 84, 59, 219, 174, 172, 114, 192, 54, 156, 224, 223, 241, 62, 219, 122, 221, 141, 121, 5, 27, 183, 124, 70, 175, 21, 98, 229, 143, 100, 141, 150, 129, 36, 159, 198, 99, 113, 117, 244, 85, 218, 91, 187, 173, 163, 29, 207, 116, 9, 30, 151, 211, 211, 109, 183, 181, 116, 242, 49, 240, 237, 82, 164, 248, 44, 136, 117, 152, 78, 115, 170, 108, 245, 9, 242, 51, 86, 107, 146, 184, 79, 195, 156, 254, 23, 204, 132, 192, 246, 84, 152, 78, 136, 209, 169, 146, 57, 245, 49, 120, 221, 91, 113, 204, 157, 63, 23, 52, 198, 113, 107, 79, 24, 225, 26, 34, 248, 71, 101, 59, 225, 43, 3, 173, 162, 215, 225, 243, 63, 4, 219, 51, 140, 48, 143, 54, 50, 194, 52, 21, 20, 138, 252, 210, 132, 183, 213, 113, 220, 255, 8, 25, 43, 143, 90, 214, 173, 203, 12, 225, 39, 73, 152, 11, 26, 38, 97, 242, 38, 0, 117, 34, 119, 181, 49, 80, 68, 160, 63, 54, 65, 59, 70, 208, 38, 133, 219, 231, 235, 133, 192, 137, 171, 111, 134, 68, 138, 207, 102, 137, 85, 13, 211, 112, 217, 8, 211, 229, 99, 100, 196, 104, 48, 148, 105, 146, 23, 126, 20, 136, 241, 49, 97, 85, 218, 16, 166, 10, 98, 108, 138, 189, 169, 77, 54, 167, 62, 13, 154, 227, 13, 184, 96, 14, 122, 182, 227, 88, 30, 255, 204, 51, 27, 79, 37, 97, 158, 140, 103, 61, 11, 79, 158, 59, 8, 104, 130, 180, 99, 122, 137, 183, 231, 55, 14, 175, 255, 52, 250, 49, 81, 195, 196, 132, 81, 44, 200, 174, 89, 172, 250, 183, 58, 129, 187, 131, 79, 79, 221, 133, 54, 237, 17, 254, 75, 110, 216, 127, 57, 217, 96, 225, 202, 99, 205, 223, 10, 149, 207, 85, 180, 121, 255, 18, 75, 93, 221, 210, 153, 46, 216, 74, 11, 183, 101, 181, 181, 139, 163, 73, 191, 8, 153, 146, 209, 215, 151, 136, 150, 5, 38, 210, 107, 69, 208, 78, 84, 34, 47, 182, 216, 231, 163, 144, 178, 218, 122, 214, 22, 78, 111, 50, 221, 41, 69, 163, 198, 130, 36, 207, 224, 190, 180, 6, 67, 51, 187, 239, 112, 92, 228, 243, 139, 165, 192, 248, 4, 198, 238, 150, 152, 72, 85, 93, 221, 162, 88, 220, 183, 242, 189, 139, 22, 33, 172, 143, 74, 50, 70, 49, 214, 176, 177, 59, 27, 107, 33, 198, 141, 229, 25, 136, 32, 83, 179, 64, 114, 185, 228, 244, 189, 115, 72, 25, 126, 191, 134, 95, 156, 112, 181, 38, 142, 123, 4, 230, 232, 254, 220, 117, 149, 98, 217, 174, 61, 162, 173, 193, 171, 240, 51, 118, 127, 211, 233, 238, 172, 197, 251, 49, 120, 225, 21, 251, 156, 198, 185, 160, 25, 140, 244, 99, 142, 128, 253, 68, 91, 17, 250, 160, 88, 213, 31, 79, 247, 0, 106, 152, 232, 195, 196, 92, 76, 180, 101, 179, 226, 5, 42, 238, 38, 173, 86, 235, 12, 178, 195, 199, 75, 182, 240, 184, 73, 90, 61, 17, 198, 183, 226, 196, 173, 106, 10, 69, 110, 67, 197, 193, 61, 242, 27, 41, 71, 114, 32, 102, 145, 173, 90, 45, 203, 207, 146, 18, 215, 99, 125, 110, 202, 49, 35, 144, 117, 100, 186, 53, 155, 248, 80, 196, 136, 11, 86, 120, 174, 172, 48, 23, 95, 11, 26, 227, 239, 65, 99, 28, 196, 180, 63, 44, 50, 99, 59, 209, 170, 168, 130, 211, 243, 61, 91, 115, 199, 126, 44, 129, 26, 76, 140, 114, 174, 52, 221, 10, 99, 48, 203, 134, 10, 233, 181, 30, 243, 172, 5, 173, 242, 26, 12, 5, 150, 235, 202, 150, 239, 59, 204, 162, 246, 180, 217, 89, 152, 135, 249, 40, 159, 178, 164, 43, 216, 127, 41, 173, 214, 84, 177, 188, 161, 141, 198, 210, 116, 67, 78, 206, 122, 173, 209, 232, 156, 47, 162, 51, 153, 28, 122, 179, 121, 163, 62, 47, 207, 52, 198, 135, 123, 70, 76, 2, 64, 108, 255, 144, 114, 36, 39, 218, 253, 99, 64, 106, 143, 245, 204, 20, 30, 190, 42, 22, 247, 45, 92, 199, 74, 169, 171, 203, 94, 157, 209, 120, 25, 118, 70, 81, 110, 131, 95, 71, 35, 209, 188, 63, 210, 254, 195, 125, 62, 212, 239, 241, 119, 161, 142, 121, 60, 223, 173, 220, 215, 104, 251, 139, 244, 189, 161, 126, 14, 126, 175, 114, 203, 4, 198, 223, 96, 50, 29, 52, 24, 44, 198, 25, 74, 148, 113, 65, 254, 197, 17, 199, 135, 121, 238, 122, 65, 216, 170, 89, 192, 125, 30, 243, 223, 181, 89, 25, 34, 182, 161, 194, 198, 24, 1, 98, 236, 69, 141, 241, 45, 44, 11, 233, 104, 233, 56, 130, 185, 244, 193, 126, 70, 201, 237, 70, 11, 192, 137, 94, 40, 52, 55, 133, 200, 199, 140, 183, 186, 219, 237, 104, 203, 134, 139, 240, 12, 94, 16, 91, 163, 151, 93, 32, 12, 119, 231, 151, 196, 191, 163, 73, 224, 190, 167, 227, 179, 107, 131, 162, 160, 84, 220, 4, 115, 47, 101, 83, 174, 54, 43, 243, 102, 163, 192, 139, 122, 141, 90, 212, 243, 243, 67, 208, 217, 142, 231, 172, 85, 171, 159, 82, 152, 180, 227, 163, 153, 220, 241, 253, 218, 213, 89, 183, 192, 195, 244, 11, 24, 187, 251, 96, 251, 147, 41, 144, 31, 11, 89, 25, 63, 21, 50, 87, 253, 8, 190, 251, 126, 69, 149, 157, 161, 9, 7, 237, 160, 22, 201, 107, 222, 96, 251, 150, 190, 43, 182, 199, 158, 121, 159, 144, 157, 249, 115, 33, 99, 213, 183, 96, 248, 150, 200, 43, 249, 9, 147, 228, 234, 236, 63, 24, 181, 2, 92, 79, 141, 104, 32, 153, 114, 145, 199, 29, 231, 13, 19, 92, 7, 184, 198, 55, 48, 109, 42, 132, 217, 114, 138, 9, 81, 158, 27, 195, 198, 118, 96, 153, 81, 126, 101, 234, 21, 234, 120, 238, 14, 144, 23, 176, 211, 6, 230, 189, 163, 143, 113, 216, 148, 138, 26, 163, 207, 127, 55, 166, 253, 173, 59, 212, 160, 81, 126, 30, 45, 125, 243, 222, 207, 56, 217, 218, 101, 168, 40, 39, 244, 143, 57, 220, 29, 23, 59, 188, 254, 59, 225, 2, 189, 137, 33, 196, 232, 191, 196, 144, 98, 157, 32, 136, 64, 150, 127, 230, 151, 37, 118, 97, 221, 191, 17, 228, 59, 94, 83, 172, 52, 81, 89, 108, 46, 91, 78, 133, 245, 211, 57, 229, 213, 31, 51, 151, 87, 95, 203, 164, 82, 218, 42, 95, 87, 42, 36, 248, 231, 224, 191, 149, 71, 248, 76, 180, 159, 29, 237, 125, 209, 254, 28, 226, 156, 114, 42, 170, 174, 201, 45, 175, 254, 15, 243, 218, 138, 75, 199, 160, 37, 202, 11, 146, 68, 67, 94, 193, 95, 205, 176, 136, 49, 21, 149, 76, 173, 20, 151, 138, 88, 206, 42, 102, 57, 146, 1, 130, 28, 48, 228, 230, 157, 49, 149, 172, 153, 220, 227, 46, 46, 125, 175, 184, 118, 167, 37, 202, 5, 201, 168, 215, 193, 226, 218, 100, 203, 179, 185, 26, 243, 172, 174, 35, 185, 118, 231, 21, 36, 211, 35, 56, 254, 121, 182, 245, 13, 121, 142, 243, 76, 18, 131, 168, 166, 152, 20, 227, 21, 237, 13, 67, 18, 180, 217, 229, 90, 169, 203, 206, 222, 204, 39, 169, 174, 83, 199, 113, 15, 105, 82, 22, 190, 135, 49, 33, 56, 183, 98, 249, 209, 64, 146, 191, 95, 148, 242, 223, 79, 218, 91, 58, 47, 11, 213, 159, 113, 88, 107, 164, 6, 216, 211, 239, 195, 180, 213, 183, 240, 246, 150, 174, 118, 80, 243, 31, 97, 230, 216, 230, 14, 214, 54, 133, 105, 151, 203, 18, 223, 130, 213, 207, 151, 245, 102, 243, 186, 16, 100, 25, 157, 22, 41, 69, 229, 178, 98, 239, 173, 93, 175, 97, 143, 50, 144, 183, 224, 251, 222, 97, 93, 82, 112, 43, 75, 240, 207, 193, 194, 186, 170, 72, 239, 9, 245, 89, 229, 223, 195, 125, 118, 180, 191, 135, 58, 150, 224, 239, 12, 181, 159, 240, 199, 243, 38, 156, 239, 25, 144, 167, 173, 77, 29, 217, 129, 53, 67, 228, 85, 161, 124, 141, 170, 219, 250, 86, 217, 155, 59, 223, 216, 208, 113, 53, 91, 113, 178, 186, 139, 83, 33, 240, 16, 111, 232, 234, 19, 43, 46, 175, 23, 133, 140, 149, 131, 186, 128, 153, 116, 2, 4, 105, 96, 5, 4, 64, 88, 21, 169, 245, 29, 87, 77, 222, 249, 160, 201, 10, 142, 31, 183, 152, 95, 172, 188, 7, 199, 100, 253, 144, 62, 227, 108, 109, 171, 130, 251, 118, 192, 193, 202, 122, 117, 7, 68, 126, 141, 219, 64, 185, 175, 179, 175, 67, 253, 28, 74, 60, 163, 252, 237, 156, 125, 118, 143, 190, 207, 112, 251, 101, 199, 61, 134, 253, 68, 60, 182, 238, 200, 231, 30, 238, 189, 242, 49, 120, 198, 113, 254, 30, 204, 1, 244, 127, 232, 244, 116, 191, 7, 251, 25, 2, 98, 121, 106, 115, 91, 155, 212, 92, 90, 156, 172, 248, 9, 102, 50, 149, 3, 182, 194, 89, 210, 138, 170, 55, 175, 18, 4, 97, 131, 102, 161, 170, 135, 229, 170, 39, 113, 175, 160, 182, 136, 17, 169, 107, 118, 92, 194, 186, 108, 96, 185, 81, 71, 107, 247, 80, 160, 252, 168, 255, 22, 120, 166, 183, 219, 78, 156, 88, 17, 172, 49, 202, 145, 207, 68, 140, 51, 132, 52, 67, 105, 152, 214, 6, 239, 122, 135, 167, 231, 107, 176, 202, 121, 11, 39, 28, 12, 246, 177, 56, 55, 138, 24, 134, 12, 55, 192, 15, 181, 90, 237, 150, 16, 102, 216, 81, 181, 89, 220, 86, 184, 251, 146, 237, 238, 142, 207, 218, 220, 109, 223, 5, 249, 186, 221, 221, 254, 205, 249, 32, 182, 166, 182, 219, 64, 78, 218, 220, 237, 159, 25, 126, 176, 71, 89, 1, 203, 193, 84, 152, 219, 8, 15, 212, 117, 48, 73, 127, 197, 209, 218, 249, 5, 216, 222, 2, 19, 196, 23, 39, 83, 240, 59, 108, 205, 29, 95, 94, 223, 113, 245, 245, 37, 219, 235, 126, 171, 205, 206, 68, 130, 28, 154, 96, 255, 200, 1, 157, 70, 35, 26, 243, 11, 94, 183, 53, 181, 223, 50, 153, 231, 225, 104, 129, 113, 106, 238, 252, 10, 140, 253, 173, 174, 38, 95, 174, 242, 30, 28, 171, 21, 134, 93, 3, 119, 135, 26, 246, 245, 37, 184, 134, 183, 179, 251, 182, 169, 237, 27, 36, 211, 33, 237, 223, 128, 123, 135, 61, 75, 246, 230, 142, 107, 70, 185, 166, 202, 200, 85, 101, 48, 26, 235, 217, 139, 1, 99, 195, 82, 198, 177, 66, 246, 174, 40, 210, 225, 48, 161, 31, 123, 1, 107, 179, 179, 47, 225, 147, 184, 79, 193, 156, 248, 51, 77, 2, 247, 178, 86, 189, 90, 196, 158, 140, 37, 23, 94, 196, 26, 22, 163, 182, 40, 153, 81, 223, 4, 98, 252, 57, 166, 233, 85, 55, 182, 85, 5, 23, 34, 199, 249, 87, 17, 169, 78, 152, 169, 144, 123, 100, 42, 127, 87, 113, 244, 168, 218, 238, 1, 237, 210, 219, 243, 4, 146, 37, 54, 222, 45, 62, 191, 86, 212, 193, 205, 160, 137, 231, 126, 41, 8, 171, 183, 42, 125, 157, 163, 146, 37, 173, 140, 148, 131, 17, 221, 88, 204, 128, 49, 227, 151, 37, 126, 60, 70, 57, 146, 167, 112, 63, 122, 173, 246, 214, 41, 63, 137, 137, 76, 64, 52, 121, 205, 120, 119, 18, 119, 182, 201, 131, 210, 55, 56, 161, 103, 7, 221, 81, 218, 220, 18, 45, 44, 236, 28, 66, 122, 234, 97, 205, 34, 213, 103, 176, 65, 177, 58, 142, 123, 146, 95, 190, 248, 3, 108, 62, 142, 154, 34, 150, 130, 67, 82, 196, 252, 69, 102, 66, 197, 170, 55, 190, 158, 199, 96, 123, 147, 189, 181, 123, 87, 112, 224, 141, 114, 190, 165, 78, 70, 179, 216, 127, 25, 156, 18, 98, 107, 233, 170, 115, 120, 253, 191, 64, 83, 44, 222, 12, 37, 23, 238, 16, 117, 188, 70, 84, 39, 112, 63, 215, 243, 188, 77, 126, 163, 212, 168, 51, 46, 210, 164, 47, 135, 45, 207, 71, 9, 85, 114, 48, 26, 66, 69, 211, 236, 84, 38, 105, 99, 46, 151, 220, 183, 20, 52, 192, 31, 196, 160, 69, 22, 106, 161, 3, 210, 126, 246, 179, 96, 134, 154, 154, 164, 201, 79, 54, 63, 25, 155, 240, 120, 105, 95, 243, 245, 190, 157, 14, 81, 182, 230, 147, 231, 37, 188, 103, 170, 170, 234, 22, 97, 91, 53, 220, 114, 81, 4, 18, 98, 46, 53, 198, 85, 232, 245, 185, 133, 90, 181, 218, 41, 172, 74, 187, 88, 179, 124, 201, 33, 126, 105, 82, 179, 122, 145, 170, 93, 179, 88, 229, 215, 44, 228, 174, 209, 44, 224, 254, 83, 163, 226, 110, 5, 70, 187, 23, 228, 33, 80, 4, 158, 230, 147, 147, 222, 70, 43, 10, 250, 19, 243, 170, 237, 98, 241, 5, 219, 197, 117, 123, 46, 23, 173, 245, 238, 64, 181, 27, 143, 95, 116, 120, 123, 222, 198, 202, 103, 64, 138, 95, 194, 166, 200, 214, 19, 45, 57, 225, 20, 17, 150, 223, 78, 193, 55, 115, 199, 20, 43, 219, 199, 71, 152, 98, 155, 59, 214, 3, 89, 222, 205, 138, 173, 187, 219, 217, 77, 163, 93, 157, 37, 170, 23, 112, 223, 200, 177, 90, 179, 21, 90, 165, 42, 74, 51, 200, 124, 148, 241, 250, 71, 166, 76, 148, 141, 189, 117, 122, 253, 195, 49, 32, 201, 1, 41, 133, 228, 93, 65, 16, 116, 108, 65, 117, 54, 0, 108, 38, 142, 55, 221, 183, 211, 249, 92, 96, 243, 7, 201, 23, 200, 154, 64, 143, 82, 228, 196, 236, 170, 93, 169, 43, 40, 40, 226, 179, 179, 107, 129, 216, 220, 64, 118, 255, 1, 68, 119, 39, 200, 131, 154, 56, 238, 41, 44, 162, 34, 164, 165, 156, 214, 174, 206, 22, 81, 3, 52, 230, 91, 68, 115, 113, 169, 152, 83, 182, 78, 204, 93, 91, 46, 230, 86, 84, 137, 88, 248, 191, 96, 195, 102, 54, 167, 149, 237, 188, 148, 149, 125, 171, 62, 218, 8, 74, 129, 79, 116, 182, 118, 51, 66, 132, 121, 239, 61, 208, 18, 255, 230, 242, 245, 252, 208, 238, 233, 190, 22, 3, 31, 49, 206, 34, 164, 194, 113, 50, 208, 151, 145, 252, 139, 243, 4, 88, 113, 68, 185, 34, 175, 106, 240, 86, 195, 77, 115, 143, 171, 253, 74, 17, 110, 18, 177, 96, 253, 121, 152, 62, 242, 166, 144, 186, 252, 112, 144, 9, 150, 48, 59, 193, 72, 82, 173, 86, 167, 2, 177, 189, 40, 17, 92, 255, 68, 251, 71, 194, 246, 23, 138, 239, 32, 51, 38, 97, 56, 167, 16, 205, 165, 232, 27, 140, 116, 95, 20, 84, 108, 204, 208, 153, 205, 229, 216, 38, 80, 179, 56, 225, 26, 13, 199, 125, 23, 136, 240, 119, 160, 245, 189, 40, 164, 37, 159, 210, 107, 181, 64, 126, 37, 140, 240, 138, 182, 92, 200, 146, 242, 203, 247, 29, 98, 5, 192, 177, 59, 6, 90, 193, 152, 6, 216, 26, 232, 219, 203, 204, 163, 72, 126, 82, 31, 95, 71, 107, 247, 32, 35, 66, 111, 207, 75, 64, 134, 127, 196, 98, 225, 174, 182, 222, 47, 192, 239, 219, 156, 158, 206, 218, 202, 134, 214, 60, 52, 195, 134, 158, 35, 177, 81, 121, 95, 34, 153, 80, 231, 249, 13, 141, 118, 116, 165, 41, 182, 186, 169, 109, 3, 220, 84, 15, 174, 111, 191, 74, 172, 56, 112, 84, 52, 230, 230, 137, 154, 5, 220, 109, 195, 55, 78, 160, 154, 202, 172, 56, 55, 217, 196, 56, 31, 37, 120, 98, 146, 53, 73, 32, 182, 2, 5, 57, 14, 76, 212, 212, 10, 100, 219, 173, 208, 34, 99, 137, 248, 121, 124, 237, 226, 103, 9, 25, 42, 243, 9, 35, 230, 92, 99, 201, 53, 193, 100, 202, 19, 178, 178, 118, 104, 82, 22, 246, 0, 9, 126, 11, 200, 240, 97, 140, 26, 197, 114, 109, 6, 179, 89, 204, 45, 175, 18, 139, 54, 95, 192, 114, 188, 43, 46, 191, 66, 180, 30, 107, 97, 81, 249, 50, 225, 129, 96, 4, 253, 43, 64, 118, 127, 6, 185, 31, 180, 191, 239, 56, 125, 189, 55, 56, 188, 254, 171, 29, 30, 127, 11, 108, 15, 195, 118, 47, 200, 110, 123, 107, 199, 69, 54, 79, 215, 38, 187, 187, 163, 220, 209, 220, 110, 42, 61, 116, 40, 157, 139, 52, 119, 129, 102, 136, 69, 91, 134, 235, 105, 147, 166, 72, 8, 190, 65, 130, 111, 12, 187, 187, 253, 4, 70, 113, 225, 42, 173, 192, 181, 9, 125, 149, 63, 147, 255, 166, 213, 106, 23, 206, 130, 7, 152, 160, 24, 135, 97, 127, 164, 78, 87, 43, 105, 145, 67, 19, 168, 182, 35, 71, 197, 14, 193, 189, 80, 50, 9, 36, 73, 215, 111, 134, 46, 58, 21, 249, 132, 97, 137, 220, 82, 181, 37, 21, 238, 177, 117, 252, 242, 101, 151, 195, 2, 251, 63, 64, 59, 252, 49, 144, 226, 83, 252, 138, 165, 31, 224, 189, 135, 38, 209, 194, 77, 231, 51, 50, 196, 222, 143, 104, 185, 26, 246, 7, 122, 186, 79, 75, 90, 223, 35, 46, 111, 207, 157, 78, 159, 255, 83, 142, 150, 238, 99, 14, 79, 215, 102, 107, 99, 167, 165, 172, 222, 183, 146, 155, 96, 177, 1, 217, 237, 36, 231, 44, 50, 23, 20, 5, 115, 17, 162, 126, 16, 20, 129, 40, 24, 197, 5, 171, 183, 251, 215, 119, 92, 205, 2, 123, 224, 102, 191, 123, 248, 65, 224, 184, 68, 165, 159, 107, 166, 193, 98, 169, 75, 52, 90, 44, 181, 198, 188, 188, 253, 250, 92, 203, 30, 144, 189, 243, 64, 246, 232, 243, 243, 247, 225, 54, 55, 55, 55, 45, 136, 112, 100, 146, 108, 147, 34, 91, 99, 225, 143, 252, 253, 36, 16, 27, 155, 172, 12, 69, 69, 5, 134, 60, 203, 129, 121, 116, 237, 216, 245, 51, 228, 90, 46, 55, 229, 231, 87, 204, 128, 197, 66, 156, 92, 184, 27, 27, 189, 135, 123, 83, 209, 230, 205, 171, 176, 86, 41, 159, 178, 244, 24, 214, 141, 6, 237, 240, 87, 154, 4, 238, 69, 97, 213, 202, 33, 12, 142, 201, 183, 58, 216, 220, 129, 38, 82, 235, 177, 102, 169, 21, 20, 246, 206, 237, 30, 0, 34, 124, 201, 229, 235, 125, 8, 52, 194, 111, 194, 60, 115, 149, 163, 165, 235, 146, 42, 183, 183, 52, 184, 111, 98, 152, 149, 61, 43, 238, 143, 126, 66, 156, 179, 148, 34, 251, 14, 149, 1, 67, 114, 208, 144, 164, 8, 208, 34, 140, 48, 113, 40, 211, 71, 236, 205, 29, 95, 218, 208, 217, 199, 154, 65, 175, 230, 184, 223, 25, 139, 138, 214, 40, 222, 58, 211, 122, 89, 178, 73, 86, 0, 62, 16, 210, 83, 69, 125, 230, 42, 81, 151, 145, 46, 234, 50, 231, 137, 100, 172, 20, 13, 89, 171, 68, 33, 59, 99, 175, 146, 28, 229, 113, 1, 114, 187, 85, 34, 201, 83, 19, 238, 250, 161, 213, 94, 29, 107, 45, 82, 94, 120, 9, 43, 150, 222, 142, 231, 49, 159, 174, 157, 86, 190, 118, 153, 233, 15, 7, 223, 207, 147, 108, 109, 24, 54, 157, 70, 242, 33, 98, 213, 25, 131, 33, 199, 170, 89, 185, 226, 56, 104, 134, 95, 128, 185, 224, 255, 52, 137, 220, 203, 2, 60, 99, 216, 194, 15, 123, 34, 174, 185, 168, 78, 172, 56, 112, 5, 43, 46, 49, 236, 35, 12, 4, 199, 252, 21, 228, 30, 214, 51, 183, 181, 123, 191, 221, 237, 41, 175, 222, 127, 124, 85, 196, 123, 1, 243, 13, 229, 238, 53, 44, 138, 116, 142, 53, 24, 38, 204, 126, 88, 20, 117, 98, 237, 45, 157, 223, 216, 216, 125, 141, 88, 178, 125, 151, 200, 47, 95, 210, 175, 89, 172, 250, 170, 49, 63, 223, 18, 244, 17, 57, 183, 105, 58, 125, 42, 129, 102, 196, 7, 91, 151, 23, 95, 184, 211, 91, 116, 254, 182, 171, 11, 47, 216, 214, 91, 88, 179, 237, 202, 57, 47, 236, 60, 107, 175, 194, 109, 222, 150, 139, 179, 130, 38, 65, 78, 210, 36, 127, 43, 5, 220, 156, 142, 65, 247, 143, 34, 249, 186, 199, 250, 250, 173, 217, 177, 231, 124, 56, 143, 143, 22, 213, 108, 239, 153, 47, 215, 14, 206, 213, 15, 114, 109, 201, 214, 109, 91, 67, 93, 187, 24, 141, 109, 60, 23, 69, 238, 97, 142, 213, 186, 12, 251, 31, 178, 124, 194, 36, 238, 243, 160, 33, 254, 146, 105, 136, 25, 233, 131, 38, 139, 76, 136, 187, 89, 62, 33, 214, 138, 102, 65, 50, 1, 82, 124, 3, 211, 39, 152, 118, 232, 235, 238, 112, 52, 183, 95, 80, 213, 224, 49, 98, 43, 172, 112, 7, 133, 90, 159, 236, 15, 100, 77, 233, 93, 125, 9, 68, 134, 132, 89, 3, 101, 202, 136, 163, 185, 227, 70, 44, 61, 134, 102, 19, 236, 54, 194, 175, 88, 122, 26, 86, 148, 223, 19, 50, 51, 47, 96, 21, 38, 20, 192, 0, 159, 209, 124, 23, 147, 1, 185, 236, 24, 86, 103, 217, 212, 243, 81, 185, 108, 148, 220, 237, 59, 176, 245, 42, 126, 246, 41, 126, 31, 252, 179, 55, 204, 235, 224, 253, 132, 219, 151, 55, 204, 103, 125, 163, 236, 59, 212, 241, 132, 59, 246, 160, 207, 194, 68, 53, 184, 169, 231, 99, 34, 44, 106, 62, 162, 184, 126, 113, 18, 65, 102, 128, 188, 49, 193, 200, 214, 51, 18, 201, 62, 16, 107, 147, 160, 188, 40, 179, 55, 182, 175, 193, 9, 23, 11, 94, 4, 52, 145, 8, 99, 18, 205, 53, 243, 141, 50, 238, 145, 246, 237, 13, 179, 255, 104, 247, 27, 205, 245, 150, 175, 29, 220, 171, 104, 177, 129, 237, 11, 85, 30, 79, 106, 128, 64, 38, 86, 200, 253, 172, 31, 145, 11, 251, 44, 98, 197, 25, 147, 201, 148, 199, 167, 167, 238, 230, 147, 184, 235, 52, 28, 247, 19, 245, 2, 238, 57, 12, 168, 97, 38, 83, 187, 75, 44, 133, 197, 113, 64, 67, 84, 16, 162, 199, 255, 58, 28, 251, 195, 64, 136, 95, 179, 123, 187, 91, 29, 173, 93, 27, 170, 142, 123, 86, 71, 58, 32, 52, 133, 42, 125, 129, 210, 249, 17, 33, 18, 102, 55, 148, 15, 170, 221, 221, 182, 213, 233, 237, 254, 3, 70, 191, 86, 215, 187, 89, 129, 95, 12, 211, 86, 171, 184, 191, 104, 18, 185, 143, 179, 122, 176, 65, 171, 64, 5, 97, 78, 186, 115, 92, 142, 212, 117, 186, 219, 237, 246, 166, 246, 79, 99, 169, 43, 91, 83, 219, 199, 230, 139, 224, 249, 194, 53, 250, 148, 173, 217, 87, 38, 13, 136, 92, 186, 11, 77, 173, 54, 69, 208, 206, 120, 75, 210, 157, 150, 204, 181, 110, 165, 121, 52, 150, 215, 142, 149, 58, 108, 106, 239, 176, 53, 183, 127, 194, 230, 110, 255, 232, 188, 185, 118, 238, 246, 143, 224, 181, 179, 186, 219, 142, 13, 63, 115, 99, 211, 168, 130, 131, 107, 206, 249, 172, 8, 251, 203, 171, 174, 22, 4, 181, 186, 70, 179, 80, 229, 7, 13, 241, 46, 86, 113, 102, 197, 178, 83, 6, 147, 153, 85, 156, 65, 31, 34, 22, 237, 198, 128, 154, 64, 84, 41, 22, 238, 238, 121, 3, 8, 241, 81, 216, 126, 221, 217, 218, 237, 133, 251, 108, 163, 181, 169, 41, 59, 210, 156, 17, 32, 193, 147, 241, 228, 15, 36, 204, 15, 72, 149, 117, 228, 31, 177, 97, 168, 195, 227, 127, 8, 11, 78, 99, 152, 246, 218, 221, 151, 137, 121, 149, 86, 185, 30, 236, 35, 154, 165, 9, 215, 2, 97, 218, 44, 117, 117, 193, 254, 42, 149, 148, 70, 18, 207, 77, 86, 7, 113, 138, 84, 27, 49, 14, 50, 145, 105, 181, 218, 102, 137, 224, 198, 101, 106, 5, 130, 237, 151, 72, 246, 61, 208, 38, 229, 214, 63, 170, 88, 223, 103, 116, 225, 70, 154, 158, 35, 252, 141, 45, 128, 20, 207, 211, 57, 200, 221, 184, 49, 13, 159, 67, 33, 45, 185, 73, 170, 62, 243, 136, 102, 177, 234, 77, 157, 192, 179, 164, 251, 162, 243, 47, 12, 84, 156, 57, 214, 44, 58, 91, 187, 134, 125, 136, 240, 92, 255, 9, 83, 44, 28, 94, 127, 167, 189, 165, 115, 75, 245, 145, 70, 33, 220, 241, 176, 124, 194, 190, 190, 68, 138, 18, 37, 16, 184, 145, 1, 61, 140, 44, 155, 218, 92, 172, 120, 186, 183, 231, 53, 44, 254, 139, 77, 70, 49, 180, 27, 43, 94, 8, 25, 233, 34, 60, 148, 127, 225, 147, 184, 47, 242, 153, 153, 117, 57, 165, 165, 217, 97, 30, 118, 165, 159, 36, 38, 15, 25, 91, 197, 74, 78, 255, 121, 37, 117, 1, 223, 78, 80, 101, 37, 153, 36, 191, 53, 65, 127, 100, 160, 86, 171, 94, 255, 109, 197, 181, 155, 148, 69, 206, 188, 188, 118, 138, 107, 24, 130, 12, 89, 17, 239, 72, 207, 8, 46, 72, 225, 250, 88, 132, 85, 171, 246, 169, 23, 169, 254, 11, 158, 189, 95, 72, 126, 196, 33, 83, 97, 17, 171, 62, 83, 182, 107, 15, 107, 159, 103, 151, 90, 59, 1, 9, 98, 202, 197, 63, 176, 33, 48, 104, 137, 31, 177, 123, 58, 183, 163, 15, 145, 227, 66, 71, 180, 162, 185, 20, 239, 175, 225, 123, 140, 22, 53, 4, 66, 104, 83, 74, 112, 155, 34, 87, 189, 111, 37, 214, 57, 100, 221, 183, 177, 217, 168, 183, 135, 249, 47, 214, 94, 122, 128, 57, 249, 245, 48, 57, 107, 150, 196, 255, 91, 29, 199, 253, 156, 95, 172, 186, 90, 88, 189, 122, 125, 161, 109, 235, 138, 48, 95, 177, 64, 81, 186, 138, 86, 166, 177, 65, 60, 144, 220, 223, 36, 77, 112, 60, 69, 4, 48, 167, 114, 8, 63, 47, 8, 66, 13, 211, 32, 70, 41, 45, 70, 24, 55, 134, 75, 184, 113, 17, 18, 224, 141, 69, 21, 106, 109, 86, 214, 22, 205, 226, 132, 30, 120, 174, 190, 167, 86, 113, 79, 242, 169, 203, 62, 196, 196, 124, 76, 189, 192, 66, 221, 35, 252, 136, 76, 83, 100, 57, 136, 191, 100, 77, 218, 91, 187, 247, 59, 154, 58, 11, 49, 209, 63, 146, 245, 72, 246, 33, 146, 255, 144, 64, 24, 135, 105, 44, 144, 139, 52, 178, 192, 47, 58, 239, 145, 48, 93, 94, 172, 136, 225, 127, 129, 173, 88, 91, 58, 89, 41, 169, 146, 218, 139, 197, 220, 117, 149, 34, 182, 161, 209, 36, 114, 47, 98, 21, 126, 236, 217, 166, 231, 249, 141, 152, 115, 21, 82, 43, 132, 213, 51, 145, 230, 248, 201, 17, 255, 227, 121, 62, 127, 130, 145, 172, 114, 25, 186, 63, 40, 38, 74, 42, 215, 21, 123, 82, 12, 233, 227, 181, 108, 217, 146, 170, 53, 26, 43, 53, 41, 139, 143, 195, 51, 243, 37, 172, 86, 195, 47, 77, 96, 102, 211, 156, 17, 102, 211, 22, 133, 217, 20, 91, 58, 97, 161, 238, 222, 219, 28, 158, 206, 22, 71, 163, 207, 1, 100, 183, 50, 180, 242, 222, 167, 58, 199, 135, 72, 132, 72, 32, 196, 150, 48, 3, 117, 14, 71, 18, 102, 225, 222, 189, 43, 108, 205, 237, 231, 99, 229, 12, 76, 28, 118, 120, 252, 239, 163, 89, 22, 107, 46, 98, 217, 59, 44, 62, 140, 190, 17, 137, 52, 95, 198, 94, 110, 216, 253, 91, 80, 171, 119, 26, 203, 202, 12, 97, 190, 45, 206, 117, 214, 252, 52, 121, 190, 205, 57, 0, 57, 135, 17, 200, 237, 10, 137, 228, 198, 27, 213, 58, 32, 229, 70, 182, 48, 45, 38, 168, 135, 30, 33, 42, 140, 168, 107, 234, 10, 147, 95, 140, 90, 155, 185, 176, 48, 87, 238, 111, 184, 154, 227, 126, 10, 90, 226, 243, 66, 198, 202, 33, 83, 65, 145, 88, 176, 126, 19, 115, 105, 224, 162, 147, 245, 56, 244, 178, 168, 230, 51, 240, 92, 61, 5, 164, 120, 183, 163, 213, 127, 181, 205, 221, 89, 235, 56, 218, 164, 11, 253, 92, 4, 158, 85, 69, 93, 82, 122, 118, 8, 132, 169, 68, 164, 222, 106, 232, 239, 176, 183, 116, 94, 230, 244, 245, 124, 9, 30, 232, 199, 165, 122, 140, 140, 52, 49, 231, 10, 53, 77, 140, 176, 67, 179, 30, 191, 108, 193, 59, 64, 154, 143, 169, 23, 112, 95, 231, 83, 147, 91, 176, 133, 87, 110, 121, 121, 164, 106, 28, 103, 125, 55, 103, 107, 96, 206, 235, 9, 64, 14, 218, 65, 63, 162, 84, 107, 117, 60, 36, 57, 40, 153, 105, 95, 5, 146, 92, 78, 90, 100, 212, 132, 168, 236, 137, 24, 118, 188, 116, 21, 21, 25, 160, 233, 111, 228, 87, 44, 233, 208, 196, 115, 39, 53, 28, 247, 4, 159, 178, 232, 61, 185, 191, 225, 112, 180, 169, 148, 160, 143, 233, 23, 14, 111, 207, 171, 206, 182, 222, 95, 129, 182, 120, 61, 75, 206, 63, 209, 86, 132, 45, 164, 66, 237, 95, 246, 35, 214, 201, 193, 53, 68, 138, 4, 194, 140, 81, 47, 227, 70, 233, 185, 166, 114, 52, 180, 230, 193, 67, 127, 57, 246, 110, 99, 33, 230, 94, 255, 59, 204, 60, 219, 220, 193, 218, 218, 148, 213, 237, 99, 1, 7, 230, 162, 18, 81, 200, 202, 16, 177, 32, 50, 76, 34, 191, 214, 44, 224, 110, 20, 82, 150, 29, 133, 73, 187, 2, 43, 129, 68, 52, 101, 73, 62, 78, 166, 85, 205, 175, 149, 51, 27, 115, 181, 90, 189, 8, 8, 238, 89, 137, 232, 6, 39, 144, 27, 121, 173, 82, 59, 37, 4, 221, 103, 146, 201, 84, 234, 193, 26, 210, 45, 96, 172, 169, 73, 134, 247, 172, 17, 150, 47, 59, 12, 247, 240, 205, 172, 245, 211, 162, 184, 127, 161, 37, 197, 92, 90, 38, 22, 157, 119, 129, 184, 246, 146, 253, 44, 189, 74, 174, 103, 202, 158, 9, 92, 80, 122, 253, 183, 195, 207, 30, 248, 189, 195, 21, 168, 97, 26, 118, 145, 74, 126, 68, 2, 97, 54, 174, 172, 229, 6, 192, 82, 125, 197, 80, 111, 130, 201, 193, 96, 119, 119, 236, 130, 201, 224, 83, 160, 109, 254, 204, 229, 235, 249, 167, 67, 234, 253, 102, 111, 244, 137, 149, 7, 235, 197, 210, 139, 234, 88, 49, 3, 147, 165, 64, 196, 146, 88, 64, 156, 47, 175, 70, 226, 84, 113, 55, 105, 82, 22, 159, 0, 226, 116, 26, 43, 92, 234, 190, 240, 225, 232, 113, 88, 126, 75, 225, 231, 156, 147, 19, 137, 108, 18, 197, 241, 144, 8, 82, 28, 71, 126, 228, 160, 148, 254, 241, 46, 236, 39, 83, 161, 177, 19, 41, 74, 164, 24, 174, 51, 14, 106, 111, 230, 194, 178, 92, 62, 51, 125, 23, 230, 16, 3, 33, 222, 167, 142, 231, 158, 19, 210, 211, 6, 77, 249, 150, 64, 213, 154, 29, 151, 136, 149, 135, 142, 139, 118, 119, 155, 220, 230, 169, 31, 238, 251, 103, 65, 254, 199, 217, 234, 255, 184, 163, 181, 227, 98, 41, 218, 52, 212, 152, 199, 13, 215, 43, 69, 50, 164, 62, 135, 4, 194, 220, 3, 62, 220, 232, 27, 9, 142, 150, 149, 129, 197, 142, 237, 77, 237, 86, 71, 171, 191, 17, 38, 142, 175, 58, 219, 122, 31, 118, 250, 252, 111, 200, 61, 227, 176, 36, 22, 154, 105, 177, 68, 22, 78, 58, 24, 234, 142, 157, 199, 53, 11, 185, 215, 65, 227, 124, 20, 38, 166, 219, 53, 75, 23, 246, 8, 106, 245, 14, 99, 126, 177, 197, 226, 170, 91, 26, 105, 226, 115, 141, 244, 117, 202, 193, 11, 179, 210, 231, 41, 71, 159, 2, 185, 125, 124, 2, 254, 72, 57, 237, 227, 147, 76, 75, 153, 193, 69, 237, 39, 109, 113, 23, 133, 31, 145, 45, 74, 42, 42, 212, 48, 214, 91, 248, 148, 69, 93, 112, 239, 161, 217, 244, 207, 240, 250, 125, 3, 51, 155, 90, 3, 133, 190, 47, 83, 36, 233, 123, 89, 146, 254, 235, 32, 15, 58, 124, 61, 55, 219, 91, 187, 142, 86, 55, 248, 214, 149, 213, 213, 165, 132, 211, 16, 135, 243, 17, 137, 12, 9, 132, 121, 8, 169, 101, 87, 160, 167, 219, 45, 97, 67, 223, 177, 59, 9, 86, 252, 64, 211, 19, 171, 0, 226, 237, 121, 20, 211, 78, 28, 82, 223, 57, 166, 113, 194, 234, 188, 108, 215, 94, 214, 146, 7, 91, 243, 232, 97, 194, 231, 87, 44, 249, 0, 180, 205, 167, 49, 56, 8, 180, 207, 27, 249, 180, 100, 183, 158, 231, 55, 229, 20, 21, 233, 66, 20, 61, 56, 135, 64, 37, 226, 12, 246, 121, 206, 212, 40, 192, 97, 77, 29, 136, 238, 17, 137, 36, 199, 218, 249, 67, 46, 30, 240, 38, 150, 180, 155, 227, 90, 164, 148, 143, 232, 82, 230, 35, 70, 104, 7, 85, 149, 42, 8, 66, 53, 75, 210, 95, 192, 125, 149, 53, 10, 94, 20, 247, 58, 154, 77, 115, 214, 172, 101, 125, 17, 153, 217, 244, 10, 247, 217, 206, 23, 138, 36, 125, 184, 119, 219, 89, 213, 154, 195, 97, 171, 214, 196, 201, 57, 175, 108, 1, 73, 73, 250, 4, 2, 225, 28, 40, 250, 190, 141, 86, 205, 195, 218, 212, 145, 237, 108, 238, 88, 239, 108, 233, 110, 198, 160, 32, 151, 183, 247, 255, 64, 227, 124, 145, 181, 228, 241, 4, 124, 156, 214, 250, 102, 177, 124, 223, 97, 22, 28, 196, 204, 181, 133, 197, 162, 86, 163, 22, 249, 228, 164, 119, 48, 199, 12, 205, 97, 48, 225, 125, 78, 72, 78, 106, 212, 101, 103, 111, 214, 231, 229, 153, 128, 60, 151, 70, 49, 185, 38, 160, 31, 74, 246, 123, 42, 154, 30, 79, 27, 121, 202, 90, 36, 22, 169, 86, 70, 168, 142, 177, 103, 164, 92, 130, 174, 103, 14, 106, 145, 193, 37, 220, 194, 158, 91, 217, 166, 77, 41, 56, 142, 154, 229, 203, 14, 193, 253, 241, 121, 13, 182, 131, 74, 194, 238, 23, 25, 204, 114, 17, 136, 54, 189, 84, 172, 58, 124, 156, 5, 160, 73, 125, 17, 207, 192, 226, 237, 25, 144, 31, 1, 57, 126, 220, 209, 218, 45, 155, 77, 227, 67, 223, 234, 125, 42, 234, 111, 72, 32, 16, 38, 190, 218, 151, 252, 154, 202, 218, 144, 225, 222, 92, 117, 196, 147, 202, 58, 147, 183, 116, 30, 112, 122, 187, 175, 195, 86, 61, 172, 171, 185, 215, 255, 214, 176, 214, 233, 110, 23, 171, 143, 54, 177, 28, 51, 52, 135, 89, 236, 235, 89, 144, 144, 142, 215, 136, 252, 242, 197, 239, 131, 230, 249, 15, 32, 207, 251, 65, 190, 204, 47, 84, 117, 243, 153, 233, 117, 250, 156, 156, 181, 121, 118, 123, 86, 80, 85, 155, 144, 218, 167, 236, 251, 84, 144, 231, 84, 249, 63, 229, 122, 173, 125, 227, 44, 69, 39, 107, 145, 207, 100, 103, 103, 47, 150, 246, 57, 155, 73, 242, 172, 15, 177, 44, 124, 130, 126, 201, 69, 23, 45, 55, 228, 230, 150, 241, 105, 203, 15, 104, 18, 184, 207, 50, 171, 67, 60, 247, 188, 176, 42, 109, 208, 136, 126, 68, 184, 63, 208, 39, 142, 38, 126, 180, 88, 72, 132, 136, 57, 137, 175, 176, 133, 153, 215, 127, 147, 163, 165, 251, 8, 214, 206, 181, 30, 62, 188, 44, 212, 119, 156, 189, 119, 235, 40, 39, 145, 64, 32, 76, 173, 214, 41, 247, 158, 11, 107, 38, 3, 178, 178, 157, 240, 232, 109, 238, 182, 77, 78, 79, 87, 131, 195, 219, 243, 57, 167, 183, 247, 199, 64, 158, 79, 194, 132, 247, 110, 192, 215, 233, 103, 249, 103, 24, 97, 136, 154, 39, 118, 64, 40, 88, 127, 30, 51, 219, 162, 127, 137, 79, 79, 29, 80, 39, 113, 175, 194, 4, 250, 7, 144, 123, 249, 5, 220, 13, 124, 106, 114, 171, 78, 163, 217, 102, 178, 88, 74, 88, 180, 237, 232, 62, 35, 166, 129, 186, 70, 150, 27, 139, 149, 31, 84, 254, 156, 10, 72, 238, 241, 113, 150, 162, 27, 144, 62, 183, 31, 119, 52, 75, 242, 34, 149, 189, 17, 149, 233, 23, 33, 129, 21, 159, 116, 102, 115, 185, 144, 145, 126, 88, 189, 128, 195, 50, 110, 255, 171, 86, 113, 207, 241, 43, 87, 244, 27, 115, 243, 196, 124, 155, 51, 80, 181, 102, 255, 209, 145, 126, 68, 111, 207, 155, 46, 95, 239, 35, 112, 207, 220, 10, 139, 175, 102, 88, 104, 57, 215, 29, 108, 200, 12, 167, 33, 142, 232, 135, 72, 32, 16, 8, 51, 101, 194, 148, 73, 115, 216, 199, 25, 129, 184, 202, 106, 107, 23, 87, 215, 183, 27, 208, 79, 228, 242, 244, 28, 119, 120, 252, 255, 5, 147, 225, 127, 75, 154, 231, 27, 142, 214, 174, 33, 70, 158, 45, 157, 172, 62, 109, 229, 193, 99, 226, 218, 186, 125, 98, 241, 5, 219, 88, 43, 33, 115, 49, 104, 159, 90, 173, 40, 164, 37, 159, 210, 36, 114, 47, 73, 4, 250, 67, 77, 18, 119, 147, 144, 178, 164, 29, 35, 28, 65, 51, 91, 103, 44, 42, 82, 99, 107, 162, 49, 76, 250, 241, 156, 194, 23, 202, 228, 172, 70, 26, 206, 39, 202, 76, 117, 138, 168, 214, 193, 49, 70, 181, 158, 145, 114, 42, 127, 174, 216, 223, 76, 209, 116, 206, 146, 160, 107, 244, 122, 166, 50, 48, 23, 17, 22, 49, 118, 109, 218, 138, 19, 112, 77, 110, 150, 234, 154, 190, 192, 218, 65, 73, 132, 136, 102, 248, 64, 96, 77, 107, 160, 106, 141, 135, 213, 54, 125, 27, 238, 131, 199, 157, 62, 255, 183, 209, 143, 232, 108, 233, 56, 111, 93, 67, 131, 38, 220, 120, 200, 57, 194, 120, 223, 17, 41, 18, 8, 132, 89, 167, 109, 162, 121, 54, 68, 63, 187, 72, 72, 192, 50, 123, 206, 214, 182, 42, 187, 215, 143, 69, 16, 62, 2, 147, 230, 183, 156, 190, 222, 7, 128, 60, 159, 195, 96, 12, 217, 116, 235, 104, 110, 23, 173, 199, 91, 196, 138, 203, 235, 37, 2, 221, 206, 124, 159, 152, 255, 166, 55, 24, 69, 97, 213, 202, 1, 44, 37, 166, 81, 113, 127, 215, 4, 82, 86, 190, 173, 78, 228, 62, 169, 73, 73, 58, 193, 103, 172, 172, 69, 191, 151, 97, 221, 58, 77, 184, 164, 240, 72, 68, 42, 183, 35, 67, 201, 200, 200, 88, 34, 145, 228, 87, 198, 97, 106, 29, 38, 83, 44, 150, 205, 38, 254, 233, 243, 69, 170, 100, 191, 161, 34, 255, 48, 226, 177, 224, 216, 233, 114, 114, 114, 112, 60, 249, 37, 9, 93, 160, 25, 126, 19, 198, 250, 97, 150, 139, 152, 149, 41, 154, 10, 10, 217, 53, 9, 244, 71, 148, 52, 68, 70, 136, 76, 75, 124, 11, 174, 239, 31, 225, 250, 158, 132, 159, 253, 216, 48, 184, 186, 209, 23, 182, 251, 69, 176, 207, 188, 143, 252, 136, 4, 2, 97, 46, 106, 156, 76, 195, 12, 242, 117, 70, 51, 233, 85, 236, 115, 39, 91, 79, 116, 228, 56, 220, 237, 155, 29, 45, 221, 199, 176, 244, 30, 144, 231, 29, 48, 209, 254, 214, 233, 237, 125, 14, 205, 183, 82, 115, 218, 128, 6, 218, 224, 97, 29, 24, 202, 247, 30, 98, 41, 43, 216, 139, 19, 43, 170, 96, 0, 17, 43, 28, 190, 42, 109, 64, 179, 36, 254, 77, 117, 28, 247, 20, 104, 58, 191, 1, 185, 19, 38, 249, 207, 241, 75, 84, 157, 124, 218, 242, 253, 24, 137, 171, 47, 44, 44, 204, 177, 90, 179, 139, 246, 71, 38, 82, 172, 140, 3, 68, 247, 238, 56, 114, 35, 89, 176, 14, 124, 254, 42, 166, 97, 79, 110, 17, 243, 179, 237, 158, 224, 123, 134, 201, 48, 138, 102, 221, 64, 76, 139, 177, 108, 33, 142, 137, 38, 121, 113, 35, 142, 19, 144, 225, 79, 209, 135, 140, 81, 204, 24, 205, 140, 230, 113, 140, 110, 198, 18, 110, 44, 23, 145, 249, 16, 229, 254, 136, 254, 55, 224, 58, 61, 198, 52, 68, 175, 191, 219, 238, 238, 220, 234, 104, 106, 211, 133, 211, 72, 201, 143, 72, 32, 16, 8, 17, 52, 80, 102, 186, 173, 11, 180, 50, 138, 34, 96, 135, 43, 57, 120, 112, 185, 245, 68, 75, 14, 76, 188, 27, 108, 158, 238, 67, 76, 3, 109, 235, 189, 13, 72, 244, 103, 160, 169, 60, 129, 173, 197, 2, 17, 144, 126, 73, 11, 237, 56, 75, 162, 251, 14, 177, 36, 115, 44, 90, 141, 90, 15, 78, 246, 198, 220, 92, 86, 223, 150, 79, 93, 250, 161, 38, 137, 123, 13, 8, 244, 111, 172, 90, 11, 199, 221, 163, 142, 231, 190, 168, 89, 156, 112, 141, 144, 150, 220, 32, 168, 179, 247, 234, 212, 234, 34, 32, 221, 235, 198, 81, 134, 238, 180, 228, 135, 252, 173, 226, 84, 226, 185, 80, 38, 223, 113, 10, 55, 178, 222, 238, 168, 96, 253, 16, 97, 97, 160, 227, 249, 90, 77, 106, 178, 71, 19, 207, 221, 188, 154, 227, 126, 2, 231, 254, 36, 191, 116, 193, 219, 172, 82, 13, 44, 50, 152, 118, 136, 230, 82, 24, 59, 43, 86, 171, 129, 241, 100, 149, 155, 60, 221, 131, 48, 246, 47, 51, 205, 223, 215, 243, 37, 135, 199, 223, 98, 115, 119, 109, 146, 250, 35, 134, 36, 98, 165, 111, 155, 180, 67, 2, 129, 64, 24, 167, 22, 36, 183, 12, 147, 251, 235, 161, 223, 51, 154, 73, 21, 181, 37, 123, 125, 107, 86, 117, 67, 123, 137, 173, 165, 251, 66, 244, 129, 194, 4, 126, 45, 203, 249, 68, 18, 101, 126, 208, 158, 87, 96, 146, 255, 112, 216, 148, 219, 218, 197, 210, 11, 176, 57, 46, 106, 69, 235, 246, 30, 20, 215, 92, 124, 137, 88, 92, 179, 77, 180, 184, 54, 137, 185, 229, 85, 44, 29, 1, 53, 82, 89, 198, 168, 65, 14, 98, 173, 80, 157, 193, 48, 160, 203, 207, 183, 7, 214, 6, 147, 75, 16, 88, 117, 169, 208, 102, 91, 97, 44, 40, 48, 96, 206, 33, 70, 14, 11, 203, 151, 248, 248, 36, 238, 6, 77, 28, 119, 55, 22, 131, 192, 126, 136, 184, 48, 208, 9, 130, 104, 46, 46, 5, 50, 220, 192, 162, 144, 49, 26, 25, 203, 22, 6, 82, 46, 228, 122, 166, 254, 183, 97, 236, 254, 226, 242, 245, 222, 11, 227, 119, 29, 214, 52, 117, 182, 248, 214, 149, 30, 58, 148, 30, 246, 24, 176, 139, 77, 31, 229, 35, 18, 8, 4, 194, 212, 64, 106, 31, 166, 172, 159, 201, 34, 27, 177, 12, 95, 244, 19, 112, 130, 253, 144, 59, 221, 238, 246, 229, 99, 238, 39, 22, 132, 199, 14, 241, 172, 7, 160, 207, 127, 23, 16, 193, 175, 65, 43, 125, 130, 245, 6, 68, 159, 168, 228, 83, 147, 183, 165, 160, 133, 10, 171, 210, 134, 116, 1, 173, 48, 42, 65, 141, 83, 72, 77, 57, 173, 73, 228, 222, 6, 98, 250, 155, 58, 142, 251, 11, 38, 200, 99, 128, 11, 107, 103, 134, 21, 100, 84, 220, 215, 64, 147, 187, 9, 254, 254, 159, 154, 133, 220, 181, 234, 133, 220, 85, 252, 34, 85, 167, 102, 73, 130, 143, 95, 146, 212, 34, 36, 39, 53, 105, 146, 147, 26, 81, 248, 228, 36, 55, 191, 100, 65, 171, 122, 145, 170, 29, 222, 123, 165, 58, 145, 251, 4, 104, 188, 55, 192, 62, 110, 67, 237, 151, 249, 100, 227, 184, 63, 99, 187, 52, 77, 202, 162, 119, 133, 172, 140, 33, 36, 105, 115, 201, 26, 49, 223, 230, 18, 139, 207, 175, 101, 197, 32, 176, 31, 34, 46, 12, 48, 218, 56, 112, 142, 72, 136, 140, 12, 159, 4, 249, 41, 200, 141, 88, 141, 9, 3, 174, 42, 143, 183, 106, 35, 153, 135, 251, 20, 62, 196, 179, 209, 166, 84, 185, 134, 64, 32, 16, 102, 140, 246, 41, 251, 63, 57, 201, 255, 137, 129, 68, 35, 234, 111, 70, 89, 110, 12, 201, 160, 172, 222, 183, 18, 125, 162, 78, 119, 187, 221, 209, 220, 185, 59, 16, 149, 219, 243, 137, 220, 106, 199, 59, 218, 172, 12, 212, 10, 163, 43, 102, 174, 215, 15, 96, 80, 11, 106, 165, 216, 126, 169, 252, 178, 195, 226, 186, 75, 15, 48, 95, 94, 233, 246, 58, 177, 120, 235, 69, 98, 209, 150, 11, 197, 130, 141, 91, 68, 139, 115, 35, 35, 177, 188, 74, 43, 235, 11, 138, 109, 206, 114, 74, 215, 50, 45, 15, 243, 75, 209, 191, 138, 130, 175, 145, 240, 208, 84, 140, 239, 67, 223, 43, 154, 68, 11, 97, 31, 24, 17, 188, 102, 199, 110, 246, 29, 21, 151, 95, 33, 86, 95, 209, 36, 218, 27, 189, 82, 65, 111, 73, 43, 244, 248, 223, 7, 173, 250, 5, 103, 91, 207, 195, 176, 189, 203, 225, 237, 249, 52, 252, 253, 24, 154, 175, 209, 119, 104, 172, 169, 73, 26, 141, 12, 67, 212, 52, 37, 66, 36, 16, 8, 132, 57, 1, 69, 16, 145, 236, 11, 197, 237, 104, 173, 142, 150, 114, 220, 122, 221, 234, 108, 36, 190, 33, 157, 86, 59, 24, 141, 6, 137, 65, 46, 122, 131, 225, 53, 107, 131, 231, 7, 235, 219, 174, 250, 77, 32, 160, 165, 231, 111, 140, 164, 188, 61, 255, 2, 130, 122, 27, 91, 154, 1, 121, 245, 7, 138, 205, 119, 159, 13, 128, 145, 124, 170, 225, 229, 236, 123, 28, 1, 109, 119, 0, 181, 95, 216, 255, 171, 32, 127, 135, 239, 248, 173, 203, 215, 243, 67, 230, 47, 244, 250, 175, 134, 191, 31, 198, 52, 11, 212, 162, 203, 15, 28, 72, 27, 109, 140, 228, 177, 33, 255, 33, 129, 64, 32, 16, 134, 53, 82, 165, 233, 144, 249, 211, 110, 185, 101, 1, 230, 95, 234, 205, 57, 127, 53, 152, 76, 81, 165, 125, 232, 245, 103, 11, 158, 235, 205, 102, 155, 98, 255, 241, 152, 55, 90, 117, 228, 72, 42, 214, 22, 197, 206, 44, 214, 70, 143, 197, 218, 212, 177, 214, 214, 210, 105, 179, 121, 186, 54, 161, 47, 21, 75, 173, 217, 61, 254, 75, 153, 239, 207, 211, 125, 8, 11, 116, 59, 189, 221, 87, 160, 0, 33, 30, 129, 159, 15, 130, 70, 184, 215, 238, 237, 218, 105, 111, 237, 220, 106, 107, 237, 114, 217, 154, 187, 202, 108, 141, 94, 51, 38, 223, 71, 157, 234, 34, 149, 108, 59, 235, 251, 165, 196, 124, 2, 129, 64, 32, 68, 15, 22, 109, 171, 213, 106, 143, 27, 163, 175, 174, 131, 90, 102, 63, 70, 179, 194, 231, 142, 41, 247, 51, 61, 138, 115, 159, 42, 216, 143, 59, 86, 19, 52, 129, 64, 32, 16, 8, 193, 96, 38, 70, 189, 94, 159, 2, 164, 247, 47, 41, 170, 117, 32, 218, 124, 72, 216, 94, 207, 246, 130, 5, 3, 100, 66, 146, 243, 0, 37, 233, 83, 228, 144, 158, 149, 147, 241, 24, 140, 36, 251, 254, 34, 9, 190, 143, 189, 95, 250, 108, 159, 114, 255, 140, 0, 201, 95, 72, 32, 16, 8, 132, 73, 128, 148, 120, 143, 36, 121, 243, 24, 218, 97, 201, 4, 121, 111, 48, 217, 18, 8, 4, 2, 129, 48, 39, 32, 23, 29, 87, 212, 104, 141, 38, 55, 242, 148, 100, 98, 125, 148, 59, 155, 76, 79, 254, 61, 2, 129, 64, 32, 204, 41, 48, 98, 195, 218, 166, 64, 124, 79, 68, 169, 69, 126, 40, 189, 239, 105, 158, 231, 87, 224, 231, 39, 185, 236, 28, 129, 64, 32, 16, 8, 83, 15, 185, 232, 56, 16, 222, 231, 36, 211, 233, 169, 104, 52, 72, 216, 190, 10, 91, 236, 98, 49, 108, 170, 37, 16, 8, 4, 2, 97, 206, 64, 225, 135, 220, 41, 17, 223, 104, 173, 176, 78, 75, 230, 216, 55, 97, 107, 34, 130, 36, 16, 8, 4, 194, 156, 38, 72, 32, 71, 35, 144, 222, 7, 81, 68, 179, 158, 146, 222, 243, 22, 207, 243, 249, 248, 217, 89, 210, 64, 153, 64, 32, 16, 8, 132, 177, 19, 164, 86, 171, 93, 8, 164, 247, 215, 40, 252, 144, 178, 15, 242, 223, 130, 32, 228, 145, 6, 73, 32, 16, 8, 132, 57, 9, 101, 227, 99, 32, 201, 159, 25, 70, 47, 26, 32, 251, 32, 95, 6, 205, 209, 64, 4, 73, 32, 16, 8, 132, 185, 138, 225, 20, 13, 32, 189, 239, 74, 129, 58, 209, 16, 228, 223, 53, 26, 77, 54, 126, 142, 76, 172, 4, 2, 129, 64, 152, 115, 80, 166, 104, 0, 233, 125, 125, 20, 130, 28, 84, 20, 10, 120, 8, 182, 201, 164, 65, 18, 8, 4, 2, 97, 78, 66, 169, 253, 1, 233, 125, 71, 34, 191, 51, 161, 34, 89, 177, 155, 7, 214, 98, 197, 247, 192, 235, 239, 115, 82, 153, 55, 34, 72, 2, 129, 64, 32, 204, 57, 96, 112, 142, 76, 148, 64, 126, 63, 85, 104, 144, 161, 82, 61, 88, 240, 142, 84, 73, 231, 179, 161, 180, 80, 2, 129, 64, 32, 16, 230, 2, 84, 114, 144, 142, 148, 230, 241, 151, 81, 130, 116, 88, 14, 36, 10, 118, 1, 81, 236, 135, 74, 205, 17, 8, 4, 2, 97, 206, 32, 46, 200, 255, 184, 27, 243, 32, 37, 130, 60, 21, 206, 255, 40, 167, 120, 96, 253, 86, 233, 163, 72, 176, 84, 172, 156, 64, 32, 16, 8, 115, 3, 146, 223, 144, 17, 155, 90, 173, 94, 4, 164, 247, 69, 36, 63, 169, 8, 192, 233, 48, 230, 213, 1, 201, 4, 251, 0, 16, 100, 166, 98, 63, 212, 114, 138, 64, 32, 16, 8, 115, 2, 9, 74, 237, 17, 200, 110, 59, 144, 222, 179, 18, 249, 13, 132, 169, 164, 195, 204, 171, 146, 6, 121, 125, 16, 209, 18, 8, 4, 2, 129, 48, 140, 217, 216, 172, 23, 143, 55, 94, 89, 28, 0, 200, 174, 8, 228, 110, 133, 246, 24, 209, 188, 10, 239, 121, 23, 94, 215, 201, 159, 87, 238, 139, 64, 32, 16, 8, 4, 166, 133, 73, 132, 195, 2, 93, 36, 162, 136, 159, 161, 164, 41, 7, 227, 140, 32, 51, 208, 28, 115, 65, 190, 138, 17, 171, 138, 66, 229, 193, 101, 230, 134, 228, 223, 73, 26, 230, 47, 229, 46, 30, 146, 22, 74, 1, 58, 4, 2, 129, 64, 56, 171, 137, 141, 98, 90, 140, 199, 180, 9, 233, 61, 9, 211, 72, 154, 241, 120, 12, 161, 142, 21, 136, 206, 1, 218, 224, 183, 21, 228, 40, 251, 25, 7, 131, 8, 114, 64, 17, 156, 131, 210, 35, 239, 131, 252, 143, 4, 2, 129, 64, 8, 167, 145, 113, 88, 176, 27, 136, 230, 127, 128, 56, 110, 1, 217, 133, 233, 18, 225, 72, 3, 53, 46, 36, 21, 133, 230, 21, 107, 114, 97, 38, 84, 249, 123, 66, 105, 119, 112, 172, 102, 16, 47, 28, 235, 195, 10, 159, 34, 74, 127, 8, 114, 28, 14, 216, 145, 180, 199, 199, 224, 51, 107, 149, 4, 76, 183, 2, 129, 64, 32, 16, 70, 16, 157, 130, 112, 246, 2, 113, 188, 143, 4, 130, 100, 35, 17, 206, 251, 32, 191, 7, 249, 50, 230, 11, 130, 84, 240, 60, 191, 98, 52, 210, 69, 109, 83, 54, 215, 42, 76, 162, 241, 97, 36, 248, 189, 97, 9, 55, 59, 59, 123, 49, 16, 121, 21, 28, 143, 31, 228, 126, 236, 200, 33, 31, 175, 236, 95, 12, 83, 24, 128, 153, 92, 101, 18, 133, 115, 237, 35, 237, 145, 64, 32, 16, 8, 97, 181, 52, 165, 201, 18, 72, 227, 102, 69, 128, 203, 7, 82, 144, 203, 128, 172, 157, 41, 72, 19, 229, 21, 248, 253, 111, 144, 56, 97, 235, 1, 210, 170, 65, 63, 32, 188, 78, 137, 229, 1, 34, 33, 98, 51, 99, 144, 11, 225, 187, 122, 49, 8, 7, 163, 84, 229, 42, 56, 138, 227, 61, 19, 129, 28, 209, 180, 122, 70, 161, 101, 254, 10, 3, 122, 130, 8, 146, 64, 32, 16, 8, 132, 97, 196, 75, 154, 29, 51, 87, 2, 105, 252, 65, 145, 30, 209, 175, 12, 110, 145, 106, 151, 158, 145, 115, 8, 37, 45, 108, 4, 113, 74, 68, 133, 4, 245, 26, 200, 31, 65, 238, 131, 223, 221, 10, 114, 29, 188, 110, 131, 237, 97, 76, 226, 151, 200, 110, 51, 108, 55, 193, 246, 60, 32, 214, 243, 49, 61, 3, 53, 88, 144, 19, 232, 27, 4, 185, 1, 126, 119, 23, 108, 127, 11, 242, 34, 126, 103, 136, 239, 18, 21, 199, 53, 16, 34, 32, 71, 222, 158, 82, 148, 149, 123, 29, 94, 215, 203, 3, 160, 208, 88, 9, 4, 2, 129, 64, 8, 32, 168, 250, 204, 101, 138, 0, 150, 112, 154, 88, 48, 1, 13, 73, 166, 75, 153, 80, 251, 149, 228, 41, 19, 40, 146, 174, 44, 74, 146, 147, 137, 46, 248, 119, 161, 222, 47, 19, 162, 252, 93, 18, 49, 14, 42, 142, 35, 220, 113, 158, 145, 201, 85, 250, 249, 70, 181, 90, 157, 42, 107, 208, 92, 80, 52, 44, 129, 64, 32, 16, 8, 74, 211, 98, 92, 20, 213, 103, 198, 35, 131, 10, 13, 239, 180, 66, 206, 40, 200, 116, 64, 65, 178, 3, 97, 222, 127, 58, 66, 224, 77, 36, 2, 103, 100, 170, 48, 13, 223, 43, 8, 66, 105, 136, 243, 39, 16, 8, 4, 2, 97, 24, 114, 128, 12, 203, 33, 4, 242, 120, 60, 140, 121, 117, 170, 100, 40, 10, 173, 53, 106, 98, 150, 211, 60, 20, 228, 248, 32, 154, 115, 149, 218, 51, 21, 6, 32, 16, 8, 4, 194, 57, 80, 246, 78, 4, 130, 188, 92, 214, 180, 162, 52, 175, 206, 100, 25, 148, 124, 142, 67, 10, 243, 236, 163, 32, 59, 21, 167, 47, 23, 55, 167, 200, 85, 2, 129, 64, 32, 132, 37, 200, 120, 140, 68, 13, 74, 176, 159, 237, 228, 56, 236, 183, 148, 34, 109, 119, 41, 201, 145, 155, 222, 130, 7, 4, 2, 129, 64, 152, 193, 192, 60, 197, 120, 137, 40, 45, 160, 65, 254, 73, 50, 175, 246, 135, 41, 238, 61, 211, 101, 72, 153, 202, 33, 157, 11, 202, 15, 49, 66, 86, 121, 226, 228, 119, 36, 16, 8, 4, 66, 88, 4, 229, 62, 30, 86, 152, 87, 79, 205, 50, 243, 234, 160, 34, 224, 71, 153, 167, 249, 38, 16, 227, 77, 32, 37, 33, 180, 102, 234, 247, 72, 32, 16, 8, 132, 144, 136, 147, 205, 171, 232, 135, 195, 60, 69, 133, 121, 245, 244, 44, 210, 24, 207, 200, 132, 30, 84, 102, 238, 119, 32, 77, 102, 179, 121, 165, 242, 156, 37, 159, 35, 145, 35, 129, 64, 32, 16, 194, 98, 216, 188, 42, 181, 135, 122, 98, 150, 153, 87, 251, 37, 98, 28, 148, 205, 169, 82, 106, 202, 63, 176, 183, 163, 32, 8, 213, 202, 147, 157, 225, 157, 73, 8, 4, 2, 129, 48, 131, 48, 92, 53, 6, 8, 229, 10, 57, 21, 34, 76, 239, 196, 153, 160, 41, 202, 197, 8, 250, 149, 166, 84, 5, 49, 62, 131, 197, 213, 177, 212, 93, 70, 70, 198, 18, 229, 137, 74, 166, 100, 210, 26, 9, 4, 2, 129, 16, 181, 6, 201, 33, 153, 0, 177, 220, 166, 40, 242, 253, 254, 12, 240, 63, 14, 41, 242, 48, 207, 40, 139, 3, 40, 43, 238, 72, 239, 251, 3, 200, 167, 225, 231, 13, 193, 196, 168, 232, 0, 66, 90, 35, 129, 64, 32, 16, 162, 6, 35, 13, 236, 200, 129, 201, 243, 38, 147, 73, 153, 18, 161, 236, 136, 113, 42, 76, 79, 197, 201, 32, 67, 249, 251, 78, 135, 171, 243, 42, 29, 199, 223, 165, 190, 143, 245, 88, 220, 32, 20, 249, 75, 190, 70, 42, 0, 64, 32, 16, 8, 132, 241, 3, 131, 117, 164, 158, 138, 23, 3, 233, 124, 30, 228, 17, 212, 36, 101, 19, 102, 136, 162, 224, 193, 165, 223, 6, 130, 180, 206, 224, 250, 172, 74, 109, 240, 116, 16, 17, 158, 163, 29, 42, 235, 175, 74, 251, 123, 21, 228, 255, 48, 34, 85, 138, 182, 45, 82, 214, 143, 149, 17, 228, 103, 36, 173, 145, 64, 32, 16, 8, 177, 209, 38, 67, 16, 167, 1, 73, 19, 136, 233, 227, 216, 145, 3, 228, 57, 217, 87, 25, 161, 136, 248, 8, 145, 53, 210, 96, 77, 48, 184, 16, 185, 244, 121, 36, 203, 87, 36, 130, 190, 3, 228, 90, 144, 3, 216, 123, 18, 222, 151, 30, 234, 24, 145, 20, 195, 53, 82, 38, 16, 8, 4, 2, 33, 102, 68, 137, 154, 25, 106, 148, 225, 234, 147, 2, 25, 45, 21, 4, 33, 15, 136, 171, 22, 196, 135, 90, 29, 22, 255, 150, 210, 42, 48, 130, 244, 45, 69, 225, 241, 51, 146, 79, 19, 91, 75, 61, 143, 145, 178, 18, 249, 253, 2, 228, 7, 240, 217, 175, 0, 49, 126, 18, 251, 72, 194, 235, 75, 224, 119, 14, 212, 100, 71, 107, 196, 140, 199, 134, 199, 72, 196, 72, 32, 16, 230, 51, 254, 63, 15, 36, 16, 30, 152, 147, 247, 43, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130}} diff --git a/gui/fyne_demo/data/fyne_scene_dark.png b/gui/fyne_demo/data/fyne_scene_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2659818fa5ead6bbc9a67c7b76a595041772567a GIT binary patch literal 42648 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 literal 0 HcmV?d00001 diff --git a/gui/fyne_demo/data/fyne_scene_light.png b/gui/fyne_demo/data/fyne_scene_light.png new file mode 100644 index 0000000000000000000000000000000000000000..086a868d72ed7c36aee0bb01d624400031c613d5 GIT binary patch literal 41770 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 Yz+=Ft{+fKliU9v8$*Id$N}C1$4{D>xX#fBK literal 0 HcmV?d00001 diff --git a/gui/fyne_demo/data/gen.go b/gui/fyne_demo/data/gen.go new file mode 100644 index 0000000..18fb983 --- /dev/null +++ b/gui/fyne_demo/data/gen.go @@ -0,0 +1,57 @@ +// +build ignore + +package main + +import ( + "fmt" + "os" + "path" + "runtime" + + "fyne.io/fyne" +) + +func bundleFile(name string, filepath string, f *os.File) { + res, err := fyne.LoadResourceFromPath(filepath) + if err != nil { + fyne.LogError("Unable to load file "+filepath, err) + return + } + + _, err = f.WriteString(fmt.Sprintf("var %s = %#v\n", name, res)) + if err != nil { + fyne.LogError("Unable to write to bundled file", err) + } +} + +func openFile(filename string) *os.File { + os.Remove(filename) + _, dirname, _, _ := runtime.Caller(0) + f, err := os.Create(path.Join(path.Dir(dirname), filename)) + if err != nil { + fyne.LogError("Unable to open file "+filename, err) + return nil + } + + _, err = f.WriteString("// **** THIS FILE IS AUTO-GENERATED, PLEASE DO NOT EDIT IT **** //\n\npackage data\n\nimport \"fyne.io/fyne\"\n\n") + if err != nil { + fyne.LogError("Unable to write file "+filename, err) + return nil + } + + return f +} + +func iconDir() string { + _, dirname, _, _ := runtime.Caller(0) + return path.Join(path.Dir(dirname), "icons") +} + +func main() { + f := openFile("bundled-scene.go") + + bundleFile("fynescenedark", "fyne_scene_dark.png", f) + bundleFile("fynescenelight", "fyne_scene_light.png", f) + + f.Close() +} diff --git a/gui/fyne_demo/data/icons.go b/gui/fyne_demo/data/icons.go new file mode 100644 index 0000000..c65fcee --- /dev/null +++ b/gui/fyne_demo/data/icons.go @@ -0,0 +1,40 @@ +package data + +import ( + "fyne.io/fyne" +) + +// ThemedResource is a resource wrapper that will return an appropriate resource +// for the currently selected theme. +type ThemedResource struct { + dark, light fyne.Resource +} + +func isLight() bool { + r, g, b, _ := fyne.CurrentApp().Settings().Theme().TextColor().RGBA() + return r < 0xaaaa && g < 0xaaaa && b < 0xaaaa +} + +// Name returns the underlying resource name (used for caching) +func (res *ThemedResource) Name() string { + if isLight() { + return res.light.Name() + } + return res.dark.Name() +} + +// Content returns the underlying content of the correct resource for the current theme +func (res *ThemedResource) Content() []byte { + if isLight() { + return res.light.Content() + } + return res.dark.Content() +} + +// NewThemedResource creates a resource that adapts to the current theme setting. +func NewThemedResource(dark, light fyne.Resource) *ThemedResource { + return &ThemedResource{dark, light} +} + +// FyneScene contains the full fyne logo with background design +var FyneScene = NewThemedResource(fynescenedark, fynescenelight) diff --git a/gui/fyne_demo/main.go b/gui/fyne_demo/main.go new file mode 100644 index 0000000..d318b6b --- /dev/null +++ b/gui/fyne_demo/main.go @@ -0,0 +1,76 @@ +// Package main provides various examples of Fyne API capabilities +package main + +import ( + "fmt" + "net/url" + + "fyne.io/fyne" + "fyne.io/fyne/app" + "fyne.io/fyne/canvas" + "fyne.io/fyne/layout" + "fyne.io/fyne/theme" + "fyne.io/fyne/widget" + "github.com/cnlh/nps/gui/fyne_demo/data" + "github.com/cnlh/nps/gui/fyne_demo/screens" +) + +const preferenceCurrentTab = "currentTab" + +func welcomeScreen(a fyne.App) fyne.CanvasObject { + logo := canvas.NewImageFromResource(data.FyneScene) + logo.SetMinSize(fyne.NewSize(228, 167)) + + link, err := url.Parse("https://fyne.io/") + if err != nil { + fyne.LogError("Could not parse URL", err) + } + + return widget.NewVBox( + widget.NewLabelWithStyle("Welcome to the Fyne toolkit demo app", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}), + layout.NewSpacer(), + widget.NewHBox(layout.NewSpacer(), logo, layout.NewSpacer()), + widget.NewHyperlinkWithStyle("fyne.io", link, fyne.TextAlignCenter, fyne.TextStyle{}), + layout.NewSpacer(), + + widget.NewGroup("Theme", + fyne.NewContainerWithLayout(layout.NewGridLayout(2), + widget.NewButton("Dark", func() { + a.Settings().SetTheme(theme.DarkTheme()) + }), + widget.NewButton("Light", func() { + a.Settings().SetTheme(theme.LightTheme()) + }), + ), + ), + ) +} + +func main() { + a := app.NewWithID("io.fyne.demo") + a.SetIcon(theme.FyneLogo()) + + w := a.NewWindow("Fyne Demo") + w.SetMainMenu(fyne.NewMainMenu(fyne.NewMenu("File", + fyne.NewMenuItem("New", func() { fmt.Println("Menu New") }), + // a quit item will be appended to our first menu + ), fyne.NewMenu("Edit", + fyne.NewMenuItem("Cut", func() { fmt.Println("Menu Cut") }), + fyne.NewMenuItem("Copy", func() { fmt.Println("Menu Copy") }), + fyne.NewMenuItem("Paste", func() { fmt.Println("Menu Paste") }), + ))) + w.SetMaster() + + tabs := widget.NewTabContainer( + widget.NewTabItemWithIcon("Welcome", theme.HomeIcon(), welcomeScreen(a)), + widget.NewTabItemWithIcon("Widgets", theme.ContentCopyIcon(), screens.WidgetScreen()), + widget.NewTabItemWithIcon("Graphics", theme.DocumentCreateIcon(), screens.GraphicsScreen()), + widget.NewTabItemWithIcon("Windows", theme.ViewFullScreenIcon(), screens.DialogScreen(w)), + widget.NewTabItemWithIcon("Advanced", theme.SettingsIcon(), screens.AdvancedScreen(w))) + tabs.SetTabLocation(widget.TabLocationLeading) + tabs.SelectTabIndex(a.Preferences().Int(preferenceCurrentTab)) + w.SetContent(tabs) + + w.ShowAndRun() + a.Preferences().SetInt(preferenceCurrentTab, tabs.CurrentTabIndex()) +} diff --git a/gui/fyne_demo/screens/advanced.go b/gui/fyne_demo/screens/advanced.go new file mode 100644 index 0000000..183696e --- /dev/null +++ b/gui/fyne_demo/screens/advanced.go @@ -0,0 +1,65 @@ +package screens + +import ( + "fmt" + + "fyne.io/fyne" + "fyne.io/fyne/driver/desktop" + "fyne.io/fyne/layout" + "fyne.io/fyne/widget" +) + +func scaleString(c fyne.Canvas) string { + return fmt.Sprintf("%0.2f", c.Scale()) +} + +func prependTo(g *widget.Group, s string) { + g.Prepend(widget.NewLabel(s)) +} + +// AdvancedScreen loads a panel that shows details and settings that are a bit +// more detailed than normally needed. +func AdvancedScreen(win fyne.Window) fyne.CanvasObject { + scale := widget.NewLabel("") + + screen := widget.NewGroup("Screen", widget.NewForm( + &widget.FormItem{Text: "Scale", Widget: scale}, + )) + + scale.SetText(scaleString(win.Canvas())) + + label := widget.NewLabel("Just type...") + generic := widget.NewGroupWithScroller("Generic") + desk := widget.NewGroupWithScroller("Desktop") + + win.Canvas().SetOnTypedRune(func(r rune) { + prependTo(generic, "Rune: "+string(r)) + }) + win.Canvas().SetOnTypedKey(func(ev *fyne.KeyEvent) { + prependTo(generic, "Key : "+string(ev.Name)) + }) + if deskCanvas, ok := win.Canvas().(desktop.Canvas); ok { + deskCanvas.SetOnKeyDown(func(ev *fyne.KeyEvent) { + prependTo(desk, "KeyDown: "+string(ev.Name)) + }) + deskCanvas.SetOnKeyUp(func(ev *fyne.KeyEvent) { + prependTo(desk, "KeyUp : "+string(ev.Name)) + }) + } + + return widget.NewHBox(widget.NewVBox(screen, + widget.NewButton("Custom Theme", func() { + fyne.CurrentApp().Settings().SetTheme(newCustomTheme()) + }), + widget.NewButton("Fullscreen", func() { + win.SetFullScreen(!win.FullScreen()) + }), + ), + + fyne.NewContainerWithLayout(layout.NewBorderLayout(label, nil, nil, nil), + label, + fyne.NewContainerWithLayout(layout.NewGridLayout(2), + generic, desk, + ), + )) +} diff --git a/gui/fyne_demo/screens/graphics.go b/gui/fyne_demo/screens/graphics.go new file mode 100644 index 0000000..b54f735 --- /dev/null +++ b/gui/fyne_demo/screens/graphics.go @@ -0,0 +1,50 @@ +package screens + +import ( + "image/color" + "time" + + "fyne.io/fyne" + "fyne.io/fyne/canvas" + "fyne.io/fyne/layout" + "fyne.io/fyne/theme" +) + +func rgbGradient(x, y, w, h int) color.Color { + g := int(float32(x) / float32(w) * float32(255)) + b := int(float32(y) / float32(h) * float32(255)) + + return color.RGBA{uint8(255 - b), uint8(g), uint8(b), 0xff} +} + +// GraphicsScreen loads a graphics example panel for the demo app +func GraphicsScreen() fyne.CanvasObject { + gradient := canvas.NewHorizontalGradient(color.RGBA{0x80, 0, 0, 0xff}, color.RGBA{0, 0x80, 0, 0xff}) + go func() { + for { + time.Sleep(time.Second) + + gradient.Angle += 45 + if gradient.Angle >= 360 { + gradient.Angle -= 360 + } + canvas.Refresh(gradient) + } + }() + content := fyne.NewContainerWithLayout(layout.NewFixedGridLayout(fyne.NewSize(90, 90)), + &canvas.Rectangle{FillColor: color.RGBA{0x80, 0, 0, 0xff}, + StrokeColor: color.RGBA{0xff, 0xff, 0xff, 0xff}, + StrokeWidth: 1}, + canvas.NewImageFromResource(theme.FyneLogo()), + &canvas.Line{StrokeColor: color.RGBA{0, 0, 0x80, 0xff}, StrokeWidth: 5}, + &canvas.Circle{StrokeColor: color.RGBA{0, 0, 0x80, 0xff}, + FillColor: color.RGBA{0x30, 0x30, 0x30, 0x60}, + StrokeWidth: 2}, + canvas.NewText("Text", color.RGBA{0, 0x80, 0, 0xff}), + canvas.NewRasterWithPixels(rgbGradient), + gradient, + canvas.NewRadialGradient(color.RGBA{0x80, 0, 0, 0xff}, color.RGBA{0, 0x80, 0x80, 0xff}), + ) + + return fyne.NewContainerWithLayout(layout.NewAdaptiveGridLayout(2), content, IconsPanel()) +} diff --git a/gui/fyne_demo/screens/icons.go b/gui/fyne_demo/screens/icons.go new file mode 100644 index 0000000..b6ad643 --- /dev/null +++ b/gui/fyne_demo/screens/icons.go @@ -0,0 +1,144 @@ +package screens + +import ( + "image/color" + + "fyne.io/fyne" + "fyne.io/fyne/canvas" + "fyne.io/fyne/layout" + "fyne.io/fyne/theme" + "fyne.io/fyne/widget" +) + +type browser struct { + current int + + name *widget.Select + icon *widget.Icon +} + +func (b *browser) setIcon(index int) { + if index < 0 || index > len(icons)-1 { + return + } + b.current = index + + b.name.SetSelected(icons[index].name) + b.icon.SetResource(icons[index].icon) +} + +// IconsPanel loads a panel that shows the various icons available in Fyne +func IconsPanel() fyne.CanvasObject { + b := &browser{} + + prev := widget.NewButtonWithIcon("", theme.NavigateBackIcon(), func() { + b.setIcon(b.current - 1) + }) + next := widget.NewButtonWithIcon("", theme.NavigateNextIcon(), func() { + b.setIcon(b.current + 1) + }) + b.name = widget.NewSelect(iconList(), func(name string) { + for i, icon := range icons { + if icon.name == name { + if b.current != i { + b.setIcon(i) + } + break + } + } + }) + b.name.SetSelected(icons[b.current].name) + bar := widget.NewHBox(prev, next, b.name) + + background := canvas.NewRasterWithPixels(checkerPattern) + background.SetMinSize(fyne.NewSize(280, 280)) + b.icon = widget.NewIcon(icons[b.current].icon) + + return fyne.NewContainerWithLayout(layout.NewBorderLayout( + bar, nil, nil, nil), bar, background, b.icon) +} + +func checkerPattern(x, y, _, _ int) color.Color { + x /= 20 + y /= 20 + + if x%2 == y%2 { + return theme.BackgroundColor() + } + + return theme.ButtonColor() +} + +func iconList() []string { + var ret []string + for _, icon := range icons { + ret = append(ret, icon.name) + } + + return ret +} + +var icons = []struct { + name string + icon fyne.Resource +}{ + {"CancelIcon", theme.CancelIcon()}, + {"ConfirmIcon", theme.ConfirmIcon()}, + {"DeleteIcon", theme.DeleteIcon()}, + {"SearchIcon", theme.SearchIcon()}, + {"SearchReplaceIcon", theme.SearchReplaceIcon()}, + + {"CheckButtonIcon", theme.CheckButtonIcon()}, + {"CheckButtonCheckedIcon", theme.CheckButtonCheckedIcon()}, + {"RadioButtonIcon", theme.RadioButtonIcon()}, + {"RadioButtonCheckedIcon", theme.RadioButtonCheckedIcon()}, + + {"ContentAddIcon", theme.ContentAddIcon()}, + {"ContentRemoveIcon", theme.ContentRemoveIcon()}, + {"ContentClearIcon", theme.ContentClearIcon()}, + {"ContentCutIcon", theme.ContentCutIcon()}, + {"ContentCopyIcon", theme.ContentCopyIcon()}, + {"ContentPasteIcon", theme.ContentPasteIcon()}, + {"ContentRedoIcon", theme.ContentRedoIcon()}, + {"ContentUndoIcon", theme.ContentUndoIcon()}, + + {"InfoIcon", theme.InfoIcon()}, + {"QuestionIcon", theme.QuestionIcon()}, + {"WarningIcon", theme.WarningIcon()}, + + {"DocumentCreateIcon", theme.DocumentCreateIcon()}, + {"DocumentPrintIcon", theme.DocumentPrintIcon()}, + {"DocumentSaveIcon", theme.DocumentSaveIcon()}, + + {"FolderIcon", theme.FolderIcon()}, + {"FolderNewIcon", theme.FolderNewIcon()}, + {"FolderOpenIcon", theme.FolderOpenIcon()}, + {"HomeIcon", theme.HomeIcon()}, + {"HelpIcon", theme.HelpIcon()}, + {"SettingsIcon", theme.SettingsIcon()}, + + {"ViewFullScreenIcon", theme.ViewFullScreenIcon()}, + {"ViewRestoreIcon", theme.ViewRestoreIcon()}, + {"ViewRefreshIcon", theme.ViewRefreshIcon()}, + {"VisibilityIcon", theme.VisibilityIcon()}, + {"VisibilityOffIcon", theme.VisibilityOffIcon()}, + {"ZoomFitIcon", theme.ZoomFitIcon()}, + {"ZoomInIcon", theme.ZoomInIcon()}, + {"ZoomOutIcon", theme.ZoomOutIcon()}, + + {"MoveDownIcon", theme.MoveDownIcon()}, + {"MoveUpIcon", theme.MoveUpIcon()}, + + {"NavigateBackIcon", theme.NavigateBackIcon()}, + {"NavigateNextIcon", theme.NavigateNextIcon()}, + + {"MenuDropDown", theme.MenuDropDownIcon()}, + {"MenuDropUp", theme.MenuDropUpIcon()}, + + {"MailAttachmentIcon", theme.MailAttachmentIcon()}, + {"MailComposeIcon", theme.MailComposeIcon()}, + {"MailForwardIcon", theme.MailForwardIcon()}, + {"MailReplyIcon", theme.MailReplyIcon()}, + {"MailReplyAllIcon", theme.MailReplyAllIcon()}, + {"MailSendIcon", theme.MailSendIcon()}, +} diff --git a/gui/fyne_demo/screens/layout.go b/gui/fyne_demo/screens/layout.go new file mode 100644 index 0000000..0267e2d --- /dev/null +++ b/gui/fyne_demo/screens/layout.go @@ -0,0 +1,72 @@ +package screens + +import ( + "image/color" + + "fyne.io/fyne" + "fyne.io/fyne/canvas" + "fyne.io/fyne/layout" + "fyne.io/fyne/widget" +) + +func makeCell() fyne.CanvasObject { + rect := canvas.NewRectangle(&color.RGBA{128, 128, 128, 255}) + rect.SetMinSize(fyne.NewSize(30, 30)) + return rect +} + +func makeBorderLayout() *fyne.Container { + top := makeCell() + bottom := makeCell() + left := makeCell() + right := makeCell() + middle := widget.NewLabelWithStyle("BorderLayout", fyne.TextAlignCenter, fyne.TextStyle{}) + + borderLayout := layout.NewBorderLayout(top, bottom, left, right) + return fyne.NewContainerWithLayout(borderLayout, + top, bottom, left, right, middle) +} + +func makeBoxLayout() *fyne.Container { + top := makeCell() + bottom := makeCell() + middle := widget.NewLabel("BoxLayout") + center := makeCell() + right := makeCell() + + col := fyne.NewContainerWithLayout(layout.NewVBoxLayout(), + top, middle, bottom) + + return fyne.NewContainerWithLayout(layout.NewHBoxLayout(), + col, center, right) +} + +func makeFixedGridLayout() *fyne.Container { + box1 := makeCell() + box2 := widget.NewLabel("FixedGrid") + box3 := makeCell() + box4 := makeCell() + + return fyne.NewContainerWithLayout(layout.NewFixedGridLayout(fyne.NewSize(75, 75)), + box1, box2, box3, box4) +} + +func makeGridLayout() *fyne.Container { + box1 := makeCell() + box2 := widget.NewLabel("Grid") + box3 := makeCell() + box4 := makeCell() + + return fyne.NewContainerWithLayout(layout.NewGridLayout(2), + box1, box2, box3, box4) +} + +// LayoutPanel loads a panel that shows the layouts available for a container +func LayoutPanel() fyne.CanvasObject { + return widget.NewTabContainer( + widget.NewTabItem("Border", makeBorderLayout()), + widget.NewTabItem("Box", makeBoxLayout()), + widget.NewTabItem("Fixed Grid", makeFixedGridLayout()), + widget.NewTabItem("Grid", makeGridLayout()), + ) +} diff --git a/gui/fyne_demo/screens/theme.go b/gui/fyne_demo/screens/theme.go new file mode 100644 index 0000000..1aad0be --- /dev/null +++ b/gui/fyne_demo/screens/theme.go @@ -0,0 +1,118 @@ +package screens + +import ( + "image/color" + + "fyne.io/fyne" + "fyne.io/fyne/theme" +) + +var ( + purple = &color.RGBA{R: 128, G: 0, B: 128, A: 255} + orange = &color.RGBA{R: 198, G: 123, B: 0, A: 255} + grey = &color.Gray{Y: 123} +) + +// customTheme is a simple demonstration of a bespoke theme loaded by a Fyne app. +type customTheme struct { +} + +func (customTheme) BackgroundColor() color.Color { + return purple +} + +func (customTheme) ButtonColor() color.Color { + return color.Black +} + +func (customTheme) DisabledButtonColor() color.Color { + return color.White +} + +func (customTheme) HyperlinkColor() color.Color { + return orange +} + +func (customTheme) TextColor() color.Color { + return color.White +} + +func (customTheme) DisabledTextColor() color.Color { + return color.Black +} + +func (customTheme) IconColor() color.Color { + return color.White +} + +func (customTheme) DisabledIconColor() color.Color { + return color.Black +} + +func (customTheme) PlaceHolderColor() color.Color { + return grey +} + +func (customTheme) PrimaryColor() color.Color { + return orange +} + +func (customTheme) HoverColor() color.Color { + return orange +} + +func (customTheme) FocusColor() color.Color { + return orange +} + +func (customTheme) ScrollBarColor() color.Color { + return grey +} + +func (customTheme) ShadowColor() color.Color { + return &color.RGBA{0xcc, 0xcc, 0xcc, 0xcc} +} + +func (customTheme) TextSize() int { + return 12 +} + +func (customTheme) TextFont() fyne.Resource { + return theme.DefaultTextBoldFont() +} + +func (customTheme) TextBoldFont() fyne.Resource { + return theme.DefaultTextBoldFont() +} + +func (customTheme) TextItalicFont() fyne.Resource { + return theme.DefaultTextBoldItalicFont() +} + +func (customTheme) TextBoldItalicFont() fyne.Resource { + return theme.DefaultTextBoldItalicFont() +} + +func (customTheme) TextMonospaceFont() fyne.Resource { + return theme.DefaultTextMonospaceFont() +} + +func (customTheme) Padding() int { + return 10 +} + +func (customTheme) IconInlineSize() int { + return 20 +} + +func (customTheme) ScrollBarSize() int { + return 10 +} + +func (customTheme) ScrollBarSmallSize() int { + return 5 +} + +func newCustomTheme() fyne.Theme { + return &customTheme{} +} diff --git a/gui/fyne_demo/screens/widget.go b/gui/fyne_demo/screens/widget.go new file mode 100644 index 0000000..ddc47f7 --- /dev/null +++ b/gui/fyne_demo/screens/widget.go @@ -0,0 +1,157 @@ +package screens + +import ( + "fmt" + "time" + + "fyne.io/fyne" + "fyne.io/fyne/canvas" + "fyne.io/fyne/layout" + "fyne.io/fyne/theme" + "fyne.io/fyne/widget" +) + +func makeButtonTab() fyne.Widget { + disabled := widget.NewButton("Disabled", func() {}) + disabled.Disable() + + return widget.NewVBox( + widget.NewLabel("Text label"), + widget.NewButton("Text button", func() { fmt.Println("tapped text button") }), + widget.NewButtonWithIcon("With icon", theme.ConfirmIcon(), func() { fmt.Println("tapped icon button") }), + disabled, + ) +} + +func makeInputTab() fyne.Widget { + entry := widget.NewEntry() + entry.SetPlaceHolder("Entry") + entryReadOnly := widget.NewEntry() + entryReadOnly.SetText("Entry (disabled)") + entryReadOnly.Disable() + + disabledCheck := widget.NewCheck("Disabled check", func(bool) {}) + disabledCheck.Disable() + radio := widget.NewRadio([]string{"Radio Item 1", "Radio Item 2"}, func(s string) { fmt.Println("selected", s) }) + radio.Horizontal = true + disabledRadio := widget.NewRadio([]string{"Disabled radio"}, func(string) {}) + disabledRadio.Disable() + + return widget.NewVBox( + entry, + entryReadOnly, + widget.NewSelect([]string{"Option 1", "Option 2", "Option 3"}, func(s string) { fmt.Println("selected", s) }), + widget.NewCheck("Check", func(on bool) { fmt.Println("checked", on) }), + disabledCheck, + radio, + disabledRadio, + widget.NewSlider(0, 100), + ) +} + +func makeProgressTab() fyne.Widget { + progress := widget.NewProgressBar() + infProgress := widget.NewProgressBarInfinite() + + go func() { + num := 0.0 + for num < 1.0 { + time.Sleep(100 * time.Millisecond) + progress.SetValue(num) + num += 0.01 + } + + progress.SetValue(1) + }() + + return widget.NewVBox( + widget.NewLabel("Percent"), progress, + widget.NewLabel("Infinite"), infProgress) +} + +func makeFormTab() fyne.Widget { + name := widget.NewEntry() + name.SetPlaceHolder("John Smith") + email := widget.NewEntry() + email.SetPlaceHolder("test@example.com") + password := widget.NewPasswordEntry() + password.SetPlaceHolder("Password") + largeText := widget.NewMultiLineEntry() + + form := &widget.Form{ + OnCancel: func() { + fmt.Println("Cancelled") + }, + OnSubmit: func() { + fmt.Println("Form submitted") + fmt.Println("Name:", name.Text) + fmt.Println("Email:", email.Text) + fmt.Println("Password:", password.Text) + fmt.Println("Message:", largeText.Text) + }, + } + form.Append("Name", name) + form.Append("Email", email) + form.Append("Password", password) + form.Append("Message", largeText) + + return form +} + +func makeScrollTab() fyne.CanvasObject { + logo := canvas.NewImageFromResource(theme.FyneLogo()) + logo.SetMinSize(fyne.NewSize(320, 320)) + list := widget.NewHBox() + list2 := widget.NewVBox() + + for i := 1; i <= 20; i++ { + index := i // capture + list.Append(widget.NewButton(fmt.Sprintf("Button %d", index), func() { + fmt.Println("Tapped", index) + })) + list2.Append(widget.NewButton(fmt.Sprintf("Button %d", index), func() { + fmt.Println("Tapped", index) + })) + } + + scroll := widget.NewScrollContainer(list) + scroll.Resize(fyne.NewSize(200, 300)) + + scroll2 := widget.NewScrollContainer(list2) + scroll2.Resize(fyne.NewSize(200, 100)) + + return fyne.NewContainerWithLayout(layout.NewGridLayout(1), scroll, scroll2) +} + +func makeScrollBothTab() fyne.CanvasObject { + logo := canvas.NewImageFromResource(theme.FyneLogo()) + logo.SetMinSize(fyne.NewSize(800, 800)) + + scroll := widget.NewScrollContainer(logo) + scroll.Resize(fyne.NewSize(400, 400)) + + return scroll +} + +// WidgetScreen shows a panel containing widget demos +func WidgetScreen() fyne.CanvasObject { + toolbar := widget.NewToolbar(widget.NewToolbarAction(theme.MailComposeIcon(), func() { fmt.Println("New") }), + widget.NewToolbarSeparator(), + widget.NewToolbarSpacer(), + widget.NewToolbarAction(theme.ContentCutIcon(), func() { fmt.Println("Cut") }), + widget.NewToolbarAction(theme.ContentCopyIcon(), func() { fmt.Println("Copy") }), + widget.NewToolbarAction(theme.ContentPasteIcon(), func() { fmt.Println("Paste") }), + ) + + return fyne.NewContainerWithLayout(layout.NewBorderLayout(toolbar, nil, nil, nil), + toolbar, + widget.NewTabContainer( + widget.NewTabItem("Buttons", makeButtonTab()), + widget.NewTabItem("Input", makeInputTab()), + widget.NewTabItem("Progress", makeProgressTab()), + widget.NewTabItem("Form", makeFormTab()), + widget.NewTabItem("Scroll", makeScrollTab()), + widget.NewTabItem("Full Scroll", makeScrollBothTab()), + ), + ) +} diff --git a/gui/fyne_demo/screens/window.go b/gui/fyne_demo/screens/window.go new file mode 100644 index 0000000..7a1d63a --- /dev/null +++ b/gui/fyne_demo/screens/window.go @@ -0,0 +1,84 @@ +package screens + +import ( + "errors" + "fmt" + "time" + + "fyne.io/fyne" + "fyne.io/fyne/dialog" + "fyne.io/fyne/layout" + "fyne.io/fyne/widget" +) + +func confirmCallback(response bool) { + fmt.Println("Responded with", response) +} + +// DialogScreen loads a panel that lists the dialog windows that can be tested. +func DialogScreen(win fyne.Window) fyne.CanvasObject { + dialogs := widget.NewGroup("Dialogs", + widget.NewButton("Info", func() { + dialog.ShowInformation("Information", "You should know this thing...", win) + }), + widget.NewButton("Error", func() { + err := errors.New("A dummy error message") + dialog.ShowError(err, win) + }), + widget.NewButton("Confirm", func() { + cnf := dialog.NewConfirm("Confirmation", "Are you enjoying this demo?", confirmCallback, win) + cnf.SetDismissText("Nah") + cnf.SetConfirmText("Oh Yes!") + cnf.Show() + }), + widget.NewButton("Progress", func() { + prog := dialog.NewProgress("MyProgress", "Nearly there...", win) + + go func() { + num := 0.0 + for num < 1.0 { + time.Sleep(50 * time.Millisecond) + prog.SetValue(num) + num += 0.01 + } + + prog.SetValue(1) + prog.Hide() + }() + + prog.Show() + }), + widget.NewButton("Custom", func() { + content := widget.NewEntry() + content.SetPlaceHolder("Type something here") + content.OnChanged = func(text string) { + fmt.Println("Entered", text) + } + dialog.ShowCustom("Custom dialog", "Done", content, win) + }), + ) + + windows := widget.NewVBox(dialogs, widget.NewGroup("Windows", + widget.NewButton("New window", func() { + w := fyne.CurrentApp().NewWindow("Hello") + w.SetContent(widget.NewLabel("Hello World!")) + w.Show() + }), + widget.NewButton("Fixed size window", func() { + w := fyne.CurrentApp().NewWindow("Fixed") + w.SetContent(fyne.NewContainerWithLayout(layout.NewCenterLayout(), widget.NewLabel("Hello World!"))) + + w.Resize(fyne.NewSize(240, 180)) + w.SetFixedSize(true) + w.Show() + }), + widget.NewButton("Centered window", func() { + w := fyne.CurrentApp().NewWindow("Central") + w.SetContent(fyne.NewContainerWithLayout(layout.NewCenterLayout(), widget.NewLabel("Hello World!"))) + + w.CenterOnScreen() + w.Show() + }))) + + return fyne.NewContainerWithLayout(layout.NewAdaptiveGridLayout(2), windows, LayoutPanel()) +} From 58257be867dbbc076ed6f5a7ac1d0f1973fb44e5 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 16 Dec 2019 14:11:22 +0800 Subject: [PATCH 111/171] add gowin --- cmd/npc/npc.go | 2 +- go.mod | 1 + go.sum | 2 ++ lib/install/install.go | 6 +++--- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index 7de5850..45fa226 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -32,7 +32,7 @@ var ( localType = flag.String("local_type", "p2p", "p2p target") logPath = flag.String("log_path", "", "npc log path") debug = flag.Bool("debug", false, "npc debug") - srv = flag.String("service", "", "npc debug") + srv = flag.String("service", "", "service option") ) func main() { diff --git a/go.mod b/go.mod index 6677778..18cfc2e 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/klauspost/cpuid v1.2.1 // indirect github.com/klauspost/pgzip v1.2.1 // indirect github.com/klauspost/reedsolomon v1.9.2 // indirect + github.com/luisiturrios/gowin v0.0.0-20150312095849-89dcf1aa3c14 // indirect github.com/panjf2000/ants/v2 v2.2.2 github.com/pkg/errors v0.8.1 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect diff --git a/go.sum b/go.sum index 78b5fc7..10b69da 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,8 @@ github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQ github.com/klauspost/reedsolomon v1.9.2 h1:E9CMS2Pqbv+C7tsrYad4YC9MfhnMVWhMRsTi7U0UB18= github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/luisiturrios/gowin v0.0.0-20150312095849-89dcf1aa3c14 h1:v2RpRAI7mSnyET19MZUU+3mi8S21HZHk2vBDYp1CClA= +github.com/luisiturrios/gowin v0.0.0-20150312095849-89dcf1aa3c14/go.mod h1:I2wAi7YNrvMJWpvtZ7MOn1Q7B46zYRQKC8vXZF478z8= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= diff --git a/lib/install/install.go b/lib/install/install.go index 4d769d7..ef07d95 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -154,7 +154,7 @@ func CopyDir(srcPath string, destPath string) error { destNewPath := strings.Replace(path, srcPath, destPath, -1) log.Println("copy file ::" + path + " to " + destNewPath) copyFile(path, destNewPath) - if !common.IsWindows(){ + if !common.IsWindows() { chMod(destNewPath, 0766) } } @@ -210,8 +210,8 @@ func pathExists(path string) (bool, error) { return false, err } -func chMod(name string, mode os.FileMode) { - if !common.IsWindows(){ +func chMod(name string, mode os.FileMode) { + if !common.IsWindows() { os.Chmod(name, mode) } } From 186f2e228dae16a857189c0db4b5c2bec536b7b3 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 16 Dec 2019 17:15:05 +0800 Subject: [PATCH 112/171] add npc install and update --- cmd/npc/npc.go | 9 ++++- cmd/nps/nps.go | 2 +- go.mod | 5 ++- go.sum | 8 ++-- lib/install/install.go | 84 +++++++++++++++++++++++++++--------------- 5 files changed, 71 insertions(+), 37 deletions(-) diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index 45fa226..d4ec4bd 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -9,6 +9,7 @@ import ( "github.com/cnlh/nps/lib/common" "github.com/cnlh/nps/lib/config" "github.com/cnlh/nps/lib/file" + "github.com/cnlh/nps/lib/install" "github.com/cnlh/nps/lib/version" "github.com/kardianos/service" "os" @@ -90,6 +91,9 @@ func main() { case "register": flag.CommandLine.Parse(os.Args[2:]) client.RegisterLocalIp(*serverAddr, *verifyKey, *connType, *proxyUrl, *registerTime) + case "update": + install.UpdateNpc() + return case "nat": nat, host, err := stun.NewClient().Discover() if err != nil || host == nil { @@ -102,6 +106,9 @@ func main() { } if *srv != "" { + if *srv == "install" { + install.InstallNpc() + } err := service.Control(s, *srv) if err != nil { logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) @@ -116,7 +123,7 @@ type npc struct { } func (p *npc) Start(s service.Service) error { - p.run() + go p.run() return nil } func (p *npc) Stop(s service.Service) error { diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 508cd40..95ddf9c 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -101,7 +101,7 @@ func main() { } return case "update": - install.Update() + install.UpdateNps() return default: logs.Error("command is not support") diff --git a/go.mod b/go.mod index 18cfc2e..141d73c 100644 --- a/go.mod +++ b/go.mod @@ -6,16 +6,17 @@ require ( fyne.io/fyne v1.2.0 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/astaxie/beego v1.12.0 + github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c // indirect github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c github.com/ccding/go-stun v0.0.0-20180726100737-be486d185f3d github.com/dsnet/compress v0.0.1 // indirect github.com/go-ole/go-ole v1.2.4 // indirect github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db - github.com/kardianos/service v1.0.0 // indirect + github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 // indirect + github.com/kardianos/service v1.0.0 github.com/klauspost/cpuid v1.2.1 // indirect github.com/klauspost/pgzip v1.2.1 // indirect github.com/klauspost/reedsolomon v1.9.2 // indirect - github.com/luisiturrios/gowin v0.0.0-20150312095849-89dcf1aa3c14 // indirect github.com/panjf2000/ants/v2 v2.2.2 github.com/pkg/errors v0.8.1 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect diff --git a/go.sum b/go.sum index 10b69da..a1c8f67 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkK github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= +github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c h1:FUUopH4brHNO2kJoNN3pV+OBEYmgraLT/KHZrMM69r0= +github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo= github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c h1:aprLqMn7gSPT+vdDSl+/E6NLEuArwD/J7IWd8bJt5lQ= github.com/c4milo/unpackit v0.0.0-20170704181138-4ed373e9ef1c/go.mod h1:Ie6SubJv/NTO9Q0UBH0QCl3Ve50lu9hjbi5YJUw03TE= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= @@ -31,8 +33,6 @@ github.com/exfly/beego v1.12.0-export-init h1:VQNYKdXhAwZGUaFmQv8Aj921O3rQJZRIF8 github.com/exfly/beego v1.12.0-export-init/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gen2brain/go-unarr v0.0.0-20190203132630-dd30f8db8e40 h1:rnd7FAy39Y3+YOboqzQmGj62n9lJMoMr1TlIc1FTd/o= -github.com/gen2brain/go-unarr v0.0.0-20190203132630-dd30f8db8e40/go.mod h1:29wlntTq0xoOBDzoKlxLhCDh/G2GqMBam0P17/tMslE= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f h1:7MsFMbSn8Lcw0blK4+NEOf8DuHoOBDhJsHz04yh13pM= @@ -47,6 +47,8 @@ github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBs github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 h1:WgfvpuKg42WVLkxNwzfFraXkTXPK36bMqXvMFN67clI= +github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214/go.mod h1:kj6hFWqfwSjFjLnYW5PK1DoxZ4O0uapwHRmd9jhln4E= github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= github.com/josephspurrier/goversioninfo v0.0.0-20190124120936-8611f5a5ff3f/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= github.com/kardianos/service v1.0.0 h1:HgQS3mFfOlyntWX8Oke98JcJLqt1DBcHR4kxShpYef0= @@ -61,8 +63,6 @@ github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQ github.com/klauspost/reedsolomon v1.9.2 h1:E9CMS2Pqbv+C7tsrYad4YC9MfhnMVWhMRsTi7U0UB18= github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/luisiturrios/gowin v0.0.0-20150312095849-89dcf1aa3c14 h1:v2RpRAI7mSnyET19MZUU+3mi8S21HZHk2vBDYp1CClA= -github.com/luisiturrios/gowin v0.0.0-20150312095849-89dcf1aa3c14/go.mod h1:I2wAi7YNrvMJWpvtZ7MOn1Q7B46zYRQKC8vXZF478z8= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= diff --git a/lib/install/install.go b/lib/install/install.go index ef07d95..66bb28b 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -16,15 +16,25 @@ import ( "strings" ) -func Update() { - downloadLatest() +func UpdateNps() { + destPath := downloadLatest("server") + //复制文件到对应目录 + copyStaticFile(destPath, "nps") + fmt.Println("Update completed, please restart") +} + +func UpdateNpc() { + destPath := downloadLatest("client") + //复制文件到对应目录 + copyStaticFile(destPath, "npc") + fmt.Println("Update completed, please restart") } type release struct { TagName string `json:"tag_name"` } -func downloadLatest() { +func downloadLatest(bin string) string { // get version data, err := http.Get("https://api.github.com/repos/cnlh/nps/releases/latest") if err != nil { @@ -38,7 +48,7 @@ func downloadLatest() { json.Unmarshal(b, &rl) version := rl.TagName fmt.Println("the latest version is", version) - filename := runtime.GOOS + "_" + runtime.GOARCH + "_server" + ".tar.gz" + filename := runtime.GOOS + "_" + runtime.GOARCH + "_" + bin + ".tar.gz" // download latest package downloadUrl := fmt.Sprintf("https://github.com/cnlh/nps/releases/download/%s/%s", version, filename) fmt.Println("download package from ", downloadUrl) @@ -50,47 +60,63 @@ func downloadLatest() { if err != nil { log.Fatal(err) } - destPath = strings.Replace(destPath, "/web", "", -1) - destPath = strings.Replace(destPath, `\web`, "", -1) - destPath = strings.Replace(destPath, "/views", "", -1) - destPath = strings.Replace(destPath, `\views`, "", -1) - //复制文件到对应目录 - copyStaticFile(destPath) - fmt.Println("Update completed, please restart") + if bin == "server" { + destPath = strings.Replace(destPath, "/web", "", -1) + destPath = strings.Replace(destPath, `\web`, "", -1) + destPath = strings.Replace(destPath, "/views", "", -1) + destPath = strings.Replace(destPath, `\views`, "", -1) + } else { + destPath = strings.Replace(destPath, `\conf`, "", -1) + destPath = strings.Replace(destPath, "/conf", "", -1) + } + return destPath } -func copyStaticFile(srcPath string) string { +func copyStaticFile(srcPath, bin string) string { path := common.GetInstallPath() - //复制文件到对应目录 - if err := CopyDir(filepath.Join(srcPath, "web", "views"), filepath.Join(path, "web", "views")); err != nil { - log.Fatalln(err) + if bin == "nps" { + //复制文件到对应目录 + if err := CopyDir(filepath.Join(srcPath, "web", "views"), filepath.Join(path, "web", "views")); err != nil { + log.Fatalln(err) + } + chMod(filepath.Join(path, "web", "views"), 0766) + if err := CopyDir(filepath.Join(srcPath, "web", "static"), filepath.Join(path, "web", "static")); err != nil { + log.Fatalln(err) + } + chMod(filepath.Join(path, "web", "static"), 0766) } - chMod(filepath.Join(path, "web", "views"), 0766) - if err := CopyDir(filepath.Join(srcPath, "web", "static"), filepath.Join(path, "web", "static")); err != nil { - log.Fatalln(err) - } - chMod(filepath.Join(path, "web", "static"), 0766) binPath, _ := filepath.Abs(os.Args[0]) if !common.IsWindows() { - if _, err := copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/nps"); err != nil { - if _, err := copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/nps"); err != nil { + if _, err := copyFile(filepath.Join(srcPath, bin), "/usr/bin/"+bin); err != nil { + if _, err := copyFile(filepath.Join(srcPath, bin), "/usr/local/bin/"+bin); err != nil { log.Fatalln(err) } else { - copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/nps-update") - binPath = "/usr/local/bin/nps" + copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/"+bin+"-update") + binPath = "/usr/local/bin/" + bin } } else { - copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/nps-update") - binPath = "/usr/bin/nps" + copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/"+bin+"-update") + binPath = "/usr/bin/" + bin } } else { - copyFile(filepath.Join(srcPath, "nps.exe"), filepath.Join(common.GetAppPath(), "nps-update.exe")) - copyFile(filepath.Join(srcPath, "nps.exe"), filepath.Join(common.GetAppPath(), "nps.exe")) + copyFile(filepath.Join(srcPath, bin+".exe"), filepath.Join(common.GetAppPath(), bin+"-update.exe")) + copyFile(filepath.Join(srcPath, bin+".exe"), filepath.Join(common.GetAppPath(), bin+".exe")) } chMod(binPath, 0755) return binPath } +func InstallNpc() { + path := common.GetInstallPath() + if !common.FileExists(path) { + err := os.Mkdir(path, 0755) + if err != nil { + log.Fatal(err) + } + } + copyStaticFile(common.GetAppPath(), "npc") +} + func InstallNps() string { path := common.GetInstallPath() if common.FileExists(path) { @@ -103,7 +129,7 @@ func InstallNps() string { } chMod(filepath.Join(path, "conf"), 0766) } - binPath := copyStaticFile(common.GetAppPath()) + binPath := copyStaticFile(common.GetAppPath(), "nps") log.Println("install ok!") log.Println("Static files and configuration files in the current directory will be useless") log.Println("The new configuration file is located in", path, "you can edit them") From a59a0922ca420e31c9442222ee77894431776c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 21:28:38 +0800 Subject: [PATCH 113/171] change android file path --- gui/npc/npc.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/gui/npc/npc.go b/gui/npc/npc.go index 46369ac..0c55ed4 100644 --- a/gui/npc/npc.go +++ b/gui/npc/npc.go @@ -122,12 +122,7 @@ func getDir() (dir string, err error) { return } } else { - dir, err = os.UserHomeDir() - if err != nil { - return - } - dir = path.Dir(dir) - dir = path.Join(dir, "files") + dir = "/data/data/org.nps.client/files" } return } From 29ec73c80b8517e16100102beb99db0166bb87ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 22:18:49 +0800 Subject: [PATCH 114/171] add Proxy-Authirization on basic auth --- lib/common/util.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/common/util.go b/lib/common/util.go index 67f58cb..1db0d27 100755 --- a/lib/common/util.go +++ b/lib/common/util.go @@ -51,7 +51,10 @@ func DomainCheck(domain string) bool { func CheckAuth(r *http.Request, user, passwd string) bool { s := strings.SplitN(r.Header.Get("Authorization"), " ", 2) if len(s) != 2 { - return false + s = strings.SplitN(r.Header.Get("Proxy-Authorization"), " ", 2) + if len(s) != 2 { + return false + } } b, err := base64.StdEncoding.DecodeString(s[1]) From 31af2bb6db618ef04a59429d70473872a3122368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 22:20:54 +0800 Subject: [PATCH 115/171] remove unused files --- build.bash | 136 -------------------- gui/fyne_demo/data/bundled-scene.go | 14 --- gui/fyne_demo/data/fyne_scene_dark.png | Bin 42648 -> 0 bytes gui/fyne_demo/data/fyne_scene_light.png | Bin 41770 -> 0 bytes gui/fyne_demo/data/gen.go | 57 --------- gui/fyne_demo/data/icons.go | 40 ------ gui/fyne_demo/main.go | 76 ------------ gui/fyne_demo/screens/advanced.go | 65 ---------- gui/fyne_demo/screens/graphics.go | 50 -------- gui/fyne_demo/screens/icons.go | 144 ---------------------- gui/fyne_demo/screens/layout.go | 72 ----------- gui/fyne_demo/screens/theme.go | 118 ------------------ gui/fyne_demo/screens/widget.go | 157 ------------------------ gui/fyne_demo/screens/window.go | 84 ------------- 14 files changed, 1013 deletions(-) delete mode 100755 build.bash delete mode 100644 gui/fyne_demo/data/bundled-scene.go delete mode 100644 gui/fyne_demo/data/fyne_scene_dark.png delete mode 100644 gui/fyne_demo/data/fyne_scene_light.png delete mode 100644 gui/fyne_demo/data/gen.go delete mode 100644 gui/fyne_demo/data/icons.go delete mode 100644 gui/fyne_demo/main.go delete mode 100644 gui/fyne_demo/screens/advanced.go delete mode 100644 gui/fyne_demo/screens/graphics.go delete mode 100644 gui/fyne_demo/screens/icons.go delete mode 100644 gui/fyne_demo/screens/layout.go delete mode 100644 gui/fyne_demo/screens/theme.go delete mode 100644 gui/fyne_demo/screens/widget.go delete mode 100644 gui/fyne_demo/screens/window.go diff --git a/build.bash b/build.bash deleted file mode 100755 index b7296ca..0000000 --- a/build.bash +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/bash -CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_amd64_client.tar.gz npc conf/npc.conf - -CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_386_client.tar.gz npc conf/npc.conf - -CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf freebsd_386_client.tar.gz npc conf/npc.conf - -CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf freebsd_amd64_client.tar.gz npc conf/npc.conf - -CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf freebsd_arm_client.tar.gz npc conf/npc.conf - -CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_arm_client.tar.gz npc conf/npc.conf - - -CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_arm64_client.tar.gz npc conf/npc.conf - - -CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_mips64_client.tar.gz npc conf/npc.conf - - -CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_mips64le_client.tar.gz npc conf/npc.conf - - -CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_mipsle_client.tar.gz npc conf/npc.conf - - -CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf linux_mips_client.tar.gz npc conf/npc.conf - - -CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf win_386_client.tar.gz npc.exe conf/npc.conf - - -CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf win_amd64_client.tar.gz npc.exe conf/npc.conf - - -CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -upx npc -tar -czvf macos_client.tar.gz npc conf/npc.conf - - - -CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - -CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - -CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_arm64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=freebsd GOARCH=arm go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf freebsd_arm_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf freebsd_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf freebsd_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - -CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_mips_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_mips64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_mips64le_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=linux GOARCH=mipsle go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - - -CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps -tar -czvf macos_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps - - -CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps.exe -tar -czvf win_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe - - -CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -upx nps.exe -tar -czvf win_386_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps.exe - diff --git a/gui/fyne_demo/data/bundled-scene.go b/gui/fyne_demo/data/bundled-scene.go deleted file mode 100644 index f4e06d5..0000000 --- a/gui/fyne_demo/data/bundled-scene.go +++ /dev/null @@ -1,14 +0,0 @@ -// **** THIS FILE IS AUTO-GENERATED, PLEASE DO NOT EDIT IT **** // - -package data - -import "fyne.io/fyne" - -var fynescenedark = &fyne.StaticResource{ - StaticName: "fyne_scene_dark.png", - StaticContent: []byte{ - 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1, 201, 0, 0, 1, 79, 8, 6, 0, 0, 0, 38, 214, 53, 180, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 150, 101, 88, 73, 102, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 26, 0, 5, 0, 0, 0, 1, 0, 0, 0, 74, 1, 27, 0, 5, 0, 0, 0, 1, 0, 0, 0, 82, 1, 49, 0, 2, 0, 0, 0, 17, 0, 0, 0, 90, 135, 105, 0, 4, 0, 0, 0, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 0, 0, 0, 3, 160, 1, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 160, 2, 0, 4, 0, 0, 0, 1, 0, 0, 1, 201, 160, 3, 0, 4, 0, 0, 0, 1, 0, 0, 1, 79, 0, 0, 0, 0, 52, 31, 119, 147, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 18, 116, 0, 0, 18, 116, 1, 222, 102, 31, 120, 0, 0, 1, 203, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 24, 203, 85, 88, 0, 0, 163, 196, 73, 68, 65, 84, 120, 218, 236, 93, 7, 124, 20, 69, 251, 62, 154, 88, 63, 253, 252, 44, 127, 123, 239, 138, 5, 20, 129, 16, 58, 82, 44, 32, 32, 189, 215, 16, 16, 66, 239, 6, 164, 131, 32, 69, 148, 222, 68, 16, 164, 73, 239, 72, 239, 189, 247, 78, 32, 189, 222, 237, 109, 153, 255, 188, 115, 51, 199, 176, 94, 114, 151, 100, 47, 112, 199, 251, 252, 126, 227, 197, 144, 219, 219, 155, 221, 157, 103, 222, 246, 188, 54, 27, 2, 129, 64, 220, 33, 16, 66, 114, 209, 145, 143, 142, 252, 116, 220, 71, 71, 110, 47, 127, 251, 56, 29, 111, 208, 81, 140, 142, 234, 116, 180, 166, 163, 47, 29, 227, 232, 152, 77, 199, 74, 58, 182, 210, 177, 159, 142, 147, 116, 92, 162, 35, 150, 142, 84, 58, 20, 58, 52, 58, 116, 254, 115, 10, 29, 209, 116, 92, 160, 227, 40, 29, 123, 232, 216, 64, 199, 98, 58, 166, 209, 241, 19, 29, 61, 232, 104, 74, 199, 87, 116, 124, 206, 63, 251, 81, 58, 242, 192, 57, 227, 21, 68, 32, 16, 8, 132, 213, 196, 152, 155, 19, 226, 125, 233, 252, 59, 252, 219, 43, 116, 148, 161, 35, 140, 147, 213, 223, 156, 248, 162, 232, 80, 201, 157, 3, 144, 109, 28, 39, 223, 138, 252, 124, 243, 224, 85, 69, 32, 16, 8, 68, 86, 45, 197, 92, 220, 242, 202, 235, 201, 82, 164, 191, 123, 158, 142, 202, 116, 244, 161, 227, 47, 58, 142, 209, 145, 236, 133, 172, 12, 78, 150, 138, 105, 56, 249, 80, 37, 171, 81, 231, 127, 111, 120, 56, 134, 206, 255, 78, 227, 239, 113, 74, 199, 114, 240, 225, 228, 255, 174, 72, 239, 13, 147, 191, 35, 94, 105, 4, 2, 129, 64, 100, 134, 28, 243, 112, 55, 106, 30, 15, 255, 246, 28, 119, 149, 142, 166, 99, 55, 29, 73, 25, 144, 161, 42, 17, 150, 34, 145, 159, 145, 131, 214, 163, 46, 17, 228, 121, 58, 62, 64, 130, 68, 32, 16, 8, 68, 86, 172, 70, 112, 149, 230, 51, 253, 30, 126, 247, 25, 29, 189, 233, 216, 204, 99, 129, 233, 89, 134, 178, 37, 168, 231, 48, 25, 154, 207, 135, 72, 164, 12, 88, 67, 199, 127, 248, 119, 202, 159, 81, 252, 20, 129, 64, 32, 16, 8, 51, 57, 230, 146, 126, 7, 36, 82, 138, 199, 19, 143, 167, 99, 33, 202, 46, 81, 227, 14, 18, 98, 122, 112, 74, 63, 255, 36, 147, 62, 94, 117, 4, 2, 129, 64, 120, 35, 70, 72, 192, 201, 107, 250, 125, 65, 58, 134, 210, 113, 194, 131, 101, 38, 226, 123, 119, 27, 25, 122, 130, 28, 127, 108, 32, 125, 191, 188, 120, 245, 17, 8, 4, 2, 145, 30, 57, 230, 230, 177, 70, 217, 106, 124, 140, 142, 22, 116, 108, 241, 64, 54, 34, 150, 168, 147, 192, 128, 28, 127, 188, 2, 164, 207, 191, 99, 62, 204, 98, 69, 32, 16, 8, 68, 70, 150, 99, 126, 19, 57, 190, 67, 199, 72, 94, 107, 104, 118, 165, 58, 3, 136, 24, 137, 135, 248, 227, 122, 32, 127, 254, 61, 243, 99, 130, 14, 2, 129, 64, 32, 210, 35, 200, 124, 114, 146, 10, 253, 57, 148, 142, 185, 233, 16, 140, 65, 2, 19, 114, 252, 113, 148, 252, 221, 241, 14, 64, 32, 16, 8, 132, 39, 114, 204, 35, 187, 24, 233, 207, 229, 232, 88, 229, 193, 157, 170, 147, 192, 134, 28, 127, 108, 44, 125, 95, 140, 63, 34, 16, 8, 4, 226, 95, 228, 152, 87, 38, 8, 250, 115, 8, 29, 107, 131, 144, 28, 229, 248, 227, 53, 58, 62, 149, 44, 103, 140, 63, 34, 16, 8, 4, 226, 54, 114, 204, 37, 235, 145, 242, 152, 227, 95, 166, 12, 85, 127, 196, 26, 141, 59, 80, 2, 162, 73, 241, 199, 127, 64, 19, 150, 127, 231, 251, 48, 254, 136, 64, 32, 16, 8, 79, 214, 99, 110, 254, 51, 100, 171, 14, 151, 72, 75, 231, 49, 71, 35, 11, 150, 154, 102, 146, 122, 147, 229, 227, 84, 137, 172, 50, 146, 135, 83, 44, 22, 24, 144, 227, 143, 99, 165, 57, 192, 248, 35, 2, 129, 64, 32, 254, 101, 61, 230, 147, 254, 191, 33, 29, 87, 77, 110, 85, 111, 86, 160, 46, 17, 169, 156, 33, 234, 111, 87, 105, 86, 4, 9, 228, 248, 99, 51, 121, 147, 128, 119, 3, 2, 129, 64, 32, 108, 158, 44, 39, 250, 243, 107, 116, 172, 54, 145, 163, 230, 69, 92, 220, 233, 133, 16, 99, 232, 56, 194, 143, 59, 141, 139, 12, 116, 229, 53, 149, 181, 233, 168, 2, 157, 52, 232, 40, 79, 71, 89, 158, 24, 4, 255, 95, 149, 142, 250, 116, 132, 211, 241, 3, 111, 131, 181, 136, 142, 93, 188, 118, 209, 233, 165, 140, 67, 182, 58, 229, 115, 22, 4, 9, 157, 68, 62, 151, 44, 104, 140, 63, 34, 16, 8, 4, 226, 54, 130, 148, 99, 143, 237, 164, 246, 83, 154, 169, 21, 149, 97, 138, 227, 121, 74, 216, 129, 191, 57, 195, 137, 236, 7, 78, 114, 239, 211, 241, 95, 63, 156, 247, 131, 116, 188, 202, 73, 245, 123, 58, 38, 115, 242, 140, 203, 32, 49, 199, 33, 125, 39, 16, 60, 120, 130, 31, 11, 227, 143, 8, 4, 2, 129, 184, 141, 100, 114, 11, 11, 146, 190, 190, 104, 202, 90, 117, 102, 144, 228, 162, 152, 126, 7, 214, 216, 124, 110, 237, 125, 148, 145, 158, 169, 144, 175, 75, 103, 228, 241, 48, 210, 251, 187, 92, 25, 124, 198, 255, 113, 139, 244, 7, 94, 166, 18, 237, 225, 123, 252, 42, 253, 61, 234, 175, 34, 16, 8, 4, 226, 54, 34, 145, 203, 58, 106, 75, 61, 27, 149, 116, 172, 67, 179, 85, 9, 221, 59, 230, 240, 54, 87, 79, 120, 56, 126, 30, 209, 76, 57, 189, 222, 145, 22, 124, 135, 92, 82, 27, 174, 251, 210, 75, 182, 225, 164, 249, 37, 111, 199, 5, 58, 178, 109, 60, 205, 3, 2, 129, 64, 32, 16, 183, 89, 78, 244, 231, 223, 188, 36, 230, 168, 38, 114, 4, 87, 106, 103, 104, 142, 236, 193, 66, 20, 164, 152, 231, 14, 126, 183, 92, 156, 148, 243, 123, 178, 16, 165, 172, 221, 92, 24, 127, 68, 32, 16, 8, 132, 153, 64, 242, 243, 159, 193, 189, 186, 55, 157, 216, 163, 220, 169, 67, 0, 44, 176, 38, 38, 11, 84, 118, 157, 230, 186, 75, 191, 179, 124, 142, 185, 37, 43, 23, 251, 63, 34, 16, 8, 4, 226, 54, 178, 200, 195, 127, 134, 204, 209, 36, 201, 122, 52, 50, 40, 174, 143, 225, 201, 60, 178, 94, 107, 62, 126, 188, 92, 1, 54, 7, 185, 48, 57, 7, 129, 64, 32, 16, 102, 114, 144, 53, 87, 219, 122, 113, 175, 202, 9, 59, 51, 232, 120, 90, 122, 47, 118, 192, 64, 32, 16, 8, 68, 80, 17, 164, 92, 255, 248, 115, 6, 217, 171, 114, 237, 32, 36, 241, 212, 48, 145, 35, 198, 239, 16, 8, 4, 2, 17, 84, 4, 41, 39, 232, 252, 229, 161, 79, 162, 39, 130, 220, 7, 241, 74, 97, 129, 98, 246, 39, 2, 129, 64, 32, 130, 214, 130, 228, 217, 166, 27, 164, 242, 14, 195, 3, 65, 10, 171, 114, 161, 39, 130, 69, 32, 16, 8, 4, 34, 232, 44, 72, 250, 250, 176, 148, 193, 234, 72, 71, 82, 78, 16, 228, 20, 36, 72, 4, 2, 129, 64, 4, 59, 65, 138, 18, 143, 199, 184, 86, 42, 192, 238, 69, 224, 123, 170, 217, 2, 69, 32, 16, 8, 4, 34, 88, 45, 72, 32, 200, 227, 62, 18, 228, 98, 233, 253, 24, 127, 68, 32, 16, 8, 68, 80, 18, 164, 136, 65, 62, 44, 89, 144, 14, 47, 4, 121, 80, 46, 176, 199, 89, 68, 32, 16, 8, 68, 48, 18, 100, 94, 241, 74, 199, 110, 47, 4, 41, 148, 117, 210, 160, 131, 134, 76, 176, 8, 4, 2, 129, 64, 4, 37, 65, 242, 159, 215, 122, 33, 72, 67, 42, 255, 168, 199, 223, 147, 31, 103, 17, 129, 64, 32, 16, 193, 72, 144, 110, 105, 56, 250, 250, 135, 23, 130, 148, 5, 4, 230, 73, 150, 39, 42, 232, 32, 16, 8, 4, 34, 120, 173, 72, 250, 58, 52, 131, 58, 72, 185, 233, 48, 225, 154, 173, 207, 240, 247, 161, 155, 21, 129, 64, 32, 16, 65, 73, 144, 34, 147, 181, 133, 36, 74, 110, 248, 96, 69, 70, 200, 239, 71, 32, 16, 8, 4, 34, 216, 8, 82, 212, 66, 150, 240, 96, 41, 102, 68, 144, 199, 177, 69, 20, 2, 129, 64, 32, 130, 153, 32, 69, 169, 199, 179, 188, 141, 149, 39, 177, 114, 115, 178, 142, 200, 104, 173, 201, 223, 139, 245, 144, 8, 4, 2, 129, 8, 58, 130, 148, 123, 58, 110, 243, 33, 81, 71, 174, 137, 220, 227, 233, 56, 8, 4, 2, 129, 64, 4, 11, 73, 138, 68, 157, 145, 62, 18, 164, 92, 242, 81, 87, 182, 68, 17, 8, 4, 2, 129, 8, 38, 130, 20, 137, 58, 85, 125, 76, 212, 145, 133, 3, 142, 75, 110, 90, 84, 214, 65, 32, 16, 8, 68, 80, 90, 144, 207, 208, 145, 32, 145, 164, 55, 136, 191, 233, 200, 223, 143, 194, 1, 8, 4, 2, 129, 8, 42, 130, 148, 5, 3, 86, 153, 226, 140, 222, 92, 173, 128, 120, 58, 158, 148, 201, 22, 129, 64, 32, 16, 136, 96, 33, 73, 225, 102, 109, 43, 185, 80, 13, 31, 72, 82, 100, 188, 78, 228, 239, 199, 88, 36, 2, 129, 64, 32, 130, 138, 32, 133, 155, 245, 117, 41, 73, 71, 37, 190, 65, 212, 77, 22, 69, 43, 18, 129, 64, 32, 16, 193, 72, 146, 102, 55, 171, 221, 71, 130, 20, 86, 228, 94, 156, 69, 4, 2, 129, 64, 4, 35, 65, 138, 108, 212, 198, 62, 8, 6, 152, 33, 172, 206, 206, 104, 69, 34, 16, 8, 4, 34, 216, 8, 50, 15, 127, 125, 92, 82, 213, 209, 125, 36, 72, 77, 114, 203, 190, 37, 31, 15, 129, 64, 32, 16, 136, 96, 178, 34, 39, 100, 195, 138, 92, 47, 29, 15, 21, 118, 16, 8, 4, 2, 17, 20, 4, 41, 178, 89, 63, 247, 81, 188, 60, 61, 157, 214, 8, 153, 112, 17, 8, 4, 2, 129, 8, 116, 130, 148, 181, 89, 215, 103, 162, 38, 210, 236, 106, 5, 203, 243, 93, 36, 73, 4, 2, 129, 64, 4, 19, 73, 138, 146, 143, 106, 18, 233, 233, 153, 32, 73, 97, 69, 238, 240, 68, 188, 8, 4, 2, 129, 64, 4, 42, 65, 138, 114, 15, 80, 216, 57, 146, 5, 43, 82, 38, 201, 254, 252, 88, 216, 88, 25, 129, 64, 32, 16, 65, 65, 146, 34, 89, 167, 121, 22, 9, 82, 86, 225, 9, 69, 146, 68, 32, 16, 8, 68, 176, 89, 145, 249, 232, 184, 144, 9, 1, 115, 79, 10, 59, 151, 232, 120, 64, 88, 165, 56, 187, 8, 4, 2, 129, 8, 116, 146, 204, 207, 95, 219, 102, 82, 122, 206, 147, 171, 117, 14, 63, 22, 10, 8, 32, 16, 8, 4, 34, 224, 9, 82, 8, 7, 228, 167, 227, 108, 22, 173, 72, 185, 150, 178, 185, 176, 74, 113, 118, 17, 8, 4, 2, 17, 232, 36, 41, 234, 34, 91, 102, 162, 153, 114, 70, 241, 200, 119, 100, 242, 69, 32, 16, 8, 4, 34, 208, 173, 72, 200, 104, 61, 152, 5, 117, 29, 179, 171, 245, 56, 198, 33, 17, 8, 4, 2, 17, 44, 36, 41, 234, 34, 191, 205, 134, 21, 41, 75, 209, 77, 65, 43, 18, 129, 64, 32, 16, 193, 70, 150, 107, 77, 100, 151, 213, 120, 100, 83, 153, 124, 17, 8, 4, 2, 129, 8, 84, 98, 20, 174, 214, 194, 82, 92, 49, 43, 86, 164, 156, 228, 243, 33, 90, 146, 8, 4, 2, 129, 8, 6, 146, 20, 226, 1, 147, 178, 40, 30, 96, 182, 34, 207, 209, 241, 16, 63, 38, 198, 37, 17, 8, 4, 2, 17, 176, 4, 153, 155, 191, 62, 77, 71, 146, 135, 12, 213, 172, 196, 35, 23, 74, 199, 207, 133, 179, 140, 64, 32, 16, 136, 64, 37, 73, 33, 30, 208, 62, 27, 226, 1, 130, 88, 133, 37, 217, 155, 31, 19, 227, 145, 8, 4, 2, 129, 8, 108, 43, 146, 255, 188, 59, 27, 226, 1, 66, 138, 78, 88, 160, 149, 249, 49, 81, 68, 0, 129, 64, 32, 16, 1, 75, 146, 66, 60, 160, 88, 22, 154, 42, 167, 151, 180, 147, 66, 199, 171, 72, 146, 8, 4, 2, 129, 8, 100, 130, 204, 37, 213, 70, 142, 202, 134, 120, 128, 89, 68, 224, 176, 148, 45, 139, 153, 173, 8, 4, 2, 129, 8, 72, 146, 20, 68, 246, 48, 207, 70, 181, 138, 36, 231, 137, 227, 99, 210, 14, 2, 129, 64, 4, 135, 69, 149, 235, 30, 252, 222, 194, 138, 172, 44, 185, 89, 245, 108, 144, 164, 102, 74, 218, 193, 254, 145, 8, 4, 2, 17, 224, 68, 145, 219, 211, 207, 247, 210, 119, 151, 106, 35, 29, 217, 32, 72, 89, 124, 224, 27, 126, 220, 252, 120, 135, 33, 16, 8, 68, 224, 146, 68, 30, 79, 86, 229, 189, 98, 61, 243, 215, 71, 232, 184, 154, 205, 210, 15, 185, 174, 18, 220, 181, 111, 241, 99, 99, 210, 14, 2, 129, 64, 4, 40, 73, 184, 23, 112, 195, 48, 86, 210, 255, 63, 74, 199, 243, 247, 138, 69, 41, 197, 35, 43, 90, 64, 144, 114, 70, 236, 69, 58, 30, 184, 23, 45, 115, 4, 2, 129, 8, 70, 130, 92, 45, 45, 244, 101, 210, 179, 48, 131, 112, 14, 68, 60, 242, 183, 108, 202, 208, 153, 227, 145, 27, 144, 32, 17, 8, 4, 34, 8, 8, 146, 254, 188, 6, 86, 245, 196, 196, 68, 59, 95, 224, 139, 223, 11, 36, 41, 185, 90, 243, 210, 113, 54, 155, 2, 2, 102, 205, 214, 113, 230, 121, 70, 32, 16, 8, 68, 128, 17, 164, 166, 105, 172, 29, 212, 218, 181, 107, 237, 139, 22, 45, 98, 241, 52, 85, 85, 67, 239, 17, 146, 20, 98, 230, 69, 178, 169, 211, 234, 137, 36, 219, 240, 99, 99, 102, 43, 2, 129, 64, 4, 50, 65, 238, 220, 185, 211, 78, 255, 215, 88, 182, 108, 25, 139, 167, 217, 237, 246, 123, 133, 36, 133, 86, 107, 164, 69, 241, 72, 217, 18, 45, 43, 172, 84, 188, 235, 16, 8, 4, 34, 64, 9, 114, 219, 182, 109, 142, 247, 223, 127, 159, 60, 242, 200, 35, 198, 202, 149, 43, 239, 25, 146, 148, 107, 66, 233, 235, 63, 22, 185, 90, 13, 137, 108, 133, 28, 29, 198, 36, 17, 8, 4, 34, 144, 8, 210, 48, 12, 70, 144, 219, 183, 111, 87, 158, 126, 250, 105, 82, 189, 122, 117, 242, 127, 255, 247, 127, 198, 242, 229, 203, 239, 37, 146, 20, 174, 214, 23, 32, 28, 155, 77, 173, 86, 179, 21, 121, 153, 142, 7, 5, 25, 227, 221, 135, 64, 32, 16, 129, 99, 65, 174, 19, 22, 228, 147, 79, 62, 73, 190, 250, 234, 43, 82, 179, 102, 77, 2, 220, 121, 143, 145, 164, 112, 181, 86, 247, 32, 2, 144, 85, 136, 204, 216, 205, 72, 144, 8, 4, 2, 17, 88, 4, 153, 139, 90, 144, 130, 32, 237, 96, 65, 2, 65, 86, 169, 82, 133, 84, 173, 90, 149, 228, 201, 147, 231, 158, 33, 201, 116, 4, 205, 173, 136, 71, 10, 165, 158, 105, 193, 190, 201, 64, 32, 16, 136, 160, 34, 72, 106, 65, 174, 135, 213, 123, 235, 214, 173, 142, 167, 158, 122, 138, 17, 228, 55, 223, 124, 67, 42, 85, 170, 68, 170, 85, 171, 70, 114, 229, 202, 117, 47, 145, 100, 30, 233, 231, 157, 22, 8, 154, 155, 73, 178, 23, 63, 54, 38, 237, 32, 16, 8, 196, 93, 78, 144, 54, 65, 144, 212, 130, 84, 158, 120, 226, 137, 219, 8, 178, 114, 229, 202, 247, 34, 73, 10, 43, 242, 101, 58, 146, 45, 180, 36, 197, 49, 106, 163, 37, 137, 64, 32, 16, 1, 64, 144, 134, 97, 184, 45, 200, 255, 253, 239, 127, 255, 34, 200, 123, 156, 36, 191, 177, 168, 235, 135, 57, 233, 167, 40, 146, 36, 2, 129, 64, 220, 221, 4, 153, 75, 34, 72, 187, 236, 98, 173, 88, 177, 162, 155, 32, 239, 81, 146, 20, 122, 173, 3, 44, 146, 162, 147, 173, 200, 84, 176, 80, 3, 125, 254, 106, 212, 168, 145, 167, 96, 193, 130, 249, 224, 21, 159, 42, 4, 2, 17, 116, 4, 169, 105, 218, 6, 97, 65, 138, 44, 86, 179, 5, 153, 30, 73, 170, 170, 122, 175, 200, 210, 173, 178, 160, 53, 150, 89, 105, 231, 60, 52, 111, 230, 199, 15, 212, 26, 201, 219, 178, 114, 75, 150, 44, 137, 177, 85, 4, 2, 17, 124, 4, 9, 49, 200, 244, 92, 172, 94, 44, 201, 146, 252, 152, 247, 193, 66, 15, 100, 25, 68, 67, 184, 90, 31, 179, 168, 53, 150, 185, 252, 99, 187, 16, 42, 224, 154, 176, 1, 53, 63, 27, 54, 108, 96, 243, 211, 162, 69, 139, 103, 202, 149, 43, 215, 149, 142, 55, 184, 101, 137, 242, 122, 8, 4, 34, 240, 9, 210, 48, 12, 183, 5, 249, 248, 227, 143, 123, 37, 72, 79, 36, 153, 150, 150, 246, 217, 61, 48, 103, 239, 121, 80, 202, 177, 34, 179, 245, 247, 32, 153, 162, 31, 31, 123, 236, 49, 242, 201, 39, 159, 156, 110, 208, 160, 193, 115, 72, 148, 8, 4, 34, 160, 9, 50, 50, 50, 50, 55, 181, 32, 55, 194, 42, 189, 101, 203, 22, 187, 156, 197, 106, 142, 65, 122, 34, 201, 251, 238, 187, 79, 214, 110, 173, 23, 27, 27, 251, 66, 114, 114, 242, 123, 73, 73, 73, 111, 7, 211, 80, 20, 229, 189, 212, 212, 212, 103, 232, 215, 236, 108, 161, 21, 233, 118, 183, 234, 186, 62, 53, 58, 58, 250, 89, 152, 59, 58, 222, 9, 164, 185, 113, 56, 28, 111, 69, 69, 69, 125, 64, 191, 198, 211, 131, 7, 15, 158, 222, 179, 103, 79, 82, 166, 76, 25, 242, 206, 59, 239, 92, 234, 210, 165, 203, 179, 72, 148, 8, 4, 34, 24, 8, 146, 101, 177, 126, 253, 245, 215, 94, 45, 72, 153, 36, 225, 112, 107, 215, 174, 37, 38, 245, 153, 96, 30, 132, 90, 221, 196, 74, 240, 227, 233, 65, 50, 63, 236, 123, 28, 57, 114, 68, 129, 123, 227, 211, 79, 63, 117, 19, 37, 221, 116, 229, 199, 167, 15, 129, 64, 4, 146, 139, 117, 35, 119, 177, 42, 255, 253, 239, 127, 51, 69, 144, 48, 224, 111, 11, 21, 42, 68, 70, 143, 30, 77, 246, 236, 217, 3, 177, 76, 178, 99, 199, 142, 160, 29, 116, 158, 8, 181, 242, 136, 63, 136, 242, 228, 201, 147, 100, 243, 230, 205, 208, 89, 37, 32, 231, 6, 206, 27, 206, 255, 212, 169, 83, 238, 239, 116, 224, 192, 1, 70, 148, 5, 11, 22, 188, 212, 164, 73, 19, 36, 74, 4, 2, 17, 24, 4, 9, 201, 33, 212, 130, 252, 71, 88, 144, 64, 144, 190, 196, 32, 205, 3, 254, 22, 136, 245, 243, 207, 63, 103, 22, 37, 29, 70, 48, 14, 144, 222, 131, 215, 215, 94, 123, 205, 136, 143, 143, 183, 140, 36, 229, 99, 80, 171, 158, 205, 223, 155, 111, 190, 25, 144, 115, 244, 202, 43, 175, 176, 215, 177, 99, 199, 18, 158, 233, 44, 136, 210, 193, 137, 242, 114, 171, 86, 173, 48, 70, 137, 64, 32, 238, 110, 130, 156, 59, 119, 110, 30, 186, 56, 11, 130, 180, 67, 146, 142, 176, 32, 189, 197, 32, 51, 34, 74, 112, 189, 6, 227, 248, 246, 219, 111, 73, 173, 90, 181, 72, 104, 104, 40, 233, 219, 183, 175, 165, 22, 164, 56, 150, 195, 225, 32, 221, 186, 117, 35, 37, 74, 148, 32, 117, 235, 214, 101, 159, 25, 104, 115, 84, 167, 78, 29, 82, 160, 64, 1, 50, 125, 250, 116, 194, 99, 172, 108, 0, 14, 30, 60, 104, 231, 174, 215, 203, 61, 123, 246, 68, 162, 68, 32, 16, 119, 63, 65, 110, 222, 188, 217, 33, 19, 100, 102, 44, 72, 79, 227, 203, 47, 191, 12, 202, 1, 243, 242, 221, 119, 223, 17, 168, 25, 157, 52, 105, 146, 165, 174, 86, 65, 34, 9, 9, 9, 164, 94, 189, 122, 164, 100, 201, 146, 140, 112, 2, 109, 62, 97, 142, 160, 109, 218, 243, 207, 63, 79, 166, 78, 157, 234, 158, 35, 24, 18, 81, 50, 139, 242, 179, 207, 62, 187, 28, 17, 17, 241, 28, 186, 94, 17, 8, 196, 93, 69, 144, 144, 164, 35, 89, 144, 202, 163, 143, 62, 106, 25, 65, 6, 243, 0, 235, 154, 183, 4, 35, 43, 86, 172, 184, 141, 220, 172, 34, 201, 171, 87, 175, 50, 130, 132, 207, 10, 196, 235, 1, 231, 13, 22, 229, 51, 207, 60, 227, 38, 73, 241, 221, 76, 68, 169, 152, 93, 175, 72, 148, 8, 4, 226, 142, 225, 232, 209, 163, 247, 73, 4, 185, 73, 88, 144, 72, 144, 153, 115, 39, 215, 168, 81, 131, 145, 228, 190, 125, 251, 252, 66, 146, 39, 78, 156, 32, 47, 191, 252, 50, 107, 63, 6, 177, 225, 64, 156, 163, 244, 72, 210, 252, 93, 133, 69, 249, 201, 39, 159, 92, 193, 24, 37, 2, 129, 184, 147, 22, 164, 80, 136, 201, 35, 17, 164, 29, 10, 189, 179, 19, 131, 188, 215, 6, 184, 19, 97, 174, 222, 127, 255, 125, 114, 225, 194, 5, 191, 184, 91, 33, 59, 20, 46, 21, 144, 113, 160, 110, 36, 188, 145, 164, 108, 81, 30, 58, 116, 200, 29, 163, 236, 210, 165, 203, 243, 72, 148, 8, 4, 34, 167, 9, 82, 104, 167, 66, 153, 199, 102, 97, 65, 62, 248, 224, 131, 104, 65, 102, 114, 241, 7, 235, 174, 108, 217, 178, 236, 53, 46, 46, 206, 82, 146, 20, 199, 89, 190, 124, 57, 35, 73, 112, 235, 6, 226, 117, 241, 133, 36, 61, 16, 165, 136, 81, 94, 105, 219, 182, 237, 243, 232, 122, 69, 32, 16, 57, 69, 144, 185, 249, 235, 67, 116, 81, 218, 3, 11, 210, 186, 117, 235, 88, 44, 168, 106, 213, 170, 140, 36, 145, 32, 51, 183, 248, 83, 139, 135, 124, 255, 253, 247, 44, 11, 213, 31, 36, 9, 25, 161, 130, 36, 3, 209, 186, 247, 68, 146, 233, 205, 145, 167, 24, 37, 184, 94, 155, 53, 107, 134, 68, 137, 64, 32, 114, 148, 36, 239, 151, 220, 172, 206, 231, 158, 123, 142, 89, 144, 96, 17, 33, 73, 250, 190, 248, 67, 102, 235, 171, 175, 190, 74, 6, 15, 30, 236, 94, 248, 173, 22, 18, 24, 54, 108, 24, 121, 229, 149, 87, 152, 187, 53, 216, 73, 210, 236, 106, 22, 22, 229, 199, 31, 127, 236, 182, 40, 209, 245, 138, 64, 32, 114, 132, 40, 1, 116, 177, 98, 109, 157, 118, 237, 218, 229, 0, 162, 132, 24, 27, 16, 37, 198, 35, 125, 91, 252, 193, 186, 203, 147, 39, 143, 123, 241, 183, 90, 72, 64, 81, 20, 18, 17, 17, 193, 172, 85, 40, 255, 8, 22, 119, 171, 183, 57, 242, 228, 122, 45, 88, 176, 224, 149, 14, 29, 58, 188, 128, 68, 137, 64, 32, 114, 130, 40, 243, 72, 68, 185, 18, 22, 163, 157, 59, 119, 218, 95, 120, 225, 5, 182, 176, 33, 81, 250, 54, 192, 146, 132, 233, 92, 186, 116, 169, 95, 92, 173, 137, 137, 137, 236, 51, 64, 16, 60, 80, 99, 197, 89, 33, 73, 51, 81, 30, 62, 124, 152, 17, 101, 161, 66, 133, 174, 10, 162, 68, 215, 43, 2, 129, 240, 55, 81, 230, 51, 19, 37, 181, 40, 21, 176, 40, 5, 81, 162, 235, 53, 227, 204, 86, 33, 226, 14, 186, 180, 86, 150, 127, 8, 18, 185, 118, 237, 26, 41, 82, 164, 8, 43, 253, 128, 207, 11, 150, 236, 86, 95, 55, 19, 38, 139, 82, 225, 174, 215, 171, 141, 27, 55, 70, 162, 68, 32, 16, 57, 75, 148, 154, 166, 185, 137, 18, 44, 74, 225, 122, 69, 162, 244, 60, 132, 158, 237, 107, 175, 189, 70, 142, 29, 59, 230, 183, 26, 201, 167, 158, 122, 138, 145, 76, 160, 94, 7, 79, 98, 2, 153, 181, 184, 205, 22, 37, 16, 101, 235, 214, 173, 209, 245, 138, 64, 32, 114, 156, 40, 87, 136, 24, 229, 203, 47, 191, 108, 96, 140, 50, 227, 46, 39, 48, 47, 165, 74, 149, 34, 87, 174, 92, 241, 11, 73, 202, 53, 146, 129, 74, 146, 194, 146, 124, 246, 217, 103, 51, 44, 1, 201, 172, 235, 181, 96, 193, 130, 87, 187, 118, 237, 250, 34, 18, 37, 2, 129, 184, 83, 68, 105, 127, 233, 165, 151, 178, 21, 163, 132, 5, 18, 200, 4, 22, 121, 208, 239, 12, 166, 81, 187, 118, 109, 246, 29, 27, 53, 106, 68, 68, 247, 15, 171, 73, 18, 164, 238, 32, 179, 181, 126, 253, 250, 44, 113, 39, 16, 231, 9, 8, 18, 132, 217, 63, 250, 232, 35, 50, 99, 198, 140, 44, 199, 110, 77, 68, 201, 92, 175, 133, 10, 21, 186, 214, 174, 93, 187, 23, 209, 245, 138, 64, 32, 238, 20, 81, 42, 32, 76, 45, 10, 231, 179, 217, 42, 43, 168, 198, 139, 47, 190, 200, 94, 27, 54, 108, 232, 174, 145, 180, 58, 38, 57, 106, 212, 40, 246, 25, 80, 102, 18, 200, 115, 5, 68, 15, 175, 162, 85, 86, 86, 231, 201, 19, 81, 126, 252, 241, 199, 215, 90, 180, 104, 129, 68, 137, 64, 32, 114, 156, 40, 151, 195, 98, 180, 123, 247, 110, 5, 8, 1, 136, 15, 4, 7, 50, 211, 116, 153, 46, 96, 100, 220, 184, 113, 176, 160, 177, 198, 203, 123, 247, 238, 13, 154, 1, 90, 173, 116, 19, 65, 142, 31, 63, 238, 183, 26, 73, 104, 182, 12, 159, 1, 159, 21, 232, 115, 5, 141, 151, 207, 158, 61, 107, 201, 60, 9, 162, 60, 114, 228, 8, 115, 189, 82, 43, 213, 109, 81, 162, 235, 21, 129, 64, 220, 9, 162, 116, 64, 227, 220, 204, 196, 40, 69, 230, 231, 154, 53, 107, 8, 2, 97, 117, 29, 41, 189, 55, 111, 35, 202, 79, 62, 249, 228, 90, 199, 142, 29, 95, 66, 139, 18, 129, 64, 220, 49, 162, 132, 110, 20, 194, 245, 234, 141, 40, 33, 134, 246, 240, 195, 15, 51, 237, 81, 0, 44, 106, 162, 217, 110, 48, 13, 171, 173, 71, 79, 238, 69, 241, 26, 200, 115, 100, 245, 92, 201, 174, 87, 74, 148, 162, 205, 214, 181, 240, 240, 112, 36, 74, 4, 2, 145, 179, 68, 73, 23, 164, 101, 178, 235, 213, 151, 24, 37, 88, 146, 15, 60, 240, 128, 229, 125, 22, 17, 136, 140, 136, 242, 195, 15, 63, 188, 222, 180, 105, 83, 36, 74, 4, 2, 145, 227, 22, 37, 35, 202, 61, 123, 246, 40, 96, 81, 122, 139, 81, 34, 73, 34, 114, 10, 226, 222, 58, 122, 244, 40, 115, 189, 22, 40, 80, 224, 186, 176, 40, 49, 70, 137, 64, 32, 252, 10, 74, 138, 110, 162, 84, 85, 85, 16, 165, 227, 181, 215, 94, 51, 4, 81, 122, 114, 189, 34, 73, 34, 114, 210, 162, 52, 199, 40, 129, 40, 91, 181, 106, 245, 50, 220, 183, 5, 11, 22, 204, 135, 79, 50, 2, 129, 240, 167, 69, 153, 87, 114, 189, 46, 21, 68, 9, 165, 9, 233, 197, 40, 145, 36, 17, 119, 144, 40, 21, 78, 148, 81, 13, 26, 52, 96, 89, 175, 37, 75, 150, 204, 139, 79, 50, 2, 129, 200, 17, 162, 164, 139, 145, 32, 74, 5, 4, 7, 128, 32, 205, 49, 74, 36, 73, 196, 157, 128, 32, 202, 147, 39, 79, 42, 31, 126, 248, 33, 41, 92, 184, 112, 28, 37, 200, 183, 145, 40, 17, 8, 68, 142, 186, 94, 101, 162, 52, 199, 40, 133, 248, 55, 146, 36, 226, 78, 37, 242, 236, 223, 191, 95, 121, 247, 221, 119, 65, 204, 226, 124, 233, 210, 165, 95, 66, 146, 68, 32, 16, 119, 194, 162, 92, 2, 11, 210, 222, 189, 123, 111, 139, 81, 10, 189, 206, 251, 239, 191, 31, 73, 18, 145, 227, 4, 185, 115, 231, 78, 209, 90, 235, 100, 251, 246, 237, 31, 67, 130, 68, 32, 16, 119, 156, 40, 121, 50, 15, 35, 72, 32, 74, 24, 15, 61, 244, 16, 146, 36, 34, 167, 9, 210, 14, 183, 104, 225, 194, 133, 79, 70, 68, 68, 60, 142, 4, 137, 64, 32, 238, 38, 139, 82, 17, 130, 3, 53, 107, 214, 36, 185, 114, 229, 66, 146, 68, 228, 184, 5, 9, 4, 217, 173, 91, 183, 255, 194, 189, 137, 37, 32, 8, 4, 226, 110, 33, 202, 191, 5, 81, 130, 69, 9, 138, 59, 64, 152, 66, 113, 7, 73, 18, 145, 19, 4, 89, 180, 104, 209, 147, 97, 97, 97, 140, 32, 81, 76, 0, 129, 64, 220, 149, 68, 185, 111, 223, 62, 71, 161, 66, 133, 72, 254, 252, 249, 201, 170, 85, 171, 144, 36, 17, 57, 66, 144, 33, 33, 33, 39, 34, 35, 35, 31, 71, 11, 18, 129, 64, 220, 245, 68, 121, 224, 192, 1, 182, 112, 45, 91, 198, 244, 7, 136, 170, 170, 65, 167, 219, 234, 47, 4, 163, 198, 173, 149, 243, 38, 19, 228, 142, 29, 59, 236, 220, 130, 60, 49, 104, 208, 32, 116, 177, 34, 16, 136, 187, 159, 40, 233, 34, 182, 24, 22, 176, 205, 155, 55, 43, 127, 255, 253, 55, 154, 61, 8, 191, 88, 144, 219, 183, 111, 103, 27, 177, 34, 69, 138, 156, 16, 46, 86, 36, 72, 4, 2, 145, 29, 34, 203, 149, 83, 68, 73, 127, 102, 68, 153, 156, 156, 172, 208, 23, 45, 37, 37, 69, 141, 143, 143, 55, 18, 19, 19, 73, 124, 66, 2, 161, 63, 7, 236, 136, 139, 139, 131, 239, 229, 55, 18, 72, 76, 74, 98, 159, 145, 153, 115, 74, 160, 115, 10, 115, 75, 7, 204, 177, 70, 135, 154, 153, 65, 223, 111, 240, 247, 251, 253, 250, 136, 130, 127, 43, 8, 146, 90, 144, 199, 69, 153, 7, 198, 32, 17, 8, 68, 182, 8, 140, 142, 60, 116, 228, 206, 65, 139, 114, 145, 88, 224, 38, 79, 158, 44, 58, 213, 235, 47, 61, 255, 28, 249, 162, 76, 41, 82, 182, 100, 9, 82, 46, 128, 70, 153, 208, 226, 164, 202, 87, 95, 178, 239, 49, 115, 198, 12, 247, 194, 109, 9, 57, 242, 197, 223, 158, 150, 70, 194, 91, 181, 34, 239, 189, 246, 10, 249, 186, 82, 69, 82, 182, 68, 104, 186, 231, 83, 182, 100, 40, 41, 95, 186, 20, 41, 92, 240, 19, 49, 183, 6, 116, 105, 249, 250, 235, 175, 89, 157, 234, 23, 95, 124, 65, 42, 84, 168, 192, 20, 145, 60, 13, 248, 119, 168, 109, 165, 214, 23, 144, 13, 123, 63, 28, 231, 101, 122, 125, 202, 149, 178, 102, 206, 224, 26, 151, 47, 85, 146, 157, 231, 135, 5, 62, 96, 202, 76, 49, 49, 49, 153, 142, 83, 123, 34, 200, 144, 144, 144, 227, 152, 197, 138, 64, 32, 178, 109, 61, 154, 44, 188, 92, 57, 73, 148, 14, 135, 3, 130, 146, 187, 191, 171, 94, 61, 178, 91, 247, 238, 155, 214, 173, 93, 75, 198, 79, 156, 164, 189, 94, 225, 43, 242, 201, 215, 213, 72, 65, 58, 62, 9, 144, 241, 225, 151, 85, 73, 153, 218, 245, 41, 153, 60, 73, 150, 173, 94, 99, 105, 66, 146, 56, 78, 44, 181, 32, 75, 214, 172, 71, 94, 46, 87, 153, 20, 171, 94, 139, 124, 252, 213, 183, 30, 207, 5, 230, 237, 179, 42, 53, 200, 11, 244, 239, 34, 7, 13, 38, 43, 87, 44, 55, 150, 45, 93, 74, 70, 141, 30, 125, 148, 78, 123, 127, 58, 134, 83, 130, 156, 244, 254, 251, 239, 255, 242, 234, 171, 175, 142, 125, 231, 157, 119, 126, 121, 235, 173, 183, 216, 128, 159, 95, 120, 225, 133, 49, 161, 161, 161, 227, 139, 21, 43, 246, 27, 253, 219, 200, 250, 13, 27, 206, 158, 61, 103, 142, 182, 122, 229, 74, 50, 125, 230, 76, 163, 120, 141, 218, 228, 131, 202, 85, 73, 161, 111, 170, 103, 121, 190, 62, 230, 231, 248, 74, 121, 74, 196, 45, 90, 147, 150, 97, 173, 201, 71, 5, 10, 100, 154, 36, 77, 4, 41, 98, 144, 199, 35, 35, 35, 31, 67, 130, 68, 32, 16, 150, 16, 164, 166, 105, 213, 232, 66, 51, 80, 250, 183, 60, 126, 254, 236, 60, 252, 53, 55, 127, 125, 152, 142, 179, 176, 208, 141, 251, 115, 190, 246, 98, 203, 246, 164, 124, 231, 222, 164, 68, 135, 30, 1, 51, 66, 35, 122, 144, 47, 187, 253, 64, 108, 181, 155, 145, 93, 135, 142, 184, 22, 122, 139, 44, 73, 93, 119, 29, 231, 210, 181, 235, 228, 141, 176, 14, 236, 243, 202, 118, 234, 149, 225, 249, 148, 238, 216, 147, 20, 105, 215, 141, 52, 234, 63, 148, 108, 221, 127, 80, 156, 8, 248, 129, 7, 103, 242, 90, 21, 131, 234, 29, 120, 243, 245, 152, 88, 99, 232, 180, 223, 217, 113, 225, 248, 37, 179, 57, 103, 165, 232, 49, 138, 182, 235, 74, 170, 246, 25, 64, 234, 134, 183, 35, 37, 138, 124, 78, 98, 98, 99, 125, 38, 201, 116, 98, 144, 110, 23, 43, 18, 36, 2, 129, 200, 182, 53, 71, 23, 153, 86, 146, 197, 50, 34, 7, 137, 242, 126, 120, 141, 139, 139, 123, 148, 46, 118, 87, 224, 243, 71, 255, 62, 71, 181, 85, 174, 69, 42, 116, 232, 78, 138, 183, 237, 28, 80, 35, 244, 251, 206, 164, 92, 68, 55, 98, 171, 211, 140, 156, 58, 119, 193, 82, 119, 171, 32, 201, 35, 39, 79, 19, 91, 173, 166, 236, 115, 74, 124, 223, 37, 195, 243, 9, 161, 163, 100, 187, 46, 228, 245, 102, 109, 9, 204, 105, 155, 33, 35, 140, 179, 151, 46, 139, 67, 198, 167, 166, 166, 182, 16, 215, 98, 201, 146, 37, 15, 142, 30, 61, 58, 255, 212, 13, 27, 238, 95, 78, 95, 225, 119, 39, 78, 156, 120, 86, 85, 213, 121, 226, 13, 179, 151, 174, 208, 109, 117, 154, 19, 91, 205, 38, 94, 63, 59, 83, 243, 6, 35, 162, 59, 121, 180, 116, 5, 230, 130, 245, 213, 146, 76, 39, 6, 121, 172, 107, 215, 174, 143, 34, 65, 34, 16, 136, 236, 144, 147, 123, 241, 160, 139, 224, 72, 88, 100, 110, 196, 196, 24, 103, 46, 94, 114, 192, 207, 212, 170, 252, 197, 19, 153, 90, 124, 14, 249, 132, 37, 73, 23, 187, 93, 240, 185, 127, 174, 88, 109, 183, 85, 107, 64, 190, 236, 220, 139, 20, 167, 139, 112, 8, 44, 196, 1, 50, 224, 92, 75, 181, 239, 198, 136, 233, 131, 86, 17, 228, 250, 205, 104, 107, 99, 146, 252, 56, 155, 247, 236, 37, 182, 106, 13, 73, 165, 78, 61, 125, 59, 47, 122, 62, 101, 41, 1, 193, 223, 63, 219, 180, 13, 177, 213, 111, 169, 79, 93, 248, 183, 67, 189, 69, 64, 107, 99, 146, 146, 222, 54, 95, 31, 167, 211, 89, 31, 188, 187, 240, 7, 199, 207, 158, 211, 27, 68, 14, 82, 24, 57, 82, 171, 175, 162, 143, 159, 237, 243, 220, 193, 57, 82, 171, 184, 96, 149, 26, 164, 76, 241, 16, 74, 146, 222, 45, 73, 153, 32, 183, 109, 219, 198, 8, 178, 120, 241, 226, 199, 208, 197, 138, 64, 32, 178, 75, 78, 204, 74, 56, 125, 250, 116, 126, 209, 169, 227, 226, 213, 107, 42, 93, 248, 180, 23, 154, 182, 5, 162, 84, 225, 119, 116, 145, 156, 232, 47, 139, 82, 142, 121, 210, 115, 96, 201, 59, 107, 182, 82, 75, 128, 46, 254, 95, 116, 236, 17, 112, 4, 233, 90, 232, 187, 144, 114, 212, 250, 253, 160, 85, 123, 82, 181, 123, 36, 73, 76, 78, 241, 11, 73, 46, 90, 187, 158, 216, 190, 133, 141, 68, 111, 82, 12, 44, 49, 31, 207, 13, 94, 225, 252, 202, 80, 34, 183, 125, 215, 152, 124, 213, 165, 183, 182, 235, 224, 97, 85, 28, 95, 81, 85, 202, 47, 145, 185, 175, 197, 197, 189, 72, 63, 107, 25, 255, 29, 153, 50, 127, 145, 147, 146, 163, 254, 118, 139, 118, 164, 98, 199, 158, 116, 35, 208, 149, 145, 154, 165, 243, 71, 143, 87, 134, 146, 228, 7, 95, 125, 203, 146, 159, 188, 89, 146, 158, 98, 144, 33, 33, 33, 71, 7, 15, 30, 204, 44, 200, 247, 222, 123, 15, 9, 18, 129, 64, 100, 221, 130, 140, 143, 143, 127, 137, 254, 124, 20, 22, 153, 221, 135, 143, 40, 207, 83, 114, 44, 212, 186, 35, 41, 210, 166, 19, 121, 163, 69, 59, 227, 228, 185, 243, 78, 70, 148, 154, 54, 205, 106, 139, 82, 78, 12, 162, 199, 31, 199, 164, 234, 142, 28, 83, 32, 142, 87, 154, 46, 224, 96, 169, 20, 15, 48, 130, 20, 214, 80, 5, 74, 34, 143, 55, 110, 77, 218, 13, 251, 153, 40, 78, 167, 165, 36, 41, 48, 97, 238, 2, 98, 171, 209, 152, 89, 219, 197, 178, 72, 86, 96, 9, 22, 160, 214, 174, 173, 122, 35, 50, 100, 242, 116, 231, 205, 216, 56, 113, 248, 67, 224, 84, 112, 93, 147, 163, 206, 26, 61, 250, 234, 240, 55, 130, 92, 45, 39, 71, 19, 73, 22, 248, 170, 218, 109, 36, 169, 121, 32, 73, 152, 79, 49, 167, 194, 130, 44, 82, 164, 136, 219, 197, 138, 4, 137, 64, 32, 178, 100, 185, 9, 146, 179, 219, 213, 226, 244, 231, 4, 88, 100, 150, 172, 223, 104, 135, 248, 86, 209, 54, 157, 217, 66, 8, 227, 147, 176, 14, 228, 165, 102, 109, 141, 99, 167, 207, 42, 124, 161, 154, 101, 37, 81, 10, 55, 171, 162, 40, 61, 225, 248, 167, 169, 229, 250, 92, 211, 54, 108, 193, 47, 19, 209, 61, 224, 44, 72, 49, 224, 252, 43, 83, 226, 130, 152, 221, 224, 201, 211, 255, 101, 1, 90, 133, 126, 191, 77, 38, 182, 122, 45, 24, 209, 101, 133, 36, 67, 233, 40, 202, 231, 26, 44, 67, 91, 221, 22, 228, 195, 176, 14, 250, 146, 245, 255, 176, 235, 157, 166, 40, 100, 228, 244, 63, 28, 16, 87, 125, 183, 101, 123, 70, 198, 33, 124, 19, 224, 183, 249, 243, 145, 36, 61, 185, 88, 193, 130, 108, 209, 162, 5, 198, 32, 17, 8, 68, 150, 73, 201, 77, 108, 118, 187, 189, 137, 88, 112, 126, 153, 61, 207, 1, 86, 2, 196, 171, 96, 192, 130, 11, 139, 103, 249, 14, 61, 200, 103, 225, 29, 201, 147, 77, 194, 141, 195, 39, 79, 139, 24, 229, 92, 113, 12, 185, 177, 114, 86, 93, 189, 244, 60, 26, 193, 113, 163, 162, 99, 244, 226, 237, 186, 234, 31, 82, 171, 6, 220, 172, 197, 252, 185, 16, 231, 128, 37, 9, 132, 98, 171, 209, 136, 76, 93, 120, 75, 69, 200, 176, 208, 213, 234, 160, 4, 214, 114, 192, 48, 242, 114, 179, 182, 236, 58, 101, 135, 184, 196, 92, 67, 172, 242, 243, 54, 157, 152, 11, 182, 237, 208, 145, 206, 154, 189, 126, 84, 33, 246, 8, 199, 135, 81, 52, 39, 174, 137, 15, 36, 41, 19, 228, 214, 173, 91, 69, 12, 210, 237, 98, 69, 130, 68, 32, 16, 89, 118, 175, 114, 203, 109, 16, 44, 48, 41, 105, 105, 164, 235, 168, 113, 16, 103, 98, 214, 72, 201, 118, 183, 199, 152, 138, 113, 162, 132, 133, 51, 119, 163, 48, 227, 192, 241, 19, 204, 194, 80, 53, 109, 145, 217, 26, 204, 10, 65, 58, 28, 142, 242, 226, 60, 106, 245, 254, 81, 125, 166, 73, 27, 230, 166, 44, 26, 192, 4, 41, 70, 101, 186, 208, 67, 92, 117, 233, 134, 77, 126, 137, 71, 38, 36, 37, 209, 205, 68, 79, 2, 174, 113, 112, 77, 135, 88, 20, 75, 133, 99, 193, 53, 127, 173, 249, 247, 228, 163, 176, 8, 122, 61, 122, 48, 183, 119, 72, 78, 93, 147, 244, 72, 146, 43, 239, 152, 98, 144, 170, 205, 149, 197, 122, 4, 99, 144, 8, 4, 34, 219, 4, 25, 73, 72, 110, 186, 216, 204, 135, 5, 230, 242, 245, 40, 173, 70, 207, 190, 58, 184, 235, 42, 115, 55, 90, 122, 86, 17, 184, 94, 33, 70, 105, 107, 208, 138, 197, 12, 249, 162, 181, 44, 43, 68, 41, 206, 37, 37, 37, 165, 0, 132, 58, 225, 88, 29, 126, 26, 237, 180, 213, 111, 201, 136, 186, 40, 43, 159, 8, 108, 130, 132, 243, 7, 107, 24, 226, 133, 219, 246, 29, 176, 84, 72, 64, 144, 228, 149, 168, 27, 228, 5, 106, 69, 194, 198, 38, 180, 157, 245, 223, 1, 200, 146, 109, 154, 114, 122, 254, 210, 33, 73, 152, 63, 57, 6, 73, 45, 72, 205, 230, 82, 14, 218, 62, 107, 214, 44, 166, 164, 83, 176, 96, 193, 124, 248, 180, 35, 16, 136, 44, 17, 100, 106, 106, 234, 51, 244, 231, 253, 172, 235, 198, 177, 19, 142, 247, 90, 182, 55, 192, 85, 87, 137, 46, 72, 222, 44, 183, 98, 188, 116, 0, 226, 149, 182, 122, 45, 201, 174, 131, 135, 93, 174, 87, 195, 88, 157, 25, 162, 20, 127, 19, 29, 29, 253, 140, 72, 10, 25, 50, 101, 38, 75, 212, 169, 204, 147, 79, 2, 157, 32, 97, 0, 185, 0, 201, 0, 241, 31, 59, 115, 214, 47, 106, 59, 112, 92, 136, 33, 3, 25, 135, 4, 129, 229, 237, 141, 36, 161, 51, 140, 32, 200, 45, 91, 183, 130, 36, 158, 54, 118, 236, 24, 248, 247, 70, 112, 79, 205, 152, 49, 227, 33, 124, 218, 17, 8, 68, 102, 200, 49, 183, 32, 165, 196, 180, 180, 194, 244, 103, 86, 172, 183, 98, 211, 22, 7, 36, 148, 128, 11, 53, 51, 174, 205, 162, 156, 40, 225, 103, 91, 221, 230, 212, 66, 58, 104, 231, 22, 229, 134, 26, 53, 230, 230, 241, 70, 148, 226, 223, 206, 159, 63, 127, 63, 93, 236, 88, 54, 237, 212, 5, 139, 21, 136, 219, 125, 213, 185, 119, 192, 38, 233, 120, 26, 144, 253, 9, 150, 247, 71, 97, 29, 192, 98, 247, 11, 73, 110, 221, 187, 223, 93, 35, 89, 44, 88, 73, 18, 234, 36, 185, 226, 14, 144, 36, 239, 22, 195, 180, 103, 223, 248, 188, 152, 22, 27, 207, 114, 206, 28, 215, 175, 95, 255, 212, 28, 82, 64, 32, 16, 136, 140, 8, 210, 45, 78, 110, 183, 219, 235, 184, 133, 195, 255, 90, 164, 192, 194, 42, 39, 232, 100, 54, 193, 3, 222, 7, 49, 42, 176, 254, 54, 239, 221, 231, 224, 46, 192, 205, 34, 137, 231, 232, 209, 163, 247, 121, 56, 31, 89, 200, 124, 61, 207, 166, 117, 64, 141, 31, 44, 242, 161, 1, 88, 11, 153, 145, 144, 64, 57, 58, 71, 31, 180, 108, 79, 170, 116, 251, 129, 196, 39, 38, 250, 133, 36, 23, 175, 219, 64, 108, 213, 131, 151, 36, 161, 78, 178, 92, 137, 80, 183, 37, 41, 19, 100, 153, 47, 191, 38, 111, 55, 107, 75, 134, 78, 157, 233, 228, 255, 68, 121, 242, 250, 147, 230, 123, 13, 129, 64, 32, 108, 25, 17, 18, 20, 133, 179, 84, 126, 135, 131, 244, 25, 55, 193, 9, 4, 9, 169, 254, 174, 68, 140, 172, 103, 110, 150, 137, 112, 197, 171, 108, 53, 155, 146, 141, 187, 246, 8, 162, 220, 1, 162, 4, 230, 29, 61, 183, 104, 89, 219, 45, 167, 166, 205, 98, 238, 178, 189, 251, 29, 96, 65, 2, 225, 6, 19, 65, 138, 1, 137, 47, 80, 202, 18, 62, 120, 4, 203, 66, 245, 71, 76, 114, 226, 188, 133, 116, 163, 210, 148, 37, 214, 4, 35, 73, 126, 248, 117, 117, 82, 178, 88, 17, 18, 29, 237, 82, 43, 218, 176, 97, 3, 35, 200, 98, 229, 43, 144, 210, 48, 199, 80, 178, 82, 181, 62, 153, 177, 120, 169, 194, 167, 102, 167, 188, 73, 196, 149, 0, 129, 64, 120, 34, 72, 55, 57, 105, 154, 246, 7, 172, 28, 215, 110, 220, 212, 235, 245, 25, 168, 65, 13, 28, 75, 208, 1, 29, 79, 11, 234, 0, 33, 230, 86, 138, 17, 101, 19, 178, 110, 219, 14, 59, 95, 192, 247, 94, 187, 118, 237, 65, 249, 92, 196, 130, 165, 170, 234, 16, 166, 55, 122, 234, 180, 98, 107, 208, 202, 0, 162, 46, 217, 190, 107, 208, 17, 36, 140, 47, 40, 73, 66, 146, 83, 255, 241, 83, 252, 86, 35, 249, 227, 248, 201, 36, 79, 195, 48, 182, 209, 8, 182, 152, 36, 200, 210, 189, 83, 185, 10, 41, 85, 172, 40, 73, 77, 77, 37, 187, 118, 239, 102, 4, 25, 90, 161, 50, 41, 245, 125, 103, 82, 140, 222, 59, 37, 184, 16, 2, 148, 46, 173, 219, 182, 83, 148, 39, 205, 230, 247, 156, 223, 187, 215, 32, 16, 136, 192, 35, 72, 102, 197, 81, 146, 122, 130, 46, 200, 59, 97, 209, 56, 124, 242, 148, 179, 96, 120, 71, 253, 213, 102, 223, 187, 10, 193, 45, 92, 76, 5, 81, 50, 105, 51, 74, 148, 171, 54, 111, 181, 243, 245, 251, 96, 108, 108, 236, 127, 248, 57, 49, 194, 116, 56, 157, 223, 115, 201, 59, 173, 64, 171, 8, 163, 112, 120, 39, 150, 49, 27, 84, 22, 144, 153, 36, 235, 52, 39, 19, 230, 45, 248, 151, 50, 140, 21, 86, 164, 83, 85, 73, 171, 65, 195, 201, 155, 205, 191, 119, 105, 196, 6, 211, 252, 209, 123, 2, 186, 129, 188, 94, 241, 27, 82, 171, 122, 53, 50, 123, 206, 159, 228, 205, 231, 159, 33, 5, 66, 74, 144, 178, 116, 83, 5, 4, 25, 234, 22, 108, 231, 9, 82, 117, 155, 27, 244, 94, 103, 22, 165, 162, 40, 125, 249, 189, 151, 207, 223, 141, 195, 17, 8, 68, 96, 144, 99, 46, 119, 89, 133, 211, 249, 17, 24, 143, 176, 88, 192, 238, 218, 86, 167, 153, 241, 105, 235, 142, 44, 65, 199, 31, 132, 20, 194, 137, 18, 172, 25, 40, 119, 88, 182, 113, 147, 131, 175, 231, 71, 111, 220, 184, 241, 52, 115, 249, 42, 74, 77, 214, 251, 48, 62, 129, 90, 178, 189, 245, 55, 232, 194, 94, 177, 99, 207, 160, 37, 72, 225, 110, 133, 204, 211, 133, 107, 214, 251, 197, 213, 154, 152, 156, 204, 244, 90, 65, 232, 193, 31, 229, 31, 119, 154, 36, 139, 67, 188, 188, 122, 109, 242, 217, 199, 31, 49, 11, 242, 243, 178, 229, 153, 139, 53, 4, 100, 10, 77, 117, 188, 224, 250, 255, 148, 206, 195, 71, 97, 29, 52, 240, 154, 176, 102, 212, 118, 123, 93, 179, 103, 5, 129, 64, 220, 155, 4, 153, 91, 184, 149, 210, 20, 165, 26, 172, 199, 176, 72, 204, 88, 188, 148, 9, 132, 195, 78, 27, 22, 17, 127, 18, 146, 232, 120, 1, 201, 42, 144, 72, 242, 247, 186, 141, 130, 40, 247, 36, 167, 165, 1, 65, 42, 112, 82, 205, 251, 15, 85, 109, 13, 195, 220, 181, 144, 193, 74, 144, 16, 99, 101, 155, 134, 218, 205, 200, 166, 221, 123, 210, 213, 29, 205, 78, 210, 206, 213, 27, 55, 152, 76, 92, 160, 106, 219, 250, 66, 146, 69, 107, 214, 35, 159, 189, 241, 50, 41, 81, 249, 43, 18, 218, 166, 19, 41, 222, 174, 219, 109, 4, 41, 111, 212, 96, 83, 242, 82, 179, 182, 164, 78, 159, 1, 170, 157, 199, 128, 211, 210, 210, 10, 35, 81, 34, 16, 247, 54, 65, 222, 74, 208, 81, 148, 238, 46, 37, 28, 157, 244, 159, 48, 85, 1, 89, 49, 176, 214, 128, 36, 115, 194, 98, 19, 174, 47, 112, 161, 66, 140, 104, 209, 154, 245, 238, 142, 18, 208, 104, 184, 239, 175, 147, 88, 239, 65, 86, 147, 217, 38, 56, 106, 33, 211, 37, 73, 58, 15, 176, 105, 128, 152, 228, 225, 147, 167, 110, 83, 139, 201, 46, 4, 217, 30, 135, 26, 201, 250, 45, 217, 6, 40, 36, 40, 231, 145, 146, 127, 155, 142, 164, 88, 131, 102, 36, 36, 44, 130, 20, 111, 239, 153, 32, 111, 211, 202, 5, 133, 163, 122, 45, 73, 239, 95, 198, 139, 123, 47, 6, 106, 131, 145, 40, 17, 136, 123, 147, 32, 243, 139, 159, 53, 77, 159, 226, 234, 1, 25, 107, 52, 233, 55, 88, 133, 4, 29, 136, 63, 134, 230, 164, 148, 24, 95, 168, 128, 40, 153, 210, 76, 149, 250, 100, 254, 234, 181, 192, 12, 250, 175, 115, 230, 177, 238, 17, 217, 233, 84, 17, 72, 67, 100, 14, 131, 165, 119, 241, 234, 53, 107, 73, 146, 31, 7, 84, 124, 88, 179, 229, 14, 221, 131, 148, 36, 233, 0, 43, 25, 234, 114, 77, 46, 214, 140, 54, 106, 80, 111, 11, 89, 211, 147, 254, 90, 40, 50, 94, 247, 207, 157, 235, 174, 225, 197, 210, 16, 4, 226, 94, 34, 200, 248, 248, 248, 199, 232, 207, 155, 120, 35, 92, 103, 145, 182, 157, 245, 39, 26, 135, 179, 186, 185, 144, 59, 84, 86, 17, 194, 213, 102, 224, 231, 183, 90, 180, 35, 109, 134, 142, 52, 160, 167, 98, 137, 118, 93, 130, 211, 53, 152, 142, 218, 14, 196, 129, 193, 173, 28, 151, 96, 109, 141, 164, 176, 36, 151, 110, 248, 135, 185, 115, 203, 69, 4, 49, 73, 10, 215, 107, 38, 239, 63, 150, 241, 250, 109, 3, 178, 226, 159, 45, 34, 227, 117, 129, 20, 187, 199, 140, 87, 4, 34, 200, 9, 146, 21, 236, 39, 39, 39, 191, 7, 201, 162, 176, 8, 108, 218, 181, 7, 74, 42, 152, 24, 245, 221, 208, 61, 35, 132, 91, 83, 64, 22, 175, 8, 109, 209, 32, 172, 133, 76, 111, 64, 35, 226, 119, 233, 6, 161, 89, 255, 33, 183, 106, 36, 45, 42, 255, 16, 199, 25, 55, 103, 30, 171, 145, 12, 58, 73, 58, 139, 98, 194, 44, 227, 186, 86, 83, 99, 255, 177, 227, 10, 87, 235, 25, 140, 214, 36, 2, 17, 220, 228, 152, 71, 212, 27, 166, 58, 28, 95, 130, 20, 23, 60, 252, 115, 150, 173, 116, 216, 190, 107, 226, 142, 7, 222, 109, 226, 224, 66, 198, 238, 94, 26, 144, 237, 251, 36, 181, 232, 123, 255, 50, 222, 242, 26, 73, 93, 103, 199, 49, 142, 159, 61, 167, 61, 216, 168, 53, 187, 214, 37, 179, 33, 12, 17, 140, 35, 68, 146, 5, 124, 183, 101, 123, 227, 210, 181, 235, 204, 71, 109, 119, 58, 155, 96, 124, 18, 129, 8, 98, 235, 17, 224, 112, 56, 34, 92, 22, 5, 33, 67, 167, 204, 96, 61, 32, 65, 113, 5, 22, 133, 187, 49, 222, 119, 175, 89, 57, 33, 34, 179, 181, 94, 11, 242, 203, 236, 185, 254, 16, 17, 112, 31, 108, 243, 238, 189, 42, 196, 223, 224, 250, 223, 75, 150, 186, 175, 241, 113, 72, 92, 131, 58, 210, 26, 61, 250, 105, 73, 41, 169, 108, 206, 146, 147, 147, 75, 152, 99, 250, 8, 4, 34, 176, 9, 210, 189, 235, 117, 106, 218, 175, 44, 101, 47, 46, 158, 132, 13, 250, 73, 133, 196, 13, 183, 238, 41, 186, 220, 238, 154, 197, 89, 212, 72, 206, 91, 185, 198, 210, 120, 36, 132, 215, 248, 235, 57, 58, 118, 193, 15, 127, 46, 95, 165, 66, 217, 77, 70, 173, 206, 238, 213, 1, 94, 21, 152, 23, 216, 176, 116, 25, 53, 78, 104, 188, 38, 216, 237, 246, 151, 208, 162, 68, 32, 130, 136, 32, 163, 162, 162, 30, 162, 214, 8, 91, 113, 79, 95, 188, 164, 150, 239, 216, 67, 7, 87, 27, 148, 83, 20, 67, 114, 188, 235, 72, 146, 101, 247, 126, 215, 152, 108, 216, 185, 203, 210, 26, 73, 225, 98, 167, 216, 24, 23, 23, 247, 40, 125, 61, 207, 90, 141, 77, 158, 238, 100, 173, 198, 58, 245, 66, 183, 171, 39, 162, 132, 210, 16, 106, 113, 143, 155, 61, 87, 100, 188, 30, 147, 52, 134, 49, 70, 137, 64, 4, 32, 57, 186, 21, 116, 18, 29, 142, 215, 129, 27, 89, 107, 164, 125, 7, 28, 143, 53, 14, 103, 217, 162, 149, 130, 188, 32, 63, 224, 45, 73, 74, 90, 7, 79, 156, 180, 154, 36, 197, 34, 191, 4, 238, 141, 228, 228, 228, 247, 33, 39, 5, 92, 239, 45, 7, 14, 119, 66, 102, 115, 208, 137, 157, 91, 229, 122, 229, 26, 175, 127, 175, 223, 104, 231, 125, 80, 229, 134, 225, 152, 241, 138, 64, 4, 16, 65, 230, 21, 187, 219, 148, 148, 148, 114, 244, 103, 22, 76, 249, 107, 245, 90, 59, 88, 39, 66, 23, 20, 9, 242, 46, 141, 73, 182, 117, 37, 238, 60, 78, 9, 235, 2, 175, 145, 212, 173, 39, 201, 81, 226, 126, 73, 77, 77, 253, 6, 126, 17, 29, 23, 103, 148, 108, 215, 85, 251, 56, 172, 67, 150, 90, 160, 221, 11, 181, 171, 229, 59, 184, 84, 144, 118, 31, 58, 226, 224, 250, 183, 63, 163, 53, 137, 64, 4, 16, 160, 25, 177, 248, 217, 225, 112, 132, 137, 149, 241, 231, 153, 179, 89, 15, 72, 120, 200, 97, 1, 198, 248, 227, 221, 93, 126, 192, 50, 140, 233, 162, 28, 155, 144, 96, 101, 226, 14, 28, 68, 196, 213, 58, 241, 197, 157, 137, 199, 171, 170, 218, 9, 126, 121, 242, 220, 121, 39, 116, 87, 9, 229, 50, 129, 120, 159, 220, 158, 64, 6, 155, 7, 184, 54, 47, 52, 109, 107, 156, 187, 124, 133, 197, 119, 157, 78, 103, 107, 140, 79, 34, 16, 129, 97, 61, 186, 93, 62, 176, 195, 101, 25, 6, 73, 201, 36, 98, 248, 104, 21, 58, 108, 64, 92, 37, 20, 23, 187, 187, 62, 179, 21, 200, 233, 253, 150, 237, 73, 253, 200, 129, 196, 238, 112, 88, 73, 146, 186, 208, 229, 165, 168, 197, 239, 155, 252, 226, 190, 209, 52, 109, 18, 203, 120, 221, 179, 79, 129, 248, 27, 184, 124, 153, 242, 15, 94, 151, 127, 197, 139, 65, 96, 31, 132, 246, 19, 146, 146, 92, 129, 94, 135, 90, 78, 204, 39, 174, 70, 8, 196, 221, 21, 119, 204, 35, 55, 135, 85, 20, 165, 58, 116, 207, 128, 7, 247, 60, 221, 233, 126, 213, 165, 143, 6, 34, 1, 247, 138, 156, 91, 48, 88, 43, 80, 171, 250, 88, 163, 214, 164, 251, 232, 95, 173, 46, 253, 144, 125, 182, 197, 249, 61, 148, 79, 222, 92, 209, 207, 251, 135, 215, 206, 42, 16, 127, 131, 141, 21, 94, 23, 147, 149, 223, 198, 85, 26, 98, 107, 216, 138, 180, 27, 54, 74, 88, 230, 169, 137, 137, 142, 55, 208, 162, 68, 32, 238, 30, 130, 204, 39, 199, 65, 146, 146, 236, 33, 244, 255, 255, 17, 43, 224, 170, 205, 219, 156, 239, 183, 138, 208, 223, 110, 209, 142, 37, 232, 32, 65, 6, 86, 109, 30, 196, 189, 198, 204, 154, 99, 117, 141, 164, 40, 255, 128, 24, 181, 88, 208, 243, 241, 215, 7, 92, 247, 81, 210, 19, 208, 32, 4, 254, 104, 216, 212, 153, 78, 240, 64, 148, 239, 208, 29, 173, 73, 15, 238, 112, 86, 26, 66, 175, 211, 200, 25, 127, 136, 140, 225, 51, 71, 111, 222, 124, 24, 99, 148, 8, 196, 157, 37, 199, 220, 178, 75, 39, 54, 57, 249, 93, 40, 117, 19, 171, 224, 206, 131, 135, 180, 6, 145, 3, 85, 136, 63, 194, 195, 92, 46, 216, 58, 206, 223, 3, 36, 201, 22, 95, 122, 253, 230, 174, 88, 101, 53, 73, 138, 206, 22, 151, 233, 120, 76, 114, 211, 223, 214, 84, 24, 122, 120, 210, 223, 93, 87, 117, 157, 180, 25, 50, 82, 3, 215, 98, 233, 246, 221, 144, 40, 61, 12, 216, 128, 130, 107, 250, 175, 85, 107, 132, 198, 235, 58, 249, 89, 197, 21, 11, 129, 200, 89, 130, 116, 187, 113, 162, 83, 83, 159, 213, 116, 125, 140, 112, 161, 29, 61, 125, 70, 239, 250, 243, 47, 140, 28, 95, 107, 246, 253, 45, 129, 0, 92, 200, 2, 147, 36, 171, 214, 39, 235, 183, 239, 180, 58, 179, 85, 144, 228, 62, 57, 150, 205, 95, 223, 166, 163, 10, 29, 77, 233, 104, 77, 23, 251, 173, 240, 135, 215, 110, 220, 212, 30, 107, 28, 206, 72, 18, 227, 217, 158, 133, 248, 89, 198, 235, 119, 141, 161, 171, 138, 194, 137, 242, 55, 62, 167, 121, 204, 27, 16, 4, 2, 225, 159, 184, 163, 219, 117, 115, 249, 242, 229, 7, 84, 85, 239, 67, 127, 23, 207, 76, 130, 168, 40, 50, 104, 226, 52, 7, 244, 192, 187, 175, 145, 171, 25, 177, 208, 95, 197, 133, 44, 48, 23, 94, 230, 110, 173, 209, 152, 28, 56, 118, 194, 82, 97, 115, 137, 36, 151, 154, 92, 173, 175, 210, 145, 232, 161, 57, 179, 190, 117, 239, 126, 214, 115, 178, 28, 186, 92, 211, 221, 212, 192, 6, 2, 126, 206, 219, 40, 204, 56, 117, 225, 162, 234, 74, 228, 113, 116, 192, 248, 36, 2, 225, 127, 114, 188, 237, 1, 115, 58, 181, 102, 220, 85, 70, 18, 83, 82, 201, 196, 121, 11, 20, 91, 195, 48, 150, 152, 3, 15, 42, 16, 164, 120, 112, 113, 1, 187, 243, 139, 103, 86, 174, 3, 100, 147, 194, 181, 164, 215, 21, 18, 175, 252, 229, 110, 21, 150, 206, 253, 252, 245, 21, 144, 36, 101, 10, 3, 27, 254, 177, 119, 27, 53, 78, 237, 62, 230, 55, 163, 113, 191, 193, 228, 147, 214, 29, 200, 231, 109, 58, 177, 114, 20, 188, 174, 233, 95, 107, 216, 68, 124, 216, 42, 130, 148, 142, 232, 166, 197, 196, 199, 179, 11, 150, 154, 154, 250, 21, 159, 95, 204, 120, 69, 32, 44, 38, 200, 219, 146, 114, 224, 97, 131, 198, 175, 172, 38, 75, 211, 200, 130, 213, 235, 212, 2, 173, 34, 52, 208, 246, 132, 114, 1, 112, 247, 148, 180, 184, 57, 114, 136, 233, 21, 71, 230, 230, 14, 202, 4, 50, 219, 130, 42, 132, 119, 255, 248, 60, 188, 19, 41, 70, 127, 142, 142, 139, 243, 87, 226, 78, 15, 97, 229, 8, 107, 82, 85, 213, 178, 240, 15, 87, 163, 110, 24, 143, 55, 9, 215, 160, 233, 118, 97, 56, 15, 86, 175, 233, 223, 185, 10, 134, 77, 29, 124, 135, 10, 29, 123, 50, 1, 136, 86, 131, 126, 114, 242, 43, 230, 140, 75, 78, 126, 31, 45, 74, 4, 194, 58, 114, 204, 45, 63, 76, 105, 105, 105, 197, 232, 255, 175, 22, 43, 220, 218, 237, 59, 149, 170, 221, 126, 208, 33, 94, 37, 30, 74, 127, 41, 190, 0, 249, 150, 137, 232, 198, 58, 131, 96, 108, 51, 243, 109, 174, 30, 106, 212, 154, 220, 223, 40, 140, 21, 159, 251, 74, 148, 33, 92, 142, 14, 186, 78, 212, 251, 97, 0, 73, 77, 75, 179, 90, 72, 64, 4, 55, 235, 203, 22, 142, 32, 74, 167, 211, 25, 225, 18, 20, 184, 168, 62, 212, 184, 53, 251, 30, 112, 15, 132, 248, 145, 32, 225, 248, 95, 240, 14, 36, 193, 160, 148, 196, 52, 94, 107, 55, 131, 238, 58, 162, 52, 228, 210, 249, 248, 120, 150, 36, 181, 103, 207, 158, 124, 184, 202, 33, 16, 89, 39, 71, 183, 229, 232, 112, 56, 222, 208, 117, 125, 182, 88, 221, 118, 29, 58, 172, 53, 235, 63, 84, 129, 116, 124, 40, 50, 135, 154, 71, 176, 28, 253, 17, 119, 4, 242, 5, 98, 164, 150, 42, 115, 249, 61, 70, 23, 75, 225, 6, 196, 44, 89, 223, 8, 242, 85, 74, 114, 221, 70, 141, 211, 187, 143, 254, 149, 137, 200, 131, 43, 206, 23, 107, 201, 173, 15, 218, 160, 21, 188, 31, 18, 64, 172, 38, 73, 129, 146, 102, 55, 160, 168, 181, 165, 68, 57, 5, 254, 96, 221, 246, 93, 14, 136, 139, 86, 240, 19, 129, 21, 227, 234, 53, 47, 54, 109, 203, 72, 165, 184, 187, 167, 101, 231, 128, 247, 34, 84, 238, 220, 203, 128, 174, 42, 179, 151, 174, 80, 92, 215, 143, 108, 150, 230, 25, 75, 67, 16, 136, 172, 90, 142, 167, 79, 159, 126, 146, 254, 255, 72, 225, 22, 59, 121, 238, 2, 233, 50, 114, 172, 98, 251, 174, 177, 1, 105, 248, 176, 96, 129, 165, 1, 11, 76, 136, 31, 93, 70, 176, 176, 119, 252, 105, 12, 185, 30, 29, 173, 109, 223, 127, 128, 45, 244, 96, 89, 150, 68, 245, 149, 12, 173, 8, 150, 112, 67, 9, 238, 199, 241, 147, 221, 233, 168, 131, 39, 79, 215, 88, 119, 13, 186, 177, 241, 182, 169, 113, 103, 182, 214, 106, 74, 70, 205, 156, 109, 117, 179, 101, 67, 210, 110, 125, 83, 182, 32, 197, 189, 40, 126, 166, 159, 183, 29, 254, 112, 202, 252, 197, 118, 161, 212, 100, 101, 35, 238, 162, 220, 98, 126, 186, 73, 56, 8, 38, 24, 19, 230, 45, 80, 225, 247, 208, 224, 184, 84, 128, 151, 154, 132, 240, 58, 74, 120, 86, 65, 140, 97, 227, 174, 61, 14, 30, 38, 153, 38, 54, 35, 88, 26, 130, 64, 248, 70, 144, 238, 93, 252, 182, 109, 219, 30, 80, 85, 181, 179, 200, 88, 189, 122, 227, 38, 25, 49, 125, 22, 244, 122, 212, 161, 43, 3, 44, 40, 176, 235, 14, 229, 139, 177, 191, 30, 110, 176, 130, 74, 208, 215, 103, 154, 182, 33, 231, 175, 92, 21, 241, 43, 242, 231, 138, 85, 26, 88, 21, 168, 190, 146, 254, 128, 197, 253, 211, 240, 142, 240, 170, 39, 166, 164, 192, 180, 193, 127, 210, 52, 86, 107, 56, 66, 207, 71, 173, 114, 111, 109, 201, 224, 218, 130, 151, 128, 89, 33, 203, 86, 90, 29, 143, 20, 196, 125, 67, 170, 145, 204, 99, 142, 133, 195, 107, 114, 114, 242, 83, 252, 239, 128, 196, 156, 144, 221, 10, 22, 46, 40, 205, 132, 90, 176, 17, 131, 251, 249, 117, 186, 233, 171, 219, 103, 160, 145, 154, 102, 231, 226, 23, 91, 53, 40, 163, 168, 232, 167, 16, 66, 78, 111, 152, 96, 67, 9, 195, 86, 175, 133, 113, 236, 204, 89, 230, 122, 85, 20, 165, 135, 121, 115, 130, 64, 32, 254, 77, 142, 121, 229, 197, 201, 238, 116, 54, 166, 255, 127, 214, 149, 177, 154, 66, 166, 45, 252, 91, 121, 182, 105, 27, 3, 172, 143, 47, 56, 57, 230, 84, 127, 63, 230, 234, 163, 100, 184, 96, 205, 122, 246, 80, 219, 21, 101, 26, 125, 57, 0, 63, 119, 252, 105, 180, 242, 48, 181, 40, 93, 201, 40, 72, 138, 255, 210, 243, 236, 192, 44, 7, 99, 247, 161, 35, 78, 46, 122, 221, 220, 110, 183, 151, 130, 159, 227, 18, 19, 73, 165, 206, 189, 244, 119, 91, 182, 99, 4, 145, 145, 75, 145, 21, 167, 87, 107, 72, 214, 108, 221, 238, 47, 146, 60, 44, 221, 139, 255, 170, 225, 19, 61, 18, 211, 210, 210, 138, 48, 166, 79, 75, 35, 85, 187, 69, 106, 175, 53, 107, 203, 174, 125, 118, 146, 108, 92, 186, 180, 60, 123, 183, 94, 11, 114, 234, 194, 69, 222, 5, 204, 136, 130, 31, 134, 79, 251, 93, 179, 213, 105, 206, 188, 25, 129, 158, 204, 3, 207, 8, 60, 187, 159, 132, 117, 32, 69, 191, 239, 162, 223, 136, 137, 101, 23, 50, 77, 81, 170, 243, 185, 199, 68, 30, 4, 66, 94, 140, 204, 26, 171, 154, 166, 85, 162, 255, 191, 71, 172, 96, 11, 86, 175, 83, 232, 46, 157, 101, 172, 194, 67, 230, 106, 126, 219, 57, 71, 98, 52, 176, 120, 65, 220, 236, 133, 166, 109, 73, 155, 193, 35, 68, 43, 165, 11, 124, 177, 252, 28, 254, 39, 42, 38, 134, 124, 24, 22, 161, 21, 161, 214, 4, 186, 93, 61, 116, 174, 167, 155, 11, 40, 201, 225, 196, 182, 92, 92, 231, 52, 135, 131, 37, 195, 156, 187, 124, 69, 133, 206, 17, 162, 174, 46, 36, 163, 86, 76, 244, 30, 216, 115, 248, 168, 213, 66, 2, 194, 51, 176, 202, 147, 21, 41, 185, 255, 243, 136, 206, 32, 64, 244, 236, 70, 184, 114, 213, 120, 134, 110, 220, 10, 182, 118, 181, 208, 202, 206, 181, 119, 53, 47, 166, 27, 177, 213, 107, 29, 252, 251, 253, 18, 31, 31, 255, 50, 236, 43, 28, 138, 147, 124, 213, 181, 143, 10, 189, 78, 33, 161, 39, 208, 137, 82, 72, 12, 210, 77, 47, 105, 242, 227, 16, 205, 169, 178, 10, 28, 61, 33, 53, 245, 19, 179, 55, 9, 129, 184, 215, 45, 71, 185, 156, 163, 32, 44, 84, 98, 229, 218, 184, 115, 183, 246, 85, 151, 222, 78, 88, 24, 33, 229, 30, 44, 9, 88, 68, 115, 90, 12, 128, 215, 230, 233, 116, 49, 103, 171, 114, 138, 195, 81, 86, 156, 179, 162, 170, 189, 224, 119, 219, 247, 31, 0, 209, 107, 163, 98, 71, 212, 130, 149, 99, 184, 175, 80, 43, 171, 97, 223, 193, 26, 47, 250, 143, 75, 73, 73, 121, 154, 95, 251, 7, 56, 217, 140, 130, 127, 216, 115, 248, 136, 3, 174, 51, 16, 141, 43, 17, 234, 223, 46, 91, 248, 253, 163, 141, 195, 201, 105, 151, 149, 229, 15, 181, 157, 73, 158, 92, 126, 233, 197, 201, 210, 236, 246, 65, 240, 166, 109, 251, 14, 168, 175, 53, 255, 158, 148, 162, 231, 87, 34, 11, 53, 147, 240, 93, 193, 18, 125, 162, 73, 56, 233, 52, 98, 140, 216, 136, 157, 61, 113, 226, 196, 35, 220, 163, 2, 74, 63, 228, 248, 217, 115, 42, 181, 38, 13, 22, 94, 104, 23, 248, 89, 213, 112, 143, 48, 23, 58, 181, 144, 127, 28, 63, 89, 100, 188, 94, 79, 78, 78, 126, 18, 45, 74, 4, 38, 229, 72, 59, 197, 27, 9, 9, 175, 209, 5, 111, 154, 88, 177, 246, 31, 59, 174, 135, 13, 26, 174, 218, 170, 214, 55, 160, 201, 45, 184, 235, 132, 114, 71, 78, 46, 12, 16, 103, 130, 88, 25, 184, 248, 254, 90, 185, 70, 200, 106, 253, 34, 118, 186, 194, 37, 71, 173, 163, 117, 240, 111, 19, 230, 206, 135, 68, 34, 246, 224, 223, 235, 170, 62, 34, 153, 41, 111, 163, 214, 228, 204, 197, 75, 26, 119, 167, 125, 43, 22, 63, 153, 120, 232, 156, 46, 129, 127, 95, 190, 113, 179, 3, 230, 218, 83, 236, 173, 12, 37, 6, 136, 107, 194, 245, 143, 138, 142, 177, 154, 36, 197, 2, 221, 219, 188, 56, 11, 171, 146, 190, 190, 7, 125, 38, 233, 232, 75, 199, 120, 58, 230, 210, 177, 94, 28, 160, 199, 152, 223, 140, 255, 81, 2, 7, 2, 203, 138, 72, 2, 120, 69, 222, 106, 217, 78, 187, 118, 51, 154, 29, 47, 41, 41, 41, 68, 222, 76, 104, 186, 62, 29, 126, 191, 104, 237, 122, 214, 251, 20, 44, 244, 144, 32, 217, 76, 9, 61, 222, 105, 139, 150, 8, 49, 244, 93, 230, 249, 71, 32, 238, 41, 130, 20, 63, 211, 133, 224, 127, 170, 170, 14, 5, 165, 42, 120, 50, 78, 157, 191, 96, 244, 25, 55, 209, 9, 68, 243, 124, 211, 54, 204, 114, 188, 83, 238, 75, 151, 37, 68, 119, 247, 116, 225, 11, 27, 56, 92, 88, 26, 231, 65, 250, 78, 60, 188, 194, 10, 142, 142, 142, 126, 6, 218, 83, 130, 173, 4, 174, 163, 103, 155, 180, 97, 86, 212, 221, 146, 178, 31, 202, 71, 78, 126, 38, 203, 102, 165, 215, 113, 241, 218, 13, 194, 117, 40, 148, 108, 242, 202, 158, 4, 120, 221, 176, 97, 3, 120, 20, 14, 186, 178, 70, 23, 185, 218, 80, 73, 36, 32, 92, 222, 111, 181, 104, 71, 234, 244, 233, 79, 146, 92, 201, 63, 254, 176, 36, 27, 200, 36, 41, 223, 171, 244, 231, 67, 255, 242, 209, 210, 11, 126, 51, 54, 214, 216, 121, 240, 16, 35, 113, 80, 223, 41, 153, 73, 75, 210, 93, 218, 66, 55, 132, 255, 236, 218, 195, 54, 98, 244, 153, 232, 107, 142, 209, 67, 29, 33, 253, 249, 52, 252, 59, 123, 70, 234, 181, 100, 207, 71, 48, 148, 30, 133, 240, 103, 141, 199, 155, 29, 60, 24, 59, 91, 10, 199, 160, 198, 43, 226, 158, 33, 72, 246, 192, 71, 210, 197, 135, 119, 123, 191, 201, 82, 10, 99, 227, 200, 136, 233, 127, 56, 160, 235, 59, 100, 11, 138, 114, 142, 172, 88, 99, 66, 88, 25, 118, 244, 48, 178, 66, 178, 162, 185, 47, 36, 82, 64, 217, 2, 181, 132, 116, 174, 57, 89, 193, 28, 47, 17, 11, 106, 106, 106, 106, 21, 198, 162, 87, 174, 106, 79, 55, 105, 227, 238, 94, 127, 55, 52, 41, 22, 11, 145, 63, 139, 223, 205, 137, 58, 160, 149, 219, 109, 212, 56, 225, 58, 60, 49, 119, 238, 220, 251, 60, 185, 46, 133, 107, 147, 206, 31, 108, 52, 152, 25, 213, 239, 183, 73, 78, 80, 181, 97, 68, 201, 239, 1, 184, 31, 30, 111, 220, 26, 220, 145, 132, 199, 175, 172, 212, 109, 21, 108, 91, 74, 38, 111, 190, 64, 179, 243, 165, 132, 252, 19, 252, 193, 149, 235, 81, 201, 53, 123, 245, 119, 84, 233, 218, 199, 241, 69, 199, 30, 78, 176, 110, 159, 108, 18, 78, 10, 211, 215, 204, 186, 90, 139, 74, 101, 45, 195, 167, 206, 20, 214, 236, 54, 15, 86, 44, 155, 163, 132, 132, 132, 130, 34, 217, 9, 36, 222, 32, 14, 90, 38, 11, 150, 235, 221, 56, 74, 10, 201, 65, 74, 254, 135, 79, 158, 82, 120, 198, 107, 63, 79, 238, 111, 4, 34, 168, 9, 146, 187, 39, 215, 48, 253, 70, 187, 157, 76, 95, 180, 212, 249, 108, 179, 182, 170, 173, 126, 43, 70, 74, 21, 121, 135, 142, 172, 196, 245, 224, 61, 112, 12, 120, 63, 44, 178, 182, 186, 205, 249, 239, 50, 159, 232, 192, 50, 41, 107, 54, 129, 150, 76, 162, 205, 207, 132, 244, 30, 88, 73, 149, 133, 197, 215, 86, 110, 218, 226, 96, 41, 251, 188, 87, 101, 232, 29, 218, 157, 195, 162, 3, 11, 233, 71, 97, 17, 70, 161, 214, 29, 141, 119, 91, 182, 207, 242, 230, 195, 215, 207, 100, 66, 14, 109, 58, 147, 143, 195, 58, 104, 66, 58, 46, 49, 45, 173, 112, 70, 49, 38, 105, 163, 81, 8, 114, 123, 128, 4, 155, 254, 56, 68, 133, 164, 14, 176, 200, 139, 242, 142, 247, 176, 128, 14, 159, 246, 187, 191, 106, 36, 129, 40, 223, 50, 223, 171, 178, 21, 67, 137, 114, 38, 252, 33, 88, 124, 160, 236, 36, 238, 57, 81, 210, 16, 146, 201, 185, 130, 107, 1, 194, 20, 95, 117, 233, 163, 167, 184, 20, 132, 148, 244, 154, 19, 139, 255, 167, 27, 181, 118, 44, 36, 113, 244, 184, 66, 201, 213, 96, 25, 193, 65, 210, 80, 27, 18, 179, 96, 179, 81, 144, 222, 171, 87, 163, 110, 176, 141, 139, 221, 110, 175, 135, 137, 60, 136, 123, 129, 32, 221, 221, 58, 156, 154, 54, 26, 110, 254, 221, 135, 142, 56, 94, 105, 222, 78, 181, 213, 106, 194, 51, 23, 123, 100, 75, 85, 36, 132, 147, 97, 209, 54, 157, 200, 251, 116, 225, 217, 188, 103, 159, 186, 125, 255, 65, 21, 126, 7, 169, 230, 153, 41, 23, 129, 191, 133, 68, 140, 230, 3, 134, 185, 229, 179, 14, 30, 60, 248, 80, 122, 73, 28, 38, 183, 220, 62, 120, 195, 192, 73, 211, 20, 32, 106, 177, 200, 135, 230, 176, 5, 9, 243, 9, 238, 201, 90, 189, 250, 27, 151, 175, 71, 25, 81, 209, 49, 122, 227, 31, 135, 24, 174, 154, 196, 158, 126, 33, 74, 119, 151, 142, 106, 13, 201, 182, 125, 251, 157, 220, 117, 216, 195, 151, 36, 12, 241, 239, 212, 122, 168, 6, 239, 187, 25, 27, 167, 211, 251, 66, 3, 97, 236, 114, 220, 43, 0, 165, 63, 51, 22, 47, 117, 19, 164, 69, 36, 41, 172, 72, 8, 116, 62, 110, 38, 70, 243, 245, 165, 159, 201, 164, 16, 87, 111, 217, 102, 7, 11, 16, 226, 207, 37, 178, 224, 173, 40, 193, 189, 29, 176, 145, 59, 120, 252, 164, 171, 172, 200, 233, 108, 158, 222, 92, 241, 56, 62, 59, 47, 205, 48, 22, 194, 223, 207, 90, 178, 220, 193, 92, 211, 32, 104, 208, 38, 56, 52, 94, 97, 99, 249, 92, 147, 54, 164, 78, 239, 1, 90, 154, 195, 21, 162, 132, 146, 27, 36, 74, 68, 176, 147, 36, 123, 232, 233, 174, 176, 190, 43, 176, 119, 5, 68, 162, 117, 88, 0, 173, 40, 194, 103, 74, 30, 116, 209, 17, 74, 30, 27, 118, 238, 22, 49, 38, 178, 227, 192, 33, 16, 30, 96, 11, 173, 175, 238, 176, 50, 174, 90, 53, 253, 212, 249, 11, 58, 239, 88, 80, 217, 155, 219, 71, 124, 199, 100, 69, 121, 7, 184, 33, 213, 238, 128, 164, 31, 237, 61, 106, 189, 193, 98, 152, 147, 25, 175, 240, 61, 97, 115, 96, 171, 223, 210, 56, 126, 246, 156, 155, 73, 98, 226, 226, 73, 213, 238, 145, 58, 196, 123, 133, 149, 107, 165, 37, 192, 50, 21, 191, 107, 66, 198, 254, 49, 87, 108, 46, 54, 121, 34, 154, 12, 54, 82, 66, 80, 188, 59, 188, 249, 244, 133, 139, 186, 173, 97, 24, 43, 13, 97, 9, 84, 212, 178, 95, 254, 207, 102, 127, 197, 35, 143, 101, 20, 251, 114, 199, 79, 233, 43, 37, 74, 38, 168, 63, 103, 217, 74, 135, 237, 219, 6, 108, 46, 51, 37, 214, 206, 203, 31, 224, 251, 136, 100, 21, 122, 204, 191, 188, 205, 147, 152, 159, 184, 184, 184, 71, 65, 87, 3, 222, 215, 126, 248, 40, 21, 66, 2, 21, 253, 180, 241, 185, 19, 101, 67, 204, 139, 83, 167, 57, 233, 57, 246, 55, 113, 31, 197, 210, 103, 240, 89, 116, 189, 34, 130, 149, 32, 217, 77, 157, 146, 146, 242, 1, 172, 109, 118, 135, 66, 106, 244, 232, 167, 65, 189, 23, 60, 216, 32, 183, 21, 106, 1, 73, 186, 22, 232, 198, 76, 112, 128, 91, 48, 107, 233, 96, 59, 238, 63, 151, 175, 114, 64, 135, 244, 74, 94, 136, 1, 118, 227, 149, 185, 170, 203, 31, 75, 150, 43, 124, 49, 158, 34, 37, 234, 228, 242, 242, 93, 243, 115, 183, 43, 171, 161, 59, 118, 250, 172, 78, 173, 31, 163, 116, 14, 202, 214, 21, 19, 139, 12, 221, 44, 44, 94, 183, 129, 73, 182, 56, 156, 206, 95, 232, 34, 211, 138, 229, 215, 71, 71, 235, 165, 35, 186, 235, 64, 222, 21, 178, 89, 0, 111, 182, 92, 33, 97, 169, 70, 207, 126, 186, 83, 101, 201, 172, 55, 47, 94, 188, 248, 95, 179, 251, 210, 215, 164, 46, 69, 85, 135, 240, 210, 26, 166, 54, 195, 54, 64, 245, 90, 208, 77, 207, 65, 87, 210, 140, 102, 25, 73, 138, 184, 233, 26, 31, 72, 138, 109, 132, 18, 19, 19, 31, 135, 18, 73, 120, 211, 184, 217, 243, 88, 162, 209, 151, 157, 123, 251, 76, 144, 176, 105, 130, 76, 216, 102, 253, 135, 10, 18, 136, 142, 138, 138, 122, 202, 151, 185, 146, 220, 174, 172, 51, 201, 141, 152, 88, 168, 209, 53, 32, 105, 40, 39, 197, 53, 252, 153, 100, 198, 98, 181, 157, 92, 27, 174, 9, 243, 22, 56, 184, 235, 224, 96, 100, 100, 164, 136, 21, 231, 21, 241, 98, 15, 35, 79, 22, 70, 94, 15, 67, 254, 119, 76, 28, 66, 248, 141, 32, 217, 77, 13, 25, 161, 244, 231, 51, 112, 175, 15, 152, 48, 213, 9, 139, 29, 144, 81, 118, 227, 117, 161, 50, 41, 208, 221, 116, 143, 49, 238, 157, 103, 244, 217, 179, 103, 31, 221, 227, 106, 171, 197, 138, 234, 126, 156, 48, 133, 185, 63, 43, 165, 35, 33, 86, 140, 199, 189, 238, 107, 24, 70, 26, 247, 27, 44, 138, 203, 47, 196, 198, 198, 254, 71, 254, 46, 190, 198, 94, 41, 185, 78, 130, 3, 252, 181, 106, 141, 106, 171, 214, 32, 71, 36, 197, 224, 123, 177, 76, 73, 58, 191, 125, 127, 155, 44, 22, 255, 227, 130, 188, 21, 69, 137, 132, 95, 92, 188, 122, 77, 253, 184, 117, 71, 29, 226, 149, 66, 239, 54, 52, 155, 150, 43, 44, 254, 133, 194, 59, 146, 19, 103, 207, 169, 60, 150, 52, 144, 190, 64, 33, 252, 199, 158, 226, 123, 158, 44, 73, 254, 10, 239, 249, 148, 110, 112, 74, 104, 186, 126, 137, 245, 113, 220, 184, 9, 44, 74, 230, 2, 63, 113, 238, 60, 39, 73, 205, 42, 146, 20, 101, 7, 83, 124, 36, 41, 150, 221, 156, 156, 156, 12, 30, 3, 22, 72, 236, 63, 97, 10, 243, 86, 192, 253, 227, 203, 61, 11, 242, 134, 47, 55, 255, 30, 234, 110, 217, 242, 31, 155, 148, 84, 196, 151, 57, 50, 111, 60, 233, 230, 167, 61, 175, 211, 212, 192, 162, 21, 155, 177, 96, 41, 35, 170, 196, 85, 174, 160, 52, 136, 95, 243, 133, 190, 122, 38, 252, 21, 46, 66, 32, 172, 188, 177, 114, 75, 117, 132, 204, 162, 155, 191, 106, 173, 2, 15, 51, 88, 125, 150, 53, 116, 165, 187, 231, 119, 90, 180, 35, 85, 186, 71, 170, 201, 169, 174, 246, 73, 116, 167, 255, 185, 56, 15, 106, 193, 22, 128, 231, 139, 46, 40, 44, 206, 241, 82, 83, 151, 132, 152, 217, 53, 37, 146, 47, 64, 55, 243, 4, 119, 81, 82, 82, 169, 146, 217, 7, 82, 60, 76, 244, 189, 239, 67, 185, 27, 28, 39, 242, 215, 137, 58, 88, 14, 229, 252, 152, 137, 40, 116, 63, 63, 104, 9, 22, 122, 47, 61, 41, 53, 149, 25, 194, 41, 78, 231, 135, 252, 188, 238, 231, 174, 204, 97, 188, 220, 134, 73, 252, 65, 162, 68, 118, 221, 193, 165, 120, 103, 148, 218, 189, 127, 36, 14, 69, 17, 113, 62, 85, 34, 162, 14, 25, 17, 144, 152, 95, 250, 10, 196, 147, 106, 142, 23, 110, 221, 187, 159, 101, 128, 130, 75, 253, 218, 205, 155, 132, 151, 8, 88, 77, 146, 63, 100, 180, 25, 50, 75, 38, 2, 110, 38, 38, 190, 14, 22, 179, 74, 173, 218, 14, 63, 141, 214, 65, 56, 1, 50, 136, 189, 22, 207, 211, 103, 96, 222, 202, 53, 226, 11, 64, 163, 240, 206, 116, 83, 213, 150, 190, 190, 155, 209, 253, 38, 205, 19, 88, 55, 95, 208, 29, 225, 231, 244, 125, 174, 210, 153, 5, 127, 171, 143, 54, 110, 29, 52, 217, 174, 34, 51, 27, 230, 19, 98, 209, 251, 142, 30, 19, 26, 175, 195, 50, 120, 252, 242, 182, 29, 61, 58, 255, 170, 85, 171, 30, 218, 3, 155, 228, 147, 39, 159, 56, 127, 243, 230, 255, 93, 187, 118, 237, 197, 27, 55, 110, 188, 22, 147, 148, 244, 54, 172, 7, 144, 32, 150, 148, 148, 86, 12, 164, 17, 33, 99, 93, 209, 180, 111, 40, 1, 127, 71, 183, 93, 245, 233, 107, 115, 226, 186, 22, 29, 32, 209, 154, 126, 94, 45, 179, 167, 8, 129, 176, 212, 205, 170, 168, 106, 79, 158, 141, 7, 245, 143, 150, 169, 133, 132, 72, 89, 171, 116, 113, 48, 132, 232, 184, 221, 238, 108, 42, 220, 82, 146, 5, 85, 155, 101, 223, 92, 187, 174, 83, 18, 148, 92, 83, 157, 221, 138, 39, 44, 230, 85, 167, 25, 25, 62, 213, 157, 61, 153, 194, 107, 247, 102, 73, 93, 234, 115, 251, 242, 157, 233, 107, 33, 186, 49, 72, 16, 114, 103, 35, 103, 252, 193, 74, 91, 128, 196, 50, 147, 18, 239, 107, 9, 201, 109, 186, 159, 117, 155, 147, 35, 167, 78, 171, 92, 35, 181, 149, 52, 23, 183, 18, 63, 52, 109, 60, 19, 42, 61, 121, 74, 129, 243, 18, 173, 153, 178, 74, 148, 161, 252, 243, 33, 214, 57, 122, 214, 28, 80, 74, 34, 43, 55, 111, 37, 246, 91, 140, 217, 203, 11, 73, 138, 86, 84, 133, 196, 228, 175, 217, 186, 195, 57, 115, 241, 82, 112, 159, 147, 26, 61, 250, 18, 216, 220, 124, 215, 179, 31, 73, 76, 182, 188, 70, 82, 120, 31, 26, 167, 71, 146, 38, 235, 46, 215, 245, 235, 215, 159, 76, 160, 11, 45, 221, 112, 20, 167, 247, 247, 34, 22, 239, 141, 79, 80, 97, 227, 149, 145, 85, 46, 50, 90, 243, 82, 171, 120, 192, 132, 169, 36, 57, 53, 213, 252, 37, 78, 101, 100, 81, 74, 247, 87, 184, 244, 158, 20, 238, 118, 53, 192, 210, 14, 13, 18, 43, 82, 110, 25, 246, 25, 221, 200, 189, 217, 162, 157, 65, 159, 95, 241, 157, 33, 123, 235, 47, 174, 206, 5, 66, 30, 91, 32, 23, 144, 63, 175, 199, 185, 222, 51, 120, 33, 64, 247, 54, 150, 111, 86, 211, 248, 198, 45, 211, 217, 94, 244, 94, 155, 21, 29, 29, 253, 136, 244, 44, 161, 251, 21, 97, 77, 162, 14, 221, 165, 125, 33, 30, 224, 66, 225, 29, 181, 194, 174, 78, 16, 217, 46, 128, 14, 225, 46, 62, 86, 22, 80, 163, 17, 184, 155, 68, 28, 114, 148, 28, 179, 48, 145, 53, 139, 113, 237, 60, 112, 8, 82, 231, 89, 186, 185, 72, 228, 17, 13, 110, 193, 253, 248, 77, 215, 62, 64, 50, 44, 118, 231, 94, 69, 157, 164, 144, 47, 46, 87, 169, 8, 189, 18, 179, 104, 147, 147, 201, 144, 41, 51, 12, 200, 174, 5, 210, 11, 205, 68, 233, 6, 40, 13, 129, 85, 91, 218, 199, 198, 206, 204, 53, 245, 93, 99, 50, 127, 245, 58, 59, 119, 77, 253, 97, 38, 38, 147, 62, 46, 235, 55, 181, 235, 224, 97, 5, 118, 234, 64, 114, 172, 142, 50, 27, 217, 197, 112, 174, 208, 20, 217, 246, 122, 113, 136, 135, 10, 11, 109, 166, 228, 178, 202, 237, 205, 2, 167, 68, 217, 132, 17, 248, 169, 51, 154, 173, 108, 53, 29, 220, 109, 112, 124, 200, 212, 109, 59, 100, 164, 187, 70, 210, 15, 205, 150, 203, 122, 34, 114, 169, 86, 177, 46, 253, 204, 181, 92, 212, 254, 166, 201, 82, 214, 143, 158, 62, 3, 11, 185, 87, 119, 167, 184, 119, 33, 105, 13, 200, 191, 65, 223, 65, 198, 217, 75, 151, 147, 249, 53, 147, 231, 42, 35, 146, 100, 25, 192, 48, 23, 244, 222, 103, 158, 143, 73, 127, 45, 100, 253, 77, 75, 223, 225, 218, 92, 127, 36, 242, 192, 198, 226, 85, 106, 165, 215, 238, 61, 192, 136, 142, 141, 251, 215, 238, 200, 73, 55, 76, 105, 138, 147, 36, 167, 217, 73, 108, 98, 18, 137, 138, 141, 35, 87, 110, 220, 132, 154, 101, 114, 226, 252, 5, 114, 132, 94, 155, 253, 199, 78, 144, 237, 7, 14, 145, 77, 187, 247, 146, 117, 219, 118, 144, 165, 27, 55, 129, 122, 145, 49, 111, 197, 106, 253, 247, 191, 151, 105, 147, 23, 44, 86, 199, 207, 157, 175, 142, 250, 125, 182, 115, 232, 212, 153, 202, 192, 137, 83, 149, 94, 99, 199, 219, 15, 157, 56, 37, 174, 243, 37, 89, 142, 18, 221, 175, 136, 108, 199, 33, 99, 99, 99, 159, 7, 21, 26, 184, 187, 90, 15, 30, 225, 124, 166, 73, 155, 108, 119, 74, 240, 148, 168, 3, 25, 134, 46, 245, 19, 99, 157, 167, 120, 133, 188, 216, 208, 69, 110, 5, 111, 111, 101, 135, 247, 86, 238, 244, 239, 184, 40, 171, 177, 252, 186, 46, 25, 52, 121, 186, 136, 233, 205, 205, 100, 188, 72, 44, 170, 51, 224, 205, 163, 126, 159, 163, 136, 158, 137, 33, 62, 244, 76, 4, 119, 25, 52, 143, 134, 210, 141, 240, 193, 35, 116, 168, 109, 44, 197, 137, 50, 189, 152, 44, 139, 67, 82, 235, 132, 62, 212, 226, 156, 207, 111, 216, 176, 193, 163, 245, 107, 34, 74, 214, 115, 138, 46, 28, 26, 100, 90, 130, 59, 184, 116, 22, 55, 49, 238, 107, 66, 173, 241, 121, 43, 87, 59, 210, 43, 140, 247, 18, 247, 17, 133, 251, 63, 243, 134, 218, 10, 196, 154, 171, 208, 141, 75, 254, 70, 97, 132, 46, 92, 86, 215, 72, 106, 18, 89, 190, 151, 209, 166, 66, 100, 147, 130, 75, 255, 204, 165, 203, 100, 231, 193, 195, 32, 85, 104, 208, 235, 75, 58, 143, 28, 203, 136, 239, 51, 31, 4, 5, 96, 110, 225, 111, 88, 118, 235, 55, 245, 64, 97, 198, 206, 191, 207, 223, 62, 198, 110, 243, 242, 57, 98, 186, 177, 203, 54, 110, 114, 216, 138, 84, 102, 155, 170, 96, 178, 34, 205, 137, 60, 112, 111, 66, 178, 31, 37, 76, 163, 86, 175, 31, 149, 114, 29, 123, 40, 197, 219, 117, 85, 62, 107, 211, 73, 121, 167, 101, 123, 229, 153, 166, 109, 149, 135, 26, 133, 131, 103, 68, 177, 213, 105, 238, 180, 213, 110, 234, 164, 247, 180, 147, 110, 178, 84, 91, 117, 24, 13, 97, 104, 174, 209, 8, 218, 219, 233, 116, 13, 128, 97, 64, 189, 41, 36, 216, 129, 46, 46, 196, 243, 193, 187, 2, 165, 82, 249, 27, 181, 134, 122, 107, 99, 54, 95, 99, 248, 70, 124, 168, 188, 41, 198, 254, 151, 136, 76, 199, 33, 165, 159, 119, 193, 77, 245, 235, 156, 121, 204, 114, 115, 145, 68, 246, 31, 24, 119, 162, 14, 189, 153, 251, 141, 159, 34, 72, 225, 18, 36, 234, 100, 224, 46, 99, 191, 59, 17, 29, 253, 8, 16, 8, 75, 182, 24, 63, 197, 1, 174, 73, 185, 102, 176, 4, 183, 246, 222, 111, 21, 161, 199, 38, 36, 178, 120, 85, 162, 195, 241, 186, 108, 37, 250, 58, 7, 215, 174, 93, 123, 2, 196, 81, 32, 94, 85, 173, 123, 95, 150, 205, 155, 145, 174, 39, 139, 175, 118, 112, 17, 36, 88, 179, 49, 241, 76, 229, 142, 252, 242, 199, 92, 157, 53, 247, 245, 48, 127, 66, 69, 231, 181, 102, 223, 147, 146, 237, 187, 106, 60, 38, 155, 2, 113, 23, 217, 242, 72, 143, 200, 93, 68, 105, 204, 115, 185, 55, 183, 171, 16, 43, 19, 139, 120, 72, 38, 221, 98, 140, 32, 233, 102, 0, 118, 225, 252, 154, 92, 60, 127, 254, 252, 99, 25, 157, 71, 70, 231, 37, 234, 17, 89, 102, 50, 61, 238, 139, 77, 219, 144, 201, 243, 23, 113, 247, 151, 101, 74, 59, 170, 84, 35, 249, 84, 70, 155, 10, 74, 74, 109, 88, 199, 146, 75, 151, 33, 174, 174, 218, 42, 213, 132, 204, 101, 29, 22, 214, 23, 232, 185, 65, 150, 182, 119, 130, 148, 60, 32, 213, 26, 146, 149, 155, 183, 137, 185, 218, 156, 137, 205, 132, 252, 140, 109, 113, 63, 99, 144, 12, 215, 169, 87, 208, 118, 160, 129, 185, 131, 13, 28, 52, 58, 128, 103, 233, 211, 214, 29, 217, 207, 48, 239, 33, 124, 163, 91, 130, 231, 21, 192, 223, 149, 102, 241, 76, 87, 125, 45, 16, 44, 60, 91, 48, 192, 42, 189, 125, 220, 250, 55, 247, 224, 239, 19, 189, 106, 225, 90, 181, 25, 50, 66, 189, 116, 237, 186, 184, 241, 246, 197, 37, 39, 191, 47, 229, 94, 160, 85, 137, 240, 105, 129, 203, 37, 30, 112, 17, 243, 90, 183, 125, 167, 34, 4, 171, 67, 45, 140, 81, 64, 169, 65, 237, 222, 253, 85, 145, 188, 65, 73, 225, 35, 111, 139, 177, 32, 57, 167, 211, 249, 33, 183, 60, 225, 24, 218, 35, 116, 183, 8, 15, 3, 180, 185, 98, 11, 125, 213, 250, 100, 233, 134, 127, 156, 60, 22, 17, 153, 25, 130, 52, 187, 197, 236, 118, 123, 67, 38, 156, 112, 248, 8, 236, 106, 13, 120, 32, 67, 50, 200, 16, 101, 173, 160, 40, 33, 30, 56, 118, 66, 60, 140, 134, 170, 105, 164, 229, 128, 97, 250, 255, 113, 75, 92, 38, 202, 18, 188, 235, 4, 181, 54, 141, 67, 39, 79, 105, 188, 203, 251, 24, 79, 11, 106, 122, 137, 50, 244, 90, 53, 163, 132, 196, 210, 44, 255, 94, 183, 81, 131, 150, 96, 101, 50, 225, 178, 19, 9, 67, 176, 251, 134, 133, 68, 156, 55, 189, 38, 31, 102, 113, 238, 216, 223, 95, 190, 124, 249, 113, 97, 189, 129, 100, 155, 237, 211, 10, 144, 229, 104, 117, 210, 142, 34, 213, 72, 222, 151, 222, 156, 9, 203, 142, 90, 17, 3, 121, 55, 14, 39, 184, 194, 193, 130, 135, 145, 158, 165, 239, 201, 205, 202, 106, 112, 191, 174, 75, 230, 175, 94, 43, 230, 106, 151, 89, 126, 206, 87, 111, 77, 84, 66, 194, 43, 16, 107, 131, 155, 165, 222, 15, 3, 84, 56, 167, 114, 29, 186, 7, 117, 171, 54, 65, 132, 108, 67, 219, 206, 191, 186, 196, 33, 124, 64, 190, 194, 131, 116, 157, 120, 169, 89, 91, 99, 245, 150, 109, 194, 170, 52, 64, 253, 200, 124, 223, 34, 16, 25, 61, 184, 162, 70, 176, 25, 43, 4, 191, 120, 9, 138, 156, 13, 87, 2, 74, 87, 75, 226, 144, 112, 44, 216, 57, 22, 8, 235, 160, 139, 32, 190, 162, 40, 85, 229, 207, 247, 114, 142, 247, 243, 88, 105, 121, 94, 10, 1, 199, 101, 137, 60, 64, 144, 47, 82, 130, 104, 250, 227, 16, 225, 130, 59, 19, 25, 185, 33, 175, 47, 9, 59, 233, 108, 24, 68, 102, 239, 114, 190, 208, 59, 100, 5, 30, 243, 119, 99, 214, 49, 181, 184, 39, 205, 95, 36, 4, 193, 127, 79, 76, 77, 101, 177, 205, 171, 55, 110, 26, 239, 180, 108, 175, 65, 137, 71, 41, 222, 111, 49, 132, 183, 162, 250, 79, 35, 151, 158, 169, 180, 232, 3, 131, 108, 148, 226, 87, 185, 60, 45, 248, 244, 245, 63, 116, 196, 243, 247, 185, 51, 74, 191, 31, 250, 51, 121, 170, 113, 184, 79, 2, 237, 226, 154, 128, 171, 175, 102, 207, 126, 122, 28, 183, 190, 99, 18, 19, 63, 205, 32, 241, 197, 39, 43, 137, 89, 254, 151, 46, 61, 11, 86, 30, 37, 126, 82, 161, 83, 79, 13, 226, 73, 126, 202, 108, 93, 231, 37, 97, 198, 157, 244, 68, 207, 133, 185, 209, 183, 236, 221, 207, 106, 111, 89, 34, 154, 15, 49, 227, 80, 174, 228, 4, 27, 188, 63, 150, 46, 215, 185, 139, 245, 92, 108, 108, 236, 11, 89, 217, 144, 138, 159, 83, 29, 142, 138, 188, 39, 167, 65, 159, 55, 221, 23, 139, 214, 124, 94, 165, 125, 32, 249, 123, 186, 47, 106, 155, 206, 238, 18, 46, 168, 221, 132, 114, 178, 68, 46, 178, 79, 247, 218, 203, 146, 147, 147, 159, 146, 114, 33, 176, 107, 9, 34, 253, 221, 127, 66, 2, 211, 222, 100, 113, 27, 214, 32, 214, 98, 181, 25, 22, 123, 163, 11, 211, 214, 189, 251, 53, 30, 31, 0, 151, 220, 195, 153, 89, 128, 233, 43, 168, 149, 124, 43, 220, 174, 75, 55, 110, 214, 225, 152, 16, 247, 130, 120, 218, 254, 227, 39, 52, 46, 133, 85, 45, 51, 187, 251, 244, 54, 13, 148, 196, 223, 101, 165, 24, 105, 118, 136, 89, 105, 133, 90, 119, 224, 201, 75, 183, 136, 166, 44, 47, 99, 169, 31, 57, 208, 201, 77, 200, 216, 155, 55, 111, 254, 31, 183, 94, 6, 184, 19, 142, 106, 52, 118, 89, 147, 114, 205, 29, 79, 2, 1, 37, 154, 211, 23, 46, 10, 203, 232, 170, 152, 151, 12, 72, 50, 55, 93, 164, 55, 136, 186, 201, 131, 39, 78, 178, 36, 16, 56, 150, 56, 174, 207, 194, 5, 213, 26, 144, 189, 71, 142, 9, 230, 130, 121, 237, 67, 7, 164, 209, 127, 77, 199, 35, 190, 108, 52, 164, 235, 243, 6, 221, 32, 64, 143, 78, 40, 85, 25, 73, 207, 241, 36, 28, 244, 224, 137, 83, 218, 254, 99, 199, 253, 69, 146, 211, 205, 100, 152, 158, 245, 198, 55, 62, 107, 89, 253, 230, 250, 141, 118, 240, 148, 192, 28, 120, 107, 227, 6, 110, 113, 112, 15, 22, 166, 36, 22, 159, 152, 40, 60, 5, 32, 110, 123, 130, 30, 15, 118, 23, 157, 50, 57, 79, 111, 211, 81, 154, 142, 103, 232, 61, 54, 155, 75, 229, 169, 182, 134, 173, 50, 213, 252, 25, 254, 22, 136, 181, 76, 144, 244, 168, 244, 103, 2, 17, 92, 67, 182, 6, 213, 111, 73, 138, 183, 235, 170, 238, 57, 124, 84, 100, 70, 199, 41, 188, 13, 28, 90, 149, 136, 116, 227, 72, 209, 174, 120, 31, 43, 220, 239, 61, 118, 2, 43, 45, 176, 178, 1, 177, 171, 76, 195, 149, 193, 185, 108, 227, 38, 145, 108, 33, 92, 86, 195, 51, 178, 88, 100, 87, 48, 239, 5, 72, 84, 77, 51, 18, 147, 83, 244, 65, 147, 166, 177, 198, 192, 247, 83, 139, 108, 240, 173, 100, 29, 145, 25, 154, 47, 43, 129, 121, 243, 121, 80, 235, 186, 33, 23, 198, 214, 109, 223, 54, 48, 152, 140, 153, 100, 141, 177, 90, 176, 122, 45, 244, 147, 231, 47, 120, 36, 104, 186, 136, 174, 228, 90, 157, 238, 94, 130, 98, 94, 221, 238, 206, 34, 149, 140, 13, 59, 118, 105, 220, 186, 174, 145, 94, 124, 86, 190, 102, 208, 220, 22, 132, 23, 20, 85, 37, 229, 59, 246, 116, 130, 171, 185, 116, 38, 93, 173, 95, 112, 37, 28, 200, 174, 76, 74, 73, 209, 61, 16, 216, 56, 105, 46, 115, 121, 75, 218, 225, 233, 253, 183, 130, 134, 154, 78, 210, 236, 118, 125, 246, 178, 149, 32, 103, 104, 117, 249, 135, 184, 222, 253, 197, 188, 120, 73, 154, 97, 215, 227, 252, 249, 243, 247, 83, 19, 226, 168, 171, 181, 215, 98, 174, 184, 211, 203, 8, 241, 98, 177, 193, 117, 134, 90, 198, 169, 11, 254, 6, 81, 4, 227, 228, 185, 11, 228, 70, 108, 172, 56, 151, 189, 190, 186, 89, 233, 235, 255, 120, 28, 85, 36, 31, 37, 138, 174, 40, 181, 123, 247, 103, 181, 178, 174, 76, 229, 140, 159, 39, 248, 27, 40, 219, 129, 228, 48, 72, 172, 11, 182, 204, 88, 127, 184, 95, 225, 21, 238, 121, 136, 137, 66, 147, 117, 122, 223, 43, 162, 27, 13, 52, 65, 56, 125, 250, 116, 126, 41, 169, 7, 75, 69, 144, 32, 111, 221, 4, 26, 119, 43, 206, 89, 182, 146, 89, 60, 98, 119, 109, 117, 60, 66, 184, 147, 122, 141, 29, 79, 73, 103, 183, 59, 113, 135, 158, 66, 46, 95, 226, 165, 116, 129, 101, 2, 235, 107, 183, 110, 119, 60, 222, 36, 156, 237, 16, 193, 221, 74, 23, 8, 29, 36, 190, 152, 25, 151, 152, 88, 33, 35, 55, 160, 47, 115, 194, 73, 161, 20, 29, 95, 81, 146, 108, 45, 22, 178, 126, 227, 39, 179, 154, 201, 74, 92, 146, 143, 201, 111, 125, 219, 128, 204, 93, 177, 218, 213, 212, 89, 215, 166, 72, 86, 13, 219, 145, 202, 90, 157, 61, 70, 255, 170, 138, 36, 13, 120, 191, 32, 169, 65, 147, 220, 4, 191, 210, 151, 243, 150, 202, 116, 152, 75, 247, 218, 205, 155, 198, 91, 45, 218, 233, 162, 147, 71, 72, 38, 203, 113, 160, 70, 175, 106, 183, 31, 72, 205, 158, 63, 26, 125, 127, 155, 228, 72, 78, 77, 181, 115, 66, 235, 225, 35, 1, 229, 230, 241, 108, 38, 233, 103, 119, 56, 156, 145, 191, 78, 78, 171, 208, 169, 167, 94, 173, 123, 36, 189, 70, 157, 89, 73, 141, 197, 229, 31, 98, 147, 213, 194, 87, 175, 129, 169, 181, 23, 83, 54, 24, 60, 105, 186, 147, 101, 48, 119, 202, 56, 131, 89, 184, 167, 129, 40, 225, 25, 177, 125, 93, 87, 59, 123, 233, 178, 193, 21, 138, 74, 120, 75, 220, 145, 54, 122, 255, 17, 250, 177, 177, 9, 9, 42, 148, 54, 208, 227, 144, 149, 155, 182, 146, 231, 154, 186, 200, 46, 196, 75, 242, 91, 5, 174, 29, 59, 101, 193, 98, 35, 62, 41, 73, 155, 183, 98, 181, 193, 60, 21, 126, 236, 42, 18, 234, 99, 25, 84, 32, 116, 44, 1, 111, 16, 147, 74, 164, 155, 246, 134, 125, 7, 105, 167, 46, 92, 20, 97, 154, 83, 116, 147, 91, 212, 147, 7, 2, 113, 15, 187, 89, 169, 37, 210, 143, 39, 168, 40, 240, 224, 129, 101, 83, 194, 15, 242, 88, 176, 251, 21, 117, 104, 182, 47, 107, 235, 199, 206, 156, 117, 245, 121, 212, 180, 175, 125, 88, 96, 216, 205, 26, 31, 31, 255, 24, 20, 25, 131, 251, 179, 112, 120, 39, 13, 22, 12, 32, 27, 200, 40, 133, 214, 93, 124, 103, 14, 110, 176, 211, 116, 33, 2, 171, 230, 181, 204, 220, 236, 210, 110, 127, 152, 121, 85, 166, 196, 65, 218, 13, 253, 153, 45, 100, 144, 96, 193, 30, 50, 74, 152, 237, 134, 253, 44, 22, 235, 43, 55, 111, 222, 124, 216, 116, 28, 54, 199, 208, 9, 193, 85, 123, 153, 66, 137, 177, 167, 14, 25, 173, 21, 88, 34, 79, 103, 242, 104, 147, 112, 61, 138, 19, 124, 138, 162, 20, 200, 68, 140, 54, 63, 191, 126, 195, 120, 41, 136, 106, 171, 82, 143, 157, 91, 104, 38, 19, 170, 128, 32, 94, 162, 223, 43, 119, 195, 48, 106, 33, 157, 215, 56, 65, 14, 48, 199, 104, 189, 108, 100, 68, 9, 8, 211, 153, 141, 138, 142, 38, 149, 58, 247, 210, 32, 209, 165, 253, 240, 81, 68, 113, 58, 111, 235, 109, 101, 65, 247, 15, 113, 168, 202, 190, 146, 164, 124, 77, 32, 57, 73, 16, 109, 187, 97, 163, 156, 80, 134, 227, 77, 56, 30, 18, 196, 152, 107, 191, 118, 83, 178, 118, 251, 78, 81, 223, 59, 208, 151, 141, 132, 124, 95, 196, 185, 194, 6, 167, 184, 126, 172, 221, 22, 250, 13, 115, 149, 135, 120, 145, 24, 148, 5, 196, 251, 143, 159, 114, 155, 73, 78, 173, 98, 40, 145, 112, 151, 70, 89, 41, 10, 0, 196, 45, 186, 225, 88, 145, 163, 112, 55, 88, 149, 162, 236, 233, 229, 102, 109, 161, 4, 203, 152, 191, 198, 85, 163, 204, 175, 105, 164, 188, 177, 66, 171, 242, 30, 78, 212, 161, 150, 200, 215, 220, 18, 209, 223, 107, 21, 161, 139, 248, 134, 63, 186, 94, 184, 99, 96, 53, 26, 145, 245, 59, 119, 139, 4, 151, 145, 222, 226, 73, 30, 146, 139, 88, 58, 255, 134, 29, 187, 88, 217, 195, 215, 93, 122, 179, 34, 248, 62, 227, 38, 26, 235, 183, 239, 36, 7, 79, 158, 2, 81, 112, 225, 218, 235, 149, 153, 56, 131, 88, 196, 52, 93, 255, 205, 37, 255, 118, 209, 62, 116, 202, 12, 50, 108, 202, 76, 72, 10, 98, 69, 241, 66, 77, 7, 190, 79, 193, 214, 29, 12, 72, 32, 2, 114, 142, 191, 149, 165, 123, 191, 167, 99, 210, 185, 238, 232, 18, 78, 63, 163, 66, 179, 95, 102, 133, 86, 107, 8, 117, 137, 46, 181, 33, 69, 233, 229, 107, 194, 140, 249, 223, 84, 77, 91, 6, 199, 248, 237, 207, 191, 52, 232, 219, 200, 18, 119, 124, 172, 97, 131, 77, 17, 156, 79, 161, 240, 78, 250, 249, 203, 87, 132, 48, 252, 176, 44, 36, 238, 228, 146, 234, 0, 217, 53, 138, 79, 76, 210, 233, 121, 104, 221, 70, 141, 35, 22, 67, 147, 200, 242, 227, 204, 198, 159, 165, 251, 191, 130, 216, 188, 84, 239, 217, 87, 133, 205, 139, 39, 217, 195, 91, 4, 213, 139, 89, 254, 63, 142, 159, 236, 52, 187, 89, 51, 33, 4, 207, 230, 8, 226, 214, 92, 214, 142, 76, 156, 183, 128, 181, 238, 250, 138, 222, 203, 233, 17, 80, 81, 222, 125, 4, 74, 86, 32, 27, 86, 115, 149, 210, 36, 199, 37, 38, 214, 230, 42, 53, 204, 35, 33, 90, 128, 89, 241, 12, 23, 229, 165, 77, 32, 168, 1, 27, 231, 79, 90, 119, 116, 199, 247, 138, 181, 13, 142, 246, 94, 112, 189, 225, 153, 6, 171, 178, 243, 136, 177, 202, 141, 24, 225, 9, 39, 91, 111, 36, 36, 136, 77, 118, 238, 61, 123, 246, 96, 7, 147, 123, 136, 32, 69, 137, 195, 43, 66, 22, 171, 105, 255, 161, 46, 193, 0, 63, 53, 245, 45, 42, 215, 226, 77, 153, 33, 22, 152, 221, 153, 89, 96, 228, 197, 154, 75, 88, 145, 240, 193, 63, 169, 112, 222, 64, 10, 160, 63, 106, 43, 92, 145, 212, 234, 253, 163, 194, 23, 16, 88, 128, 158, 207, 228, 2, 198, 62, 3, 58, 22, 240, 210, 2, 16, 76, 87, 108, 95, 215, 97, 110, 93, 81, 131, 88, 145, 199, 87, 231, 44, 91, 233, 78, 120, 161, 171, 118, 83, 250, 250, 172, 201, 181, 38, 94, 187, 83, 226, 184, 46, 44, 151, 230, 3, 134, 177, 194, 231, 22, 3, 134, 9, 189, 84, 38, 124, 0, 249, 27, 16, 83, 165, 227, 193, 244, 8, 74, 138, 255, 189, 0, 241, 56, 104, 127, 201, 37, 190, 88, 92, 177, 44, 93, 212, 64, 125, 168, 172, 23, 29, 80, 65, 144, 133, 232, 194, 247, 124, 179, 182, 238, 214, 98, 80, 2, 36, 200, 62, 179, 122, 151, 156, 40, 217, 123, 40, 233, 247, 224, 114, 130, 228, 143, 165, 43, 116, 11, 93, 173, 114, 141, 36, 152, 224, 207, 101, 37, 73, 75, 106, 1, 199, 50, 186, 175, 221, 184, 169, 125, 74, 55, 10, 31, 135, 69, 184, 133, 227, 101, 23, 29, 144, 5, 108, 38, 232, 239, 141, 152, 248, 4, 81, 42, 83, 32, 43, 201, 30, 98, 142, 146, 146, 146, 222, 20, 26, 193, 163, 127, 159, 227, 132, 248, 168, 167, 110, 55, 224, 133, 41, 199, 37, 222, 62, 161, 27, 51, 122, 174, 58, 151, 46, 172, 207, 61, 21, 159, 137, 24, 109, 199, 159, 70, 179, 246, 91, 149, 179, 73, 148, 178, 172, 220, 43, 116, 19, 122, 238, 242, 21, 231, 182, 125, 7, 216, 198, 180, 44, 37, 73, 43, 212, 183, 172, 140, 53, 102, 215, 195, 5, 207, 52, 148, 148, 189, 221, 178, 189, 190, 105, 247, 94, 177, 70, 57, 232, 253, 209, 212, 124, 221, 16, 193, 77, 144, 34, 206, 5, 139, 25, 139, 139, 140, 154, 57, 199, 1, 238, 35, 225, 106, 10, 245, 67, 12, 0, 118, 107, 224, 166, 252, 186, 107, 31, 221, 161, 184, 202, 24, 147, 21, 229, 253, 44, 88, 0, 249, 228, 88, 220, 129, 227, 39, 116, 209, 70, 139, 107, 184, 26, 188, 148, 1, 226, 68, 161, 89, 92, 192, 242, 242, 133, 167, 48, 107, 73, 18, 23, 15, 139, 163, 38, 178, 70, 225, 161, 132, 205, 196, 67, 244, 129, 138, 252, 117, 34, 137, 137, 143, 215, 21, 167, 43, 177, 21, 116, 34, 37, 215, 155, 92, 56, 206, 178, 60, 79, 93, 184, 164, 66, 146, 12, 16, 212, 71, 116, 49, 174, 217, 171, 31, 225, 177, 212, 219, 216, 67, 85, 213, 146, 233, 145, 187, 228, 202, 157, 46, 191, 39, 205, 238, 208, 55, 239, 222, 11, 245, 96, 110, 193, 119, 111, 45, 159, 222, 109, 217, 14, 106, 200, 12, 225, 250, 166, 159, 59, 36, 131, 123, 38, 211, 112, 106, 90, 83, 215, 113, 53, 89, 66, 206, 74, 146, 60, 37, 105, 243, 230, 205, 2, 161, 179, 247, 208, 239, 221, 23, 14, 118, 146, 110, 20, 192, 245, 246, 57, 243, 168, 220, 138, 13, 186, 155, 44, 83, 130, 160, 68, 33, 26, 82, 119, 207, 226, 253, 117, 219, 198, 39, 38, 38, 230, 57, 145, 52, 55, 120, 242, 116, 222, 90, 236, 246, 18, 30, 81, 100, 239, 106, 242, 124, 66, 124, 126, 95, 126, 188, 135, 248, 51, 193, 74, 163, 82, 211, 236, 172, 25, 0, 60, 111, 89, 109, 167, 38, 18, 131, 152, 130, 85, 253, 150, 228, 224, 137, 147, 110, 25, 191, 117, 219, 119, 170, 16, 255, 116, 19, 229, 29, 38, 73, 56, 79, 43, 90, 217, 9, 171, 18, 188, 105, 224, 225, 25, 49, 125, 150, 194, 67, 56, 176, 113, 156, 151, 144, 144, 240, 95, 116, 191, 222, 27, 36, 41, 4, 3, 152, 70, 216, 202, 77, 91, 28, 240, 80, 86, 236, 228, 191, 86, 80, 98, 177, 134, 122, 60, 177, 24, 83, 2, 170, 158, 157, 68, 35, 0, 72, 129, 113, 1, 114, 5, 136, 1, 118, 207, 251, 142, 30, 103, 11, 136, 67, 85, 59, 101, 101, 1, 51, 147, 177, 162, 40, 125, 88, 188, 111, 215, 30, 200, 30, 53, 196, 70, 66, 60, 80, 79, 55, 9, 39, 165, 34, 186, 235, 81, 49, 49, 66, 192, 160, 163, 137, 200, 68, 87, 145, 239, 220, 113, 195, 210, 223, 50, 146, 133, 69, 23, 178, 19, 155, 245, 31, 74, 90, 13, 28, 78, 38, 204, 91, 152, 196, 215, 161, 37, 25, 185, 58, 165, 107, 88, 85, 36, 201, 244, 24, 243, 155, 189, 24, 223, 85, 67, 153, 138, 183, 69, 67, 196, 149, 96, 145, 59, 40, 132, 12, 156, 206, 45, 116, 124, 68, 127, 4, 23, 100, 93, 222, 73, 161, 146, 175, 113, 73, 233, 252, 192, 141, 24, 66, 7, 52, 233, 238, 45, 101, 114, 250, 131, 36, 55, 101, 135, 204, 229, 205, 140, 83, 85, 127, 114, 247, 192, 108, 24, 198, 230, 70, 196, 230, 225, 90, 221, 215, 40, 12, 226, 135, 78, 185, 201, 114, 86, 19, 195, 248, 207, 47, 211, 249, 254, 148, 222, 27, 111, 211, 241, 35, 215, 115, 53, 96, 227, 245, 223, 198, 173, 217, 61, 34, 44, 37, 38, 131, 87, 189, 33, 89, 241, 143, 187, 237, 212, 92, 83, 162, 153, 176, 138, 27, 177, 102, 160, 177, 113, 164, 100, 251, 110, 26, 100, 202, 130, 5, 156, 25, 162, 20, 29, 60, 216, 166, 160, 86, 83, 183, 182, 50, 221, 8, 206, 210, 52, 99, 21, 87, 120, 98, 210, 144, 240, 55, 119, 42, 70, 9, 37, 47, 112, 125, 192, 250, 3, 235, 159, 9, 49, 100, 67, 21, 76, 132, 31, 224, 187, 87, 228, 113, 223, 175, 187, 244, 214, 232, 166, 68, 220, 107, 215, 233, 70, 164, 162, 121, 141, 64, 4, 99, 28, 210, 233, 100, 93, 8, 78, 156, 61, 231, 4, 98, 129, 29, 170, 63, 119, 132, 112, 243, 2, 153, 116, 24, 49, 198, 144, 22, 184, 197, 116, 128, 104, 249, 155, 190, 44, 52, 114, 155, 33, 74, 68, 63, 128, 20, 24, 220, 180, 112, 176, 85, 155, 183, 26, 182, 2, 101, 201, 130, 213, 107, 21, 190, 128, 44, 201, 238, 77, 204, 119, 139, 162, 132, 99, 59, 28, 151, 238, 44, 157, 176, 80, 193, 3, 36, 4, 207, 65, 112, 225, 192, 177, 19, 58, 39, 200, 159, 51, 138, 175, 66, 82, 174, 91, 152, 160, 94, 75, 54, 47, 162, 198, 146, 46, 202, 106, 92, 162, 171, 152, 159, 194, 107, 178, 145, 91, 80, 92, 211, 234, 115, 17, 122, 189, 84, 68, 55, 166, 218, 2, 110, 54, 72, 48, 201, 232, 154, 176, 236, 72, 186, 8, 140, 153, 245, 231, 109, 198, 104, 58, 101, 22, 79, 251, 112, 62, 194, 173, 220, 200, 236, 80, 165, 36, 78, 132, 165, 237, 7, 146, 156, 237, 107, 210, 76, 70, 132, 149, 148, 148, 244, 191, 228, 228, 228, 80, 122, 13, 111, 240, 44, 111, 13, 230, 7, 174, 81, 113, 94, 176, 15, 98, 18, 34, 169, 137, 222, 99, 112, 255, 126, 33, 213, 145, 250, 186, 129, 16, 155, 167, 65, 166, 216, 170, 123, 19, 65, 239, 51, 118, 109, 132, 219, 149, 149, 8, 81, 11, 118, 226, 188, 5, 194, 47, 127, 148, 226, 62, 211, 241, 114, 73, 25, 207, 29, 152, 255, 255, 242, 21, 253, 197, 102, 109, 13, 104, 208, 237, 171, 166, 111, 8, 207, 98, 173, 192, 155, 15, 172, 222, 178, 45, 141, 43, 92, 173, 133, 99, 67, 143, 87, 250, 60, 236, 230, 207, 157, 29, 254, 166, 28, 39, 202, 156, 142, 81, 194, 243, 7, 61, 80, 251, 140, 155, 168, 213, 238, 253, 163, 254, 0, 37, 75, 151, 71, 169, 115, 182, 61, 95, 112, 108, 200, 25, 248, 136, 110, 236, 65, 27, 118, 198, 226, 165, 178, 254, 43, 60, 231, 238, 205, 9, 234, 191, 6, 25, 65, 166, 169, 42, 203, 178, 76, 72, 74, 6, 75, 72, 7, 173, 81, 115, 252, 197, 31, 150, 36, 60, 124, 16, 39, 91, 181, 101, 155, 113, 253, 102, 52, 81, 185, 126, 167, 193, 31, 62, 31, 186, 76, 136, 69, 161, 164, 184, 89, 161, 75, 192, 214, 189, 251, 141, 242, 244, 129, 238, 53, 246, 55, 183, 76, 152, 175, 201, 47, 62, 184, 164, 25, 160, 235, 60, 228, 160, 64, 143, 199, 134, 125, 7, 233, 144, 133, 200, 118, 154, 53, 155, 64, 237, 164, 200, 4, 157, 144, 158, 197, 37, 200, 246, 208, 197, 139, 255, 133, 227, 68, 199, 199, 67, 2, 144, 6, 110, 29, 150, 200, 244, 109, 3, 131, 126, 15, 118, 254, 170, 174, 251, 100, 1, 243, 207, 97, 199, 165, 239, 233, 32, 172, 7, 186, 192, 233, 208, 113, 193, 181, 171, 78, 255, 154, 194, 162, 9, 201, 24, 95, 118, 238, 205, 250, 61, 66, 161, 255, 22, 250, 74, 23, 69, 50, 243, 239, 101, 250, 205, 216, 216, 52, 254, 189, 230, 200, 2, 6, 222, 72, 146, 254, 61, 147, 126, 75, 165, 38, 205, 212, 5, 139, 181, 222, 191, 76, 208, 106, 244, 236, 71, 46, 115, 133, 37, 63, 196, 36, 135, 102, 49, 30, 41, 72, 189, 40, 61, 167, 3, 162, 196, 135, 215, 43, 26, 99, 255, 248, 147, 121, 38, 68, 92, 23, 92, 122, 160, 182, 3, 4, 70, 239, 95, 93, 170, 67, 129, 76, 234, 122, 190, 196, 189, 77, 245, 164, 139, 89, 58, 244, 141, 27, 206, 133, 107, 214, 145, 69, 107, 55, 192, 188, 147, 161, 83, 102, 178, 24, 177, 88, 168, 203, 113, 111, 3, 204, 35, 255, 200, 147, 123, 246, 92, 123, 208, 83, 124, 76, 190, 239, 168, 133, 58, 141, 137, 148, 30, 59, 174, 65, 28, 53, 84, 242, 232, 120, 27, 172, 44, 169, 106, 125, 232, 72, 227, 78, 78, 154, 59, 119, 174, 44, 22, 159, 159, 78, 209, 30, 248, 135, 21, 155, 183, 178, 58, 83, 23, 81, 250, 63, 70, 41, 172, 61, 81, 2, 51, 127, 245, 90, 118, 45, 96, 131, 25, 62, 100, 4, 219, 216, 88, 149, 180, 228, 114, 57, 187, 180, 96, 97, 115, 220, 114, 224, 48, 245, 194, 149, 171, 226, 218, 31, 142, 79, 77, 253, 24, 173, 202, 224, 33, 72, 182, 219, 4, 159, 58, 228, 39, 192, 21, 238, 58, 106, 156, 19, 172, 153, 138, 30, 100, 214, 252, 117, 115, 23, 119, 89, 94, 196, 86, 169, 22, 104, 149, 166, 113, 82, 248, 193, 23, 75, 64, 90, 212, 30, 134, 135, 22, 222, 219, 11, 68, 15, 62, 41, 207, 122, 213, 209, 69, 93, 36, 50, 204, 164, 59, 189, 18, 188, 1, 112, 158, 204, 18, 165, 41, 142, 248, 26, 61, 94, 3, 200, 169, 16, 53, 117, 147, 254, 90, 4, 29, 7, 200, 219, 212, 250, 155, 191, 106, 173, 32, 72, 72, 16, 250, 208, 211, 231, 73, 139, 34, 8, 166, 87, 163, 22, 8, 179, 74, 233, 162, 168, 230, 110, 24, 198, 44, 236, 254, 19, 166, 136, 5, 112, 153, 47, 27, 6, 79, 231, 234, 224, 25, 191, 80, 183, 7, 137, 37, 69, 92, 181, 163, 94, 235, 35, 33, 246, 6, 223, 7, 92, 103, 160, 79, 107, 123, 61, 212, 109, 145, 131, 8, 130, 175, 137, 85, 242, 185, 64, 92, 150, 187, 45, 21, 91, 233, 170, 44, 161, 42, 33, 41, 201, 234, 26, 73, 49, 103, 109, 178, 146, 80, 33, 145, 250, 56, 87, 118, 119, 180, 182, 100, 253, 63, 212, 90, 91, 200, 90, 122, 153, 187, 114, 132, 240, 141, 5, 104, 128, 2, 233, 180, 26, 52, 92, 59, 116, 226, 84, 178, 60, 79, 62, 102, 104, 179, 207, 77, 32, 4, 158, 197, 43, 240, 69, 64, 199, 216, 86, 164, 18, 179, 84, 97, 145, 15, 189, 173, 39, 105, 87, 214, 33, 230, 42, 79, 212, 161, 159, 5, 201, 93, 224, 18, 255, 143, 201, 221, 42, 238, 189, 250, 60, 153, 233, 180, 152, 44, 102, 153, 250, 216, 201, 166, 2, 23, 111, 159, 182, 240, 111, 49, 191, 59, 233, 38, 241, 33, 177, 142, 8, 50, 184, 124, 249, 242, 3, 192, 193, 140, 40, 55, 109, 81, 225, 61, 37, 188, 196, 193, 45, 107, 212, 78, 55, 128, 207, 209, 13, 75, 235, 193, 35, 196, 205, 20, 13, 143, 190, 193, 132, 80, 198, 171, 96, 221, 202, 130, 31, 214, 8, 161, 244, 34, 255, 71, 159, 213, 167, 233, 231, 46, 255, 103, 179, 34, 89, 149, 157, 204, 27, 121, 68, 224, 17, 164, 220, 106, 106, 13, 92, 88, 112, 29, 192, 162, 40, 58, 104, 132, 230, 80, 170, 53, 88, 45, 144, 32, 36, 10, 239, 65, 147, 59, 51, 113, 29, 241, 128, 38, 39, 39, 131, 84, 28, 235, 154, 81, 255, 135, 129, 208, 205, 129, 89, 67, 212, 2, 208, 77, 110, 66, 232, 178, 240, 168, 47, 139, 188, 105, 161, 121, 142, 191, 215, 93, 55, 21, 79, 45, 239, 205, 123, 246, 233, 144, 162, 207, 200, 158, 46, 104, 107, 182, 110, 23, 15, 169, 221, 131, 134, 104, 110, 147, 59, 108, 166, 36, 201, 102, 64, 51, 98, 200, 110, 45, 16, 22, 65, 174, 68, 69, 137, 164, 153, 206, 89, 184, 190, 144, 129, 250, 38, 125, 111, 25, 167, 83, 99, 101, 0, 219, 246, 29, 96, 59, 106, 161, 75, 234, 45, 174, 3, 11, 227, 183, 221, 126, 96, 9, 26, 208, 186, 137, 127, 151, 237, 244, 240, 185, 51, 147, 16, 35, 207, 49, 37, 31, 230, 199, 221, 119, 228, 152, 82, 183, 207, 64, 3, 92, 174, 22, 147, 164, 56, 208, 55, 217, 33, 73, 136, 7, 130, 33, 18, 79, 73, 220, 214, 168, 181, 19, 234, 76, 193, 18, 247, 92, 35, 233, 170, 199, 189, 159, 146, 86, 245, 30, 125, 213, 52, 7, 187, 141, 129, 253, 63, 200, 228, 60, 229, 227, 137, 97, 69, 153, 87, 39, 57, 153, 84, 233, 22, 169, 193, 245, 130, 227, 203, 27, 75, 32, 4, 184, 46, 171, 168, 133, 239, 80, 20, 67, 234, 160, 50, 207, 19, 73, 210, 121, 31, 203, 124, 246, 138, 66, 142, 159, 57, 7, 181, 207, 172, 172, 4, 188, 56, 165, 189, 132, 84, 32, 6, 10, 155, 216, 81, 191, 207, 17, 31, 162, 211, 77, 98, 35, 243, 6, 64, 156, 63, 168, 211, 112, 43, 28, 132, 16, 84, 16, 164, 40, 229, 103, 29, 217, 18, 34, 129, 169, 86, 83, 227, 212, 133, 139, 46, 33, 7, 85, 45, 109, 183, 219, 75, 137, 137, 25, 57, 115, 182, 10, 235, 91, 102, 235, 133, 189, 101, 130, 131, 245, 10, 159, 15, 73, 75, 125, 198, 77, 80, 68, 130, 32, 132, 104, 33, 249, 74, 218, 236, 163, 254, 107, 128, 145, 164, 203, 37, 167, 170, 131, 217, 2, 186, 255, 160, 3, 130, 241, 224, 82, 9, 205, 65, 133, 11, 216, 197, 2, 41, 244, 253, 117, 146, 112, 147, 157, 187, 118, 205, 237, 54, 202, 155, 137, 239, 35, 226, 46, 97, 112, 144, 35, 167, 206, 0, 73, 26, 176, 243, 111, 55, 236, 103, 112, 75, 145, 45, 123, 246, 41, 210, 130, 250, 158, 175, 238, 16, 177, 208, 210, 215, 234, 60, 91, 148, 252, 190, 100, 185, 222, 110, 232, 207, 10, 93, 32, 13, 200, 44, 4, 57, 43, 88, 8, 96, 209, 249, 174, 103, 63, 104, 45, 229, 206, 252, 163, 11, 198, 77, 105, 135, 127, 91, 226, 142, 170, 186, 250, 7, 94, 188, 122, 205, 209, 124, 192, 48, 166, 3, 42, 22, 165, 157, 7, 15, 185, 179, 91, 233, 49, 64, 172, 188, 81, 70, 196, 46, 145, 121, 7, 158, 20, 227, 144, 9, 228, 175, 85, 107, 217, 92, 123, 43, 1, 17, 187, 100, 86, 175, 73, 119, 223, 244, 187, 138, 222, 136, 199, 36, 235, 33, 179, 110, 76, 89, 35, 149, 181, 241, 186, 120, 237, 186, 211, 45, 36, 96, 29, 73, 10, 20, 202, 234, 46, 94, 124, 55, 74, 4, 44, 3, 247, 232, 233, 51, 106, 174, 134, 97, 6, 136, 5, 132, 154, 18, 159, 88, 162, 22, 189, 94, 144, 145, 92, 190, 99, 15, 61, 54, 193, 213, 10, 205, 161, 105, 95, 101, 113, 158, 92, 34, 19, 14, 71, 123, 56, 206, 161, 147, 167, 160, 111, 169, 33, 119, 112, 9, 145, 244, 125, 109, 95, 214, 102, 130, 12, 241, 137, 73, 34, 113, 104, 149, 39, 75, 158, 91, 120, 172, 205, 221, 232, 89, 127, 42, 208, 171, 82, 180, 144, 243, 102, 89, 177, 16, 2, 221, 196, 78, 152, 59, 223, 172, 141, 59, 75, 38, 74, 233, 254, 171, 168, 106, 90, 2, 119, 119, 26, 96, 97, 23, 205, 164, 64, 123, 102, 75, 61, 68, 35, 129, 153, 139, 151, 170, 220, 139, 51, 67, 204, 65, 178, 221, 30, 42, 74, 218, 38, 207, 95, 164, 61, 73, 45, 63, 95, 158, 129, 204, 138, 42, 176, 36, 42, 250, 220, 22, 110, 211, 73, 219, 113, 224, 160, 112, 73, 39, 209, 77, 79, 109, 180, 42, 3, 52, 14, 73, 119, 203, 213, 121, 189, 154, 254, 70, 139, 118, 6, 168, 226, 103, 70, 68, 57, 187, 55, 54, 236, 232, 160, 67, 7, 236, 150, 83, 237, 174, 231, 46, 49, 45, 237, 243, 44, 46, 46, 185, 37, 101, 23, 86, 240, 63, 119, 229, 26, 39, 107, 182, 74, 199, 151, 93, 251, 168, 66, 158, 78, 211, 180, 122, 153, 220, 225, 203, 110, 210, 133, 112, 12, 32, 14, 91, 185, 234, 236, 193, 128, 57, 3, 119, 18, 236, 42, 97, 119, 14, 214, 90, 157, 62, 253, 85, 80, 255, 129, 5, 133, 46, 182, 133, 204, 159, 103, 58, 230, 18, 183, 134, 43, 175, 135, 131, 133, 165, 116, 68, 55, 210, 229, 231, 95, 200, 133, 43, 87, 83, 249, 2, 184, 216, 75, 2, 80, 110, 57, 161, 40, 42, 58, 198, 254, 199, 210, 21, 4, 226, 104, 173, 6, 13, 103, 174, 194, 226, 62, 180, 32, 18, 74, 59, 112, 46, 208, 211, 144, 63, 236, 151, 165, 174, 8, 89, 205, 12, 150, 137, 114, 190, 20, 67, 180, 42, 32, 41, 142, 147, 36, 213, 72, 230, 205, 194, 121, 186, 23, 124, 65, 232, 51, 255, 94, 198, 244, 117, 205, 113, 45, 216, 24, 177, 130, 115, 106, 69, 66, 171, 45, 158, 97, 213, 57, 27, 4, 157, 75, 146, 242, 155, 227, 114, 193, 175, 119, 8, 193, 117, 89, 221, 6, 50, 55, 251, 79, 152, 2, 33, 5, 141, 127, 249, 69, 158, 226, 196, 226, 60, 152, 54, 173, 91, 92, 96, 154, 6, 207, 158, 120, 222, 67, 188, 228, 14, 128, 251, 29, 114, 20, 122, 140, 249, 13, 18, 251, 120, 38, 173, 177, 80, 142, 183, 139, 207, 161, 207, 223, 80, 151, 213, 234, 76, 29, 70, 55, 139, 207, 115, 37, 42, 127, 173, 35, 162, 102, 179, 72, 219, 206, 58, 136, 63, 64, 8, 4, 250, 190, 242, 115, 123, 0, 94, 175, 220, 188, 9, 174, 232, 196, 184, 196, 36, 242, 122, 243, 239, 153, 34, 151, 149, 46, 96, 89, 255, 149, 133, 42, 170, 55, 52, 32, 227, 25, 58, 221, 240, 53, 103, 154, 180, 249, 199, 164, 158, 187, 156, 32, 133, 197, 245, 38, 171, 136, 208, 116, 210, 160, 239, 32, 13, 252, 234, 21, 44, 20, 46, 247, 69, 239, 177, 152, 75, 95, 21, 4, 161, 121, 249, 135, 82, 45, 43, 137, 53, 38, 194, 185, 47, 33, 33, 225, 19, 186, 184, 49, 70, 236, 56, 98, 172, 86, 163, 71, 63, 45, 141, 187, 245, 64, 148, 220, 87, 55, 174, 39, 43, 13, 212, 53, 192, 80, 229, 42, 54, 76, 174, 79, 44, 94, 229, 185, 5, 8, 243, 169, 114, 177, 110, 58, 207, 95, 166, 183, 88, 139, 99, 46, 95, 190, 60, 191, 136, 167, 14, 158, 52, 93, 5, 151, 45, 115, 115, 86, 169, 71, 134, 79, 251, 221, 221, 236, 24, 74, 3, 188, 88, 146, 185, 249, 181, 125, 75, 196, 152, 135, 76, 158, 225, 176, 125, 88, 150, 89, 184, 33, 62, 62, 236, 204, 186, 255, 174, 9, 188, 87, 236, 134, 227, 233, 49, 95, 181, 98, 39, 44, 207, 131, 102, 24, 43, 76, 201, 54, 86, 72, 210, 137, 142, 37, 249, 179, 114, 157, 205, 231, 9, 13, 166, 33, 73, 152, 9, 193, 14, 28, 166, 185, 4, 42, 122, 220, 182, 40, 194, 102, 98, 3, 87, 138, 162, 139, 225, 148, 236, 124, 174, 201, 219, 112, 159, 168, 163, 29, 48, 97, 42, 211, 145, 133, 24, 24, 88, 45, 194, 115, 145, 102, 119, 8, 79, 131, 147, 14, 104, 145, 22, 97, 114, 235, 11, 210, 132, 88, 231, 247, 66, 8, 99, 207, 225, 163, 186, 237, 171, 58, 140, 244, 93, 9, 72, 221, 211, 45, 15, 114, 43, 10, 209, 207, 111, 49, 96, 168, 184, 86, 215, 64, 123, 216, 116, 190, 185, 36, 215, 34, 203, 216, 94, 182, 113, 147, 19, 44, 60, 95, 218, 118, 133, 102, 145, 156, 224, 185, 3, 197, 171, 239, 122, 245, 83, 76, 46, 231, 124, 166, 215, 191, 224, 31, 191, 238, 210, 219, 1, 150, 127, 73, 191, 72, 108, 118, 134, 70, 233, 46, 171, 242, 187, 198, 172, 183, 237, 177, 51, 103, 197, 156, 157, 183, 219, 237, 37, 61, 61, 11, 136, 187, 44, 81, 71, 94, 232, 135, 77, 155, 169, 136, 135, 175, 104, 155, 156, 75, 213, 134, 27, 20, 50, 104, 27, 246, 29, 100, 72, 41, 239, 160, 40, 83, 143, 142, 39, 179, 176, 160, 64, 66, 206, 118, 78, 14, 9, 66, 101, 100, 206, 242, 85, 78, 40, 250, 231, 34, 2, 194, 93, 153, 165, 162, 95, 145, 94, 31, 31, 31, 255, 18, 255, 12, 210, 121, 228, 88, 69, 168, 152, 124, 212, 42, 130, 212, 234, 245, 163, 16, 84, 215, 83, 83, 83, 43, 250, 250, 48, 216, 121, 191, 206, 148, 180, 52, 3, 50, 101, 97, 1, 27, 51, 235, 79, 241, 208, 199, 36, 36, 56, 124, 210, 154, 149, 164, 238, 94, 231, 137, 11, 100, 234, 194, 191, 153, 43, 189, 50, 95, 16, 67, 50, 120, 192, 153, 107, 173, 110, 115, 210, 115, 236, 111, 34, 65, 195, 41, 178, 245, 172, 80, 21, 225, 86, 176, 32, 176, 206, 22, 91, 147, 226, 156, 119, 200, 22, 78, 118, 67, 18, 244, 58, 86, 230, 189, 29, 181, 199, 26, 183, 54, 68, 153, 15, 219, 76, 84, 111, 72, 166, 243, 50, 0, 74, 82, 91, 125, 77, 104, 242, 117, 51, 75, 63, 251, 99, 238, 142, 128, 120, 167, 254, 66, 211, 54, 238, 24, 24, 104, 139, 174, 219, 182, 131, 156, 58, 127, 129, 216, 29, 74, 42, 119, 51, 254, 153, 78, 236, 187, 141, 136, 73, 30, 62, 121, 90, 135, 70, 2, 112, 44, 87, 99, 242, 78, 36, 31, 181, 132, 33, 171, 217, 85, 219, 248, 111, 75, 13, 72, 229, 155, 174, 125, 12, 222, 111, 49, 57, 49, 49, 241, 117, 79, 247, 132, 252, 189, 133, 135, 4, 146, 209, 96, 141, 129, 108, 208, 16, 15, 61, 87, 67, 121, 60, 81, 244, 192, 204, 44, 73, 130, 187, 251, 69, 58, 23, 205, 251, 15, 21, 207, 203, 100, 211, 119, 23, 115, 193, 44, 220, 174, 63, 143, 83, 158, 162, 70, 129, 191, 186, 163, 136, 190, 176, 176, 1, 129, 210, 43, 136, 29, 255, 185, 98, 181, 172, 255, 58, 80, 190, 199, 80, 128, 224, 46, 74, 212, 145, 138, 205, 103, 185, 250, 230, 253, 99, 23, 170, 52, 119, 66, 111, 17, 22, 27, 200, 112, 156, 181, 100, 185, 113, 37, 42, 74, 94, 236, 192, 130, 105, 43, 237, 74, 115, 121, 91, 76, 196, 130, 75, 73, 134, 28, 56, 113, 146, 172, 220, 188, 149, 204, 93, 181, 198, 153, 192, 59, 76, 80, 130, 108, 34, 237, 206, 179, 179, 112, 186, 164, 213, 236, 246, 18, 92, 238, 13, 212, 130, 180, 162, 60, 27, 20, 146, 99, 36, 203, 15, 122, 47, 86, 146, 148, 95, 114, 121, 32, 247, 112, 110, 1, 192, 119, 214, 33, 101, 29, 92, 119, 3, 39, 78, 19, 15, 124, 74, 108, 114, 242, 123, 153, 33, 41, 241, 121, 137, 18, 81, 142, 255, 115, 190, 104, 253, 228, 49, 14, 37, 228, 213, 128, 240, 219, 12, 29, 169, 169, 46, 55, 145, 145, 226, 112, 148, 181, 42, 150, 98, 46, 152, 135, 46, 99, 22, 91, 146, 226, 56, 127, 89, 181, 83, 119, 107, 246, 106, 26, 235, 128, 189, 120, 221, 6, 7, 204, 227, 119, 61, 251, 178, 235, 221, 111, 252, 100, 119, 175, 79, 168, 169, 244, 71, 220, 41, 41, 53, 149, 233, 40, 159, 60, 119, 222, 120, 165, 89, 91, 35, 132, 199, 192, 88, 198, 105, 137, 111, 200, 108, 186, 17, 228, 231, 176, 197, 3, 49, 228, 113, 197, 87, 73, 97, 81, 239, 218, 29, 58, 206, 84, 172, 201, 54, 198, 224, 166, 132, 141, 209, 143, 227, 39, 147, 6, 145, 3, 25, 25, 2, 81, 202, 30, 31, 230, 33, 169, 217, 132, 137, 41, 240, 69, 30, 146, 114, 106, 64, 207, 75, 79, 86, 51, 95, 248, 219, 208, 251, 122, 129, 184, 48, 19, 255, 90, 200, 178, 191, 205, 66, 241, 130, 24, 159, 165, 132, 77, 135, 1, 164, 194, 92, 192, 109, 125, 39, 36, 152, 135, 135, 27, 181, 38, 93, 232, 134, 213, 84, 254, 147, 215, 116, 13, 155, 176, 103, 97, 222, 2, 32, 109, 131, 149, 67, 229, 128, 254, 43, 196, 147, 97, 254, 218, 13, 251, 89, 185, 122, 227, 166, 152, 146, 93, 244, 126, 121, 75, 218, 56, 98, 169, 200, 93, 227, 102, 117, 58, 35, 88, 49, 207, 201, 83, 44, 94, 87, 134, 199, 84, 238, 148, 116, 20, 75, 62, 160, 86, 14, 100, 192, 213, 164, 86, 216, 190, 163, 199, 83, 184, 219, 106, 173, 47, 214, 128, 88, 4, 18, 9, 121, 28, 220, 25, 208, 67, 209, 214, 176, 181, 250, 104, 227, 112, 45, 58, 46, 206, 69, 144, 78, 103, 83, 43, 119, 109, 146, 160, 122, 51, 158, 116, 163, 125, 20, 214, 129, 105, 174, 142, 253, 99, 46, 212, 154, 234, 66, 72, 157, 163, 135, 153, 228, 164, 152, 215, 78, 248, 131, 51, 23, 47, 57, 127, 253, 243, 47, 2, 250, 170, 221, 70, 255, 42, 222, 236, 76, 76, 77, 253, 52, 43, 11, 175, 248, 123, 174, 1, 26, 227, 114, 15, 207, 119, 192, 166, 72, 88, 148, 230, 50, 6, 40, 46, 111, 214, 127, 168, 30, 159, 148, 100, 152, 213, 143, 178, 27, 67, 145, 22, 44, 136, 131, 31, 144, 44, 71, 43, 213, 118, 196, 188, 141, 176, 144, 216, 101, 55, 251, 49, 119, 95, 85, 74, 50, 205, 6, 12, 213, 184, 148, 162, 65, 45, 190, 79, 172, 180, 182, 249, 43, 180, 237, 170, 3, 9, 91, 212, 66, 188, 192, 154, 137, 111, 248, 199, 93, 243, 103, 251, 166, 46, 104, 223, 138, 141, 193, 129, 40, 46, 67, 103, 222, 28, 72, 18, 123, 197, 68, 221, 103, 223, 95, 39, 49, 171, 20, 238, 217, 185, 43, 86, 179, 71, 142, 90, 152, 70, 94, 74, 54, 165, 76, 37, 27, 98, 243, 52, 99, 241, 82, 146, 148, 156, 98, 104, 188, 241, 39, 125, 153, 104, 186, 182, 34, 113, 231, 163, 91, 146, 136, 118, 246, 44, 12, 153, 50, 131, 89, 84, 95, 72, 114, 120, 33, 60, 233, 9, 8, 100, 209, 218, 245, 144, 244, 164, 142, 153, 245, 39, 75, 132, 51, 203, 239, 121, 45, 79, 161, 199, 30, 54, 101, 134, 72, 40, 234, 98, 58, 47, 145, 53, 92, 140, 181, 211, 163, 214, 183, 173, 90, 67, 237, 139, 142, 61, 252, 110, 28, 136, 22, 117, 176, 57, 0, 181, 36, 208, 66, 94, 191, 99, 151, 32, 115, 13, 18, 13, 205, 235, 10, 226, 14, 18, 164, 176, 126, 98, 227, 19, 72, 233, 136, 238, 58, 184, 7, 253, 189, 155, 242, 154, 66, 221, 166, 51, 139, 191, 61, 78, 111, 160, 198, 125, 7, 171, 138, 147, 61, 243, 137, 138, 162, 188, 235, 171, 53, 32, 110, 46, 74, 172, 223, 242, 154, 192, 52, 145, 164, 67, 191, 115, 115, 127, 248, 255, 165, 133, 103, 56, 143, 241, 40, 240, 112, 195, 67, 7, 68, 68, 23, 20, 197, 184, 69, 4, 245, 61, 36, 238, 176, 133, 48, 213, 233, 44, 200, 78, 83, 81, 64, 198, 78, 109, 210, 111, 136, 219, 170, 146, 122, 17, 222, 151, 157, 235, 158, 156, 156, 252, 62, 184, 200, 24, 81, 206, 249, 139, 53, 97, 150, 19, 180, 92, 53, 102, 174, 120, 42, 36, 130, 72, 132, 179, 133, 39, 65, 61, 103, 97, 156, 109, 11, 243, 215, 165, 164, 58, 232, 2, 106, 88, 44, 36, 32, 72, 178, 157, 149, 22, 157, 59, 227, 212, 233, 44, 204, 85, 140, 96, 190, 180, 171, 81, 55, 132, 148, 98, 45, 11, 73, 89, 78, 184, 89, 123, 91, 86, 18, 197, 212, 5, 139, 201, 147, 141, 195, 89, 12, 110, 226, 188, 5, 98, 131, 113, 67, 88, 37, 222, 190, 3, 221, 216, 53, 225, 106, 71, 70, 135, 159, 198, 24, 182, 106, 13, 32, 113, 207, 125, 1, 134, 78, 153, 161, 219, 234, 183, 98, 214, 163, 220, 43, 179, 68, 187, 46, 196, 86, 174, 26, 153, 189, 108, 165, 172, 4, 212, 200, 68, 142, 110, 181, 25, 122, 170, 11, 121, 150, 185, 90, 169, 115, 111, 22, 90, 97, 174, 92, 115, 114, 216, 237, 181, 151, 172, 109, 90, 235, 33, 35, 140, 255, 80, 178, 246, 69, 54, 47, 148, 199, 36, 109, 223, 53, 54, 86, 109, 217, 198, 230, 35, 197, 110, 47, 99, 58, 47, 70, 146, 55, 111, 38, 190, 1, 151, 235, 192, 241, 147, 196, 246, 109, 253, 28, 33, 73, 217, 170, 132, 243, 4, 210, 132, 239, 60, 100, 242, 116, 39, 136, 144, 8, 149, 166, 235, 201, 201, 79, 138, 231, 4, 147, 122, 238, 16, 65, 70, 37, 39, 63, 37, 10, 223, 59, 141, 24, 195, 186, 1, 84, 178, 184, 191, 92, 86, 110, 28, 216, 49, 190, 201, 36, 211, 122, 235, 194, 53, 234, 80, 213, 242, 242, 205, 157, 73, 183, 152, 91, 79, 141, 238, 96, 91, 250, 203, 239, 111, 170, 51, 253, 155, 239, 242, 29, 182, 146, 85, 200, 228, 249, 139, 197, 142, 214, 208, 50, 232, 137, 41, 126, 231, 208, 180, 138, 46, 181, 163, 36, 35, 201, 21, 243, 129, 132, 159, 74, 86, 236, 46, 69, 71, 245, 232, 232, 104, 176, 74, 46, 112, 215, 171, 246, 52, 79, 131, 15, 49, 45, 56, 144, 85, 75, 23, 45, 99, 255, 177, 19, 110, 245, 35, 201, 50, 203, 159, 221, 197, 31, 106, 7, 69, 60, 92, 88, 36, 126, 144, 164, 171, 146, 217, 251, 199, 215, 231, 136, 190, 246, 225, 61, 68, 69, 140, 169, 175, 149, 159, 37, 123, 78, 232, 244, 252, 14, 31, 112, 252, 204, 217, 100, 40, 99, 234, 240, 211, 104, 150, 161, 204, 220, 119, 212, 154, 60, 126, 246, 156, 184, 64, 224, 174, 63, 193, 59, 224, 188, 107, 38, 46, 185, 52, 136, 222, 171, 201, 172, 192, 158, 110, 76, 154, 247, 31, 202, 186, 206, 112, 171, 16, 222, 27, 115, 37, 234, 6, 108, 150, 52, 17, 175, 19, 66, 0, 111, 80, 82, 94, 178, 126, 147, 184, 94, 87, 232, 230, 48, 52, 29, 87, 171, 188, 17, 156, 203, 138, 158, 215, 109, 84, 133, 74, 17, 184, 81, 221, 154, 179, 223, 53, 38, 3, 38, 76, 19, 215, 236, 100, 92, 98, 98, 107, 22, 128, 167, 155, 248, 207, 194, 59, 106, 114, 119, 157, 140, 66, 54, 92, 6, 210, 121, 35, 150, 121, 142, 174, 47, 223, 177, 195, 44, 168, 112, 91, 253, 105, 78, 90, 146, 230, 166, 216, 144, 108, 37, 218, 170, 209, 207, 215, 246, 29, 61, 38, 54, 118, 55, 169, 97, 240, 141, 57, 30, 142, 240, 63, 65, 230, 145, 22, 114, 22, 255, 153, 188, 96, 49, 115, 185, 129, 187, 166, 232, 29, 36, 200, 16, 46, 233, 5, 63, 191, 208, 172, 173, 65, 173, 63, 149, 147, 67, 184, 188, 184, 103, 97, 17, 126, 130, 62, 240, 147, 41, 57, 213, 151, 98, 154, 185, 253, 52, 191, 108, 65, 88, 78, 207, 85, 44, 252, 123, 142, 28, 19, 149, 196, 209, 116, 215, 254, 137, 183, 36, 14, 201, 117, 219, 220, 157, 125, 162, 105, 213, 172, 116, 191, 128, 8, 17, 104, 69, 136, 115, 116, 170, 170, 254, 109, 247, 72, 82, 160, 85, 251, 127, 137, 63, 51, 241, 234, 154, 77, 96, 209, 209, 175, 223, 140, 22, 162, 240, 101, 173, 176, 198, 165, 107, 116, 191, 200, 52, 228, 201, 54, 86, 151, 128, 20, 178, 218, 123, 96, 218, 20, 173, 55, 117, 118, 201, 101, 229, 61, 102, 74, 126, 97, 122, 168, 63, 77, 159, 165, 216, 42, 124, 199, 122, 164, 194, 115, 3, 202, 50, 189, 127, 25, 79, 118, 29, 60, 108, 28, 62, 117, 90, 158, 131, 112, 147, 229, 238, 38, 93, 131, 103, 19, 111, 217, 187, 223, 209, 245, 231, 95, 8, 148, 48, 45, 223, 184, 89, 229, 113, 198, 114, 244, 251, 12, 118, 41, 241, 252, 193, 52, 132, 203, 115, 177, 125, 91, 157, 102, 100, 225, 154, 245, 134, 180, 241, 107, 148, 78, 156, 89, 144, 210, 99, 60, 22, 223, 71, 36, 83, 129, 213, 11, 97, 21, 112, 59, 66, 38, 45, 132, 87, 34, 134, 143, 210, 185, 136, 134, 6, 45, 189, 224, 189, 138, 162, 66, 139, 55, 38, 235, 8, 177, 223, 138, 94, 52, 87, 129, 204, 223, 160, 199, 106, 57, 112, 152, 216, 152, 254, 110, 254, 222, 238, 166, 4, 92, 248, 127, 230, 226, 165, 58, 88, 158, 194, 178, 203, 209, 117, 143, 127, 30, 228, 129, 64, 162, 20, 156, 199, 228, 249, 139, 220, 245, 204, 160, 244, 180, 97, 195, 6, 57, 187, 25, 173, 74, 63, 147, 164, 75, 236, 90, 85, 71, 242, 78, 19, 44, 233, 128, 165, 176, 223, 5, 253, 222, 88, 172, 131, 46, 200, 59, 15, 28, 18, 233, 243, 163, 189, 145, 138, 175, 174, 42, 95, 146, 126, 44, 118, 101, 191, 204, 101, 191, 88, 124, 40, 58, 53, 85, 244, 143, 204, 239, 173, 73, 178, 219, 117, 171, 235, 195, 232, 67, 210, 214, 138, 157, 164, 100, 61, 188, 35, 30, 64, 168, 219, 140, 141, 79, 48, 182, 237, 59, 64, 94, 109, 246, 189, 107, 23, 206, 99, 79, 161, 166, 248, 211, 129, 99, 255, 234, 154, 146, 215, 162, 249, 18, 73, 76, 159, 75, 196, 166, 91, 72, 144, 105, 82, 175, 208, 220, 22, 95, 107, 49, 167, 255, 3, 15, 129, 148, 165, 155, 199, 15, 247, 149, 176, 126, 64, 229, 41, 206, 149, 149, 249, 11, 147, 44, 20, 217, 173, 5, 97, 145, 125, 173, 184, 156, 57, 185, 84, 58, 199, 220, 230, 99, 209, 123, 52, 132, 53, 247, 62, 115, 150, 216, 158, 47, 98, 116, 31, 53, 206, 221, 123, 83, 186, 135, 149, 168, 152, 24, 136, 241, 105, 238, 54, 96, 244, 126, 248, 237, 207, 191, 132, 42, 148, 198, 93, 191, 16, 231, 46, 42, 31, 95, 170, 147, 140, 116, 251, 191, 85, 21, 50, 111, 141, 190, 191, 78, 34, 247, 209, 115, 175, 200, 155, 126, 63, 221, 36, 220, 56, 127, 153, 169, 239, 145, 164, 164, 164, 42, 226, 92, 185, 232, 193, 205, 203, 215, 163, 32, 49, 74, 47, 231, 69, 29, 74, 156, 223, 144, 201, 211, 5, 209, 252, 156, 158, 37, 45, 54, 1, 67, 167, 204, 80, 32, 134, 153, 83, 53, 225, 233, 234, 191, 82, 130, 47, 15, 207, 27, 181, 168, 155, 244, 27, 172, 82, 67, 65, 60, 7, 199, 19, 249, 166, 1, 173, 202, 156, 88, 188, 21, 5, 2, 255, 80, 144, 14, 53, 94, 70, 8, 47, 68, 190, 211, 93, 191, 185, 128, 55, 89, 176, 102, 157, 195, 131, 30, 104, 118, 98, 95, 185, 248, 14, 44, 111, 14, 206, 181, 88, 44, 43, 209, 197, 115, 153, 40, 96, 246, 53, 70, 229, 65, 248, 60, 183, 5, 231, 228, 106, 18, 77, 143, 5, 61, 239, 120, 191, 191, 52, 120, 32, 33, 131, 145, 21, 165, 183, 187, 165, 222, 82, 84, 92, 19, 186, 137, 154, 179, 108, 165, 184, 38, 11, 204, 187, 114, 171, 54, 110, 244, 181, 153, 159, 202, 63, 46, 73, 243, 159, 203, 15, 215, 58, 183, 213, 215, 202, 107, 76, 217, 110, 47, 233, 146, 64, 76, 34, 21, 58, 245, 212, 63, 104, 213, 158, 128, 250, 15, 200, 160, 209, 107, 37, 146, 64, 14, 64, 114, 145, 167, 13, 141, 188, 17, 163, 175, 76, 224, 124, 254, 154, 117, 105, 34, 177, 45, 197, 225, 40, 47, 254, 150, 18, 201, 40, 248, 221, 148, 5, 127, 171, 162, 6, 24, 158, 215, 207, 194, 59, 49, 247, 236, 232, 223, 231, 24, 137, 201, 201, 66, 155, 56, 220, 228, 138, 22, 33, 143, 218, 34, 214, 60, 107, 201, 114, 181, 40, 191, 199, 68, 11, 171, 82, 174, 254, 151, 218, 177, 179, 231, 216, 199, 159, 228, 133, 255, 0, 158, 32, 117, 234, 102, 92, 60, 200, 1, 234, 222, 250, 159, 194, 191, 65, 103, 155, 194, 109, 58, 169, 220, 221, 154, 112, 37, 54, 214, 189, 73, 18, 215, 39, 46, 46, 238, 69, 248, 44, 16, 19, 40, 29, 209, 93, 5, 101, 171, 59, 153, 176, 104, 86, 182, 130, 150, 126, 185, 26, 133, 129, 107, 218, 109, 85, 42, 170, 218, 211, 124, 47, 32, 172, 126, 184, 146, 147, 223, 131, 69, 8, 146, 66, 160, 217, 42, 184, 37, 190, 96, 86, 228, 157, 188, 41, 184, 82, 127, 181, 134, 80, 7, 40, 252, 241, 167, 97, 7, 25, 200, 187, 38, 79, 105, 240, 89, 32, 247, 220, 86, 90, 37, 226, 88, 208, 169, 65, 52, 210, 158, 56, 111, 161, 3, 22, 63, 225, 110, 23, 4, 201, 234, 35, 233, 238, 186, 251, 168, 95, 197, 162, 123, 33, 58, 58, 250, 17, 63, 184, 45, 243, 200, 177, 61, 81, 207, 106, 97, 210, 206, 174, 156, 8, 99, 120, 243, 16, 88, 253, 44, 59, 28, 14, 86, 231, 120, 234, 252, 5, 231, 43, 205, 191, 103, 13, 197, 71, 206, 252, 195, 93, 126, 114, 253, 250, 245, 39, 51, 90, 76, 37, 146, 124, 142, 75, 28, 10, 215, 126, 19, 217, 194, 167, 150, 235, 11, 96, 220, 93, 2, 75, 174, 110, 115, 38, 135, 7, 155, 106, 150, 100, 83, 186, 42, 36, 238, 136, 207, 156, 159, 142, 203, 245, 182, 158, 166, 144, 109, 222, 115, 236, 120, 38, 40, 32, 60, 88, 21, 121, 167, 142, 223, 255, 94, 38, 90, 216, 213, 55, 157, 227, 158, 52, 197, 73, 10, 182, 238, 168, 9, 65, 254, 140, 44, 190, 74, 60, 1, 104, 246, 178, 21, 162, 67, 77, 127, 113, 60, 201, 138, 236, 200, 69, 221, 237, 32, 229, 7, 202, 88, 197, 238, 2, 111, 154, 72, 94, 132, 117, 153, 41, 55, 209, 235, 10, 207, 224, 77, 23, 225, 51, 207, 115, 124, 124, 252, 203, 210, 125, 135, 250, 175, 86, 237, 212, 185, 4, 213, 41, 46, 65, 229, 132, 184, 66, 86, 91, 197, 136, 102, 194, 64, 174, 217, 185, 177, 132, 58, 198, 75, 77, 219, 130, 235, 72, 104, 50, 95, 130, 226, 252, 96, 216, 45, 153, 53, 44, 179, 19, 247, 178, 122, 145, 77, 73, 73, 129, 134, 199, 172, 24, 21, 106, 251, 68, 25, 1, 44, 66, 224, 98, 125, 139, 110, 160, 232, 14, 91, 75, 78, 115, 181, 142, 76, 115, 58, 63, 179, 50, 46, 106, 142, 221, 65, 227, 20, 147, 14, 104, 118, 33, 22, 239, 5, 254, 182, 240, 114, 248, 158, 146, 235, 155, 199, 195, 23, 92, 189, 101, 155, 61, 124, 240, 8, 225, 98, 77, 139, 73, 78, 126, 199, 151, 231, 71, 178, 248, 160, 54, 215, 160, 196, 209, 203, 76, 38, 27, 54, 108, 184, 159, 85, 53, 221, 184, 9, 155, 38, 29, 8, 138, 137, 38, 80, 82, 155, 50, 127, 145, 216, 136, 28, 146, 172, 214, 60, 233, 185, 138, 233, 249, 86, 186, 77, 92, 188, 122, 35, 246, 252, 179, 14, 38, 117, 154, 27, 7, 142, 187, 250, 173, 58, 28, 90, 37, 147, 43, 158, 37, 223, 181, 25, 50, 66, 125, 146, 43, 129, 165, 23, 30, 18, 173, 221, 42, 116, 234, 37, 250, 174, 170, 169, 183, 202, 166, 114, 139, 245, 144, 126, 215, 238, 108, 177, 185, 30, 229, 132, 46, 33, 47, 241, 182, 113, 119, 11, 81, 22, 147, 154, 58, 67, 71, 153, 143, 194, 58, 104, 91, 246, 238, 115, 222, 170, 164, 177, 55, 52, 123, 174, 16, 89, 95, 164, 133, 126, 39, 75, 140, 88, 184, 102, 189, 3, 220, 154, 149, 51, 145, 201, 42, 200, 16, 70, 9, 94, 76, 12, 15, 10, 28, 3, 118, 129, 226, 162, 102, 246, 70, 96, 29, 221, 233, 235, 99, 141, 195, 201, 149, 235, 81, 42, 79, 249, 158, 230, 79, 146, 184, 19, 139, 218, 93, 120, 78, 183, 245, 12, 133, 149, 169, 201, 143, 67, 52, 72, 206, 128, 93, 56, 236, 96, 255, 71, 23, 163, 195, 39, 79, 137, 182, 98, 173, 229, 69, 203, 31, 115, 3, 13, 34, 44, 38, 73, 113, 156, 145, 86, 91, 191, 119, 203, 198, 151, 255, 188, 69, 234, 26, 67, 132, 204, 89, 102, 93, 251, 242, 181, 149, 137, 24, 4, 17, 32, 193, 244, 244, 197, 75, 44, 169, 4, 18, 133, 192, 195, 32, 245, 101, 77, 136, 141, 141, 125, 193, 155, 183, 68, 28, 159, 215, 233, 70, 113, 25, 71, 29, 90, 201, 65, 102, 53, 36, 34, 241, 227, 77, 247, 16, 175, 174, 195, 5, 8, 88, 215, 142, 244, 90, 121, 137, 228, 63, 91, 141, 198, 198, 222, 163, 199, 53, 158, 209, 254, 175, 196, 37, 254, 250, 8, 157, 179, 9, 204, 109, 157, 152, 196, 178, 233, 93, 10, 67, 221, 252, 226, 89, 11, 225, 107, 100, 72, 22, 245, 95, 89, 41, 217, 183, 13, 140, 81, 51, 103, 59, 193, 19, 200, 45, 228, 63, 232, 220, 139, 204, 93, 76, 234, 201, 226, 195, 228, 202, 226, 82, 148, 110, 44, 72, 113, 236, 132, 19, 122, 1, 250, 170, 120, 47, 26, 176, 194, 223, 195, 238, 237, 11, 46, 89, 245, 40, 221, 217, 128, 252, 150, 173, 74, 61, 166, 154, 1, 187, 183, 172, 8, 22, 139, 118, 54, 247, 211, 227, 129, 34, 142, 83, 85, 157, 178, 98, 63, 106, 25, 250, 255, 222, 72, 118, 213, 202, 234, 215, 163, 99, 72, 141, 30, 253, 12, 182, 171, 175, 215, 130, 140, 159, 59, 159, 171, 169, 232, 7, 253, 69, 250, 38, 109, 207, 195, 22, 187, 91, 197, 113, 34, 130, 241, 94, 146, 218, 193, 61, 201, 181, 105, 193, 77, 153, 165, 250, 76, 233, 58, 200, 25, 160, 108, 190, 120, 169, 80, 2, 75, 238, 169, 221, 12, 122, 144, 146, 6, 145, 131, 52, 46, 214, 239, 76, 73, 73, 249, 192, 155, 53, 35, 29, 243, 85, 58, 154, 10, 17, 134, 147, 231, 206, 235, 96, 145, 190, 223, 42, 66, 143, 138, 142, 97, 126, 36, 106, 245, 85, 50, 19, 46, 253, 94, 140, 36, 119, 28, 56, 8, 89, 168, 108, 29, 10, 245, 164, 102, 3, 245, 145, 117, 154, 147, 233, 139, 150, 58, 61, 196, 208, 115, 123, 10, 133, 164, 57, 28, 76, 76, 101, 231, 193, 67, 26, 24, 15, 21, 58, 246, 180, 60, 121, 71, 136, 115, 136, 76, 222, 208, 172, 10, 16, 112, 183, 116, 181, 238, 145, 250, 145, 83, 167, 133, 85, 121, 197, 33, 197, 144, 113, 205, 204, 154, 91, 173, 156, 171, 27, 125, 172, 81, 180, 109, 103, 29, 100, 167, 74, 243, 206, 224, 172, 70, 137, 239, 200, 224, 34, 192, 46, 12, 200, 14, 50, 172, 32, 139, 172, 4, 151, 137, 163, 59, 71, 131, 222, 64, 16, 247, 208, 32, 32, 222, 225, 167, 209, 234, 244, 69, 75, 244, 29, 251, 15, 146, 223, 230, 206, 87, 109, 181, 154, 106, 176, 187, 20, 239, 103, 194, 200, 62, 88, 150, 162, 161, 47, 187, 185, 191, 172, 77, 182, 239, 119, 181, 147, 81, 117, 125, 56, 94, 112, 255, 90, 182, 124, 225, 128, 150, 65, 157, 68, 189, 236, 159, 203, 87, 233, 64, 144, 144, 8, 210, 99, 204, 111, 70, 170, 221, 46, 18, 96, 160, 84, 164, 137, 167, 142, 18, 22, 157, 203, 227, 66, 52, 220, 34, 73, 58, 67, 58, 78, 181, 244, 220, 128, 193, 98, 81, 66, 55, 22, 104, 80, 32, 187, 248, 179, 226, 117, 242, 68, 194, 188, 241, 129, 186, 243, 224, 97, 98, 171, 92, 139, 145, 81, 143, 49, 191, 234, 146, 181, 254, 147, 228, 182, 77, 183, 19, 13, 125, 133, 186, 236, 203, 34, 46, 121, 244, 244, 25, 189, 231, 152, 223, 152, 170, 211, 155, 212, 154, 220, 127, 236, 184, 16, 146, 112, 247, 221, 228, 239, 27, 35, 98, 204, 167, 46, 92, 164, 247, 102, 4, 91, 91, 74, 153, 116, 86, 139, 137, 56, 122, 213, 250, 250, 9, 87, 2, 144, 51, 233, 214, 156, 220, 231, 105, 238, 164, 120, 248, 70, 38, 203, 243, 243, 47, 106, 62, 145, 113, 107, 129, 219, 85, 156, 39, 172, 111, 80, 226, 66, 207, 205, 128, 140, 94, 209, 241, 8, 134, 208, 168, 13, 241, 98, 101, 134, 184, 123, 237, 246, 34, 239, 210, 57, 3, 175, 207, 172, 37, 203, 29, 146, 254, 235, 112, 249, 218, 161, 85, 233, 227, 46, 51, 58, 58, 245, 89, 94, 88, 76, 190, 31, 250, 179, 10, 122, 134, 21, 184, 233, 206, 46, 30, 253, 185, 18, 119, 153, 150, 230, 189, 15, 161, 163, 54, 235, 64, 95, 163, 177, 150, 167, 81, 152, 179, 70, 207, 126, 202, 208, 41, 51, 156, 203, 54, 110, 34, 103, 46, 93, 38, 170, 135, 122, 239, 203, 81, 55, 200, 224, 73, 211, 28, 116, 129, 213, 192, 127, 94, 134, 21, 200, 122, 119, 195, 134, 8, 149, 13, 186, 48, 15, 159, 58, 83, 236, 140, 118, 166, 247, 224, 34, 44, 185, 55, 196, 194, 208, 67, 86, 53, 57, 117, 254, 130, 209, 106, 224, 112, 242, 14, 93, 176, 224, 30, 129, 164, 174, 218, 189, 251, 27, 155, 118, 239, 149, 235, 49, 182, 90, 153, 41, 42, 45, 160, 111, 73, 217, 168, 86, 148, 127, 200, 199, 248, 60, 88, 73, 210, 252, 189, 172, 44, 113, 146, 238, 147, 39, 69, 201, 73, 159, 113, 19, 156, 96, 169, 65, 210, 205, 223, 235, 255, 73, 147, 230, 248, 149, 244, 158, 87, 241, 59, 187, 221, 14, 217, 164, 169, 160, 1, 220, 114, 224, 112, 166, 27, 12, 174, 86, 240, 82, 129, 96, 197, 199, 225, 29, 245, 27, 49, 46, 107, 146, 254, 109, 168, 244, 254, 153, 226, 67, 86, 111, 217, 166, 193, 90, 1, 155, 248, 80, 83, 38, 170, 16, 34, 161, 231, 166, 31, 61, 205, 186, 127, 197, 165, 222, 42, 187, 202, 155, 81, 216, 193, 174, 170, 101, 224, 13, 208, 44, 157, 213, 98, 242, 16, 82, 118, 5, 205, 43, 242, 53, 16, 44, 212, 142, 35, 198, 56, 215, 108, 221, 174, 245, 251, 109, 146, 243, 133, 166, 109, 21, 112, 93, 63, 68, 215, 74, 16, 72, 168, 192, 214, 97, 215, 26, 44, 194, 90, 25, 234, 191, 138, 122, 85, 106, 85, 182, 26, 244, 147, 83, 82, 72, 58, 0, 106, 90, 210, 38, 24, 75, 69, 188, 61, 52, 116, 87, 182, 131, 41, 170, 204, 157, 207, 90, 56, 85, 239, 30, 201, 72, 17, 46, 8, 236, 94, 160, 179, 58, 187, 233, 107, 52, 34, 182, 186, 45, 116, 106, 213, 57, 233, 197, 116, 76, 95, 184, 212, 9, 13, 126, 227, 146, 146, 205, 139, 15, 60, 44, 112, 204, 241, 154, 166, 53, 76, 75, 75, 43, 194, 101, 202, 116, 87, 166, 221, 69, 210, 247, 215, 137, 14, 214, 179, 177, 65, 43, 118, 241, 33, 126, 153, 158, 72, 1, 92, 104, 176, 84, 191, 233, 218, 71, 244, 143, 116, 38, 38, 38, 190, 129, 86, 164, 255, 172, 72, 41, 187, 79, 52, 119, 78, 45, 25, 209, 205, 0, 79, 0, 148, 130, 48, 69, 147, 182, 46, 11, 31, 174, 155, 45, 244, 107, 210, 105, 228, 88, 247, 130, 72, 175, 185, 101, 53, 135, 210, 66, 92, 66, 34, 55, 43, 203, 63, 210, 50, 90, 192, 131, 232, 186, 230, 38, 254, 169, 205, 204, 203, 9, 142, 149, 156, 0, 193, 133, 15, 25, 161, 141, 155, 61, 79, 209, 111, 21, 187, 247, 240, 117, 211, 46, 4, 50, 118, 30, 56, 196, 4, 197, 97, 29, 18, 98, 233, 115, 87, 172, 22, 181, 209, 99, 204, 207, 63, 181, 146, 202, 243, 6, 1, 100, 192, 132, 41, 234, 99, 141, 91, 51, 162, 52, 147, 199, 55, 80, 6, 83, 186, 42, 36, 0, 49, 17, 164, 132, 132, 132, 87, 205, 174, 91, 79, 158, 12, 158, 156, 116, 245, 218, 205, 104, 114, 95, 163, 214, 58, 72, 238, 149, 202, 98, 71, 16, 145, 183, 81, 185, 115, 47, 3, 26, 19, 60, 215, 180, 141, 177, 96, 245, 186, 219, 66, 8, 105, 138, 2, 229, 87, 122, 239, 95, 198, 59, 10, 132, 117, 96, 113, 86, 144, 254, 19, 150, 34, 24, 47, 197, 51, 136, 97, 134, 240, 207, 0, 50, 135, 120, 238, 163, 77, 194, 245, 85, 91, 182, 43, 146, 178, 88, 59, 243, 70, 0, 113, 251, 34, 232, 170, 77, 210, 245, 113, 92, 48, 64, 129, 157, 95, 217, 136, 110, 36, 15, 189, 104, 144, 26, 13, 1, 224, 103, 155, 182, 213, 27, 68, 14, 82, 71, 78, 159, 229, 92, 177, 105, 139, 6, 129, 121, 237, 223, 46, 171, 51, 144, 218, 13, 141, 2, 192, 239, 29, 19, 19, 243, 156, 167, 207, 77, 86, 148, 247, 232, 195, 226, 222, 241, 49, 87, 10, 164, 121, 215, 104, 76, 158, 104, 28, 206, 118, 84, 158, 218, 208, 176, 221, 16, 125, 88, 14, 159, 60, 165, 114, 225, 241, 38, 25, 221, 212, 8, 107, 22, 84, 105, 19, 181, 152, 245, 248, 251, 103, 51, 187, 71, 196, 230, 9, 30, 78, 136, 157, 64, 143, 194, 114, 29, 186, 235, 98, 167, 74, 23, 176, 198, 86, 90, 101, 82, 50, 69, 93, 83, 217, 134, 85, 229, 31, 224, 222, 251, 15, 122, 37, 178, 127, 141, 20, 69, 169, 234, 74, 171, 116, 136, 77, 76, 12, 168, 242, 152, 9, 199, 219, 61, 71, 127, 94, 14, 111, 30, 59, 235, 79, 39, 104, 27, 131, 247, 170, 229, 160, 225, 226, 122, 157, 133, 44, 124, 217, 42, 22, 239, 189, 17, 31, 255, 33, 172, 73, 116, 83, 199, 106, 42, 229, 245, 36, 68, 244, 241, 164, 100, 243, 195, 184, 9, 194, 205, 158, 36, 117, 97, 201, 235, 131, 55, 131, 169, 38, 81, 107, 212, 249, 97, 22, 53, 172, 97, 115, 89, 158, 199, 75, 193, 122, 4, 247, 45, 61, 95, 49, 95, 199, 232, 102, 163, 30, 111, 207, 117, 86, 220, 168, 137, 41, 169, 208, 222, 76, 235, 51, 110, 162, 243, 237, 150, 237, 117, 232, 25, 11, 6, 134, 16, 65, 207, 168, 239, 102, 49, 222, 169, 7, 146, 31, 97, 93, 239, 63, 97, 138, 51, 129, 27, 54, 244, 217, 94, 30, 157, 154, 250, 140, 228, 90, 198, 251, 95, 190, 25, 132, 104, 241, 145, 147, 167, 85, 91, 177, 47, 53, 186, 83, 211, 74, 180, 239, 170, 130, 66, 199, 172, 37, 203, 245, 221, 135, 143, 144, 216, 132, 68, 243, 194, 146, 192, 251, 47, 142, 166, 139, 97, 221, 56, 106, 182, 143, 95, 178, 228, 193, 244, 118, 134, 188, 46, 44, 191, 124, 3, 198, 187, 122, 221, 9, 121, 49, 66, 119, 116, 70, 251, 225, 163, 84, 91, 181, 6, 58, 232, 177, 10, 89, 43, 119, 252, 160, 122, 67, 119, 161, 58, 253, 204, 217, 217, 137, 169, 32, 50, 127, 159, 68, 70, 70, 230, 22, 50, 103, 244, 190, 80, 68, 183, 123, 145, 216, 69, 31, 86, 227, 248, 217, 115, 34, 153, 234, 7, 171, 175, 143, 68, 146, 61, 252, 148, 180, 179, 27, 93, 247, 150, 92, 39, 22, 211, 19, 173, 165, 64, 135, 66, 174, 195, 244, 229, 126, 16, 27, 95, 200, 132, 5, 43, 15, 50, 52, 169, 229, 167, 195, 134, 253, 210, 53, 23, 145, 208, 141, 120, 57, 179, 245, 195, 239, 183, 7, 184, 247, 99, 34, 203, 114, 157, 187, 192, 14, 155, 58, 176, 186, 68, 25, 25, 196, 252, 6, 78, 156, 42, 100, 237, 84, 199, 255, 183, 119, 37, 96, 81, 86, 235, 255, 176, 218, 106, 251, 114, 187, 117, 91, 180, 123, 51, 187, 253, 187, 89, 153, 102, 229, 82, 42, 34, 42, 200, 176, 111, 130, 128, 178, 168, 136, 130, 10, 232, 184, 231, 146, 22, 166, 134, 75, 46, 169, 41, 165, 230, 146, 185, 100, 184, 148, 43, 106, 106, 184, 225, 174, 32, 42, 40, 2, 34, 51, 204, 112, 254, 231, 253, 56, 31, 30, 63, 103, 134, 25, 24, 4, 225, 253, 61, 207, 251, 204, 254, 205, 183, 156, 239, 252, 206, 187, 235, 116, 206, 230, 44, 232, 132, 49, 40, 245, 150, 76, 154, 62, 171, 4, 52, 64, 89, 155, 51, 215, 247, 216, 158, 187, 175, 72, 96, 31, 250, 114, 239, 126, 186, 245, 219, 255, 212, 10, 254, 194, 47, 101, 242, 7, 204, 99, 154, 107, 225, 173, 91, 237, 97, 174, 149, 131, 174, 202, 139, 67, 20, 2, 97, 150, 65, 228, 240, 83, 193, 81, 165, 16, 7, 242, 60, 211, 20, 193, 180, 44, 250, 48, 197, 114, 118, 31, 241, 166, 206, 206, 131, 152, 230, 234, 23, 14, 228, 170, 219, 115, 232, 176, 60, 254, 175, 107, 52, 58, 149, 242, 26, 52, 120, 51, 43, 35, 72, 104, 75, 163, 185, 89, 92, 172, 75, 89, 182, 252, 22, 211, 18, 232, 185, 236, 28, 165, 163, 71, 207, 87, 51, 80, 153, 63, 158, 93, 196, 118, 39, 79, 158, 124, 214, 148, 118, 202, 111, 6, 7, 3, 14, 126, 27, 229, 251, 5, 197, 197, 173, 132, 144, 126, 169, 158, 100, 200, 232, 9, 96, 242, 149, 250, 195, 65, 151, 15, 136, 144, 5, 2, 21, 122, 45, 62, 130, 102, 214, 123, 58, 94, 164, 27, 230, 194, 141, 27, 79, 242, 170, 52, 82, 50, 58, 152, 223, 165, 234, 45, 208, 47, 240, 175, 131, 242, 2, 102, 174, 48, 97, 89, 179, 38, 169, 60, 65, 165, 88, 153, 36, 229, 128, 134, 159, 205, 209, 116, 16, 230, 91, 31, 216, 92, 209, 65, 110, 54, 94, 133, 40, 90, 222, 123, 85, 27, 34, 57, 184, 247, 31, 208, 44, 91, 183, 161, 132, 47, 194, 190, 49, 54, 145, 203, 115, 219, 77, 166, 25, 73, 26, 44, 35, 66, 183, 33, 106, 29, 116, 62, 1, 162, 236, 30, 55, 92, 242, 147, 130, 207, 146, 251, 52, 3, 204, 157, 75, 4, 77, 82, 106, 74, 208, 111, 210, 87, 90, 152, 163, 204, 137, 214, 151, 137, 10, 226, 42, 192, 183, 8, 154, 108, 226, 180, 20, 169, 140, 31, 199, 223, 80, 68, 93, 92, 108, 40, 73, 59, 58, 57, 185, 17, 91, 28, 124, 6, 25, 49, 178, 73, 89, 210, 88, 10, 139, 216, 241, 236, 44, 131, 38, 238, 207, 4, 71, 73, 89, 9, 208, 24, 250, 35, 94, 124, 1, 148, 12, 136, 68, 135, 215, 173, 133, 250, 175, 239, 69, 196, 74, 169, 58, 223, 166, 46, 47, 209, 243, 110, 58, 58, 157, 126, 46, 152, 148, 5, 5, 199, 174, 33, 14, 98, 27, 225, 4, 156, 51, 48, 105, 92, 229, 65, 23, 211, 160, 154, 5, 152, 71, 83, 120, 242, 175, 161, 1, 41, 136, 217, 90, 131, 236, 239, 18, 47, 0, 191, 248, 105, 242, 78, 108, 219, 187, 175, 148, 145, 165, 150, 184, 6, 64, 233, 168, 178, 203, 121, 82, 105, 83, 157, 144, 219, 133, 246, 243, 90, 208, 16, 160, 173, 18, 4, 85, 192, 197, 72, 152, 246, 173, 150, 180, 113, 161, 235, 182, 110, 151, 75, 209, 109, 172, 41, 109, 76, 240, 73, 174, 179, 178, 185, 85, 38, 219, 105, 162, 233, 14, 175, 120, 245, 230, 24, 133, 217, 212, 190, 138, 219, 145, 73, 105, 141, 112, 189, 78, 11, 245, 94, 109, 77, 17, 44, 83, 2, 252, 165, 234, 5, 199, 142, 151, 16, 23, 31, 201, 183, 73, 252, 194, 202, 200, 71, 46, 250, 217, 63, 174, 184, 197, 23, 117, 78, 230, 236, 163, 252, 57, 35, 50, 169, 229, 217, 233, 139, 89, 165, 196, 51, 68, 50, 111, 150, 119, 40, 25, 108, 52, 53, 174, 53, 215, 30, 165, 180, 12, 223, 48, 250, 81, 191, 56, 253, 230, 219, 125, 33, 33, 192, 113, 180, 194, 242, 102, 43, 158, 71, 67, 213, 114, 128, 200, 216, 156, 9, 29, 128, 102, 201, 29, 122, 100, 13, 147, 221, 143, 186, 65, 83, 191, 41, 121, 165, 119, 180, 14, 220, 88, 224, 58, 3, 51, 43, 44, 18, 202, 11, 179, 223, 222, 39, 73, 163, 101, 139, 92, 223, 225, 99, 117, 39, 206, 158, 147, 189, 104, 39, 161, 127, 38, 106, 149, 229, 7, 191, 24, 156, 208, 252, 113, 112, 97, 97, 97, 251, 203, 69, 69, 207, 25, 27, 36, 114, 93, 83, 43, 231, 191, 217, 43, 200, 210, 133, 189, 222, 33, 95, 244, 181, 105, 91, 75, 191, 156, 191, 88, 94, 237, 175, 70, 83, 64, 237, 19, 165, 92, 15, 20, 124, 26, 203, 55, 108, 46, 144, 87, 194, 114, 247, 149, 154, 92, 125, 194, 156, 103, 229, 244, 15, 173, 161, 102, 187, 8, 171, 221, 219, 54, 213, 248, 189, 188, 48, 250, 135, 220, 252, 155, 105, 167, 31, 87, 54, 7, 220, 209, 226, 139, 247, 166, 132, 64, 27, 8, 48, 220, 186, 39, 157, 30, 63, 115, 142, 222, 40, 44, 146, 199, 192, 8, 115, 230, 20, 129, 184, 158, 96, 139, 193, 29, 229, 245, 140, 247, 72, 65, 142, 160, 165, 181, 53, 210, 150, 171, 141, 212, 216, 57, 65, 242, 167, 130, 239, 17, 162, 255, 161, 39, 47, 199, 46, 185, 225, 182, 153, 251, 32, 91, 234, 238, 248, 222, 177, 99, 199, 30, 101, 243, 166, 51, 39, 204, 243, 21, 218, 206, 181, 235, 64, 152, 165, 113, 95, 77, 215, 50, 13, 83, 242, 97, 66, 239, 93, 200, 40, 128, 125, 106, 199, 75, 246, 129, 118, 251, 42, 4, 102, 250, 135, 211, 229, 27, 127, 19, 83, 69, 70, 42, 239, 253, 134, 168, 77, 218, 200, 166, 75, 67, 38, 54, 238, 71, 188, 39, 121, 52, 74, 205, 176, 88, 163, 233, 201, 187, 208, 75, 169, 36, 208, 17, 0, 198, 58, 148, 72, 171, 233, 137, 24, 81, 249, 117, 210, 232, 116, 190, 2, 217, 228, 220, 188, 73, 95, 168, 169, 155, 73, 24, 175, 141, 229, 10, 44, 86, 236, 254, 33, 111, 199, 27, 23, 96, 117, 215, 124, 203, 30, 95, 145, 115, 34, 205, 153, 143, 68, 130, 229, 173, 254, 46, 10, 145, 204, 192, 82, 135, 216, 251, 144, 243, 232, 106, 238, 124, 34, 54, 98, 150, 23, 242, 140, 40, 75, 228, 96, 71, 177, 127, 101, 27, 174, 97, 74, 17, 185, 190, 161, 224, 11, 212, 237, 60, 240, 151, 188, 176, 211, 105, 52, 154, 56, 133, 105, 213, 214, 210, 243, 34, 207, 207, 226, 251, 187, 118, 237, 106, 124, 179, 156, 48, 231, 66, 127, 76, 121, 160, 67, 1, 247, 95, 182, 110, 215, 67, 222, 58, 241, 239, 83, 74, 122, 6, 234, 33, 99, 161, 45, 47, 210, 2, 245, 104, 33, 223, 29, 204, 192, 177, 95, 38, 107, 46, 93, 185, 42, 255, 116, 167, 144, 69, 96, 43, 183, 226, 106, 80, 131, 79, 177, 66, 113, 172, 205, 228, 82, 126, 225, 239, 152, 100, 181, 58, 93, 128, 92, 71, 150, 35, 4, 205, 173, 181, 62, 118, 164, 27, 83, 175, 215, 71, 177, 137, 102, 59, 123, 253, 191, 154, 188, 38, 194, 228, 244, 154, 160, 249, 89, 35, 253, 67, 36, 218, 79, 144, 36, 235, 236, 120, 179, 51, 52, 111, 89, 50, 199, 165, 238, 216, 241, 32, 148, 185, 99, 139, 236, 119, 50, 51, 165, 64, 34, 91, 229, 34, 204, 146, 177, 15, 245, 103, 101, 141, 114, 253, 246, 63, 75, 196, 156, 201, 79, 184, 118, 6, 133, 54, 24, 129, 150, 125, 245, 253, 15, 37, 60, 109, 13, 176, 229, 106, 65, 193, 127, 172, 169, 161, 9, 115, 247, 29, 231, 38, 45, 35, 227, 17, 157, 78, 231, 194, 251, 193, 202, 139, 75, 10, 93, 82, 86, 255, 190, 85, 31, 57, 97, 10, 4, 30, 65, 1, 249, 178, 231, 131, 163, 36, 178, 84, 13, 83, 75, 69, 24, 154, 133, 15, 208, 165, 237, 222, 43, 223, 107, 154, 91, 90, 109, 168, 49, 133, 166, 222, 107, 148, 117, 49, 66, 84, 44, 46, 44, 188, 55, 24, 154, 162, 66, 197, 21, 75, 111, 22, 68, 205, 140, 27, 99, 19, 89, 77, 145, 50, 123, 108, 99, 69, 45, 82, 153, 35, 249, 111, 36, 201, 186, 189, 168, 175, 202, 24, 51, 53, 191, 85, 163, 226, 144, 68, 108, 160, 85, 49, 162, 220, 7, 3, 8, 218, 142, 65, 196, 183, 107, 252, 136, 138, 124, 78, 215, 161, 234, 210, 244, 195, 25, 50, 209, 220, 212, 106, 181, 81, 10, 75, 157, 109, 77, 220, 151, 134, 124, 152, 80, 183, 85, 83, 110, 157, 91, 36, 106, 152, 57, 76, 195, 92, 185, 233, 247, 210, 168, 9, 83, 75, 30, 237, 21, 169, 7, 31, 38, 20, 110, 104, 7, 93, 69, 124, 67, 203, 166, 46, 92, 172, 45, 188, 89, 44, 167, 138, 44, 191, 120, 241, 226, 83, 53, 181, 255, 136, 170, 95, 120, 71, 83, 43, 68, 68, 237, 174, 240, 239, 69, 94, 149, 80, 202, 204, 91, 65, 110, 213, 133, 108, 254, 2, 191, 252, 19, 242, 170, 28, 175, 108, 189, 86, 8, 172, 18, 152, 37, 47, 166, 206, 157, 203, 127, 66, 14, 156, 153, 185, 244, 39, 13, 233, 226, 69, 33, 45, 100, 206, 79, 43, 53, 154, 114, 23, 17, 144, 203, 26, 161, 101, 149, 205, 189, 26, 99, 66, 54, 193, 29, 11, 63, 32, 58, 70, 152, 238, 156, 48, 229, 18, 143, 20, 186, 183, 0, 97, 70, 79, 152, 90, 10, 41, 93, 82, 53, 53, 118, 60, 61, 135, 141, 212, 31, 58, 126, 66, 38, 251, 156, 146, 146, 146, 174, 247, 98, 113, 140, 176, 124, 53, 232, 128, 61, 209, 26, 236, 245, 151, 3, 130, 226, 173, 24, 180, 35, 110, 231, 128, 88, 64, 29, 207, 56, 194, 146, 197, 91, 126, 73, 73, 19, 200, 245, 151, 66, 164, 151, 164, 22, 239, 207, 56, 42, 91, 58, 242, 149, 109, 170, 106, 203, 106, 39, 244, 49, 189, 131, 160, 143, 222, 38, 204, 31, 228, 146, 130, 82, 37, 244, 156, 203, 16, 196, 163, 143, 129, 220, 117, 183, 0, 29, 249, 160, 115, 217, 172, 31, 87, 84, 216, 140, 245, 122, 125, 50, 18, 101, 29, 93, 13, 226, 89, 104, 184, 147, 17, 123, 156, 81, 67, 36, 185, 78, 212, 54, 240, 140, 35, 44, 93, 192, 21, 23, 75, 173, 228, 68, 11, 71, 234, 165, 194, 194, 103, 68, 141, 174, 14, 105, 212, 246, 134, 204, 165, 25, 23, 46, 60, 9, 221, 97, 120, 145, 151, 235, 242, 129, 64, 100, 240, 242, 13, 191, 233, 62, 25, 16, 175, 113, 26, 156, 88, 124, 54, 43, 251, 22, 215, 144, 143, 179, 7, 57, 144, 18, 239, 27, 4, 162, 22, 111, 108, 57, 112, 103, 77, 13, 145, 228, 44, 190, 125, 123, 92, 136, 33, 170, 74, 148, 140, 96, 84, 80, 222, 144, 61, 122, 8, 159, 57, 212, 213, 49, 101, 202, 135, 9, 109, 213, 32, 79, 30, 26, 145, 51, 201, 147, 111, 24, 232, 174, 146, 203, 83, 88, 24, 73, 130, 169, 182, 41, 146, 36, 2, 81, 187, 55, 178, 24, 133, 184, 207, 202, 62, 73, 121, 59, 137, 162, 198, 138, 64, 84, 129, 108, 42, 138, 180, 200, 227, 246, 126, 51, 67, 10, 62, 204, 59, 76, 178, 87, 175, 94, 125, 65, 171, 213, 6, 112, 13, 19, 10, 190, 102, 233, 245, 122, 8, 164, 124, 8, 9, 18, 129, 168, 59, 90, 228, 35, 114, 143, 193, 26, 200, 145, 12, 16, 53, 2, 4, 162, 58, 11, 186, 250, 176, 216, 18, 124, 152, 119, 16, 125, 118, 118, 246, 203, 217, 217, 5, 79, 27, 90, 196, 34, 16, 136, 218, 185, 89, 229, 149, 249, 171, 114, 57, 60, 43, 146, 164, 140, 118, 168, 73, 34, 172, 185, 168, 171, 103, 90, 178, 131, 210, 108, 108, 72, 227, 68, 32, 16, 181, 115, 147, 202, 65, 59, 173, 141, 20, 1, 168, 46, 73, 106, 48, 71, 18, 129, 48, 155, 48, 237, 80, 123, 68, 32, 234, 214, 141, 41, 167, 127, 120, 8, 228, 102, 205, 106, 59, 80, 137, 228, 177, 250, 168, 5, 32, 16, 8, 4, 162, 225, 104, 146, 177, 66, 176, 141, 53, 73, 242, 144, 184, 82, 198, 51, 142, 64, 32, 16, 136, 251, 133, 32, 109, 132, 62, 146, 95, 215, 80, 250, 199, 47, 168, 69, 34, 16, 8, 4, 226, 126, 36, 73, 91, 33, 180, 126, 165, 149, 251, 72, 106, 21, 125, 36, 49, 104, 7, 129, 64, 32, 16, 247, 21, 73, 138, 221, 31, 246, 212, 16, 73, 14, 64, 146, 68, 32, 238, 239, 137, 194, 6, 5, 197, 152, 152, 34, 152, 122, 32, 114, 208, 206, 19, 66, 51, 89, 173, 149, 205, 173, 114, 63, 193, 7, 204, 220, 39, 27, 188, 135, 81, 80, 234, 200, 220, 39, 87, 109, 80, 171, 213, 182, 252, 57, 10, 138, 36, 234, 219, 207, 237, 12, 77, 202, 245, 108, 161, 248, 47, 33, 71, 210, 26, 62, 73, 49, 240, 231, 223, 247, 66, 35, 198, 49, 139, 130, 98, 85, 177, 163, 24, 104, 135, 176, 68, 83, 81, 62, 79, 77, 77, 125, 48, 243, 210, 165, 103, 160, 202, 255, 241, 227, 199, 159, 190, 31, 229, 204, 153, 51, 207, 147, 230, 42, 71, 157, 78, 231, 108, 229, 28, 73, 61, 175, 61, 121, 237, 202, 149, 27, 77, 55, 165, 167, 63, 150, 153, 153, 249, 140, 201, 253, 201, 206, 126, 26, 10, 64, 87, 225, 242, 96, 78, 25, 2, 81, 131, 147, 223, 75, 76, 190, 99, 178, 152, 201, 2, 38, 223, 163, 160, 112, 129, 110, 227, 169, 76, 58, 136, 230, 85, 254, 252, 113, 38, 59, 121, 235, 27, 40, 229, 150, 125, 31, 203, 69, 161, 133, 79, 153, 149, 76, 173, 101, 130, 233, 54, 203, 204, 253, 56, 207, 235, 86, 6, 243, 115, 108, 78, 225, 1, 57, 232, 168, 63, 15, 60, 154, 135, 227, 22, 5, 165, 90, 178, 128, 215, 144, 29, 46, 221, 97, 127, 236, 219, 231, 182, 235, 232, 9, 250, 243, 214, 63, 233, 218, 63, 119, 209, 213, 219, 118, 208, 85, 236, 249, 207, 91, 255, 144, 30, 37, 217, 102, 101, 217, 90, 197, 207, 148, 223, 217, 170, 120, 94, 213, 109, 223, 203, 99, 220, 106, 224, 117, 117, 207, 71, 117, 246, 107, 171, 241, 239, 172, 248, 125, 43, 221, 114, 48, 131, 110, 252, 99, 231, 124, 174, 57, 58, 66, 167, 116, 233, 121, 90, 218, 243, 251, 255, 62, 162, 185, 146, 95, 64, 207, 100, 101, 211, 243, 151, 175, 208, 243, 57, 92, 46, 95, 185, 243, 117, 142, 226, 179, 156, 43, 119, 127, 95, 249, 219, 203, 6, 94, 95, 54, 177, 61, 99, 255, 93, 201, 111, 47, 48, 57, 123, 41, 135, 22, 148, 119, 70, 103, 138, 159, 117, 56, 146, 111, 167, 172, 168, 184, 152, 158, 205, 206, 145, 254, 199, 212, 190, 195, 231, 112, 30, 111, 148, 104, 232, 250, 109, 127, 206, 131, 115, 156, 94, 9, 73, 178, 235, 33, 45, 88, 90, 71, 14, 106, 117, 173, 176, 136, 34, 16, 8, 235, 33, 159, 221, 83, 227, 103, 207, 111, 65, 136, 179, 170, 5, 249, 200, 37, 147, 180, 234, 114, 140, 184, 248, 156, 38, 158, 193, 23, 137, 95, 216, 37, 226, 221, 251, 18, 81, 5, 93, 36, 221, 253, 206, 145, 238, 190, 103, 73, 55, 223, 115, 210, 243, 30, 254, 229, 34, 61, 23, 68, 249, 186, 135, 137, 207, 13, 253, 182, 178, 223, 139, 191, 51, 246, 88, 217, 126, 152, 220, 103, 126, 92, 70, 159, 155, 122, 207, 223, 130, 239, 249, 25, 121, 237, 87, 197, 255, 49, 231, 187, 166, 254, 211, 208, 103, 21, 239, 157, 97, 215, 254, 26, 233, 226, 17, 41, 205, 202, 97, 97, 14, 68, 165, 226, 254, 201, 166, 141, 73, 87, 239, 109, 196, 61, 232, 10, 113, 11, 60, 67, 122, 6, 158, 175, 84, 220, 204, 248, 142, 57, 223, 119, 51, 240, 218, 173, 42, 219, 10, 58, 79, 188, 130, 207, 147, 55, 219, 157, 221, 245, 215, 161, 2, 222, 232, 213, 42, 44, 169, 227, 219, 249, 35, 125, 255, 13, 210, 228, 227, 179, 236, 126, 98, 251, 16, 112, 231, 254, 42, 165, 39, 59, 143, 174, 1, 215, 137, 155, 255, 4, 233, 20, 183, 109, 107, 178, 110, 101, 91, 181, 90, 250, 252, 63, 225, 49, 221, 63, 233, 31, 159, 239, 51, 98, 236, 41, 207, 164, 209, 231, 80, 80, 80, 140, 139, 71, 226, 168, 115, 170, 196, 209, 103, 125, 134, 143, 189, 208, 107, 212, 132, 75, 65, 163, 190, 200, 118, 27, 170, 62, 245, 223, 190, 3, 15, 147, 192, 190, 7, 58, 13, 74, 60, 157, 240, 77, 138, 46, 108, 236, 164, 155, 228, 51, 183, 15, 165, 155, 237, 100, 86, 214, 75, 127, 101, 100, 52, 103, 79, 31, 18, 111, 194, 48, 117, 202, 67, 235, 119, 236, 120, 50, 45, 45, 253, 233, 181, 107, 215, 62, 49, 119, 213, 170, 71, 213, 211, 83, 31, 153, 158, 154, 250, 200, 132, 185, 115, 31, 157, 59, 119, 213, 163, 19, 234, 129, 192, 241, 76, 231, 199, 133, 114, 91, 224, 26, 79, 90, 184, 240, 97, 19, 166, 122, 91, 117, 114, 114, 99, 24, 19, 113, 19, 230, 62, 122, 191, 73, 249, 248, 157, 251, 40, 59, 20, 123, 166, 249, 173, 231, 252, 86, 98, 205, 244, 143, 155, 55, 111, 134, 193, 185, 90, 153, 150, 246, 56, 252, 87, 229, 178, 234, 81, 11, 61, 38, 178, 175, 248, 1, 38, 141, 153, 60, 194, 228, 81, 20, 20, 20, 131, 194, 238, 143, 215, 30, 11, 83, 171, 159, 230, 175, 101, 60, 113, 225, 210, 37, 39, 182, 72, 158, 198, 110, 219, 191, 229, 166, 214, 226, 100, 55, 155, 71, 246, 253, 198, 171, 142, 120, 203, 141, 46, 17, 8, 161, 66, 191, 189, 44, 25, 25, 25, 142, 245, 169, 8, 49, 59, 150, 3, 66, 49, 114, 107, 149, 163, 3, 124, 80, 133, 125, 177, 5, 83, 170, 37, 81, 120, 56, 74, 17, 136, 42, 221, 247, 111, 50, 73, 98, 178, 23, 162, 218, 75, 245, 101, 244, 239, 204, 83, 116, 221, 142, 61, 244, 155, 69, 203, 126, 173, 248, 226, 244, 37, 203, 86, 111, 61, 152, 65, 143, 156, 62, 75, 75, 116, 21, 189, 102, 97, 69, 125, 152, 7, 2, 4, 23, 20, 20, 188, 161, 252, 3, 149, 42, 213, 14, 38, 203, 204, 204, 204, 70, 240, 40, 249, 171, 202, 205, 113, 182, 240, 168, 170, 195, 2, 251, 199, 125, 58, 24, 25, 216, 192, 161, 78, 77, 117, 100, 154, 228, 21, 43, 166, 127, 200, 219, 200, 103, 247, 205, 83, 120, 134, 173, 124, 189, 192, 204, 204, 239, 97, 75, 133, 223, 243, 24, 214, 95, 199, 16, 6, 174, 28, 181, 218, 182, 170, 215, 149, 8, 243, 58, 159, 211, 109, 83, 82, 82, 28, 214, 173, 91, 39, 113, 147, 120, 205, 207, 158, 61, 251, 15, 118, 111, 70, 50, 217, 46, 55, 69, 63, 196, 136, 113, 242, 162, 101, 244, 157, 126, 241, 148, 116, 243, 189, 70, 156, 60, 247, 146, 14, 110, 177, 183, 247, 176, 179, 106, 32, 113, 242, 56, 196, 62, 204, 126, 52, 56, 138, 134, 126, 49, 149, 46, 88, 243, 43, 61, 120, 226, 36, 45, 186, 85, 97, 125, 130, 200, 128, 116, 38, 201, 144, 28, 93, 92, 92, 252, 79, 3, 172, 12, 9, 152, 142, 92, 235, 184, 47, 200, 135, 55, 253, 116, 103, 210, 155, 73, 160, 78, 167, 235, 133, 114, 167, 176, 243, 98, 80, 234, 193, 113, 5, 51, 241, 101, 18, 39, 16, 155, 53, 210, 63, 100, 109, 244, 64, 126, 126, 126, 147, 220, 220, 220, 55, 242, 10, 11, 223, 204, 205, 45, 108, 198, 158, 55, 187, 253, 40, 74, 225, 237, 247, 11, 11, 45, 151, 92, 75, 37, 87, 241, 104, 234, 59, 213, 145, 92, 3, 175, 13, 29, 183, 113, 129, 5, 58, 72, 33, 59, 135, 57, 57, 57, 15, 87, 247, 158, 135, 69, 61, 108, 175, 252, 188, 153, 58, 15, 185, 85, 56, 15, 185, 102, 108, 35, 215, 140, 247, 205, 185, 22, 230, 156, 195, 202, 142, 193, 212, 245, 177, 100, 31, 114, 171, 112, 78, 10, 222, 184, 86, 88, 248, 22, 187, 79, 158, 148, 249, 195, 74, 115, 186, 157, 129, 234, 86, 240, 94, 71, 30, 177, 47, 45, 136, 79, 103, 101, 211, 111, 151, 175, 162, 45, 251, 15, 161, 196, 197, 231, 42, 113, 11, 248, 177, 121, 88, 127, 159, 97, 83, 83, 254, 97, 124, 133, 54, 125, 250, 243, 159, 199, 12, 233, 72, 124, 67, 135, 19, 103, 239, 95, 137, 179, 87, 22, 9, 236, 75, 67, 39, 76, 165, 139, 214, 109, 84, 106, 154, 215, 153, 252, 206, 100, 4, 147, 182, 233, 233, 233, 143, 25, 216, 89, 71, 46, 182, 117, 144, 28, 237, 4, 117, 27, 129, 168, 137, 244, 143, 76, 38, 151, 57, 1, 223, 226, 214, 25, 148, 170, 73, 1, 63, 167, 95, 139, 247, 175, 133, 247, 188, 220, 237, 37, 70, 88, 248, 107, 240, 220, 214, 154, 200, 33, 217, 59, 173, 232, 22, 186, 131, 28, 53, 26, 205, 27, 220, 156, 42, 249, 25, 111, 20, 23, 211, 95, 182, 239, 160, 190, 163, 39, 82, 210, 221, 175, 132, 201, 111, 239, 69, 12, 12, 55, 64, 140, 54, 146, 102, 91, 17, 37, 215, 86, 138, 146, 187, 139, 197, 83, 150, 172, 121, 186, 71, 220, 240, 14, 196, 59, 100, 56, 211, 52, 55, 50, 210, 188, 242, 98, 216, 0, 26, 155, 252, 45, 253, 57, 109, 59, 61, 119, 233, 178, 56, 49, 156, 229, 57, 117, 125, 10, 53, 154, 55, 13, 28, 128, 236, 207, 178, 173, 11, 85, 12, 228, 200, 64, 231, 193, 137, 223, 206, 92, 177, 134, 206, 102, 43, 138, 20, 38, 179, 80, 26, 140, 204, 89, 185, 134, 78, 93, 156, 74, 119, 28, 56, 40, 105, 144, 86, 78, 255, 208, 239, 63, 122, 140, 110, 222, 187, 143, 30, 60, 113, 138, 238, 59, 122, 156, 201, 9, 186, 255, 88, 185, 136, 207, 37, 169, 236, 181, 41, 81, 124, 183, 98, 219, 71, 205, 251, 237, 190, 163, 150, 255, 135, 161, 109, 239, 179, 100, 159, 149, 219, 56, 106, 250, 59, 123, 51, 142, 210, 140, 51, 231, 164, 251, 148, 56, 190, 219, 140, 155, 93, 45, 89, 124, 87, 204, 57, 211, 22, 45, 61, 114, 236, 124, 150, 180, 205, 187, 246, 251, 168, 153, 251, 165, 252, 238, 81, 11, 174, 89, 101, 219, 63, 106, 226, 124, 30, 173, 252, 119, 166, 246, 99, 223, 81, 197, 248, 48, 115, 95, 42, 198, 137, 114, 12, 91, 112, 13, 149, 255, 153, 126, 228, 184, 100, 173, 220, 184, 119, 63, 125, 183, 239, 192, 73, 112, 109, 90, 128, 217, 213, 66, 255, 61, 39, 71, 27, 193, 82, 208, 152, 91, 136, 126, 225, 139, 83, 122, 128, 253, 223, 136, 89, 243, 40, 241, 239, 67, 73, 23, 207, 35, 15, 5, 69, 140, 138, 249, 98, 202, 127, 149, 156, 208, 34, 44, 197, 129, 152, 24, 87, 54, 240, 37, 167, 232, 232, 70, 205, 213, 106, 71, 67, 164, 57, 125, 94, 234, 243, 173, 163, 7, 57, 147, 158, 65, 19, 137, 147, 231, 78, 226, 234, 95, 248, 241, 192, 97, 116, 252, 252, 197, 116, 219, 190, 191, 104, 94, 65, 161, 60, 79, 20, 115, 71, 232, 100, 80, 113, 51, 51, 243, 26, 27, 81, 137, 237, 107, 173, 244, 15, 79, 101, 248, 191, 240, 152, 62, 164, 103, 224, 239, 76, 221, 94, 73, 186, 249, 174, 97, 43, 139, 213, 119, 60, 42, 197, 216, 251, 230, 126, 79, 249, 190, 248, 90, 124, 238, 226, 179, 186, 65, 139, 57, 231, 184, 178, 243, 106, 232, 26, 200, 239, 193, 127, 120, 133, 172, 37, 228, 249, 229, 219, 246, 238, 203, 228, 233, 31, 122, 235, 112, 100, 57, 217, 166, 174, 219, 176, 139, 13, 177, 31, 137, 42, 104, 53, 233, 172, 250, 185, 65, 72, 167, 154, 18, 143, 149, 164, 189, 219, 106, 226, 26, 176, 172, 107, 76, 194, 63, 149, 196, 103, 17, 92, 188, 71, 146, 207, 122, 174, 103, 251, 187, 162, 230, 246, 183, 46, 136, 123, 249, 99, 103, 213, 170, 186, 57, 94, 60, 86, 145, 207, 221, 151, 147, 110, 62, 155, 62, 140, 30, 28, 36, 199, 185, 84, 182, 216, 17, 184, 195, 86, 193, 41, 45, 161, 227, 14, 87, 216, 104, 118, 110, 158, 228, 54, 252, 52, 54, 17, 204, 169, 121, 196, 61, 240, 123, 231, 216, 97, 157, 148, 218, 38, 112, 158, 172, 52, 89, 234, 28, 183, 45, 103, 86, 198, 236, 70, 242, 181, 250, 142, 31, 255, 218, 191, 122, 71, 7, 144, 158, 1, 243, 25, 59, 31, 103, 147, 142, 222, 119, 212, 4, 58, 159, 237, 216, 81, 182, 234, 211, 222, 78, 57, 187, 192, 181, 204, 144, 146, 146, 146, 38, 70, 180, 76, 240, 13, 218, 223, 99, 170, 68, 7, 62, 2, 198, 223, 183, 86, 140, 108, 213, 113, 166, 44, 197, 8, 241, 26, 187, 94, 54, 103, 206, 156, 121, 64, 112, 231, 152, 43, 141, 204, 172, 98, 132, 168, 29, 216, 84, 162, 49, 58, 42, 175, 31, 196, 198, 176, 247, 162, 153, 236, 128, 219, 174, 164, 84, 71, 183, 164, 239, 167, 17, 147, 146, 41, 113, 15, 210, 147, 238, 190, 59, 154, 132, 68, 71, 169, 167, 207, 123, 254, 78, 83, 98, 91, 137, 219, 44, 180, 70, 84, 58, 50, 109, 212, 114, 244, 145, 1, 210, 132, 8, 34, 183, 56, 245, 135, 142, 129, 125, 135, 178, 149, 218, 70, 210, 213, 59, 183, 89, 68, 44, 85, 207, 94, 64, 211, 152, 58, 125, 173, 176, 80, 12, 0, 130, 168, 162, 225, 76, 90, 1, 139, 27, 34, 76, 185, 154, 200, 61, 8, 149, 179, 173, 83, 66, 136, 237, 61, 59, 246, 58, 140, 138, 200, 99, 11, 206, 89, 6, 187, 137, 210, 211, 211, 29, 36, 97, 55, 83, 122, 186, 97, 73, 101, 99, 21, 190, 3, 19, 45, 31, 115, 105, 86, 236, 254, 33, 7, 0, 157, 185, 126, 253, 250, 227, 176, 125, 182, 66, 124, 48, 253, 118, 26, 77, 93, 19, 41, 102, 0, 238, 237, 106, 75, 61, 74, 9, 170, 79, 128, 172, 3, 171, 92, 223, 26, 20, 99, 38, 78, 177, 83, 143, 140, 41, 169, 169, 15, 178, 247, 92, 152, 44, 133, 8, 114, 184, 217, 78, 156, 191, 64, 191, 90, 242, 35, 125, 38, 108, 0, 37, 93, 188, 206, 18, 255, 62, 95, 123, 37, 141, 106, 121, 151, 245, 144, 9, 39, 198, 123, 164, 32, 177, 63, 3, 27, 174, 33, 59, 242, 132, 217, 179, 95, 108, 19, 53, 88, 69, 92, 3, 102, 49, 149, 255, 40, 211, 50, 105, 208, 184, 201, 244, 135, 245, 191, 209, 211, 89, 151, 196, 73, 133, 205, 109, 116, 58, 28, 52, 155, 180, 30, 55, 98, 146, 109, 48, 55, 159, 108, 122, 206, 201, 201, 121, 182, 184, 184, 180, 149, 86, 171, 253, 128, 173, 150, 90, 54, 16, 129, 99, 109, 157, 151, 151, 247, 162, 37, 209, 110, 213, 53, 215, 179, 223, 31, 19, 181, 64, 107, 144, 36, 211, 36, 87, 212, 135, 21, 188, 165, 40, 214, 106, 91, 106, 116, 58, 79, 157, 78, 231, 170, 209, 104, 122, 162, 212, 134, 232, 220, 248, 115, 136, 218, 127, 170, 10, 254, 219, 90, 159, 3, 229, 24, 22, 241, 125, 54, 23, 182, 96, 239, 77, 96, 114, 92, 138, 28, 45, 44, 162, 43, 127, 223, 74, 221, 71, 140, 163, 76, 99, 44, 38, 221, 253, 214, 126, 62, 96, 136, 119, 234, 166, 77, 98, 16, 169, 141, 228, 62, 172, 11, 199, 15, 23, 65, 197, 118, 134, 251, 51, 149, 7, 221, 200, 107, 40, 99, 117, 239, 222, 9, 164, 139, 247, 22, 210, 195, 175, 240, 147, 216, 4, 41, 104, 2, 2, 26, 110, 149, 86, 164, 166, 65, 129, 231, 37, 224, 116, 45, 42, 42, 122, 206, 216, 137, 171, 175, 164, 201, 143, 209, 150, 63, 159, 37, 228, 171, 150, 53, 16, 145, 7, 194, 122, 121, 76, 85, 70, 128, 194, 249, 130, 113, 49, 149, 201, 106, 190, 194, 252, 177, 18, 129, 2, 198, 203, 152, 172, 18, 170, 236, 148, 89, 49, 178, 245, 4, 111, 26, 240, 147, 25, 251, 82, 27, 2, 231, 104, 13, 76, 58, 213, 93, 108, 8, 145, 226, 142, 242, 4, 134, 168, 27, 40, 213, 235, 71, 11, 10, 135, 77, 29, 158, 247, 42, 98, 84, 20, 230, 212, 23, 185, 57, 21, 172, 143, 165, 176, 138, 221, 117, 56, 131, 14, 153, 62, 139, 18, 159, 80, 208, 26, 15, 146, 192, 62, 9, 67, 191, 249, 230, 142, 118, 116, 160, 184, 169, 140, 196, 214, 212, 9, 168, 37, 13, 51, 76, 214, 48, 239, 34, 180, 62, 227, 167, 190, 242, 114, 72, 116, 48, 113, 245, 251, 145, 116, 245, 206, 122, 178, 119, 63, 58, 108, 198, 28, 250, 251, 158, 125, 210, 234, 128, 35, 151, 79, 120, 161, 183, 110, 221, 122, 217, 192, 137, 117, 84, 70, 53, 221, 239, 16, 86, 123, 246, 169, 235, 54, 252, 184, 109, 239, 62, 186, 117, 247, 222, 27, 91, 118, 239, 189, 185, 181, 1, 200, 150, 93, 123, 11, 183, 238, 73, 167, 107, 126, 223, 178, 137, 157, 131, 70, 230, 172, 128, 193, 108, 10, 143, 75, 214, 173, 107, 175, 173, 94, 217, 213, 50, 43, 206, 77, 250, 251, 101, 18, 101, 154, 31, 141, 157, 252, 77, 239, 234, 144, 164, 234, 182, 123, 192, 102, 198, 15, 169, 39, 127, 249, 99, 23, 77, 221, 240, 27, 253, 105, 83, 26, 74, 173, 200, 239, 229, 143, 27, 55, 211, 152, 228, 20, 250, 98, 112, 228, 196, 114, 107, 99, 221, 114, 227, 8, 126, 198, 59, 52, 198, 188, 188, 188, 198, 60, 119, 125, 185, 108, 78, 61, 121, 33, 139, 78, 79, 93, 73, 223, 138, 26, 76, 25, 103, 92, 34, 94, 33, 115, 59, 13, 28, 214, 78, 185, 77, 224, 156, 42, 5, 225, 212, 182, 41, 71, 225, 203, 188, 227, 70, 156, 50, 103, 206, 147, 237, 250, 197, 119, 39, 30, 193, 51, 137, 147, 231, 49, 88, 29, 68, 76, 78, 166, 107, 182, 253, 73, 47, 95, 187, 46, 223, 203, 144, 35, 5, 181, 53, 35, 111, 220, 184, 209, 212, 192, 137, 110, 84, 47, 74, 115, 241, 136, 91, 231, 65, 195, 222, 34, 254, 225, 101, 164, 187, 31, 37, 174, 254, 122, 38, 148, 244, 104, 8, 226, 87, 126, 204, 108, 12, 116, 137, 73, 120, 15, 206, 69, 115, 213, 221, 150, 9, 67, 231, 236, 159, 189, 162, 18, 58, 196, 171, 169, 42, 97, 148, 198, 109, 232, 200, 50, 83, 226, 58, 68, 93, 230, 51, 124, 108, 89, 243, 62, 49, 101, 115, 150, 255, 172, 179, 86, 247, 15, 190, 133, 50, 168, 109, 62, 50, 229, 59, 218, 58, 122, 176, 244, 63, 174, 149, 236, 79, 109, 8, 236, 147, 71, 226, 168, 82, 176, 232, 252, 175, 111, 204, 185, 10, 235, 76, 213, 136, 242, 246, 111, 218, 245, 24, 42, 69, 161, 182, 119, 253, 129, 201, 50, 133, 164, 114, 89, 102, 224, 81, 249, 185, 248, 218, 216, 239, 82, 13, 252, 198, 208, 103, 149, 253, 222, 212, 127, 43, 183, 187, 204, 200, 239, 82, 141, 124, 175, 178, 227, 50, 103, 187, 166, 182, 111, 252, 28, 124, 220, 109, 201, 75, 189, 163, 214, 119, 140, 29, 226, 91, 151, 76, 174, 134, 242, 25, 217, 190, 65, 32, 214, 103, 60, 136, 238, 130, 164, 37, 221, 40, 160, 43, 54, 131, 57, 117, 124, 185, 57, 181, 135, 223, 134, 150, 145, 3, 131, 199, 45, 88, 240, 148, 50, 8, 71, 170, 182, 83, 175, 26, 36, 179, 139, 5, 147, 159, 146, 241, 33, 144, 194, 59, 105, 212, 167, 196, 187, 247, 120, 210, 89, 181, 159, 168, 122, 233, 3, 198, 78, 166, 63, 254, 150, 70, 179, 174, 230, 201, 115, 17, 68, 0, 109, 96, 18, 149, 95, 82, 242, 154, 129, 160, 31, 251, 250, 160, 93, 6, 142, 250, 162, 121, 244, 184, 41, 31, 71, 79, 248, 242, 195, 136, 49, 95, 182, 142, 248, 130, 137, 252, 88, 71, 37, 114, 220, 212, 86, 210, 62, 90, 32, 226, 111, 34, 199, 77, 106, 21, 241, 197, 228, 54, 97, 163, 238, 204, 95, 50, 103, 130, 142, 80, 79, 127, 228, 209, 128, 240, 86, 164, 163, 123, 107, 182, 210, 108, 69, 156, 189, 90, 27, 149, 79, 93, 91, 125, 30, 51, 248, 83, 246, 179, 102, 39, 207, 159, 159, 204, 125, 136, 58, 107, 105, 144, 58, 157, 238, 52, 241, 14, 110, 69, 222, 254, 236, 67, 226, 17, 242, 17, 27, 203, 166, 247, 167, 182, 164, 131, 107, 171, 87, 123, 71, 127, 236, 18, 175, 254, 151, 21, 124, 147, 24, 41, 94, 183, 125, 57, 54, 181, 247, 215, 21, 230, 212, 187, 98, 87, 74, 75, 75, 91, 179, 247, 39, 49, 57, 90, 110, 217, 40, 149, 162, 83, 7, 124, 53, 131, 66, 28, 11, 233, 226, 113, 224, 153, 94, 145, 137, 177, 147, 147, 223, 172, 15, 26, 99, 21, 149, 167, 84, 59, 41, 194, 85, 17, 252, 3, 43, 219, 192, 164, 241, 45, 152, 86, 145, 72, 186, 120, 237, 34, 61, 3, 181, 30, 108, 69, 1, 129, 63, 23, 174, 92, 149, 39, 165, 27, 76, 214, 65, 73, 185, 162, 162, 162, 231, 141, 4, 253, 96, 241, 231, 250, 15, 155, 106, 220, 192, 35, 106, 160, 102, 235, 226, 6, 124, 45, 236, 185, 139, 5, 165, 122, 98, 103, 5, 145, 44, 120, 247, 154, 76, 76, 249, 24, 1, 60, 0, 103, 52, 111, 42, 80, 86, 90, 86, 38, 21, 118, 24, 53, 103, 1, 181, 13, 142, 166, 108, 1, 7, 45, 27, 147, 85, 9, 234, 54, 10, 133, 199, 6, 184, 66, 213, 144, 163, 255, 225, 224, 91, 220, 209, 179, 240, 54, 252, 213, 99, 223, 34, 129, 225, 67, 73, 55, 223, 63, 137, 91, 128, 70, 197, 8, 115, 217, 134, 205, 162, 134, 153, 199, 3, 18, 220, 161, 226, 130, 33, 255, 229, 61, 24, 28, 118, 220, 244, 235, 88, 77, 105, 116, 240, 224, 193, 135, 211, 210, 50, 30, 73, 75, 75, 171, 211, 34, 237, 103, 70, 198, 35, 107, 210, 211, 31, 146, 253, 208, 97, 82, 196, 179, 105, 9, 227, 81, 209, 97, 41, 41, 14, 80, 96, 252, 14, 81, 131, 148, 7, 237, 152, 43, 144, 2, 18, 29, 157, 220, 8, 156, 245, 230, 8, 236, 47, 92, 51, 166, 245, 253, 100, 69, 146, 148, 83, 72, 250, 193, 182, 51, 216, 121, 33, 229, 185, 88, 142, 42, 43, 9, 108, 75, 50, 65, 183, 96, 247, 73, 152, 117, 100, 199, 142, 29, 15, 90, 105, 220, 74, 99, 151, 231, 48, 54, 66, 169, 146, 60, 192, 253, 236, 210, 184, 38, 213, 21, 114, 239, 52, 72, 83, 249, 238, 236, 189, 119, 249, 130, 52, 93, 138, 39, 130, 238, 25, 39, 79, 209, 41, 139, 83, 233, 155, 145, 131, 202, 253, 140, 30, 65, 139, 218, 68, 15, 114, 217, 113, 225, 194, 131, 74, 115, 170, 245, 115, 26, 235, 129, 102, 96, 42, 39, 51, 64, 61, 246, 237, 231, 122, 69, 37, 144, 174, 62, 59, 153, 134, 169, 11, 28, 59, 153, 174, 222, 250, 7, 205, 187, 81, 40, 22, 47, 152, 193, 228, 83, 34, 4, 14, 201, 133, 111, 107, 194, 28, 75, 235, 149, 61, 252, 158, 175, 56, 109, 44, 104, 11, 101, 13, 177, 19, 162, 98, 255, 180, 98, 250, 135, 236, 216, 108, 41, 248, 94, 172, 125, 108, 54, 117, 57, 82, 17, 209, 176, 230, 19, 65, 49, 184, 99, 158, 134, 5, 43, 123, 239, 35, 38, 99, 153, 236, 151, 93, 17, 80, 100, 6, 2, 112, 62, 28, 48, 20, 52, 198, 60, 166, 240, 172, 104, 29, 25, 235, 175, 78, 73, 121, 90, 73, 140, 66, 78, 35, 194, 60, 179, 172, 202, 206, 80, 72, 111, 248, 152, 9, 239, 17, 191, 62, 163, 72, 103, 207, 131, 196, 187, 55, 141, 249, 122, 38, 221, 146, 126, 128, 150, 148, 86, 204, 121, 251, 152, 12, 49, 224, 191, 180, 90, 167, 18, 121, 64, 23, 22, 22, 62, 83, 90, 90, 218, 142, 201, 167, 13, 72, 62, 97, 210, 161, 164, 164, 228, 117, 75, 110, 238, 186, 50, 9, 176, 253, 56, 101, 165, 136, 84, 185, 210, 206, 153, 123, 184, 239, 182, 214, 24, 183, 90, 173, 246, 67, 222, 25, 197, 135, 137, 31, 164, 96, 137, 143, 202, 231, 230, 136, 57, 223, 55, 181, 125, 99, 191, 55, 244, 62, 175, 211, 233, 107, 201, 126, 26, 251, 111, 113, 91, 149, 109, 207, 212, 255, 26, 122, 173, 252, 174, 248, 200, 5, 206, 127, 16, 187, 151, 154, 214, 69, 162, 20, 44, 55, 118, 134, 50, 11, 32, 207, 157, 189, 231, 204, 228, 27, 158, 255, 46, 173, 26, 51, 78, 157, 161, 211, 127, 92, 73, 219, 12, 76, 96, 196, 232, 157, 79, 92, 124, 214, 188, 23, 17, 19, 50, 97, 246, 162, 23, 149, 126, 70, 158, 17, 129, 11, 192, 234, 106, 153, 134, 242, 49, 225, 194, 185, 15, 29, 245, 49, 216, 178, 73, 23, 175, 51, 141, 123, 247, 163, 95, 204, 95, 204, 84, 250, 211, 98, 132, 236, 10, 40, 90, 32, 94, 4, 190, 58, 175, 86, 238, 165, 108, 202, 101, 143, 51, 27, 112, 74, 214, 73, 225, 60, 216, 153, 51, 185, 243, 27, 45, 133, 201, 22, 30, 189, 188, 241, 30, 8, 4, 125, 109, 98, 242, 43, 84, 218, 97, 164, 166, 181, 82, 10, 136, 76, 178, 215, 248, 182, 229, 255, 178, 230, 190, 175, 231, 157, 119, 32, 151, 248, 97, 115, 206, 181, 57, 36, 201, 30, 255, 194, 140, 194, 58, 133, 100, 217, 124, 89, 155, 243, 172, 48, 55, 26, 141, 237, 96, 239, 55, 129, 52, 61, 238, 234, 146, 162, 82, 33, 239, 61, 253, 200, 49, 58, 121, 209, 82, 250, 46, 244, 103, 132, 186, 169, 221, 124, 87, 189, 22, 26, 29, 60, 230, 187, 239, 94, 82, 108, 194, 182, 193, 251, 25, 107, 90, 187, 52, 84, 91, 22, 252, 77, 31, 70, 199, 186, 17, 85, 224, 79, 236, 226, 92, 239, 24, 63, 130, 46, 221, 240, 27, 189, 122, 253, 134, 88, 229, 103, 136, 216, 19, 83, 232, 133, 105, 83, 133, 201, 70, 186, 192, 87, 174, 92, 105, 147, 119, 45, 127, 82, 110, 126, 254, 24, 38, 99, 65, 174, 241, 71, 229, 115, 67, 114, 77, 144, 170, 124, 150, 107, 226, 59, 134, 246, 229, 154, 226, 125, 83, 219, 48, 118, 28, 121, 215, 111, 140, 202, 187, 126, 253, 203, 27, 55, 10, 189, 204, 213, 18, 5, 146, 116, 44, 209, 104, 164, 106, 55, 26, 109, 41, 213, 233, 245, 144, 252, 44, 61, 42, 159, 27, 146, 82, 225, 59, 165, 38, 62, 211, 25, 248, 94, 169, 78, 87, 19, 57, 146, 58, 109, 105, 169, 22, 182, 93, 170, 171, 252, 88, 74, 77, 28, 163, 242, 216, 96, 123, 90, 94, 116, 227, 102, 241, 173, 162, 191, 50, 50, 154, 87, 151, 36, 101, 83, 214, 185, 236, 236, 54, 151, 174, 92, 137, 204, 185, 114, 37, 36, 59, 231, 106, 40, 74, 109, 72, 78, 40, 156, 255, 172, 203, 151, 35, 78, 93, 184, 240, 186, 120, 125, 238, 177, 235, 195, 209, 80, 238, 162, 140, 236, 236, 130, 167, 121, 95, 70, 168, 124, 179, 75, 110, 119, 5, 233, 26, 144, 231, 158, 48, 115, 46, 125, 150, 41, 40, 144, 255, 78, 92, 253, 83, 223, 12, 239, 239, 103, 176, 63, 163, 172, 53, 162, 219, 160, 246, 125, 152, 241, 95, 167, 252, 171, 89, 88, 255, 193, 236, 162, 165, 51, 45, 147, 14, 157, 49, 71, 106, 211, 34, 119, 142, 103, 50, 71, 171, 213, 190, 175, 36, 75, 115, 255, 88, 46, 201, 215, 115, 136, 250, 181, 7, 130, 34, 174, 176, 85, 83, 9, 233, 238, 155, 79, 186, 251, 21, 176, 199, 194, 242, 71, 89, 148, 175, 149, 2, 159, 203, 223, 49, 244, 91, 241, 115, 99, 191, 173, 236, 115, 67, 251, 162, 252, 79, 67, 219, 49, 182, 63, 126, 215, 217, 66, 68, 75, 60, 130, 79, 127, 30, 21, 247, 2, 95, 189, 152, 158, 184, 229, 107, 244, 92, 235, 103, 223, 233, 59, 240, 154, 235, 136, 241, 180, 235, 208, 145, 212, 101, 216, 168, 26, 23, 103, 38, 222, 35, 191, 160, 36, 180, 63, 93, 184, 250, 151, 10, 13, 176, 58, 121, 146, 252, 167, 210, 118, 146, 151, 254, 68, 223, 142, 142, 167, 110, 73, 99, 172, 190, 239, 93, 153, 116, 79, 24, 77, 63, 100, 171, 243, 255, 69, 199, 209, 78, 131, 18, 186, 139, 99, 208, 18, 200, 191, 233, 60, 40, 169, 213, 131, 65, 125, 117, 164, 103, 96, 49, 241, 232, 85, 76, 84, 65, 40, 181, 35, 183, 152, 20, 17, 247, 160, 178, 87, 122, 71, 159, 28, 52, 105, 210, 195, 124, 66, 178, 169, 65, 66, 116, 16, 2, 182, 12, 18, 242, 201, 156, 156, 103, 217, 103, 237, 153, 36, 112, 75, 70, 142, 180, 26, 44, 43, 175, 151, 186, 228, 215, 77, 20, 98, 66, 216, 220, 90, 70, 58, 123, 30, 37, 158, 189, 82, 218, 197, 196, 119, 159, 177, 120, 241, 19, 138, 21, 153, 45, 220, 247, 210, 60, 141, 196, 88, 55, 72, 211, 80, 30, 141, 207, 240, 177, 237, 136, 87, 200, 124, 210, 197, 43, 255, 243, 120, 53, 93, 177, 121, 11, 45, 42, 209, 200, 154, 196, 90, 38, 157, 148, 102, 88, 115, 180, 89, 120, 108, 26, 29, 221, 184, 211, 192, 132, 169, 174, 241, 35, 150, 245, 24, 50, 124, 161, 235, 144, 225, 139, 26, 134, 140, 88, 224, 58, 68, 157, 218, 45, 110, 248, 228, 183, 7, 13, 122, 216, 156, 21, 176, 252, 57, 228, 54, 182, 142, 26, 60, 161, 105, 104, 191, 185, 111, 132, 245, 255, 246, 223, 97, 3, 82, 254, 29, 218, 127, 86, 77, 202, 235, 97, 253, 82, 62, 31, 56, 116, 14, 121, 252, 253, 175, 255, 220, 127, 96, 183, 220, 219, 170, 122, 36, 89, 158, 99, 89, 124, 235, 86, 174, 115, 92, 82, 10, 241, 11, 79, 121, 55, 98, 160, 213, 247, 253, 13, 38, 77, 66, 163, 191, 253, 32, 50, 118, 110, 251, 1, 67, 230, 181, 138, 138, 125, 67, 28, 131, 150, 90, 97, 224, 177, 101, 116, 244, 139, 157, 99, 135, 205, 238, 30, 159, 180, 216, 37, 110, 248, 194, 110, 241, 73, 223, 163, 212, 154, 44, 96, 146, 250, 249, 192, 97, 163, 76, 45, 52, 21, 145, 221, 98, 48, 154, 108, 26, 53, 84, 200, 190, 210, 116, 184, 121, 105, 105, 15, 104, 52, 26, 104, 66, 239, 201, 100, 34, 147, 205, 76, 42, 10, 109, 67, 38, 193, 134, 157, 187, 169, 122, 246, 124, 250, 182, 84, 249, 198, 231, 58, 233, 236, 241, 59, 241, 15, 79, 12, 72, 26, 215, 42, 51, 243, 206, 66, 228, 48, 255, 74, 145, 216, 24, 124, 83, 183, 33, 247, 200, 20, 223, 3, 135, 241, 139, 193, 209, 160, 93, 30, 33, 193, 81, 52, 249, 135, 159, 232, 165, 220, 107, 242, 88, 216, 10, 206, 103, 69, 244, 150, 125, 37, 75, 51, 92, 25, 221, 62, 25, 230, 157, 139, 58, 112, 206, 216, 117, 29, 103, 165, 244, 15, 185, 246, 235, 188, 123, 126, 16, 213, 153, 128, 112, 242, 170, 219, 119, 82, 249, 220, 35, 146, 159, 85, 250, 239, 102, 103, 103, 63, 116, 139, 210, 87, 216, 118, 62, 97, 18, 204, 251, 254, 254, 194, 235, 238, 22, 75, 55, 4, 91, 52, 158, 203, 185, 76, 55, 236, 216, 77, 199, 126, 247, 61, 109, 63, 40, 145, 146, 158, 1, 197, 196, 201, 227, 0, 233, 17, 48, 227, 237, 240, 1, 238, 208, 196, 194, 192, 132, 107, 143, 62, 198, 251, 221, 127, 169, 72, 9, 249, 180, 255, 16, 21, 113, 15, 216, 66, 220, 131, 232, 240, 148, 239, 232, 169, 139, 89, 242, 196, 7, 1, 18, 109, 132, 239, 154, 246, 87, 178, 207, 128, 144, 165, 40, 220, 6, 40, 92, 107, 183, 177, 112, 22, 176, 225, 43, 102, 118, 77, 212, 247, 64, 136, 173, 186, 188, 109, 144, 180, 232, 97, 26, 224, 207, 86, 104, 145, 85, 38, 164, 143, 248, 195, 118, 51, 51, 51, 27, 149, 19, 80, 13, 9, 52, 19, 128, 58, 156, 214, 32, 57, 216, 22, 155, 208, 26, 234, 184, 189, 215, 114, 123, 188, 151, 11, 188, 151, 146, 158, 238, 0, 99, 230, 194, 133, 11, 15, 130, 240, 188, 213, 74, 175, 237, 134, 131, 7, 31, 230, 253, 20, 255, 11, 233, 110, 76, 220, 152, 244, 130, 60, 93, 38, 131, 153, 12, 99, 50, 138, 201, 20, 88, 192, 241, 130, 246, 224, 71, 60, 205, 11, 177, 148, 15, 126, 125, 153, 212, 160, 24, 10, 135, 207, 95, 179, 142, 246, 159, 50, 157, 54, 143, 136, 133, 82, 145, 55, 136, 147, 231, 126, 226, 22, 48, 251, 249, 224, 136, 32, 191, 196, 209, 255, 49, 230, 62, 145, 10, 138, 35, 49, 214, 51, 255, 101, 91, 165, 41, 118, 100, 59, 226, 29, 178, 10, 106, 136, 66, 177, 245, 115, 151, 46, 203, 99, 232, 251, 155, 55, 111, 190, 32, 172, 236, 76, 13, 94, 155, 6, 46, 85, 186, 30, 247, 82, 160, 183, 158, 176, 240, 217, 107, 5, 146, 212, 9, 229, 18, 95, 133, 237, 66, 111, 213, 58, 124, 190, 113, 220, 214, 226, 125, 1, 243, 7, 20, 11, 16, 138, 7, 56, 84, 162, 245, 61, 173, 209, 208, 183, 121, 255, 68, 232, 134, 241, 37, 239, 44, 179, 147, 71, 148, 231, 153, 106, 22, 174, 231, 36, 88, 80, 124, 139, 230, 92, 187, 78, 143, 157, 61, 79, 255, 56, 112, 136, 166, 110, 252, 157, 78, 88, 176, 132, 6, 141, 157, 76, 255, 211, 119, 32, 104, 137, 69, 164, 147, 234, 4, 113, 246, 90, 75, 188, 130, 199, 126, 24, 17, 235, 214, 119, 252, 212, 215, 140, 104, 28, 229, 100, 143, 254, 197, 134, 1, 168, 254, 34, 174, 200, 161, 6, 41, 35, 203, 213, 108, 245, 68, 199, 207, 91, 68, 111, 220, 148, 172, 15, 80, 105, 61, 88, 212, 64, 241, 204, 221, 183, 38, 44, 123, 254, 248, 36, 184, 89, 172, 96, 110, 149, 127, 187, 69, 156, 8, 241, 76, 55, 248, 113, 102, 163, 40, 207, 102, 50, 47, 251, 242, 229, 203, 207, 65, 239, 88, 158, 47, 57, 138, 183, 113, 219, 195, 199, 104, 137, 168, 245, 65, 36, 41, 4, 205, 236, 56, 120, 152, 254, 188, 101, 59, 157, 179, 114, 13, 29, 199, 230, 170, 129, 95, 207, 148, 130, 104, 122, 36, 140, 150, 2, 225, 218, 198, 38, 208, 22, 209, 131, 105, 19, 104, 68, 236, 23, 166, 39, 61, 3, 139, 72, 23, 175, 108, 210, 81, 117, 152, 116, 116, 223, 64, 92, 124, 191, 37, 62, 33, 131, 160, 202, 205, 128, 9, 83, 155, 165, 243, 42, 84, 119, 207, 145, 97, 14, 224, 91, 172, 138, 239, 27, 81, 143, 180, 75, 238, 183, 172, 24, 196, 189, 212, 227, 219, 19, 85, 208, 78, 226, 223, 135, 174, 220, 188, 69, 30, 163, 11, 132, 155, 192, 225, 62, 186, 89, 237, 27, 176, 216, 26, 33, 201, 183, 4, 130, 211, 89, 193, 212, 58, 84, 54, 203, 215, 128, 95, 170, 161, 94, 59, 187, 251, 228, 254, 178, 53, 53, 230, 68, 128, 41, 85, 163, 209, 52, 99, 223, 113, 229, 17, 163, 75, 184, 69, 35, 71, 30, 143, 160, 253, 229, 21, 20, 210, 35, 167, 207, 210, 141, 187, 246, 208, 217, 140, 4, 135, 78, 159, 77, 123, 38, 141, 161, 77, 194, 25, 225, 121, 4, 151, 16, 23, 239, 28, 210, 217, 35, 131, 105, 127, 105, 196, 201, 115, 41, 123, 157, 76, 122, 248, 141, 96, 115, 86, 127, 226, 27, 26, 76, 124, 195, 124, 158, 12, 140, 244, 104, 18, 18, 213, 227, 127, 125, 99, 62, 235, 26, 151, 240, 65, 248, 196, 137, 175, 39, 167, 166, 62, 83, 201, 220, 5, 46, 16, 71, 152, 15, 49, 69, 3, 97, 208, 71, 38, 105, 150, 130, 137, 196, 105, 112, 98, 95, 226, 226, 115, 61, 96, 244, 68, 90, 84, 34, 45, 232, 54, 11, 55, 200, 3, 117, 253, 6, 198, 139, 122, 231, 121, 16, 72, 210, 69, 32, 58, 125, 53, 72, 82, 126, 124, 199, 218, 36, 137, 215, 175, 78, 47, 58, 229, 124, 66, 163, 68, 126, 225, 194, 5, 176, 86, 188, 207, 36, 144, 155, 73, 55, 112, 19, 105, 177, 60, 128, 174, 23, 221, 148, 200, 112, 221, 31, 59, 233, 180, 165, 203, 105, 196, 164, 175, 105, 203, 254, 241, 148, 120, 5, 107, 24, 241, 101, 19, 39, 143, 116, 210, 213, 251, 39, 210, 51, 104, 34, 211, 6, 195, 223, 10, 139, 233, 216, 51, 62, 169, 57, 148, 113, 179, 66, 177, 1, 91, 217, 159, 40, 103, 3, 96, 25, 56, 132, 217, 154, 165, 24, 136, 34, 149, 79, 10, 236, 147, 70, 252, 194, 101, 95, 229, 42, 225, 166, 113, 172, 229, 202, 24, 38, 1, 254, 177, 146, 18, 157, 139, 86, 167, 243, 103, 43, 88, 111, 141, 78, 231, 195, 30, 185, 232, 12, 136, 198, 200, 115, 67, 191, 211, 24, 121, 52, 182, 77, 77, 21, 254, 79, 103, 198, 62, 8, 219, 135, 227, 211, 233, 188, 217, 115, 95, 56, 222, 2, 74, 159, 18, 9, 71, 32, 201, 65, 86, 244, 71, 238, 183, 54, 177, 201, 218, 72, 161, 70, 243, 22, 187, 118, 1, 229, 199, 100, 224, 120, 13, 94, 75, 67, 215, 197, 216, 181, 209, 153, 113, 206, 45, 253, 142, 198, 204, 49, 97, 244, 250, 122, 179, 99, 14, 44, 214, 106, 91, 214, 246, 98, 65, 32, 197, 70, 166, 22, 64, 57, 229, 249, 132, 80, 171, 52, 156, 215, 141, 222, 198, 77, 165, 101, 178, 153, 244, 226, 213, 92, 186, 227, 224, 223, 116, 254, 154, 95, 233, 224, 105, 41, 229, 17, 163, 222, 33, 58, 226, 204, 200, 176, 147, 106, 23, 233, 230, 179, 136, 189, 30, 254, 127, 17, 253, 61, 189, 134, 140, 250, 223, 93, 125, 19, 141, 107, 126, 118, 21, 57, 226, 162, 200, 239, 139, 62, 68, 89, 202, 207, 41, 46, 194, 16, 213, 135, 83, 116, 114, 69, 250, 200, 135, 145, 177, 179, 137, 103, 111, 122, 250, 98, 54, 140, 251, 61, 90, 173, 246, 93, 81, 67, 169, 75, 189, 44, 133, 170, 54, 175, 54, 240, 18, 95, 62, 10, 114, 148, 207, 203, 60, 69, 250, 70, 117, 186, 126, 140, 168, 1, 45, 82, 222, 223, 197, 13, 248, 218, 237, 85, 142, 231, 26, 38, 67, 209, 116, 106, 212, 135, 8, 193, 52, 156, 16, 251, 240, 38, 193, 127, 136, 249, 132, 183, 180, 165, 244, 116, 246, 37, 186, 121, 119, 58, 157, 182, 108, 57, 237, 253, 197, 20, 250, 122, 159, 24, 136, 22, 133, 224, 152, 99, 164, 179, 199, 106, 210, 51, 96, 124, 211, 208, 126, 254, 62, 9, 99, 62, 152, 185, 112, 197, 179, 38, 119, 174, 109, 121, 190, 33, 148, 226, 148, 162, 72, 235, 93, 131, 97, 196, 125, 15, 149, 80, 39, 246, 163, 126, 131, 191, 127, 46, 98, 48, 61, 156, 121, 74, 14, 218, 248, 142, 173, 124, 155, 43, 110, 184, 90, 239, 101, 41, 147, 245, 212, 121, 243, 30, 79, 63, 148, 49, 48, 227, 120, 230, 136, 67, 199, 142, 37, 50, 73, 106, 0, 146, 120, 232, 232, 241, 225, 135, 142, 28, 75, 60, 114, 228, 200, 63, 196, 73, 80, 56, 63, 187, 249, 156, 166, 177, 194, 100, 254, 182, 124, 221, 173, 125, 253, 210, 246, 236, 233, 124, 232, 216, 137, 209, 135, 79, 156, 72, 104, 8, 215, 238, 239, 99, 39, 18, 15, 31, 63, 62, 236, 224, 209, 227, 99, 217, 49, 59, 11, 231, 194, 198, 202, 132, 104, 103, 78, 238, 225, 177, 99, 199, 30, 101, 159, 181, 224, 249, 132, 223, 240, 60, 234, 44, 217, 68, 127, 83, 163, 165, 39, 47, 100, 209, 245, 59, 118, 211, 47, 23, 45, 165, 62, 163, 38, 208, 39, 67, 162, 40, 233, 238, 123, 77, 106, 28, 223, 213, 123, 17, 241, 232, 21, 247, 78, 248, 192, 46, 49, 227, 167, 52, 173, 196, 69, 99, 7, 100, 40, 229, 25, 170, 121, 83, 122, 36, 67, 196, 253, 2, 177, 122, 79, 155, 126, 113, 211, 137, 42, 152, 78, 91, 250, 19, 45, 40, 143, 126, 213, 240, 226, 233, 93, 84, 119, 23, 94, 119, 168, 204, 119, 81, 19, 144, 203, 142, 65, 117, 22, 18, 58, 0, 186, 124, 151, 17, 223, 48, 74, 124, 67, 105, 249, 163, 44, 202, 215, 166, 36, 84, 248, 126, 168, 129, 247, 204, 249, 93, 101, 223, 11, 179, 112, 127, 194, 12, 236, 15, 123, 244, 238, 173, 39, 193, 253, 232, 11, 33, 145, 35, 229, 213, 184, 96, 114, 125, 142, 23, 34, 175, 78, 100, 171, 172, 69, 238, 176, 182, 73, 80, 46, 222, 239, 50, 120, 216, 187, 255, 236, 29, 93, 126, 60, 62, 161, 22, 156, 167, 234, 156, 199, 154, 248, 190, 185, 219, 168, 184, 118, 101, 36, 160, 47, 37, 1, 125, 46, 116, 138, 81, 63, 89, 190, 82, 85, 217, 85, 147, 20, 43, 245, 35, 206, 155, 55, 15, 250, 96, 66, 80, 141, 7, 175, 77, 10, 69, 229, 207, 201, 99, 164, 164, 148, 105, 136, 89, 217, 116, 227, 206, 61, 116, 202, 226, 101, 82, 121, 67, 251, 94, 17, 148, 116, 243, 205, 37, 78, 158, 123, 73, 15, 191, 249, 108, 255, 7, 124, 16, 53, 168, 125, 204, 152, 41, 255, 172, 100, 233, 109, 71, 4, 95, 32, 143, 28, 69, 66, 68, 220, 231, 26, 165, 112, 163, 122, 13, 27, 233, 76, 84, 65, 127, 65, 197, 30, 8, 193, 190, 154, 95, 145, 155, 123, 148, 87, 114, 121, 159, 220, 157, 35, 229, 96, 170, 78, 162, 53, 33, 59, 224, 59, 196, 12, 253, 216, 105, 80, 194, 36, 151, 184, 225, 163, 156, 227, 18, 199, 56, 15, 98, 18, 87, 207, 133, 29, 35, 28, 111, 215, 65, 137, 19, 157, 99, 135, 180, 224, 167, 196, 86, 158, 28, 161, 72, 132, 16, 112, 83, 213, 122, 116, 178, 6, 26, 45, 154, 71, 173, 121, 237, 90, 66, 169, 195, 216, 161, 113, 93, 7, 39, 141, 103, 50, 186, 222, 95, 55, 89, 6, 39, 141, 236, 26, 55, 124, 98, 151, 65, 137, 225, 21, 228, 104, 193, 34, 196, 0, 41, 26, 250, 173, 205, 245, 235, 183, 94, 102, 159, 57, 241, 164, 251, 229, 188, 226, 76, 137, 236, 108, 190, 120, 37, 151, 110, 221, 247, 151, 212, 230, 169, 215, 184, 47, 233, 83, 33, 108, 193, 210, 205, 135, 105, 136, 30, 251, 152, 166, 184, 144, 17, 249, 192, 207, 7, 14, 235, 16, 55, 109, 218, 11, 38, 38, 13, 187, 10, 255, 32, 250, 3, 17, 13, 2, 188, 178, 142, 252, 178, 75, 108, 130, 63, 187, 97, 118, 49, 77, 141, 14, 155, 57, 87, 106, 17, 163, 191, 61, 1, 167, 243, 166, 163, 109, 12, 104, 152, 182, 156, 52, 237, 148, 166, 64, 43, 50, 37, 70, 170, 9, 164, 35, 248, 249, 250, 85, 211, 212, 42, 107, 159, 208, 1, 225, 37, 249, 122, 90, 123, 156, 225, 149, 187, 77, 104, 149, 16, 162, 173, 80, 176, 219, 160, 150, 120, 177, 160, 224, 41, 190, 56, 138, 226, 254, 232, 116, 158, 255, 44, 225, 234, 141, 2, 186, 39, 227, 168, 20, 84, 211, 111, 234, 116, 250, 223, 200, 65, 220, 135, 232, 254, 55, 233, 226, 181, 148, 105, 242, 241, 159, 197, 14, 235, 52, 230, 155, 57, 47, 27, 187, 87, 165, 124, 66, 217, 76, 138, 247, 30, 162, 161, 67, 89, 15, 214, 43, 81, 221, 150, 184, 7, 205, 39, 93, 189, 175, 64, 15, 53, 232, 6, 1, 205, 70, 133, 220, 2, 208, 48, 103, 49, 81, 201, 21, 124, 12, 220, 236, 118, 230, 228, 90, 89, 106, 38, 6, 130, 110, 104, 2, 147, 21, 92, 35, 113, 65, 35, 144, 228, 146, 106, 146, 164, 28, 236, 243, 131, 112, 237, 106, 100, 145, 211, 16, 175, 93, 69, 191, 88, 149, 74, 92, 88, 154, 157, 143, 8, 17, 221, 16, 39, 192, 19, 243, 191, 226, 253, 74, 43, 34, 77, 161, 250, 12, 220, 155, 203, 55, 111, 161, 73, 223, 126, 71, 59, 64, 148, 169, 103, 176, 134, 116, 241, 60, 197, 100, 13, 233, 25, 56, 242, 205, 240, 152, 238, 49, 83, 36, 31, 162, 163, 49, 115, 105, 83, 54, 190, 42, 198, 24, 46, 106, 16, 8, 195, 230, 87, 101, 155, 162, 201, 75, 150, 60, 221, 188, 207, 128, 32, 226, 234, 191, 134, 184, 120, 231, 189, 223, 63, 94, 106, 62, 186, 151, 173, 82, 111, 150, 84, 204, 201, 121, 188, 54, 236, 8, 38, 237, 242, 243, 243, 159, 48, 178, 74, 150, 203, 87, 57, 96, 21, 23, 107, 41, 104, 210, 66, 228, 68, 53, 138, 8, 232, 5, 19, 173, 147, 124, 157, 240, 204, 214, 200, 181, 178, 21, 239, 1, 99, 223, 43, 46, 46, 126, 17, 58, 248, 240, 228, 252, 21, 220, 108, 122, 75, 90, 5, 233, 244, 244, 76, 118, 142, 228, 71, 252, 114, 209, 50, 170, 26, 62, 142, 18, 255, 112, 104, 4, 156, 205, 8, 113, 43, 113, 15, 72, 126, 54, 36, 210, 191, 123, 124, 210, 127, 33, 209, 223, 168, 38, 43, 228, 19, 162, 255, 16, 129, 168, 138, 105, 236, 118, 241, 226, 10, 36, 76, 153, 249, 207, 247, 35, 6, 6, 17, 183, 128, 165, 196, 201, 227, 2, 233, 21, 73, 99, 190, 154, 73, 87, 109, 217, 78, 207, 229, 92, 17, 39, 222, 44, 94, 133, 31, 110, 242, 14, 144, 115, 101, 100, 210, 176, 71, 210, 172, 58, 57, 242, 199, 55, 171, 25, 201, 42, 155, 90, 255, 18, 2, 129, 176, 92, 151, 245, 73, 209, 222, 136, 150, 248, 36, 213, 106, 63, 228, 233, 23, 179, 121, 181, 154, 219, 102, 211, 252, 2, 186, 251, 239, 35, 244, 187, 85, 191, 208, 190, 147, 146, 233, 43, 80, 161, 6, 122, 158, 66, 164, 105, 119, 191, 5, 141, 131, 34, 250, 119, 137, 77, 248, 4, 146, 241, 141, 105, 239, 70, 124, 136, 8, 4, 194, 90, 132, 201, 77, 69, 119, 76, 156, 139, 215, 174, 125, 162, 203, 224, 196, 206, 196, 51, 120, 162, 148, 56, 220, 221, 239, 102, 155, 129, 9, 82, 205, 197, 205, 123, 246, 209, 75, 121, 215, 196, 137, 248, 18, 239, 229, 6, 17, 118, 61, 75, 74, 74, 154, 24, 153, 84, 108, 148, 97, 236, 88, 165, 197, 232, 4, 236, 200, 31, 67, 171, 25, 213, 42, 107, 159, 253, 249, 246, 26, 225, 217, 181, 248, 90, 216, 24, 112, 47, 220, 61, 110, 153, 214, 166, 209, 104, 222, 16, 250, 27, 110, 98, 114, 94, 214, 228, 33, 253, 226, 232, 217, 243, 244, 231, 180, 109, 116, 196, 172, 121, 180, 253, 160, 36, 74, 60, 122, 105, 73, 103, 143, 147, 108, 81, 186, 138, 120, 4, 143, 248, 52, 58, 222, 37, 113, 218, 236, 87, 141, 5, 239, 72, 249, 135, 183, 235, 146, 226, 189, 131, 64, 220, 75, 8, 189, 44, 239, 210, 52, 98, 166, 76, 111, 250, 98, 239, 40, 63, 70, 150, 179, 137, 147, 231, 33, 210, 51, 176, 4, 42, 112, 64, 239, 54, 200, 185, 130, 94, 110, 186, 219, 113, 151, 5, 76, 14, 48, 89, 8, 147, 51, 4, 32, 20, 20, 20, 60, 85, 201, 138, 220, 170, 61, 232, 234, 193, 196, 44, 251, 35, 127, 168, 6, 73, 202, 46, 102, 40, 187, 244, 56, 106, 145, 102, 19, 162, 157, 57, 245, 88, 139, 138, 138, 32, 53, 167, 3, 147, 56, 38, 169, 76, 142, 240, 224, 40, 90, 202, 238, 133, 243, 151, 175, 208, 223, 247, 238, 167, 95, 255, 240, 147, 148, 143, 72, 2, 251, 130, 217, 244, 50, 233, 236, 185, 141, 184, 250, 127, 253, 120, 80, 164, 127, 128, 122, 236, 219, 7, 15, 30, 124, 216, 240, 63, 148, 251, 17, 43, 114, 16, 145, 20, 17, 136, 186, 163, 93, 194, 77, 89, 238, 191, 188, 59, 223, 11, 72, 205, 51, 113, 116, 179, 231, 67, 34, 3, 161, 119, 27, 35, 205, 125, 164, 135, 127, 1, 68, 216, 13, 74, 254, 150, 46, 221, 240, 27, 61, 148, 121, 74, 238, 72, 34, 3, 10, 34, 111, 103, 50, 157, 73, 111, 38, 45, 161, 18, 136, 153, 166, 44, 199, 134, 68, 156, 130, 169, 21, 250, 244, 157, 85, 16, 94, 85, 114, 35, 199, 138, 218, 41, 194, 228, 56, 51, 232, 22, 200, 204, 204, 108, 204, 62, 123, 151, 39, 233, 207, 228, 173, 159, 174, 86, 56, 237, 11, 10, 105, 250, 145, 227, 116, 225, 218, 245, 180, 255, 212, 233, 244, 45, 232, 111, 232, 234, 95, 32, 45, 40, 187, 251, 46, 38, 254, 97, 49, 159, 244, 143, 55, 110, 54, 149, 86, 169, 232, 71, 68, 32, 238, 71, 216, 84, 248, 58, 100, 223, 135, 1, 132, 141, 158, 216, 164, 101, 68, 172, 187, 100, 158, 117, 242, 216, 76, 186, 120, 94, 132, 100, 107, 183, 164, 177, 116, 210, 247, 75, 165, 142, 225, 167, 178, 178, 105, 73, 169, 78, 105, 166, 221, 206, 107, 71, 246, 133, 70, 172, 121, 121, 121, 208, 61, 220, 214, 196, 42, 95, 12, 14, 170, 151, 196, 41, 155, 68, 121, 99, 90, 101, 113, 114, 75, 181, 72, 232, 27, 249, 188, 76, 8, 72, 138, 149, 7, 215, 128, 53, 133, 155, 77, 221, 121, 14, 241, 122, 158, 164, 175, 151, 203, 184, 101, 158, 191, 72, 215, 110, 223, 65, 199, 204, 253, 158, 58, 13, 81, 83, 226, 25, 82, 202, 52, 196, 179, 164, 139, 215, 58, 226, 21, 50, 238, 195, 232, 88, 183, 136, 242, 138, 53, 182, 6, 239, 41, 177, 94, 41, 250, 17, 17, 136, 250, 7, 88, 233, 202, 181, 25, 13, 125, 190, 96, 197, 138, 167, 60, 134, 142, 250, 200, 54, 176, 111, 36, 113, 241, 249, 142, 116, 116, 223, 203, 30, 175, 65, 130, 115, 192, 152, 73, 244, 171, 37, 63, 74, 17, 124, 64, 156, 48, 233, 8, 200, 101, 178, 143, 215, 0, 133, 192, 32, 87, 8, 143, 207, 200, 200, 120, 164, 146, 137, 79, 52, 213, 218, 10, 254, 206, 251, 110, 242, 145, 39, 111, 62, 65, 87, 213, 212, 42, 167, 125, 124, 193, 183, 101, 223, 144, 198, 167, 217, 126, 68, 134, 188, 219, 209, 166, 67, 184, 217, 52, 3, 92, 136, 242, 74, 35, 235, 106, 30, 221, 182, 255, 47, 58, 227, 199, 149, 52, 104, 220, 151, 244, 209, 224, 40, 48, 155, 230, 146, 142, 170, 157, 76, 75, 156, 249, 66, 72, 100, 111, 223, 164, 81, 239, 167, 110, 218, 244, 152, 65, 5, 145, 167, 53, 97, 234, 5, 2, 209, 112, 151, 231, 54, 64, 150, 146, 63, 211, 8, 105, 2, 212, 179, 103, 191, 216, 170, 95, 92, 7, 182, 210, 142, 33, 93, 125, 22, 242, 74, 32, 121, 141, 217, 164, 227, 165, 30, 47, 117, 30, 95, 189, 229, 15, 250, 247, 169, 51, 82, 75, 30, 1, 96, 183, 61, 205, 131, 131, 166, 243, 142, 231, 159, 221, 186, 117, 235, 85, 200, 49, 51, 67, 115, 176, 51, 224, 243, 180, 173, 139, 90, 168, 232, 3, 227, 9, 228, 85, 233, 252, 33, 147, 42, 68, 81, 62, 87, 159, 181, 72, 35, 253, 17, 141, 250, 17, 111, 220, 184, 1, 237, 160, 90, 243, 36, 253, 239, 120, 163, 224, 92, 209, 108, 186, 239, 232, 113, 250, 253, 47, 27, 232, 128, 175, 102, 208, 255, 69, 13, 166, 164, 103, 64, 17, 211, 18, 255, 38, 93, 189, 150, 18, 207, 224, 193, 31, 179, 49, 60, 97, 238, 220, 23, 140, 90, 94, 132, 254, 134, 216, 202, 9, 129, 64, 220, 77, 134, 108, 98, 168, 240, 105, 182, 149, 2, 14, 140, 78, 20, 113, 19, 166, 189, 208, 50, 34, 174, 29, 241, 15, 235, 71, 92, 253, 102, 147, 46, 158, 127, 144, 174, 222, 89, 196, 187, 183, 14, 2, 131, 160, 69, 207, 188, 213, 235, 232, 246, 253, 7, 165, 182, 95, 10, 173, 179, 128, 231, 152, 129, 57, 108, 26, 147, 72, 38, 29, 75, 74, 74, 94, 79, 75, 51, 174, 121, 10, 147, 171, 92, 10, 76, 246, 71, 217, 215, 54, 121, 10, 90, 100, 11, 3, 17, 170, 230, 246, 140, 148, 19, 92, 19, 234, 155, 22, 105, 160, 132, 155, 209, 99, 59, 117, 237, 218, 99, 252, 60, 246, 226, 197, 190, 183, 137, 221, 47, 10, 111, 149, 208, 163, 103, 206, 73, 209, 166, 35, 103, 207, 167, 29, 227, 134, 67, 205, 96, 45, 233, 226, 117, 134, 56, 123, 255, 10, 102, 211, 215, 195, 7, 184, 249, 169, 199, 55, 53, 65, 188, 182, 4, 251, 27, 34, 16, 136, 106, 226, 182, 95, 83, 172, 13, 105, 4, 83, 230, 164, 62, 217, 35, 78, 253, 65, 179, 240, 254, 1, 196, 163, 215, 4, 70, 156, 171, 73, 39, 85, 6, 211, 58, 243, 65, 235, 116, 31, 62, 150, 142, 154, 179, 128, 46, 219, 176, 153, 238, 249, 251, 8, 205, 186, 154, 75, 75, 116, 119, 240, 8, 168, 161, 208, 246, 36, 141, 201, 28, 38, 67, 161, 114, 16, 147, 247, 174, 94, 189, 10, 93, 54, 236, 205, 208, 62, 29, 20, 228, 121, 79, 252, 159, 66, 208, 142, 186, 138, 85, 118, 228, 85, 196, 25, 38, 15, 221, 239, 36, 105, 110, 130, 254, 153, 51, 103, 30, 231, 132, 24, 192, 100, 42, 183, 58, 156, 151, 253, 136, 224, 11, 63, 157, 117, 169, 34, 73, 223, 99, 196, 248, 242, 36, 125, 103, 175, 28, 226, 228, 241, 7, 233, 25, 56, 163, 105, 239, 254, 33, 170, 164, 81, 45, 230, 174, 90, 245, 168, 193, 63, 49, 84, 215, 20, 131, 107, 16, 8, 68, 13, 171, 157, 182, 178, 207, 166, 133, 9, 83, 45, 144, 213, 144, 169, 51, 94, 235, 20, 51, 228, 51, 18, 16, 30, 65, 186, 249, 77, 35, 29, 221, 55, 144, 206, 30, 199, 137, 171, 127, 225, 179, 189, 251, 81, 213, 136, 113, 84, 205, 52, 130, 197, 191, 110, 164, 127, 254, 117, 152, 158, 189, 148, 67, 139, 74, 52, 202, 156, 193, 203, 60, 177, 126, 13, 147, 100, 38, 3, 152, 116, 211, 106, 181, 239, 20, 20, 20, 60, 93, 217, 164, 167, 200, 245, 52, 232, 7, 173, 42, 153, 10, 201, 254, 176, 173, 67, 85, 36, 73, 121, 181, 224, 207, 183, 85, 231, 243, 34, 21, 189, 17, 43, 76, 227, 198, 190, 127, 46, 63, 255, 9, 118, 189, 62, 224, 145, 166, 80, 198, 237, 55, 177, 251, 133, 86, 175, 167, 231, 115, 174, 208, 45, 233, 7, 232, 244, 212, 21, 82, 177, 239, 103, 216, 248, 32, 221, 124, 175, 147, 142, 170, 116, 226, 226, 51, 143, 248, 247, 233, 231, 58, 56, 233, 211, 137, 243, 230, 61, 111, 108, 92, 222, 209, 15, 17, 129, 64, 32, 234, 138, 214, 41, 147, 166, 224, 227, 52, 74, 58, 233, 233, 233, 15, 69, 79, 76, 110, 210, 42, 50, 174, 3, 241, 13, 237, 67, 186, 249, 124, 197, 136, 243, 23, 38, 76, 243, 244, 187, 70, 2, 250, 148, 125, 62, 56, 73, 10, 203, 255, 102, 217, 10, 250, 203, 246, 29, 244, 224, 137, 147, 82, 49, 4, 69, 164, 45, 4, 186, 100, 115, 2, 93, 203, 35, 110, 7, 243, 8, 199, 247, 139, 41, 125, 49, 45, 45, 237, 1, 11, 38, 125, 59, 3, 190, 80, 123, 225, 253, 187, 204, 186, 66, 131, 229, 79, 13, 148, 148, 179, 36, 229, 227, 119, 129, 108, 235, 74, 83, 109, 27, 35, 254, 97, 147, 230, 73, 158, 139, 248, 49, 143, 126, 158, 201, 235, 154, 94, 144, 9, 17, 202, 184, 65, 142, 46, 16, 34, 4, 214, 132, 126, 49, 149, 54, 13, 151, 26, 6, 223, 96, 99, 224, 16, 113, 246, 254, 1, 252, 136, 31, 69, 198, 126, 158, 48, 125, 250, 75, 70, 207, 7, 211, 16, 229, 190, 136, 72, 138, 8, 4, 226, 62, 83, 54, 213, 182, 170, 212, 84, 59, 57, 135, 140, 251, 57, 237, 42, 153, 148, 237, 99, 166, 76, 249, 231, 167, 3, 6, 181, 122, 162, 87, 95, 63, 226, 217, 107, 36, 113, 241, 93, 66, 156, 60, 118, 16, 103, 175, 115, 196, 61, 176, 232, 31, 189, 163, 105, 143, 132, 209, 116, 200, 244, 89, 116, 214, 138, 213, 82, 81, 4, 32, 208, 236, 220, 60, 90, 172, 213, 42, 181, 51, 8, 130, 201, 228, 41, 43, 144, 224, 255, 5, 159, 184, 93, 192, 204, 87, 92, 92, 252, 210, 134, 13, 27, 30, 182, 144, 52, 236, 132, 118, 100, 32, 15, 243, 207, 230, 86, 65, 139, 20, 201, 180, 185, 124, 14, 106, 137, 16, 109, 13, 249, 123, 77, 253, 102, 195, 193, 131, 15, 151, 148, 148, 252, 135, 159, 79, 136, 50, 93, 196, 75, 184, 85, 228, 34, 194, 53, 1, 147, 233, 230, 221, 233, 116, 218, 178, 229, 52, 152, 105, 136, 175, 132, 245, 167, 196, 53, 32, 159, 56, 121, 30, 102, 11, 164, 84, 226, 211, 123, 24, 52, 12, 142, 28, 51, 249, 101, 19, 11, 4, 91, 57, 39, 17, 253, 136, 8, 4, 162, 222, 106, 156, 82, 56, 189, 210, 215, 9, 82, 201, 164, 151, 188, 104, 93, 227, 224, 209, 19, 254, 211, 62, 102, 72, 199, 167, 123, 69, 132, 19, 85, 208, 68, 210, 213, 235, 71, 210, 81, 181, 155, 145, 232, 57, 226, 22, 80, 232, 216, 43, 82, 202, 127, 139, 249, 106, 134, 212, 33, 101, 197, 239, 91, 233, 206, 67, 127, 211, 83, 23, 179, 233, 245, 194, 34, 101, 36, 141, 76, 162, 39, 153, 252, 201, 228, 39, 30, 72, 20, 15, 102, 79, 136, 196, 213, 104, 52, 255, 189, 122, 245, 234, 11, 149, 17, 41, 84, 198, 225, 185, 141, 150, 230, 70, 202, 132, 58, 156, 111, 167, 198, 138, 152, 27, 104, 247, 36, 146, 161, 201, 197, 75, 202, 154, 53, 15, 229, 231, 231, 55, 129, 115, 194, 3, 173, 166, 241, 242, 109, 167, 120, 20, 179, 4, 40, 68, 1, 65, 53, 144, 139, 56, 113, 225, 15, 82, 195, 224, 70, 193, 145, 96, 50, 189, 70, 58, 169, 14, 48, 66, 252, 129, 248, 135, 14, 253, 120, 64, 188, 115, 212, 164, 105, 175, 26, 213, 72, 209, 143, 136, 64, 32, 16, 70, 85, 80, 201, 223, 41, 213, 187, 188, 93, 218, 203, 36, 86, 166, 165, 61, 222, 127, 194, 87, 255, 113, 26, 148, 216, 254, 153, 94, 81, 189, 136, 42, 112, 36, 233, 226, 185, 128, 116, 116, 223, 204, 72, 244, 8, 113, 241, 185, 66, 188, 67, 180, 80, 81, 197, 83, 61, 158, 198, 51, 45, 244, 155, 212, 21, 18, 137, 238, 56, 248, 55, 205, 188, 112, 145, 230, 222, 40, 80, 154, 114, 41, 239, 242, 112, 133, 119, 244, 128, 106, 45, 171, 121, 43, 178, 81, 76, 34, 152, 248, 48, 121, 155, 215, 191, 181, 52, 55, 82, 34, 200, 178, 178, 178, 221, 2, 145, 217, 153, 48, 249, 86, 85, 204, 14, 94, 186, 120, 241, 226, 83, 176, 48, 224, 154, 97, 12, 55, 149, 110, 228, 209, 200, 21, 29, 191, 225, 60, 93, 184, 124, 85, 58, 119, 223, 255, 178, 158, 105, 245, 179, 233, 231, 16, 101, 234, 19, 170, 39, 93, 188, 46, 177, 243, 190, 131, 157, 243, 217, 196, 47, 188, 127, 167, 65, 137, 159, 241, 254, 136, 118, 70, 174, 119, 133, 111, 27, 181, 67, 4, 2, 129, 168, 154, 26, 100, 163, 82, 165, 218, 133, 133, 165, 72, 121, 157, 77, 111, 251, 61, 109, 43, 255, 41, 109, 52, 54, 229, 251, 127, 168, 134, 169, 223, 121, 35, 180, 127, 87, 226, 21, 218, 135, 184, 250, 141, 101, 147, 249, 66, 210, 89, 181, 89, 242, 131, 186, 248, 228, 16, 207, 224, 91, 207, 133, 68, 211, 142, 113, 73, 52, 108, 194, 84, 41, 18, 119, 238, 207, 107, 233, 218, 109, 127, 74, 218, 232, 177, 179, 231, 37, 159, 40, 4, 21, 233, 43, 55, 157, 154, 85, 89, 135, 17, 164, 174, 180, 180, 244, 99, 190, 171, 53, 75, 16, 76, 43, 131, 118, 105, 236, 111, 155, 240, 156, 67, 136, 28, 142, 229, 129, 80, 171, 120, 49, 136, 44, 185, 253, 147, 100, 42, 213, 104, 165, 90, 166, 187, 15, 103, 208, 101, 27, 55, 211, 209, 115, 23, 82, 143, 17, 227, 232, 115, 189, 163, 161, 124, 219, 13, 210, 217, 243, 168, 212, 27, 209, 205, 127, 130, 157, 127, 31, 127, 151, 33, 73, 239, 39, 167, 166, 62, 99, 98, 47, 236, 96, 241, 131, 249, 136, 8, 4, 2, 113, 207, 200, 83, 101, 39, 231, 119, 74, 190, 207, 219, 181, 107, 109, 205, 219, 4, 181, 31, 154, 156, 252, 76, 247, 161, 234, 55, 91, 68, 12, 108, 247, 48, 248, 66, 189, 66, 226, 217, 196, 159, 76, 156, 189, 150, 51, 18, 221, 78, 156, 60, 143, 72, 189, 1, 221, 3, 139, 72, 64, 31, 218, 178, 95, 60, 13, 28, 51, 73, 210, 74, 211, 118, 239, 229, 124, 87, 102, 105, 202, 135, 134, 107, 103, 39, 120, 179, 236, 61, 60, 192, 229, 23, 94, 65, 102, 62, 15, 68, 154, 2, 117, 92, 193, 36, 203, 77, 193, 177, 188, 0, 125, 20, 55, 125, 70, 242, 66, 13, 3, 120, 208, 82, 18, 147, 241, 156, 252, 22, 112, 237, 119, 59, 175, 72, 147, 197, 205, 194, 101, 162, 86, 120, 249, 218, 117, 169, 24, 4, 164, 90, 204, 97, 11, 131, 161, 51, 102, 211, 238, 9, 163, 232, 3, 189, 34, 203, 131, 105, 156, 60, 143, 51, 50, 220, 68, 220, 2, 166, 19, 255, 176, 200, 247, 35, 7, 118, 8, 82, 143, 127, 165, 18, 243, 176, 237, 93, 117, 77, 177, 114, 13, 2, 129, 64, 212, 25, 220, 237, 255, 20, 125, 160, 22, 76, 218, 64, 6, 147, 83, 150, 60, 13, 62, 209, 78, 131, 135, 126, 252, 89, 204, 48, 15, 226, 21, 220, 135, 116, 247, 31, 159, 115, 245, 106, 1, 103, 73, 179, 138, 153, 131, 246, 40, 85, 142, 103, 196, 180, 116, 253, 111, 116, 199, 193, 195, 82, 181, 152, 35, 167, 207, 74, 233, 47, 144, 63, 122, 173, 160, 72, 242, 239, 65, 17, 6, 232, 76, 81, 170, 183, 172, 4, 108, 41, 35, 108, 136, 32, 133, 109, 0, 1, 158, 188, 152, 37, 253, 199, 166, 93, 123, 233, 226, 95, 55, 73, 13, 186, 33, 114, 184, 235, 208, 145, 229, 90, 161, 123, 208, 77, 226, 228, 117, 65, 42, 67, 8, 11, 3, 247, 192, 73, 207, 246, 138, 8, 239, 56, 96, 72, 251, 168, 73, 147, 94, 205, 204, 204, 52, 158, 146, 34, 215, 7, 190, 187, 166, 41, 18, 34, 2, 129, 64, 212, 11, 64, 36, 46, 215, 72, 165, 190, 127, 234, 242, 254, 127, 210, 196, 111, 98, 178, 103, 124, 212, 78, 80, 35, 245, 102, 16, 164, 228, 179, 212, 235, 245, 87, 2, 70, 142, 255, 153, 188, 219, 241, 79, 166, 161, 29, 96, 228, 116, 130, 116, 97, 36, 213, 205, 231, 170, 100, 198, 244, 12, 46, 33, 62, 97, 165, 141, 152, 38, 215, 52, 124, 0, 109, 30, 17, 75, 63, 138, 25, 74, 157, 226, 71, 80, 231, 33, 106, 234, 194, 200, 173, 123, 194, 104, 234, 154, 56, 134, 201, 104, 73, 235, 235, 58, 84, 77, 187, 12, 25, 65, 63, 29, 152, 64, 155, 247, 141, 165, 16, 5, 76, 124, 66, 117, 146, 246, 11, 173, 158, 58, 169, 50, 217, 255, 236, 102, 143, 107, 73, 87, 239, 217, 140, 24, 71, 60, 30, 20, 25, 220, 161, 255, 176, 207, 163, 199, 77, 126, 19, 234, 246, 86, 114, 146, 108, 155, 171, 84, 142, 232, 63, 68, 32, 16, 8, 196, 29, 26, 169, 92, 178, 47, 44, 37, 197, 33, 57, 57, 25, 180, 42, 7, 245, 188, 121, 15, 148, 234, 245, 199, 44, 72, 251, 168, 8, 234, 185, 85, 90, 218, 70, 32, 90, 187, 244, 236, 236, 135, 230, 164, 174, 127, 82, 61, 109, 238, 11, 209, 19, 39, 54, 241, 78, 26, 213, 188, 91, 92, 194, 123, 109, 251, 199, 183, 249, 111, 223, 152, 207, 222, 234, 211, 191, 235, 179, 65, 17, 110, 196, 63, 212, 139, 137, 63, 241, 11, 239, 69, 252, 194, 122, 19, 223, 208, 80, 73, 252, 195, 67, 136, 127, 159, 32, 18, 16, 230, 243, 88, 96, 84, 207, 102, 97, 3, 156, 63, 140, 26, 212, 182, 199, 144, 164, 22, 161, 234, 113, 255, 134, 228, 123, 227, 253, 15, 239, 130, 84, 178, 13, 252, 190, 178, 239, 16, 115, 16, 17, 8, 4, 2, 97, 22, 132, 198, 202, 125, 44, 32, 72, 189, 64, 146, 225, 226, 118, 106, 9, 229, 38, 210, 22, 229, 254, 66, 57, 247, 16, 253, 134, 8, 4, 2, 129, 168, 14, 65, 202, 213, 117, 30, 19, 18, 230, 117, 22, 228, 67, 126, 45, 19, 100, 106, 106, 106, 121, 131, 94, 217, 103, 170, 20, 217, 135, 42, 138, 236, 251, 51, 37, 202, 223, 136, 219, 4, 2, 68, 127, 33, 2, 129, 64, 32, 106, 136, 36, 29, 249, 227, 76, 11, 218, 97, 201, 4, 185, 70, 73, 182, 8, 4, 2, 129, 64, 212, 23, 130, 108, 196, 31, 63, 181, 32, 55, 82, 110, 162, 188, 79, 232, 20, 130, 254, 61, 4, 2, 129, 64, 212, 43, 130, 148, 9, 14, 42, 216, 28, 49, 83, 139, 148, 147, 242, 161, 241, 244, 19, 252, 247, 14, 120, 54, 17, 8, 4, 2, 81, 223, 72, 82, 14, 214, 153, 166, 208, 16, 43, 211, 32, 161, 197, 215, 75, 252, 183, 142, 120, 38, 17, 8, 4, 2, 81, 223, 8, 82, 246, 67, 246, 52, 179, 21, 150, 236, 131, 132, 226, 233, 175, 35, 65, 34, 16, 8, 4, 162, 190, 19, 100, 83, 161, 219, 133, 206, 12, 13, 50, 159, 201, 155, 252, 183, 141, 240, 76, 34, 16, 8, 4, 162, 190, 18, 228, 3, 76, 142, 153, 225, 135, 148, 125, 144, 121, 76, 154, 161, 6, 137, 64, 32, 16, 136, 250, 74, 144, 246, 194, 243, 205, 102, 20, 13, 144, 53, 200, 75, 208, 101, 3, 9, 18, 129, 64, 32, 16, 245, 149, 32, 237, 132, 231, 203, 44, 32, 200, 76, 38, 47, 240, 223, 161, 137, 21, 129, 64, 32, 16, 245, 142, 32, 29, 132, 231, 11, 43, 33, 72, 189, 240, 217, 46, 38, 141, 81, 131, 68, 32, 16, 8, 68, 125, 37, 200, 70, 194, 243, 165, 130, 15, 178, 204, 72, 177, 114, 185, 22, 235, 74, 202, 235, 157, 34, 65, 34, 16, 8, 4, 162, 62, 18, 228, 3, 50, 81, 50, 217, 36, 104, 144, 134, 8, 82, 12, 222, 153, 106, 72, 11, 69, 32, 16, 8, 4, 162, 62, 144, 163, 173, 80, 40, 0, 210, 60, 142, 86, 98, 98, 21, 223, 239, 35, 108, 7, 75, 205, 33, 16, 8, 4, 162, 222, 144, 163, 141, 194, 255, 232, 33, 228, 65, 150, 84, 226, 127, 132, 20, 143, 79, 249, 239, 236, 177, 88, 57, 2, 129, 64, 32, 234, 19, 65, 58, 10, 45, 175, 30, 100, 50, 203, 136, 166, 40, 154, 87, 229, 2, 2, 59, 152, 60, 47, 108, 7, 91, 78, 33, 16, 8, 4, 162, 94, 144, 163, 189, 66, 123, 236, 206, 228, 172, 80, 69, 71, 87, 137, 121, 245, 107, 145, 104, 241, 140, 34, 16, 8, 4, 66, 36, 25, 155, 251, 77, 115, 226, 251, 108, 167, 40, 14, 240, 54, 147, 85, 6, 242, 28, 141, 153, 87, 11, 153, 168, 68, 178, 197, 209, 128, 64, 32, 16, 8, 165, 22, 102, 35, 7, 186, 112, 177, 171, 139, 164, 41, 238, 163, 226, 253, 55, 152, 124, 39, 68, 172, 234, 13, 148, 153, 43, 83, 188, 183, 85, 232, 226, 225, 128, 1, 58, 8, 4, 2, 129, 80, 106, 98, 142, 38, 62, 183, 227, 105, 19, 142, 50, 145, 214, 210, 126, 218, 241, 125, 112, 52, 240, 217, 39, 76, 126, 80, 164, 115, 104, 57, 73, 138, 208, 41, 204, 171, 9, 194, 54, 208, 255, 136, 64, 32, 16, 136, 187, 53, 50, 254, 188, 25, 147, 117, 76, 82, 152, 184, 243, 116, 9, 27, 35, 191, 115, 224, 164, 226, 80, 19, 218, 166, 96, 66, 149, 255, 199, 206, 192, 119, 254, 205, 100, 32, 147, 189, 6, 138, 0, 232, 43, 241, 61, 30, 96, 242, 158, 72, 192, 56, 26, 16, 8, 4, 2, 113, 7, 209, 9, 207, 125, 152, 220, 84, 144, 10, 188, 222, 207, 100, 14, 228, 11, 50, 105, 201, 228, 9, 115, 72, 215, 128, 216, 25, 17, 67, 223, 51, 70, 204, 15, 49, 105, 197, 100, 24, 147, 52, 161, 35, 135, 232, 95, 44, 51, 226, 123, 20, 205, 171, 106, 212, 30, 17, 8, 4, 2, 97, 74, 75, 115, 20, 94, 207, 20, 8, 164, 152, 7, 185, 24, 235, 167, 152, 195, 228, 79, 78, 156, 49, 76, 156, 184, 31, 240, 49, 43, 239, 35, 16, 226, 235, 76, 186, 50, 73, 228, 65, 56, 103, 141, 164, 110, 24, 35, 71, 157, 130, 28, 183, 65, 64, 143, 72, 144, 56, 26, 16, 8, 4, 2, 33, 146, 143, 157, 96, 94, 5, 115, 229, 95, 2, 161, 148, 42, 130, 91, 74, 57, 201, 104, 43, 105, 66, 12, 223, 189, 194, 228, 48, 147, 245, 76, 230, 49, 153, 192, 100, 16, 147, 96, 158, 196, 15, 100, 215, 145, 201, 103, 76, 62, 103, 210, 153, 167, 103, 128, 6, 219, 23, 124, 131, 76, 146, 153, 44, 103, 178, 155, 73, 150, 137, 255, 44, 53, 178, 79, 101, 194, 163, 24, 205, 154, 203, 36, 76, 56, 7, 246, 104, 94, 69, 32, 16, 8, 132, 146, 32, 69, 243, 170, 159, 224, 163, 51, 166, 137, 41, 9, 168, 140, 155, 46, 117, 66, 241, 111, 29, 173, 89, 136, 255, 165, 23, 246, 195, 24, 148, 228, 57, 157, 201, 147, 130, 6, 141, 169, 29, 8, 4, 2, 129, 184, 139, 32, 29, 5, 162, 168, 172, 250, 76, 85, 160, 23, 52, 60, 141, 32, 90, 129, 76, 117, 2, 201, 234, 140, 124, 95, 99, 34, 240, 198, 20, 129, 43, 53, 225, 53, 76, 254, 167, 60, 126, 4, 2, 129, 64, 32, 68, 114, 180, 147, 77, 139, 220, 119, 120, 200, 136, 121, 245, 94, 161, 204, 12, 173, 213, 18, 98, 86, 166, 121, 236, 4, 115, 174, 168, 61, 163, 246, 136, 64, 32, 16, 8, 67, 4, 41, 246, 78, 12, 20, 72, 81, 99, 69, 162, 170, 13, 232, 185, 207, 81, 60, 134, 125, 76, 122, 10, 199, 107, 195, 9, 18, 35, 87, 17, 8, 4, 2, 97, 152, 32, 185, 38, 57, 199, 72, 159, 196, 251, 149, 28, 69, 64, 164, 173, 187, 130, 28, 237, 145, 28, 17, 8, 4, 2, 97, 136, 28, 109, 5, 243, 106, 115, 38, 127, 11, 17, 161, 186, 251, 144, 24, 203, 12, 164, 114, 0, 214, 66, 132, 172, 226, 216, 209, 239, 136, 64, 32, 16, 8, 163, 4, 41, 230, 62, 6, 11, 230, 213, 146, 251, 204, 188, 170, 23, 2, 126, 68, 92, 103, 50, 131, 201, 59, 74, 173, 25, 251, 61, 34, 16, 8, 4, 194, 24, 57, 218, 8, 230, 85, 7, 158, 167, 104, 237, 232, 213, 123, 161, 49, 106, 141, 16, 250, 30, 38, 81, 76, 158, 86, 28, 179, 3, 146, 35, 2, 129, 64, 32, 76, 17, 164, 104, 94, 133, 246, 80, 71, 238, 51, 243, 106, 41, 39, 70, 101, 202, 199, 41, 232, 237, 200, 164, 181, 226, 120, 235, 108, 103, 18, 4, 2, 129, 64, 212, 45, 130, 180, 19, 158, 135, 10, 68, 83, 82, 71, 53, 197, 50, 33, 159, 210, 80, 250, 201, 25, 94, 92, 29, 74, 221, 61, 172, 56, 86, 71, 212, 26, 17, 8, 4, 2, 97, 182, 6, 201, 31, 31, 102, 178, 64, 240, 229, 221, 172, 3, 254, 199, 50, 69, 177, 0, 99, 197, 1, 202, 120, 89, 188, 73, 76, 218, 27, 32, 70, 7, 44, 64, 142, 64, 32, 16, 8, 75, 9, 210, 134, 63, 62, 193, 147, 231, 13, 5, 190, 104, 184, 70, 169, 181, 176, 122, 77, 85, 201, 80, 254, 63, 141, 9, 51, 47, 236, 71, 38, 239, 251, 24, 6, 197, 13, 12, 145, 63, 22, 0, 64, 32, 16, 8, 132, 53, 200, 178, 17, 47, 82, 238, 198, 228, 27, 38, 233, 6, 218, 93, 137, 190, 63, 101, 233, 55, 157, 66, 235, 84, 214, 103, 53, 84, 58, 174, 196, 130, 210, 113, 151, 153, 252, 193, 35, 82, 131, 185, 207, 212, 193, 192, 113, 84, 248, 25, 81, 107, 68, 32, 16, 8, 132, 213, 180, 73, 3, 239, 55, 225, 164, 57, 142, 119, 228, 56, 87, 131, 154, 164, 76, 190, 57, 156, 160, 127, 100, 50, 150, 73, 0, 239, 61, 249, 140, 145, 125, 180, 55, 214, 72, 25, 129, 64, 32, 16, 8, 171, 17, 37, 55, 77, 54, 50, 102, 158, 100, 239, 63, 194, 164, 25, 19, 23, 38, 177, 92, 171, 91, 195, 211, 42, 32, 130, 52, 95, 40, 60, 174, 229, 154, 40, 180, 150, 58, 207, 35, 101, 129, 252, 182, 48, 249, 153, 201, 92, 38, 95, 240, 62, 146, 158, 76, 62, 225, 154, 108, 101, 141, 152, 237, 249, 62, 34, 49, 34, 16, 136, 6, 139, 255, 7, 49, 107, 77, 53, 30, 9, 206, 77, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130}} -var fynescenelight = &fyne.StaticResource{ - StaticName: "fyne_scene_light.png", - StaticContent: []byte{ - 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1, 201, 0, 0, 1, 79, 8, 6, 0, 0, 0, 38, 214, 53, 180, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 150, 101, 88, 73, 102, 77, 77, 0, 42, 0, 0, 0, 8, 0, 5, 1, 18, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 1, 26, 0, 5, 0, 0, 0, 1, 0, 0, 0, 74, 1, 27, 0, 5, 0, 0, 0, 1, 0, 0, 0, 82, 1, 49, 0, 2, 0, 0, 0, 17, 0, 0, 0, 90, 135, 105, 0, 4, 0, 0, 0, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 1, 0, 0, 0, 120, 0, 0, 0, 1, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 0, 0, 0, 3, 160, 1, 0, 3, 0, 0, 0, 1, 0, 1, 0, 0, 160, 2, 0, 4, 0, 0, 0, 1, 0, 0, 1, 201, 160, 3, 0, 4, 0, 0, 0, 1, 0, 0, 1, 79, 0, 0, 0, 0, 52, 31, 119, 147, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 18, 116, 0, 0, 18, 116, 1, 222, 102, 31, 120, 0, 0, 1, 203, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 119, 119, 119, 46, 105, 110, 107, 115, 99, 97, 112, 101, 46, 111, 114, 103, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 24, 203, 85, 88, 0, 0, 160, 86, 73, 68, 65, 84, 120, 218, 236, 125, 7, 152, 28, 89, 121, 237, 40, 108, 208, 42, 167, 201, 221, 85, 93, 85, 157, 195, 116, 79, 206, 26, 173, 178, 180, 74, 43, 141, 114, 206, 57, 172, 36, 150, 93, 130, 215, 126, 126, 14, 96, 63, 12, 216, 60, 112, 224, 225, 128, 177, 1, 155, 140, 201, 24, 131, 31, 54, 193, 192, 51, 209, 54, 94, 88, 50, 44, 11, 108, 82, 231, 122, 255, 185, 93, 213, 83, 211, 234, 153, 233, 158, 169, 25, 105, 90, 255, 249, 190, 187, 163, 149, 122, 170, 171, 110, 85, 221, 115, 255, 116, 254, 170, 42, 6, 131, 193, 184, 125, 152, 209, 210, 210, 114, 143, 166, 105, 247, 5, 131, 193, 123, 233, 255, 103, 142, 246, 217, 198, 198, 198, 37, 138, 162, 184, 85, 85, 237, 113, 185, 92, 59, 233, 207, 231, 104, 252, 186, 44, 203, 111, 160, 159, 111, 163, 191, 251, 16, 253, 252, 103, 250, 249, 37, 26, 223, 162, 241, 20, 141, 159, 211, 120, 129, 70, 130, 70, 154, 70, 198, 248, 243, 243, 52, 126, 70, 227, 59, 244, 59, 95, 163, 159, 95, 160, 241, 73, 26, 239, 161, 241, 22, 26, 191, 79, 227, 113, 26, 199, 105, 108, 166, 239, 232, 196, 119, 211, 88, 72, 231, 50, 11, 231, 204, 183, 143, 193, 96, 48, 24, 118, 99, 38, 8, 209, 32, 197, 91, 128, 191, 151, 36, 201, 69, 100, 180, 138, 198, 89, 131, 172, 222, 107, 16, 223, 143, 105, 164, 232, 239, 117, 34, 74, 157, 136, 42, 63, 240, 255, 214, 129, 207, 152, 131, 126, 167, 232, 176, 126, 198, 250, 187, 197, 142, 107, 28, 7, 100, 251, 12, 200, 151, 206, 113, 131, 113, 202, 179, 248, 150, 50, 24, 12, 6, 99, 92, 150, 162, 49, 102, 13, 12, 12, 204, 46, 102, 41, 18, 17, 53, 18, 1, 109, 34, 75, 237, 149, 68, 62, 239, 164, 241, 117, 26, 207, 89, 137, 176, 128, 168, 48, 178, 32, 75, 195, 34, 180, 142, 36, 6, 125, 46, 101, 177, 26, 51, 198, 231, 179, 5, 36, 153, 53, 254, 45, 109, 140, 148, 241, 251, 230, 177, 226, 198, 72, 26, 255, 158, 176, 144, 239, 217, 130, 107, 100, 48, 24, 12, 6, 163, 100, 204, 130, 27, 181, 152, 149, 213, 216, 216, 216, 0, 87, 41, 141, 215, 209, 248, 60, 141, 103, 11, 45, 57, 11, 25, 166, 44, 132, 149, 48, 254, 63, 93, 132, 240, 38, 115, 100, 76, 130, 164, 159, 79, 210, 185, 133, 153, 32, 25, 12, 6, 131, 81, 182, 213, 8, 87, 169, 65, 142, 121, 224, 239, 136, 92, 218, 105, 188, 130, 198, 167, 17, 11, 44, 66, 136, 89, 195, 250, 179, 90, 130, 153, 41, 38, 195, 66, 43, 211, 36, 233, 52, 172, 89, 250, 249, 81, 250, 185, 192, 176, 126, 239, 171, 26, 61, 126, 202, 96, 48, 24, 12, 198, 16, 57, 90, 173, 42, 144, 136, 36, 73, 43, 141, 120, 226, 55, 64, 132, 166, 219, 212, 136, 5, 166, 44, 86, 225, 72, 238, 208, 219, 61, 64, 216, 230, 57, 255, 190, 149, 244, 249, 150, 51, 24, 12, 6, 99, 84, 98, 132, 37, 101, 196, 25, 243, 32, 66, 105, 33, 66, 121, 21, 141, 111, 22, 16, 99, 214, 18, 223, 187, 211, 200, 176, 216, 72, 88, 92, 190, 135, 44, 151, 56, 155, 111, 61, 131, 193, 96, 48, 70, 194, 76, 195, 157, 154, 183, 26, 101, 89, 94, 68, 68, 114, 138, 198, 103, 76, 203, 203, 66, 48, 102, 44, 49, 51, 13, 136, 113, 88, 252, 145, 174, 225, 251, 32, 125, 92, 227, 72, 241, 85, 6, 131, 193, 96, 48, 132, 229, 104, 196, 225, 242, 228, 40, 73, 146, 159, 8, 242, 53, 168, 53, 52, 227, 139, 150, 56, 94, 114, 26, 17, 163, 213, 5, 44, 226, 143, 244, 231, 79, 128, 252, 113, 157, 133, 215, 205, 96, 48, 24, 12, 70, 30, 134, 21, 149, 79, 82, 33, 34, 233, 167, 241, 118, 16, 139, 65, 40, 250, 109, 202, 58, 157, 172, 248, 227, 107, 11, 174, 157, 193, 96, 48, 24, 140, 91, 48, 171, 202, 226, 98, 36, 242, 88, 67, 227, 195, 102, 172, 209, 226, 78, 205, 76, 83, 98, 188, 37, 254, 72, 63, 143, 154, 215, 91, 24, 111, 101, 48, 24, 12, 6, 3, 152, 93, 101, 73, 80, 33, 226, 232, 37, 2, 249, 152, 89, 203, 88, 65, 228, 104, 173, 127, 252, 33, 93, 95, 155, 197, 122, 228, 248, 35, 131, 193, 96, 48, 134, 97, 134, 85, 143, 20, 49, 71, 40, 224, 88, 200, 49, 59, 73, 177, 198, 236, 109, 40, 1, 73, 91, 234, 31, 63, 5, 77, 88, 92, 115, 97, 41, 11, 131, 193, 96, 48, 24, 85, 86, 201, 56, 35, 91, 245, 247, 64, 90, 6, 57, 102, 140, 152, 99, 118, 28, 150, 90, 186, 64, 234, 45, 47, 31, 103, 145, 142, 75, 143, 33, 15, 103, 202, 205, 217, 37, 48, 96, 141, 63, 254, 161, 57, 7, 28, 127, 100, 48, 24, 12, 198, 45, 214, 163, 149, 28, 136, 32, 15, 19, 113, 252, 160, 32, 230, 56, 150, 21, 40, 244, 81, 11, 4, 2, 134, 9, 135, 91, 5, 195, 139, 137, 145, 23, 27, 163, 136, 140, 91, 137, 187, 92, 65, 2, 107, 253, 227, 137, 130, 77, 2, 131, 193, 96, 48, 24, 183, 90, 78, 68, 68, 42, 145, 198, 71, 44, 68, 20, 55, 201, 110, 4, 98, 76, 89, 132, 191, 111, 233, 162, 97, 124, 238, 105, 34, 221, 175, 226, 184, 70, 235, 169, 87, 209, 255, 63, 138, 154, 74, 250, 252, 94, 250, 243, 54, 116, 210, 160, 255, 95, 75, 255, 191, 26, 137, 65, 248, 127, 250, 253, 237, 244, 231, 131, 52, 206, 211, 103, 126, 13, 109, 176, 232, 207, 239, 166, 241, 57, 212, 46, 26, 86, 104, 81, 173, 87, 139, 180, 93, 170, 192, 45, 156, 181, 196, 31, 127, 140, 182, 87, 22, 114, 228, 248, 35, 131, 193, 96, 48, 134, 96, 141, 61, 18, 97, 92, 6, 169, 24, 4, 98, 186, 59, 11, 53, 76, 205, 127, 139, 27, 86, 163, 149, 16, 161, 187, 250, 95, 32, 50, 144, 26, 72, 142, 70, 200, 233, 116, 46, 182, 251, 188, 235, 235, 235, 31, 160, 227, 42, 32, 85, 250, 174, 75, 52, 254, 12, 228, 137, 246, 85, 214, 115, 50, 72, 211, 236, 27, 25, 7, 121, 26, 214, 241, 103, 60, 30, 207, 50, 28, 139, 227, 143, 12, 6, 131, 193, 40, 132, 169, 152, 131, 172, 85, 39, 178, 86, 45, 174, 213, 228, 40, 73, 46, 137, 2, 153, 57, 88, 99, 127, 103, 88, 123, 209, 49, 244, 76, 17, 235, 156, 13, 171, 205, 28, 85, 67, 25, 180, 179, 138, 140, 217, 69, 62, 63, 107, 52, 66, 163, 115, 168, 133, 69, 10, 146, 70, 153, 138, 41, 112, 80, 224, 170, 253, 223, 230, 231, 89, 127, 149, 193, 96, 48, 24, 195, 96, 141, 187, 193, 221, 137, 158, 141, 6, 225, 21, 147, 141, 203, 154, 86, 165, 165, 46, 242, 121, 26, 127, 131, 54, 87, 166, 53, 86, 128, 89, 150, 102, 202, 69, 123, 71, 218, 0, 209, 155, 18, 68, 95, 172, 227, 136, 149, 52, 233, 188, 31, 50, 218, 113, 125, 147, 198, 133, 98, 243, 192, 96, 48, 24, 12, 198, 48, 203, 137, 200, 227, 141, 5, 177, 199, 66, 203, 17, 196, 152, 50, 221, 151, 134, 43, 245, 6, 154, 35, 23, 90, 136, 22, 82, 188, 157, 113, 189, 25, 32, 62, 184, 144, 71, 176, 16, 103, 90, 9, 150, 159, 6, 6, 131, 193, 96, 228, 9, 196, 140, 63, 194, 189, 74, 22, 214, 23, 13, 171, 176, 48, 246, 152, 239, 212, 97, 169, 139, 68, 39, 143, 99, 85, 195, 59, 95, 204, 180, 184, 75, 239, 212, 120, 222, 76, 139, 155, 214, 36, 200, 89, 85, 220, 255, 145, 193, 96, 48, 24, 5, 22, 148, 176, 156, 12, 73, 185, 103, 13, 242, 139, 23, 41, 149, 176, 22, 215, 35, 43, 245, 178, 149, 84, 44, 250, 173, 211, 45, 209, 101, 70, 21, 39, 231, 48, 24, 12, 6, 163, 0, 86, 205, 213, 139, 102, 205, 226, 8, 238, 213, 164, 197, 122, 252, 11, 26, 53, 230, 239, 114, 7, 12, 6, 131, 193, 96, 84, 20, 172, 201, 44, 68, 126, 127, 96, 169, 91, 76, 22, 113, 175, 154, 181, 131, 207, 209, 24, 44, 32, 71, 142, 223, 49, 24, 12, 6, 163, 114, 96, 77, 92, 129, 238, 170, 225, 62, 77, 21, 17, 6, 176, 18, 228, 191, 33, 94, 105, 90, 160, 156, 253, 201, 96, 48, 24, 140, 138, 181, 32, 65, 148, 68, 124, 159, 52, 8, 50, 81, 36, 254, 40, 132, 202, 141, 94, 144, 239, 42, 70, 176, 12, 6, 131, 193, 96, 84, 156, 5, 73, 63, 231, 17, 241, 153, 25, 172, 241, 17, 36, 229, 4, 65, 202, 178, 252, 102, 38, 72, 6, 131, 193, 96, 84, 52, 204, 18, 15, 116, 239, 128, 86, 170, 225, 66, 189, 57, 146, 192, 183, 81, 251, 248, 127, 10, 45, 80, 6, 131, 193, 96, 48, 42, 210, 130, 52, 218, 91, 125, 163, 20, 130, 164, 159, 239, 49, 127, 159, 227, 143, 12, 6, 131, 193, 168, 72, 88, 98, 144, 243, 44, 22, 100, 124, 12, 130, 252, 74, 213, 240, 2, 123, 6, 131, 193, 96, 48, 42, 11, 166, 5, 136, 159, 68, 124, 159, 31, 131, 32, 83, 70, 141, 228, 139, 232, 160, 97, 37, 88, 6, 131, 193, 96, 48, 42, 146, 32, 1, 116, 241, 24, 131, 32, 133, 80, 185, 241, 153, 3, 248, 29, 107, 155, 44, 6, 131, 193, 96, 48, 42, 9, 121, 105, 56, 178, 14, 255, 122, 148, 44, 214, 188, 128, 128, 65, 144, 239, 48, 126, 255, 78, 214, 92, 101, 48, 24, 12, 6, 99, 66, 152, 109, 88, 144, 175, 26, 165, 14, 210, 28, 25, 195, 205, 250, 172, 36, 73, 117, 248, 61, 118, 179, 50, 24, 12, 6, 163, 34, 97, 102, 178, 18, 233, 157, 50, 172, 195, 244, 40, 4, 169, 91, 4, 3, 174, 90, 127, 159, 193, 96, 48, 24, 140, 138, 130, 165, 22, 114, 133, 97, 29, 234, 69, 26, 37, 223, 34, 90, 142, 178, 144, 42, 110, 17, 197, 96, 48, 24, 140, 74, 133, 233, 34, 117, 56, 28, 245, 104, 99, 101, 144, 95, 114, 20, 130, 132, 117, 153, 130, 181, 73, 164, 186, 27, 191, 203, 245, 144, 12, 6, 131, 193, 168, 68, 228, 173, 64, 34, 190, 255, 59, 70, 38, 107, 97, 77, 228, 23, 138, 29, 135, 193, 96, 48, 24, 140, 74, 129, 176, 0, 201, 122, 124, 77, 9, 153, 172, 195, 74, 62, 232, 119, 246, 91, 45, 81, 6, 131, 193, 96, 48, 42, 6, 102, 162, 13, 17, 222, 246, 18, 19, 117, 64, 140, 166, 112, 192, 55, 44, 228, 200, 202, 58, 12, 6, 131, 193, 168, 28, 152, 49, 68, 148, 110, 16, 225, 253, 210, 32, 190, 244, 24, 86, 164, 110, 17, 14, 184, 134, 223, 103, 225, 0, 6, 131, 193, 96, 84, 26, 242, 130, 1, 68, 118, 31, 54, 72, 47, 81, 2, 65, 102, 13, 50, 253, 5, 145, 227, 114, 227, 88, 156, 176, 195, 96, 48, 24, 140, 202, 129, 165, 30, 242, 162, 65, 144, 169, 177, 220, 172, 5, 234, 58, 127, 130, 223, 231, 88, 36, 131, 193, 96, 48, 42, 10, 166, 155, 149, 200, 78, 67, 146, 142, 97, 25, 166, 74, 32, 200, 188, 194, 14, 253, 110, 55, 91, 145, 12, 6, 131, 193, 168, 68, 20, 186, 89, 111, 150, 72, 144, 73, 35, 163, 245, 139, 60, 133, 12, 6, 131, 193, 168, 56, 152, 238, 81, 34, 186, 163, 70, 185, 71, 178, 68, 130, 20, 165, 33, 198, 239, 220, 96, 43, 146, 193, 96, 48, 24, 149, 6, 81, 166, 209, 216, 216, 184, 196, 162, 170, 147, 41, 145, 32, 205, 172, 87, 184, 101, 189, 214, 227, 49, 24, 12, 6, 131, 81, 49, 86, 36, 145, 220, 31, 27, 110, 214, 178, 172, 72, 195, 213, 250, 9, 203, 33, 89, 97, 135, 193, 96, 48, 24, 211, 31, 102, 54, 171, 44, 203, 157, 214, 36, 156, 18, 9, 50, 175, 211, 106, 118, 251, 224, 172, 86, 6, 131, 193, 96, 84, 10, 242, 22, 31, 44, 193, 50, 106, 34, 11, 93, 173, 73, 167, 211, 25, 96, 146, 100, 48, 24, 12, 70, 197, 192, 44, 249, 32, 130, 220, 97, 145, 158, 203, 148, 65, 146, 41, 227, 247, 254, 165, 24, 241, 50, 24, 12, 6, 131, 49, 93, 49, 195, 36, 53, 89, 150, 191, 58, 14, 43, 82, 104, 181, 26, 191, 247, 155, 56, 16, 55, 86, 102, 48, 24, 12, 70, 69, 192, 146, 172, 115, 210, 40, 223, 40, 139, 32, 77, 21, 30, 35, 19, 182, 159, 73, 146, 193, 96, 48, 24, 21, 101, 69, 130, 40, 137, 224, 190, 83, 134, 128, 249, 45, 10, 59, 244, 243, 169, 198, 198, 198, 57, 166, 85, 202, 83, 203, 96, 48, 24, 140, 105, 13, 179, 59, 71, 129, 62, 171, 94, 230, 48, 93, 173, 127, 131, 99, 153, 241, 77, 6, 131, 193, 96, 48, 166, 51, 102, 153, 68, 73, 4, 247, 237, 113, 90, 145, 86, 65, 243, 147, 166, 85, 202, 83, 203, 96, 48, 24, 140, 105, 13, 75, 93, 228, 233, 82, 155, 41, 143, 20, 143, 196, 144, 36, 201, 111, 37, 95, 6, 131, 193, 96, 48, 166, 181, 21, 73, 152, 73, 4, 247, 149, 113, 168, 235, 228, 93, 173, 134, 5, 250, 141, 42, 142, 67, 50, 24, 12, 6, 163, 18, 96, 169, 139, 124, 120, 2, 86, 100, 94, 208, 156, 172, 209, 55, 179, 21, 201, 96, 48, 24, 140, 138, 2, 145, 220, 199, 12, 146, 140, 143, 131, 32, 173, 241, 200, 227, 198, 33, 57, 105, 135, 193, 96, 48, 24, 211, 26, 194, 218, 35, 235, 175, 195, 112, 149, 102, 199, 105, 69, 90, 147, 124, 154, 216, 146, 100, 48, 24, 12, 198, 180, 135, 69, 60, 224, 79, 199, 41, 30, 144, 183, 34, 13, 146, 253, 239, 154, 154, 154, 185, 198, 225, 57, 46, 201, 96, 48, 24, 140, 105, 139, 153, 6, 65, 214, 208, 120, 182, 48, 67, 181, 220, 120, 164, 209, 245, 227, 93, 150, 227, 207, 224, 41, 102, 48, 24, 12, 198, 180, 132, 41, 30, 32, 203, 242, 149, 9, 136, 7, 152, 196, 106, 198, 35, 95, 129, 99, 178, 136, 0, 131, 193, 96, 48, 166, 189, 21, 105, 88, 146, 159, 159, 128, 120, 128, 217, 103, 50, 139, 99, 208, 216, 132, 99, 178, 136, 0, 131, 193, 96, 48, 166, 45, 76, 241, 0, 178, 254, 122, 198, 209, 84, 249, 150, 164, 29, 131, 100, 159, 119, 58, 157, 10, 147, 36, 131, 193, 96, 48, 166, 51, 102, 152, 238, 80, 34, 182, 215, 78, 64, 60, 160, 80, 68, 224, 223, 171, 134, 50, 90, 57, 179, 149, 193, 96, 48, 24, 211, 18, 179, 12, 107, 114, 30, 178, 81, 13, 130, 155, 16, 73, 26, 68, 251, 14, 203, 241, 57, 105, 135, 193, 96, 48, 166, 187, 69, 117, 55, 46, 230, 22, 133, 157, 77, 6, 65, 102, 38, 224, 106, 21, 238, 86, 107, 210, 14, 247, 143, 100, 48, 24, 140, 233, 143, 153, 35, 252, 249, 174, 185, 118, 75, 109, 100, 124, 2, 4, 153, 53, 147, 118, 100, 89, 222, 138, 227, 154, 89, 179, 12, 6, 131, 193, 152, 158, 152, 53, 130, 85, 121, 183, 88, 207, 85, 94, 175, 119, 62, 145, 219, 15, 12, 75, 50, 53, 65, 146, 52, 221, 181, 94, 28, 155, 147, 118, 24, 12, 6, 99, 154, 194, 186, 128, 171, 170, 250, 33, 34, 137, 175, 145, 229, 211, 120, 23, 89, 148, 98, 131, 32, 73, 210, 6, 163, 248, 127, 34, 4, 41, 92, 181, 6, 209, 126, 183, 177, 177, 113, 206, 93, 106, 153, 51, 24, 12, 70, 101, 17, 36, 45, 236, 31, 193, 34, 15, 119, 35, 253, 121, 213, 40, 22, 102, 69, 193, 18, 143, 124, 227, 4, 101, 232, 10, 227, 145, 159, 100, 130, 100, 48, 24, 140, 10, 32, 72, 90, 208, 63, 10, 235, 199, 231, 243, 221, 52, 172, 160, 190, 187, 132, 36, 77, 151, 242, 108, 186, 230, 111, 79, 80, 64, 96, 88, 231, 15, 89, 150, 223, 80, 56, 207, 12, 6, 131, 193, 152, 126, 22, 228, 199, 26, 27, 27, 245, 158, 158, 158, 155, 253, 253, 253, 89, 252, 217, 237, 118, 247, 223, 13, 36, 105, 206, 131, 36, 73, 93, 150, 142, 31, 186, 29, 36, 73, 63, 47, 224, 216, 156, 217, 202, 96, 48, 24, 211, 152, 32, 29, 14, 135, 222, 217, 217, 121, 115, 203, 150, 45, 217, 190, 190, 190, 204, 221, 68, 146, 102, 214, 41, 205, 195, 19, 19, 212, 106, 189, 69, 109, 135, 198, 106, 28, 155, 53, 91, 25, 12, 6, 99, 26, 18, 36, 145, 130, 73, 144, 241, 135, 30, 122, 72, 223, 188, 121, 115, 182, 183, 183, 55, 131, 191, 187, 75, 72, 50, 95, 19, 74, 196, 246, 41, 131, 36, 39, 234, 106, 53, 45, 209, 148, 41, 71, 87, 197, 49, 73, 6, 131, 193, 152, 158, 4, 217, 209, 209, 145, 32, 114, 212, 55, 110, 220, 152, 39, 201, 187, 197, 146, 52, 231, 131, 230, 194, 65, 164, 246, 43, 139, 136, 192, 132, 173, 72, 250, 249, 189, 250, 250, 250, 7, 44, 100, 204, 96, 48, 24, 140, 233, 64, 144, 180, 136, 127, 220, 180, 32, 65, 144, 155, 54, 109, 186, 43, 73, 210, 116, 181, 18, 161, 237, 180, 196, 35, 39, 26, 147, 76, 24, 22, 233, 167, 153, 32, 25, 12, 6, 99, 122, 17, 228, 12, 90, 192, 77, 130, 188, 105, 18, 164, 57, 238, 50, 146, 44, 38, 104, 110, 71, 60, 50, 110, 148, 145, 188, 165, 210, 55, 25, 12, 6, 131, 81, 105, 4, 249, 9, 16, 100, 87, 87, 87, 188, 144, 32, 239, 66, 75, 50, 127, 93, 68, 104, 255, 106, 67, 215, 143, 66, 146, 124, 185, 113, 120, 78, 218, 97, 48, 24, 140, 59, 156, 32, 171, 76, 130, 36, 11, 50, 81, 72, 144, 119, 35, 73, 154, 86, 164, 76, 32, 66, 123, 206, 6, 41, 186, 97, 221, 63, 232, 120, 123, 217, 146, 100, 48, 24, 140, 105, 68, 144, 197, 44, 72, 38, 73, 121, 171, 97, 69, 102, 108, 72, 218, 17, 191, 15, 194, 165, 99, 118, 51, 73, 50, 24, 12, 198, 157, 77, 144, 51, 44, 22, 228, 205, 145, 8, 242, 110, 118, 183, 18, 169, 253, 79, 155, 164, 232, 132, 230, 171, 97, 145, 190, 0, 11, 117, 186, 207, 223, 224, 224, 224, 44, 60, 75, 248, 201, 111, 21, 131, 193, 168, 68, 130, 252, 228, 88, 22, 228, 72, 36, 233, 241, 120, 238, 10, 89, 58, 34, 180, 15, 27, 150, 100, 220, 14, 165, 29, 131, 36, 159, 68, 243, 102, 227, 43, 166, 107, 141, 228, 140, 98, 150, 55, 131, 193, 96, 84, 20, 65, 142, 20, 131, 28, 139, 36, 201, 186, 26, 192, 129, 12, 73, 181, 153, 6, 89, 86, 202, 48, 93, 173, 139, 108, 106, 141, 85, 88, 254, 241, 89, 131, 100, 204, 12, 218, 105, 53, 63, 38, 33, 210, 243, 84, 71, 207, 207, 163, 29, 29, 29, 110, 203, 179, 192, 96, 48, 24, 119, 143, 5, 89, 140, 36, 241, 187, 100, 73, 182, 87, 250, 156, 209, 70, 32, 104, 16, 164, 93, 154, 173, 102, 102, 235, 95, 85, 194, 252, 16, 65, 254, 143, 149, 43, 87, 66, 112, 226, 63, 233, 89, 106, 96, 162, 100, 48, 24, 211, 154, 32, 159, 120, 226, 137, 153, 68, 144, 255, 104, 16, 228, 205, 82, 9, 210, 74, 146, 208, 110, 117, 58, 157, 186, 215, 235, 61, 16, 10, 133, 28, 129, 64, 32, 72, 132, 233, 171, 164, 129, 107, 242, 251, 253, 117, 68, 102, 55, 108, 172, 143, 204, 11, 155, 19, 241, 254, 31, 154, 191, 122, 124, 143, 219, 237, 246, 79, 167, 185, 161, 243, 246, 250, 124, 190, 112, 117, 117, 117, 13, 61, 87, 127, 222, 222, 222, 142, 103, 9, 68, 249, 84, 44, 22, 171, 103, 162, 100, 48, 24, 149, 64, 144, 241, 114, 8, 210, 66, 146, 232, 4, 162, 47, 93, 186, 84, 167, 227, 100, 27, 26, 26, 42, 122, 200, 178, 172, 219, 68, 142, 195, 6, 205, 93, 166, 18, 230, 7, 215, 65, 115, 148, 37, 178, 79, 224, 185, 176, 18, 165, 169, 86, 196, 96, 48, 24, 211, 197, 197, 250, 143, 229, 196, 32, 139, 13, 136, 156, 175, 90, 181, 10, 139, 161, 176, 30, 42, 125, 144, 209, 164, 75, 146, 100, 43, 65, 130, 120, 233, 190, 232, 221, 221, 221, 184, 23, 211, 114, 94, 112, 222, 56, 127, 92, 7, 230, 7, 131, 137, 146, 193, 96, 76, 91, 130, 84, 20, 229, 83, 227, 181, 32, 139, 17, 37, 142, 1, 215, 107, 37, 15, 186, 206, 172, 223, 239, 215, 225, 90, 182, 196, 37, 39, 82, 254, 33, 8, 18, 99, 237, 218, 181, 250, 214, 173, 91, 197, 119, 76, 215, 185, 193, 249, 99, 195, 132, 36, 46, 92, 27, 230, 137, 136, 50, 110, 16, 229, 247, 56, 70, 201, 96, 48, 238, 120, 130, 68, 253, 154, 133, 32, 111, 78, 148, 32, 173, 174, 215, 74, 30, 216, 8, 128, 200, 236, 180, 32, 65, 36, 176, 184, 144, 184, 179, 110, 221, 58, 241, 29, 211, 125, 142, 144, 180, 99, 146, 36, 174, 209, 176, 40, 111, 50, 81, 50, 24, 140, 233, 70, 144, 113, 187, 8, 178, 210, 135, 25, 123, 5, 1, 96, 238, 236, 176, 34, 77, 146, 132, 181, 5, 235, 116, 195, 134, 13, 121, 146, 156, 238, 115, 100, 37, 73, 115, 35, 80, 204, 162, 100, 215, 43, 131, 193, 184, 147, 92, 172, 51, 77, 130, 156, 72, 12, 242, 110, 38, 201, 222, 222, 222, 97, 4, 96, 7, 73, 226, 126, 68, 34, 145, 138, 218, 72, 20, 206, 145, 197, 245, 154, 96, 162, 100, 48, 24, 119, 12, 76, 151, 22, 178, 88, 105, 161, 250, 39, 182, 32, 39, 70, 0, 40, 109, 176, 155, 36, 113, 60, 36, 187, 192, 138, 172, 84, 146, 52, 71, 129, 69, 249, 125, 118, 189, 50, 24, 140, 219, 6, 83, 1, 197, 112, 177, 254, 147, 221, 49, 200, 187, 109, 128, 196, 162, 209, 168, 237, 238, 86, 16, 10, 50, 67, 113, 95, 166, 171, 171, 181, 84, 146, 180, 184, 94, 243, 49, 74, 26, 141, 76, 148, 12, 6, 99, 170, 97, 106, 167, 34, 139, 245, 211, 108, 65, 218, 67, 2, 180, 184, 219, 150, 217, 106, 37, 73, 184, 113, 239, 6, 146, 28, 33, 70, 249, 125, 147, 40, 217, 245, 202, 96, 48, 166, 2, 66, 28, 59, 18, 137, 204, 165, 5, 233, 11, 40, 47, 232, 238, 238, 230, 24, 228, 4, 22, 127, 88, 145, 235, 215, 175, 71, 151, 19, 177, 192, 219, 69, 146, 134, 136, 128, 32, 150, 187, 133, 36, 71, 136, 81, 50, 81, 50, 24, 140, 169, 37, 73, 34, 199, 251, 225, 102, 5, 73, 146, 21, 153, 100, 146, 156, 216, 226, 191, 102, 205, 154, 124, 225, 191, 221, 66, 2, 171, 87, 175, 190, 171, 72, 114, 164, 24, 37, 187, 94, 25, 12, 198, 148, 18, 37, 64, 139, 213, 135, 177, 104, 181, 183, 183, 199, 167, 123, 114, 200, 237, 94, 252, 97, 253, 216, 77, 144, 133, 53, 146, 119, 19, 73, 22, 115, 189, 182, 181, 181, 57, 152, 40, 25, 12, 198, 84, 32, 223, 211, 81, 85, 213, 15, 193, 173, 71, 139, 208, 77, 38, 202, 241, 45, 254, 125, 125, 125, 182, 102, 182, 154, 150, 148, 207, 231, 155, 214, 228, 56, 17, 146, 28, 129, 40, 127, 96, 18, 37, 187, 94, 25, 12, 198, 164, 194, 82, 35, 105, 37, 74, 142, 79, 142, 99, 241, 71, 6, 106, 67, 67, 131, 237, 53, 146, 225, 112, 88, 175, 132, 141, 203, 120, 73, 178, 88, 140, 146, 230, 154, 137, 146, 193, 96, 220, 25, 68, 89, 9, 86, 204, 84, 148, 127, 160, 150, 113, 178, 106, 36, 167, 123, 60, 114, 162, 36, 89, 44, 70, 105, 37, 74, 118, 189, 50, 24, 140, 169, 36, 202, 127, 0, 81, 26, 49, 202, 44, 147, 96, 105, 3, 170, 56, 118, 147, 36, 44, 211, 74, 168, 145, 180, 139, 36, 11, 93, 175, 32, 74, 122, 118, 157, 76, 148, 12, 6, 227, 182, 16, 165, 157, 49, 202, 74, 21, 54, 199, 181, 65, 87, 213, 206, 238, 31, 86, 146, 180, 214, 72, 86, 130, 8, 252, 68, 245, 109, 45, 68, 105, 150, 135, 252, 208, 36, 74, 118, 189, 50, 24, 140, 219, 97, 81, 38, 108, 108, 149, 85, 113, 99, 203, 150, 45, 130, 36, 145, 133, 106, 103, 141, 164, 233, 110, 69, 107, 169, 173, 91, 183, 78, 251, 57, 196, 249, 227, 58, 172, 173, 178, 38, 42, 252, 206, 68, 201, 96, 48, 110, 55, 81, 126, 208, 36, 74, 211, 162, 44, 215, 237, 103, 54, 93, 110, 109, 109, 21, 141, 151, 161, 111, 90, 73, 3, 215, 132, 184, 161, 157, 165, 31, 214, 18, 144, 230, 230, 230, 138, 153, 55, 92, 71, 44, 22, 179, 165, 41, 117, 145, 172, 215, 31, 178, 235, 149, 193, 96, 220, 78, 162, 204, 199, 40, 75, 37, 74, 51, 14, 133, 69, 108, 217, 178, 101, 194, 205, 6, 43, 162, 146, 6, 92, 162, 184, 174, 201, 32, 73, 83, 113, 7, 223, 193, 115, 85, 26, 81, 18, 9, 75, 108, 81, 50, 24, 140, 219, 73, 148, 227, 174, 33, 164, 227, 136, 133, 173, 18, 199, 100, 145, 36, 207, 85, 249, 49, 74, 38, 74, 6, 131, 113, 59, 136, 242, 3, 229, 198, 40, 173, 36, 105, 103, 13, 33, 15, 30, 99, 196, 40, 127, 196, 68, 201, 96, 48, 110, 43, 81, 150, 18, 163, 100, 146, 228, 49, 149, 68, 89, 224, 122, 253, 81, 119, 119, 183, 32, 74, 142, 81, 50, 24, 140, 219, 65, 148, 99, 198, 40, 153, 36, 121, 220, 14, 162, 244, 251, 253, 113, 34, 72, 65, 148, 157, 157, 157, 114, 225, 51, 204, 96, 48, 24, 182, 195, 108, 210, 108, 16, 229, 251, 75, 137, 81, 50, 73, 242, 184, 141, 22, 165, 233, 122, 253, 177, 153, 245, 106, 125, 134, 25, 12, 6, 99, 170, 136, 50, 49, 18, 81, 50, 73, 242, 184, 157, 49, 74, 178, 40, 19, 93, 93, 93, 32, 202, 103, 232, 167, 143, 137, 146, 193, 96, 76, 181, 235, 245, 253, 163, 197, 40, 153, 36, 121, 220, 78, 107, 50, 24, 12, 38, 12, 183, 235, 147, 102, 124, 146, 73, 146, 193, 96, 76, 169, 69, 169, 105, 218, 251, 70, 138, 81, 50, 73, 242, 184, 141, 4, 25, 135, 164, 31, 17, 228, 183, 162, 209, 232, 34, 38, 72, 6, 131, 113, 219, 136, 146, 22, 166, 247, 21, 198, 40, 77, 162, 100, 146, 228, 49, 149, 195, 32, 200, 155, 38, 65, 118, 117, 117, 45, 97, 130, 100, 48, 24, 119, 18, 81, 14, 115, 189, 50, 73, 242, 152, 170, 129, 56, 164, 213, 130, 164, 159, 139, 241, 108, 114, 9, 8, 131, 193, 184, 83, 92, 175, 239, 45, 36, 74, 38, 73, 30, 83, 73, 144, 70, 70, 107, 158, 32, 89, 76, 128, 193, 96, 220, 169, 68, 25, 55, 59, 87, 96, 103, 207, 36, 201, 99, 146, 93, 172, 166, 5, 249, 77, 211, 197, 202, 22, 36, 131, 193, 184, 83, 93, 175, 130, 40, 219, 218, 218, 226, 104, 37, 101, 90, 146, 166, 118, 107, 126, 129, 195, 159, 167, 233, 152, 10, 194, 87, 202, 57, 167, 201, 56, 135, 201, 152, 187, 201, 141, 65, 126, 147, 93, 172, 12, 6, 99, 90, 16, 37, 17, 226, 123, 32, 106, 78, 187, 250, 132, 73, 146, 102, 251, 167, 138, 24, 180, 56, 227, 231, 100, 17, 164, 245, 59, 42, 113, 76, 66, 12, 242, 155, 225, 112, 152, 9, 146, 193, 96, 76, 24, 51, 166, 138, 40, 105, 33, 123, 15, 172, 33, 175, 215, 155, 160, 133, 49, 173, 105, 90, 138, 70, 22, 13, 138, 221, 110, 143, 238, 246, 122, 117, 183, 199, 155, 251, 57, 157, 134, 113, 206, 154, 219, 61, 73, 36, 169, 232, 154, 167, 204, 249, 161, 207, 227, 124, 48, 183, 198, 28, 167, 221, 110, 119, 170, 156, 97, 222, 27, 113, 127, 204, 239, 183, 123, 208, 57, 186, 233, 248, 19, 181, 196, 11, 8, 242, 27, 102, 153, 7, 199, 32, 25, 12, 198, 68, 24, 12, 4, 54, 139, 198, 204, 41, 180, 40, 223, 109, 46, 136, 104, 188, 219, 13, 5, 148, 174, 174, 76, 7, 26, 241, 54, 69, 244, 246, 232, 244, 28, 29, 177, 38, 61, 26, 14, 233, 146, 205, 214, 164, 76, 67, 165, 209, 26, 9, 137, 239, 24, 251, 92, 114, 159, 233, 104, 105, 214, 59, 105, 110, 105, 100, 59, 59, 59, 117, 20, 209, 35, 137, 5, 63, 75, 25, 248, 44, 212, 105, 232, 119, 179, 157, 40, 192, 111, 111, 179, 113, 190, 154, 242, 63, 59, 140, 6, 204, 32, 75, 184, 74, 199, 67, 150, 5, 49, 200, 111, 176, 5, 201, 96, 48, 38, 108, 61, 22, 212, 137, 205, 152, 98, 162, 252, 0, 45, 110, 159, 111, 111, 109, 125, 162, 173, 163, 227, 159, 154, 130, 1, 189, 185, 171, 59, 221, 189, 115, 143, 222, 189, 99, 247, 52, 27, 123, 244, 174, 135, 119, 233, 61, 187, 246, 233, 209, 129, 85, 186, 179, 190, 86, 119, 41, 170, 77, 49, 64, 85, 151, 28, 141, 186, 39, 220, 68, 223, 97, 126, 87, 9, 231, 180, 115, 175, 222, 250, 224, 26, 61, 172, 185, 178, 77, 145, 176, 222, 220, 222, 254, 53, 34, 190, 223, 36, 194, 251, 61, 34, 164, 63, 37, 34, 249, 35, 26, 127, 104, 252, 204, 15, 250, 247, 215, 211, 207, 55, 209, 120, 99, 119, 119, 39, 221, 155, 206, 183, 69, 155, 91, 210, 97, 77, 209, 163, 173, 109, 217, 174, 237, 131, 226, 28, 38, 58, 103, 226, 26, 232, 94, 119, 110, 27, 212, 219, 136, 192, 65, 148, 176, 84, 199, 67, 146, 5, 49, 200, 188, 5, 201, 4, 201, 96, 48, 198, 239, 94, 53, 8, 75, 113, 251, 118, 40, 30, 207, 111, 89, 254, 109, 214, 36, 127, 183, 121, 252, 28, 33, 7, 7, 230, 57, 234, 106, 191, 141, 88, 91, 199, 241, 115, 233, 254, 107, 47, 211, 251, 174, 60, 166, 247, 93, 157, 102, 227, 202, 75, 245, 21, 55, 94, 161, 55, 109, 221, 169, 59, 23, 62, 160, 43, 154, 102, 79, 162, 14, 29, 71, 90, 182, 88, 15, 172, 120, 80, 239, 127, 228, 113, 227, 187, 198, 62, 159, 254, 171, 143, 235, 189, 23, 111, 232, 209, 135, 247, 100, 37, 34, 157, 250, 251, 102, 60, 231, 84, 180, 223, 41, 231, 70, 213, 123, 131, 61, 142, 218, 234, 47, 54, 204, 153, 165, 251, 86, 172, 202, 118, 158, 188, 72, 199, 126, 220, 198, 57, 163, 65, 247, 27, 68, 9, 171, 210, 227, 243, 149, 77, 146, 112, 177, 134, 66, 161, 56, 19, 36, 131, 193, 176, 221, 154, 83, 188, 129, 51, 50, 89, 61, 74, 125, 141, 174, 120, 124, 255, 107, 170, 136, 82, 150, 229, 251, 197, 247, 183, 180, 44, 84, 100, 249, 251, 74, 99, 189, 222, 113, 232, 84, 106, 5, 145, 64, 239, 133, 235, 122, 31, 45, 238, 211, 111, 92, 215, 251, 137, 40, 131, 15, 174, 213, 157, 68, 106, 138, 106, 31, 73, 58, 151, 44, 208, 195, 235, 54, 137, 227, 227, 123, 74, 61, 167, 254, 203, 143, 234, 152, 211, 238, 83, 151, 178, 161, 85, 235, 116, 101, 217, 34, 93, 110, 108, 248, 133, 39, 24, 60, 101, 222, 139, 150, 150, 150, 7, 16, 179, 163, 231, 226, 126, 51, 118, 231, 141, 245, 212, 43, 110, 247, 59, 92, 75, 23, 232, 238, 64, 72, 111, 221, 123, 36, 131, 239, 238, 7, 169, 217, 57, 103, 184, 215, 116, 204, 238, 93, 251, 245, 246, 166, 48, 145, 164, 191, 44, 146, 44, 32, 200, 175, 211, 181, 44, 100, 130, 100, 48, 24, 227, 134, 117, 241, 80, 252, 254, 215, 200, 11, 231, 232, 190, 174, 222, 108, 96, 229, 154, 184, 188, 120, 174, 174, 120, 253, 127, 100, 249, 248, 164, 72, 118, 229, 197, 208, 159, 120, 98, 166, 162, 170, 159, 147, 105, 225, 110, 221, 123, 248, 166, 32, 72, 44, 156, 151, 94, 50, 173, 135, 175, 187, 79, 151, 106, 150, 235, 46, 213, 30, 119, 43, 200, 214, 185, 120, 158, 30, 221, 58, 168, 151, 61, 71, 244, 89, 124, 94, 144, 235, 149, 151, 102, 218, 14, 30, 143, 187, 155, 98, 186, 188, 100, 62, 142, 253, 49, 79, 75, 174, 11, 134, 21, 90, 40, 116, 80, 106, 168, 255, 185, 171, 122, 169, 30, 90, 179, 49, 211, 115, 246, 145, 4, 172, 82, 28, 207, 246, 251, 131, 227, 145, 69, 9, 215, 48, 98, 209, 229, 144, 36, 62, 103, 37, 72, 182, 32, 25, 12, 198, 132, 96, 90, 9, 218, 134, 13, 247, 41, 30, 207, 251, 229, 133, 247, 195, 133, 151, 162, 221, 124, 186, 239, 242, 163, 217, 224, 202, 53, 41, 121, 209, 3, 186, 234, 247, 255, 201, 36, 90, 148, 249, 152, 167, 234, 241, 190, 27, 231, 16, 123, 120, 119, 124, 5, 22, 225, 233, 76, 144, 56, 119, 178, 218, 122, 207, 95, 211, 221, 209, 22, 93, 110, 168, 183, 47, 38, 73, 100, 235, 92, 186, 80, 111, 217, 125, 80, 31, 247, 70, 194, 248, 29, 204, 51, 157, 99, 186, 105, 211, 182, 148, 226, 104, 20, 110, 92, 197, 23, 120, 226, 9, 108, 88, 90, 122, 157, 138, 162, 126, 64, 94, 52, 87, 7, 145, 18, 161, 38, 251, 175, 62, 150, 233, 191, 252, 210, 201, 187, 55, 38, 73, 14, 238, 43, 203, 146, 52, 8, 210, 140, 65, 126, 141, 45, 72, 6, 131, 97, 139, 5, 233, 138, 197, 36, 90, 128, 190, 6, 50, 140, 108, 218, 150, 0, 57, 98, 113, 55, 22, 45, 184, 228, 146, 32, 46, 213, 227, 123, 139, 197, 63, 107, 151, 69, 153, 79, 12, 34, 139, 245, 13, 242, 130, 251, 244, 200, 198, 173, 100, 165, 60, 54, 237, 173, 199, 62, 195, 90, 235, 62, 125, 153, 172, 113, 159, 46, 59, 29, 246, 21, 201, 163, 131, 69, 109, 181, 222, 126, 232, 100, 142, 228, 38, 64, 88, 189, 6, 153, 227, 56, 157, 199, 206, 38, 97, 245, 226, 126, 187, 100, 249, 255, 201, 181, 213, 63, 81, 234, 170, 233, 158, 108, 75, 246, 156, 191, 150, 1, 33, 231, 221, 162, 147, 185, 185, 16, 36, 185, 183, 100, 146, 100, 23, 43, 131, 193, 176, 213, 114, 51, 99, 144, 158, 72, 164, 79, 118, 52, 254, 210, 69, 11, 110, 203, 174, 3, 55, 243, 228, 100, 46, 132, 32, 75, 34, 205, 208, 218, 141, 9, 16, 24, 45, 246, 111, 29, 226, 201, 137, 19, 165, 233, 102, 85, 253, 161, 151, 201, 139, 231, 233, 176, 92, 243, 4, 61, 205, 221, 172, 194, 165, 73, 243, 73, 196, 67, 4, 233, 4, 233, 216, 68, 146, 74, 238, 88, 178, 164, 119, 157, 56, 47, 190, 99, 194, 46, 79, 211, 5, 155, 187, 255, 153, 230, 93, 251, 19, 170, 166, 233, 158, 150, 54, 189, 243, 232, 153, 56, 254, 30, 177, 204, 94, 196, 62, 167, 194, 2, 47, 195, 146, 44, 112, 177, 178, 5, 201, 96, 48, 198, 143, 97, 218, 169, 161, 208, 49, 178, 20, 116, 44, 134, 237, 135, 79, 197, 139, 90, 9, 22, 162, 12, 175, 219, 20, 7, 81, 170, 94, 255, 219, 11, 73, 110, 34, 174, 94, 53, 24, 62, 34, 47, 95, 162, 123, 59, 123, 50, 180, 80, 103, 132, 139, 178, 2, 226, 144, 184, 6, 88, 103, 109, 7, 142, 231, 226, 145, 118, 201, 173, 209, 49, 96, 149, 170, 254, 128, 222, 115, 246, 138, 145, 184, 115, 195, 182, 115, 54, 173, 74, 178, 128, 147, 189, 231, 175, 165, 166, 196, 122, 28, 23, 73, 42, 76, 144, 12, 6, 195, 126, 247, 170, 32, 168, 64, 240, 183, 145, 28, 227, 142, 54, 235, 93, 167, 46, 38, 71, 141, 107, 25, 11, 103, 63, 136, 114, 195, 230, 68, 142, 40, 189, 239, 158, 8, 81, 230, 99, 161, 161, 166, 181, 32, 106, 156, 71, 239, 249, 71, 82, 88, 240, 43, 129, 32, 243, 36, 73, 243, 218, 60, 184, 95, 100, 162, 218, 149, 180, 35, 72, 178, 161, 78, 247, 52, 183, 229, 178, 126, 177, 137, 177, 115, 206, 204, 44, 88, 144, 175, 221, 199, 182, 145, 36, 165, 156, 139, 53, 213, 219, 215, 7, 130, 252, 42, 19, 36, 131, 193, 152, 56, 65, 34, 25, 195, 227, 249, 59, 196, 156, 252, 125, 43, 211, 136, 51, 229, 220, 117, 215, 75, 74, 242, 192, 194, 137, 152, 161, 112, 189, 186, 61, 31, 24, 15, 81, 154, 231, 226, 109, 110, 142, 200, 13, 245, 73, 34, 92, 178, 90, 46, 37, 109, 113, 27, 222, 105, 49, 73, 186, 166, 166, 45, 59, 116, 231, 162, 185, 182, 213, 72, 130, 108, 165, 234, 101, 186, 191, 119, 133, 112, 129, 86, 204, 124, 149, 65, 146, 136, 65, 134, 35, 145, 116, 119, 79, 143, 222, 217, 217, 241, 89, 83, 73, 103, 34, 158, 13, 6, 131, 113, 151, 19, 164, 191, 165, 165, 142, 172, 144, 47, 129, 32, 195, 27, 182, 196, 145, 148, 83, 150, 229, 102, 37, 202, 135, 182, 199, 115, 68, 233, 254, 72, 57, 68, 105, 126, 198, 223, 210, 87, 231, 146, 164, 159, 40, 78, 7, 98, 118, 137, 156, 37, 123, 189, 226, 22, 124, 204, 85, 104, 205, 70, 221, 185, 120, 62, 145, 164, 29, 250, 173, 114, 190, 70, 18, 199, 21, 49, 196, 74, 218, 88, 148, 64, 146, 34, 73, 39, 18, 201, 118, 181, 183, 165, 219, 90, 90, 116, 119, 48, 120, 4, 207, 84, 36, 18, 153, 203, 111, 59, 131, 193, 40, 7, 51, 77, 82, 114, 71, 90, 58, 92, 78, 199, 207, 92, 53, 203, 244, 216, 206, 189, 113, 81, 0, 62, 158, 216, 159, 133, 40, 155, 54, 239, 184, 41, 178, 32, 221, 238, 79, 14, 14, 14, 206, 26, 139, 40, 205, 127, 147, 7, 6, 238, 87, 20, 245, 107, 174, 154, 229, 122, 219, 129, 99, 137, 188, 88, 64, 165, 45, 244, 198, 159, 253, 189, 3, 185, 178, 10, 59, 72, 82, 150, 197, 113, 156, 11, 231, 232, 209, 45, 59, 245, 74, 169, 35, 29, 139, 36, 101, 131, 36, 133, 5, 217, 20, 213, 59, 155, 99, 122, 215, 154, 117, 105, 111, 75, 155, 238, 172, 94, 26, 247, 68, 219, 218, 216, 213, 202, 96, 48, 202, 65, 94, 156, 220, 29, 14, 239, 147, 234, 106, 196, 34, 211, 118, 240, 120, 34, 151, 136, 49, 129, 236, 81, 147, 40, 105, 33, 139, 110, 221, 25, 135, 248, 128, 226, 246, 124, 218, 36, 193, 162, 11, 149, 85, 209, 71, 243, 124, 66, 94, 50, 79, 111, 30, 60, 16, 175, 200, 69, 222, 90, 35, 121, 225, 154, 200, 16, 69, 185, 134, 221, 36, 217, 178, 235, 192, 93, 69, 146, 176, 38, 115, 4, 73, 227, 193, 53, 226, 115, 157, 39, 206, 39, 85, 201, 137, 127, 255, 145, 22, 235, 91, 158, 123, 212, 6, 102, 243, 235, 207, 96, 48, 70, 196, 48, 137, 57, 95, 224, 9, 121, 233, 66, 221, 29, 137, 234, 93, 39, 47, 36, 109, 91, 84, 173, 68, 185, 109, 87, 28, 53, 150, 46, 77, 251, 23, 136, 18, 20, 33, 74, 144, 181, 104, 187, 165, 120, 189, 111, 149, 231, 223, 139, 56, 93, 188, 34, 93, 133, 133, 53, 146, 103, 174, 136, 44, 84, 185, 177, 193, 158, 152, 36, 72, 82, 133, 110, 235, 34, 189, 253, 208, 137, 10, 119, 183, 14, 213, 73, 58, 104, 254, 194, 81, 131, 32, 87, 173, 21, 2, 13, 102, 22, 110, 219, 254, 99, 9, 215, 242, 197, 186, 75, 209, 254, 181, 96, 147, 200, 96, 48, 24, 195, 49, 76, 98, 206, 227, 251, 107, 33, 49, 215, 221, 151, 233, 57, 123, 53, 93, 82, 130, 206, 56, 21, 91, 154, 119, 236, 185, 9, 162, 84, 84, 245, 139, 208, 253, 44, 56, 23, 177, 96, 169, 254, 224, 239, 138, 120, 232, 186, 77, 9, 34, 144, 108, 69, 146, 227, 48, 146, 124, 76, 239, 60, 126, 94, 119, 145, 5, 36, 134, 157, 217, 173, 68, 26, 157, 168, 145, 188, 242, 210, 138, 143, 73, 162, 95, 102, 48, 18, 17, 46, 214, 206, 213, 107, 245, 62, 178, 206, 251, 140, 235, 54, 51, 136, 161, 208, 36, 47, 154, 163, 43, 30, 207, 219, 140, 103, 110, 210, 187, 215, 48, 24, 140, 105, 6, 179, 172, 194, 211, 50, 176, 140, 172, 186, 127, 5, 105, 133, 215, 110, 74, 162, 56, 60, 151, 160, 115, 125, 210, 98, 111, 32, 224, 230, 157, 123, 111, 66, 16, 128, 200, 224, 43, 90, 71, 199, 2, 156, 75, 189, 65, 152, 106, 40, 116, 9, 22, 173, 191, 127, 101, 26, 9, 67, 183, 165, 180, 224, 54, 100, 182, 66, 17, 71, 170, 94, 106, 115, 141, 164, 147, 200, 192, 171, 247, 144, 149, 42, 228, 225, 42, 56, 187, 181, 45, 18, 70, 43, 46, 189, 35, 218, 68, 4, 185, 46, 103, 65, 22, 217, 24, 96, 211, 21, 94, 247, 80, 2, 207, 188, 22, 8, 252, 58, 158, 57, 195, 253, 63, 131, 87, 6, 6, 131, 49, 195, 180, 218, 220, 209, 104, 84, 150, 156, 63, 116, 85, 47, 17, 187, 107, 97, 177, 77, 118, 113, 190, 81, 87, 39, 44, 202, 157, 251, 226, 242, 210, 5, 176, 40, 191, 230, 234, 232, 168, 49, 8, 114, 183, 92, 189, 76, 247, 180, 118, 32, 65, 39, 83, 73, 181, 144, 99, 145, 36, 180, 85, 157, 11, 230, 216, 148, 217, 154, 43, 255, 144, 235, 235, 116, 119, 172, 101, 168, 70, 178, 82, 73, 114, 231, 30, 189, 131, 172, 71, 209, 36, 186, 192, 130, 44, 90, 199, 123, 233, 37, 105, 120, 77, 80, 255, 171, 133, 195, 251, 139, 184, 253, 25, 12, 198, 93, 136, 153, 166, 91, 201, 29, 140, 236, 144, 234, 106, 50, 138, 36, 33, 107, 52, 167, 160, 51, 101, 242, 110, 6, 81, 162, 120, 126, 215, 193, 184, 107, 217, 98, 44, 234, 95, 80, 67, 77, 187, 165, 218, 234, 132, 59, 20, 209, 123, 206, 94, 77, 193, 5, 89, 241, 4, 105, 33, 201, 232, 182, 65, 221, 49, 119, 54, 18, 155, 108, 75, 218, 145, 150, 47, 209, 253, 61, 253, 149, 73, 144, 86, 146, 220, 125, 64, 111, 119, 203, 122, 231, 154, 245, 35, 19, 100, 65, 12, 24, 130, 20, 136, 191, 35, 81, 10, 25, 221, 76, 148, 12, 198, 93, 140, 97, 18, 115, 129, 192, 99, 114, 245, 82, 93, 11, 134, 17, 7, 75, 220, 182, 172, 71, 131, 40, 91, 118, 29, 72, 201, 144, 98, 107, 168, 131, 85, 137, 248, 89, 166, 226, 196, 2, 74, 168, 145, 12, 175, 123, 72, 119, 206, 187, 23, 177, 50, 81, 227, 56, 97, 146, 36, 178, 69, 102, 107, 104, 205, 134, 202, 140, 71, 230, 199, 163, 130, 24, 123, 14, 157, 208, 123, 207, 93, 29, 157, 32, 243, 10, 71, 215, 197, 198, 164, 235, 228, 133, 20, 50, 185, 101, 135, 227, 105, 212, 6, 51, 81, 50, 24, 119, 33, 204, 248, 35, 160, 120, 125, 111, 70, 47, 64, 111, 71, 119, 86, 88, 107, 87, 111, 115, 221, 161, 65, 148, 173, 123, 14, 165, 165, 186, 218, 76, 251, 225, 83, 153, 74, 21, 11, 24, 117, 144, 165, 231, 239, 127, 80, 119, 210, 189, 17, 150, 164, 108, 3, 73, 18, 217, 58, 30, 152, 37, 84, 124, 42, 58, 59, 216, 152, 63, 88, 148, 229, 196, 175, 241, 220, 227, 89, 67, 169, 147, 171, 86, 232, 229, 126, 201, 172, 225, 229, 210, 16, 6, 227, 46, 35, 72, 57, 58, 176, 136, 172, 180, 127, 66, 198, 104, 104, 245, 250, 36, 196, 193, 239, 168, 120, 31, 45, 110, 221, 167, 47, 101, 43, 214, 45, 56, 198, 181, 99, 193, 246, 180, 182, 11, 113, 243, 92, 76, 82, 158, 120, 179, 101, 88, 146, 100, 153, 54, 239, 218, 95, 249, 36, 57, 206, 80, 65, 94, 51, 119, 231, 94, 81, 154, 68, 27, 139, 191, 55, 99, 247, 85, 156, 241, 202, 96, 84, 54, 204, 130, 125, 173, 169, 41, 72, 150, 197, 119, 229, 37, 11, 16, 247, 74, 220, 54, 49, 234, 18, 92, 142, 119, 29, 65, 226, 186, 233, 94, 144, 85, 175, 171, 254, 160, 40, 215, 112, 169, 246, 232, 182, 10, 73, 186, 69, 115, 245, 246, 195, 39, 239, 14, 146, 156, 208, 179, 247, 88, 54, 178, 113, 139, 208, 25, 214, 252, 254, 223, 49, 94, 33, 182, 38, 25, 140, 10, 197, 44, 99, 84, 185, 67, 77, 15, 209, 194, 27, 71, 23, 249, 214, 189, 71, 166, 56, 65, 103, 242, 45, 129, 74, 17, 18, 232, 58, 121, 65, 119, 73, 118, 246, 145, 204, 145, 164, 84, 189, 52, 27, 94, 179, 49, 125, 183, 110, 64, 74, 127, 238, 132, 7, 35, 11, 33, 127, 100, 92, 107, 161, 166, 99, 28, 159, 100, 48, 42, 216, 122, 20, 22, 100, 48, 120, 85, 174, 89, 70, 59, 227, 0, 132, 193, 227, 83, 222, 235, 143, 71, 201, 153, 173, 29, 135, 79, 137, 76, 84, 219, 68, 4, 114, 2, 231, 89, 97, 77, 206, 187, 7, 146, 128, 41, 148, 221, 240, 189, 31, 165, 233, 181, 200, 120, 189, 150, 70, 201, 140, 92, 91, 163, 107, 225, 216, 138, 194, 152, 62, 131, 193, 152, 198, 176, 238, 122, 85, 191, 255, 127, 163, 88, 223, 219, 214, 9, 185, 51, 177, 64, 246, 242, 2, 121, 199, 146, 100, 235, 222, 195, 186, 115, 190, 232, 148, 50, 241, 164, 157, 220, 72, 27, 157, 48, 254, 91, 81, 213, 207, 65, 156, 129, 190, 35, 117, 87, 38, 69, 149, 76, 148, 70, 198, 235, 169, 139, 73, 149, 238, 131, 236, 112, 252, 210, 31, 139, 73, 108, 81, 50, 24, 21, 68, 144, 104, 1, 68, 11, 237, 71, 17, 91, 9, 62, 184, 54, 149, 75, 208, 121, 140, 9, 242, 142, 38, 201, 199, 245, 216, 246, 93, 67, 53, 146, 246, 144, 100, 92, 205, 89, 165, 255, 168, 180, 172, 94, 40, 75, 210, 147, 70, 171, 177, 36, 111, 152, 198, 78, 228, 105, 63, 124, 50, 225, 170, 173, 198, 252, 125, 221, 212, 24, 230, 140, 87, 6, 99, 122, 34, 175, 160, 163, 54, 55, 107, 244, 82, 255, 39, 74, 60, 132, 40, 248, 229, 71, 179, 253, 147, 173, 160, 195, 195, 22, 75, 50, 188, 126, 179, 238, 92, 112, 191, 157, 150, 100, 194, 32, 201, 247, 137, 103, 35, 210, 26, 146, 234, 235, 82, 90, 32, 168, 247, 156, 189, 146, 228, 141, 211, 216, 68, 217, 178, 251, 64, 78, 99, 216, 210, 48, 188, 138, 51, 94, 25, 140, 233, 3, 99, 103, 43, 118, 183, 238, 80, 116, 141, 220, 216, 240, 2, 10, 242, 91, 247, 28, 186, 41, 178, 25, 239, 214, 100, 152, 105, 40, 36, 16, 88, 241, 160, 238, 20, 125, 36, 53, 219, 72, 82, 203, 117, 18, 121, 109, 62, 70, 29, 142, 110, 133, 136, 132, 183, 189, 43, 75, 207, 69, 186, 226, 53, 113, 109, 216, 188, 136, 134, 225, 11, 239, 71, 230, 241, 31, 176, 53, 201, 96, 76, 35, 200, 178, 124, 127, 126, 241, 11, 69, 206, 66, 177, 70, 245, 122, 245, 142, 35, 167, 19, 156, 160, 51, 253, 22, 100, 104, 213, 162, 143, 167, 77, 137, 59, 89, 26, 73, 195, 146, 188, 142, 103, 164, 190, 190, 62, 39, 30, 31, 8, 93, 71, 172, 58, 180, 106, 93, 50, 223, 93, 133, 159, 147, 145, 51, 173, 47, 63, 154, 13, 14, 172, 78, 35, 166, 171, 5, 131, 231, 56, 62, 201, 96, 76, 15, 235, 49, 239, 242, 193, 14, 23, 238, 85, 52, 235, 237, 62, 125, 57, 85, 177, 141, 137, 43, 88, 72, 160, 231, 220, 35, 58, 145, 23, 18, 69, 236, 42, 255, 200, 96, 128, 36, 105, 51, 181, 71, 108, 164, 114, 25, 154, 226, 185, 81, 188, 222, 63, 133, 117, 20, 221, 186, 115, 104, 67, 197, 247, 162, 184, 53, 121, 249, 165, 66, 104, 31, 239, 23, 54, 162, 238, 80, 104, 141, 101, 62, 25, 12, 198, 157, 18, 119, 172, 170, 26, 204, 215, 62, 2, 46, 111, 112, 167, 236, 116, 126, 77, 186, 175, 74, 199, 78, 183, 247, 194, 53, 251, 123, 64, 242, 152, 154, 26, 201, 83, 23, 115, 46, 86, 123, 220, 172, 38, 73, 154, 127, 238, 195, 243, 98, 148, 6, 229, 55, 87, 46, 205, 253, 41, 87, 46, 227, 53, 193, 27, 171, 49, 74, 67, 32, 160, 126, 250, 82, 18, 158, 26, 185, 161, 254, 5, 37, 26, 117, 179, 69, 201, 96, 220, 33, 16, 139, 155, 37, 14, 226, 105, 106, 233, 117, 57, 157, 159, 130, 122, 14, 234, 31, 155, 119, 238, 75, 146, 53, 114, 119, 180, 148, 170, 212, 26, 201, 35, 167, 69, 39, 10, 151, 98, 91, 141, 164, 89, 254, 241, 2, 253, 116, 91, 72, 178, 170, 177, 177, 113, 142, 120, 142, 90, 6, 150, 145, 149, 249, 3, 197, 217, 168, 119, 28, 59, 147, 228, 26, 202, 49, 18, 121, 104, 126, 58, 143, 158, 137, 35, 230, 79, 243, 246, 95, 193, 129, 129, 121, 28, 163, 100, 48, 110, 47, 102, 90, 93, 58, 90, 71, 71, 128, 22, 189, 191, 149, 22, 205, 213, 85, 77, 211, 155, 30, 218, 158, 238, 57, 247, 72, 174, 64, 156, 227, 74, 211, 58, 139, 82, 212, 72, 46, 65, 95, 77, 205, 46, 146, 76, 25, 36, 249, 61, 90, 208, 23, 89, 22, 243, 97, 77, 133, 67, 29, 171, 106, 228, 250, 186, 31, 161, 27, 76, 207, 233, 203, 105, 209, 148, 153, 159, 163, 209, 51, 94, 247, 28, 142, 35, 188, 161, 104, 218, 199, 173, 239, 42, 47, 87, 12, 198, 20, 194, 234, 198, 241, 198, 98, 245, 170, 199, 243, 122, 231, 226, 249, 25, 165, 177, 94, 15, 173, 221, 148, 233, 58, 117, 81, 196, 30, 217, 122, 172, 140, 133, 55, 182, 125, 183, 208, 88, 85, 52, 251, 72, 210, 72, 218, 249, 55, 203, 99, 37, 44, 30, 34, 77, 31, 141, 109, 46, 77, 59, 78, 68, 122, 78, 209, 60, 255, 236, 188, 175, 74, 247, 245, 244, 167, 251, 239, 70, 113, 249, 114, 59, 214, 208, 166, 180, 105, 203, 142, 132, 200, 120, 245, 250, 222, 104, 204, 237, 172, 194, 13, 8, 131, 193, 152, 132, 184, 163, 213, 117, 211, 213, 53, 56, 71, 241, 120, 94, 41, 213, 44, 255, 133, 107, 249, 98, 61, 176, 98, 149, 222, 121, 252, 92, 28, 196, 152, 239, 181, 200, 4, 89, 17, 66, 2, 145, 13, 91, 114, 45, 178, 84, 219, 73, 242, 253, 86, 87, 171, 211, 233, 84, 232, 239, 126, 5, 79, 132, 139, 54, 92, 74, 125, 141, 14, 101, 25, 196, 48, 163, 91, 118, 86, 120, 207, 73, 251, 50, 94, 81, 127, 12, 161, 14, 100, 9, 107, 193, 224, 35, 28, 159, 100, 48, 38, 153, 28, 11, 95, 48, 205, 31, 60, 33, 213, 215, 125, 15, 105, 231, 190, 142, 110, 189, 253, 208, 137, 4, 189, 152, 105, 179, 246, 145, 173, 199, 10, 171, 145, 28, 88, 109, 183, 110, 171, 32, 73, 178, 20, 223, 104, 88, 143, 162, 92, 72, 146, 36, 23, 253, 221, 115, 46, 71, 163, 222, 178, 107, 255, 205, 238, 83, 151, 82, 93, 39, 47, 100, 123, 208, 168, 152, 239, 69, 233, 68, 9, 139, 251, 194, 245, 180, 183, 173, 51, 43, 154, 151, 71, 34, 155, 197, 123, 203, 25, 175, 12, 134, 189, 192, 14, 223, 106, 61, 106, 145, 230, 205, 114, 99, 195, 151, 176, 67, 245, 68, 155, 245, 150, 221, 7, 83, 244, 98, 166, 89, 24, 224, 14, 95, 52, 199, 115, 95, 204, 223, 161, 159, 222, 142, 46, 59, 107, 36, 69, 226, 142, 97, 73, 62, 110, 90, 57, 166, 53, 169, 120, 252, 171, 229, 250, 90, 221, 223, 187, 34, 107, 221, 120, 241, 40, 87, 12, 253, 49, 104, 34, 39, 145, 60, 39, 55, 212, 39, 161, 104, 196, 22, 37, 131, 97, 31, 102, 14, 19, 35, 143, 70, 123, 104, 65, 251, 136, 52, 239, 30, 145, 177, 26, 123, 120, 79, 162, 231, 252, 181, 204, 148, 182, 181, 98, 2, 30, 119, 9, 199, 184, 220, 148, 70, 13, 30, 106, 36, 181, 112, 83, 174, 143, 164, 98, 155, 144, 64, 198, 32, 201, 131, 86, 11, 39, 79, 148, 126, 255, 85, 105, 238, 44, 8, 10, 164, 242, 45, 180, 38, 251, 254, 87, 88, 120, 192, 140, 39, 67, 11, 23, 109, 232, 92, 178, 252, 20, 26, 155, 91, 231, 153, 193, 96, 140, 131, 28, 173, 150, 35, 234, 173, 20, 85, 125, 155, 180, 100, 129, 174, 202, 114, 46, 99, 245, 236, 213, 4, 146, 3, 114, 154, 171, 215, 167, 196, 117, 148, 95, 232, 153, 248, 202, 38, 185, 174, 83, 23, 145, 72, 149, 41, 151, 40, 77, 107, 4, 53, 146, 72, 216, 145, 209, 75, 210, 30, 33, 129, 172, 232, 37, 73, 199, 146, 101, 121, 160, 136, 27, 80, 212, 218, 42, 62, 223, 155, 161, 75, 26, 219, 190, 59, 62, 233, 130, 2, 230, 102, 162, 194, 172, 86, 122, 63, 179, 34, 59, 121, 223, 145, 132, 188, 108, 145, 78, 239, 242, 167, 243, 179, 204, 165, 33, 12, 198, 248, 45, 71, 173, 175, 111, 57, 45, 140, 175, 113, 46, 95, 146, 86, 26, 234, 244, 208, 234, 245, 180, 88, 94, 74, 208, 34, 146, 205, 47, 182, 83, 176, 179, 199, 119, 117, 159, 190, 164, 123, 187, 122, 211, 77, 91, 118, 100, 152, 40, 203, 43, 48, 239, 60, 126, 62, 227, 146, 37, 221, 37, 73, 176, 40, 210, 185, 238, 26, 215, 203, 58, 6, 106, 36, 133, 21, 9, 130, 179, 145, 36, 161, 221, 74, 68, 233, 41, 98, 217, 88, 4, 5, 180, 207, 186, 150, 47, 209, 219, 15, 30, 191, 57, 105, 130, 2, 249, 166, 210, 23, 179, 237, 135, 78, 165, 42, 53, 227, 53, 186, 109, 48, 46, 47, 156, 163, 171, 30, 223, 91, 44, 155, 17, 46, 13, 97, 48, 198, 130, 117, 23, 223, 53, 56, 56, 71, 245, 135, 110, 72, 203, 151, 254, 194, 85, 179, 76, 247, 247, 13, 232, 29, 71, 207, 164, 104, 177, 204, 76, 25, 57, 14, 203, 210, 123, 169, 80, 235, 113, 206, 174, 210, 157, 244, 130, 183, 238, 61, 156, 102, 245, 149, 210, 172, 111, 180, 32, 67, 175, 78, 169, 122, 217, 243, 178, 211, 241, 162, 234, 15, 232, 221, 103, 46, 151, 220, 150, 44, 95, 35, 185, 239, 72, 46, 105, 7, 4, 105, 147, 36, 157, 81, 35, 249, 19, 179, 70, 178, 202, 162, 212, 100, 37, 77, 181, 187, 187, 218, 229, 116, 254, 4, 159, 239, 58, 121, 33, 153, 207, 154, 182, 217, 218, 238, 57, 119, 53, 171, 133, 35, 122, 99, 85, 149, 222, 188, 99, 111, 186, 18, 91, 117, 65, 7, 55, 180, 122, 67, 18, 214, 185, 22, 8, 61, 206, 110, 87, 6, 99, 108, 204, 182, 46, 78, 74, 32, 124, 84, 106, 168, 253, 54, 234, 171, 124, 29, 93, 122, 219, 129, 99, 9, 136, 39, 11, 23, 212, 20, 199, 107, 134, 90, 1, 29, 20, 47, 181, 26, 12, 191, 133, 172, 161, 47, 163, 52, 192, 176, 104, 57, 70, 57, 186, 74, 78, 54, 178, 105, 123, 82, 94, 112, 63, 230, 238, 164, 26, 108, 90, 41, 211, 166, 7, 34, 229, 208, 249, 44, 165, 40, 63, 95, 35, 185, 99, 175, 238, 92, 60, 207, 206, 242, 15, 147, 36, 255, 221, 242, 44, 206, 24, 105, 243, 166, 133, 195, 93, 80, 251, 113, 199, 90, 244, 222, 243, 215, 210, 118, 151, 129, 224, 120, 193, 85, 235, 116, 231, 210, 69, 105, 197, 237, 249, 177, 92, 87, 3, 229, 154, 180, 237, 132, 124, 39, 108, 156, 46, 209, 198, 169, 179, 39, 43, 47, 95, 140, 140, 215, 157, 152, 95, 78, 228, 97, 48, 134, 99, 134, 65, 140, 67, 228, 232, 15, 111, 164, 221, 250, 23, 224, 138, 241, 68, 162, 32, 166, 4, 218, 20, 153, 73, 57, 83, 190, 80, 152, 110, 214, 51, 87, 18, 170, 199, 171, 203, 206, 198, 239, 136, 197, 50, 210, 220, 41, 147, 69, 227, 235, 234, 197, 231, 210, 125, 151, 184, 176, 188, 88, 231, 122, 209, 144, 247, 224, 137, 132, 171, 122, 41, 98, 137, 31, 204, 147, 78, 48, 124, 21, 74, 44, 100, 153, 167, 104, 238, 198, 238, 174, 97, 182, 98, 218, 180, 205, 110, 33, 1, 51, 179, 245, 195, 197, 172, 72, 139, 203, 117, 86, 190, 51, 72, 48, 120, 18, 229, 70, 129, 21, 171, 178, 216, 184, 217, 209, 66, 203, 170, 80, 3, 141, 88, 69, 243, 252, 145, 175, 179, 83, 150, 235, 107, 146, 238, 166, 24, 54, 19, 169, 254, 10, 106, 213, 213, 107, 188, 87, 61, 103, 175, 164, 181, 80, 88, 151, 234, 107, 51, 90, 164, 165, 185, 72, 76, 152, 193, 184, 59, 129, 132, 28, 107, 82, 142, 175, 185, 163, 197, 37, 59, 63, 140, 164, 28, 205, 235, 211, 99, 219, 118, 65, 132, 92, 184, 180, 250, 204, 70, 200, 183, 107, 129, 184, 242, 210, 76, 96, 229, 154, 12, 206, 205, 19, 139, 173, 54, 207, 89, 245, 7, 95, 14, 50, 135, 162, 8, 172, 37, 118, 187, 22, 91, 4, 175, 166, 33, 227, 38, 55, 54, 60, 227, 234, 232, 168, 193, 188, 153, 122, 168, 170, 47, 240, 90, 88, 151, 68, 124, 241, 82, 172, 113, 97, 101, 61, 184, 54, 39, 73, 167, 185, 237, 22, 18, 248, 211, 17, 92, 126, 69, 227, 100, 90, 184, 233, 183, 229, 234, 101, 122, 116, 203, 142, 212, 132, 149, 119, 242, 73, 73, 151, 18, 240, 78, 200, 78, 231, 183, 189, 61, 91, 230, 139, 239, 9, 133, 142, 99, 51, 17, 90, 189, 62, 37, 90, 117, 85, 82, 198, 235, 133, 235, 57, 141, 215, 227, 231, 146, 138, 44, 235, 178, 36, 253, 72, 139, 197, 150, 179, 69, 201, 184, 219, 49, 92, 99, 181, 187, 91, 117, 169, 234, 91, 164, 197, 243, 116, 149, 22, 173, 240, 198, 45, 25, 218, 93, 166, 250, 175, 62, 62, 180, 67, 191, 77, 11, 195, 208, 238, 254, 80, 66, 94, 76, 214, 139, 215, 251, 71, 150, 157, 174, 112, 201, 41, 170, 250, 113, 196, 75, 33, 96, 32, 226, 147, 23, 184, 171, 72, 1, 169, 137, 222, 130, 74, 168, 233, 97, 203, 226, 151, 39, 30, 197, 237, 121, 31, 92, 216, 205, 59, 247, 197, 71, 140, 239, 154, 5, 233, 244, 19, 150, 187, 180, 124, 169, 157, 36, 105, 246, 145, 124, 69, 145, 197, 121, 150, 113, 191, 131, 232, 51, 41, 215, 215, 255, 186, 92, 83, 253, 38, 231, 242, 101, 111, 151, 106, 150, 127, 2, 22, 173, 115, 254, 125, 136, 79, 102, 39, 234, 118, 237, 191, 252, 146, 180, 175, 187, 79, 151, 150, 45, 214, 33, 202, 63, 108, 51, 225, 241, 252, 57, 136, 178, 101, 247, 1, 163, 3, 201, 245, 138, 218, 76, 225, 154, 218, 14, 28, 143, 187, 114, 2, 17, 159, 27, 154, 254, 193, 89, 188, 92, 50, 238, 58, 130, 204, 91, 142, 237, 237, 75, 85, 175, 247, 85, 210, 178, 133, 113, 200, 125, 5, 87, 173, 203, 118, 157, 200, 37, 67, 220, 17, 26, 171, 67, 238, 160, 148, 104, 249, 227, 116, 60, 217, 216, 213, 53, 199, 92, 60, 77, 43, 216, 223, 210, 82, 71, 86, 210, 47, 181, 64, 72, 88, 77, 172, 15, 107, 217, 92, 236, 58, 24, 7, 1, 210, 230, 226, 141, 150, 184, 115, 222, 147, 96, 254, 116, 41, 202, 87, 176, 209, 104, 59, 120, 188, 120, 27, 42, 145, 208, 146, 235, 35, 233, 110, 106, 214, 165, 186, 218, 201, 208, 109, 61, 84, 64, 146, 67, 89, 173, 46, 215, 255, 115, 187, 53, 221, 29, 8, 234, 158, 96, 72, 247, 70, 99, 186, 159, 200, 26, 241, 180, 166, 135, 182, 79, 108, 19, 151, 203, 246, 204, 70, 183, 239, 74, 200, 11, 238, 211, 181, 64, 224, 215, 45, 243, 35, 72, 162, 229, 212, 169, 123, 92, 78, 231, 127, 42, 46, 121, 114, 18, 134, 238, 132, 140, 87, 196, 155, 31, 222, 29, 199, 28, 40, 30, 223, 219, 44, 225, 24, 214, 120, 101, 220, 53, 48, 119, 133, 51, 85, 183, 239, 186, 92, 87, 251, 83, 236, 142, 253, 189, 43, 68, 75, 29, 184, 146, 108, 75, 202, 153, 232, 49, 204, 108, 86, 72, 160, 61, 184, 54, 131, 154, 46, 53, 24, 89, 95, 24, 47, 49, 23, 84, 53, 28, 221, 6, 107, 9, 153, 175, 34, 70, 117, 39, 138, 13, 76, 213, 249, 24, 177, 195, 174, 147, 23, 19, 10, 72, 72, 146, 190, 25, 28, 28, 188, 183, 152, 235, 210, 116, 109, 98, 163, 65, 36, 240, 51, 144, 64, 231, 137, 243, 201, 91, 178, 57, 205, 184, 240, 169, 75, 180, 128, 122, 68, 179, 101, 187, 19, 119, 36, 73, 90, 105, 37, 111, 99, 113, 206, 53, 93, 214, 60, 191, 143, 150, 79, 244, 172, 62, 215, 123, 238, 145, 120, 239, 133, 107, 52, 174, 39, 205, 103, 100, 66, 49, 91, 186, 214, 142, 163, 103, 146, 174, 134, 122, 156, 203, 255, 45, 124, 95, 242, 153, 181, 205, 205, 45, 18, 109, 36, 188, 109, 29, 152, 143, 116, 95, 5, 197, 39, 173, 158, 135, 240, 250, 135, 18, 162, 52, 196, 31, 252, 141, 17, 220, 223, 12, 70, 69, 19, 100, 149, 226, 118, 127, 84, 169, 171, 209, 61, 45, 237, 200, 88, 77, 210, 139, 145, 178, 91, 99, 85, 88, 163, 19, 144, 166, 27, 106, 201, 116, 36, 238, 2, 65, 122, 60, 127, 60, 210, 11, 155, 95, 196, 124, 190, 215, 34, 19, 55, 182, 99, 111, 252, 142, 72, 217, 55, 93, 148, 151, 94, 2, 210, 206, 78, 113, 210, 71, 218, 219, 209, 141, 114, 15, 221, 29, 105, 233, 24, 45, 198, 100, 254, 189, 55, 214, 222, 42, 213, 215, 102, 145, 196, 65, 22, 121, 106, 152, 69, 110, 214, 89, 30, 59, 155, 171, 145, 68, 179, 101, 251, 212, 118, 204, 166, 203, 222, 34, 137, 59, 121, 43, 134, 136, 242, 47, 241, 220, 70, 183, 13, 146, 181, 251, 50, 125, 194, 137, 90, 102, 134, 231, 133, 235, 25, 79, 172, 85, 151, 235, 107, 19, 35, 53, 39, 54, 255, 95, 9, 69, 46, 131, 64, 34, 27, 183, 36, 250, 175, 60, 86, 81, 241, 73, 139, 75, 61, 235, 235, 238, 207, 136, 140, 215, 80, 232, 0, 39, 242, 48, 238, 6, 228, 187, 117, 168, 30, 223, 235, 92, 203, 22, 234, 145, 135, 182, 199, 105, 209, 78, 217, 170, 177, 122, 209, 248, 73, 47, 90, 116, 235, 206, 84, 211, 230, 135, 83, 214, 88, 214, 56, 220, 172, 57, 157, 201, 198, 134, 167, 34, 107, 215, 206, 29, 37, 137, 195, 234, 150, 251, 55, 180, 231, 162, 197, 60, 113, 91, 93, 98, 67, 18, 110, 89, 104, 142, 122, 59, 123, 16, 231, 205, 150, 90, 147, 56, 209, 102, 187, 77, 91, 118, 228, 234, 223, 124, 129, 199, 75, 73, 194, 48, 255, 221, 29, 137, 236, 64, 198, 176, 183, 163, 43, 51, 204, 90, 50, 72, 146, 54, 85, 186, 147, 44, 118, 161, 217, 106, 111, 141, 228, 211, 141, 141, 141, 75, 10, 137, 241, 150, 251, 171, 40, 31, 145, 30, 152, 169, 55, 239, 220, 123, 115, 194, 247, 215, 184, 166, 240, 250, 45, 52, 87, 115, 69, 105, 204, 40, 115, 53, 51, 31, 3, 215, 60, 239, 66, 3, 241, 214, 125, 199, 226, 149, 86, 163, 107, 38, 123, 145, 181, 158, 118, 71, 162, 58, 202, 95, 80, 114, 195, 68, 201, 168, 104, 152, 47, 189, 22, 106, 58, 104, 164, 252, 167, 105, 177, 206, 228, 51, 86, 237, 142, 107, 108, 223, 149, 114, 206, 172, 210, 29, 85, 85, 144, 173, 75, 141, 167, 134, 17, 231, 23, 92, 181, 46, 131, 134, 205, 238, 104, 116, 211, 88, 110, 159, 252, 34, 31, 106, 246, 75, 181, 213, 41, 15, 106, 232, 46, 92, 79, 223, 206, 148, 125, 163, 88, 59, 235, 152, 85, 165, 35, 43, 23, 133, 252, 189, 23, 174, 101, 38, 43, 102, 106, 150, 123, 116, 28, 62, 149, 68, 140, 153, 8, 229, 159, 138, 17, 205, 72, 27, 41, 115, 126, 137, 88, 31, 115, 45, 158, 135, 24, 117, 166, 223, 112, 93, 155, 106, 59, 205, 131, 251, 117, 231, 252, 123, 117, 197, 237, 182, 187, 217, 242, 215, 71, 139, 125, 21, 196, 79, 191, 4, 247, 59, 188, 12, 227, 37, 169, 97, 201, 42, 72, 106, 114, 187, 223, 57, 214, 60, 229, 117, 100, 91, 90, 22, 202, 78, 199, 15, 208, 178, 171, 251, 244, 229, 212, 100, 111, 124, 110, 151, 58, 19, 98, 175, 66, 42, 208, 209, 248, 115, 244, 136, 101, 215, 43, 163, 34, 97, 62, 212, 190, 150, 150, 48, 145, 71, 70, 212, 123, 209, 46, 177, 223, 102, 130, 28, 90, 116, 142, 37, 144, 33, 167, 120, 189, 31, 83, 3, 129, 119, 33, 35, 181, 156, 197, 204, 162, 234, 146, 112, 161, 204, 192, 235, 125, 179, 197, 5, 55, 106, 2, 129, 185, 211, 205, 213, 208, 45, 16, 205, 158, 133, 75, 236, 118, 37, 205, 236, 62, 120, 211, 181, 112, 142, 174, 248, 131, 127, 68, 243, 126, 70, 180, 17, 235, 234, 205, 64, 249, 6, 86, 166, 237, 74, 49, 176, 190, 207, 95, 163, 123, 76, 22, 64, 125, 221, 79, 195, 189, 155, 22, 23, 113, 95, 142, 134, 60, 65, 168, 254, 224, 239, 74, 116, 238, 209, 205, 15, 167, 205, 77, 14, 200, 160, 105, 243, 195, 186, 99, 238, 108, 34, 21, 143, 93, 36, 153, 48, 146, 118, 62, 58, 22, 73, 153, 27, 161, 96, 176, 107, 137, 75, 150, 191, 131, 24, 101, 251, 225, 147, 229, 103, 52, 91, 61, 21, 62, 191, 46, 53, 54, 252, 12, 74, 62, 165, 204, 149, 121, 14, 158, 112, 120, 53, 196, 24, 144, 13, 107, 184, 211, 43, 82, 12, 189, 237, 208, 137, 56, 18, 186, 144, 216, 101, 221, 168, 88, 226, 197, 133, 99, 214, 56, 198, 236, 34, 195, 250, 239, 156, 56, 196, 152, 52, 136, 135, 186, 171, 171, 107, 142, 44, 75, 255, 165, 72, 78, 81, 15, 149, 115, 83, 93, 159, 180, 157, 167, 72, 0, 105, 89, 189, 16, 4, 77, 139, 217, 119, 21, 167, 3, 154, 161, 99, 187, 63, 173, 197, 205, 112, 179, 58, 27, 191, 163, 117, 116, 44, 40, 72, 230, 24, 29, 131, 185, 148, 117, 197, 227, 253, 83, 144, 82, 235, 158, 67, 169, 169, 116, 137, 89, 52, 82, 19, 138, 211, 137, 216, 221, 55, 180, 13, 27, 114, 74, 49, 161, 208, 19, 104, 41, 22, 232, 127, 16, 122, 160, 153, 201, 72, 252, 64, 45, 159, 171, 102, 185, 174, 133, 34, 191, 37, 215, 214, 202, 146, 164, 197, 138, 197, 247, 138, 89, 146, 248, 143, 76, 80, 28, 142, 54, 89, 243, 173, 160, 57, 124, 74, 90, 248, 0, 172, 71, 33, 93, 135, 243, 133, 102, 175, 115, 193, 253, 34, 121, 71, 196, 37, 39, 78, 146, 113, 13, 117, 137, 178, 252, 230, 82, 72, 202, 44, 201, 112, 55, 55, 251, 133, 180, 30, 17, 108, 231, 137, 243, 41, 184, 152, 203, 154, 203, 203, 143, 102, 130, 43, 215, 32, 102, 155, 213, 98, 237, 93, 37, 206, 209, 112, 139, 50, 24, 188, 34, 209, 92, 96, 35, 145, 239, 126, 83, 129, 25, 210, 40, 13, 18, 25, 210, 30, 239, 187, 202, 240, 76, 76, 74, 184, 136, 193, 176, 19, 195, 99, 40, 100, 89, 161, 214, 208, 246, 26, 47, 35, 246, 6, 53, 18, 119, 180, 69, 151, 106, 105, 129, 142, 52, 119, 154, 39, 225, 13, 53, 71, 164, 186, 218, 180, 59, 220, 148, 179, 96, 199, 170, 101, 19, 11, 241, 134, 44, 98, 33, 106, 56, 188, 109, 28, 47, 100, 46, 246, 26, 137, 132, 92, 146, 244, 172, 146, 91, 68, 51, 83, 210, 193, 222, 154, 8, 210, 220, 170, 195, 114, 247, 4, 99, 77, 6, 249, 136, 38, 194, 170, 47, 240, 106, 36, 126, 4, 87, 173, 79, 228, 178, 112, 109, 34, 74, 163, 60, 3, 122, 172, 141, 85, 85, 25, 231, 178, 197, 41, 151, 75, 214, 141, 70, 198, 143, 140, 65, 64, 98, 126, 37, 73, 242, 19, 241, 189, 32, 138, 233, 137, 104, 165, 154, 229, 25, 104, 151, 70, 183, 236, 208, 77, 107, 18, 150, 147, 19, 221, 35, 220, 182, 147, 228, 175, 89, 239, 223, 8, 247, 117, 216, 249, 171, 205, 93, 154, 92, 91, 243, 83, 148, 254, 116, 157, 190, 84, 210, 61, 182, 168, 234, 100, 16, 14, 160, 103, 228, 123, 116, 159, 110, 184, 84, 245, 162, 211, 233, 12, 140, 241, 188, 153, 127, 63, 139, 206, 119, 157, 166, 249, 59, 21, 175, 239, 43, 46, 218, 4, 182, 31, 56, 158, 154, 146, 103, 236, 54, 244, 29, 21, 42, 75, 27, 182, 38, 229, 69, 115, 116, 53, 16, 120, 245, 136, 46, 241, 39, 158, 152, 189, 225, 226, 197, 251, 34, 7, 15, 206, 109, 25, 28, 92, 232, 25, 216, 188, 44, 56, 176, 177, 54, 216, 187, 218, 25, 234, 238, 86, 61, 93, 93, 62, 111, 71, 71, 4, 9, 98, 106, 180, 181, 71, 109, 106, 90, 137, 140, 117, 45, 16, 216, 170, 121, 3, 187, 92, 30, 207, 65, 186, 15, 39, 113, 47, 20, 73, 122, 132, 158, 141, 223, 80, 253, 193, 61, 133, 158, 34, 6, 195, 86, 55, 171, 234, 247, 191, 76, 100, 227, 109, 216, 2, 11, 210, 222, 108, 60, 243, 88, 180, 216, 35, 206, 137, 120, 167, 230, 15, 29, 55, 221, 82, 230, 67, 173, 4, 35, 123, 17, 67, 242, 247, 174, 204, 140, 36, 127, 150, 239, 48, 113, 244, 140, 238, 184, 191, 74, 119, 46, 158, 255, 60, 189, 36, 95, 161, 5, 254, 173, 38, 193, 140, 69, 150, 249, 29, 190, 195, 209, 74, 47, 218, 47, 101, 201, 153, 134, 198, 40, 29, 83, 36, 204, 76, 238, 2, 118, 35, 159, 213, 27, 94, 187, 49, 5, 139, 81, 9, 132, 206, 88, 92, 116, 249, 77, 139, 234, 243, 189, 9, 42, 55, 72, 181, 183, 179, 55, 34, 142, 213, 113, 228, 20, 90, 73, 137, 216, 161, 22, 12, 37, 84, 34, 74, 154, 139, 151, 143, 65, 146, 57, 235, 91, 81, 90, 133, 39, 64, 114, 162, 63, 104, 178, 237, 192, 113, 196, 236, 160, 143, 154, 75, 230, 160, 159, 238, 168, 237, 53, 146, 66, 72, 128, 238, 241, 209, 81, 72, 114, 200, 186, 211, 245, 25, 162, 35, 77, 44, 214, 234, 10, 68, 250, 212, 64, 240, 221, 112, 11, 123, 219, 58, 83, 230, 61, 40, 197, 213, 218, 121, 252, 28, 109, 230, 162, 25, 213, 235, 19, 181, 151, 238, 220, 245, 252, 199, 104, 22, 165, 249, 124, 209, 231, 206, 107, 136, 201, 210, 38, 193, 185, 124, 201, 243, 245, 116, 86, 168, 215, 236, 187, 92, 129, 178, 136, 150, 12, 109, 127, 223, 74, 221, 57, 119, 54, 60, 69, 239, 151, 170, 151, 190, 211, 89, 189, 244, 195, 210, 178, 69, 31, 119, 46, 89, 240, 25, 231, 146, 249, 159, 119, 44, 124, 224, 43, 206, 5, 247, 127, 195, 57, 255, 190, 111, 59, 230, 206, 122, 202, 249, 192, 204, 31, 59, 30, 152, 249, 115, 231, 253, 51, 158, 117, 220, 63, 227, 69, 199, 156, 153, 41, 199, 3, 179, 178, 56, 134, 115, 222, 61, 58, 172, 112, 228, 28, 96, 221, 192, 250, 32, 220, 186, 180, 57, 70, 151, 33, 149, 158, 65, 149, 54, 31, 72, 34, 83, 52, 247, 91, 189, 61, 61, 243, 45, 239, 18, 187, 95, 25, 54, 37, 234, 52, 53, 173, 19, 218, 166, 120, 129, 161, 109, 106, 183, 123, 111, 40, 147, 50, 33, 68, 199, 189, 190, 215, 22, 196, 44, 44, 100, 29, 252, 93, 33, 31, 247, 208, 246, 226, 98, 228, 67, 86, 24, 145, 204, 38, 221, 215, 213, 151, 193, 226, 165, 42, 162, 207, 96, 235, 24, 86, 198, 176, 235, 86, 60, 158, 141, 112, 45, 195, 178, 237, 36, 130, 44, 187, 84, 192, 210, 179, 178, 236, 146, 149, 61, 135, 110, 202, 75, 230, 193, 210, 250, 235, 34, 196, 148, 255, 51, 17, 229, 219, 80, 174, 18, 121, 104, 91, 194, 182, 12, 99, 163, 224, 127, 224, 198, 43, 245, 230, 93, 7, 226, 162, 177, 174, 162, 252, 165, 101, 209, 159, 57, 86, 98, 140, 226, 245, 30, 195, 66, 69, 247, 32, 189, 226, 218, 203, 242, 77, 180, 113, 220, 238, 51, 151, 115, 53, 146, 180, 120, 185, 84, 251, 154, 45, 131, 152, 105, 172, 30, 129, 200, 77, 2, 223, 79, 215, 242, 49, 169, 174, 250, 203, 142, 121, 247, 252, 212, 177, 224, 254, 148, 68, 207, 156, 220, 80, 47, 44, 246, 208, 218, 141, 122, 89, 36, 133, 103, 141, 72, 191, 231, 236, 213, 108, 96, 197, 170, 231, 196, 226, 236, 241, 88, 231, 106, 68, 146, 164, 115, 217, 1, 9, 55, 16, 108, 116, 235, 78, 225, 249, 104, 63, 120, 194, 120, 94, 110, 84, 36, 81, 138, 48, 200, 185, 71, 178, 222, 246, 174, 140, 27, 98, 14, 205, 173, 186, 175, 181, 93, 247, 119, 116, 11, 81, 135, 64, 207, 10, 61, 184, 226, 65, 29, 46, 236, 208, 170, 117, 216, 40, 234, 145, 245, 15, 97, 115, 142, 119, 94, 120, 35, 162, 91, 7, 115, 27, 184, 157, 123, 197, 38, 174, 101, 247, 193, 108, 235, 190, 35, 153, 182, 253, 71, 211, 237, 7, 78, 164, 208, 150, 172, 227, 200, 233, 36, 109, 106, 19, 8, 87, 116, 157, 188, 112, 51, 188, 238, 161, 20, 214, 22, 151, 195, 241, 20, 226, 192, 133, 207, 43, 131, 81, 54, 204, 135, 71, 235, 232, 104, 148, 29, 141, 191, 164, 197, 24, 139, 91, 210, 110, 87, 144, 153, 73, 217, 186, 247, 104, 92, 52, 111, 213, 180, 143, 143, 16, 175, 200, 47, 54, 46, 143, 231, 31, 176, 107, 108, 219, 119, 100, 212, 94, 128, 168, 129, 235, 56, 118, 38, 33, 22, 121, 85, 125, 123, 57, 241, 34, 115, 81, 165, 197, 247, 47, 84, 89, 66, 239, 195, 242, 92, 204, 6, 65, 98, 65, 232, 62, 115, 37, 83, 74, 118, 108, 62, 38, 123, 226, 130, 176, 220, 100, 73, 122, 82, 30, 24, 24, 201, 250, 29, 34, 74, 175, 247, 67, 174, 69, 115, 176, 208, 166, 237, 16, 113, 48, 117, 56, 91, 247, 28, 17, 125, 2, 201, 58, 251, 191, 197, 190, 119, 148, 152, 100, 174, 112, 223, 237, 254, 3, 233, 222, 42, 148, 9, 9, 75, 23, 199, 53, 173, 47, 57, 87, 112, 111, 87, 249, 71, 218, 36, 75, 200, 206, 141, 182, 169, 160, 207, 252, 64, 163, 207, 250, 104, 81, 198, 226, 27, 221, 178, 147, 174, 243, 112, 22, 189, 45, 33, 112, 80, 246, 188, 153, 241, 182, 29, 123, 111, 42, 245, 181, 186, 75, 211, 222, 91, 202, 115, 150, 223, 76, 104, 218, 111, 131, 88, 17, 175, 27, 184, 254, 10, 189, 34, 173, 200, 226, 155, 216, 108, 207, 133, 107, 9, 122, 230, 19, 189, 151, 110, 36, 250, 46, 191, 4, 97, 131, 68, 223, 21, 140, 151, 98, 195, 135, 103, 6, 94, 43, 115, 32, 39, 32, 55, 174, 62, 150, 206, 141, 199, 211, 253, 143, 60, 158, 17, 3, 253, 104, 135, 15, 221, 84, 252, 130, 247, 7, 25, 226, 173, 251, 142, 198, 85, 108, 206, 104, 195, 175, 122, 253, 175, 42, 216, 20, 115, 255, 75, 70, 217, 113, 200, 220, 162, 162, 40, 159, 115, 213, 86, 235, 237, 135, 78, 38, 236, 78, 92, 25, 150, 156, 130, 238, 244, 78, 231, 83, 202, 234, 213, 11, 141, 85, 100, 246, 72, 11, 11, 92, 38, 46, 34, 16, 36, 242, 116, 157, 56, 31, 31, 37, 145, 39, 67, 214, 175, 46, 85, 47, 141, 171, 205, 205, 154, 213, 74, 44, 117, 14, 60, 3, 3, 203, 164, 154, 165, 207, 184, 35, 77, 100, 49, 60, 82, 90, 41, 136, 185, 16, 144, 133, 225, 105, 235, 200, 130, 16, 218, 15, 159, 202, 140, 218, 152, 216, 216, 101, 247, 93, 188, 158, 134, 56, 131, 179, 122, 217, 243, 222, 230, 230, 136, 213, 242, 40, 146, 93, 52, 36, 236, 160, 185, 223, 33, 45, 184, 79, 111, 126, 120, 79, 46, 249, 100, 162, 229, 31, 180, 11, 119, 57, 26, 16, 107, 251, 110, 116, 96, 96, 209, 232, 231, 81, 124, 131, 97, 156, 215, 71, 68, 226, 19, 50, 147, 233, 188, 16, 119, 134, 181, 148, 19, 54, 215, 236, 46, 255, 120, 90, 85, 213, 234, 209, 54, 21, 170, 199, 119, 193, 85, 87, 171, 7, 86, 172, 78, 208, 249, 164, 96, 229, 138, 158, 166, 102, 211, 239, 113, 120, 64, 98, 59, 246, 38, 228, 185, 179, 232, 251, 149, 79, 151, 177, 153, 24, 122, 199, 36, 233, 51, 232, 172, 130, 12, 219, 254, 171, 149, 165, 231, 58, 70, 120, 101, 104, 148, 171, 192, 53, 142, 129, 231, 154, 54, 250, 41, 127, 223, 64, 22, 86, 37, 109, 254, 254, 77, 109, 109, 13, 153, 247, 131, 173, 74, 70, 169, 152, 97, 102, 118, 210, 130, 242, 38, 60, 76, 177, 135, 119, 219, 78, 144, 38, 41, 16, 241, 164, 80, 108, 44, 209, 110, 218, 29, 141, 70, 199, 90, 140, 243, 169, 243, 193, 88, 147, 76, 59, 119, 252, 110, 239, 185, 171, 195, 18, 121, 204, 133, 190, 101, 215, 129, 36, 44, 78, 197, 227, 123, 162, 76, 130, 28, 30, 143, 141, 68, 14, 203, 243, 239, 213, 155, 54, 109, 47, 45, 30, 155, 47, 46, 223, 156, 117, 230, 92, 121, 217, 92, 99, 226, 43, 99, 37, 133, 100, 195, 235, 31, 74, 67, 161, 132, 44, 247, 215, 143, 96, 81, 23, 79, 148, 113, 185, 78, 16, 33, 125, 31, 137, 50, 116, 221, 233, 82, 250, 58, 142, 116, 222, 88, 72, 68, 86, 112, 125, 93, 214, 19, 203, 37, 12, 149, 59, 119, 249, 50, 139, 174, 174, 37, 100, 17, 255, 64, 100, 68, 31, 59, 147, 28, 184, 241, 10, 225, 34, 115, 204, 187, 199, 206, 164, 29, 179, 252, 227, 235, 197, 244, 90, 11, 45, 59, 122, 30, 126, 11, 247, 51, 180, 122, 125, 210, 12, 29, 228, 158, 237, 27, 101, 197, 142, 225, 169, 104, 221, 125, 48, 133, 77, 0, 54, 147, 131, 198, 123, 83, 198, 102, 34, 183, 233, 107, 111, 119, 73, 245, 117, 47, 186, 67, 17, 120, 30, 42, 47, 113, 231, 14, 19, 56, 64, 238, 67, 108, 199, 30, 17, 70, 144, 106, 150, 101, 21, 127, 232, 114, 225, 115, 203, 96, 140, 136, 124, 67, 218, 96, 240, 132, 16, 12, 120, 112, 109, 174, 173, 207, 100, 60, 184, 151, 31, 205, 32, 136, 47, 45, 93, 164, 171, 161, 166, 237, 214, 239, 31, 13, 102, 2, 142, 22, 106, 90, 139, 206, 246, 129, 254, 7, 133, 4, 150, 233, 42, 204, 151, 127, 4, 130, 168, 93, 251, 47, 203, 14, 113, 102, 217, 27, 134, 161, 14, 33, 31, 132, 91, 172, 243, 216, 217, 81, 91, 65, 13, 175, 11, 19, 29, 46, 254, 202, 211, 218, 177, 17, 174, 100, 95, 79, 127, 182, 95, 244, 171, 44, 136, 27, 90, 244, 76, 37, 90, 112, 157, 139, 231, 39, 104, 209, 133, 188, 218, 63, 90, 22, 220, 25, 197, 22, 124, 154, 175, 5, 244, 185, 95, 136, 76, 210, 198, 198, 23, 28, 247, 84, 33, 182, 134, 226, 116, 189, 236, 197, 22, 238, 225, 243, 143, 100, 188, 237, 157, 56, 70, 220, 211, 214, 221, 54, 98, 226, 75, 137, 86, 146, 32, 129, 53, 107, 234, 229, 198, 134, 167, 53, 34, 1, 8, 51, 68, 183, 13, 138, 164, 42, 59, 51, 91, 141, 164, 157, 143, 143, 113, 174, 67, 73, 79, 94, 239, 95, 32, 150, 219, 180, 101, 71, 188, 108, 145, 10, 227, 126, 181, 238, 59, 154, 113, 53, 214, 235, 46, 205, 253, 223, 106, 91, 155, 99, 92, 27, 82, 3, 180, 25, 217, 128, 238, 57, 129, 129, 213, 89, 180, 115, 155, 72, 210, 23, 143, 209, 137, 50, 23, 138, 121, 92, 120, 176, 60, 173, 237, 58, 84, 146, 20, 213, 253, 1, 75, 141, 235, 236, 170, 210, 107, 130, 25, 119, 99, 162, 14, 50, 254, 176, 208, 26, 106, 51, 246, 55, 136, 21, 22, 203, 227, 8, 194, 167, 157, 247, 209, 98, 233, 243, 127, 100, 121, 85, 213, 188, 114, 22, 96, 69, 81, 22, 210, 120, 216, 229, 82, 158, 68, 121, 1, 106, 240, 132, 59, 83, 144, 36, 82, 205, 183, 164, 145, 248, 226, 14, 70, 118, 148, 185, 187, 47, 190, 105, 136, 197, 2, 82, 109, 77, 6, 106, 55, 35, 138, 82, 15, 37, 38, 36, 161, 91, 74, 22, 228, 207, 131, 109, 3, 181, 98, 81, 14, 4, 254, 167, 88, 148, 71, 74, 56, 50, 72, 170, 121, 112, 31, 54, 38, 100, 25, 9, 247, 225, 15, 232, 158, 204, 27, 141, 36, 49, 31, 46, 77, 251, 36, 36, 244, 2, 253, 43, 83, 100, 189, 234, 77, 155, 119, 148, 29, 219, 50, 201, 61, 178, 113, 171, 40, 215, 32, 146, 126, 210, 185, 108, 201, 43, 93, 206, 198, 139, 116, 30, 91, 188, 94, 239, 252, 18, 55, 26, 230, 253, 113, 187, 92, 234, 203, 93, 14, 199, 171, 157, 139, 230, 190, 198, 165, 170, 223, 106, 160, 227, 70, 200, 82, 70, 18, 134, 99, 158, 161, 182, 99, 99, 249, 7, 253, 252, 243, 66, 50, 44, 18, 12, 204, 187, 212, 136, 164, 63, 134, 236, 97, 178, 188, 111, 150, 236, 41, 17, 159, 201, 205, 173, 167, 165, 45, 139, 185, 146, 106, 151, 63, 35, 85, 47, 251, 166, 75, 81, 127, 133, 54, 92, 229, 204, 19, 17, 187, 79, 146, 164, 7, 105, 212, 169, 193, 208, 219, 92, 181, 203, 245, 230, 29, 123, 202, 183, 38, 45, 218, 184, 76, 134, 99, 207, 149, 25, 234, 161, 141, 69, 42, 178, 113, 91, 18, 25, 177, 244, 190, 62, 227, 54, 218, 192, 177, 85, 201, 24, 49, 142, 100, 196, 251, 190, 139, 172, 187, 206, 19, 23, 38, 69, 183, 116, 152, 52, 217, 210, 69, 89, 169, 174, 38, 165, 228, 68, 174, 127, 111, 12, 139, 101, 134, 37, 161, 230, 77, 30, 175, 23, 133, 201, 89, 119, 180, 57, 131, 100, 16, 184, 24, 65, 144, 208, 91, 117, 213, 215, 234, 178, 162, 136, 204, 208, 150, 170, 170, 123, 198, 25, 152, 31, 118, 30, 170, 47, 120, 24, 169, 230, 209, 109, 187, 64, 200, 69, 27, 51, 35, 190, 21, 90, 189, 62, 141, 221, 41, 244, 75, 173, 4, 77, 100, 246, 33, 33, 131, 182, 239, 72, 241, 36, 32, 16, 213, 181, 151, 103, 209, 164, 90, 148, 193, 4, 194, 131, 214, 88, 236, 72, 247, 12, 165, 12, 82, 67, 253, 207, 32, 174, 141, 142, 22, 34, 147, 116, 156, 174, 86, 196, 11, 49, 159, 90, 48, 164, 187, 189, 62, 93, 243, 120, 69, 89, 3, 205, 229, 27, 44, 215, 50, 99, 172, 164, 29, 34, 217, 247, 123, 136, 4, 161, 68, 227, 109, 138, 9, 183, 56, 109, 28, 50, 116, 237, 176, 150, 116, 231, 146, 133, 185, 152, 164, 77, 238, 86, 131, 36, 127, 211, 50, 47, 51, 198, 114, 163, 35, 41, 138, 200, 252, 107, 162, 181, 215, 129, 227, 166, 226, 78, 182, 84, 75, 18, 101, 45, 104, 11, 23, 217, 176, 89, 247, 117, 247, 139, 114, 3, 69, 85, 191, 88, 106, 82, 92, 67, 67, 195, 82, 186, 254, 167, 133, 23, 192, 225, 72, 59, 231, 206, 250, 21, 60, 1, 184, 38, 212, 170, 150, 156, 69, 62, 228, 70, 156, 80, 39, 147, 187, 145, 44, 197, 156, 93, 125, 12, 89, 197, 9, 209, 80, 156, 222, 59, 213, 231, 251, 99, 83, 184, 131, 75, 69, 24, 183, 144, 1, 45, 92, 31, 132, 96, 64, 235, 222, 195, 137, 73, 87, 152, 161, 99, 119, 157, 188, 40, 186, 49, 40, 142, 6, 157, 136, 242, 169, 170, 177, 213, 92, 140, 120, 169, 231, 117, 200, 82, 67, 223, 58, 107, 55, 121, 72, 181, 161, 153, 175, 220, 80, 167, 123, 219, 186, 214, 143, 230, 6, 44, 101, 78, 176, 160, 162, 245, 18, 17, 220, 102, 197, 31, 60, 71, 139, 218, 175, 92, 142, 70, 100, 104, 102, 173, 27, 136, 161, 110, 35, 135, 115, 77, 157, 221, 121, 25, 188, 153, 121, 11, 93, 104, 117, 58, 127, 0, 215, 96, 215, 169, 139, 169, 97, 27, 144, 161, 238, 24, 9, 81, 231, 229, 114, 125, 168, 148, 243, 206, 31, 59, 28, 222, 40, 205, 191, 15, 69, 250, 168, 179, 203, 140, 187, 70, 82, 100, 30, 94, 19, 89, 185, 93, 199, 207, 197, 181, 112, 211, 77, 69, 146, 144, 181, 249, 120, 41, 4, 148, 39, 73, 20, 115, 19, 105, 104, 129, 80, 178, 235, 196, 249, 23, 113, 95, 144, 200, 132, 235, 116, 199, 90, 16, 239, 180, 173, 251, 7, 17, 157, 217, 71, 242, 84, 169, 94, 131, 97, 173, 189, 36, 199, 79, 115, 49, 211, 179, 201, 114, 158, 121, 16, 18, 188, 23, 200, 180, 132, 155, 84, 170, 94, 10, 17, 239, 21, 37, 36, 238, 204, 202, 187, 202, 21, 229, 75, 72, 64, 243, 182, 182, 167, 98, 219, 119, 137, 210, 7, 148, 54, 148, 26, 83, 238, 53, 188, 50, 68, 216, 89, 119, 75, 123, 26, 153, 186, 101, 171, 6, 49, 89, 138, 119, 183, 231, 220, 213, 116, 104, 213, 186, 180, 40, 21, 145, 157, 255, 161, 134, 162, 221, 133, 27, 27, 198, 93, 238, 102, 85, 253, 254, 223, 192, 3, 130, 154, 187, 21, 87, 31, 155, 146, 23, 173, 255, 145, 151, 161, 54, 45, 35, 99, 129, 9, 6, 183, 140, 181, 192, 152, 15, 171, 28, 141, 46, 146, 235, 106, 126, 140, 84, 126, 225, 254, 52, 23, 13, 90, 136, 181, 112, 4, 106, 49, 105, 231, 194, 185, 207, 16, 161, 253, 39, 172, 26, 205, 225, 80, 173, 201, 18, 165, 238, 246, 105, 225, 125, 53, 118, 250, 80, 67, 65, 140, 17, 125, 0, 181, 72, 211, 240, 152, 159, 37, 225, 69, 164, 152, 59, 157, 223, 15, 6, 7, 230, 89, 143, 147, 175, 57, 141, 197, 186, 164, 154, 229, 58, 98, 33, 66, 123, 213, 42, 82, 126, 229, 165, 25, 244, 228, 20, 189, 6, 67, 185, 204, 214, 82, 98, 180, 121, 173, 89, 95, 224, 213, 46, 34, 104, 116, 78, 25, 151, 53, 105, 73, 110, 128, 32, 121, 104, 245, 134, 180, 210, 216, 160, 171, 154, 231, 127, 22, 198, 104, 199, 216, 92, 152, 37, 32, 103, 208, 91, 81, 232, 146, 94, 184, 142, 122, 73, 49, 111, 10, 89, 168, 50, 178, 153, 109, 234, 254, 97, 16, 37, 106, 36, 55, 149, 74, 146, 195, 146, 192, 98, 177, 38, 169, 161, 46, 165, 146, 213, 75, 231, 87, 114, 35, 100, 225, 218, 167, 207, 34, 177, 77, 126, 96, 38, 18, 196, 126, 171, 196, 141, 196, 80, 9, 8, 109, 156, 32, 62, 160, 106, 110, 189, 227, 240, 201, 155, 3, 215, 95, 94, 178, 171, 124, 40, 59, 252, 92, 6, 27, 18, 81, 84, 79, 207, 78, 251, 193, 227, 233, 73, 219, 224, 86, 40, 249, 154, 185, 12, 162, 84, 100, 207, 161, 155, 42, 250, 146, 210, 154, 164, 248, 114, 73, 127, 37, 120, 81, 24, 149, 159, 168, 19, 217, 2, 162, 162, 5, 45, 147, 183, 68, 166, 160, 21, 83, 116, 251, 174, 56, 106, 233, 200, 242, 122, 205, 152, 241, 164, 91, 72, 193, 119, 65, 154, 59, 75, 143, 109, 219, 149, 50, 197, 169, 97, 9, 117, 157, 184, 144, 141, 61, 188, 71, 136, 104, 67, 136, 221, 141, 197, 216, 80, 139, 41, 53, 206, 144, 95, 196, 220, 238, 55, 162, 254, 45, 248, 224, 218, 155, 232, 129, 136, 209, 115, 246, 170, 158, 183, 94, 135, 230, 8, 197, 228, 186, 179, 122, 105, 218, 204, 210, 181, 40, 252, 12, 59, 166, 26, 8, 93, 131, 21, 28, 94, 179, 49, 53, 92, 64, 224, 112, 26, 49, 41, 53, 24, 124, 121, 25, 9, 51, 195, 254, 77, 241, 120, 63, 0, 171, 168, 227, 208, 201, 244, 120, 18, 82, 140, 5, 58, 131, 18, 9, 220, 23, 213, 237, 125, 245, 56, 18, 119, 172, 45, 213, 46, 96, 241, 246, 52, 183, 138, 150, 89, 72, 78, 18, 86, 164, 75, 177, 171, 252, 195, 172, 145, 204, 144, 197, 31, 43, 55, 254, 156, 127, 150, 34, 205, 235, 101, 154, 123, 88, 185, 180, 209, 74, 141, 213, 97, 197, 66, 80, 73, 100, 73, 210, 189, 254, 98, 161, 165, 88, 234, 51, 38, 183, 181, 213, 186, 26, 27, 191, 7, 161, 243, 246, 67, 39, 110, 174, 40, 161, 12, 164, 119, 40, 254, 157, 66, 121, 146, 84, 87, 243, 156, 187, 181, 125, 175, 236, 116, 124, 91, 132, 74, 142, 157, 45, 95, 176, 189, 244, 62, 145, 21, 73, 154, 214, 164, 158, 174, 83, 151, 18, 194, 35, 133, 164, 30, 69, 249, 103, 173, 165, 219, 220, 100, 207, 228, 14, 38, 119, 17, 204, 155, 237, 141, 180, 187, 164, 134, 250, 231, 53, 127, 16, 4, 144, 156, 236, 20, 116, 44, 0, 112, 17, 193, 189, 229, 66, 227, 93, 69, 249, 124, 153, 11, 76, 126, 177, 150, 29, 141, 95, 65, 220, 171, 231, 204, 149, 161, 133, 13, 106, 49, 215, 95, 65, 215, 242, 136, 136, 51, 144, 53, 249, 61, 77, 139, 52, 150, 179, 128, 153, 223, 49, 48, 240, 196, 108, 217, 209, 240, 117, 168, 131, 116, 159, 189, 154, 128, 53, 84, 140, 236, 161, 248, 33, 18, 94, 100, 249, 73, 151, 166, 29, 119, 56, 28, 245, 5, 223, 151, 83, 124, 145, 229, 199, 20, 205, 243, 35, 199, 3, 179, 82, 176, 78, 69, 111, 72, 90, 108, 233, 252, 209, 193, 29, 58, 167, 72, 32, 120, 59, 29, 231, 35, 244, 114, 254, 117, 125, 125, 253, 3, 163, 16, 148, 176, 216, 84, 85, 117, 208, 38, 224, 55, 229, 134, 134, 223, 162, 249, 248, 176, 147, 200, 141, 54, 7, 153, 178, 122, 112, 154, 159, 133, 96, 247, 170, 245, 25, 23, 148, 143, 124, 129, 55, 153, 100, 63, 14, 189, 203, 25, 249, 13, 88, 40, 242, 184, 60, 119, 54, 90, 171, 137, 121, 66, 233, 142, 77, 86, 36, 22, 48, 179, 70, 242, 231, 141, 141, 141, 13, 227, 73, 210, 202, 91, 249, 200, 232, 206, 101, 33, 167, 123, 71, 19, 142, 55, 235, 96, 47, 222, 128, 114, 12, 238, 89, 214, 180, 252, 203, 77, 246, 200, 75, 46, 54, 53, 121, 92, 206, 198, 103, 17, 118, 128, 90, 204, 168, 150, 160, 69, 226, 13, 155, 90, 163, 169, 241, 65, 97, 21, 55, 53, 181, 211, 243, 147, 128, 138, 79, 247, 233, 75, 41, 219, 154, 16, 152, 241, 59, 26, 180, 25, 76, 70, 183, 236, 24, 242, 86, 84, 152, 117, 217, 107, 116, 170, 193, 187, 16, 221, 54, 152, 68, 82, 28, 109, 66, 226, 244, 28, 31, 47, 188, 111, 140, 202, 70, 46, 206, 165, 235, 51, 104, 129, 249, 146, 40, 111, 56, 122, 58, 158, 219, 197, 78, 110, 28, 210, 80, 95, 201, 120, 32, 100, 94, 87, 147, 129, 136, 120, 185, 139, 155, 249, 89, 79, 56, 186, 17, 29, 38, 194, 27, 182, 100, 134, 197, 8, 47, 92, 203, 122, 90, 59, 68, 121, 137, 59, 28, 238, 31, 207, 2, 102, 238, 244, 221, 45, 45, 29, 78, 250, 14, 47, 92, 187, 102, 9, 71, 193, 245, 144, 245, 10, 221, 207, 140, 234, 243, 103, 61, 112, 185, 42, 202, 91, 45, 228, 104, 109, 230, 252, 45, 36, 153, 160, 180, 134, 172, 134, 97, 210, 102, 56, 62, 145, 92, 22, 82, 93, 154, 215, 171, 107, 40, 107, 208, 180, 129, 81, 200, 221, 112, 9, 171, 127, 142, 36, 25, 183, 63, 160, 123, 91, 218, 116, 178, 84, 51, 144, 238, 234, 47, 53, 195, 117, 104, 1, 204, 134, 214, 108, 204, 72, 243, 239, 133, 34, 201, 239, 142, 248, 204, 140, 3, 46, 175, 247, 56, 68, 21, 20, 183, 39, 107, 148, 183, 216, 45, 36, 240, 31, 22, 203, 189, 220, 248, 81, 222, 242, 213, 2, 129, 95, 135, 203, 58, 184, 122, 61, 218, 144, 21, 111, 93, 101, 88, 254, 68, 20, 73, 108, 38, 20, 95, 224, 177, 241, 60, 95, 133, 27, 31, 79, 83, 87, 131, 220, 216, 240, 93, 133, 174, 139, 54, 144, 233, 209, 98, 139, 88, 196, 195, 235, 54, 39, 161, 136, 132, 115, 198, 239, 215, 212, 212, 136, 134, 226, 90, 83, 211, 90, 185, 182, 90, 207, 183, 179, 155, 104, 223, 81, 227, 119, 113, 156, 240, 250, 135, 82, 120, 62, 80, 27, 26, 219, 190, 123, 168, 107, 202, 157, 64, 148, 147, 160, 39, 109, 10, 107, 32, 211, 31, 58, 201, 138, 219, 253, 14, 103, 56, 188, 152, 221, 175, 119, 7, 140, 86, 80, 190, 255, 131, 23, 173, 121, 199, 222, 41, 237, 142, 158, 143, 67, 70, 98, 59, 39, 146, 104, 148, 75, 54, 114, 191, 87, 149, 101, 33, 29, 103, 196, 21, 132, 16, 59, 18, 104, 136, 48, 174, 143, 115, 1, 27, 70, 198, 74, 48, 248, 74, 196, 107, 163, 219, 118, 37, 111, 201, 108, 53, 137, 31, 73, 67, 157, 61, 73, 81, 59, 167, 122, 174, 89, 23, 108, 203, 34, 188, 11, 11, 140, 136, 27, 94, 123, 249, 80, 76, 83, 212, 118, 94, 133, 101, 9, 151, 219, 179, 134, 133, 253, 190, 49, 92, 157, 102, 18, 211, 118, 232, 160, 146, 37, 138, 36, 153, 155, 214, 146, 146, 114, 22, 133, 200, 250, 205, 105, 212, 105, 146, 5, 249, 25, 119, 48, 26, 85, 85, 239, 122, 69, 146, 246, 163, 251, 7, 141, 141, 101, 196, 37, 171, 12, 11, 180, 86, 81, 156, 189, 46, 151, 118, 144, 72, 236, 21, 178, 228, 124, 90, 196, 118, 115, 113, 68, 219, 72, 210, 72, 218, 249, 167, 9, 146, 121, 126, 51, 163, 4, 2, 191, 159, 239, 129, 89, 152, 45, 106, 220, 171, 118, 52, 164, 166, 107, 161, 103, 239, 157, 19, 73, 12, 51, 230, 137, 246, 84, 74, 155, 28, 14, 251, 212, 96, 248, 127, 96, 142, 176, 153, 160, 123, 121, 107, 173, 107, 190, 237, 212, 222, 56, 74, 138, 84, 175, 247, 237, 214, 227, 229, 243, 11, 194, 225, 35, 174, 156, 222, 178, 136, 217, 143, 187, 140, 235, 226, 144, 224, 190, 208, 86, 94, 112, 31, 145, 114, 240, 173, 68, 22, 31, 198, 102, 2, 114, 124, 67, 100, 126, 123, 137, 210, 204, 240, 181, 141, 44, 141, 82, 17, 97, 56, 156, 191, 150, 198, 6, 193, 181, 116, 1, 52, 135, 127, 68, 243, 187, 161, 112, 141, 96, 84, 100, 28, 50, 120, 94, 94, 178, 64, 40, 143, 216, 217, 69, 98, 44, 43, 178, 251, 212, 165, 172, 92, 87, 171, 59, 230, 223, 151, 146, 29, 13, 239, 161, 5, 226, 119, 105, 120, 74, 92, 104, 134, 218, 12, 41, 202, 175, 185, 36, 233, 211, 82, 205, 178, 31, 161, 6, 47, 182, 99, 111, 22, 138, 46, 45, 187, 15, 38, 92, 80, 218, 113, 123, 4, 201, 24, 37, 32, 227, 118, 73, 231, 75, 56, 84, 245, 179, 104, 208, 75, 59, 203, 91, 220, 97, 8, 248, 135, 55, 110, 205, 40, 117, 213, 216, 109, 254, 193, 104, 241, 85, 90, 208, 63, 134, 56, 231, 48, 97, 2, 163, 85, 24, 29, 39, 37, 164, 244, 106, 150, 199, 181, 150, 22, 213, 74, 176, 35, 32, 103, 77, 162, 61, 16, 29, 211, 219, 217, 3, 55, 171, 225, 122, 190, 94, 114, 233, 7, 186, 126, 192, 93, 236, 36, 203, 91, 90, 190, 228, 69, 88, 206, 242, 178, 197, 112, 103, 234, 70, 121, 69, 130, 70, 77, 9, 231, 51, 203, 88, 248, 143, 228, 137, 140, 172, 26, 16, 10, 196, 4, 96, 105, 187, 100, 73, 183, 155, 36, 233, 60, 223, 86, 106, 210, 204, 104, 132, 229, 243, 181, 47, 117, 135, 99, 253, 244, 236, 252, 4, 45, 176, 218, 246, 30, 41, 136, 237, 230, 92, 113, 40, 243, 193, 124, 17, 73, 189, 71, 118, 56, 214, 89, 234, 72, 75, 250, 238, 124, 60, 82, 150, 127, 27, 229, 79, 100, 65, 166, 65, 204, 16, 199, 144, 170, 151, 101, 144, 128, 131, 78, 54, 133, 25, 208, 120, 238, 80, 174, 128, 216, 181, 162, 170, 95, 11, 6, 7, 239, 53, 14, 104, 222, 147, 25, 67, 238, 227, 240, 35, 18, 17, 89, 96, 197, 234, 140, 104, 232, 60, 30, 2, 49, 72, 130, 200, 240, 69, 108, 166, 21, 143, 231, 99, 230, 123, 161, 168, 218, 231, 177, 17, 37, 194, 190, 3, 136, 18, 185, 8, 231, 211, 16, 195, 192, 253, 177, 91, 62, 51, 87, 94, 243, 88, 182, 237, 192, 177, 56, 194, 59, 112, 113, 43, 94, 239, 31, 192, 19, 103, 217, 156, 176, 254, 107, 69, 17, 100, 56, 220, 37, 4, 3, 90, 218, 133, 235, 179, 127, 18, 26, 247, 142, 54, 232, 165, 203, 250, 122, 250, 133, 123, 208, 163, 169, 176, 154, 62, 102, 89, 100, 198, 44, 121, 128, 27, 82, 83, 21, 225, 98, 12, 174, 90, 135, 93, 110, 54, 87, 82, 114, 33, 165, 160, 173, 147, 211, 249, 185, 50, 146, 95, 198, 34, 100, 1, 40, 114, 208, 46, 242, 23, 222, 214, 14, 36, 76, 100, 140, 184, 84, 46, 195, 113, 219, 160, 16, 70, 112, 105, 218, 31, 143, 100, 113, 153, 100, 27, 222, 180, 105, 177, 115, 241, 252, 95, 248, 233, 250, 77, 5, 30, 35, 149, 63, 27, 221, 178, 51, 37, 207, 187, 7, 214, 92, 169, 22, 240, 140, 188, 181, 235, 243, 61, 130, 221, 61, 178, 73, 205, 204, 217, 146, 117, 102, 47, 92, 199, 28, 138, 110, 11, 177, 109, 187, 32, 184, 173, 183, 238, 63, 154, 241, 182, 119, 189, 104, 8, 196, 255, 141, 229, 122, 102, 142, 233, 161, 80, 148, 223, 210, 20, 23, 218, 108, 221, 164, 133, 37, 77, 247, 37, 141, 218, 63, 127, 223, 0, 72, 192, 174, 238, 31, 186, 165, 252, 227, 85, 227, 220, 213, 139, 243, 149, 36, 169, 219, 165, 104, 95, 150, 107, 107, 126, 229, 132, 59, 49, 39, 192, 158, 197, 230, 97, 216, 60, 26, 27, 61, 16, 152, 175, 171, 55, 35, 8, 218, 41, 186, 164, 60, 67, 159, 63, 80, 98, 220, 123, 168, 158, 84, 213, 222, 131, 249, 165, 103, 33, 217, 178, 251, 16, 122, 181, 234, 109, 251, 143, 137, 4, 177, 17, 220, 250, 105, 213, 227, 133, 91, 254, 91, 45, 155, 55, 63, 48, 66, 124, 44, 255, 220, 209, 166, 228, 45, 72, 8, 138, 108, 220, 146, 30, 111, 105, 4, 157, 83, 210, 181, 116, 161, 168, 1, 53, 165, 247, 196, 247, 110, 216, 112, 31, 253, 221, 23, 32, 200, 64, 68, 153, 184, 45, 49, 74, 227, 253, 163, 115, 204, 56, 102, 85, 33, 228, 161, 247, 156, 190, 156, 182, 93, 3, 215, 162, 255, 218, 115, 246, 74, 202, 223, 191, 42, 35, 74, 69, 36, 233, 223, 181, 166, 214, 24, 91, 149, 21, 2, 115, 247, 26, 238, 237, 93, 76, 139, 253, 15, 97, 37, 116, 157, 188, 152, 156, 12, 193, 128, 146, 106, 204, 30, 121, 60, 27, 94, 251, 208, 139, 120, 137, 105, 135, 250, 107, 37, 90, 2, 179, 12, 242, 152, 135, 140, 66, 113, 13, 39, 46, 36, 208, 214, 9, 61, 38, 209, 130, 7, 245, 130, 138, 63, 240, 151, 178, 230, 91, 1, 93, 83, 203, 162, 53, 99, 60, 4, 73, 139, 144, 170, 250, 253, 135, 104, 17, 124, 29, 45, 240, 63, 133, 5, 209, 118, 240, 120, 174, 211, 0, 17, 76, 235, 158, 67, 105, 9, 130, 221, 110, 207, 247, 200, 162, 107, 26, 225, 251, 114, 130, 233, 30, 207, 50, 69, 146, 118, 168, 110, 207, 103, 65, 170, 45, 187, 14, 164, 76, 23, 113, 215, 241, 115, 105, 133, 172, 44, 186, 174, 15, 148, 178, 97, 40, 118, 174, 106, 48, 124, 193, 185, 224, 126, 61, 176, 114, 77, 214, 148, 234, 43, 117, 119, 159, 239, 156, 112, 245, 177, 44, 230, 19, 22, 185, 138, 26, 73, 85, 253, 80, 25, 137, 85, 249, 115, 65, 15, 79, 85, 114, 8, 55, 157, 112, 45, 211, 92, 161, 137, 180, 157, 53, 146, 200, 110, 53, 72, 242, 194, 56, 19, 42, 114, 164, 238, 118, 191, 193, 77, 231, 234, 235, 238, 79, 211, 61, 17, 162, 10, 104, 233, 85, 212, 101, 109, 22, 239, 211, 159, 123, 206, 92, 78, 211, 51, 252, 156, 218, 80, 7, 121, 186, 15, 141, 230, 65, 40, 246, 189, 226, 93, 116, 52, 126, 31, 98, 11, 200, 84, 133, 39, 196, 188, 15, 197, 222, 25, 36, 234, 56, 137, 12, 84, 143, 231, 237, 244, 156, 68, 81, 107, 89, 240, 172, 153, 98, 27, 7, 137, 184, 127, 78, 139, 248, 127, 66, 39, 23, 207, 236, 45, 150, 105, 9, 4, 217, 126, 224, 120, 90, 206, 213, 237, 254, 107, 36, 18, 153, 107, 174, 35, 38, 25, 52, 118, 117, 205, 33, 162, 255, 55, 131, 40, 83, 102, 75, 180, 169, 108, 189, 213, 125, 250, 114, 86, 8, 83, 72, 210, 207, 200, 18, 79, 34, 89, 15, 155, 229, 201, 8, 31, 89, 74, 164, 176, 145, 20, 141, 25, 176, 233, 51, 195, 58, 19, 9, 237, 48, 110, 63, 134, 4, 3, 84, 247, 71, 69, 103, 134, 3, 199, 166, 52, 14, 57, 188, 190, 44, 87, 120, 143, 132, 33, 122, 153, 223, 91, 78, 92, 199, 124, 65, 181, 96, 44, 32, 213, 44, 79, 67, 105, 6, 150, 29, 22, 0, 244, 155, 67, 204, 11, 137, 11, 24, 116, 108, 184, 9, 63, 3, 25, 187, 18, 23, 249, 252, 103, 60, 141, 141, 13, 244, 123, 159, 161, 151, 239, 38, 148, 118, 224, 118, 68, 93, 102, 116, 219, 96, 198, 76, 173, 207, 213, 201, 237, 201, 194, 221, 43, 75, 206, 155, 40, 109, 40, 208, 16, 157, 105, 221, 160, 208, 185, 252, 165, 219, 237, 70, 44, 11, 250, 168, 89, 168, 182, 152, 11, 162, 191, 119, 69, 70, 196, 4, 189, 254, 27, 229, 222, 92, 36, 173, 192, 101, 77, 155, 141, 85, 100, 133, 126, 27, 139, 34, 100, 255, 202, 42, 3, 65, 12, 198, 168, 253, 67, 235, 38, 233, 30, 92, 147, 244, 217, 170, 39, 158, 152, 89, 130, 155, 181, 170, 24, 145, 18, 193, 254, 173, 19, 114, 116, 155, 182, 38, 208, 115, 145, 22, 147, 156, 149, 102, 31, 73, 138, 26, 73, 186, 254, 173, 19, 33, 73, 79, 56, 236, 147, 234, 106, 159, 65, 182, 42, 45, 128, 73, 136, 151, 139, 130, 254, 49, 106, 36, 123, 47, 92, 75, 121, 91, 218, 113, 77, 207, 146, 37, 31, 54, 182, 163, 37, 205, 83, 94, 64, 63, 26, 237, 198, 243, 133, 13, 4, 98, 95, 230, 241, 139, 17, 66, 243, 142, 189, 186, 234, 15, 100, 21, 178, 38, 53, 77, 204, 225, 59, 138, 146, 164, 162, 253, 33, 74, 159, 180, 112, 147, 30, 90, 179, 129, 230, 127, 91, 238, 152, 37, 118, 177, 129, 203, 178, 227, 200, 233, 172, 220, 216, 128, 231, 58, 163, 250, 124, 71, 10, 55, 0, 249, 247, 144, 44, 74, 151, 166, 125, 89, 90, 60, 95, 16, 101, 255, 20, 182, 251, 130, 11, 20, 170, 71, 8, 13, 168, 193, 200, 131, 106, 83, 211, 74, 108, 194, 68, 221, 233, 209, 51, 227, 174, 23, 46, 89, 255, 149, 54, 232, 120, 102, 228, 69, 115, 96, 105, 127, 20, 201, 87, 150, 251, 192, 250, 175, 211, 9, 249, 7, 218, 31, 252, 29, 209, 180, 120, 243, 56, 132, 157, 109, 43, 255, 64, 207, 196, 243, 41, 236, 194, 104, 23, 253, 223, 166, 219, 168, 28, 85, 139, 188, 210, 140, 63, 116, 22, 189, 20, 67, 235, 54, 33, 22, 33, 226, 46, 40, 88, 167, 157, 36, 72, 34, 1, 117, 28, 122, 120, 117, 179, 207, 96, 41, 238, 16, 115, 161, 165, 23, 127, 39, 122, 15, 66, 135, 21, 174, 199, 238, 211, 87, 18, 176, 206, 114, 164, 246, 232, 176, 150, 88, 112, 143, 161, 177, 43, 138, 239, 21, 69, 253, 169, 101, 135, 63, 219, 250, 147, 72, 236, 183, 17, 143, 244, 247, 175, 140, 35, 73, 199, 186, 0, 162, 169, 44, 89, 129, 217, 156, 84, 155, 242, 2, 226, 122, 99, 16, 123, 206, 10, 146, 164, 71, 92, 46, 245, 105, 217, 233, 136, 139, 14, 237, 232, 196, 238, 116, 160, 40, 90, 47, 231, 30, 231, 197, 217, 247, 31, 189, 137, 214, 77, 68, 112, 95, 143, 172, 93, 59, 119, 60, 110, 36, 235, 189, 164, 121, 124, 7, 230, 197, 223, 55, 144, 68, 193, 190, 236, 116, 218, 85, 39, 153, 181, 184, 93, 91, 199, 187, 139, 31, 122, 55, 252, 199, 209, 110, 44, 188, 118, 163, 16, 245, 31, 177, 198, 112, 168, 4, 36, 227, 105, 237, 200, 66, 152, 92, 11, 6, 55, 143, 103, 158, 134, 226, 135, 145, 43, 112, 223, 133, 215, 63, 148, 16, 207, 241, 8, 247, 8, 228, 221, 125, 250, 18, 17, 106, 155, 72, 28, 162, 185, 253, 112, 49, 75, 94, 88, 120, 46, 215, 231, 16, 122, 232, 56, 124, 42, 33, 122, 85, 150, 41, 27, 217, 126, 232, 36, 158, 71, 148, 53, 197, 65, 58, 244, 60, 190, 181, 128, 40, 115, 174, 234, 198, 198, 13, 138, 215, 247, 75, 39, 145, 164, 167, 165, 61, 59, 85, 101, 26, 136, 131, 182, 237, 63, 150, 66, 124, 150, 230, 225, 47, 204, 9, 112, 199, 98, 253, 114, 99, 227, 243, 72, 126, 131, 176, 194, 164, 148, 180, 89, 245, 95, 47, 222, 72, 55, 109, 126, 56, 137, 243, 32, 130, 126, 86, 9, 70, 246, 178, 85, 57, 109, 19, 117, 34, 59, 177, 227, 242, 247, 174, 204, 5, 242, 167, 186, 24, 56, 223, 30, 235, 90, 90, 164, 84, 147, 21, 169, 53, 55, 119, 142, 211, 151, 63, 179, 42, 175, 236, 226, 125, 35, 210, 179, 201, 50, 77, 98, 7, 108, 8, 157, 139, 4, 24, 209, 19, 81, 243, 30, 40, 32, 172, 210, 173, 110, 69, 125, 23, 22, 35, 16, 135, 80, 67, 41, 136, 185, 152, 13, 138, 225, 42, 163, 133, 11, 157, 56, 226, 138, 55, 212, 90, 132, 244, 135, 154, 70, 43, 218, 251, 84, 122, 129, 137, 120, 135, 75, 255, 209, 79, 20, 219, 7, 250, 31, 124, 65, 203, 117, 151, 120, 207, 24, 238, 187, 153, 6, 9, 125, 86, 131, 180, 89, 103, 207, 77, 58, 79, 145, 132, 211, 125, 230, 202, 184, 4, 206, 209, 55, 20, 9, 64, 100, 61, 127, 79, 141, 68, 170, 39, 244, 162, 91, 197, 196, 85, 245, 239, 20, 184, 36, 37, 41, 101, 37, 55, 27, 36, 233, 240, 243, 89, 143, 199, 211, 80, 238, 70, 171, 224, 222, 228, 54, 28, 68, 232, 174, 101, 139, 112, 191, 71, 104, 178, 61, 84, 14, 129, 132, 55, 184, 25, 85, 127, 232, 198, 4, 230, 105, 40, 62, 233, 241, 252, 13, 136, 178, 101, 247, 193, 226, 30, 30, 34, 102, 200, 33, 210, 125, 78, 231, 50, 168, 213, 119, 23, 139, 19, 231, 227, 246, 3, 3, 247, 211, 243, 248, 109, 213, 235, 197, 239, 149, 77, 22, 189, 185, 24, 191, 30, 92, 181, 62, 142, 123, 71, 115, 243, 46, 107, 188, 221, 252, 30, 151, 234, 126, 149, 27, 177, 89, 159, 255, 5, 108, 22, 39, 189, 213, 151, 185, 73, 65, 191, 216, 142, 110, 93, 90, 190, 244, 167, 232, 251, 42, 54, 7, 141, 141, 115, 196, 28, 116, 15, 68, 157, 243, 239, 251, 21, 214, 0, 178, 108, 211, 147, 125, 46, 66, 255, 245, 240, 201, 164, 155, 44, 119, 232, 191, 186, 60, 190, 183, 152, 155, 127, 78, 234, 185, 195, 145, 183, 184, 154, 154, 60, 114, 67, 93, 28, 86, 81, 207, 217, 171, 19, 175, 157, 26, 255, 67, 149, 69, 13, 26, 200, 218, 29, 137, 237, 24, 103, 98, 205, 12, 235, 245, 249, 91, 58, 155, 137, 40, 16, 127, 193, 46, 59, 141, 230, 200, 200, 164, 132, 85, 5, 81, 242, 82, 221, 184, 197, 172, 180, 150, 83, 167, 238, 33, 203, 231, 171, 120, 240, 219, 15, 157, 184, 133, 212, 132, 16, 0, 205, 103, 238, 229, 88, 160, 187, 67, 161, 135, 70, 89, 172, 103, 153, 238, 41, 217, 225, 248, 34, 50, 101, 105, 81, 201, 21, 124, 131, 108, 201, 74, 64, 77, 22, 122, 57, 66, 100, 94, 246, 249, 228, 49, 44, 201, 220, 226, 234, 245, 122, 101, 73, 250, 33, 126, 15, 25, 179, 34, 62, 91, 134, 203, 203, 236, 191, 9, 113, 7, 17, 19, 117, 58, 126, 225, 9, 183, 41, 118, 236, 132, 135, 89, 148, 170, 246, 15, 70, 252, 48, 101, 19, 73, 102, 12, 146, 124, 210, 226, 102, 29, 239, 98, 52, 219, 32, 150, 69, 114, 67, 253, 79, 48, 151, 61, 103, 174, 220, 250, 158, 88, 148, 162, 208, 147, 146, 44, 168, 55, 79, 240, 123, 45, 210, 133, 131, 247, 146, 213, 246, 45, 108, 202, 160, 228, 211, 111, 214, 44, 15, 89, 174, 72, 132, 202, 214, 85, 85, 129, 176, 146, 104, 145, 166, 200, 242, 213, 130, 239, 23, 239, 134, 211, 233, 92, 44, 171, 234, 37, 120, 3, 234, 133, 187, 123, 91, 166, 240, 217, 45, 69, 19, 22, 73, 42, 158, 72, 20, 2, 236, 63, 132, 132, 94, 193, 61, 21, 223, 133, 100, 30, 36, 222, 193, 235, 210, 188, 107, 127, 178, 88, 60, 117, 50, 54, 219, 61, 23, 174, 37, 188, 180, 217, 150, 170, 151, 11, 151, 179, 153, 197, 110, 254, 148, 106, 171, 223, 137, 154, 227, 222, 11, 215, 226, 125, 147, 236, 2, 54, 55, 153, 168, 75, 13, 173, 217, 144, 66, 214, 47, 173, 27, 79, 106, 161, 232, 64, 177, 119, 129, 113, 231, 100, 234, 204, 54, 173, 52, 89, 86, 190, 106, 148, 47, 36, 250, 175, 62, 126, 123, 8, 18, 253, 10, 207, 94, 205, 202, 142, 70, 221, 177, 96, 78, 26, 138, 50, 46, 167, 243, 0, 45, 112, 203, 203, 93, 80, 68, 163, 97, 85, 253, 44, 237, 148, 127, 232, 124, 96, 214, 47, 29, 247, 207, 72, 64, 107, 17, 214, 164, 183, 163, 71, 135, 72, 187, 59, 28, 61, 98, 177, 82, 103, 140, 119, 131, 225, 143, 117, 75, 68, 28, 191, 84, 221, 110, 33, 87, 149, 87, 49, 17, 253, 23, 175, 101, 124, 157, 189, 34, 109, 223, 19, 107, 221, 80, 104, 65, 141, 104, 221, 251, 131, 39, 16, 239, 209, 194, 77, 89, 196, 83, 161, 228, 211, 126, 248, 148, 136, 209, 74, 117, 53, 79, 107, 161, 80, 41, 229, 31, 67, 82, 119, 193, 160, 38, 213, 213, 254, 12, 155, 143, 182, 131, 199, 227, 165, 222, 99, 211, 101, 132, 236, 83, 213, 237, 65, 41, 66, 210, 204, 214, 179, 73, 85, 100, 102, 222, 125, 237, 114, 221, 208, 134, 72, 210, 14, 107, 210, 76, 218, 249, 23, 171, 133, 51, 209, 144, 132, 59, 26, 221, 132, 13, 79, 112, 229, 26, 180, 68, 203, 22, 46, 132, 136, 229, 195, 218, 84, 84, 237, 159, 203, 72, 104, 42, 205, 237, 218, 212, 20, 67, 121, 148, 39, 218, 44, 158, 45, 43, 73, 35, 214, 7, 185, 197, 224, 131, 107, 145, 40, 242, 2, 172, 55, 196, 124, 139, 198, 190, 85, 245, 2, 178, 198, 213, 64, 16, 46, 220, 12, 26, 9, 88, 45, 188, 124, 77, 225, 104, 150, 218, 121, 8, 114, 180, 235, 142, 133, 115, 158, 83, 155, 187, 180, 17, 158, 137, 161, 248, 179, 211, 249, 62, 8, 13, 136, 100, 180, 49, 221, 252, 19, 104, 237, 101, 38, 236, 156, 185, 154, 240, 208, 166, 95, 170, 173, 249, 179, 2, 79, 81, 110, 243, 40, 73, 175, 82, 21, 87, 238, 157, 157, 130, 70, 214, 34, 148, 100, 36, 225, 209, 58, 116, 19, 154, 207, 40, 233, 81, 124, 121, 77, 95, 22, 32, 184, 3, 19, 117, 114, 46, 36, 175, 239, 173, 8, 44, 151, 213, 55, 111, 18, 137, 178, 109, 255, 209, 172, 191, 119, 64, 215, 60, 30, 29, 113, 73, 34, 75, 236, 138, 47, 90, 94, 186, 25, 99, 45, 38, 180, 8, 220, 208, 92, 50, 98, 51, 66, 163, 21, 25, 137, 173, 123, 14, 37, 69, 135, 137, 154, 229, 232, 62, 113, 204, 242, 249, 113, 63, 148, 67, 37, 51, 177, 21, 66, 197, 36, 167, 237, 153, 70, 76, 210, 72, 20, 74, 55, 228, 228, 232, 190, 235, 106, 108, 188, 136, 162, 123, 139, 242, 203, 140, 66, 50, 163, 235, 60, 79, 187, 238, 95, 128, 140, 28, 115, 102, 102, 60, 45, 109, 226, 165, 66, 3, 88, 196, 143, 136, 140, 159, 215, 218, 218, 130, 229, 144, 148, 249, 125, 88, 200, 144, 225, 7, 23, 243, 144, 213, 123, 125, 204, 244, 121, 164, 204, 139, 6, 213, 181, 53, 89, 79, 44, 182, 218, 198, 88, 202, 176, 130, 121, 186, 246, 79, 41, 185, 154, 198, 148, 205, 66, 2, 239, 180, 107, 167, 62, 96, 44, 180, 170, 47, 240, 122, 33, 178, 177, 235, 64, 206, 245, 121, 254, 154, 176, 32, 197, 125, 146, 101, 36, 52, 253, 192, 215, 222, 190, 116, 50, 226, 78, 90, 44, 182, 5, 9, 92, 72, 72, 201, 147, 180, 89, 130, 112, 237, 229, 98, 35, 168, 230, 222, 155, 207, 20, 105, 40, 158, 171, 83, 117, 187, 59, 100, 201, 249, 162, 230, 243, 137, 142, 51, 216, 132, 89, 59, 214, 208, 117, 12, 181, 227, 26, 169, 223, 235, 230, 29, 162, 22, 84, 241, 122, 191, 76, 115, 60, 136, 158, 151, 197, 172, 102, 44, 252, 244, 220, 93, 80, 220, 238, 191, 23, 27, 224, 123, 171, 144, 29, 156, 29, 45, 147, 214, 32, 233, 108, 255, 56, 107, 55, 17, 86, 1, 249, 97, 13, 145, 26, 235, 95, 101, 189, 119, 121, 221, 101, 111, 224, 24, 234, 25, 219, 15, 157, 4, 105, 103, 167, 36, 180, 100, 38, 245, 208, 252, 117, 159, 190, 156, 64, 153, 23, 92, 242, 136, 15, 123, 91, 123, 188, 230, 252, 113, 169, 200, 29, 228, 102, 213, 130, 225, 171, 34, 33, 96, 237, 166, 228, 157, 210, 107, 78, 236, 50, 133, 21, 246, 72, 38, 188, 126, 243, 243, 72, 100, 161, 23, 236, 99, 37, 90, 3, 102, 9, 200, 18, 185, 161, 254, 73, 119, 83, 20, 59, 108, 100, 212, 165, 189, 157, 100, 65, 214, 18, 65, 250, 67, 199, 237, 220, 181, 89, 196, 23, 78, 32, 43, 216, 191, 226, 65, 196, 56, 178, 102, 17, 62, 17, 103, 6, 49, 86, 141, 44, 49, 119, 174, 240, 254, 241, 34, 36, 55, 203, 136, 31, 254, 43, 226, 145, 100, 165, 36, 59, 14, 159, 50, 219, 133, 37, 65, 30, 32, 78, 79, 52, 218, 54, 158, 133, 215, 252, 188, 175, 169, 221, 35, 59, 157, 79, 35, 102, 213, 126, 248, 228, 40, 217, 203, 55, 76, 203, 62, 227, 105, 110, 205, 34, 193, 137, 22, 231, 157, 133, 174, 220, 9, 192, 220, 20, 236, 164, 241, 101, 218, 68, 100, 149, 161, 174, 29, 118, 9, 9, 36, 65, 146, 196, 191, 255, 203, 70, 178, 154, 149, 247, 190, 72, 210, 215, 113, 206, 40, 49, 2, 57, 245, 156, 189, 146, 206, 137, 137, 215, 102, 181, 72, 75, 179, 157, 214, 182, 225, 29, 169, 35, 226, 219, 39, 59, 28, 71, 20, 143, 231, 59, 16, 51, 104, 25, 220, 159, 54, 201, 70, 36, 85, 237, 59, 154, 130, 190, 44, 145, 210, 151, 173, 37, 25, 69, 189, 11, 222, 96, 15, 89, 165, 191, 66, 121, 68, 231, 137, 243, 194, 42, 197, 177, 136, 100, 245, 250, 170, 170, 116, 104, 237, 166, 108, 209, 53, 33, 223, 47, 243, 152, 238, 110, 106, 206, 42, 154, 59, 3, 169, 69, 154, 239, 63, 41, 248, 62, 83, 56, 34, 42, 50, 182, 81, 23, 27, 142, 64, 154, 81, 207, 197, 38, 31, 43, 46, 233, 71, 4, 210, 178, 251, 96, 6, 237, 193, 232, 29, 200, 142, 71, 136, 223, 104, 43, 23, 87, 145, 164, 38, 203, 47, 177, 146, 100, 94, 147, 58, 218, 218, 227, 156, 119, 143, 200, 8, 166, 185, 75, 79, 101, 254, 69, 239, 80, 143, 207, 76, 108, 251, 238, 4, 106, 97, 165, 154, 101, 105, 45, 20, 58, 91, 184, 174, 48, 110, 39, 65, 194, 250, 65, 219, 165, 182, 78, 145, 137, 215, 55, 197, 130, 1, 99, 181, 165, 233, 57, 119, 53, 37, 234, 230, 28, 141, 191, 34, 2, 10, 148, 236, 170, 52, 69, 161, 221, 238, 135, 225, 94, 12, 14, 172, 126, 81, 168, 212, 220, 87, 133, 14, 26, 39, 39, 195, 255, 159, 95, 120, 124, 129, 223, 131, 28, 88, 100, 211, 182, 132, 25, 123, 17, 46, 184, 125, 71, 19, 130, 8, 16, 35, 211, 180, 131, 69, 206, 33, 39, 70, 30, 14, 183, 16, 25, 222, 196, 117, 67, 25, 7, 115, 32, 218, 107, 209, 70, 193, 236, 69, 56, 222, 197, 62, 47, 73, 22, 137, 132, 92, 14, 199, 115, 16, 203, 70, 50, 65, 209, 52, 120, 99, 55, 142, 68, 16, 199, 236, 42, 221, 57, 247, 158, 164, 84, 83, 253, 25, 34, 235, 55, 154, 66, 225, 118, 196, 217, 200, 106, 254, 140, 135, 22, 105, 45, 18, 141, 171, 193, 80, 22, 153, 183, 118, 137, 155, 91, 72, 242, 178, 157, 22, 157, 121, 28, 119, 36, 210, 33, 65, 240, 28, 226, 12, 23, 174, 165, 81, 162, 35, 154, 242, 6, 35, 123, 108, 252, 62, 171, 174, 239, 199, 64, 54, 112, 235, 35, 190, 238, 146, 156, 217, 182, 131, 199, 243, 117, 121, 100, 17, 101, 68, 230, 179, 162, 254, 196, 21, 137, 120, 75, 202, 69, 8, 4, 142, 33, 203, 83, 245, 7, 179, 221, 167, 47, 137, 94, 147, 254, 190, 129, 44, 220, 128, 176, 250, 58, 142, 157, 205, 140, 68, 82, 176, 62, 137, 80, 211, 240, 112, 136, 50, 27, 85, 61, 82, 224, 98, 205, 171, 205, 40, 154, 231, 93, 74, 93, 141, 200, 12, 70, 63, 210, 98, 22, 106, 62, 57, 236, 192, 177, 180, 80, 22, 154, 51, 67, 180, 77, 67, 157, 99, 89, 238, 208, 28, 73, 102, 99, 59, 247, 102, 160, 82, 164, 68, 34, 171, 10, 55, 56, 34, 76, 210, 209, 239, 118, 60, 48, 235, 69, 120, 154, 208, 243, 115, 202, 215, 62, 107, 169, 200, 177, 179, 73, 120, 141, 32, 235, 135, 132, 60, 218, 144, 46, 183, 188, 39, 156, 212, 115, 59, 8, 18, 153, 137, 180, 80, 254, 20, 47, 220, 80, 55, 128, 59, 128, 32, 173, 2, 231, 177, 86, 93, 34, 43, 151, 118, 87, 107, 173, 15, 119, 89, 139, 176, 166, 253, 173, 6, 197, 19, 44, 4, 129, 192, 233, 73, 244, 251, 15, 101, 188, 186, 189, 239, 133, 117, 222, 60, 120, 32, 142, 140, 215, 182, 67, 39, 226, 72, 244, 32, 11, 46, 235, 210, 188, 163, 245, 196, 204, 105, 173, 6, 194, 27, 240, 114, 187, 99, 173, 89, 119, 180, 89, 212, 115, 162, 105, 178, 29, 187, 75, 243, 247, 69, 51, 97, 89, 250, 14, 44, 33, 209, 54, 107, 148, 69, 136, 44, 134, 44, 234, 232, 104, 103, 47, 218, 138, 209, 130, 248, 191, 108, 56, 151, 92, 230, 177, 162, 132, 137, 196, 190, 170, 209, 98, 72, 247, 42, 183, 200, 219, 100, 73, 154, 106, 59, 116, 252, 109, 229, 62, 63, 165, 190, 71, 244, 29, 175, 68, 111, 65, 45, 18, 187, 9, 125, 96, 178, 202, 126, 221, 230, 239, 202, 123, 78, 200, 98, 251, 43, 196, 164, 67, 171, 214, 63, 135, 50, 15, 12, 171, 247, 37, 180, 122, 67, 22, 73, 56, 82, 205, 242, 95, 208, 60, 126, 147, 230, 224, 43, 78, 167, 51, 80, 132, 184, 76, 213, 163, 71, 20, 85, 123, 78, 90, 186, 40, 137, 126, 147, 134, 54, 176, 144, 5, 84, 60, 222, 175, 56, 23, 62, 240, 116, 232, 193, 181, 120, 31, 211, 197, 154, 111, 55, 239, 58, 144, 193, 243, 35, 203, 210, 247, 93, 110, 119, 255, 8, 27, 39, 75, 98, 150, 250, 118, 184, 250, 77, 129, 140, 97, 89, 224, 6, 65, 210, 166, 44, 165, 66, 17, 75, 114, 124, 139, 72, 227, 28, 54, 33, 112, 73, 222, 210, 56, 96, 108, 49, 146, 36, 26, 84, 59, 231, 223, 255, 163, 142, 13, 251, 135, 9, 42, 12, 213, 159, 182, 117, 223, 46, 75, 178, 88, 220, 31, 61, 85, 35, 27, 182, 38, 93, 203, 23, 195, 107, 244, 83, 45, 16, 222, 90, 24, 15, 103, 76, 62, 134, 130, 232, 154, 246, 41, 87, 245, 18, 189, 237, 224, 137, 248, 152, 177, 169, 169, 86, 233, 191, 252, 104, 150, 172, 191, 20, 92, 151, 100, 61, 157, 31, 231, 130, 44, 94, 214, 250, 250, 250, 101, 100, 81, 254, 153, 230, 241, 31, 180, 204, 193, 164, 236, 204, 242, 34, 229, 200, 78, 117, 58, 191, 10, 247, 106, 211, 198, 173, 191, 66, 54, 162, 179, 102, 249, 207, 52, 191, 191, 121, 172, 36, 14, 75, 47, 204, 147, 162, 206, 13, 98, 214, 190, 224, 14, 59, 221, 47, 180, 120, 190, 156, 198, 95, 144, 165, 240, 85, 231, 253, 85, 88, 16, 51, 136, 169, 21, 245, 36, 24, 139, 23, 26, 62, 147, 197, 148, 132, 84, 161, 226, 15, 175, 46, 92, 0, 39, 66, 148, 136, 153, 146, 101, 244, 78, 101, 168, 255, 163, 173, 37, 32, 102, 141, 164, 13, 231, 91, 124, 83, 164, 170, 159, 112, 187, 4, 65, 190, 213, 242, 111, 51, 39, 229, 189, 117, 185, 62, 15, 82, 238, 56, 122, 90, 184, 120, 69, 173, 166, 41, 73, 119, 242, 2, 106, 105, 179, 144, 14, 68, 43, 44, 225, 218, 215, 180, 243, 5, 215, 158, 39, 93, 250, 183, 127, 80, 137, 180, 154, 182, 236, 136, 119, 157, 186, 168, 15, 208, 241, 154, 7, 247, 137, 247, 206, 229, 247, 175, 81, 60, 158, 223, 129, 214, 112, 231, 209, 51, 195, 53, 132, 33, 243, 182, 251, 160, 33, 144, 33, 101, 45, 22, 100, 85, 193, 230, 115, 134, 113, 127, 23, 25, 177, 248, 87, 74, 117, 53, 34, 142, 73, 27, 199, 161, 174, 60, 230, 249, 159, 190, 148, 129, 26, 142, 84, 95, 155, 246, 52, 181, 182, 139, 247, 192, 31, 252, 77, 137, 136, 44, 182, 109, 87, 186, 164, 100, 179, 124, 51, 128, 43, 113, 180, 175, 147, 234, 235, 255, 170, 240, 186, 243, 36, 25, 10, 109, 23, 162, 41, 251, 143, 101, 166, 44, 38, 57, 150, 254, 43, 157, 7, 214, 100, 228, 0, 224, 220, 104, 195, 253, 134, 129, 39, 158, 176, 54, 102, 103, 171, 114, 50, 97, 250, 228, 21, 191, 255, 53, 48, 235, 163, 91, 7, 69, 150, 227, 29, 211, 239, 205, 120, 1, 155, 54, 63, 44, 210, 231, 85, 95, 224, 117, 99, 145, 74, 169, 174, 42, 203, 113, 38, 53, 115, 44, 95, 131, 230, 243, 201, 180, 155, 255, 185, 66, 27, 17, 196, 220, 188, 177, 88, 189, 133, 232, 198, 104, 146, 108, 102, 32, 186, 95, 77, 59, 244, 139, 54, 237, 36, 115, 133, 221, 110, 183, 95, 203, 137, 39, 232, 190, 246, 46, 29, 197, 238, 208, 100, 237, 31, 37, 147, 49, 215, 2, 105, 75, 82, 220, 147, 64, 78, 51, 118, 192, 38, 194, 49, 147, 138, 100, 77, 235, 84, 114, 42, 59, 89, 155, 226, 146, 38, 209, 190, 72, 215, 218, 104, 83, 28, 181, 232, 156, 250, 124, 190, 165, 46, 175, 119, 139, 101, 19, 99, 187, 146, 74, 190, 245, 91, 83, 87, 131, 84, 95, 247, 12, 98, 212, 221, 167, 46, 14, 247, 0, 161, 79, 234, 141, 87, 138, 204, 73, 67, 180, 226, 253, 150, 115, 153, 89, 120, 44, 37, 216, 212, 11, 193, 250, 240, 218, 77, 248, 189, 44, 18, 120, 196, 226, 236, 116, 252, 92, 92, 87, 180, 83, 150, 150, 45, 73, 64, 79, 55, 111, 77, 26, 110, 120, 8, 9, 184, 114, 113, 242, 180, 97, 253, 63, 173, 74, 82, 183, 245, 248, 22, 107, 251, 9, 143, 225, 38, 70, 54, 45, 92, 187, 183, 116, 48, 161, 141, 113, 96, 96, 117, 214, 249, 192, 44, 221, 19, 109, 217, 102, 158, 107, 215, 224, 224, 28, 105, 217, 226, 159, 134, 86, 173, 195, 218, 144, 41, 85, 13, 136, 44, 210, 184, 11, 114, 150, 170, 250, 7, 35, 90, 210, 154, 231, 119, 32, 138, 129, 6, 212, 69, 227, 163, 183, 195, 72, 48, 245, 95, 207, 93, 77, 5, 86, 174, 201, 160, 84, 132, 54, 144, 223, 48, 55, 13, 108, 85, 78, 193, 226, 237, 14, 135, 247, 33, 110, 226, 95, 177, 106, 88, 250, 250, 157, 224, 102, 21, 98, 201, 187, 15, 197, 197, 131, 49, 164, 115, 57, 209, 197, 205, 44, 106, 158, 178, 26, 164, 124, 76, 148, 118, 207, 138, 219, 243, 129, 124, 1, 115, 233, 49, 170, 25, 99, 144, 253, 68, 44, 159, 153, 232, 121, 135, 5, 36, 182, 125, 247, 139, 43, 140, 36, 169, 209, 238, 73, 235, 222, 35, 113, 100, 224, 209, 181, 252, 125, 225, 174, 220, 6, 152, 9, 60, 39, 212, 161, 204, 86, 91, 202, 63, 140, 26, 201, 167, 204, 249, 159, 164, 13, 210, 204, 73, 184, 87, 163, 231, 18, 68, 163, 3, 200, 37, 176, 54, 31, 200, 213, 209, 230, 164, 28, 133, 176, 182, 44, 125, 217, 92, 76, 139, 196, 223, 103, 152, 177, 125, 34, 184, 183, 192, 133, 75, 150, 225, 139, 190, 174, 94, 29, 110, 126, 45, 212, 180, 54, 111, 185, 186, 221, 175, 117, 213, 44, 135, 70, 235, 45, 33, 25, 40, 66, 117, 28, 57, 149, 117, 199, 90, 210, 26, 136, 210, 176, 90, 45, 207, 249, 108, 35, 55, 96, 111, 206, 75, 32, 235, 109, 123, 143, 166, 70, 112, 143, 166, 97, 1, 59, 23, 206, 121, 222, 51, 176, 121, 89, 158, 16, 78, 157, 186, 199, 185, 108, 209, 127, 160, 33, 55, 188, 25, 101, 172, 41, 169, 64, 255, 74, 244, 139, 253, 165, 214, 49, 96, 221, 36, 137, 251, 19, 236, 237, 117, 58, 151, 45, 126, 222, 223, 221, 39, 98, 255, 125, 83, 40, 149, 87, 178, 254, 43, 100, 6, 119, 29, 140, 35, 225, 9, 229, 107, 170, 223, 255, 178, 194, 103, 129, 97, 247, 203, 213, 212, 22, 148, 234, 106, 83, 16, 75, 54, 155, 173, 222, 41, 205, 80, 69, 243, 210, 35, 167, 69, 151, 111, 90, 216, 254, 19, 178, 89, 211, 124, 215, 52, 179, 152, 37, 80, 38, 169, 205, 180, 217, 42, 17, 199, 18, 197, 221, 46, 215, 151, 148, 134, 122, 17, 47, 45, 230, 110, 31, 170, 143, 188, 152, 16, 11, 156, 36, 125, 199, 219, 211, 51, 127, 132, 69, 119, 194, 231, 4, 87, 156, 165, 229, 150, 109, 73, 59, 72, 173, 159, 138, 48, 70, 9, 30, 2, 91, 223, 101, 8, 213, 99, 227, 18, 124, 112, 93, 18, 25, 146, 66, 104, 226, 200, 233, 132, 146, 203, 230, 252, 129, 22, 235, 91, 62, 218, 98, 106, 222, 67, 40, 17, 185, 20, 229, 5, 196, 236, 69, 185, 149, 215, 123, 204, 106, 225, 171, 109, 109, 14, 34, 154, 103, 17, 223, 131, 20, 159, 85, 114, 13, 241, 118, 144, 178, 81, 166, 245, 119, 35, 108, 242, 242, 61, 77, 17, 58, 64, 140, 189, 235, 228, 133, 164, 181, 97, 180, 69, 238, 48, 129, 250, 101, 75, 104, 36, 87, 243, 92, 179, 236, 11, 126, 244, 189, 52, 227, 146, 37, 8, 29, 136, 164, 162, 125, 71, 94, 68, 215, 27, 213, 235, 255, 77, 203, 241, 114, 89, 228, 30, 207, 53, 88, 145, 52, 103, 55, 69, 249, 203, 133, 235, 119, 12, 73, 22, 38, 245, 224, 29, 68, 226, 33, 18, 2, 233, 94, 125, 10, 22, 190, 101, 110, 89, 255, 213, 174, 56, 25, 36, 168, 208, 157, 93, 168, 117, 28, 59, 155, 52, 164, 217, 238, 12, 23, 43, 226, 17, 167, 46, 102, 132, 171, 167, 161, 254, 41, 20, 231, 87, 200, 110, 105, 152, 134, 229, 68, 226, 94, 182, 187, 131, 131, 109, 181, 52, 215, 63, 118, 9, 245, 150, 243, 137, 97, 173, 131, 140, 222, 149, 208, 156, 244, 182, 117, 136, 196, 33, 79, 83, 83, 187, 157, 113, 209, 194, 216, 29, 61, 155, 127, 106, 144, 100, 220, 38, 146, 76, 24, 73, 59, 127, 63, 217, 22, 222, 20, 35, 255, 60, 169, 62, 223, 155, 228, 185, 179, 68, 191, 198, 238, 211, 151, 111, 162, 148, 67, 110, 108, 120, 209, 221, 220, 233, 47, 229, 253, 201, 215, 20, 231, 106, 115, 179, 46, 213, 253, 114, 139, 43, 125, 150, 185, 110, 72, 75, 23, 126, 87, 184, 59, 175, 60, 150, 177, 42, 48, 181, 29, 60, 158, 20, 18, 107, 78, 231, 255, 131, 197, 55, 146, 171, 57, 239, 222, 245, 120, 54, 138, 226, 121, 89, 186, 69, 92, 220, 236, 183, 138, 242, 21, 51, 73, 45, 239, 138, 119, 52, 252, 45, 90, 222, 117, 159, 185, 156, 26, 115, 99, 63, 164, 62, 148, 242, 66, 146, 174, 174, 38, 165, 4, 115, 101, 83, 198, 51, 144, 179, 110, 53, 237, 49, 183, 170, 8, 189, 224, 178, 179, 103, 167, 112, 109, 204, 39, 245, 208, 6, 33, 186, 117, 103, 18, 146, 144, 82, 125, 221, 139, 106, 48, 114, 184, 208, 115, 197, 24, 255, 34, 109, 234, 151, 190, 19, 59, 79, 184, 51, 39, 44, 24, 96, 220, 60, 115, 216, 209, 22, 139, 30, 214, 20, 234, 190, 84, 127, 240, 45, 147, 73, 18, 183, 105, 81, 187, 163, 96, 17, 64, 232, 146, 27, 234, 116, 119, 56, 34, 106, 252, 172, 238, 52, 144, 100, 120, 253, 230, 140, 180, 224, 126, 93, 243, 7, 207, 89, 23, 173, 201, 152, 27, 90, 168, 63, 100, 88, 126, 118, 145, 100, 28, 164, 75, 22, 206, 107, 172, 86, 73, 133, 108, 125, 103, 91, 230, 237, 51, 152, 55, 21, 217, 211, 13, 245, 200, 4, 31, 24, 143, 107, 31, 100, 88, 140, 136, 33, 136, 224, 92, 60, 255, 233, 240, 218, 141, 162, 163, 70, 190, 1, 193, 201, 11, 185, 204, 97, 40, 77, 145, 181, 57, 150, 183, 196, 124, 118, 232, 120, 30, 151, 228, 252, 49, 98, 170, 237, 135, 79, 10, 87, 177, 209, 127, 51, 225, 170, 171, 198, 125, 251, 243, 194, 223, 65, 109, 40, 92, 194, 237, 7, 79, 148, 212, 222, 10, 201, 47, 232, 143, 137, 13, 4, 61, 187, 231, 11, 188, 31, 226, 122, 189, 203, 150, 205, 119, 105, 158, 63, 118, 204, 153, 161, 163, 244, 2, 110, 235, 59, 165, 4, 110, 20, 1, 130, 44, 188, 109, 34, 227, 157, 44, 100, 197, 237, 249, 107, 173, 163, 99, 129, 229, 126, 115, 82, 79, 185, 24, 106, 25, 21, 124, 41, 18, 117, 144, 124, 33, 58, 8, 140, 67, 193, 194, 42, 220, 109, 244, 122, 20, 253, 30, 243, 58, 140, 227, 125, 184, 204, 22, 63, 59, 247, 33, 35, 47, 169, 161, 6, 204, 229, 250, 139, 73, 112, 235, 49, 138, 61, 27, 177, 216, 10, 231, 178, 37, 200, 92, 133, 120, 67, 214, 44, 39, 104, 63, 116, 34, 45, 205, 157, 13, 247, 219, 87, 38, 145, 244, 243, 237, 155, 232, 158, 255, 187, 65, 146, 118, 185, 91, 19, 6, 73, 94, 173, 60, 146, 180, 220, 63, 77, 91, 238, 146, 229, 39, 81, 194, 161, 122, 60, 227, 173, 207, 156, 97, 249, 57, 195, 112, 65, 137, 249, 66, 169, 144, 115, 241, 188, 95, 18, 233, 228, 221, 173, 189, 231, 174, 166, 177, 80, 75, 53, 203, 147, 190, 150, 150, 112, 9, 214, 76, 78, 47, 214, 227, 81, 92, 146, 116, 156, 238, 141, 208, 139, 133, 70, 179, 33, 28, 146, 241, 117, 245, 138, 110, 41, 74, 56, 186, 177, 144, 112, 21, 95, 112, 31, 116, 150, 155, 182, 236, 200, 140, 154, 104, 104, 88, 93, 109, 7, 200, 194, 93, 182, 24, 2, 36, 127, 95, 232, 177, 40, 244, 42, 104, 225, 240, 85, 100, 207, 54, 61, 180, 61, 189, 98, 178, 229, 56, 39, 216, 112, 218, 116, 75, 67, 142, 16, 226, 47, 242, 146, 121, 168, 101, 253, 190, 53, 134, 204, 107, 230, 56, 220, 106, 238, 104, 116, 141, 188, 124, 137, 238, 237, 232, 206, 246, 94, 26, 67, 48, 192, 74, 134, 150, 140, 57, 16, 107, 255, 35, 143, 103, 68, 193, 237, 165, 151, 164, 186, 79, 95, 78, 181, 29, 56, 150, 65, 17, 110, 251, 161, 83, 41, 252, 253, 132, 200, 82, 220, 252, 151, 233, 162, 157, 12, 2, 212, 154, 231, 247, 248, 134, 79, 186, 101, 59, 131, 22, 171, 126, 90, 180, 174, 211, 34, 251, 83, 164, 243, 183, 238, 59, 98, 46, 90, 136, 131, 100, 145, 142, 239, 152, 51, 51, 45, 53, 214, 127, 149, 200, 230, 88, 85, 145, 142, 18, 118, 156, 75, 99, 99, 227, 18, 58, 151, 159, 24, 137, 54, 41, 155, 50, 91, 83, 70, 34, 208, 142, 145, 220, 128, 149, 18, 74, 161, 235, 172, 86, 124, 77, 158, 2, 23, 255, 120, 188, 78, 183, 144, 176, 175, 169, 201, 227, 88, 52, 55, 133, 54, 109, 120, 71, 241, 190, 34, 52, 2, 93, 97, 151, 162, 192, 234, 255, 125, 11, 41, 143, 216, 137, 6, 231, 72, 159, 253, 158, 219, 227, 209, 33, 246, 143, 214, 117, 208, 139, 21, 235, 17, 141, 240, 134, 205, 89, 137, 172, 69, 69, 211, 158, 69, 237, 172, 197, 82, 126, 61, 178, 98, 209, 44, 25, 154, 180, 183, 148, 139, 21, 198, 209, 105, 157, 10, 175, 223, 172, 59, 23, 205, 77, 194, 106, 29, 105, 211, 32, 230, 110, 112, 48, 23, 159, 148, 229, 127, 132, 142, 170, 168, 23, 191, 98, 119, 189, 248, 80, 137, 11, 17, 252, 144, 130, 81, 225, 58, 91, 142, 254, 235, 101, 67, 255, 117, 223, 209, 184, 234, 241, 234, 88, 223, 85, 159, 239, 247, 10, 238, 29, 91, 149, 165, 236, 50, 189, 177, 158, 122, 218, 105, 252, 2, 53, 83, 194, 159, 111, 205, 78, 51, 110, 80, 239, 45, 132, 152, 147, 166, 18, 196, 119, 249, 209, 36, 237, 90, 18, 136, 97, 54, 15, 238, 215, 195, 235, 54, 233, 190, 246, 78, 81, 62, 128, 236, 58, 52, 81, 133, 143, 28, 153, 103, 93, 199, 207, 197, 145, 161, 150, 171, 167, 122, 73, 201, 15, 154, 233, 115, 239, 56, 122, 38, 9, 177, 97, 122, 96, 255, 117, 164, 23, 151, 97, 11, 204, 206, 244, 143, 139, 82, 16, 122, 54, 64, 134, 180, 0, 101, 69, 255, 74, 99, 19, 5, 55, 88, 207, 185, 71, 178, 177, 237, 187, 116, 79, 52, 166, 27, 86, 217, 63, 219, 156, 41, 106, 198, 35, 189, 70, 125, 164, 93, 178, 116, 25, 67, 76, 0, 49, 201, 206, 74, 37, 201, 34, 215, 101, 103, 137, 211, 44, 195, 211, 176, 92, 118, 58, 159, 209, 2, 33, 244, 120, 21, 185, 12, 34, 11, 125, 112, 255, 139, 66, 226, 17, 218, 168, 94, 175, 107, 148, 247, 53, 23, 238, 9, 182, 56, 101, 135, 227, 5, 184, 133, 209, 119, 85, 196, 35, 47, 15, 245, 92, 165, 181, 32, 131, 141, 60, 220, 170, 238, 112, 184, 63, 79, 146, 138, 242, 151, 32, 86, 196, 197, 155, 31, 222, 51, 106, 147, 112, 99, 45, 201, 52, 109, 218, 78, 36, 57, 239, 25, 172, 127, 163, 109, 182, 243, 89, 232, 129, 200, 42, 105, 201, 124, 209, 44, 221, 78, 237, 106, 107, 243, 101, 34, 224, 36, 206, 191, 147, 230, 176, 239, 202, 75, 161, 198, 149, 21, 101, 39, 198, 28, 244, 150, 67, 152, 150, 82, 17, 90, 215, 147, 254, 190, 149, 89, 161, 255, 42, 203, 95, 246, 183, 182, 134, 204, 247, 147, 75, 69, 74, 120, 105, 92, 138, 246, 47, 194, 151, 111, 138, 89, 95, 184, 54, 44, 142, 40, 220, 166, 198, 67, 143, 160, 60, 253, 125, 146, 110, 102, 28, 238, 138, 232, 150, 157, 122, 112, 197, 42, 221, 67, 187, 62, 244, 138, 67, 179, 89, 231, 194, 7, 158, 145, 106, 170, 255, 133, 110, 198, 155, 84, 143, 231, 176, 22, 14, 119, 65, 166, 204, 185, 116, 81, 6, 250, 170, 161, 213, 235, 241, 34, 197, 77, 162, 29, 115, 167, 100, 44, 198, 16, 4, 23, 238, 27, 218, 45, 250, 59, 58, 220, 86, 119, 15, 195, 118, 43, 50, 87, 35, 134, 230, 206, 116, 95, 3, 189, 43, 95, 232, 189, 112, 61, 59, 82, 215, 7, 100, 48, 118, 159, 186, 248, 162, 176, 242, 100, 89, 215, 34, 17, 59, 107, 14, 205, 204, 214, 21, 134, 21, 153, 177, 185, 252, 227, 69, 73, 146, 92, 119, 193, 134, 203, 238, 44, 232, 42, 171, 139, 26, 113, 78, 9, 77, 1, 130, 33, 72, 196, 165, 219, 15, 159, 76, 32, 67, 30, 9, 56, 46, 77, 123, 188, 212, 77, 59, 4, 50, 144, 152, 67, 86, 105, 42, 23, 223, 180, 136, 19, 236, 57, 44, 234, 26, 85, 205, 243, 250, 66, 247, 184, 230, 243, 173, 117, 73, 142, 239, 226, 158, 18, 201, 140, 152, 188, 35, 202, 96, 174, 189, 76, 168, 67, 57, 22, 220, 255, 156, 167, 45, 215, 206, 109, 20, 178, 16, 27, 138, 129, 35, 71, 238, 119, 46, 153, 255, 3, 100, 240, 14, 149, 153, 220, 152, 104, 199, 143, 172, 225, 149, 201, 182, 236, 62, 152, 192, 102, 84, 200, 236, 73, 78, 29, 101, 39, 177, 135, 247, 144, 37, 125, 1, 45, 186, 82, 88, 131, 77, 79, 92, 57, 100, 153, 215, 127, 165, 115, 142, 237, 216, 43, 178, 140, 81, 42, 162, 132, 66, 151, 11, 55, 2, 140, 97, 55, 221, 80, 184, 119, 123, 223, 32, 221, 95, 133, 221, 145, 161, 33, 122, 35, 31, 75, 132, 217, 143, 56, 0, 26, 1, 195, 130, 107, 25, 220, 151, 70, 65, 49, 26, 148, 66, 37, 6, 15, 178, 227, 129, 89, 89, 231, 194, 57, 255, 37, 213, 213, 254, 29, 50, 193, 224, 247, 246, 116, 117, 53, 20, 221, 145, 53, 53, 5, 233, 101, 249, 75, 34, 81, 93, 149, 36, 195, 149, 114, 65, 244, 141, 203, 63, 208, 35, 171, 253, 103, 233, 187, 83, 72, 111, 166, 239, 56, 54, 198, 67, 205, 176, 201, 122, 19, 155, 40, 85, 125, 15, 244, 91, 155, 7, 247, 37, 110, 145, 37, 28, 202, 18, 204, 96, 167, 138, 54, 106, 138, 215, 123, 212, 102, 171, 44, 247, 172, 42, 202, 126, 35, 30, 153, 180, 171, 252, 195, 32, 201, 239, 209, 34, 177, 128, 189, 18, 54, 184, 116, 253, 254, 237, 120, 6, 160, 175, 11, 173, 86, 231, 242, 37, 79, 187, 220, 238, 53, 69, 220, 248, 163, 62, 115, 116, 95, 62, 40, 74, 47, 14, 159, 74, 154, 174, 253, 238, 51, 87, 146, 170, 230, 70, 67, 242, 111, 91, 18, 136, 76, 171, 88, 252, 174, 167, 189, 183, 201, 49, 239, 222, 108, 128, 54, 238, 197, 100, 242, 76, 97, 116, 36, 20, 33, 17, 205, 229, 116, 62, 11, 145, 135, 18, 194, 54, 57, 241, 248, 229, 139, 63, 225, 107, 237, 0, 209, 38, 251, 39, 146, 192, 99, 181, 30, 79, 93, 74, 249, 251, 31, 204, 162, 12, 133, 172, 232, 175, 211, 250, 118, 128, 158, 201, 87, 57, 151, 45, 250, 54, 226, 160, 144, 223, 131, 228, 30, 44, 76, 88, 233, 185, 82, 158, 199, 115, 194, 239, 165, 198, 48, 173, 250, 175, 199, 207, 37, 161, 195, 141, 6, 243, 180, 102, 127, 16, 241, 100, 203, 245, 243, 243, 111, 125, 24, 32, 90, 140, 22, 48, 32, 159, 129, 107, 47, 75, 231, 98, 137, 55, 82, 184, 105, 173, 251, 143, 102, 154, 30, 122, 88, 15, 244, 173, 204, 89, 137, 78, 135, 14, 87, 3, 17, 226, 47, 165, 165, 11, 63, 43, 53, 54, 190, 78, 241, 6, 246, 251, 91, 187, 67, 45, 155, 79, 61, 48, 210, 206, 16, 59, 20, 12, 235, 3, 168, 181, 118, 197, 208, 150, 8, 1, 120, 85, 85, 144, 29, 153, 69, 252, 18, 113, 130, 66, 178, 28, 86, 168, 78, 223, 79, 150, 205, 219, 38, 24, 83, 97, 148, 73, 78, 85, 79, 60, 49, 211, 37, 57, 63, 143, 76, 185, 214, 125, 71, 134, 26, 70, 91, 210, 242, 67, 171, 215, 39, 101, 36, 240, 120, 60, 191, 102, 247, 253, 177, 180, 7, 123, 220, 230, 26, 201, 132, 65, 186, 159, 103, 215, 253, 196, 145, 87, 206, 241, 122, 143, 161, 5, 23, 89, 254, 31, 215, 250, 134, 213, 97, 142, 249, 60, 228, 173, 73, 212, 93, 214, 215, 61, 231, 142, 198, 114, 66, 8, 87, 31, 203, 10, 119, 225, 242, 37, 104, 72, 190, 166, 136, 245, 51, 211, 116, 241, 171, 30, 207, 159, 40, 181, 203, 225, 25, 187, 89, 172, 100, 137, 72, 34, 131, 208, 146, 84, 91, 157, 82, 252, 254, 77, 165, 108, 232, 6, 204, 90, 76, 167, 51, 215, 91, 146, 172, 187, 178, 187, 142, 88, 8, 77, 24, 6, 151, 31, 77, 55, 239, 220, 151, 84, 85, 77, 71, 75, 51, 197, 231, 251, 125, 121, 224, 72, 62, 123, 24, 150, 171, 55, 210, 252, 160, 75, 146, 94, 231, 92, 178, 224, 201, 220, 122, 169, 10, 194, 140, 61, 188, 59, 219, 117, 242, 34, 172, 229, 161, 117, 179, 132, 24, 102, 222, 114, 189, 120, 35, 77, 150, 122, 2, 27, 17, 185, 177, 225, 23, 90, 32, 60, 88, 120, 15, 238, 122, 55, 171, 59, 24, 140, 202, 142, 198, 132, 26, 138, 164, 241, 48, 161, 143, 34, 220, 160, 94, 218, 37, 137, 148, 109, 154, 60, 231, 226, 121, 25, 231, 242, 197, 223, 150, 235, 235, 222, 69, 15, 252, 163, 106, 48, 184, 50, 210, 189, 182, 122, 36, 235, 20, 139, 25, 94, 134, 17, 2, 194, 51, 10, 255, 94, 139, 197, 186, 100, 167, 243, 67, 210, 210, 5, 58, 2, 226, 145, 77, 219, 178, 104, 128, 154, 243, 195, 191, 52, 223, 229, 3, 129, 114, 163, 163, 193, 119, 131, 3, 3, 243, 74, 216, 245, 49, 108, 66, 94, 58, 172, 107, 29, 146, 102, 158, 66, 49, 57, 138, 209, 205, 250, 217, 188, 60, 32, 186, 40, 248, 253, 127, 102, 33, 26, 219, 200, 198, 66, 146, 111, 178, 153, 36, 227, 6, 73, 190, 187, 68, 75, 135, 81, 162, 247, 129, 54, 224, 171, 130, 193, 193, 123, 173, 228, 89, 42, 242, 165, 71, 254, 208, 113, 105, 238, 44, 61, 186, 117, 103, 162, 117, 207, 225, 56, 26, 88, 147, 229, 243, 135, 35, 46, 228, 70, 130, 13, 44, 35, 169, 161, 254, 105, 180, 35, 235, 61, 159, 19, 67, 17, 225, 35, 241, 188, 62, 14, 161, 242, 52, 188, 103, 106, 36, 118, 168, 208, 101, 59, 214, 181, 201, 245, 181, 239, 133, 209, 64, 155, 250, 100, 185, 53, 147, 166, 238, 170, 176, 100, 79, 92, 72, 32, 83, 28, 27, 127, 232, 55, 171, 209, 104, 119, 193, 102, 99, 24, 105, 107, 23, 47, 222, 7, 45, 100, 250, 236, 27, 165, 234, 165, 223, 133, 193, 162, 210, 51, 236, 239, 89, 161, 199, 118, 236, 205, 162, 39, 38, 29, 59, 105, 174, 157, 230, 247, 245, 142, 144, 184, 100, 234, 191, 162, 13, 158, 22, 10, 139, 230, 242, 138, 219, 251, 103, 38, 73, 27, 243, 123, 87, 10, 16, 228, 133, 123, 105, 97, 248, 174, 72, 200, 240, 249, 133, 255, 219, 121, 255, 12, 4, 177, 127, 38, 213, 85, 255, 51, 145, 209, 235, 93, 30, 207, 65, 184, 71, 45, 197, 191, 197, 200, 214, 28, 229, 88, 13, 51, 170, 10, 20, 32, 112, 243, 93, 178, 252, 73, 33, 117, 229, 245, 226, 165, 72, 245, 156, 189, 146, 20, 89, 114, 23, 111, 100, 33, 131, 229, 172, 94, 154, 54, 107, 187, 216, 127, 126, 123, 44, 4, 111, 107, 171, 151, 118, 157, 47, 192, 229, 5, 55, 249, 192, 141, 87, 160, 36, 199, 144, 162, 115, 127, 100, 18, 173, 49, 179, 27, 197, 7, 109, 118, 183, 38, 12, 210, 125, 125, 129, 235, 142, 49, 177, 53, 102, 166, 101, 135, 51, 222, 205, 172, 153, 172, 245, 62, 8, 181, 27, 162, 246, 255, 109, 33, 199, 153, 99, 16, 236, 65, 144, 106, 120, 253, 67, 168, 247, 22, 177, 77, 120, 60, 86, 92, 127, 121, 166, 253, 224, 137, 155, 72, 40, 36, 139, 115, 67, 41, 36, 105, 110, 210, 208, 242, 12, 150, 87, 96, 197, 170, 84, 89, 89, 250, 249, 98, 127, 218, 88, 94, 186, 145, 235, 11, 41, 57, 114, 18, 114, 94, 255, 255, 40, 216, 144, 206, 44, 152, 199, 91, 212, 114, 224, 106, 86, 3, 129, 13, 52, 31, 127, 44, 85, 47, 249, 142, 244, 255, 219, 251, 18, 248, 56, 234, 178, 255, 201, 38, 77, 122, 38, 109, 210, 52, 71, 119, 103, 246, 206, 177, 57, 155, 54, 215, 158, 61, 104, 9, 37, 45, 165, 77, 161, 45, 45, 189, 72, 219, 36, 155, 100, 119, 115, 110, 2, 68, 20, 21, 245, 125, 125, 65, 1, 241, 66, 84, 60, 10, 168, 128, 239, 43, 234, 171, 120, 188, 2, 10, 136, 127, 84, 20, 69, 78, 57, 69, 238, 163, 109, 142, 249, 63, 207, 111, 103, 210, 201, 118, 119, 179, 73, 54, 247, 243, 253, 244, 233, 108, 146, 221, 217, 153, 223, 204, 252, 190, 191, 231, 94, 150, 196, 8, 19, 173, 126, 232, 18, 195, 120, 17, 212, 82, 3, 46, 179, 48, 62, 76, 57, 168, 7, 143, 169, 193, 51, 80, 176, 113, 203, 128, 46, 64, 216, 79, 97, 255, 76, 210, 42, 57, 22, 4, 113, 59, 12, 242, 139, 90, 65, 115, 187, 206, 96, 104, 55, 128, 90, 95, 80, 177, 49, 35, 156, 217, 13, 39, 74, 151, 139, 221, 76, 49, 155, 68, 164, 155, 111, 248, 6, 48, 22, 21, 213, 106, 121, 245, 3, 120, 209, 145, 188, 203, 234, 246, 245, 99, 103, 1, 156, 148, 117, 188, 230, 30, 50, 5, 76, 63, 81, 26, 11, 74, 92, 88, 13, 5, 125, 26, 107, 47, 57, 240, 14, 54, 129, 213, 10, 194, 159, 176, 163, 73, 52, 102, 171, 137, 0, 238, 215, 199, 165, 110, 29, 177, 74, 255, 144, 251, 72, 118, 144, 117, 98, 82, 76, 245, 19, 153, 43, 2, 133, 246, 243, 242, 178, 96, 1, 253, 186, 33, 224, 59, 182, 71, 49, 7, 40, 91, 124, 125, 223, 168, 215, 33, 169, 137, 37, 219, 118, 98, 220, 133, 88, 116, 126, 45, 139, 169, 48, 7, 162, 176, 175, 142, 114, 78, 97, 196, 197, 23, 22, 174, 208, 25, 140, 15, 224, 61, 95, 186, 99, 247, 112, 31, 216, 81, 205, 171, 168, 61, 74, 189, 32, 177, 186, 15, 54, 0, 128, 115, 122, 8, 230, 187, 53, 99, 32, 35, 102, 169, 11, 126, 31, 150, 128, 52, 21, 148, 108, 69, 194, 228, 87, 44, 125, 30, 3, 39, 113, 225, 151, 239, 216, 128, 11, 216, 254, 234, 122, 55, 70, 201, 74, 62, 204, 174, 115, 136, 93, 89, 255, 21, 11, 200, 224, 243, 32, 172, 92, 1, 243, 111, 254, 71, 130, 159, 253, 121, 167, 77, 226, 214, 146, 158, 190, 52, 156, 137, 13, 87, 100, 83, 149, 71, 19, 172, 25, 154, 138, 74, 119, 106, 179, 179, 254, 128, 62, 48, 115, 201, 26, 49, 208, 113, 128, 127, 9, 38, 179, 204, 201, 158, 136, 9, 163, 95, 39, 125, 78, 206, 62, 86, 135, 51, 147, 85, 62, 121, 37, 39, 39, 208, 185, 100, 146, 30, 166, 56, 233, 187, 147, 241, 187, 20, 209, 173, 177, 32, 201, 65, 41, 71, 114, 15, 45, 192, 102, 174, 249, 22, 59, 229, 232, 245, 185, 133, 99, 176, 82, 4, 8, 86, 0, 130, 213, 235, 127, 9, 228, 241, 79, 77, 242, 194, 1, 126, 249, 18, 145, 95, 150, 248, 22, 191, 42, 237, 113, 184, 246, 191, 16, 4, 97, 199, 24, 230, 147, 225, 70, 204, 48, 15, 61, 160, 93, 190, 72, 44, 217, 177, 251, 84, 88, 162, 84, 248, 30, 237, 238, 182, 129, 226, 218, 139, 251, 145, 92, 65, 123, 28, 48, 228, 89, 58, 130, 8, 104, 172, 115, 172, 74, 49, 63, 15, 163, 162, 166, 38, 25, 9, 83, 171, 209, 124, 133, 95, 177, 236, 229, 64, 125, 91, 179, 136, 5, 220, 215, 212, 237, 27, 100, 113, 31, 158, 238, 115, 124, 152, 114, 27, 53, 86, 255, 181, 190, 57, 96, 6, 198, 250, 175, 58, 221, 131, 250, 146, 18, 211, 240, 184, 207, 179, 69, 164, 42, 120, 133, 18, 193, 151, 56, 101, 199, 20, 60, 201, 26, 242, 242, 14, 104, 87, 103, 255, 13, 77, 45, 166, 64, 133, 157, 35, 100, 110, 157, 94, 200, 15, 166, 206, 108, 110, 210, 27, 76, 191, 134, 107, 81, 58, 201, 215, 132, 77, 78, 60, 207, 235, 21, 102, 214, 161, 88, 230, 72, 98, 177, 4, 34, 201, 25, 139, 248, 48, 243, 86, 212, 115, 28, 182, 209, 194, 130, 1, 166, 146, 146, 18, 163, 189, 38, 189, 175, 175, 79, 21, 66, 105, 136, 250, 222, 47, 43, 171, 95, 160, 51, 26, 31, 64, 34, 41, 221, 121, 233, 57, 229, 59, 109, 82, 202, 26, 250, 252, 42, 15, 29, 59, 101, 94, 179, 78, 100, 249, 137, 64, 204, 232, 178, 136, 165, 134, 38, 207, 221, 193, 99, 99, 169, 171, 91, 106, 204, 181, 212, 10, 188, 250, 235, 66, 122, 234, 43, 90, 41, 238, 35, 223, 9, 26, 230, 37, 251, 7, 173, 199, 91, 49, 5, 111, 164, 15, 19, 125, 182, 120, 220, 205, 29, 3, 160, 41, 159, 193, 54, 106, 218, 172, 204, 211, 6, 75, 225, 21, 225, 20, 154, 249, 160, 81, 206, 196, 8, 81, 85, 176, 217, 11, 110, 174, 118, 144, 111, 98, 197, 149, 113, 60, 44, 132, 201, 185, 111, 194, 77, 100, 147, 66, 202, 64, 102, 182, 24, 106, 145, 35, 114, 36, 97, 107, 38, 146, 156, 241, 139, 250, 248, 113, 126, 46, 110, 28, 127, 11, 11, 153, 216, 112, 142, 210, 27, 12, 143, 98, 26, 28, 118, 56, 193, 248, 9, 165, 70, 6, 175, 251, 139, 46, 184, 232, 140, 46, 51, 29, 139, 167, 191, 111, 200, 181, 52, 5, 221, 211, 170, 73, 122, 46, 207, 241, 97, 26, 43, 106, 146, 245, 185, 185, 59, 117, 130, 240, 77, 97, 229, 138, 151, 89, 157, 101, 80, 58, 44, 235, 55, 97, 235, 179, 126, 235, 241, 150, 83, 195, 38, 217, 150, 46, 41, 98, 189, 123, 168, 226, 208, 177, 51, 230, 53, 107, 165, 250, 175, 166, 187, 176, 62, 239, 36, 30, 63, 97, 60, 8, 179, 210, 162, 139, 51, 67, 86, 248, 83, 145, 87, 53, 220, 141, 68, 171, 221, 35, 5, 237, 12, 196, 136, 36, 251, 37, 146, 124, 17, 180, 212, 21, 242, 196, 71, 151, 117, 78, 47, 236, 98, 18, 152, 37, 47, 166, 10, 109, 182, 21, 58, 173, 246, 89, 93, 118, 22, 54, 151, 62, 237, 244, 245, 50, 223, 94, 249, 254, 163, 167, 209, 77, 132, 154, 166, 222, 104, 188, 55, 183, 164, 68, 43, 31, 199, 20, 222, 99, 44, 155, 32, 120, 225, 135, 68, 103, 180, 20, 237, 210, 9, 252, 55, 249, 148, 197, 175, 98, 79, 81, 83, 110, 174, 136, 5, 18, 144, 48, 89, 197, 181, 150, 78, 150, 38, 130, 231, 195, 234, 191, 110, 217, 122, 70, 203, 114, 56, 87, 191, 98, 42, 40, 184, 112, 42, 22, 199, 132, 49, 174, 6, 21, 225, 200, 116, 81, 230, 25, 100, 243, 14, 75, 65, 10, 144, 100, 127, 172, 72, 82, 218, 223, 99, 138, 137, 147, 238, 47, 194, 152, 22, 111, 198, 178, 50, 131, 86, 157, 253, 182, 193, 108, 198, 194, 7, 31, 96, 27, 47, 29, 104, 151, 66, 102, 198, 91, 134, 162, 115, 218, 84, 77, 151, 213, 46, 208, 199, 52, 136, 160, 115, 55, 238, 96, 132, 169, 93, 157, 253, 109, 44, 207, 167, 101, 1, 59, 121, 1, 194, 188, 244, 0, 243, 97, 58, 61, 254, 1, 87, 91, 239, 16, 44, 2, 78, 225, 223, 48, 42, 88, 103, 50, 221, 64, 68, 57, 115, 87, 131, 132, 121, 58, 25, 1, 73, 222, 52, 25, 36, 137, 105, 37, 65, 218, 6, 129, 48, 166, 5, 156, 49, 55, 183, 74, 43, 240, 3, 88, 105, 136, 145, 136, 206, 112, 82, 46, 162, 192, 205, 172, 218, 168, 202, 8, 217, 145, 62, 204, 45, 91, 82, 13, 230, 188, 75, 117, 234, 213, 119, 10, 105, 203, 223, 68, 51, 178, 17, 53, 76, 215, 38, 113, 237, 165, 151, 15, 216, 154, 219, 79, 219, 154, 218, 62, 200, 115, 108, 248, 144, 53, 188, 55, 24, 158, 84, 4, 82, 210, 115, 67, 32, 76, 35, 228, 66, 235, 247, 74, 164, 22, 107, 77, 242, 139, 184, 127, 201, 12, 70, 11, 49, 194, 184, 136, 82, 103, 52, 214, 233, 13, 134, 23, 140, 57, 57, 187, 229, 191, 73, 100, 52, 83, 239, 169, 240, 62, 204, 82, 123, 186, 209, 156, 183, 95, 43, 104, 190, 199, 167, 166, 252, 91, 72, 9, 248, 48, 49, 125, 6, 139, 23, 96, 148, 174, 78, 111, 120, 213, 160, 86, 27, 137, 36, 9, 132, 233, 133, 178, 150, 231, 163, 146, 15, 49, 86, 62, 201, 1, 137, 36, 123, 149, 26, 43, 129, 48, 14, 178, 137, 83, 144, 34, 199, 77, 94, 33, 249, 73, 61, 15, 60, 254, 96, 159, 41, 118, 72, 49, 228, 89, 14, 232, 120, 245, 157, 154, 36, 238, 93, 126, 101, 234, 139, 58, 147, 169, 61, 59, 59, 123, 49, 17, 36, 129, 48, 67, 180, 72, 32, 176, 165, 88, 132, 124, 50, 114, 36, 97, 123, 64, 169, 17, 16, 8, 19, 89, 208, 205, 145, 197, 86, 188, 244, 60, 140, 32, 250, 188, 13, 27, 4, 179, 203, 181, 50, 212, 34, 150, 64, 32, 76, 3, 228, 149, 57, 182, 177, 2, 188, 31, 99, 146, 100, 57, 146, 176, 239, 245, 164, 73, 18, 98, 185, 168, 155, 75, 90, 178, 34, 66, 54, 46, 232, 185, 164, 72, 112, 2, 97, 186, 33, 19, 23, 104, 124, 213, 193, 69, 0, 98, 65, 146, 88, 187, 149, 114, 36, 9, 132, 232, 8, 147, 59, 91, 167, 155, 64, 32, 204, 4, 12, 7, 69, 232, 116, 187, 37, 45, 114, 40, 86, 213, 118, 164, 253, 97, 153, 187, 148, 57, 170, 5, 16, 8, 4, 2, 97, 62, 104, 146, 64, 102, 62, 69, 33, 129, 88, 146, 228, 227, 65, 43, 101, 2, 129, 64, 32, 16, 102, 5, 226, 20, 125, 36, 175, 143, 101, 142, 36, 166, 145, 72, 221, 63, 254, 155, 180, 72, 2, 129, 64, 32, 204, 70, 12, 215, 214, 196, 150, 71, 49, 238, 35, 121, 70, 218, 223, 231, 148, 26, 43, 129, 64, 32, 16, 8, 179, 5, 195, 218, 29, 144, 217, 239, 38, 131, 36, 65, 147, 108, 37, 146, 36, 16, 102, 55, 226, 72, 72, 34, 72, 120, 130, 169, 171, 147, 43, 105, 204, 74, 145, 131, 118, 176, 248, 56, 144, 218, 243, 146, 15, 241, 76, 44, 205, 173, 130, 193, 192, 250, 9, 2, 89, 46, 28, 245, 152, 2, 227, 25, 71, 207, 48, 9, 201, 204, 153, 251, 84, 129, 7, 179, 79, 197, 245, 145, 144, 132, 144, 208, 190, 180, 57, 21, 128, 2, 132, 198, 203, 57, 146, 49, 42, 73, 55, 28, 248, 163, 95, 189, 218, 60, 69, 26, 177, 138, 132, 132, 36, 102, 18, 207, 81, 160, 29, 97, 140, 154, 202, 136, 215, 85, 117, 158, 69, 165, 53, 53, 233, 88, 229, 223, 236, 170, 93, 57, 27, 197, 226, 114, 101, 214, 245, 245, 37, 234, 243, 242, 182, 198, 56, 71, 114, 16, 155, 120, 235, 244, 134, 55, 44, 85, 46, 99, 217, 166, 186, 20, 28, 171, 81, 143, 103, 75, 93, 234, 152, 175, 204, 200, 230, 190, 4, 2, 33, 150, 128, 39, 82, 179, 154, 227, 190, 170, 89, 192, 221, 174, 81, 113, 183, 169, 85, 220, 55, 72, 72, 152, 196, 115, 95, 215, 112, 220, 201, 12, 142, 219, 168, 208, 86, 152, 86, 185, 28, 254, 169, 57, 238, 65, 205, 162, 184, 55, 52, 11, 185, 23, 64, 94, 154, 157, 18, 247, 146, 38, 129, 251, 167, 144, 149, 241, 6, 16, 26, 144, 155, 118, 40, 54, 254, 72, 216, 15, 236, 79, 187, 58, 251, 12, 236, 255, 69, 246, 61, 163, 31, 207, 243, 154, 68, 238, 221, 108, 142, 59, 140, 99, 92, 198, 113, 163, 23, 30, 16, 69, 182, 96, 129, 107, 209, 162, 85, 103, 127, 159, 207, 76, 191, 21, 206, 229, 27, 36, 36, 36, 227, 19, 109, 230, 170, 219, 132, 172, 172, 59, 225, 153, 186, 138, 61, 99, 197, 219, 118, 93, 108, 63, 222, 34, 90, 175, 104, 98, 82, 77, 66, 34, 203, 145, 6, 209, 209, 232, 21, 75, 119, 238, 249, 26, 11, 60, 169, 171, 75, 148, 211, 37, 214, 29, 60, 152, 89, 180, 245, 162, 211, 165, 181, 59, 196, 226, 11, 182, 137, 197, 91, 183, 207, 78, 185, 96, 187, 88, 82, 123, 177, 152, 87, 101, 67, 66, 27, 10, 16, 101, 12, 72, 210, 192, 8, 114, 200, 92, 86, 46, 150, 92, 184, 131, 125, 79, 164, 227, 40, 217, 122, 145, 88, 84, 179, 77, 44, 219, 113, 137, 184, 166, 110, 239, 173, 140, 36, 203, 234, 35, 146, 100, 93, 192, 127, 201, 57, 91, 219, 170, 10, 207, 171, 17, 205, 150, 2, 49, 119, 205, 90, 49, 183, 180, 140, 132, 132, 100, 156, 146, 83, 178, 70, 204, 41, 46, 21, 45, 206, 13, 98, 197, 209, 19, 101, 220, 122, 223, 149, 101, 46, 223, 149, 127, 119, 181, 95, 249, 87, 167, 183, 231, 105, 167, 199, 255, 79, 167, 167, 251, 101, 7, 8, 123, 237, 245, 63, 231, 244, 245, 60, 235, 192, 45, 201, 188, 16, 197, 181, 126, 6, 228, 13, 151, 183, 183, 145, 77, 218, 245, 245, 11, 228, 137, 185, 198, 221, 151, 12, 127, 251, 21, 220, 35, 175, 193, 253, 242, 12, 124, 230, 249, 80, 226, 12, 243, 179, 51, 194, 235, 80, 239, 11, 245, 158, 112, 251, 119, 70, 248, 121, 196, 103, 60, 1, 113, 181, 93, 249, 108, 113, 237, 197, 239, 240, 203, 146, 68, 189, 201, 60, 113, 77, 82, 171, 101, 251, 225, 151, 37, 138, 37, 219, 235, 222, 134, 103, 235, 89, 120, 158, 158, 15, 55, 70, 120, 12, 236, 56, 97, 28, 97, 251, 38, 60, 135, 215, 225, 24, 187, 250, 250, 34, 214, 173, 148, 255, 110, 247, 116, 110, 183, 187, 219, 223, 178, 54, 120, 255, 97, 107, 244, 62, 103, 149, 196, 54, 137, 50, 217, 251, 31, 235, 177, 88, 35, 28, 151, 53, 134, 231, 101, 157, 194, 49, 176, 198, 120, 220, 173, 147, 48, 30, 19, 217, 135, 117, 154, 238, 167, 192, 253, 226, 123, 214, 214, 224, 121, 193, 122, 194, 243, 50, 200, 75, 182, 70, 223, 63, 108, 205, 237, 127, 116, 180, 118, 62, 102, 111, 106, 123, 186, 234, 104, 227, 64, 245, 241, 150, 247, 93, 222, 158, 74, 246, 176, 21, 56, 54, 107, 138, 107, 107, 45, 181, 125, 183, 44, 86, 62, 132, 48, 41, 46, 6, 237, 33, 181, 172, 118, 207, 202, 194, 189, 123, 87, 88, 15, 31, 94, 230, 106, 104, 88, 138, 130, 175, 231, 138, 200, 231, 68, 50, 82, 112, 108, 138, 246, 239, 95, 18, 97, 158, 86, 85, 184, 221, 201, 179, 247, 126, 232, 96, 226, 186, 255, 254, 4, 208, 252, 238, 147, 210, 63, 78, 197, 68, 147, 212, 235, 207, 24, 12, 122, 209, 80, 88, 82, 143, 3, 85, 114, 240, 224, 114, 229, 119, 70, 146, 241, 248, 138, 129, 48, 23, 214, 244, 221, 144, 236, 234, 187, 113, 233, 182, 235, 174, 91, 70, 66, 66, 50, 82, 172, 32, 248, 124, 108, 234, 252, 100, 138, 171, 222, 183, 18, 127, 39, 63, 68, 91, 63, 241, 137, 21, 249, 27, 54, 215, 24, 114, 243, 63, 167, 21, 132, 63, 233, 120, 141, 200, 167, 38, 159, 28, 126, 202, 212, 28, 247, 37, 144, 247, 179, 57, 238, 127, 65, 174, 215, 112, 220, 30, 117, 122, 178, 145, 60, 182, 132, 128, 217, 47, 80, 161, 223, 197, 113, 9, 146, 185, 53, 65, 202, 249, 155, 51, 1, 35, 160, 253, 61, 38, 145, 228, 233, 88, 4, 237, 200, 221, 63, 212, 105, 201, 229, 227, 56, 28, 41, 226, 60, 186, 40, 60, 89, 187, 39, 16, 8, 99, 3, 207, 113, 249, 171, 57, 238, 74, 224, 189, 135, 249, 21, 75, 251, 115, 214, 86, 136, 37, 219, 118, 138, 214, 99, 205, 98, 229, 225, 99, 63, 26, 126, 99, 249, 193, 99, 247, 216, 79, 120, 196, 53, 59, 118, 139, 5, 174, 141, 162, 49, 47, 95, 20, 210, 82, 78, 105, 18, 185, 63, 242, 201, 11, 111, 21, 52, 154, 195, 230, 178, 178, 220, 80, 62, 17, 244, 83, 25, 107, 106, 146, 152, 191, 170, 175, 47, 1, 127, 215, 215, 215, 199, 30, 220, 217, 32, 125, 20, 25, 56, 239, 129, 247, 46, 104, 126, 175, 5, 114, 36, 99, 146, 254, 209, 207, 246, 165, 215, 191, 149, 91, 94, 158, 70, 35, 28, 91, 200, 243, 204, 120, 69, 14, 118, 34, 204, 160, 133, 120, 125, 253, 130, 88, 241, 6, 238, 7, 5, 247, 41, 115, 147, 242, 154, 231, 217, 237, 89, 192, 105, 141, 154, 133, 113, 191, 230, 211, 83, 7, 242, 42, 171, 197, 181, 187, 47, 19, 237, 77, 62, 209, 213, 118, 165, 232, 244, 249, 223, 112, 122, 123, 30, 118, 249, 122, 125, 195, 7, 8, 191, 240, 130, 60, 14, 242, 146, 211, 211, 45, 58, 90, 187, 196, 234, 122, 183, 88, 86, 183, 79, 180, 0, 105, 26, 114, 114, 69, 62, 101, 225, 123, 160, 97, 62, 162, 94, 192, 221, 32, 172, 74, 219, 97, 46, 46, 94, 29, 202, 244, 99, 225, 184, 68, 41, 42, 111, 86, 144, 15, 168, 203, 73, 58, 158, 223, 165, 51, 26, 143, 106, 13, 134, 203, 245, 38, 211, 33, 189, 158, 100, 132, 152, 34, 200, 108, 62, 47, 163, 241, 48, 200, 62, 173, 86, 219, 161, 168, 215, 26, 139, 244, 143, 211, 146, 86, 250, 152, 177, 172, 218, 96, 46, 171, 202, 53, 86, 84, 228, 155, 214, 84, 230, 69, 37, 149, 227, 148, 53, 115, 83, 112, 252, 228, 49, 44, 42, 42, 90, 50, 225, 103, 30, 38, 78, 220, 223, 92, 29, 175, 217, 116, 93, 243, 214, 86, 23, 88, 170, 170, 82, 149, 174, 131, 24, 32, 30, 121, 104, 132, 66, 119, 242, 100, 188, 46, 123, 213, 102, 22, 177, 191, 40, 238, 53, 99, 190, 133, 5, 236, 89, 143, 181, 136, 46, 95, 143, 8, 220, 247, 47, 167, 199, 127, 135, 163, 165, 115, 175, 189, 190, 53, 43, 252, 10, 173, 161, 61, 211, 225, 110, 223, 12, 68, 121, 21, 124, 232, 71, 192, 168, 47, 194, 7, 69, 36, 78, 70, 154, 59, 247, 136, 249, 54, 151, 168, 135, 9, 128, 95, 146, 240, 166, 154, 227, 126, 174, 94, 200, 93, 13, 147, 140, 11, 243, 192, 206, 89, 161, 91, 44, 137, 51, 216, 44, 23, 47, 171, 219, 186, 172, 85, 162, 118, 197, 82, 81, 155, 150, 2, 146, 44, 109, 73, 230, 133, 192, 117, 215, 169, 179, 81, 235, 19, 99, 212, 249, 131, 237, 135, 105, 146, 106, 245, 223, 213, 113, 220, 171, 240, 156, 244, 107, 226, 184, 15, 65, 78, 145, 140, 79, 96, 12, 223, 225, 65, 7, 132, 237, 245, 146, 25, 107, 204, 38, 102, 185, 44, 32, 172, 238, 61, 188, 138, 237, 235, 61, 216, 247, 105, 26, 223, 105, 186, 166, 113, 28, 42, 94, 162, 102, 33, 247, 96, 172, 220, 66, 193, 165, 31, 205, 133, 101, 185, 154, 197, 170, 43, 53, 42, 238, 79, 160, 12, 137, 5, 235, 207, 19, 43, 47, 175, 23, 93, 94, 224, 53, 175, 255, 148, 195, 235, 255, 95, 32, 198, 99, 231, 16, 35, 104, 158, 35, 172, 140, 82, 148, 92, 92, 8, 21, 120, 165, 189, 185, 99, 35, 35, 77, 95, 207, 79, 128, 56, 95, 3, 17, 97, 167, 98, 213, 225, 19, 98, 233, 182, 157, 98, 110, 121, 165, 168, 93, 157, 37, 194, 9, 63, 139, 57, 117, 154, 149, 43, 142, 27, 45, 165, 249, 33, 206, 33, 193, 21, 232, 50, 173, 226, 102, 64, 21, 3, 57, 50, 208, 230, 110, 255, 130, 179, 165, 67, 172, 132, 243, 169, 190, 194, 77, 105, 31, 243, 72, 170, 142, 54, 138, 214, 227, 45, 98, 233, 69, 117, 34, 159, 182, 124, 16, 180, 202, 152, 165, 127, 240, 43, 151, 15, 174, 185, 248, 18, 177, 242, 224, 49, 113, 237, 37, 251, 197, 117, 123, 46, 39, 153, 136, 92, 122, 128, 9, 94, 51, 71, 71, 111, 30, 62, 187, 99, 115, 149, 156, 53, 183, 85, 28, 58, 254, 68, 229, 254, 163, 116, 93, 166, 245, 122, 226, 246, 32, 179, 86, 218, 79, 180, 138, 246, 230, 206, 79, 203, 102, 215, 177, 250, 239, 165, 70, 230, 113, 10, 75, 65, 178, 144, 149, 181, 15, 22, 65, 255, 205, 167, 44, 254, 48, 119, 109, 69, 224, 123, 220, 237, 162, 171, 173, 23, 181, 198, 39, 156, 173, 254, 107, 170, 234, 61, 133, 193, 156, 80, 86, 127, 203, 130, 72, 197, 57, 226, 240, 77, 53, 110, 119, 18, 86, 32, 9, 69, 100, 235, 14, 54, 100, 218, 221, 157, 91, 65, 195, 252, 20, 144, 230, 131, 240, 101, 239, 2, 27, 139, 246, 70, 159, 88, 126, 217, 97, 177, 104, 243, 5, 162, 201, 82, 32, 242, 203, 23, 125, 0, 7, 248, 176, 102, 73, 194, 103, 116, 26, 205, 102, 99, 69, 77, 114, 24, 77, 46, 129, 155, 166, 210, 63, 114, 176, 3, 44, 2, 142, 195, 57, 252, 220, 233, 235, 253, 62, 156, 207, 189, 112, 94, 247, 140, 216, 6, 75, 184, 223, 71, 251, 190, 224, 223, 43, 127, 14, 126, 61, 159, 37, 154, 49, 30, 109, 92, 67, 237, 71, 113, 125, 29, 30, 255, 15, 215, 119, 246, 221, 85, 122, 209, 238, 191, 11, 160, 85, 234, 140, 198, 65, 157, 78, 59, 65, 146, 212, 179, 92, 75, 33, 115, 149, 184, 118, 207, 193, 135, 54, 116, 246, 221, 225, 244, 248, 239, 113, 121, 123, 126, 64, 50, 126, 129, 57, 231, 251, 236, 218, 121, 252, 223, 173, 242, 120, 86, 203, 171, 253, 241, 60, 251, 176, 159, 143, 184, 124, 61, 247, 193, 125, 240, 189, 121, 49, 118, 94, 255, 221, 51, 244, 154, 222, 13, 243, 238, 93, 112, 61, 126, 106, 111, 237, 58, 24, 152, 151, 79, 142, 102, 33, 136, 83, 112, 199, 8, 50, 211, 106, 77, 21, 160, 53, 126, 78, 173, 226, 158, 53, 152, 76, 98, 113, 205, 54, 182, 24, 150, 204, 169, 255, 134, 113, 248, 134, 189, 169, 115, 75, 176, 41, 22, 57, 111, 180, 116, 171, 208, 0, 54, 13, 48, 107, 253, 130, 112, 59, 176, 157, 240, 232, 65, 171, 60, 0, 7, 241, 53, 56, 136, 39, 29, 158, 238, 65, 217, 52, 187, 230, 226, 75, 89, 130, 182, 78, 163, 22, 53, 137, 220, 11, 154, 120, 238, 164, 144, 186, 236, 136, 177, 160, 192, 16, 74, 203, 196, 66, 211, 114, 162, 250, 20, 130, 28, 248, 4, 142, 95, 177, 236, 11, 70, 120, 168, 98, 20, 217, 58, 16, 136, 108, 53, 244, 167, 51, 151, 55, 97, 50, 158, 91, 173, 203, 181, 80, 118, 231, 68, 43, 56, 199, 68, 85, 197, 136, 48, 61, 136, 188, 232, 81, 73, 166, 212, 17, 215, 207, 92, 92, 181, 154, 95, 190, 212, 173, 142, 231, 30, 16, 86, 173, 28, 202, 183, 58, 196, 242, 125, 135, 152, 181, 19, 22, 193, 131, 64, 196, 15, 216, 91, 186, 154, 214, 53, 52, 100, 158, 171, 53, 214, 47, 136, 109, 73, 71, 201, 70, 139, 76, 31, 138, 52, 45, 150, 186, 68, 171, 219, 91, 233, 108, 237, 234, 102, 166, 89, 95, 207, 235, 32, 162, 3, 84, 220, 138, 253, 71, 68, 172, 8, 98, 202, 183, 128, 150, 185, 248, 61, 88, 6, 254, 90, 189, 144, 187, 74, 48, 26, 171, 144, 197, 67, 17, 38, 55, 69, 13, 106, 229, 72, 40, 78, 218, 78, 183, 112, 82, 132, 215, 124, 127, 94, 216, 24, 140, 113, 204, 48, 138, 13, 111, 252, 209, 68, 126, 31, 78, 180, 248, 93, 58, 131, 225, 254, 24, 182, 200, 234, 151, 58, 137, 60, 163, 45, 41, 89, 142, 251, 87, 87, 85, 45, 146, 211, 104, 102, 154, 224, 115, 27, 227, 98, 248, 132, 153, 22, 13, 140, 202, 199, 12, 110, 160, 48, 252, 28, 135, 137, 29, 145, 59, 245, 200, 192, 154, 209, 186, 236, 236, 90, 13, 199, 125, 135, 95, 154, 240, 150, 169, 176, 88, 44, 221, 190, 75, 180, 53, 120, 152, 57, 213, 133, 197, 111, 60, 221, 215, 219, 26, 219, 42, 70, 206, 41, 39, 227, 153, 166, 26, 248, 174, 169, 81, 144, 2, 97, 182, 183, 44, 8, 101, 71, 174, 56, 234, 86, 59, 91, 186, 234, 64, 195, 252, 34, 144, 229, 95, 224, 160, 3, 1, 64, 71, 155, 216, 9, 229, 174, 171, 96, 38, 41, 56, 209, 63, 131, 150, 121, 163, 142, 231, 107, 75, 92, 23, 45, 15, 30, 32, 87, 8, 181, 122, 174, 175, 146, 241, 63, 67, 117, 245, 42, 99, 97, 105, 149, 185, 184, 184, 220, 84, 84, 84, 49, 31, 4, 207, 213, 80, 80, 82, 109, 172, 168, 80, 143, 81, 211, 159, 208, 13, 15, 132, 246, 87, 137, 216, 6, 98, 65, 146, 72, 184, 176, 191, 239, 205, 145, 21, 252, 152, 160, 205, 207, 175, 48, 228, 229, 93, 2, 178, 67, 159, 107, 217, 73, 50, 29, 146, 123, 49, 110, 117, 57, 150, 93, 160, 144, 200, 41, 72, 170, 89, 54, 7, 38, 72, 50, 12, 67, 110, 110, 25, 191, 72, 117, 29, 76, 14, 79, 98, 243, 128, 194, 77, 231, 139, 149, 135, 142, 139, 46, 47, 154, 83, 253, 31, 160, 251, 196, 230, 110, 223, 83, 86, 55, 34, 136, 52, 206, 130, 238, 195, 25, 177, 128, 131, 131, 192, 131, 145, 252, 153, 35, 128, 43, 1, 100, 117, 135, 215, 223, 3, 76, 255, 11, 56, 161, 119, 209, 78, 140, 204, 143, 206, 115, 139, 221, 37, 234, 4, 94, 4, 149, 249, 121, 205, 2, 238, 91, 66, 214, 170, 125, 186, 138, 138, 140, 8, 3, 167, 154, 179, 4, 41, 93, 204, 108, 142, 251, 162, 118, 89, 162, 200, 47, 142, 63, 165, 89, 146, 48, 52, 47, 100, 113, 66, 191, 0, 231, 12, 15, 193, 125, 242, 61, 21, 5, 1, 202, 247, 66, 130, 102, 145, 234, 179, 218, 204, 140, 123, 248, 140, 149, 223, 17, 86, 165, 223, 17, 81, 50, 211, 239, 132, 247, 125, 87, 155, 157, 121, 183, 162, 202, 206, 80, 172, 34, 91, 181, 171, 179, 255, 38, 172, 74, 187, 29, 191, 103, 212, 99, 153, 106, 201, 76, 191, 131, 141, 81, 118, 198, 189, 124, 34, 119, 93, 12, 22, 27, 241, 1, 107, 146, 37, 81, 147, 178, 232, 73, 109, 114, 146, 136, 37, 249, 176, 204, 95, 96, 59, 151, 36, 105, 6, 239, 87, 218, 7, 142, 255, 210, 5, 162, 46, 101, 161, 168, 51, 153, 62, 170, 184, 70, 113, 51, 152, 20, 149, 49, 42, 103, 185, 163, 168, 72, 205, 167, 47, 119, 107, 226, 184, 95, 243, 105, 41, 253, 121, 149, 86, 22, 192, 133, 22, 74, 12, 34, 5, 5, 236, 255, 57, 90, 187, 122, 108, 141, 222, 17, 237, 232, 152, 197, 40, 76, 108, 205, 204, 128, 148, 200, 41, 39, 136, 6, 255, 185, 242, 120, 171, 22, 78, 236, 48, 230, 165, 176, 52, 19, 175, 95, 116, 52, 119, 136, 229, 151, 29, 17, 11, 55, 110, 17, 13, 38, 179, 168, 89, 20, 247, 58, 104, 152, 247, 240, 169, 203, 174, 208, 149, 150, 10, 231, 154, 119, 185, 196, 224, 168, 166, 89, 15, 105, 172, 92, 125, 247, 39, 172, 221, 115, 232, 142, 210, 29, 151, 136, 32, 111, 151, 238, 216, 253, 254, 124, 144, 146, 29, 151, 188, 11, 91, 88, 56, 29, 248, 105, 205, 13, 55, 36, 201, 214, 138, 72, 67, 38, 221, 3, 92, 249, 158, 67, 27, 242, 109, 78, 209, 92, 84, 44, 154, 177, 64, 113, 52, 82, 90, 198, 222, 31, 67, 130, 148, 107, 183, 14, 26, 45, 133, 108, 255, 57, 209, 30, 203, 84, 11, 158, 123, 65, 145, 104, 113, 172, 23, 173, 39, 90, 143, 78, 132, 36, 135, 221, 3, 160, 145, 150, 95, 94, 255, 148, 181, 190, 153, 173, 240, 49, 2, 158, 100, 250, 4, 35, 171, 215, 183, 245, 138, 246, 150, 174, 79, 201, 230, 198, 25, 54, 227, 201, 126, 198, 17, 26, 35, 70, 167, 242, 233, 233, 187, 64, 105, 186, 139, 95, 146, 240, 150, 9, 238, 83, 204, 164, 176, 30, 111, 13, 4, 225, 248, 122, 94, 6, 133, 235, 43, 214, 230, 142, 245, 231, 204, 7, 17, 98, 104, 102, 188, 118, 132, 15, 82, 168, 84, 147, 170, 35, 71, 82, 237, 205, 109, 219, 65, 85, 190, 25, 6, 224, 175, 44, 47, 179, 181, 11, 30, 178, 99, 98, 209, 249, 181, 129, 104, 217, 228, 164, 119, 80, 187, 208, 36, 47, 110, 52, 172, 89, 19, 28, 12, 161, 154, 74, 31, 230, 164, 251, 225, 0, 213, 205, 109, 5, 176, 136, 24, 194, 234, 15, 112, 51, 12, 178, 21, 211, 188, 16, 255, 144, 203, 215, 43, 162, 105, 222, 218, 212, 177, 150, 45, 134, 66, 88, 38, 130, 253, 12, 184, 197, 213, 228, 250, 246, 43, 69, 107, 163, 239, 52, 172, 42, 135, 2, 226, 83, 136, 119, 196, 214, 218, 224, 25, 178, 55, 119, 12, 193, 194, 108, 64, 200, 72, 31, 210, 25, 12, 177, 168, 215, 42, 106, 5, 126, 72, 15, 139, 188, 170, 163, 77, 162, 205, 221, 14, 223, 227, 13, 250, 126, 95, 152, 159, 67, 73, 52, 239, 137, 244, 57, 239, 104, 251, 237, 71, 83, 149, 189, 165, 243, 185, 97, 115, 212, 120, 76, 175, 138, 207, 56, 219, 122, 187, 157, 109, 61, 247, 184, 218, 122, 191, 13, 175, 191, 59, 82, 122, 78, 6, 68, 126, 173, 220, 6, 255, 93, 249, 115, 184, 207, 5, 255, 45, 220, 231, 70, 251, 124, 164, 239, 14, 222, 111, 168, 243, 8, 245, 217, 112, 239, 15, 247, 221, 145, 246, 27, 105, 255, 17, 198, 192, 215, 251, 45, 71, 107, 247, 125, 14, 119, 199, 190, 104, 22, 156, 83, 133, 80, 249, 140, 174, 131, 7, 23, 234, 121, 126, 147, 70, 197, 125, 1, 3, 61, 13, 70, 163, 88, 120, 222, 5, 140, 236, 101, 115, 42, 204, 17, 63, 134, 103, 234, 112, 249, 129, 198, 180, 224, 32, 156, 57, 87, 73, 9, 47, 150, 165, 174, 47, 49, 152, 241, 49, 144, 194, 238, 110, 119, 58, 60, 61, 159, 128, 11, 252, 123, 22, 157, 4, 164, 89, 117, 164, 129, 181, 18, 50, 23, 22, 139, 154, 228, 164, 119, 129, 48, 127, 44, 164, 173, 104, 50, 175, 91, 167, 15, 14, 250, 145, 100, 214, 15, 150, 181, 209, 99, 177, 158, 240, 216, 173, 39, 188, 149, 85, 13, 205, 213, 179, 65, 170, 27, 91, 171, 38, 242, 153, 234, 99, 173, 85, 182, 6, 159, 205, 209, 52, 50, 127, 41, 26, 127, 36, 22, 89, 119, 182, 118, 87, 109, 240, 246, 84, 59, 219, 174, 172, 114, 192, 54, 156, 224, 223, 241, 62, 219, 122, 221, 141, 121, 5, 27, 183, 124, 70, 175, 21, 98, 229, 143, 100, 141, 150, 129, 36, 159, 198, 99, 113, 117, 244, 85, 218, 91, 187, 173, 163, 29, 207, 116, 9, 30, 151, 211, 211, 109, 183, 181, 116, 242, 49, 240, 237, 82, 164, 248, 44, 136, 117, 152, 78, 115, 170, 108, 245, 9, 242, 51, 86, 107, 146, 184, 79, 195, 156, 254, 23, 204, 132, 192, 246, 84, 152, 78, 136, 209, 169, 146, 57, 245, 49, 120, 221, 91, 113, 204, 157, 63, 23, 52, 198, 113, 107, 79, 24, 225, 26, 34, 248, 71, 101, 59, 225, 43, 3, 173, 162, 215, 225, 243, 63, 4, 219, 51, 140, 48, 143, 54, 50, 194, 52, 21, 20, 138, 252, 210, 132, 183, 213, 113, 220, 255, 8, 25, 43, 143, 90, 214, 173, 203, 12, 225, 39, 73, 152, 11, 26, 38, 97, 242, 38, 0, 117, 34, 119, 181, 49, 80, 68, 160, 63, 54, 65, 59, 70, 208, 38, 133, 219, 231, 235, 133, 192, 137, 171, 111, 134, 68, 138, 207, 102, 137, 85, 13, 211, 112, 217, 8, 211, 229, 99, 100, 196, 104, 48, 148, 105, 146, 23, 126, 20, 136, 241, 49, 97, 85, 218, 16, 166, 10, 98, 108, 138, 189, 169, 77, 54, 167, 62, 13, 154, 227, 13, 184, 96, 14, 122, 182, 227, 88, 30, 255, 204, 51, 27, 79, 37, 97, 158, 140, 103, 61, 11, 79, 158, 59, 8, 104, 130, 180, 99, 122, 137, 183, 231, 55, 14, 175, 255, 52, 250, 49, 81, 195, 196, 132, 81, 44, 200, 174, 89, 172, 250, 183, 58, 129, 187, 131, 79, 79, 221, 133, 54, 237, 17, 254, 75, 110, 216, 127, 57, 217, 96, 225, 202, 99, 205, 223, 10, 149, 207, 85, 180, 121, 255, 18, 75, 93, 221, 210, 153, 46, 216, 74, 11, 183, 101, 181, 181, 139, 163, 73, 191, 8, 153, 146, 209, 215, 151, 136, 150, 5, 38, 210, 107, 69, 208, 78, 84, 34, 47, 182, 216, 231, 163, 144, 178, 218, 122, 214, 22, 78, 111, 50, 221, 41, 69, 163, 198, 130, 36, 207, 224, 190, 180, 6, 67, 51, 187, 239, 112, 92, 228, 243, 139, 165, 192, 248, 4, 198, 238, 150, 152, 72, 85, 93, 221, 162, 88, 220, 183, 242, 189, 139, 22, 33, 172, 143, 74, 50, 70, 49, 214, 176, 177, 59, 27, 107, 33, 198, 141, 229, 25, 136, 32, 83, 179, 64, 114, 185, 228, 244, 189, 115, 72, 25, 126, 191, 134, 95, 156, 112, 181, 38, 142, 123, 4, 230, 232, 254, 220, 117, 149, 98, 217, 174, 61, 162, 173, 193, 171, 240, 51, 118, 127, 211, 233, 238, 172, 197, 251, 49, 120, 225, 21, 251, 156, 198, 185, 160, 25, 140, 244, 99, 142, 128, 253, 68, 91, 17, 250, 160, 88, 213, 31, 79, 247, 0, 106, 152, 232, 195, 196, 92, 76, 180, 101, 179, 226, 5, 42, 238, 38, 173, 86, 235, 12, 178, 195, 199, 75, 182, 240, 184, 73, 90, 61, 17, 198, 183, 226, 196, 173, 106, 10, 69, 110, 67, 197, 193, 61, 242, 27, 41, 71, 114, 32, 102, 145, 173, 90, 45, 203, 207, 146, 18, 215, 99, 125, 110, 202, 49, 35, 144, 117, 100, 186, 53, 155, 248, 80, 196, 136, 11, 86, 120, 174, 172, 48, 23, 95, 11, 26, 227, 239, 65, 99, 28, 196, 180, 63, 44, 50, 99, 59, 209, 170, 168, 130, 211, 243, 61, 91, 115, 199, 126, 44, 129, 26, 76, 140, 114, 174, 52, 221, 10, 99, 48, 203, 134, 10, 233, 181, 30, 243, 172, 5, 173, 242, 26, 12, 5, 150, 235, 202, 150, 239, 59, 204, 162, 246, 180, 217, 89, 152, 135, 249, 40, 159, 178, 164, 43, 216, 127, 41, 173, 214, 84, 177, 188, 161, 141, 198, 210, 116, 67, 78, 206, 122, 173, 209, 232, 156, 47, 162, 51, 153, 28, 122, 179, 121, 163, 62, 47, 207, 52, 198, 135, 123, 70, 76, 2, 64, 108, 255, 144, 114, 36, 39, 218, 253, 99, 64, 106, 143, 245, 204, 20, 30, 190, 42, 22, 247, 45, 92, 199, 74, 169, 171, 203, 94, 157, 209, 120, 25, 118, 70, 81, 110, 131, 95, 71, 35, 209, 188, 63, 210, 254, 195, 125, 62, 212, 239, 241, 119, 161, 142, 121, 60, 223, 173, 220, 215, 104, 251, 139, 244, 189, 161, 126, 14, 126, 175, 114, 203, 4, 198, 223, 96, 50, 29, 52, 24, 44, 198, 25, 74, 148, 113, 65, 254, 197, 17, 199, 135, 121, 238, 122, 65, 216, 170, 89, 192, 125, 30, 243, 223, 181, 89, 25, 34, 182, 161, 194, 198, 24, 1, 98, 236, 69, 141, 241, 45, 44, 11, 233, 104, 233, 56, 130, 185, 244, 193, 126, 70, 201, 237, 70, 11, 192, 137, 94, 40, 52, 55, 133, 200, 199, 140, 183, 186, 219, 237, 104, 203, 134, 139, 240, 12, 94, 16, 91, 163, 151, 93, 32, 12, 119, 231, 151, 196, 191, 163, 73, 224, 190, 167, 227, 179, 107, 131, 162, 160, 84, 220, 4, 115, 47, 101, 83, 174, 54, 43, 243, 102, 163, 192, 139, 122, 141, 90, 212, 243, 243, 67, 208, 217, 142, 231, 172, 85, 171, 159, 82, 152, 180, 227, 163, 153, 220, 241, 253, 218, 213, 89, 183, 192, 195, 244, 11, 24, 187, 251, 96, 251, 147, 41, 144, 31, 11, 89, 25, 63, 21, 50, 87, 253, 8, 190, 251, 126, 69, 149, 157, 161, 9, 7, 237, 160, 22, 201, 107, 222, 96, 251, 150, 190, 43, 182, 199, 158, 121, 159, 144, 157, 249, 115, 33, 99, 213, 183, 96, 248, 150, 200, 43, 249, 9, 147, 228, 234, 236, 63, 24, 181, 2, 92, 79, 141, 104, 32, 153, 114, 145, 199, 29, 231, 13, 19, 92, 7, 184, 198, 55, 48, 109, 42, 132, 217, 114, 138, 9, 81, 158, 27, 195, 198, 118, 96, 153, 81, 126, 101, 234, 21, 234, 120, 238, 14, 144, 23, 176, 211, 6, 230, 189, 163, 143, 113, 216, 148, 138, 26, 163, 207, 127, 55, 166, 253, 173, 59, 212, 160, 81, 126, 30, 45, 125, 243, 222, 207, 56, 217, 218, 101, 168, 40, 39, 244, 143, 57, 220, 29, 23, 59, 188, 254, 59, 225, 2, 189, 137, 33, 196, 232, 191, 196, 144, 98, 157, 32, 136, 64, 150, 127, 230, 151, 37, 118, 97, 221, 191, 17, 228, 59, 94, 83, 172, 52, 81, 89, 108, 46, 91, 78, 133, 245, 211, 57, 229, 213, 31, 51, 151, 87, 95, 203, 164, 82, 218, 42, 95, 87, 42, 36, 248, 231, 224, 191, 149, 71, 248, 76, 180, 159, 29, 237, 125, 209, 254, 28, 226, 156, 114, 42, 170, 174, 201, 45, 175, 254, 15, 243, 218, 138, 75, 199, 160, 37, 202, 11, 146, 68, 67, 94, 193, 95, 205, 176, 136, 49, 21, 149, 76, 173, 20, 151, 138, 88, 206, 42, 102, 57, 146, 1, 130, 28, 48, 228, 230, 157, 49, 149, 172, 153, 220, 227, 46, 46, 125, 175, 184, 118, 167, 37, 202, 5, 201, 168, 215, 193, 226, 218, 100, 203, 179, 185, 26, 243, 172, 174, 35, 185, 118, 231, 21, 36, 211, 35, 56, 254, 121, 182, 245, 13, 121, 142, 243, 76, 18, 131, 168, 166, 152, 20, 227, 21, 237, 13, 67, 18, 180, 217, 229, 90, 169, 203, 206, 222, 204, 39, 169, 174, 83, 199, 113, 15, 105, 82, 22, 190, 135, 49, 33, 56, 183, 98, 249, 209, 64, 146, 191, 95, 148, 242, 223, 79, 218, 91, 58, 47, 11, 213, 159, 113, 88, 107, 164, 6, 216, 211, 239, 195, 180, 213, 183, 240, 246, 150, 174, 118, 80, 243, 31, 97, 230, 216, 230, 14, 214, 54, 133, 105, 151, 203, 18, 223, 130, 213, 207, 151, 245, 102, 243, 186, 16, 100, 25, 157, 22, 41, 69, 229, 178, 98, 239, 173, 93, 175, 97, 143, 50, 144, 183, 224, 251, 222, 97, 93, 82, 112, 43, 75, 240, 207, 193, 194, 186, 170, 72, 239, 9, 245, 89, 229, 223, 195, 125, 118, 180, 191, 135, 58, 150, 224, 239, 12, 181, 159, 240, 199, 243, 38, 156, 239, 25, 144, 167, 173, 77, 29, 217, 129, 53, 67, 228, 85, 161, 124, 141, 170, 219, 250, 86, 217, 155, 59, 223, 216, 208, 113, 53, 91, 113, 178, 186, 139, 83, 33, 240, 16, 111, 232, 234, 19, 43, 46, 175, 23, 133, 140, 149, 131, 186, 128, 153, 116, 2, 4, 105, 96, 5, 4, 64, 88, 21, 169, 245, 29, 87, 77, 222, 249, 160, 201, 10, 142, 31, 183, 152, 95, 172, 188, 7, 199, 100, 253, 144, 62, 227, 108, 109, 171, 130, 251, 118, 192, 193, 202, 122, 117, 7, 68, 126, 141, 219, 64, 185, 175, 179, 175, 67, 253, 28, 74, 60, 163, 252, 237, 156, 125, 118, 143, 190, 207, 112, 251, 101, 199, 61, 134, 253, 68, 60, 182, 238, 200, 231, 30, 238, 189, 242, 49, 120, 198, 113, 254, 30, 204, 1, 244, 127, 232, 244, 116, 191, 7, 251, 25, 2, 98, 121, 106, 115, 91, 155, 212, 92, 90, 156, 172, 248, 9, 102, 50, 149, 3, 182, 194, 89, 210, 138, 170, 55, 175, 18, 4, 97, 131, 102, 161, 170, 135, 229, 170, 39, 113, 175, 160, 182, 136, 17, 169, 107, 118, 92, 194, 186, 108, 96, 185, 81, 71, 107, 247, 80, 160, 252, 168, 255, 22, 120, 166, 183, 219, 78, 156, 88, 17, 172, 49, 202, 145, 207, 68, 140, 51, 132, 52, 67, 105, 152, 214, 6, 239, 122, 135, 167, 231, 107, 176, 202, 121, 11, 39, 28, 12, 246, 177, 56, 55, 138, 24, 134, 12, 55, 192, 15, 181, 90, 237, 150, 16, 102, 216, 81, 181, 89, 220, 86, 184, 251, 146, 237, 238, 142, 207, 218, 220, 109, 223, 5, 249, 186, 221, 221, 254, 205, 249, 32, 182, 166, 182, 219, 64, 78, 218, 220, 237, 159, 25, 126, 176, 71, 89, 1, 203, 193, 84, 152, 219, 8, 15, 212, 117, 48, 73, 127, 197, 209, 218, 249, 5, 216, 222, 2, 19, 196, 23, 39, 83, 240, 59, 108, 205, 29, 95, 94, 223, 113, 245, 245, 37, 219, 235, 126, 171, 205, 206, 68, 130, 28, 154, 96, 255, 200, 1, 157, 70, 35, 26, 243, 11, 94, 183, 53, 181, 223, 50, 153, 231, 225, 104, 129, 113, 106, 238, 252, 10, 140, 253, 173, 174, 38, 95, 174, 242, 30, 28, 171, 21, 134, 93, 3, 119, 135, 26, 246, 245, 37, 184, 134, 183, 179, 251, 182, 169, 237, 27, 36, 211, 33, 237, 223, 128, 123, 135, 61, 75, 246, 230, 142, 107, 70, 185, 166, 202, 200, 85, 101, 48, 26, 235, 217, 139, 1, 99, 195, 82, 198, 177, 66, 246, 174, 40, 210, 225, 48, 161, 31, 123, 1, 107, 179, 179, 47, 225, 147, 184, 79, 193, 156, 248, 51, 77, 2, 247, 178, 86, 189, 90, 196, 158, 140, 37, 23, 94, 196, 26, 22, 163, 182, 40, 153, 81, 223, 4, 98, 252, 57, 166, 233, 85, 55, 182, 85, 5, 23, 34, 199, 249, 87, 17, 169, 78, 152, 169, 144, 123, 100, 42, 127, 87, 113, 244, 168, 218, 238, 1, 237, 210, 219, 243, 4, 146, 37, 54, 222, 45, 62, 191, 86, 212, 193, 205, 160, 137, 231, 126, 41, 8, 171, 183, 42, 125, 157, 163, 146, 37, 173, 140, 148, 131, 17, 221, 88, 204, 128, 49, 227, 151, 37, 126, 60, 70, 57, 146, 167, 112, 63, 122, 173, 246, 214, 41, 63, 137, 137, 76, 64, 52, 121, 205, 120, 119, 18, 119, 182, 201, 131, 210, 55, 56, 161, 103, 7, 221, 81, 218, 220, 18, 45, 44, 236, 28, 66, 122, 234, 97, 205, 34, 213, 103, 176, 65, 177, 58, 142, 123, 146, 95, 190, 248, 3, 108, 62, 142, 154, 34, 150, 130, 67, 82, 196, 252, 69, 102, 66, 197, 170, 55, 190, 158, 199, 96, 123, 147, 189, 181, 123, 87, 112, 224, 141, 114, 190, 165, 78, 70, 179, 216, 127, 25, 156, 18, 98, 107, 233, 170, 115, 120, 253, 191, 64, 83, 44, 222, 12, 37, 23, 238, 16, 117, 188, 70, 84, 39, 112, 63, 215, 243, 188, 77, 126, 163, 212, 168, 51, 46, 210, 164, 47, 135, 45, 207, 71, 9, 85, 114, 48, 26, 66, 69, 211, 236, 84, 38, 105, 99, 46, 151, 220, 183, 20, 52, 192, 31, 196, 160, 69, 22, 106, 161, 3, 210, 126, 246, 179, 96, 134, 154, 154, 164, 201, 79, 54, 63, 25, 155, 240, 120, 105, 95, 243, 245, 190, 157, 14, 81, 182, 230, 147, 231, 37, 188, 103, 170, 170, 234, 22, 97, 91, 53, 220, 114, 81, 4, 18, 98, 46, 53, 198, 85, 232, 245, 185, 133, 90, 181, 218, 41, 172, 74, 187, 88, 179, 124, 201, 33, 126, 105, 82, 179, 122, 145, 170, 93, 179, 88, 229, 215, 44, 228, 174, 209, 44, 224, 254, 83, 163, 226, 110, 5, 70, 187, 23, 228, 33, 80, 4, 158, 230, 147, 147, 222, 70, 43, 10, 250, 19, 243, 170, 237, 98, 241, 5, 219, 197, 117, 123, 46, 23, 173, 245, 238, 64, 181, 27, 143, 95, 116, 120, 123, 222, 198, 202, 103, 64, 138, 95, 194, 166, 200, 214, 19, 45, 57, 225, 20, 17, 150, 223, 78, 193, 55, 115, 199, 20, 43, 219, 199, 71, 152, 98, 155, 59, 214, 3, 89, 222, 205, 138, 173, 187, 219, 217, 77, 163, 93, 157, 37, 170, 23, 112, 223, 200, 177, 90, 179, 21, 90, 165, 42, 74, 51, 200, 124, 148, 241, 250, 71, 166, 76, 148, 141, 189, 117, 122, 253, 195, 49, 32, 201, 1, 41, 133, 228, 93, 65, 16, 116, 108, 65, 117, 54, 0, 108, 38, 142, 55, 221, 183, 211, 249, 92, 96, 243, 7, 201, 23, 200, 154, 64, 143, 82, 228, 196, 236, 170, 93, 169, 43, 40, 40, 226, 179, 179, 107, 129, 216, 220, 64, 118, 255, 1, 68, 119, 39, 200, 131, 154, 56, 238, 41, 44, 162, 34, 164, 165, 156, 214, 174, 206, 22, 81, 3, 52, 230, 91, 68, 115, 113, 169, 152, 83, 182, 78, 204, 93, 91, 46, 230, 86, 84, 137, 88, 248, 191, 96, 195, 102, 54, 167, 149, 237, 188, 148, 149, 125, 171, 62, 218, 8, 74, 129, 79, 116, 182, 118, 51, 66, 132, 121, 239, 61, 208, 18, 255, 230, 242, 245, 252, 208, 238, 233, 190, 22, 3, 31, 49, 206, 34, 164, 194, 113, 50, 208, 151, 145, 252, 139, 243, 4, 88, 113, 68, 185, 34, 175, 106, 240, 86, 195, 77, 115, 143, 171, 253, 74, 17, 110, 18, 177, 96, 253, 121, 152, 62, 242, 166, 144, 186, 252, 112, 144, 9, 150, 48, 59, 193, 72, 82, 173, 86, 167, 2, 177, 189, 40, 17, 92, 255, 68, 251, 71, 194, 246, 23, 138, 239, 32, 51, 38, 97, 56, 167, 16, 205, 165, 232, 27, 140, 116, 95, 20, 84, 108, 204, 208, 153, 205, 229, 216, 38, 80, 179, 56, 225, 26, 13, 199, 125, 23, 136, 240, 119, 160, 245, 189, 40, 164, 37, 159, 210, 107, 181, 64, 126, 37, 140, 240, 138, 182, 92, 200, 146, 242, 203, 247, 29, 98, 5, 192, 177, 59, 6, 90, 193, 152, 6, 216, 26, 232, 219, 203, 204, 163, 72, 126, 82, 31, 95, 71, 107, 247, 32, 35, 66, 111, 207, 75, 64, 134, 127, 196, 98, 225, 174, 182, 222, 47, 192, 239, 219, 156, 158, 206, 218, 202, 134, 214, 60, 52, 195, 134, 158, 35, 177, 81, 121, 95, 34, 153, 80, 231, 249, 13, 141, 118, 116, 165, 41, 182, 186, 169, 109, 3, 220, 84, 15, 174, 111, 191, 74, 172, 56, 112, 84, 52, 230, 230, 137, 154, 5, 220, 109, 195, 55, 78, 160, 154, 202, 172, 56, 55, 217, 196, 56, 31, 37, 120, 98, 146, 53, 73, 32, 182, 2, 5, 57, 14, 76, 212, 212, 10, 100, 219, 173, 208, 34, 99, 137, 248, 121, 124, 237, 226, 103, 9, 25, 42, 243, 9, 35, 230, 92, 99, 201, 53, 193, 100, 202, 19, 178, 178, 118, 104, 82, 22, 246, 0, 9, 126, 11, 200, 240, 97, 140, 26, 197, 114, 109, 6, 179, 89, 204, 45, 175, 18, 139, 54, 95, 192, 114, 188, 43, 46, 191, 66, 180, 30, 107, 97, 81, 249, 50, 225, 129, 96, 4, 253, 43, 64, 118, 127, 6, 185, 31, 180, 191, 239, 56, 125, 189, 55, 56, 188, 254, 171, 29, 30, 127, 11, 108, 15, 195, 118, 47, 200, 110, 123, 107, 199, 69, 54, 79, 215, 38, 187, 187, 163, 220, 209, 220, 110, 42, 61, 116, 40, 157, 139, 52, 119, 129, 102, 136, 69, 91, 134, 235, 105, 147, 166, 72, 8, 190, 65, 130, 111, 12, 187, 187, 253, 4, 70, 113, 225, 42, 173, 192, 181, 9, 125, 149, 63, 147, 255, 166, 213, 106, 23, 206, 130, 7, 152, 160, 24, 135, 97, 127, 164, 78, 87, 43, 105, 145, 67, 19, 168, 182, 35, 71, 197, 14, 193, 189, 80, 50, 9, 36, 73, 215, 111, 134, 46, 58, 21, 249, 132, 97, 137, 220, 82, 181, 37, 21, 238, 177, 117, 252, 242, 101, 151, 195, 2, 251, 63, 64, 59, 252, 49, 144, 226, 83, 252, 138, 165, 31, 224, 189, 135, 38, 209, 194, 77, 231, 51, 50, 196, 222, 143, 104, 185, 26, 246, 7, 122, 186, 79, 75, 90, 223, 35, 46, 111, 207, 157, 78, 159, 255, 83, 142, 150, 238, 99, 14, 79, 215, 102, 107, 99, 167, 165, 172, 222, 183, 146, 155, 96, 177, 1, 217, 237, 36, 231, 44, 50, 23, 20, 5, 115, 17, 162, 126, 16, 20, 129, 40, 24, 197, 5, 171, 183, 251, 215, 119, 92, 205, 2, 123, 224, 102, 191, 123, 248, 65, 224, 184, 68, 165, 159, 107, 166, 193, 98, 169, 75, 52, 90, 44, 181, 198, 188, 188, 253, 250, 92, 203, 30, 144, 189, 243, 64, 246, 232, 243, 243, 247, 225, 54, 55, 55, 55, 45, 136, 112, 100, 146, 108, 147, 34, 91, 99, 225, 143, 252, 253, 36, 16, 27, 155, 172, 12, 69, 69, 5, 134, 60, 203, 129, 121, 116, 237, 216, 245, 51, 228, 90, 46, 55, 229, 231, 87, 204, 128, 197, 66, 156, 92, 184, 27, 27, 189, 135, 123, 83, 209, 230, 205, 171, 176, 86, 41, 159, 178, 244, 24, 214, 141, 6, 237, 240, 87, 154, 4, 238, 69, 97, 213, 202, 33, 12, 142, 201, 183, 58, 216, 220, 129, 38, 82, 235, 177, 102, 169, 21, 20, 246, 206, 237, 30, 0, 34, 124, 201, 229, 235, 125, 8, 52, 194, 111, 194, 60, 115, 149, 163, 165, 235, 146, 42, 183, 183, 52, 184, 111, 98, 152, 149, 61, 43, 238, 143, 126, 66, 156, 179, 148, 34, 251, 14, 149, 1, 67, 114, 208, 144, 164, 8, 208, 34, 140, 48, 113, 40, 211, 71, 236, 205, 29, 95, 218, 208, 217, 199, 154, 65, 175, 230, 184, 223, 25, 139, 138, 214, 40, 222, 58, 211, 122, 89, 178, 73, 86, 0, 62, 16, 210, 83, 69, 125, 230, 42, 81, 151, 145, 46, 234, 50, 231, 137, 100, 172, 20, 13, 89, 171, 68, 33, 59, 99, 175, 146, 28, 229, 113, 1, 114, 187, 85, 34, 201, 83, 19, 238, 250, 161, 213, 94, 29, 107, 45, 82, 94, 120, 9, 43, 150, 222, 142, 231, 49, 159, 174, 157, 86, 190, 118, 153, 233, 15, 7, 223, 207, 147, 108, 109, 24, 54, 157, 70, 242, 33, 98, 213, 25, 131, 33, 199, 170, 89, 185, 226, 56, 104, 134, 95, 128, 185, 224, 255, 52, 137, 220, 203, 2, 60, 99, 216, 194, 15, 123, 34, 174, 185, 168, 78, 172, 56, 112, 5, 43, 46, 49, 236, 35, 12, 4, 199, 252, 21, 228, 30, 214, 51, 183, 181, 123, 191, 221, 237, 41, 175, 222, 127, 124, 85, 196, 123, 1, 243, 13, 229, 238, 53, 44, 138, 116, 142, 53, 24, 38, 204, 126, 88, 20, 117, 98, 237, 45, 157, 223, 216, 216, 125, 141, 88, 178, 125, 151, 200, 47, 95, 210, 175, 89, 172, 250, 170, 49, 63, 223, 18, 244, 17, 57, 183, 105, 58, 125, 42, 129, 102, 196, 7, 91, 151, 23, 95, 184, 211, 91, 116, 254, 182, 171, 11, 47, 216, 214, 91, 88, 179, 237, 202, 57, 47, 236, 60, 107, 175, 194, 109, 222, 150, 139, 179, 130, 38, 65, 78, 210, 36, 127, 43, 5, 220, 156, 142, 65, 247, 143, 34, 249, 186, 199, 250, 250, 173, 217, 177, 231, 124, 56, 143, 143, 22, 213, 108, 239, 153, 47, 215, 14, 206, 213, 15, 114, 109, 201, 214, 109, 91, 67, 93, 187, 24, 141, 109, 60, 23, 69, 238, 97, 142, 213, 186, 12, 251, 31, 178, 124, 194, 36, 238, 243, 160, 33, 254, 146, 105, 136, 25, 233, 131, 38, 139, 76, 136, 187, 89, 62, 33, 214, 138, 102, 65, 50, 1, 82, 124, 3, 211, 39, 152, 118, 232, 235, 238, 112, 52, 183, 95, 80, 213, 224, 49, 98, 43, 172, 112, 7, 133, 90, 159, 236, 15, 100, 77, 233, 93, 125, 9, 68, 134, 132, 89, 3, 101, 202, 136, 163, 185, 227, 70, 44, 61, 134, 102, 19, 236, 54, 194, 175, 88, 122, 26, 86, 148, 223, 19, 50, 51, 47, 96, 21, 38, 20, 192, 0, 159, 209, 124, 23, 147, 1, 185, 236, 24, 86, 103, 217, 212, 243, 81, 185, 108, 148, 220, 237, 59, 176, 245, 42, 126, 246, 41, 126, 31, 252, 179, 55, 204, 235, 224, 253, 132, 219, 151, 55, 204, 103, 125, 163, 236, 59, 212, 241, 132, 59, 246, 160, 207, 194, 68, 53, 184, 169, 231, 99, 34, 44, 106, 62, 162, 184, 126, 113, 18, 65, 102, 128, 188, 49, 193, 200, 214, 51, 18, 201, 62, 16, 107, 147, 160, 188, 40, 179, 55, 182, 175, 193, 9, 23, 11, 94, 4, 52, 145, 8, 99, 18, 205, 53, 243, 141, 50, 238, 145, 246, 237, 13, 179, 255, 104, 247, 27, 205, 245, 150, 175, 29, 220, 171, 104, 177, 129, 237, 11, 85, 30, 79, 106, 128, 64, 38, 86, 200, 253, 172, 31, 145, 11, 251, 44, 98, 197, 25, 147, 201, 148, 199, 167, 167, 238, 230, 147, 184, 235, 52, 28, 247, 19, 245, 2, 238, 57, 12, 168, 97, 38, 83, 187, 75, 44, 133, 197, 113, 64, 67, 84, 16, 162, 199, 255, 58, 28, 251, 195, 64, 136, 95, 179, 123, 187, 91, 29, 173, 93, 27, 170, 142, 123, 86, 71, 58, 32, 52, 133, 42, 125, 129, 210, 249, 17, 33, 18, 102, 55, 148, 15, 170, 221, 221, 182, 213, 233, 237, 254, 3, 70, 191, 86, 215, 187, 89, 129, 95, 12, 211, 86, 171, 184, 191, 104, 18, 185, 143, 179, 122, 176, 65, 171, 64, 5, 97, 78, 186, 115, 92, 142, 212, 117, 186, 219, 237, 246, 166, 246, 79, 99, 169, 43, 91, 83, 219, 199, 230, 139, 224, 249, 194, 53, 250, 148, 173, 217, 87, 38, 13, 136, 92, 186, 11, 77, 173, 54, 69, 208, 206, 120, 75, 210, 157, 150, 204, 181, 110, 165, 121, 52, 150, 215, 142, 149, 58, 108, 106, 239, 176, 53, 183, 127, 194, 230, 110, 255, 232, 188, 185, 118, 238, 246, 143, 224, 181, 179, 186, 219, 142, 13, 63, 115, 99, 211, 168, 130, 131, 107, 206, 249, 172, 8, 251, 203, 171, 174, 22, 4, 181, 186, 70, 179, 80, 229, 7, 13, 241, 46, 86, 113, 102, 197, 178, 83, 6, 147, 153, 85, 156, 65, 31, 34, 22, 237, 198, 128, 154, 64, 84, 41, 22, 238, 238, 121, 3, 8, 241, 81, 216, 126, 221, 217, 218, 237, 133, 251, 108, 163, 181, 169, 41, 59, 210, 156, 17, 32, 193, 147, 241, 228, 15, 36, 204, 15, 72, 149, 117, 228, 31, 177, 97, 168, 195, 227, 127, 8, 11, 78, 99, 152, 246, 218, 221, 151, 137, 121, 149, 86, 185, 30, 236, 35, 154, 165, 9, 215, 2, 97, 218, 44, 117, 117, 193, 254, 42, 149, 148, 70, 18, 207, 77, 86, 7, 113, 138, 84, 27, 49, 14, 50, 145, 105, 181, 218, 102, 137, 224, 198, 101, 106, 5, 130, 237, 151, 72, 246, 61, 208, 38, 229, 214, 63, 170, 88, 223, 103, 116, 225, 70, 154, 158, 35, 252, 141, 45, 128, 20, 207, 211, 57, 200, 221, 184, 49, 13, 159, 67, 33, 45, 185, 73, 170, 62, 243, 136, 102, 177, 234, 77, 157, 192, 179, 164, 251, 162, 243, 47, 12, 84, 156, 57, 214, 44, 58, 91, 187, 134, 125, 136, 240, 92, 255, 9, 83, 44, 28, 94, 127, 167, 189, 165, 115, 75, 245, 145, 70, 33, 220, 241, 176, 124, 194, 190, 190, 68, 138, 18, 37, 16, 184, 145, 1, 61, 140, 44, 155, 218, 92, 172, 120, 186, 183, 231, 53, 44, 254, 139, 77, 70, 49, 180, 27, 43, 94, 8, 25, 233, 34, 60, 148, 127, 225, 147, 184, 47, 242, 153, 153, 117, 57, 165, 165, 217, 97, 30, 118, 165, 159, 36, 38, 15, 25, 91, 197, 74, 78, 255, 121, 37, 117, 1, 223, 78, 80, 101, 37, 153, 36, 191, 53, 65, 127, 100, 160, 86, 171, 94, 255, 109, 197, 181, 155, 148, 69, 206, 188, 188, 118, 138, 107, 24, 130, 12, 89, 17, 239, 72, 207, 8, 46, 72, 225, 250, 88, 132, 85, 171, 246, 169, 23, 169, 254, 11, 158, 189, 95, 72, 126, 196, 33, 83, 97, 17, 171, 62, 83, 182, 107, 15, 107, 159, 103, 151, 90, 59, 1, 9, 98, 202, 197, 63, 176, 33, 48, 104, 137, 31, 177, 123, 58, 183, 163, 15, 145, 227, 66, 71, 180, 162, 185, 20, 239, 175, 225, 123, 140, 22, 53, 4, 66, 104, 83, 74, 112, 155, 34, 87, 189, 111, 37, 214, 57, 100, 221, 183, 177, 217, 168, 183, 135, 249, 47, 214, 94, 122, 128, 57, 249, 245, 48, 57, 107, 150, 196, 255, 91, 29, 199, 253, 156, 95, 172, 186, 90, 88, 189, 122, 125, 161, 109, 235, 138, 48, 95, 177, 64, 81, 186, 138, 86, 166, 177, 65, 60, 144, 220, 223, 36, 77, 112, 60, 69, 4, 48, 167, 114, 8, 63, 47, 8, 66, 13, 211, 32, 70, 41, 45, 70, 24, 55, 134, 75, 184, 113, 17, 18, 224, 141, 69, 21, 106, 109, 86, 214, 22, 205, 226, 132, 30, 120, 174, 190, 167, 86, 113, 79, 242, 169, 203, 62, 196, 196, 124, 76, 189, 192, 66, 221, 35, 252, 136, 76, 83, 100, 57, 136, 191, 100, 77, 218, 91, 187, 247, 59, 154, 58, 11, 49, 209, 63, 146, 245, 72, 246, 33, 146, 255, 144, 64, 24, 135, 105, 44, 144, 139, 52, 178, 192, 47, 58, 239, 145, 48, 93, 94, 172, 136, 225, 127, 129, 173, 88, 91, 58, 89, 41, 169, 146, 218, 139, 197, 220, 117, 149, 34, 182, 161, 209, 36, 114, 47, 98, 21, 126, 236, 217, 166, 231, 249, 141, 152, 115, 21, 82, 43, 132, 213, 51, 145, 230, 248, 201, 17, 255, 227, 121, 62, 127, 130, 145, 172, 114, 25, 186, 63, 40, 38, 74, 42, 215, 21, 123, 82, 12, 233, 227, 181, 108, 217, 146, 170, 53, 26, 43, 53, 41, 139, 143, 195, 51, 243, 37, 172, 86, 195, 47, 77, 96, 102, 211, 156, 17, 102, 211, 22, 133, 217, 20, 91, 58, 97, 161, 238, 222, 219, 28, 158, 206, 22, 71, 163, 207, 1, 100, 183, 50, 180, 242, 222, 167, 58, 199, 135, 72, 132, 72, 32, 196, 150, 48, 3, 117, 14, 71, 18, 102, 225, 222, 189, 43, 108, 205, 237, 231, 99, 229, 12, 76, 28, 118, 120, 252, 239, 163, 89, 22, 107, 46, 98, 217, 59, 44, 62, 140, 190, 17, 137, 52, 95, 198, 94, 110, 216, 253, 91, 80, 171, 119, 26, 203, 202, 12, 97, 190, 45, 206, 117, 214, 252, 52, 121, 190, 205, 57, 0, 57, 135, 17, 200, 237, 10, 137, 228, 198, 27, 213, 58, 32, 229, 70, 182, 48, 45, 38, 168, 135, 30, 33, 42, 140, 168, 107, 234, 10, 147, 95, 140, 90, 155, 185, 176, 48, 87, 238, 111, 184, 154, 227, 126, 10, 90, 226, 243, 66, 198, 202, 33, 83, 65, 145, 88, 176, 126, 19, 115, 105, 224, 162, 147, 245, 56, 244, 178, 168, 230, 51, 240, 92, 61, 5, 164, 120, 183, 163, 213, 127, 181, 205, 221, 89, 235, 56, 218, 164, 11, 253, 92, 4, 158, 85, 69, 93, 82, 122, 118, 8, 132, 169, 68, 164, 222, 106, 232, 239, 176, 183, 116, 94, 230, 244, 245, 124, 9, 30, 232, 199, 165, 122, 140, 140, 52, 49, 231, 10, 53, 77, 140, 176, 67, 179, 30, 191, 108, 193, 59, 64, 154, 143, 169, 23, 112, 95, 231, 83, 147, 91, 176, 133, 87, 110, 121, 121, 164, 106, 28, 103, 125, 55, 103, 107, 96, 206, 235, 9, 64, 14, 218, 65, 63, 162, 84, 107, 117, 60, 36, 57, 40, 153, 105, 95, 5, 146, 92, 78, 90, 100, 212, 132, 168, 236, 137, 24, 118, 188, 116, 21, 21, 25, 160, 233, 111, 228, 87, 44, 233, 208, 196, 115, 39, 53, 28, 247, 4, 159, 178, 232, 61, 185, 191, 225, 112, 180, 169, 148, 160, 143, 233, 23, 14, 111, 207, 171, 206, 182, 222, 95, 129, 182, 120, 61, 75, 206, 63, 209, 86, 132, 45, 164, 66, 237, 95, 246, 35, 214, 201, 193, 53, 68, 138, 4, 194, 140, 81, 47, 227, 70, 233, 185, 166, 114, 52, 180, 230, 193, 67, 127, 57, 246, 110, 99, 33, 230, 94, 255, 59, 204, 60, 219, 220, 193, 218, 218, 148, 213, 237, 99, 1, 7, 230, 162, 18, 81, 200, 202, 16, 177, 32, 50, 76, 34, 191, 214, 44, 224, 110, 20, 82, 150, 29, 133, 73, 187, 2, 43, 129, 68, 52, 101, 73, 62, 78, 166, 85, 205, 175, 149, 51, 27, 115, 181, 90, 189, 8, 8, 238, 89, 137, 232, 6, 39, 144, 27, 121, 173, 82, 59, 37, 4, 221, 103, 146, 201, 84, 234, 193, 26, 210, 45, 96, 172, 169, 73, 134, 247, 172, 17, 150, 47, 59, 12, 247, 240, 205, 172, 245, 211, 162, 184, 127, 161, 37, 197, 92, 90, 38, 22, 157, 119, 129, 184, 246, 146, 253, 44, 189, 74, 174, 103, 202, 158, 9, 92, 80, 122, 253, 183, 195, 207, 30, 248, 189, 195, 21, 168, 97, 26, 118, 145, 74, 126, 68, 2, 97, 54, 174, 172, 229, 6, 192, 82, 125, 197, 80, 111, 130, 201, 193, 96, 119, 119, 236, 130, 201, 224, 83, 160, 109, 254, 204, 229, 235, 249, 167, 67, 234, 253, 102, 111, 244, 137, 149, 7, 235, 197, 210, 139, 234, 88, 49, 3, 147, 165, 64, 196, 146, 88, 64, 156, 47, 175, 70, 226, 84, 113, 55, 105, 82, 22, 159, 0, 226, 116, 26, 43, 92, 234, 190, 240, 225, 232, 113, 88, 126, 75, 225, 231, 156, 147, 19, 137, 108, 18, 197, 241, 144, 8, 82, 28, 71, 126, 228, 160, 148, 254, 241, 46, 236, 39, 83, 161, 177, 19, 41, 74, 164, 24, 174, 51, 14, 106, 111, 230, 194, 178, 92, 62, 51, 125, 23, 230, 16, 3, 33, 222, 167, 142, 231, 158, 19, 210, 211, 6, 77, 249, 150, 64, 213, 154, 29, 151, 136, 149, 135, 142, 139, 118, 119, 155, 220, 230, 169, 31, 238, 251, 103, 65, 254, 199, 217, 234, 255, 184, 163, 181, 227, 98, 41, 218, 52, 212, 152, 199, 13, 215, 43, 69, 50, 164, 62, 135, 4, 194, 220, 3, 62, 220, 232, 27, 9, 142, 150, 149, 129, 197, 142, 237, 77, 237, 86, 71, 171, 191, 17, 38, 142, 175, 58, 219, 122, 31, 118, 250, 252, 111, 200, 61, 227, 176, 36, 22, 154, 105, 177, 68, 22, 78, 58, 24, 234, 142, 157, 199, 53, 11, 185, 215, 65, 227, 124, 20, 38, 166, 219, 53, 75, 23, 246, 8, 106, 245, 14, 99, 126, 177, 197, 226, 170, 91, 26, 105, 226, 115, 141, 244, 117, 202, 193, 11, 179, 210, 231, 41, 71, 159, 2, 185, 125, 124, 2, 254, 72, 57, 237, 227, 147, 76, 75, 153, 193, 69, 237, 39, 109, 113, 23, 133, 31, 145, 45, 74, 42, 42, 212, 48, 214, 91, 248, 148, 69, 93, 112, 239, 161, 217, 244, 207, 240, 250, 125, 3, 51, 155, 90, 3, 133, 190, 47, 83, 36, 233, 123, 89, 146, 254, 235, 32, 15, 58, 124, 61, 55, 219, 91, 187, 142, 86, 55, 248, 214, 149, 213, 213, 165, 132, 211, 16, 135, 243, 17, 137, 12, 9, 132, 121, 8, 169, 101, 87, 160, 167, 219, 45, 97, 67, 223, 177, 59, 9, 86, 252, 64, 211, 19, 171, 0, 226, 237, 121, 20, 211, 78, 28, 82, 223, 57, 166, 113, 194, 234, 188, 108, 215, 94, 214, 146, 7, 91, 243, 232, 97, 194, 231, 87, 44, 249, 0, 180, 205, 167, 49, 56, 8, 180, 207, 27, 249, 180, 100, 183, 158, 231, 55, 229, 20, 21, 233, 66, 20, 61, 56, 135, 64, 37, 226, 12, 246, 121, 206, 212, 40, 192, 97, 77, 29, 136, 238, 17, 137, 36, 199, 218, 249, 67, 46, 30, 240, 38, 150, 180, 155, 227, 90, 164, 148, 143, 232, 82, 230, 35, 70, 104, 7, 85, 149, 42, 8, 66, 53, 75, 210, 95, 192, 125, 149, 53, 10, 94, 20, 247, 58, 154, 77, 115, 214, 172, 101, 125, 17, 153, 217, 244, 10, 247, 217, 206, 23, 138, 36, 125, 184, 119, 219, 89, 213, 154, 195, 97, 171, 214, 196, 201, 57, 175, 108, 1, 73, 73, 250, 4, 2, 225, 28, 40, 250, 190, 141, 86, 205, 195, 218, 212, 145, 237, 108, 238, 88, 239, 108, 233, 110, 198, 160, 32, 151, 183, 247, 255, 64, 227, 124, 145, 181, 228, 241, 4, 124, 156, 214, 250, 102, 177, 124, 223, 97, 22, 28, 196, 204, 181, 133, 197, 162, 86, 163, 22, 249, 228, 164, 119, 48, 199, 12, 205, 97, 48, 225, 125, 78, 72, 78, 106, 212, 101, 103, 111, 214, 231, 229, 153, 128, 60, 151, 70, 49, 185, 38, 160, 31, 74, 246, 123, 42, 154, 30, 79, 27, 121, 202, 90, 36, 22, 169, 86, 70, 168, 142, 177, 103, 164, 92, 130, 174, 103, 14, 106, 145, 193, 37, 220, 194, 158, 91, 217, 166, 77, 41, 56, 142, 154, 229, 203, 14, 193, 253, 241, 121, 13, 182, 131, 74, 194, 238, 23, 25, 204, 114, 17, 136, 54, 189, 84, 172, 58, 124, 156, 5, 160, 73, 125, 17, 207, 192, 226, 237, 25, 144, 31, 1, 57, 126, 220, 209, 218, 45, 155, 77, 227, 67, 223, 234, 125, 42, 234, 111, 72, 32, 16, 38, 190, 218, 151, 252, 154, 202, 218, 144, 225, 222, 92, 117, 196, 147, 202, 58, 147, 183, 116, 30, 112, 122, 187, 175, 195, 86, 61, 172, 171, 185, 215, 255, 214, 176, 214, 233, 110, 23, 171, 143, 54, 177, 28, 51, 52, 135, 89, 236, 235, 89, 144, 144, 142, 215, 136, 252, 242, 197, 239, 131, 230, 249, 15, 32, 207, 251, 65, 190, 204, 47, 84, 117, 243, 153, 233, 117, 250, 156, 156, 181, 121, 118, 123, 86, 80, 85, 155, 144, 218, 167, 236, 251, 84, 144, 231, 84, 249, 63, 229, 122, 173, 125, 227, 44, 69, 39, 107, 145, 207, 100, 103, 103, 47, 150, 246, 57, 155, 73, 242, 172, 15, 177, 44, 124, 130, 126, 201, 69, 23, 45, 55, 228, 230, 150, 241, 105, 203, 15, 104, 18, 184, 207, 50, 171, 67, 60, 247, 188, 176, 42, 109, 208, 136, 126, 68, 184, 63, 208, 39, 142, 38, 126, 180, 88, 72, 132, 136, 57, 137, 175, 176, 133, 153, 215, 127, 147, 163, 165, 251, 8, 214, 206, 181, 30, 62, 188, 44, 212, 119, 156, 189, 119, 235, 40, 39, 145, 64, 32, 76, 173, 214, 41, 247, 158, 11, 107, 38, 3, 178, 178, 157, 240, 232, 109, 238, 182, 77, 78, 79, 87, 131, 195, 219, 243, 57, 167, 183, 247, 199, 64, 158, 79, 194, 132, 247, 110, 192, 215, 233, 103, 249, 103, 24, 97, 136, 154, 39, 118, 64, 40, 88, 127, 30, 51, 219, 162, 127, 137, 79, 79, 29, 80, 39, 113, 175, 194, 4, 250, 7, 144, 123, 249, 5, 220, 13, 124, 106, 114, 171, 78, 163, 217, 102, 178, 88, 74, 88, 180, 237, 232, 62, 35, 166, 129, 186, 70, 150, 27, 139, 149, 31, 84, 254, 156, 10, 72, 238, 241, 113, 150, 162, 27, 144, 62, 183, 31, 119, 52, 75, 242, 34, 149, 189, 17, 149, 233, 23, 33, 129, 21, 159, 116, 102, 115, 185, 144, 145, 126, 88, 189, 128, 195, 50, 110, 255, 171, 86, 113, 207, 241, 43, 87, 244, 27, 115, 243, 196, 124, 155, 51, 80, 181, 102, 255, 209, 145, 126, 68, 111, 207, 155, 46, 95, 239, 35, 112, 207, 220, 10, 139, 175, 102, 88, 104, 57, 215, 29, 108, 200, 12, 167, 33, 142, 232, 135, 72, 32, 16, 8, 51, 101, 194, 148, 73, 115, 216, 199, 25, 129, 184, 202, 106, 107, 23, 87, 215, 183, 27, 208, 79, 228, 242, 244, 28, 119, 120, 252, 255, 5, 147, 225, 127, 75, 154, 231, 27, 142, 214, 174, 33, 70, 158, 45, 157, 172, 62, 109, 229, 193, 99, 226, 218, 186, 125, 98, 241, 5, 219, 88, 43, 33, 115, 49, 104, 159, 90, 173, 40, 164, 37, 159, 210, 36, 114, 47, 73, 4, 250, 67, 77, 18, 119, 147, 144, 178, 164, 29, 35, 28, 65, 51, 91, 103, 44, 42, 82, 99, 107, 162, 49, 76, 250, 241, 156, 194, 23, 202, 228, 172, 70, 26, 206, 39, 202, 76, 117, 138, 168, 214, 193, 49, 70, 181, 158, 145, 114, 42, 127, 174, 216, 223, 76, 209, 116, 206, 146, 160, 107, 244, 122, 166, 50, 48, 23, 17, 22, 49, 118, 109, 218, 138, 19, 112, 77, 110, 150, 234, 154, 190, 192, 218, 65, 73, 132, 136, 102, 248, 64, 96, 77, 107, 160, 106, 141, 135, 213, 54, 125, 27, 238, 131, 199, 157, 62, 255, 183, 209, 143, 232, 108, 233, 56, 111, 93, 67, 131, 38, 220, 120, 200, 57, 194, 120, 223, 17, 41, 18, 8, 132, 89, 167, 109, 162, 121, 54, 68, 63, 187, 72, 72, 192, 50, 123, 206, 214, 182, 42, 187, 215, 143, 69, 16, 62, 2, 147, 230, 183, 156, 190, 222, 7, 128, 60, 159, 195, 96, 12, 217, 116, 235, 104, 110, 23, 173, 199, 91, 196, 138, 203, 235, 37, 2, 221, 206, 124, 159, 152, 255, 166, 55, 24, 69, 97, 213, 202, 1, 44, 37, 166, 81, 113, 127, 215, 4, 82, 86, 190, 173, 78, 228, 62, 169, 73, 73, 58, 193, 103, 172, 172, 69, 191, 151, 97, 221, 58, 77, 184, 164, 240, 72, 68, 42, 183, 35, 67, 201, 200, 200, 88, 34, 145, 228, 87, 198, 97, 106, 29, 38, 83, 44, 150, 205, 38, 254, 233, 243, 69, 170, 100, 191, 161, 34, 255, 48, 226, 177, 224, 216, 233, 114, 114, 114, 112, 60, 249, 37, 9, 93, 160, 25, 126, 19, 198, 250, 97, 150, 139, 152, 149, 41, 154, 10, 10, 217, 53, 9, 244, 71, 148, 52, 68, 70, 136, 76, 75, 124, 11, 174, 239, 31, 225, 250, 158, 132, 159, 253, 216, 48, 184, 186, 209, 23, 182, 251, 69, 176, 207, 188, 143, 252, 136, 4, 2, 97, 46, 106, 156, 76, 195, 12, 242, 117, 70, 51, 233, 85, 236, 115, 39, 91, 79, 116, 228, 56, 220, 237, 155, 29, 45, 221, 199, 176, 244, 30, 144, 231, 29, 48, 209, 254, 214, 233, 237, 125, 14, 205, 183, 82, 115, 218, 128, 6, 218, 224, 97, 29, 24, 202, 247, 30, 98, 41, 43, 216, 139, 19, 43, 170, 96, 0, 17, 43, 28, 190, 42, 109, 64, 179, 36, 254, 77, 117, 28, 247, 20, 104, 58, 191, 1, 185, 19, 38, 249, 207, 241, 75, 84, 157, 124, 218, 242, 253, 24, 137, 171, 47, 44, 44, 204, 177, 90, 179, 139, 246, 71, 38, 82, 172, 140, 3, 68, 247, 238, 56, 114, 35, 89, 176, 14, 124, 254, 42, 166, 97, 79, 110, 17, 243, 179, 237, 158, 224, 123, 134, 201, 48, 138, 102, 221, 64, 76, 139, 177, 108, 33, 142, 137, 38, 121, 113, 35, 142, 19, 144, 225, 79, 209, 135, 140, 81, 204, 24, 205, 140, 230, 113, 140, 110, 198, 18, 110, 44, 23, 145, 249, 16, 229, 254, 136, 254, 55, 224, 58, 61, 198, 52, 68, 175, 191, 219, 238, 238, 220, 234, 104, 106, 211, 133, 211, 72, 201, 143, 72, 32, 16, 8, 17, 52, 80, 102, 186, 173, 11, 180, 50, 138, 34, 96, 135, 43, 57, 120, 112, 185, 245, 68, 75, 14, 76, 188, 27, 108, 158, 238, 67, 76, 3, 109, 235, 189, 13, 72, 244, 103, 160, 169, 60, 129, 173, 197, 2, 17, 144, 126, 73, 11, 237, 56, 75, 162, 251, 14, 177, 36, 115, 44, 90, 141, 90, 15, 78, 246, 198, 220, 92, 86, 223, 150, 79, 93, 250, 161, 38, 137, 123, 13, 8, 244, 111, 172, 90, 11, 199, 221, 163, 142, 231, 190, 168, 89, 156, 112, 141, 144, 150, 220, 32, 168, 179, 247, 234, 212, 234, 34, 32, 221, 235, 198, 81, 134, 238, 180, 228, 135, 252, 173, 226, 84, 226, 185, 80, 38, 223, 113, 10, 55, 178, 222, 238, 168, 96, 253, 16, 97, 97, 160, 227, 249, 90, 77, 106, 178, 71, 19, 207, 221, 188, 154, 227, 126, 2, 231, 254, 36, 191, 116, 193, 219, 172, 82, 13, 44, 50, 152, 118, 136, 230, 82, 24, 59, 43, 86, 171, 129, 241, 100, 149, 155, 60, 221, 131, 48, 246, 47, 51, 205, 223, 215, 243, 37, 135, 199, 223, 98, 115, 119, 109, 146, 250, 35, 134, 36, 98, 165, 111, 155, 180, 67, 2, 129, 64, 24, 167, 22, 36, 183, 12, 147, 251, 235, 161, 223, 51, 154, 73, 21, 181, 37, 123, 125, 107, 86, 117, 67, 123, 137, 173, 165, 251, 66, 244, 129, 194, 4, 126, 45, 203, 249, 68, 18, 101, 126, 208, 158, 87, 96, 146, 255, 112, 216, 148, 219, 218, 197, 210, 11, 176, 57, 46, 106, 69, 235, 246, 30, 20, 215, 92, 124, 137, 88, 92, 179, 77, 180, 184, 54, 137, 185, 229, 85, 44, 29, 1, 53, 82, 89, 198, 168, 65, 14, 98, 173, 80, 157, 193, 48, 160, 203, 207, 183, 7, 214, 6, 147, 75, 16, 88, 117, 169, 208, 102, 91, 97, 44, 40, 48, 96, 206, 33, 70, 14, 11, 203, 151, 248, 248, 36, 238, 6, 77, 28, 119, 55, 22, 131, 192, 126, 136, 184, 48, 208, 9, 130, 104, 46, 46, 5, 50, 220, 192, 162, 144, 49, 26, 25, 203, 22, 6, 82, 46, 228, 122, 166, 254, 183, 97, 236, 254, 226, 242, 245, 222, 11, 227, 119, 29, 214, 52, 117, 182, 248, 214, 149, 30, 58, 148, 30, 246, 24, 176, 139, 77, 31, 229, 35, 18, 8, 4, 194, 212, 64, 106, 31, 166, 172, 159, 201, 34, 27, 177, 12, 95, 244, 19, 112, 130, 253, 144, 59, 221, 238, 246, 229, 99, 238, 39, 22, 132, 199, 14, 241, 172, 7, 160, 207, 127, 23, 16, 193, 175, 65, 43, 125, 130, 245, 6, 68, 159, 168, 228, 83, 147, 183, 165, 160, 133, 10, 171, 210, 134, 116, 1, 173, 48, 42, 65, 141, 83, 72, 77, 57, 173, 73, 228, 222, 6, 98, 250, 155, 58, 142, 251, 11, 38, 200, 99, 128, 11, 107, 103, 134, 21, 100, 84, 220, 215, 64, 147, 187, 9, 254, 254, 159, 154, 133, 220, 181, 234, 133, 220, 85, 252, 34, 85, 167, 102, 73, 130, 143, 95, 146, 212, 34, 36, 39, 53, 105, 146, 147, 26, 81, 248, 228, 36, 55, 191, 100, 65, 171, 122, 145, 170, 29, 222, 123, 165, 58, 145, 251, 4, 104, 188, 55, 192, 62, 110, 67, 237, 151, 249, 100, 227, 184, 63, 99, 187, 52, 77, 202, 162, 119, 133, 172, 140, 33, 36, 105, 115, 201, 26, 49, 223, 230, 18, 139, 207, 175, 101, 197, 32, 176, 31, 34, 46, 12, 48, 218, 56, 112, 142, 72, 136, 140, 12, 159, 4, 249, 41, 200, 141, 88, 141, 9, 3, 174, 42, 143, 183, 106, 35, 153, 135, 251, 20, 62, 196, 179, 209, 166, 84, 185, 134, 64, 32, 16, 102, 140, 246, 41, 251, 63, 57, 201, 255, 137, 129, 68, 35, 234, 111, 70, 89, 110, 12, 201, 160, 172, 222, 183, 18, 125, 162, 78, 119, 187, 221, 209, 220, 185, 59, 16, 149, 219, 243, 137, 220, 106, 199, 59, 218, 172, 12, 212, 10, 163, 43, 102, 174, 215, 15, 96, 80, 11, 106, 165, 216, 126, 169, 252, 178, 195, 226, 186, 75, 15, 48, 95, 94, 233, 246, 58, 177, 120, 235, 69, 98, 209, 150, 11, 197, 130, 141, 91, 68, 139, 115, 35, 35, 177, 188, 74, 43, 235, 11, 138, 109, 206, 114, 74, 215, 50, 45, 15, 243, 75, 209, 191, 138, 130, 175, 145, 240, 208, 84, 140, 239, 67, 223, 43, 154, 68, 11, 97, 31, 24, 17, 188, 102, 199, 110, 246, 29, 21, 151, 95, 33, 86, 95, 209, 36, 218, 27, 189, 82, 65, 111, 73, 43, 244, 248, 223, 7, 173, 250, 5, 103, 91, 207, 195, 176, 189, 203, 225, 237, 249, 52, 252, 253, 24, 154, 175, 209, 119, 104, 172, 169, 73, 26, 141, 12, 67, 212, 52, 37, 66, 36, 16, 8, 132, 57, 1, 69, 16, 145, 236, 11, 197, 237, 104, 173, 142, 150, 114, 220, 122, 221, 234, 108, 36, 190, 33, 157, 86, 59, 24, 141, 6, 137, 65, 46, 122, 131, 225, 53, 107, 131, 231, 7, 235, 219, 174, 250, 77, 32, 160, 165, 231, 111, 140, 164, 188, 61, 255, 2, 130, 122, 27, 91, 154, 1, 121, 245, 7, 138, 205, 119, 159, 13, 128, 145, 124, 170, 225, 229, 236, 123, 28, 1, 109, 119, 0, 181, 95, 216, 255, 171, 32, 127, 135, 239, 248, 173, 203, 215, 243, 67, 230, 47, 244, 250, 175, 134, 191, 31, 198, 52, 11, 212, 162, 203, 15, 28, 72, 27, 109, 140, 228, 177, 33, 255, 33, 129, 64, 32, 16, 134, 53, 82, 165, 233, 144, 249, 211, 110, 185, 101, 1, 230, 95, 234, 205, 57, 127, 53, 152, 76, 81, 165, 125, 232, 245, 103, 11, 158, 235, 205, 102, 155, 98, 255, 241, 152, 55, 90, 117, 228, 72, 42, 214, 22, 197, 206, 44, 214, 70, 143, 197, 218, 212, 177, 214, 214, 210, 105, 179, 121, 186, 54, 161, 47, 21, 75, 173, 217, 61, 254, 75, 153, 239, 207, 211, 125, 8, 11, 116, 59, 189, 221, 87, 160, 0, 33, 30, 129, 159, 15, 130, 70, 184, 215, 238, 237, 218, 105, 111, 237, 220, 106, 107, 237, 114, 217, 154, 187, 202, 108, 141, 94, 51, 38, 223, 71, 157, 234, 34, 149, 108, 59, 235, 251, 165, 196, 124, 2, 129, 64, 32, 68, 15, 22, 109, 171, 213, 106, 143, 27, 163, 175, 174, 131, 90, 102, 63, 70, 179, 194, 231, 142, 41, 247, 51, 61, 138, 115, 159, 42, 216, 143, 59, 86, 19, 52, 129, 64, 32, 16, 8, 193, 96, 38, 70, 189, 94, 159, 2, 164, 247, 47, 41, 170, 117, 32, 218, 124, 72, 216, 94, 207, 246, 130, 5, 3, 100, 66, 146, 243, 0, 37, 233, 83, 228, 144, 158, 149, 147, 241, 24, 140, 36, 251, 254, 34, 9, 190, 143, 189, 95, 250, 108, 159, 114, 255, 140, 0, 201, 95, 72, 32, 16, 8, 132, 73, 128, 148, 120, 143, 36, 121, 243, 24, 218, 97, 201, 4, 121, 111, 48, 217, 18, 8, 4, 2, 129, 48, 39, 32, 23, 29, 87, 212, 104, 141, 38, 55, 242, 148, 100, 98, 125, 148, 59, 155, 76, 79, 254, 61, 2, 129, 64, 32, 204, 41, 48, 98, 195, 218, 166, 64, 124, 79, 68, 169, 69, 126, 40, 189, 239, 105, 158, 231, 87, 224, 231, 39, 185, 236, 28, 129, 64, 32, 16, 8, 83, 15, 185, 232, 56, 16, 222, 231, 36, 211, 233, 169, 104, 52, 72, 216, 190, 10, 91, 236, 98, 49, 108, 170, 37, 16, 8, 4, 2, 97, 206, 64, 225, 135, 220, 41, 17, 223, 104, 173, 176, 78, 75, 230, 216, 55, 97, 107, 34, 130, 36, 16, 8, 4, 194, 156, 38, 72, 32, 71, 35, 144, 222, 7, 81, 68, 179, 158, 146, 222, 243, 22, 207, 243, 249, 248, 217, 89, 210, 64, 153, 64, 32, 16, 8, 132, 177, 19, 164, 86, 171, 93, 8, 164, 247, 215, 40, 252, 144, 178, 15, 242, 223, 130, 32, 228, 145, 6, 73, 32, 16, 8, 132, 57, 9, 101, 227, 99, 32, 201, 159, 25, 70, 47, 26, 32, 251, 32, 95, 6, 205, 209, 64, 4, 73, 32, 16, 8, 132, 185, 138, 225, 20, 13, 32, 189, 239, 74, 129, 58, 209, 16, 228, 223, 53, 26, 77, 54, 126, 142, 76, 172, 4, 2, 129, 64, 152, 115, 80, 166, 104, 0, 233, 125, 125, 20, 130, 28, 84, 20, 10, 120, 8, 182, 201, 164, 65, 18, 8, 4, 2, 97, 78, 66, 169, 253, 1, 233, 125, 71, 34, 191, 51, 161, 34, 89, 177, 155, 7, 214, 98, 197, 247, 192, 235, 239, 115, 82, 153, 55, 34, 72, 2, 129, 64, 32, 204, 57, 96, 112, 142, 76, 148, 64, 126, 63, 85, 104, 144, 161, 82, 61, 88, 240, 142, 84, 73, 231, 179, 161, 180, 80, 2, 129, 64, 32, 16, 230, 2, 84, 114, 144, 142, 148, 230, 241, 151, 81, 130, 116, 88, 14, 36, 10, 118, 1, 81, 236, 135, 74, 205, 17, 8, 4, 2, 97, 206, 32, 46, 200, 255, 184, 27, 243, 32, 37, 130, 60, 21, 206, 255, 40, 167, 120, 96, 253, 86, 233, 163, 72, 176, 84, 172, 156, 64, 32, 16, 8, 115, 3, 146, 223, 144, 17, 155, 90, 173, 94, 4, 164, 247, 69, 36, 63, 169, 8, 192, 233, 48, 230, 213, 1, 201, 4, 251, 0, 16, 100, 166, 98, 63, 212, 114, 138, 64, 32, 16, 8, 115, 2, 9, 74, 237, 17, 200, 110, 59, 144, 222, 179, 18, 249, 13, 132, 169, 164, 195, 204, 171, 146, 6, 121, 125, 16, 209, 18, 8, 4, 2, 129, 48, 140, 217, 216, 172, 23, 143, 55, 94, 89, 28, 0, 200, 174, 8, 228, 110, 133, 246, 24, 209, 188, 10, 239, 121, 23, 94, 215, 201, 159, 87, 238, 139, 64, 32, 16, 8, 4, 166, 133, 73, 132, 195, 2, 93, 36, 162, 136, 159, 161, 164, 41, 7, 227, 140, 32, 51, 208, 28, 115, 65, 190, 138, 17, 171, 138, 66, 229, 193, 101, 230, 134, 228, 223, 73, 26, 230, 47, 229, 46, 30, 146, 22, 74, 1, 58, 4, 2, 129, 64, 56, 171, 137, 141, 98, 90, 140, 199, 180, 9, 233, 61, 9, 211, 72, 154, 241, 120, 12, 161, 142, 21, 136, 206, 1, 218, 224, 183, 21, 228, 40, 251, 25, 7, 131, 8, 114, 64, 17, 156, 131, 210, 35, 239, 131, 252, 143, 4, 2, 129, 64, 8, 167, 145, 113, 88, 176, 27, 136, 230, 127, 128, 56, 110, 1, 217, 133, 233, 18, 225, 72, 3, 53, 46, 36, 21, 133, 230, 21, 107, 114, 97, 38, 84, 249, 123, 66, 105, 119, 112, 172, 102, 16, 47, 28, 235, 195, 10, 159, 34, 74, 127, 8, 114, 28, 14, 216, 145, 180, 199, 199, 224, 51, 107, 149, 4, 76, 183, 2, 129, 64, 32, 16, 70, 16, 157, 130, 112, 246, 2, 113, 188, 143, 4, 130, 100, 35, 17, 206, 251, 32, 191, 7, 249, 50, 230, 11, 130, 84, 240, 60, 191, 98, 52, 210, 69, 109, 83, 54, 215, 42, 76, 162, 241, 97, 36, 248, 189, 97, 9, 55, 59, 59, 123, 49, 16, 121, 21, 28, 143, 31, 228, 126, 236, 200, 33, 31, 175, 236, 95, 12, 83, 24, 128, 153, 92, 101, 18, 133, 115, 237, 35, 237, 145, 64, 32, 16, 8, 97, 181, 52, 165, 201, 18, 72, 227, 102, 69, 128, 203, 7, 82, 144, 203, 128, 172, 157, 41, 72, 19, 229, 21, 248, 253, 111, 144, 56, 97, 235, 1, 210, 170, 65, 63, 32, 188, 78, 137, 229, 1, 34, 33, 98, 51, 99, 144, 11, 225, 187, 122, 49, 8, 7, 163, 84, 229, 42, 56, 138, 227, 61, 19, 129, 28, 209, 180, 122, 70, 161, 101, 254, 10, 3, 122, 130, 8, 146, 64, 32, 16, 8, 132, 97, 196, 75, 154, 29, 51, 87, 2, 105, 252, 65, 145, 30, 209, 175, 12, 110, 145, 106, 151, 158, 145, 115, 8, 37, 45, 108, 4, 113, 74, 68, 133, 4, 245, 26, 200, 31, 65, 238, 131, 223, 221, 10, 114, 29, 188, 110, 131, 237, 97, 76, 226, 151, 200, 110, 51, 108, 55, 193, 246, 60, 32, 214, 243, 49, 61, 3, 53, 88, 144, 19, 232, 27, 4, 185, 1, 126, 119, 23, 108, 127, 11, 242, 34, 126, 103, 136, 239, 18, 21, 199, 53, 16, 34, 32, 71, 222, 158, 82, 148, 149, 123, 29, 94, 215, 203, 3, 160, 208, 88, 9, 4, 2, 129, 64, 8, 32, 168, 250, 204, 101, 138, 0, 150, 112, 154, 88, 48, 1, 13, 73, 166, 75, 153, 80, 251, 149, 228, 41, 19, 40, 146, 174, 44, 74, 146, 147, 137, 46, 248, 119, 161, 222, 47, 19, 162, 252, 93, 18, 49, 14, 42, 142, 35, 220, 113, 158, 145, 201, 85, 250, 249, 70, 181, 90, 157, 42, 107, 208, 92, 80, 52, 44, 129, 64, 32, 16, 8, 74, 211, 98, 92, 20, 213, 103, 198, 35, 131, 10, 13, 239, 180, 66, 206, 40, 200, 116, 64, 65, 178, 3, 97, 222, 127, 58, 66, 224, 77, 36, 2, 103, 100, 170, 48, 13, 223, 43, 8, 66, 105, 136, 243, 39, 16, 8, 4, 2, 97, 24, 114, 128, 12, 203, 33, 4, 242, 120, 60, 140, 121, 117, 170, 100, 40, 10, 173, 53, 106, 98, 150, 211, 60, 20, 228, 248, 32, 154, 115, 149, 218, 51, 21, 6, 32, 16, 8, 4, 194, 57, 80, 246, 78, 4, 130, 188, 92, 214, 180, 162, 52, 175, 206, 100, 25, 148, 124, 142, 67, 10, 243, 236, 163, 32, 59, 21, 167, 47, 23, 55, 167, 200, 85, 2, 129, 64, 32, 132, 37, 200, 120, 140, 68, 13, 74, 176, 159, 237, 228, 56, 236, 183, 148, 34, 109, 119, 41, 201, 145, 155, 222, 130, 7, 4, 2, 129, 64, 152, 193, 192, 60, 197, 120, 137, 40, 45, 160, 65, 254, 73, 50, 175, 246, 135, 41, 238, 61, 211, 101, 72, 153, 202, 33, 157, 11, 202, 15, 49, 66, 86, 121, 226, 228, 119, 36, 16, 8, 4, 66, 88, 4, 229, 62, 30, 86, 152, 87, 79, 205, 50, 243, 234, 160, 34, 224, 71, 153, 167, 249, 38, 16, 227, 77, 32, 37, 33, 180, 102, 234, 247, 72, 32, 16, 8, 132, 144, 136, 147, 205, 171, 232, 135, 195, 60, 69, 133, 121, 245, 244, 44, 210, 24, 207, 200, 132, 30, 84, 102, 238, 119, 32, 77, 102, 179, 121, 165, 242, 156, 37, 159, 35, 145, 35, 129, 64, 32, 16, 194, 98, 216, 188, 42, 181, 135, 122, 98, 150, 153, 87, 251, 37, 98, 28, 148, 205, 169, 82, 106, 202, 63, 176, 183, 163, 32, 8, 213, 202, 147, 157, 225, 157, 73, 8, 4, 2, 129, 48, 131, 48, 92, 53, 6, 8, 229, 10, 57, 21, 34, 76, 239, 196, 153, 160, 41, 202, 197, 8, 250, 149, 166, 84, 5, 49, 62, 131, 197, 213, 177, 212, 93, 70, 70, 198, 18, 229, 137, 74, 166, 100, 210, 26, 9, 4, 2, 129, 16, 181, 6, 201, 33, 153, 0, 177, 220, 166, 40, 242, 253, 254, 12, 240, 63, 14, 41, 242, 48, 207, 40, 139, 3, 40, 43, 238, 72, 239, 251, 3, 200, 167, 225, 231, 13, 193, 196, 168, 232, 0, 66, 90, 35, 129, 64, 32, 16, 162, 6, 35, 13, 236, 200, 129, 201, 243, 38, 147, 73, 153, 18, 161, 236, 136, 113, 42, 76, 79, 197, 201, 32, 67, 249, 251, 78, 135, 171, 243, 42, 29, 199, 223, 165, 190, 143, 245, 88, 220, 32, 20, 249, 75, 190, 70, 42, 0, 64, 32, 16, 8, 132, 241, 3, 131, 117, 164, 158, 138, 23, 3, 233, 124, 30, 228, 17, 212, 36, 101, 19, 102, 136, 162, 224, 193, 165, 223, 6, 130, 180, 206, 224, 250, 172, 74, 109, 240, 116, 16, 17, 158, 163, 29, 42, 235, 175, 74, 251, 123, 21, 228, 255, 48, 34, 85, 138, 182, 45, 82, 214, 143, 149, 17, 228, 103, 36, 173, 145, 64, 32, 16, 8, 177, 209, 38, 67, 16, 167, 1, 73, 19, 136, 233, 227, 216, 145, 3, 228, 57, 217, 87, 25, 161, 136, 248, 8, 145, 53, 210, 96, 77, 48, 184, 16, 185, 244, 121, 36, 203, 87, 36, 130, 190, 3, 228, 90, 144, 3, 216, 123, 18, 222, 151, 30, 234, 24, 145, 20, 195, 53, 82, 38, 16, 8, 4, 2, 33, 102, 68, 137, 154, 25, 106, 148, 225, 234, 147, 2, 25, 45, 21, 4, 33, 15, 136, 171, 22, 196, 135, 90, 29, 22, 255, 150, 210, 42, 48, 130, 244, 45, 69, 225, 241, 51, 146, 79, 19, 91, 75, 61, 143, 145, 178, 18, 249, 253, 2, 228, 7, 240, 217, 175, 0, 49, 126, 18, 251, 72, 194, 235, 75, 224, 119, 14, 212, 100, 71, 107, 196, 140, 199, 134, 199, 72, 196, 72, 32, 16, 230, 51, 254, 63, 15, 36, 16, 30, 152, 147, 247, 43, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130}} diff --git a/gui/fyne_demo/data/fyne_scene_dark.png b/gui/fyne_demo/data/fyne_scene_dark.png deleted file mode 100644 index 2659818fa5ead6bbc9a67c7b76a595041772567a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42648 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 diff --git a/gui/fyne_demo/data/fyne_scene_light.png b/gui/fyne_demo/data/fyne_scene_light.png deleted file mode 100644 index 086a868d72ed7c36aee0bb01d624400031c613d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41770 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 Yz+=Ft{+fKliU9v8$*Id$N}C1$4{D>xX#fBK diff --git a/gui/fyne_demo/data/gen.go b/gui/fyne_demo/data/gen.go deleted file mode 100644 index 18fb983..0000000 --- a/gui/fyne_demo/data/gen.go +++ /dev/null @@ -1,57 +0,0 @@ -// +build ignore - -package main - -import ( - "fmt" - "os" - "path" - "runtime" - - "fyne.io/fyne" -) - -func bundleFile(name string, filepath string, f *os.File) { - res, err := fyne.LoadResourceFromPath(filepath) - if err != nil { - fyne.LogError("Unable to load file "+filepath, err) - return - } - - _, err = f.WriteString(fmt.Sprintf("var %s = %#v\n", name, res)) - if err != nil { - fyne.LogError("Unable to write to bundled file", err) - } -} - -func openFile(filename string) *os.File { - os.Remove(filename) - _, dirname, _, _ := runtime.Caller(0) - f, err := os.Create(path.Join(path.Dir(dirname), filename)) - if err != nil { - fyne.LogError("Unable to open file "+filename, err) - return nil - } - - _, err = f.WriteString("// **** THIS FILE IS AUTO-GENERATED, PLEASE DO NOT EDIT IT **** //\n\npackage data\n\nimport \"fyne.io/fyne\"\n\n") - if err != nil { - fyne.LogError("Unable to write file "+filename, err) - return nil - } - - return f -} - -func iconDir() string { - _, dirname, _, _ := runtime.Caller(0) - return path.Join(path.Dir(dirname), "icons") -} - -func main() { - f := openFile("bundled-scene.go") - - bundleFile("fynescenedark", "fyne_scene_dark.png", f) - bundleFile("fynescenelight", "fyne_scene_light.png", f) - - f.Close() -} diff --git a/gui/fyne_demo/data/icons.go b/gui/fyne_demo/data/icons.go deleted file mode 100644 index c65fcee..0000000 --- a/gui/fyne_demo/data/icons.go +++ /dev/null @@ -1,40 +0,0 @@ -package data - -import ( - "fyne.io/fyne" -) - -// ThemedResource is a resource wrapper that will return an appropriate resource -// for the currently selected theme. -type ThemedResource struct { - dark, light fyne.Resource -} - -func isLight() bool { - r, g, b, _ := fyne.CurrentApp().Settings().Theme().TextColor().RGBA() - return r < 0xaaaa && g < 0xaaaa && b < 0xaaaa -} - -// Name returns the underlying resource name (used for caching) -func (res *ThemedResource) Name() string { - if isLight() { - return res.light.Name() - } - return res.dark.Name() -} - -// Content returns the underlying content of the correct resource for the current theme -func (res *ThemedResource) Content() []byte { - if isLight() { - return res.light.Content() - } - return res.dark.Content() -} - -// NewThemedResource creates a resource that adapts to the current theme setting. -func NewThemedResource(dark, light fyne.Resource) *ThemedResource { - return &ThemedResource{dark, light} -} - -// FyneScene contains the full fyne logo with background design -var FyneScene = NewThemedResource(fynescenedark, fynescenelight) diff --git a/gui/fyne_demo/main.go b/gui/fyne_demo/main.go deleted file mode 100644 index d318b6b..0000000 --- a/gui/fyne_demo/main.go +++ /dev/null @@ -1,76 +0,0 @@ -// Package main provides various examples of Fyne API capabilities -package main - -import ( - "fmt" - "net/url" - - "fyne.io/fyne" - "fyne.io/fyne/app" - "fyne.io/fyne/canvas" - "fyne.io/fyne/layout" - "fyne.io/fyne/theme" - "fyne.io/fyne/widget" - "github.com/cnlh/nps/gui/fyne_demo/data" - "github.com/cnlh/nps/gui/fyne_demo/screens" -) - -const preferenceCurrentTab = "currentTab" - -func welcomeScreen(a fyne.App) fyne.CanvasObject { - logo := canvas.NewImageFromResource(data.FyneScene) - logo.SetMinSize(fyne.NewSize(228, 167)) - - link, err := url.Parse("https://fyne.io/") - if err != nil { - fyne.LogError("Could not parse URL", err) - } - - return widget.NewVBox( - widget.NewLabelWithStyle("Welcome to the Fyne toolkit demo app", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}), - layout.NewSpacer(), - widget.NewHBox(layout.NewSpacer(), logo, layout.NewSpacer()), - widget.NewHyperlinkWithStyle("fyne.io", link, fyne.TextAlignCenter, fyne.TextStyle{}), - layout.NewSpacer(), - - widget.NewGroup("Theme", - fyne.NewContainerWithLayout(layout.NewGridLayout(2), - widget.NewButton("Dark", func() { - a.Settings().SetTheme(theme.DarkTheme()) - }), - widget.NewButton("Light", func() { - a.Settings().SetTheme(theme.LightTheme()) - }), - ), - ), - ) -} - -func main() { - a := app.NewWithID("io.fyne.demo") - a.SetIcon(theme.FyneLogo()) - - w := a.NewWindow("Fyne Demo") - w.SetMainMenu(fyne.NewMainMenu(fyne.NewMenu("File", - fyne.NewMenuItem("New", func() { fmt.Println("Menu New") }), - // a quit item will be appended to our first menu - ), fyne.NewMenu("Edit", - fyne.NewMenuItem("Cut", func() { fmt.Println("Menu Cut") }), - fyne.NewMenuItem("Copy", func() { fmt.Println("Menu Copy") }), - fyne.NewMenuItem("Paste", func() { fmt.Println("Menu Paste") }), - ))) - w.SetMaster() - - tabs := widget.NewTabContainer( - widget.NewTabItemWithIcon("Welcome", theme.HomeIcon(), welcomeScreen(a)), - widget.NewTabItemWithIcon("Widgets", theme.ContentCopyIcon(), screens.WidgetScreen()), - widget.NewTabItemWithIcon("Graphics", theme.DocumentCreateIcon(), screens.GraphicsScreen()), - widget.NewTabItemWithIcon("Windows", theme.ViewFullScreenIcon(), screens.DialogScreen(w)), - widget.NewTabItemWithIcon("Advanced", theme.SettingsIcon(), screens.AdvancedScreen(w))) - tabs.SetTabLocation(widget.TabLocationLeading) - tabs.SelectTabIndex(a.Preferences().Int(preferenceCurrentTab)) - w.SetContent(tabs) - - w.ShowAndRun() - a.Preferences().SetInt(preferenceCurrentTab, tabs.CurrentTabIndex()) -} diff --git a/gui/fyne_demo/screens/advanced.go b/gui/fyne_demo/screens/advanced.go deleted file mode 100644 index 183696e..0000000 --- a/gui/fyne_demo/screens/advanced.go +++ /dev/null @@ -1,65 +0,0 @@ -package screens - -import ( - "fmt" - - "fyne.io/fyne" - "fyne.io/fyne/driver/desktop" - "fyne.io/fyne/layout" - "fyne.io/fyne/widget" -) - -func scaleString(c fyne.Canvas) string { - return fmt.Sprintf("%0.2f", c.Scale()) -} - -func prependTo(g *widget.Group, s string) { - g.Prepend(widget.NewLabel(s)) -} - -// AdvancedScreen loads a panel that shows details and settings that are a bit -// more detailed than normally needed. -func AdvancedScreen(win fyne.Window) fyne.CanvasObject { - scale := widget.NewLabel("") - - screen := widget.NewGroup("Screen", widget.NewForm( - &widget.FormItem{Text: "Scale", Widget: scale}, - )) - - scale.SetText(scaleString(win.Canvas())) - - label := widget.NewLabel("Just type...") - generic := widget.NewGroupWithScroller("Generic") - desk := widget.NewGroupWithScroller("Desktop") - - win.Canvas().SetOnTypedRune(func(r rune) { - prependTo(generic, "Rune: "+string(r)) - }) - win.Canvas().SetOnTypedKey(func(ev *fyne.KeyEvent) { - prependTo(generic, "Key : "+string(ev.Name)) - }) - if deskCanvas, ok := win.Canvas().(desktop.Canvas); ok { - deskCanvas.SetOnKeyDown(func(ev *fyne.KeyEvent) { - prependTo(desk, "KeyDown: "+string(ev.Name)) - }) - deskCanvas.SetOnKeyUp(func(ev *fyne.KeyEvent) { - prependTo(desk, "KeyUp : "+string(ev.Name)) - }) - } - - return widget.NewHBox(widget.NewVBox(screen, - widget.NewButton("Custom Theme", func() { - fyne.CurrentApp().Settings().SetTheme(newCustomTheme()) - }), - widget.NewButton("Fullscreen", func() { - win.SetFullScreen(!win.FullScreen()) - }), - ), - - fyne.NewContainerWithLayout(layout.NewBorderLayout(label, nil, nil, nil), - label, - fyne.NewContainerWithLayout(layout.NewGridLayout(2), - generic, desk, - ), - )) -} diff --git a/gui/fyne_demo/screens/graphics.go b/gui/fyne_demo/screens/graphics.go deleted file mode 100644 index b54f735..0000000 --- a/gui/fyne_demo/screens/graphics.go +++ /dev/null @@ -1,50 +0,0 @@ -package screens - -import ( - "image/color" - "time" - - "fyne.io/fyne" - "fyne.io/fyne/canvas" - "fyne.io/fyne/layout" - "fyne.io/fyne/theme" -) - -func rgbGradient(x, y, w, h int) color.Color { - g := int(float32(x) / float32(w) * float32(255)) - b := int(float32(y) / float32(h) * float32(255)) - - return color.RGBA{uint8(255 - b), uint8(g), uint8(b), 0xff} -} - -// GraphicsScreen loads a graphics example panel for the demo app -func GraphicsScreen() fyne.CanvasObject { - gradient := canvas.NewHorizontalGradient(color.RGBA{0x80, 0, 0, 0xff}, color.RGBA{0, 0x80, 0, 0xff}) - go func() { - for { - time.Sleep(time.Second) - - gradient.Angle += 45 - if gradient.Angle >= 360 { - gradient.Angle -= 360 - } - canvas.Refresh(gradient) - } - }() - content := fyne.NewContainerWithLayout(layout.NewFixedGridLayout(fyne.NewSize(90, 90)), - &canvas.Rectangle{FillColor: color.RGBA{0x80, 0, 0, 0xff}, - StrokeColor: color.RGBA{0xff, 0xff, 0xff, 0xff}, - StrokeWidth: 1}, - canvas.NewImageFromResource(theme.FyneLogo()), - &canvas.Line{StrokeColor: color.RGBA{0, 0, 0x80, 0xff}, StrokeWidth: 5}, - &canvas.Circle{StrokeColor: color.RGBA{0, 0, 0x80, 0xff}, - FillColor: color.RGBA{0x30, 0x30, 0x30, 0x60}, - StrokeWidth: 2}, - canvas.NewText("Text", color.RGBA{0, 0x80, 0, 0xff}), - canvas.NewRasterWithPixels(rgbGradient), - gradient, - canvas.NewRadialGradient(color.RGBA{0x80, 0, 0, 0xff}, color.RGBA{0, 0x80, 0x80, 0xff}), - ) - - return fyne.NewContainerWithLayout(layout.NewAdaptiveGridLayout(2), content, IconsPanel()) -} diff --git a/gui/fyne_demo/screens/icons.go b/gui/fyne_demo/screens/icons.go deleted file mode 100644 index b6ad643..0000000 --- a/gui/fyne_demo/screens/icons.go +++ /dev/null @@ -1,144 +0,0 @@ -package screens - -import ( - "image/color" - - "fyne.io/fyne" - "fyne.io/fyne/canvas" - "fyne.io/fyne/layout" - "fyne.io/fyne/theme" - "fyne.io/fyne/widget" -) - -type browser struct { - current int - - name *widget.Select - icon *widget.Icon -} - -func (b *browser) setIcon(index int) { - if index < 0 || index > len(icons)-1 { - return - } - b.current = index - - b.name.SetSelected(icons[index].name) - b.icon.SetResource(icons[index].icon) -} - -// IconsPanel loads a panel that shows the various icons available in Fyne -func IconsPanel() fyne.CanvasObject { - b := &browser{} - - prev := widget.NewButtonWithIcon("", theme.NavigateBackIcon(), func() { - b.setIcon(b.current - 1) - }) - next := widget.NewButtonWithIcon("", theme.NavigateNextIcon(), func() { - b.setIcon(b.current + 1) - }) - b.name = widget.NewSelect(iconList(), func(name string) { - for i, icon := range icons { - if icon.name == name { - if b.current != i { - b.setIcon(i) - } - break - } - } - }) - b.name.SetSelected(icons[b.current].name) - bar := widget.NewHBox(prev, next, b.name) - - background := canvas.NewRasterWithPixels(checkerPattern) - background.SetMinSize(fyne.NewSize(280, 280)) - b.icon = widget.NewIcon(icons[b.current].icon) - - return fyne.NewContainerWithLayout(layout.NewBorderLayout( - bar, nil, nil, nil), bar, background, b.icon) -} - -func checkerPattern(x, y, _, _ int) color.Color { - x /= 20 - y /= 20 - - if x%2 == y%2 { - return theme.BackgroundColor() - } - - return theme.ButtonColor() -} - -func iconList() []string { - var ret []string - for _, icon := range icons { - ret = append(ret, icon.name) - } - - return ret -} - -var icons = []struct { - name string - icon fyne.Resource -}{ - {"CancelIcon", theme.CancelIcon()}, - {"ConfirmIcon", theme.ConfirmIcon()}, - {"DeleteIcon", theme.DeleteIcon()}, - {"SearchIcon", theme.SearchIcon()}, - {"SearchReplaceIcon", theme.SearchReplaceIcon()}, - - {"CheckButtonIcon", theme.CheckButtonIcon()}, - {"CheckButtonCheckedIcon", theme.CheckButtonCheckedIcon()}, - {"RadioButtonIcon", theme.RadioButtonIcon()}, - {"RadioButtonCheckedIcon", theme.RadioButtonCheckedIcon()}, - - {"ContentAddIcon", theme.ContentAddIcon()}, - {"ContentRemoveIcon", theme.ContentRemoveIcon()}, - {"ContentClearIcon", theme.ContentClearIcon()}, - {"ContentCutIcon", theme.ContentCutIcon()}, - {"ContentCopyIcon", theme.ContentCopyIcon()}, - {"ContentPasteIcon", theme.ContentPasteIcon()}, - {"ContentRedoIcon", theme.ContentRedoIcon()}, - {"ContentUndoIcon", theme.ContentUndoIcon()}, - - {"InfoIcon", theme.InfoIcon()}, - {"QuestionIcon", theme.QuestionIcon()}, - {"WarningIcon", theme.WarningIcon()}, - - {"DocumentCreateIcon", theme.DocumentCreateIcon()}, - {"DocumentPrintIcon", theme.DocumentPrintIcon()}, - {"DocumentSaveIcon", theme.DocumentSaveIcon()}, - - {"FolderIcon", theme.FolderIcon()}, - {"FolderNewIcon", theme.FolderNewIcon()}, - {"FolderOpenIcon", theme.FolderOpenIcon()}, - {"HomeIcon", theme.HomeIcon()}, - {"HelpIcon", theme.HelpIcon()}, - {"SettingsIcon", theme.SettingsIcon()}, - - {"ViewFullScreenIcon", theme.ViewFullScreenIcon()}, - {"ViewRestoreIcon", theme.ViewRestoreIcon()}, - {"ViewRefreshIcon", theme.ViewRefreshIcon()}, - {"VisibilityIcon", theme.VisibilityIcon()}, - {"VisibilityOffIcon", theme.VisibilityOffIcon()}, - {"ZoomFitIcon", theme.ZoomFitIcon()}, - {"ZoomInIcon", theme.ZoomInIcon()}, - {"ZoomOutIcon", theme.ZoomOutIcon()}, - - {"MoveDownIcon", theme.MoveDownIcon()}, - {"MoveUpIcon", theme.MoveUpIcon()}, - - {"NavigateBackIcon", theme.NavigateBackIcon()}, - {"NavigateNextIcon", theme.NavigateNextIcon()}, - - {"MenuDropDown", theme.MenuDropDownIcon()}, - {"MenuDropUp", theme.MenuDropUpIcon()}, - - {"MailAttachmentIcon", theme.MailAttachmentIcon()}, - {"MailComposeIcon", theme.MailComposeIcon()}, - {"MailForwardIcon", theme.MailForwardIcon()}, - {"MailReplyIcon", theme.MailReplyIcon()}, - {"MailReplyAllIcon", theme.MailReplyAllIcon()}, - {"MailSendIcon", theme.MailSendIcon()}, -} diff --git a/gui/fyne_demo/screens/layout.go b/gui/fyne_demo/screens/layout.go deleted file mode 100644 index 0267e2d..0000000 --- a/gui/fyne_demo/screens/layout.go +++ /dev/null @@ -1,72 +0,0 @@ -package screens - -import ( - "image/color" - - "fyne.io/fyne" - "fyne.io/fyne/canvas" - "fyne.io/fyne/layout" - "fyne.io/fyne/widget" -) - -func makeCell() fyne.CanvasObject { - rect := canvas.NewRectangle(&color.RGBA{128, 128, 128, 255}) - rect.SetMinSize(fyne.NewSize(30, 30)) - return rect -} - -func makeBorderLayout() *fyne.Container { - top := makeCell() - bottom := makeCell() - left := makeCell() - right := makeCell() - middle := widget.NewLabelWithStyle("BorderLayout", fyne.TextAlignCenter, fyne.TextStyle{}) - - borderLayout := layout.NewBorderLayout(top, bottom, left, right) - return fyne.NewContainerWithLayout(borderLayout, - top, bottom, left, right, middle) -} - -func makeBoxLayout() *fyne.Container { - top := makeCell() - bottom := makeCell() - middle := widget.NewLabel("BoxLayout") - center := makeCell() - right := makeCell() - - col := fyne.NewContainerWithLayout(layout.NewVBoxLayout(), - top, middle, bottom) - - return fyne.NewContainerWithLayout(layout.NewHBoxLayout(), - col, center, right) -} - -func makeFixedGridLayout() *fyne.Container { - box1 := makeCell() - box2 := widget.NewLabel("FixedGrid") - box3 := makeCell() - box4 := makeCell() - - return fyne.NewContainerWithLayout(layout.NewFixedGridLayout(fyne.NewSize(75, 75)), - box1, box2, box3, box4) -} - -func makeGridLayout() *fyne.Container { - box1 := makeCell() - box2 := widget.NewLabel("Grid") - box3 := makeCell() - box4 := makeCell() - - return fyne.NewContainerWithLayout(layout.NewGridLayout(2), - box1, box2, box3, box4) -} - -// LayoutPanel loads a panel that shows the layouts available for a container -func LayoutPanel() fyne.CanvasObject { - return widget.NewTabContainer( - widget.NewTabItem("Border", makeBorderLayout()), - widget.NewTabItem("Box", makeBoxLayout()), - widget.NewTabItem("Fixed Grid", makeFixedGridLayout()), - widget.NewTabItem("Grid", makeGridLayout()), - ) -} diff --git a/gui/fyne_demo/screens/theme.go b/gui/fyne_demo/screens/theme.go deleted file mode 100644 index 1aad0be..0000000 --- a/gui/fyne_demo/screens/theme.go +++ /dev/null @@ -1,118 +0,0 @@ -package screens - -import ( - "image/color" - - "fyne.io/fyne" - "fyne.io/fyne/theme" -) - -var ( - purple = &color.RGBA{R: 128, G: 0, B: 128, A: 255} - orange = &color.RGBA{R: 198, G: 123, B: 0, A: 255} - grey = &color.Gray{Y: 123} -) - -// customTheme is a simple demonstration of a bespoke theme loaded by a Fyne app. -type customTheme struct { -} - -func (customTheme) BackgroundColor() color.Color { - return purple -} - -func (customTheme) ButtonColor() color.Color { - return color.Black -} - -func (customTheme) DisabledButtonColor() color.Color { - return color.White -} - -func (customTheme) HyperlinkColor() color.Color { - return orange -} - -func (customTheme) TextColor() color.Color { - return color.White -} - -func (customTheme) DisabledTextColor() color.Color { - return color.Black -} - -func (customTheme) IconColor() color.Color { - return color.White -} - -func (customTheme) DisabledIconColor() color.Color { - return color.Black -} - -func (customTheme) PlaceHolderColor() color.Color { - return grey -} - -func (customTheme) PrimaryColor() color.Color { - return orange -} - -func (customTheme) HoverColor() color.Color { - return orange -} - -func (customTheme) FocusColor() color.Color { - return orange -} - -func (customTheme) ScrollBarColor() color.Color { - return grey -} - -func (customTheme) ShadowColor() color.Color { - return &color.RGBA{0xcc, 0xcc, 0xcc, 0xcc} -} - -func (customTheme) TextSize() int { - return 12 -} - -func (customTheme) TextFont() fyne.Resource { - return theme.DefaultTextBoldFont() -} - -func (customTheme) TextBoldFont() fyne.Resource { - return theme.DefaultTextBoldFont() -} - -func (customTheme) TextItalicFont() fyne.Resource { - return theme.DefaultTextBoldItalicFont() -} - -func (customTheme) TextBoldItalicFont() fyne.Resource { - return theme.DefaultTextBoldItalicFont() -} - -func (customTheme) TextMonospaceFont() fyne.Resource { - return theme.DefaultTextMonospaceFont() -} - -func (customTheme) Padding() int { - return 10 -} - -func (customTheme) IconInlineSize() int { - return 20 -} - -func (customTheme) ScrollBarSize() int { - return 10 -} - -func (customTheme) ScrollBarSmallSize() int { - return 5 -} - -func newCustomTheme() fyne.Theme { - return &customTheme{} -} diff --git a/gui/fyne_demo/screens/widget.go b/gui/fyne_demo/screens/widget.go deleted file mode 100644 index ddc47f7..0000000 --- a/gui/fyne_demo/screens/widget.go +++ /dev/null @@ -1,157 +0,0 @@ -package screens - -import ( - "fmt" - "time" - - "fyne.io/fyne" - "fyne.io/fyne/canvas" - "fyne.io/fyne/layout" - "fyne.io/fyne/theme" - "fyne.io/fyne/widget" -) - -func makeButtonTab() fyne.Widget { - disabled := widget.NewButton("Disabled", func() {}) - disabled.Disable() - - return widget.NewVBox( - widget.NewLabel("Text label"), - widget.NewButton("Text button", func() { fmt.Println("tapped text button") }), - widget.NewButtonWithIcon("With icon", theme.ConfirmIcon(), func() { fmt.Println("tapped icon button") }), - disabled, - ) -} - -func makeInputTab() fyne.Widget { - entry := widget.NewEntry() - entry.SetPlaceHolder("Entry") - entryReadOnly := widget.NewEntry() - entryReadOnly.SetText("Entry (disabled)") - entryReadOnly.Disable() - - disabledCheck := widget.NewCheck("Disabled check", func(bool) {}) - disabledCheck.Disable() - radio := widget.NewRadio([]string{"Radio Item 1", "Radio Item 2"}, func(s string) { fmt.Println("selected", s) }) - radio.Horizontal = true - disabledRadio := widget.NewRadio([]string{"Disabled radio"}, func(string) {}) - disabledRadio.Disable() - - return widget.NewVBox( - entry, - entryReadOnly, - widget.NewSelect([]string{"Option 1", "Option 2", "Option 3"}, func(s string) { fmt.Println("selected", s) }), - widget.NewCheck("Check", func(on bool) { fmt.Println("checked", on) }), - disabledCheck, - radio, - disabledRadio, - widget.NewSlider(0, 100), - ) -} - -func makeProgressTab() fyne.Widget { - progress := widget.NewProgressBar() - infProgress := widget.NewProgressBarInfinite() - - go func() { - num := 0.0 - for num < 1.0 { - time.Sleep(100 * time.Millisecond) - progress.SetValue(num) - num += 0.01 - } - - progress.SetValue(1) - }() - - return widget.NewVBox( - widget.NewLabel("Percent"), progress, - widget.NewLabel("Infinite"), infProgress) -} - -func makeFormTab() fyne.Widget { - name := widget.NewEntry() - name.SetPlaceHolder("John Smith") - email := widget.NewEntry() - email.SetPlaceHolder("test@example.com") - password := widget.NewPasswordEntry() - password.SetPlaceHolder("Password") - largeText := widget.NewMultiLineEntry() - - form := &widget.Form{ - OnCancel: func() { - fmt.Println("Cancelled") - }, - OnSubmit: func() { - fmt.Println("Form submitted") - fmt.Println("Name:", name.Text) - fmt.Println("Email:", email.Text) - fmt.Println("Password:", password.Text) - fmt.Println("Message:", largeText.Text) - }, - } - form.Append("Name", name) - form.Append("Email", email) - form.Append("Password", password) - form.Append("Message", largeText) - - return form -} - -func makeScrollTab() fyne.CanvasObject { - logo := canvas.NewImageFromResource(theme.FyneLogo()) - logo.SetMinSize(fyne.NewSize(320, 320)) - list := widget.NewHBox() - list2 := widget.NewVBox() - - for i := 1; i <= 20; i++ { - index := i // capture - list.Append(widget.NewButton(fmt.Sprintf("Button %d", index), func() { - fmt.Println("Tapped", index) - })) - list2.Append(widget.NewButton(fmt.Sprintf("Button %d", index), func() { - fmt.Println("Tapped", index) - })) - } - - scroll := widget.NewScrollContainer(list) - scroll.Resize(fyne.NewSize(200, 300)) - - scroll2 := widget.NewScrollContainer(list2) - scroll2.Resize(fyne.NewSize(200, 100)) - - return fyne.NewContainerWithLayout(layout.NewGridLayout(1), scroll, scroll2) -} - -func makeScrollBothTab() fyne.CanvasObject { - logo := canvas.NewImageFromResource(theme.FyneLogo()) - logo.SetMinSize(fyne.NewSize(800, 800)) - - scroll := widget.NewScrollContainer(logo) - scroll.Resize(fyne.NewSize(400, 400)) - - return scroll -} - -// WidgetScreen shows a panel containing widget demos -func WidgetScreen() fyne.CanvasObject { - toolbar := widget.NewToolbar(widget.NewToolbarAction(theme.MailComposeIcon(), func() { fmt.Println("New") }), - widget.NewToolbarSeparator(), - widget.NewToolbarSpacer(), - widget.NewToolbarAction(theme.ContentCutIcon(), func() { fmt.Println("Cut") }), - widget.NewToolbarAction(theme.ContentCopyIcon(), func() { fmt.Println("Copy") }), - widget.NewToolbarAction(theme.ContentPasteIcon(), func() { fmt.Println("Paste") }), - ) - - return fyne.NewContainerWithLayout(layout.NewBorderLayout(toolbar, nil, nil, nil), - toolbar, - widget.NewTabContainer( - widget.NewTabItem("Buttons", makeButtonTab()), - widget.NewTabItem("Input", makeInputTab()), - widget.NewTabItem("Progress", makeProgressTab()), - widget.NewTabItem("Form", makeFormTab()), - widget.NewTabItem("Scroll", makeScrollTab()), - widget.NewTabItem("Full Scroll", makeScrollBothTab()), - ), - ) -} diff --git a/gui/fyne_demo/screens/window.go b/gui/fyne_demo/screens/window.go deleted file mode 100644 index 7a1d63a..0000000 --- a/gui/fyne_demo/screens/window.go +++ /dev/null @@ -1,84 +0,0 @@ -package screens - -import ( - "errors" - "fmt" - "time" - - "fyne.io/fyne" - "fyne.io/fyne/dialog" - "fyne.io/fyne/layout" - "fyne.io/fyne/widget" -) - -func confirmCallback(response bool) { - fmt.Println("Responded with", response) -} - -// DialogScreen loads a panel that lists the dialog windows that can be tested. -func DialogScreen(win fyne.Window) fyne.CanvasObject { - dialogs := widget.NewGroup("Dialogs", - widget.NewButton("Info", func() { - dialog.ShowInformation("Information", "You should know this thing...", win) - }), - widget.NewButton("Error", func() { - err := errors.New("A dummy error message") - dialog.ShowError(err, win) - }), - widget.NewButton("Confirm", func() { - cnf := dialog.NewConfirm("Confirmation", "Are you enjoying this demo?", confirmCallback, win) - cnf.SetDismissText("Nah") - cnf.SetConfirmText("Oh Yes!") - cnf.Show() - }), - widget.NewButton("Progress", func() { - prog := dialog.NewProgress("MyProgress", "Nearly there...", win) - - go func() { - num := 0.0 - for num < 1.0 { - time.Sleep(50 * time.Millisecond) - prog.SetValue(num) - num += 0.01 - } - - prog.SetValue(1) - prog.Hide() - }() - - prog.Show() - }), - widget.NewButton("Custom", func() { - content := widget.NewEntry() - content.SetPlaceHolder("Type something here") - content.OnChanged = func(text string) { - fmt.Println("Entered", text) - } - dialog.ShowCustom("Custom dialog", "Done", content, win) - }), - ) - - windows := widget.NewVBox(dialogs, widget.NewGroup("Windows", - widget.NewButton("New window", func() { - w := fyne.CurrentApp().NewWindow("Hello") - w.SetContent(widget.NewLabel("Hello World!")) - w.Show() - }), - widget.NewButton("Fixed size window", func() { - w := fyne.CurrentApp().NewWindow("Fixed") - w.SetContent(fyne.NewContainerWithLayout(layout.NewCenterLayout(), widget.NewLabel("Hello World!"))) - - w.Resize(fyne.NewSize(240, 180)) - w.SetFixedSize(true) - w.Show() - }), - widget.NewButton("Centered window", func() { - w := fyne.CurrentApp().NewWindow("Central") - w.SetContent(fyne.NewContainerWithLayout(layout.NewCenterLayout(), widget.NewLabel("Hello World!"))) - - w.CenterOnScreen() - w.Show() - }))) - - return fyne.NewContainerWithLayout(layout.NewAdaptiveGridLayout(2), windows, LayoutPanel()) -} From eab5708b33a1fb6f5586db98c3a0d146a58e979f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 22:50:34 +0800 Subject: [PATCH 116/171] change md and register npc as a service --- README.md | 2 ++ cmd/npc/npc.go | 30 +++++++++++++++------------- docs/run.md | 2 ++ docs/use.md | 53 +++++++++++++++++++++++++++++--------------------- 4 files changed, 51 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index e12f47a..d1f8958 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 - 点击web管理中客户端前的+号,复制启动命令 - 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 +如果需要注册到系统服务可查看[注册到系统服务](https://cnlh.github.io/nps/#/use?id=注册到系统服务) + ### 配置 - 客户端连接后,在web中配置对应穿透服务即可 - 更多高级用法见[完整文档](https://cnlh.github.io/nps/) diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index d4ec4bd..ddce289 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -32,8 +32,7 @@ var ( target = flag.String("target", "", "p2p target") localType = flag.String("local_type", "p2p", "p2p target") logPath = flag.String("log_path", "", "npc log path") - debug = flag.Bool("debug", false, "npc debug") - srv = flag.String("service", "", "service option") + debug = flag.Bool("debug", true, "npc debug") ) func main() { @@ -69,10 +68,15 @@ func main() { "After=network-online.target syslog.target"} } for _, v := range os.Args[1:] { - if !strings.Contains(v, "-service=") { + switch v { + case "install", "start", "stop", "uninstall", "restart": + continue + } + if !strings.Contains(v, "-service=") && !strings.Contains(v, "-debug=") { svcConfig.Arguments = append(svcConfig.Arguments, v) } } + svcConfig.Arguments = append(svcConfig.Arguments, "-debug=false") prg := &npc{ exit: make(chan struct{}), } @@ -102,19 +106,17 @@ func main() { } fmt.Printf("nat type: %s \npublic address: %s\n", nat.String(), host.String()) os.Exit(0) + case "install", "start", "stop", "uninstall", "restart": + if os.Args[1] == "install" { + install.InstallNpc() + } + err := service.Control(s, os.Args[1]) + if err != nil { + logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + } + return } } - - if *srv != "" { - if *srv == "install" { - install.InstallNpc() - } - err := service.Control(s, *srv) - if err != nil { - logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) - } - return - } s.Run() } diff --git a/docs/run.md b/docs/run.md index f3e566b..bc79756 100644 --- a/docs/run.md +++ b/docs/run.md @@ -26,6 +26,8 @@ - 点击web管理中客户端前的+号,复制启动命令 - 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 +如果需要注册到系统服务可查看[注册到系统服务](/use?id=注册到系统服务) + ## 配置 - 客户端连接后,在web中配置对应穿透服务即可 - 可以查看[使用示例](/example) diff --git a/docs/use.md b/docs/use.md index 183d41e..deeda30 100644 --- a/docs/use.md +++ b/docs/use.md @@ -2,34 +2,43 @@ ## 无配置文件模式 此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 ``` - ./npc -server=ip:port -vkey=web界面中显示的密钥 + ./npc -debug=true -server=ip:port -vkey=web界面中显示的密钥 ``` +## 注册到系统服务 +对于linux、darwin +- 注册:`sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)` +- 启动:`sudo ./npc start` +- 停止:`sudo ./npc stop` +- 如果需要更换命令内容需要先卸载`./npc -service=uninstall`,再重新注册 + +对于windows,使用管理员身份运行cmd + +- 注册:`npc.exe install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)` +- 启动:`npc.exe start` +- 停止:`npc.exe stop` +- 如果需要更换命令内容需要先卸载`npc.exe -service=uninstall`,再重新注册 + +## 客户端更新 +首先进入到对于的客户端二进制文件目录 + +请首先执行`sudo ./npc stop`或者`nps.exe stop`停止运行,然后 + +对于linux +```shell + sudo ./npc-update update +``` +对于windows +```shell +npc-update.exe update +``` + +更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 + ## 配置文件模式 此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 ``` ./npc -config=npc配置文件路径 ``` -可自行添加systemd service,例如:`npc.service` -``` -[Unit] -Description=npc - convenient proxy server client -Documentation=https://github.com/cnlh/nps/ -After=network-online.target remote-fs.target nss-lookup.target -Wants=network-online.target - -[Service] -Type=simple -KillMode=process -Restart=always -RestartSec=15s -StandardOutput=append:/var/log/nps/npc.log -ExecStartPre=/bin/echo 'Starting npc' -ExecStopPost=/bin/echo 'Stopping npc' -ExecStart=/absolutely path to/npc -server=ip:port -vkey=web界面中显示的密钥 - -[Install] -WantedBy=multi-user.target -``` ## 配置文件说明 [示例配置文件](https://github.com/cnlh/nps/tree/master/conf/npc.conf) #### 全局配置 From ae28d41231c68c226a0a0c82f3341c42cef6c620 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Mon, 16 Dec 2019 23:10:44 +0800 Subject: [PATCH 117/171] change mux data struct, fix #250 --- lib/common/netpackager.go | 132 ++++++++++++++++++-------------------- lib/mux/conn.go | 6 +- lib/mux/mux.go | 10 +-- lib/version/version.go | 2 +- 4 files changed, 71 insertions(+), 79 deletions(-) diff --git a/lib/common/netpackager.go b/lib/common/netpackager.go index 96ebaec..e3e0919 100644 --- a/lib/common/netpackager.go +++ b/lib/common/netpackager.go @@ -22,24 +22,34 @@ type BasePackager struct { Content []byte } -func (Self *BasePackager) NewPac(contents ...interface{}) (err error) { +func (Self *BasePackager) NewPac(content []byte) (err error) { Self.clean() - for _, content := range contents { - switch content.(type) { - case nil: - Self.Content = Self.Content[:0] - case []byte: - err = Self.appendByte(content.([]byte)) - case string: - err = Self.appendByte([]byte(content.(string))) - if err != nil { - return - } - err = Self.appendByte([]byte(CONN_DATA_SEQ)) - default: - err = Self.marshal(content) + if content != nil { + n := len(content) + if n > MAXIMUM_SEGMENT_SIZE { + err = errors.New("mux:packer: newpack content segment too large") } + Self.Content = Self.Content[:n] + copy(Self.Content, content) + } else { + Self.Content = Self.Content[:0] } + //for _, content := range contents { + // switch content.(type) { + // case nil: + // Self.Content = Self.Content[:0] + // case []byte: + // err = Self.appendByte(content.([]byte)) + // case string: + // err = Self.appendByte([]byte(content.(string))) + // if err != nil { + // return + // } + // err = Self.appendByte([]byte(CONN_DATA_SEQ)) + // default: + // err = Self.marshal(content) + // } + //} Self.setLength() return } @@ -78,6 +88,9 @@ func (Self *BasePackager) UnPack(reader io.Reader) (n uint16, err error) { if int(Self.Length) > cap(Self.Content) { err = errors.New("unpack err, content length too large") } + if Self.Length > MAXIMUM_SEGMENT_SIZE { + err = errors.New("mux:packer: unpack content segment too large") + } Self.Content = Self.Content[:int(Self.Length)] //n, err := io.ReadFull(reader, Self.Content) //if n != int(Self.Length) { @@ -128,61 +141,49 @@ type ConnPackager struct { BasePackager } -func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) { - Self.ConnType = connType - err = Self.BasePackager.NewPac(content...) - return -} - -func (Self *ConnPackager) Pack(writer io.Writer) (err error) { - err = binary.Write(writer, binary.LittleEndian, Self.ConnType) - if err != nil { - return - } - err = Self.BasePackager.Pack(writer) - return -} - -func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) { - err = binary.Read(reader, binary.LittleEndian, &Self.ConnType) - if err != nil && err != io.EOF { - return - } - n, err = Self.BasePackager.UnPack(reader) - n += 2 - return -} +//func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) { +// Self.ConnType = connType +// err = Self.BasePackager.NewPac(content...) +// return +//} +// +//func (Self *ConnPackager) Pack(writer io.Writer) (err error) { +// err = binary.Write(writer, binary.LittleEndian, Self.ConnType) +// if err != nil { +// return +// } +// err = Self.BasePackager.Pack(writer) +// return +//} +// +//func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) { +// err = binary.Read(reader, binary.LittleEndian, &Self.ConnType) +// if err != nil && err != io.EOF { +// return +// } +// n, err = Self.BasePackager.UnPack(reader) +// n += 2 +// return +//} type MuxPackager struct { - Flag uint8 - Id int32 - Window uint32 - ReadLength uint32 + Flag uint8 + Id int32 + RemainLength uint32 BasePackager } -func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (err error) { +func (Self *MuxPackager) NewPac(flag uint8, id int32, content interface{}) (err error) { Self.Flag = flag Self.Id = id switch flag { case MUX_PING_FLAG, MUX_PING_RETURN, MUX_NEW_MSG, MUX_NEW_MSG_PART: Self.Content = WindowBuff.Get() - err = Self.BasePackager.NewPac(content...) + err = Self.BasePackager.NewPac(content.([]byte)) //logs.Warn(Self.Length, string(Self.Content)) case MUX_MSG_SEND_OK: // MUX_MSG_SEND_OK contains two data - switch content[0].(type) { - case int: - Self.Window = uint32(content[0].(int)) - case uint32: - Self.Window = content[0].(uint32) - } - switch content[1].(type) { - case int: - Self.ReadLength = uint32(content[1].(int)) - case uint32: - Self.ReadLength = content[1].(uint32) - } + Self.RemainLength = content.(uint32) } return } @@ -201,11 +202,7 @@ func (Self *MuxPackager) Pack(writer io.Writer) (err error) { err = Self.BasePackager.Pack(writer) WindowBuff.Put(Self.Content) case MUX_MSG_SEND_OK: - err = binary.Write(writer, binary.LittleEndian, Self.Window) - if err != nil { - return - } - err = binary.Write(writer, binary.LittleEndian, Self.ReadLength) + err = binary.Write(writer, binary.LittleEndian, Self.RemainLength) } return } @@ -226,12 +223,7 @@ func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) { n, err = Self.BasePackager.UnPack(reader) //logs.Warn("unpack", Self.Length, string(Self.Content)) case MUX_MSG_SEND_OK: - err = binary.Read(reader, binary.LittleEndian, &Self.Window) - if err != nil { - return - } - n += 4 // uint32 - err = binary.Read(reader, binary.LittleEndian, &Self.ReadLength) + err = binary.Read(reader, binary.LittleEndian, &Self.RemainLength) n += 4 // uint32 } n += 5 //uint8 int32 @@ -273,10 +265,10 @@ func (addr *Addr) Decode(b []byte) error { pos := 1 switch addr.Type { case ipV4: - addr.Host = net.IP(b[pos:pos+net.IPv4len]).String() + addr.Host = net.IP(b[pos : pos+net.IPv4len]).String() pos += net.IPv4len case ipV6: - addr.Host = net.IP(b[pos:pos+net.IPv6len]).String() + addr.Host = net.IP(b[pos : pos+net.IPv6len]).String() pos += net.IPv6len case domainName: addrlen := int(b[pos]) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 28ec1de..96bb1a9 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -265,7 +265,7 @@ start: Self.bufQueue.Push(element) // status check finish, now we can push the element into the queue if wait == 0 { - Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, Self.maxSize, newRemaining) + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, newRemaining) // send the remaining window size, not including zero size } return nil @@ -333,7 +333,7 @@ func (Self *ReceiveWindow) sendStatus(id int32, l uint16) { // now we get the current window status success if wait == 1 { //logs.Warn("send the wait status", remaining) - Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, atomic.LoadUint32(&Self.maxSize), remaining) + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, remaining) } return } @@ -394,7 +394,7 @@ func (Self *SendWindow) SetSendBuf(buf []byte) { Self.off = 0 } -func (Self *SendWindow) SetSize(windowSize, newRemaining uint32) (closed bool) { +func (Self *SendWindow) SetSize(newRemaining uint32) (closed bool) { // set the window size from receive window defer func() { if recover() != nil { diff --git a/lib/mux/mux.go b/lib/mux/mux.go index 02b017a..eb75182 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -92,13 +92,13 @@ func (s *Mux) Addr() net.Addr { return s.conn.LocalAddr() } -func (s *Mux) sendInfo(flag uint8, id int32, data ...interface{}) { +func (s *Mux) sendInfo(flag uint8, id int32, data interface{}) { if s.IsClose { return } var err error pack := common.MuxPack.Get() - err = pack.NewPac(flag, id, data...) + err = pack.NewPac(flag, id, data) if err != nil { common.MuxPack.Put(pack) logs.Error("mux: new pack err", err) @@ -173,7 +173,7 @@ func (s *Mux) ping() { s.sendInfo(common.MUX_PING_FLAG, common.MUX_PING, now) // send the ping flag and get the latency first ticker := time.NewTicker(time.Second * 5) - defer ticker.Stop() + defer ticker.Stop() for { if s.IsClose { break @@ -198,7 +198,7 @@ func (s *Mux) ping() { } atomic.AddUint32(&s.pingOk, 1) } - return + return }() } @@ -297,7 +297,7 @@ func (s *Mux) readSession() { if connection.isClose { continue } - connection.sendWindow.SetSize(pack.Window, pack.ReadLength) + connection.sendWindow.SetSize(pack.RemainLength) continue case common.MUX_CONN_CLOSE: //close the connection connection.closeFlag = true diff --git a/lib/version/version.go b/lib/version/version.go index 5c80ede..5206a72 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -4,5 +4,5 @@ const VERSION = "0.25.2" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { - return "0.25.0" + return "0.25.2" } From 899d1e9e2e9199be4e64860943e356cee091dfcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 23:25:47 +0800 Subject: [PATCH 118/171] add sdk md --- docs/_sidebar.md | 1 + docs/npc_sdk.md | 23 ++++++++++++++++++++++ docs/use.md | 2 ++ update.sh | 50 ------------------------------------------------ 4 files changed, 26 insertions(+), 50 deletions(-) create mode 100644 docs/npc_sdk.md delete mode 100644 update.sh diff --git a/docs/_sidebar.md b/docs/_sidebar.md index cfb58fa..2474ab7 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -12,6 +12,7 @@ * [基本使用](use.md) * [增强功能](npc_extend.md) + * [sdk](npc_sdk.md) * 扩展 diff --git a/docs/npc_sdk.md b/docs/npc_sdk.md new file mode 100644 index 0000000..db70772 --- /dev/null +++ b/docs/npc_sdk.md @@ -0,0 +1,23 @@ +# npc sdk文档 + +``` +命令行模式启动客户端 +p0->连接地址 +p1->vkey +p2->连接类型(tcp or udp) +p3->连接代理 + +extern GoInt StartClientByVerifyKey(char* p0, char* p1, char* p2, char* p3); + +查看当前启动的客户端状态,在线为1,离线为0 +extern GoInt GetClientStatus(); + +关闭客户端 +extern void CloseClient(); + +获取当前客户端版本 +extern char* Version(); + +获取日志,实时更新 +extern char* Logs(); +``` diff --git a/docs/use.md b/docs/use.md index deeda30..5ac6cce 100644 --- a/docs/use.md +++ b/docs/use.md @@ -18,6 +18,8 @@ - 停止:`npc.exe stop` - 如果需要更换命令内容需要先卸载`npc.exe -service=uninstall`,再重新注册 +注册到服务后,日志文件windows位于当前目录下,linux和darwin位于/var/log/npc.log + ## 客户端更新 首先进入到对于的客户端二进制文件目录 diff --git a/update.sh b/update.sh deleted file mode 100644 index 3e0bfe3..0000000 --- a/update.sh +++ /dev/null @@ -1,50 +0,0 @@ -#/bash/sh -echo "start upgrading to the latest version" -if [ $1 == "latest" ] -then - version=`wget -qO- -t1 -T2 "https://api.github.com/repos/cnlh/nps/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g'` -else - version=$1 -fi -echo "the current latest version is "$version"" -download_base_url=https://github.com/cnlh/nps/releases/download/$version/ - -if [ $4 ] -then - filename=""$2"_"$3"_v"$4"_"server".tar.gz" -else - filename=""$2"_"$3"_"server".tar.gz" -fi -complete_download_url=""$download_base_url""$filename"" -echo "start download file from "$complete_download_url"" - -dir_name=`echo $RANDOM` -mkdir $dir_name && cd $dir_name -wget $complete_download_url >/dev/null 2>&1 -if [ ! -f "$filename" ]; then - echo "download file failed!" - rm -rf $dir_name - exit -fi - -echo "start extracting files" -mkdir nps -tar -xvf $filename -C ./nps >/dev/null 2>&1 -cd nps - -if [ -f "../../nps" ]; then - echo "replace "../../nps"!" - cp -rf nps ../../ -fi - -usr_dir=`which nps` - -if [ -f "$usr_dir" ]; then - echo "replace "$usr_dir"!" - cp -rf nps $usr_dir -fi - -cd ../../ && rm -rf $dir_name - -echo "update complete!" -echo -e "\033[32m please restart nps \033[0m" From ab629b5730e19ec9606423b5cc4f1e7ff2071583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 23:38:19 +0800 Subject: [PATCH 119/171] change md --- docs/_sidebar.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 2474ab7..a17588d 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -12,14 +12,14 @@ * [基本使用](use.md) * [增强功能](npc_extend.md) - * [sdk](npc_sdk.md) * 扩展 * [功能](feature.md) * [说明](description.md) * [web api](api.md) - + * [sdk](npc_sdk.md) +git * 其他 * [贡献](contribute.md) From 32ce0e3dd6cf72e7d2d091dbdd7973573d7a22d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Mon, 16 Dec 2019 23:49:03 +0800 Subject: [PATCH 120/171] change logo.png --- docs/logo.png | Bin 889 -> 1400 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/logo.png b/docs/logo.png index 20df9d0e24533b524a62990bae56fc06d68225b3..b4e29a7a5508d682572138136b2f7f6d986b0626 100644 GIT binary patch literal 1400 zcmX9-2~bm46b;hRnxYh~(ot|3K%Am2jCFJrRNw~)7{L7hAq52mMFbpVlOU13L68DQ z78yW9kX2Ttsp5uU5s_UDNq{6I`PqIJS%M&e{?t3?o%imY`_8@d=DsX%PuC6jZFn3G zw}I#ekg?rXzrHub`0T{`4jgU`&HE%oz}(eU40?lM_#+H+i9`~Kgpf!lPQdc8u<@gw zT%!LZ0NZ=`xwxE?mDVV$n=seOoqWQL!gcbVaD^ucAj|obqZ{l(0@*Gg3xK%*I8Fco zH`v(&A`meqI}u^P14ODC+)w#C5kbYB`+z$nEvQsh)pH3D+Zh6gpsOcEQC_dQUq8#f zqn#*`G0HKWId%aD0O#2ya^+_XsQR;ZAZG4;v{;IYWh!TP2m_k{N~B6uj&htq35Pc= zk|82F!WCfEo!wz++Y|KV8%%@)K#G$4`h$y)o(YhG&foxKtcoHdPm!Ll{gk09toXuV zsBV}4pO0MuG5zLtCdM2B_=x!&6XCePde#eqXl#l)yGY-LzLp+}%h&WAPE{slY5vUr z7DR)iH7VKXnFvi>x^94?8}!o+2k6GBD?_KT1i%BnaG4rK4`40X{u{%Z)ZO5c+$n55U?kw^`!|AcS^|R2`BlYNr7lefbfOV>H79*v0PZy zC~9a&xO`*+i;59Mfk+jI3`Jy037dz#k7QCH;Rz)?k+id0`m9G*(;};DleIAAs79{T zD58@U@fnJQKNUGesP9EIJRS|Fq7m27NE#ZOipHfX;qywL3rb3el5$ZMa9I@`r9K~} z4vSaErD?8Q*F-04sOhuZvN?9q9H)4m#n5&F+TLI-uXf=D;mZrc$`ECB5LzAb?RR)S zh|OPWEZGyp85pcFT)PgBH!|9=(b#0Gso9R5yDTiN_E_)TyWj42dxztWPJr7<63NR8 zgegIxp`l?BG1P>_l)U`>{9CsR3h$Ja->tY;S=rF|u({>YW2In=_j6slxE3hWy2ike;hnN!qN64+W z@Z)0OMn|)C8X{4g!?5uke0QCm;oY1cDDAGP2-16_=Z=_J9m-37 zd!RF%i>grjia?}zA^vK!I^2LiSXMV?I{2#ynd)6n!dvg$!rn(^bV-V9ZkEN~70x6c zwe*_mjn+7Fv&sT??lC`*x`bPvsYs4blhu}-ef{(g$Df5qqDW^dLfV&OH)m*qcK;jw zCNs2X;Rrz&w~yZ3@b#HZ_mF3yq-C$ki;?*#lkTI|{jv{d%Yb<1!6LG}sjGY5eurtvtfjHB zhI;y{FjutOY)J6t#!Ak1rdRc`gkP8orCz$9uB+QG+*@Zs77$6tKa9n*=^6|1Y69-> zl90Oj9tT&Gf&CrpHadSu8nvs|3d$WJ5|CqHbP|5%CL8PfeHts#X(6y8@#Iu9MBlwV)-+_TmbD?+7y@Z(g z+HLHrKDv7K;H5;4dc?Ln=~5W9WI46Mu*Z+>A7|ChEm$QFpJDFej@Al#<&g=Ck^QE9 ztVpBHx|NZK9+a}h*{_?=t-!DBdd3a;t4bEjz00uj^;^T%J^eFJ$Qs;XWzMYaO5AUK ky4m1^tyVTMLFi#w;LXCtTAw`IHf(BeM1m*K>~uEmKZ~9UU;qFB delta 877 zcmV-z1Csps3i$?*8Gi-<00374`G)`i13*bcK~!i%?N{APQ(+kYJ?}Z&6pE0kxh5G@ zVxO?mBA8kjK?bI_FueB8i=aOs`nZaUx`^)UA_!^ZF8sjA8AOyZMInf~i0EUZkEN-b z?(95qwia{R*g7ZN;5;xmyn8-=zvuU!_dGA5$c>5|KTHB^t$(1YfT@7a4wzd=X9IPI zn+oV|q0R)R0y-P0JA9b}Eyq2h5I6`>7~n8~Fc?$BJPF|CqrnFgnHBj}rvvlSZb)ng zQ#rupAhrWk4uTyjey@=ofDB*`j5!GWOgyXj3gT&ym_{7aRNpt953A(_T0NX4c%jxw zS8n%m0CCiVXn!BTE&$c}6wJw&(Fdpl5UQVC58q{r$x6U!2M*K%b=AN&2T)U)Q+cDE z?#AX8Cap~aH&#o$f&@Ciwtm4B?%ZgCHfCJ1oA^8tXf5W%M~ zsj(OqXSIVXX+oBMlpGl;BcAYh!RRPt@EW#E0@|8vv-*hxr#}L`Nn1GY-HhOjbyY4^ z86rixW({9Nm4euiJ_Pd*7v0oaoQu_^(gPyLORh76B}6KER?o+YB2*$6PJ7k$l+ z3ugIr`ft956XKks zFcr|#JtJaG1&rvTo*bqEdb(#stf_zzUDT7K=oR<{BuYG|n|Jy)00000NkvXXu0mjf DCiR{^ From b558cc6d19c3500941ed4688e7933a169e60a033 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 17 Dec 2019 00:06:48 +0800 Subject: [PATCH 121/171] add build android --- .travis.yml | 1 + build.android.sh | 14 ++++++++++++++ build.sh | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 build.android.sh diff --git a/.travis.yml b/.travis.yml index 7208fd3..19b2209 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,6 +52,7 @@ deploy: - windows_amd64_server.tar.gz - npc_syno.spk - npc_sdk.tar.gz + - android_client.apk on: tags: true all_branches: true diff --git a/build.android.sh b/build.android.sh new file mode 100644 index 0000000..2b97c06 --- /dev/null +++ b/build.android.sh @@ -0,0 +1,14 @@ +#!/bin/bash +#sudo apt-get install libgl1-mesa-dev xorg-dev +#go get github.com/ffdfgdfg/fyne-cross +#fyne-cross --targets=linux/amd64,windows/amd64,darwin/amd64 gui/npc/npc.go + +go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne +go mod vendor +cd vendor +cp -R * /go/src/ +cd .. +rm -rf vendor +cd gui/npc +fyne package -os android -appID org.nps.client -icon ../../docs/logo.png +mv npc.apk ../../android_client.apk \ No newline at end of file diff --git a/build.sh b/build.sh index b4bdca0..06fa2bc 100644 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#/bash/sh +#!/bash/sh export VERSION=0.25.2 sudo apt-get install gcc-mingw-w64-i686 @@ -163,6 +163,7 @@ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubun sudo apt-get update sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce docker --version +docker run --rm -i -w /app -v $(pwd):/app -e ANDROID_HOME=/usr/local/android_sdk ffdfgdfg/fyne-cross:android build.android.sh git clone https://github.com/cnlh/spksrc.git ~/spksrc mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash From 8311c8bd77f24a3b52456111560bc0ac5a8b6af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Tue, 17 Dec 2019 00:47:07 +0800 Subject: [PATCH 122/171] change build.sh --- .travis.yml | 2 +- build.android.sh | 4 ++-- build.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 build.sh diff --git a/.travis.yml b/.travis.yml index 19b2209..d5c3457 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ script: os: - linux before_deploy: - - chmod +x ./build.sh && ./build.sh + - chmod +x ./build.sh && chmod +x ./build.android.sh && ./build.sh deploy: provider: releases diff --git a/build.android.sh b/build.android.sh index 2b97c06..c9c3cbe 100644 --- a/build.android.sh +++ b/build.android.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#/bin/bash #sudo apt-get install libgl1-mesa-dev xorg-dev #go get github.com/ffdfgdfg/fyne-cross #fyne-cross --targets=linux/amd64,windows/amd64,darwin/amd64 gui/npc/npc.go @@ -11,4 +11,4 @@ cd .. rm -rf vendor cd gui/npc fyne package -os android -appID org.nps.client -icon ../../docs/logo.png -mv npc.apk ../../android_client.apk \ No newline at end of file +mv npc.apk ../../android_client.apk diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index 06fa2bc..431541b --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bash/sh +#/bash/sh export VERSION=0.25.2 sudo apt-get install gcc-mingw-w64-i686 From 5e356c04227d14f4ec51675c45bb708579197ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Tue, 17 Dec 2019 08:20:38 +0800 Subject: [PATCH 123/171] update build.sh --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 431541b..2babfba 100755 --- a/build.sh +++ b/build.sh @@ -79,7 +79,7 @@ tar -czvf windows_amd64_client.tar.gz npc.exe conf/npc.conf conf/multi_account.c CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/npc/npc.go -tar -czvf darwin_client.tar.gz npc conf/npc.conf conf/multi_account.conf +tar -czvf darwin_amd64_client.tar.gz npc conf/npc.conf conf/multi_account.conf CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go @@ -146,7 +146,7 @@ tar -czvf linux_mipsle_server.tar.gz conf/nps.conf conf/tasks.json conf/clients. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go -tar -czvf darwin_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps +tar -czvf darwin_amd64_server.tar.gz conf/nps.conf conf/tasks.json conf/clients.json conf/hosts.json conf/server.key conf/server.pem web/views web/static nps CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -w -extldflags -static -extldflags -static" ./cmd/nps/nps.go From b46e35cf7e974bb22657bcf8937b071058d2324c Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 17 Dec 2019 15:31:25 +0800 Subject: [PATCH 124/171] build android script --- build.android.sh | 7 +++++-- build.sh | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/build.android.sh b/build.android.sh index c9c3cbe..cae6d93 100644 --- a/build.android.sh +++ b/build.android.sh @@ -3,12 +3,15 @@ #go get github.com/ffdfgdfg/fyne-cross #fyne-cross --targets=linux/amd64,windows/amd64,darwin/amd64 gui/npc/npc.go +mkdir -p /go/src/github.com/cnlh/nps +cp -R * /go/src/github.com/cnlh/nps +cd /go/src/github.com/cnlh/nps go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne go mod vendor cd vendor -cp -R * /go/src/ +cp -R * /go/src cd .. rm -rf vendor cd gui/npc fyne package -os android -appID org.nps.client -icon ../../docs/logo.png -mv npc.apk ../../android_client.apk +mv npc.apk /app/android_client.apk diff --git a/build.sh b/build.sh index 2babfba..56e77f9 100755 --- a/build.sh +++ b/build.sh @@ -163,7 +163,7 @@ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubun sudo apt-get update sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce docker --version -docker run --rm -i -w /app -v $(pwd):/app -e ANDROID_HOME=/usr/local/android_sdk ffdfgdfg/fyne-cross:android build.android.sh +docker run --rm -i -w /app -v $(pwd):/app -e ANDROID_HOME=/usr/local/android_sdk ffdfgdfg/fyne-cross:android /app/build.android.sh git clone https://github.com/cnlh/spksrc.git ~/spksrc mkdir ~/spksrc/nps && cp -rf ./* ~/spksrc/nps/ docker run -itd --name spksrc --env VERSION=$VERSION -v ~/spksrc:/spksrc synocommunity/spksrc /bin/bash From 2629078988c867728570b1774dc0daace9e61b7a Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 17 Dec 2019 15:38:40 +0800 Subject: [PATCH 125/171] Revert "change mux data struct, fix #250" This reverts commit ae28d41231c68c226a0a0c82f3341c42cef6c620. --- lib/common/netpackager.go | 132 ++++++++++++++++++++------------------ lib/mux/conn.go | 6 +- lib/mux/mux.go | 10 +-- lib/version/version.go | 2 +- 4 files changed, 79 insertions(+), 71 deletions(-) diff --git a/lib/common/netpackager.go b/lib/common/netpackager.go index e3e0919..96ebaec 100644 --- a/lib/common/netpackager.go +++ b/lib/common/netpackager.go @@ -22,34 +22,24 @@ type BasePackager struct { Content []byte } -func (Self *BasePackager) NewPac(content []byte) (err error) { +func (Self *BasePackager) NewPac(contents ...interface{}) (err error) { Self.clean() - if content != nil { - n := len(content) - if n > MAXIMUM_SEGMENT_SIZE { - err = errors.New("mux:packer: newpack content segment too large") + for _, content := range contents { + switch content.(type) { + case nil: + Self.Content = Self.Content[:0] + case []byte: + err = Self.appendByte(content.([]byte)) + case string: + err = Self.appendByte([]byte(content.(string))) + if err != nil { + return + } + err = Self.appendByte([]byte(CONN_DATA_SEQ)) + default: + err = Self.marshal(content) } - Self.Content = Self.Content[:n] - copy(Self.Content, content) - } else { - Self.Content = Self.Content[:0] } - //for _, content := range contents { - // switch content.(type) { - // case nil: - // Self.Content = Self.Content[:0] - // case []byte: - // err = Self.appendByte(content.([]byte)) - // case string: - // err = Self.appendByte([]byte(content.(string))) - // if err != nil { - // return - // } - // err = Self.appendByte([]byte(CONN_DATA_SEQ)) - // default: - // err = Self.marshal(content) - // } - //} Self.setLength() return } @@ -88,9 +78,6 @@ func (Self *BasePackager) UnPack(reader io.Reader) (n uint16, err error) { if int(Self.Length) > cap(Self.Content) { err = errors.New("unpack err, content length too large") } - if Self.Length > MAXIMUM_SEGMENT_SIZE { - err = errors.New("mux:packer: unpack content segment too large") - } Self.Content = Self.Content[:int(Self.Length)] //n, err := io.ReadFull(reader, Self.Content) //if n != int(Self.Length) { @@ -141,49 +128,61 @@ type ConnPackager struct { BasePackager } -//func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) { -// Self.ConnType = connType -// err = Self.BasePackager.NewPac(content...) -// return -//} -// -//func (Self *ConnPackager) Pack(writer io.Writer) (err error) { -// err = binary.Write(writer, binary.LittleEndian, Self.ConnType) -// if err != nil { -// return -// } -// err = Self.BasePackager.Pack(writer) -// return -//} -// -//func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) { -// err = binary.Read(reader, binary.LittleEndian, &Self.ConnType) -// if err != nil && err != io.EOF { -// return -// } -// n, err = Self.BasePackager.UnPack(reader) -// n += 2 -// return -//} +func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) { + Self.ConnType = connType + err = Self.BasePackager.NewPac(content...) + return +} + +func (Self *ConnPackager) Pack(writer io.Writer) (err error) { + err = binary.Write(writer, binary.LittleEndian, Self.ConnType) + if err != nil { + return + } + err = Self.BasePackager.Pack(writer) + return +} + +func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) { + err = binary.Read(reader, binary.LittleEndian, &Self.ConnType) + if err != nil && err != io.EOF { + return + } + n, err = Self.BasePackager.UnPack(reader) + n += 2 + return +} type MuxPackager struct { - Flag uint8 - Id int32 - RemainLength uint32 + Flag uint8 + Id int32 + Window uint32 + ReadLength uint32 BasePackager } -func (Self *MuxPackager) NewPac(flag uint8, id int32, content interface{}) (err error) { +func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (err error) { Self.Flag = flag Self.Id = id switch flag { case MUX_PING_FLAG, MUX_PING_RETURN, MUX_NEW_MSG, MUX_NEW_MSG_PART: Self.Content = WindowBuff.Get() - err = Self.BasePackager.NewPac(content.([]byte)) + err = Self.BasePackager.NewPac(content...) //logs.Warn(Self.Length, string(Self.Content)) case MUX_MSG_SEND_OK: // MUX_MSG_SEND_OK contains two data - Self.RemainLength = content.(uint32) + switch content[0].(type) { + case int: + Self.Window = uint32(content[0].(int)) + case uint32: + Self.Window = content[0].(uint32) + } + switch content[1].(type) { + case int: + Self.ReadLength = uint32(content[1].(int)) + case uint32: + Self.ReadLength = content[1].(uint32) + } } return } @@ -202,7 +201,11 @@ func (Self *MuxPackager) Pack(writer io.Writer) (err error) { err = Self.BasePackager.Pack(writer) WindowBuff.Put(Self.Content) case MUX_MSG_SEND_OK: - err = binary.Write(writer, binary.LittleEndian, Self.RemainLength) + err = binary.Write(writer, binary.LittleEndian, Self.Window) + if err != nil { + return + } + err = binary.Write(writer, binary.LittleEndian, Self.ReadLength) } return } @@ -223,7 +226,12 @@ func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) { n, err = Self.BasePackager.UnPack(reader) //logs.Warn("unpack", Self.Length, string(Self.Content)) case MUX_MSG_SEND_OK: - err = binary.Read(reader, binary.LittleEndian, &Self.RemainLength) + err = binary.Read(reader, binary.LittleEndian, &Self.Window) + if err != nil { + return + } + n += 4 // uint32 + err = binary.Read(reader, binary.LittleEndian, &Self.ReadLength) n += 4 // uint32 } n += 5 //uint8 int32 @@ -265,10 +273,10 @@ func (addr *Addr) Decode(b []byte) error { pos := 1 switch addr.Type { case ipV4: - addr.Host = net.IP(b[pos : pos+net.IPv4len]).String() + addr.Host = net.IP(b[pos:pos+net.IPv4len]).String() pos += net.IPv4len case ipV6: - addr.Host = net.IP(b[pos : pos+net.IPv6len]).String() + addr.Host = net.IP(b[pos:pos+net.IPv6len]).String() pos += net.IPv6len case domainName: addrlen := int(b[pos]) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 96bb1a9..28ec1de 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -265,7 +265,7 @@ start: Self.bufQueue.Push(element) // status check finish, now we can push the element into the queue if wait == 0 { - Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, newRemaining) + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, Self.maxSize, newRemaining) // send the remaining window size, not including zero size } return nil @@ -333,7 +333,7 @@ func (Self *ReceiveWindow) sendStatus(id int32, l uint16) { // now we get the current window status success if wait == 1 { //logs.Warn("send the wait status", remaining) - Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, remaining) + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, atomic.LoadUint32(&Self.maxSize), remaining) } return } @@ -394,7 +394,7 @@ func (Self *SendWindow) SetSendBuf(buf []byte) { Self.off = 0 } -func (Self *SendWindow) SetSize(newRemaining uint32) (closed bool) { +func (Self *SendWindow) SetSize(windowSize, newRemaining uint32) (closed bool) { // set the window size from receive window defer func() { if recover() != nil { diff --git a/lib/mux/mux.go b/lib/mux/mux.go index eb75182..02b017a 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -92,13 +92,13 @@ func (s *Mux) Addr() net.Addr { return s.conn.LocalAddr() } -func (s *Mux) sendInfo(flag uint8, id int32, data interface{}) { +func (s *Mux) sendInfo(flag uint8, id int32, data ...interface{}) { if s.IsClose { return } var err error pack := common.MuxPack.Get() - err = pack.NewPac(flag, id, data) + err = pack.NewPac(flag, id, data...) if err != nil { common.MuxPack.Put(pack) logs.Error("mux: new pack err", err) @@ -173,7 +173,7 @@ func (s *Mux) ping() { s.sendInfo(common.MUX_PING_FLAG, common.MUX_PING, now) // send the ping flag and get the latency first ticker := time.NewTicker(time.Second * 5) - defer ticker.Stop() + defer ticker.Stop() for { if s.IsClose { break @@ -198,7 +198,7 @@ func (s *Mux) ping() { } atomic.AddUint32(&s.pingOk, 1) } - return + return }() } @@ -297,7 +297,7 @@ func (s *Mux) readSession() { if connection.isClose { continue } - connection.sendWindow.SetSize(pack.RemainLength) + connection.sendWindow.SetSize(pack.Window, pack.ReadLength) continue case common.MUX_CONN_CLOSE: //close the connection connection.closeFlag = true diff --git a/lib/version/version.go b/lib/version/version.go index 5206a72..5c80ede 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -4,5 +4,5 @@ const VERSION = "0.25.2" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { - return "0.25.2" + return "0.25.0" } From 5a0fe14f2376feb098990764d7780d3c6e32abfe Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 17 Dec 2019 18:50:28 +0800 Subject: [PATCH 126/171] fix segments size --- lib/common/netpackager.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/common/netpackager.go b/lib/common/netpackager.go index 96ebaec..cf4b988 100644 --- a/lib/common/netpackager.go +++ b/lib/common/netpackager.go @@ -41,6 +41,9 @@ func (Self *BasePackager) NewPac(contents ...interface{}) (err error) { } } Self.setLength() + if Self.Length > MAXIMUM_SEGMENT_SIZE { + err = errors.New("mux:packer: newpack content segment too large") + } return } @@ -77,6 +80,11 @@ func (Self *BasePackager) UnPack(reader io.Reader) (n uint16, err error) { } if int(Self.Length) > cap(Self.Content) { err = errors.New("unpack err, content length too large") + return + } + if Self.Length > MAXIMUM_SEGMENT_SIZE { + err = errors.New("mux:packer: unpack content segment too large") + return } Self.Content = Self.Content[:int(Self.Length)] //n, err := io.ReadFull(reader, Self.Content) @@ -273,10 +281,10 @@ func (addr *Addr) Decode(b []byte) error { pos := 1 switch addr.Type { case ipV4: - addr.Host = net.IP(b[pos:pos+net.IPv4len]).String() + addr.Host = net.IP(b[pos : pos+net.IPv4len]).String() pos += net.IPv4len case ipV6: - addr.Host = net.IP(b[pos:pos+net.IPv6len]).String() + addr.Host = net.IP(b[pos : pos+net.IPv6len]).String() pos += net.IPv6len case domainName: addrlen := int(b[pos]) From 7330f9f7287f3532d7345a4abcf9da5a5da7191a Mon Sep 17 00:00:00 2001 From: he liu Date: Tue, 17 Dec 2019 22:17:06 +0800 Subject: [PATCH 127/171] Update use.md --- docs/use.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/use.md b/docs/use.md index 5ac6cce..30b42dd 100644 --- a/docs/use.md +++ b/docs/use.md @@ -7,8 +7,8 @@ ## 注册到系统服务 对于linux、darwin - 注册:`sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)` -- 启动:`sudo ./npc start` -- 停止:`sudo ./npc stop` +- 启动:`sudo npc start` +- 停止:`sudo npc stop` - 如果需要更换命令内容需要先卸载`./npc -service=uninstall`,再重新注册 对于windows,使用管理员身份运行cmd @@ -23,11 +23,11 @@ ## 客户端更新 首先进入到对于的客户端二进制文件目录 -请首先执行`sudo ./npc stop`或者`nps.exe stop`停止运行,然后 +请首先执行`sudo npc stop`或者`nps.exe stop`停止运行,然后 对于linux ```shell - sudo ./npc-update update + sudo npc-update update ``` 对于windows ```shell From a7a52ea85c73dba80057a5cf512b0808ef86f0e0 Mon Sep 17 00:00:00 2001 From: he liu Date: Tue, 17 Dec 2019 22:18:50 +0800 Subject: [PATCH 128/171] Update use.md --- docs/use.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/use.md b/docs/use.md index 30b42dd..4795960 100644 --- a/docs/use.md +++ b/docs/use.md @@ -23,7 +23,7 @@ ## 客户端更新 首先进入到对于的客户端二进制文件目录 -请首先执行`sudo npc stop`或者`nps.exe stop`停止运行,然后 +请首先执行`sudo npc stop`或者`npc.exe stop`停止运行,然后 对于linux ```shell @@ -34,7 +34,7 @@ npc-update.exe update ``` -更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 +更新完成后,执行执行`sudo npc start`或者`npc.exe start`重新运行即可完成升级 ## 配置文件模式 此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 From 6f0ad73c232c2d1be72294d8c8ba17ff0a77598b Mon Sep 17 00:00:00 2001 From: he liu Date: Wed, 18 Dec 2019 00:26:59 +0800 Subject: [PATCH 129/171] Update _sidebar.md --- docs/_sidebar.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index a17588d..c35b26e 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -19,7 +19,7 @@ * [说明](description.md) * [web api](api.md) * [sdk](npc_sdk.md) -git + * 其他 * [贡献](contribute.md) From 897c123daa7382b2720fd8253963ca37296cca60 Mon Sep 17 00:00:00 2001 From: he liu Date: Wed, 18 Dec 2019 01:14:53 +0800 Subject: [PATCH 130/171] Update use.md --- docs/use.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/use.md b/docs/use.md index 4795960..5b75266 100644 --- a/docs/use.md +++ b/docs/use.md @@ -9,14 +9,14 @@ - 注册:`sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)` - 启动:`sudo npc start` - 停止:`sudo npc stop` -- 如果需要更换命令内容需要先卸载`./npc -service=uninstall`,再重新注册 +- 如果需要更换命令内容需要先卸载`./npc uninstall`,再重新注册 对于windows,使用管理员身份运行cmd - 注册:`npc.exe install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)` - 启动:`npc.exe start` - 停止:`npc.exe stop` -- 如果需要更换命令内容需要先卸载`npc.exe -service=uninstall`,再重新注册 +- 如果需要更换命令内容需要先卸载`npc.exe uninstall`,再重新注册 注册到服务后,日志文件windows位于当前目录下,linux和darwin位于/var/log/npc.log From bcf581b491b6cca6373bdfc0a5fffb03cd2f3904 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Dec 2019 10:01:22 +0800 Subject: [PATCH 131/171] update md --- README.md | 2 +- docs/run.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d1f8958..f6bff6c 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` -停止和重启可用,stop和restart +```安装后windows配置文件位于 C:\Program Files\nps,linux和darwin位于/etc/nps``` **如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** - 访问服务端ip:web服务端口(默认为8080) diff --git a/docs/run.md b/docs/run.md index bc79756..dea35dc 100644 --- a/docs/run.md +++ b/docs/run.md @@ -14,6 +14,8 @@ 对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` +```安装后windows配置文件位于 C:\Program Files\nps,linux和darwin位于/etc/nps``` + 停止和重启可用,stop和restart **如果发现没有启动成功,可以使用`nps(.exe) debug`运行调试,或查看日志**(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log) From 726be1cba0662c040808eb080f78995b543ef5b8 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 18 Dec 2019 16:07:36 +0800 Subject: [PATCH 132/171] Update build.android.sh --- build.android.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/build.android.sh b/build.android.sh index cae6d93..1dd9e39 100644 --- a/build.android.sh +++ b/build.android.sh @@ -3,15 +3,18 @@ #go get github.com/ffdfgdfg/fyne-cross #fyne-cross --targets=linux/amd64,windows/amd64,darwin/amd64 gui/npc/npc.go -mkdir -p /go/src/github.com/cnlh/nps -cp -R * /go/src/github.com/cnlh/nps -cd /go/src/github.com/cnlh/nps +cd /go go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne +mkdir -p /go/src/github.com/cnlh/nps +cp -R /app/* /go/src/github.com/cnlh/nps +cd /go/src/github.com/cnlh/nps go mod vendor cd vendor cp -R * /go/src cd .. rm -rf vendor +#rm -rf ~/.cache/* cd gui/npc -fyne package -os android -appID org.nps.client -icon ../../docs/logo.png +#export ANDROID_NDK_HOME=/usr/local/android_sdk/ndk-bundle +fyne package -appID org.nps.client -os android -icon ../../docs/logo.png mv npc.apk /app/android_client.apk From 0c08d9e202f04bee653782284e209b01ab56a8f1 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Dec 2019 16:37:04 +0800 Subject: [PATCH 133/171] change default log setting --- cmd/npc/npc.go | 2 ++ cmd/nps/nps.go | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index ddce289..da29a05 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -108,6 +108,8 @@ func main() { os.Exit(0) case "install", "start", "stop", "uninstall", "restart": if os.Args[1] == "install" { + service.Control(s, "stop") + service.Control(s, "uninstall") install.InstallNpc() } err := service.Control(s, os.Args[1]) diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 95ddf9c..f4c771c 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -26,7 +26,6 @@ import ( var ( level string - logType = flag.String("log", "stdout", "Log output mode(stdout|file)") ) func main() { @@ -48,7 +47,6 @@ func main() { if common.IsWindows() { logPath = strings.Replace(logPath, "\\", "\\\\", -1) } - logs.SetLogger(logs.AdapterFile, `{"level":`+level+`,"filename":"`+logPath+`","daily":false,"maxlines":100000,"color":true}`) // init service options := make(service.KeyValue) options["Restart"] = "on-success" @@ -71,15 +69,15 @@ func main() { logs.Error(err) return } + logs.SetLogger(logs.AdapterConsole, `{"level":`+level+`,"color":true}`) if len(os.Args) > 1 { switch os.Args[1] { - case "debug": - logs.SetLogger(logs.AdapterConsole, `{"level":`+level+`,"color":true}`) case "reload": daemon.InitDaemon("nps", common.GetRunPath(), common.GetTmpPath()) return case "install": // uninstall before + service.Control(s, "stop") service.Control(s, "uninstall") binPath := install.InstallNps() @@ -95,6 +93,7 @@ func main() { } return case "start", "restart", "stop", "uninstall": + logs.SetLogger(logs.AdapterFile, `{"level":`+level+`,"filename":"`+logPath+`","daily":false,"maxlines":100000,"color":true}`) err := service.Control(s, os.Args[1]) if err != nil { logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) From e9580e939b61eeadb3fd7b56a4914e482b5a06e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Thu, 19 Dec 2019 00:46:22 +0800 Subject: [PATCH 134/171] print log when run with nps --- cmd/nps/nps.go | 12 ++++++++---- docs/run.md | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index f4c771c..306da88 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -25,7 +25,7 @@ import ( ) var ( - level string + level string ) func main() { @@ -57,6 +57,12 @@ func main() { Description: "一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。", Option: options, } + svcConfig.Arguments = append(svcConfig.Arguments, "service") + if len(os.Args) > 1 && os.Args[1] == "service" { + logs.SetLogger(logs.AdapterFile, `{"level":`+level+`,"filename":"`+logPath+`","daily":false,"maxlines":100000,"color":true}`) + } else { + logs.SetLogger(logs.AdapterConsole, `{"level":`+level+`,"color":true}`) + } if !common.IsWindows() { svcConfig.Dependencies = []string{ "Requires=network.target", @@ -69,8 +75,7 @@ func main() { logs.Error(err) return } - logs.SetLogger(logs.AdapterConsole, `{"level":`+level+`,"color":true}`) - if len(os.Args) > 1 { + if len(os.Args) > 1 && os.Args[1] != "service" { switch os.Args[1] { case "reload": daemon.InitDaemon("nps", common.GetRunPath(), common.GetTmpPath()) @@ -93,7 +98,6 @@ func main() { } return case "start", "restart", "stop", "uninstall": - logs.SetLogger(logs.AdapterFile, `{"level":`+level+`,"filename":"`+logPath+`","daily":false,"maxlines":100000,"color":true}`) err := service.Control(s, os.Args[1]) if err != nil { logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) diff --git a/docs/run.md b/docs/run.md index dea35dc..805e154 100644 --- a/docs/run.md +++ b/docs/run.md @@ -18,7 +18,7 @@ 停止和重启可用,stop和restart -**如果发现没有启动成功,可以使用`nps(.exe) debug`运行调试,或查看日志**(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log) +**如果发现没有启动成功,可以使用`nps(.exe) stop`,然后运行`nps.(exe)`运行调试,或查看日志**(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log) - 访问服务端ip:web服务端口(默认为8080) - 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) - 创建客户端 From f253afd2fb8bf7f3cfe2c015e3b63420f686348c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Thu, 19 Dec 2019 00:48:39 +0800 Subject: [PATCH 135/171] change md --- docs/use.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/use.md b/docs/use.md index 5b75266..00547b2 100644 --- a/docs/use.md +++ b/docs/use.md @@ -2,9 +2,9 @@ ## 无配置文件模式 此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置 ``` - ./npc -debug=true -server=ip:port -vkey=web界面中显示的密钥 + ./npc -server=ip:port -vkey=web界面中显示的密钥 ``` -## 注册到系统服务 +## 注册到系统服务(开机启动、守护进程) 对于linux、darwin - 注册:`sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx)` - 启动:`sudo npc start` From 453d36f658a9e0802130946172e9f67867856ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Thu, 19 Dec 2019 01:15:18 +0800 Subject: [PATCH 136/171] add web protection in md --- docs/description.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/description.md b/docs/description.md index 584f5b0..72e69b3 100644 --- a/docs/description.md +++ b/docs/description.md @@ -8,6 +8,9 @@ ## 热更新支持 对于绝大多数配置,在web管理中的修改将实时使用,无需重启客户端或者服务端 +## web端保护 +在一分钟内,如果密码错误次数超过10次,该ip在一分钟内将不能再次登陆。 + ## 客户端地址显示 在web管理中将显示客户端的连接地址 From 1ab7e476a1f9f358aabf904815ddf28caad6b5a5 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 19 Dec 2019 15:08:31 +0800 Subject: [PATCH 137/171] change md --- README.md | 11 +++++++++++ docs/_coverpage.md | 15 ++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f6bff6c..b517040 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,18 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 4. 在外网使用HTTP代理访问内网站点----> http代理模式 5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 +## 特点 +- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理... +- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务 +- 控制全面,同时支持服务端和客户端控制 +- https集成,支持将后端代理和web服务转成https,同时支持多证书 +- 操作简单,只需简单的配置即可在web ui上完成其余操作 +- 展示信息全面,流量、系统信息、即时带宽、客户端版本等 +- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等) +- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能 +- 服务端支持多用户和用户注册功能 +**没找到你想要的功能?不要紧,点击[进入文档](https://cnlh.github.io/nps/)查找吧** ## 快速开始 ### 安装 diff --git a/docs/_coverpage.md b/docs/_coverpage.md index f74428e..03999ab 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -1,13 +1,18 @@ ![logo](logo.svg) -# NPS 0.25.1 +# NPS 0.25.2 > 一款轻量级、高性能、功能强大的内网穿透代理服务器 -- 支持tcp、udp流量转发 -- 支持内网http代理、内网socks5代理、p2p -- 简洁方便的WEB管理界面 -- 服务端控制 +- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理... +- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务 +- 控制全面,同时支持服务端和客户端控制 +- https集成,支持将后端代理和web服务转成https,同时支持多证书 +- 操作简单,只需简单的配置即可在web ui上完成其余操作 +- 展示信息全面,流量、系统信息、即时带宽、客户端版本等 +- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等) +- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能 +- 服务端支持多用户和用户注册功能 [GitHub](https://github.com/cnlh/nps/) From eba8af3595018253a38a1db8f984ed49bf3fc5f1 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 19 Dec 2019 15:12:31 +0800 Subject: [PATCH 138/171] change md --- docs/_coverpage.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 03999ab..cb361da 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -4,15 +4,12 @@ > 一款轻量级、高性能、功能强大的内网穿透代理服务器 -- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理... -- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务 -- 控制全面,同时支持服务端和客户端控制 -- https集成,支持将后端代理和web服务转成https,同时支持多证书 -- 操作简单,只需简单的配置即可在web ui上完成其余操作 -- 展示信息全面,流量、系统信息、即时带宽、客户端版本等 -- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等) -- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能 -- 服务端支持多用户和用户注册功能 +- 几乎支持所有协议 +- 支持内网http代理、内网socks5代理、p2p等 +- 简洁但功能强大的WEB管理界面 +- 支持服务端、客户端同时控制 +- 扩展功能强大 +- 全平台兼容,一键注册为服务 [GitHub](https://github.com/cnlh/nps/) From 231ba13e8c4bc7bb3e5225b6f6dd6226e05a2068 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Thu, 19 Dec 2019 22:24:58 +0800 Subject: [PATCH 139/171] remove mux connection deadline --- lib/mux/mux.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/mux/mux.go b/lib/mux/mux.go index 02b017a..ae9f335 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -34,6 +34,7 @@ type Mux struct { func NewMux(c net.Conn, connType string) *Mux { //c.(*net.TCPConn).SetReadBuffer(0) //c.(*net.TCPConn).SetWriteBuffer(0) + _ = c.SetDeadline(time.Time{}) m := &Mux{ conn: c, connMap: NewConnMap(), @@ -173,7 +174,7 @@ func (s *Mux) ping() { s.sendInfo(common.MUX_PING_FLAG, common.MUX_PING, now) // send the ping flag and get the latency first ticker := time.NewTicker(time.Second * 5) - defer ticker.Stop() + defer ticker.Stop() for { if s.IsClose { break @@ -198,7 +199,7 @@ func (s *Mux) ping() { } atomic.AddUint32(&s.pingOk, 1) } - return + return }() } From a2f5665fbc3b27660343009fe534186540f3b568 Mon Sep 17 00:00:00 2001 From: he liu Date: Sat, 21 Dec 2019 11:49:35 +0800 Subject: [PATCH 140/171] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b517040..dfa9f50 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ ![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) [![Gitter](https://badges.gitter.im/cnlh-nps/community.svg)](https://gitter.im/cnlh-nps/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) +![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 From 8224996970dda839531b8a25c333a7ad9df2823b Mon Sep 17 00:00:00 2001 From: zouri Date: Sat, 21 Dec 2019 15:35:55 +0800 Subject: [PATCH 141/171] fix button not working on firefox --- web/views/client/add.html | 2 +- web/views/client/edit.html | 2 +- web/views/index/add.html | 2 +- web/views/index/edit.html | 2 +- web/views/index/hadd.html | 2 +- web/views/index/hedit.html | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/views/client/add.html b/web/views/client/add.html index 30563c2..ec12ed0 100755 --- a/web/views/client/add.html +++ b/web/views/client/add.html @@ -119,7 +119,7 @@
    -
    diff --git a/web/views/client/edit.html b/web/views/client/edit.html index 0ae06a2..074b0b6 100755 --- a/web/views/client/edit.html +++ b/web/views/client/edit.html @@ -128,7 +128,7 @@
    -
    diff --git a/web/views/index/add.html b/web/views/index/add.html index 302553a..358bc6c 100755 --- a/web/views/index/add.html +++ b/web/views/index/add.html @@ -101,7 +101,7 @@
    -  
    diff --git a/web/views/index/edit.html b/web/views/index/edit.html index 32e3c3f..0ace757 100755 --- a/web/views/index/edit.html +++ b/web/views/index/edit.html @@ -101,7 +101,7 @@
    -
    diff --git a/web/views/index/hadd.html b/web/views/index/hadd.html index 1a4482d..0112b24 100755 --- a/web/views/index/hadd.html +++ b/web/views/index/hadd.html @@ -97,7 +97,7 @@
    -  
    diff --git a/web/views/index/hedit.html b/web/views/index/hedit.html index 9e17f45..32d54ba 100644 --- a/web/views/index/hedit.html +++ b/web/views/index/hedit.html @@ -100,7 +100,7 @@
    -  
    From 7361d55e3a7313fe0e4409c60b994a00c49aa298 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sun, 22 Dec 2019 19:33:32 +0800 Subject: [PATCH 142/171] temporary fix android internet permission --- build.android.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/build.android.sh b/build.android.sh index 1dd9e39..8191f3b 100644 --- a/build.android.sh +++ b/build.android.sh @@ -5,6 +5,17 @@ cd /go go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne + +# temporary solution here to add android internet permission +rm -rf /go/bin/fyne +mkdir -p /go/src/github.com/ffdfgdfg +cd /go/src/github.com/ffdfgdfg +git clone https://github.com/ffdfgdfg/fyne.git +cd fyne +git checkout android-permission +go install ./cmd/fyne +cd /go + mkdir -p /go/src/github.com/cnlh/nps cp -R /app/* /go/src/github.com/cnlh/nps cd /go/src/github.com/cnlh/nps From bcba0351aab122479e388ca6aa864065a9886ef8 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sun, 22 Dec 2019 22:55:27 +0800 Subject: [PATCH 143/171] add manifest --- build.android.sh | 10 ---------- gui/npc/AndroidManifest.xml | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) create mode 100755 gui/npc/AndroidManifest.xml diff --git a/build.android.sh b/build.android.sh index 8191f3b..02c97fe 100644 --- a/build.android.sh +++ b/build.android.sh @@ -6,16 +6,6 @@ cd /go go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne -# temporary solution here to add android internet permission -rm -rf /go/bin/fyne -mkdir -p /go/src/github.com/ffdfgdfg -cd /go/src/github.com/ffdfgdfg -git clone https://github.com/ffdfgdfg/fyne.git -cd fyne -git checkout android-permission -go install ./cmd/fyne -cd /go - mkdir -p /go/src/github.com/cnlh/nps cp -R /app/* /go/src/github.com/cnlh/nps cd /go/src/github.com/cnlh/nps diff --git a/gui/npc/AndroidManifest.xml b/gui/npc/AndroidManifest.xml new file mode 100755 index 0000000..3bcb647 --- /dev/null +++ b/gui/npc/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + From b1384475d92bb5875fe169273b943d390f02cc67 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 24 Dec 2019 13:21:30 +0800 Subject: [PATCH 144/171] version to 0.25.3 --- build.sh | 2 +- gui/npc/AndroidManifest.xml | 2 +- lib/version/version.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 56e77f9..c994b98 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #/bash/sh -export VERSION=0.25.2 +export VERSION=0.25.3 sudo apt-get install gcc-mingw-w64-i686 env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go diff --git a/gui/npc/AndroidManifest.xml b/gui/npc/AndroidManifest.xml index 3bcb647..463634d 100755 --- a/gui/npc/AndroidManifest.xml +++ b/gui/npc/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/lib/version/version.go b/lib/version/version.go index 5c80ede..78dbbef 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,6 +1,6 @@ package version -const VERSION = "0.25.2" +const VERSION = "0.25.3" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { From 258be8e67a57384cc1a38304cd77bf5ed0a34054 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Tue, 24 Dec 2019 22:00:17 +0800 Subject: [PATCH 145/171] add docker image latest tag --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index c994b98..70c4856 100755 --- a/build.sh +++ b/build.sh @@ -175,5 +175,5 @@ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin export DOCKER_CLI_EXPERIMENTAL=enabled docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d docker buildx create --use --name mybuilder -docker buildx build --tag ffdfgdfg/nps:$VERSION --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . -docker buildx build --tag ffdfgdfg/npc:$VERSION --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . +docker buildx build --tag ffdfgdfg/nps:$VERSION --tag ffdfgdfg/nps:latest --output type=image,push=true --file Dockerfile.nps --platform=linux/amd64,linux/arm64,linux/386,linux/arm . +docker buildx build --tag ffdfgdfg/npc:$VERSION --tag ffdfgdfg/npc:latest --output type=image,push=true --file Dockerfile.npc --platform=linux/amd64,linux/arm64,linux/386,linux/arm . From 076fc8b2e12cab6613bfa16133627c063ab17b79 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Fri, 27 Dec 2019 00:32:40 +0800 Subject: [PATCH 146/171] fine bandwidth calculation, fix slide window calculated size too large, fix #330 --- lib/common/netpackager.go | 9 +++++++ lib/common/pool.go | 9 ++++--- lib/mux/conn.go | 10 +++++--- lib/mux/mux.go | 52 ++++++++++++++++++++++++++++++++++++--- 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/lib/common/netpackager.go b/lib/common/netpackager.go index cf4b988..c6956f5 100644 --- a/lib/common/netpackager.go +++ b/lib/common/netpackager.go @@ -246,6 +246,15 @@ func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) { return } +func (Self *MuxPackager) reset() { + Self.Id = 0 + Self.Flag = 0 + Self.Length = 0 + Self.Content = nil + Self.ReadLength = 0 + Self.Window = 0 +} + const ( ipV4 = 1 domainName = 3 diff --git a/lib/common/pool.go b/lib/common/pool.go index 3ed19dc..31931f9 100644 --- a/lib/common/pool.go +++ b/lib/common/pool.go @@ -93,18 +93,20 @@ type windowBufferPool struct { func (Self *windowBufferPool) New() { Self.pool = sync.Pool{ New: func() interface{} { - return make([]byte, PoolSizeWindow, PoolSizeWindow) + return make([]byte, PoolSizeWindow) }, } } func (Self *windowBufferPool) Get() (buf []byte) { buf = Self.pool.Get().([]byte) - return buf[:PoolSizeWindow] + buf = buf[:PoolSizeWindow] + return buf } func (Self *windowBufferPool) Put(x []byte) { - Self.pool.Put(x[:PoolSizeWindow]) // make buf to full + x = x[:0] // clean buf + Self.pool.Put(x) } type bufferPool struct { @@ -146,6 +148,7 @@ func (Self *muxPackagerPool) Get() *MuxPackager { } func (Self *muxPackagerPool) Put(pack *MuxPackager) { + pack.reset() Self.pool.Put(pack) } diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 28ec1de..0f28acb 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -2,6 +2,7 @@ package mux import ( "errors" + "github.com/astaxie/beego/logs" "io" "math" "net" @@ -215,10 +216,10 @@ func (Self *ReceiveWindow) calcSize() { if n < common.MAXIMUM_SEGMENT_SIZE*10 { n = common.MAXIMUM_SEGMENT_SIZE * 10 } - bufLen := Self.bufQueue.Len() - if n < bufLen { - n = bufLen - } + //bufLen := Self.bufQueue.Len() + //if n < bufLen { + // n = bufLen + //} if n < Self.maxSize/2 { n = Self.maxSize / 2 } @@ -227,6 +228,7 @@ func (Self *ReceiveWindow) calcSize() { n = 2 * Self.maxSize } if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { + logs.Warn("window too large", n) n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) } // set the maximum size diff --git a/lib/mux/mux.go b/lib/mux/mux.go index ae9f335..ab02323 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -5,7 +5,9 @@ import ( "io" "math" "net" + "os" "sync/atomic" + "syscall" "time" "github.com/astaxie/beego/logs" @@ -35,13 +37,17 @@ func NewMux(c net.Conn, connType string) *Mux { //c.(*net.TCPConn).SetReadBuffer(0) //c.(*net.TCPConn).SetWriteBuffer(0) _ = c.SetDeadline(time.Time{}) + fd, err := getConnFd(c) + if err != nil { + logs.Warn(err) + } m := &Mux{ conn: c, connMap: NewConnMap(), id: 0, closeChan: make(chan struct{}, 1), newConnCh: make(chan *conn), - bw: new(bandwidth), + bw: NewBandwidth(fd), IsClose: false, connType: connType, pingCh: make(chan []byte), @@ -58,6 +64,26 @@ func NewMux(c net.Conn, connType string) *Mux { return m } +func getConnFd(c net.Conn) (fd *os.File, err error) { + switch c.(type) { + case *net.TCPConn: + fd, err = c.(*net.TCPConn).File() + if err != nil { + return + } + return + case *net.UDPConn: + fd, err = c.(*net.UDPConn).File() + if err != nil { + return + } + return + default: + err = errors.New("mux:unknown conn type, only tcp or kcp") + return + } +} + func (s *Mux) NewConn() (*conn, error) { if s.IsClose { return nil, errors.New("the mux has closed") @@ -392,13 +418,19 @@ type bandwidth struct { readStart time.Time lastReadStart time.Time bufLength uint32 + fd *os.File + calcThreshold uint32 +} + +func NewBandwidth(fd *os.File) *bandwidth { + return &bandwidth{fd: fd} } func (Self *bandwidth) StartRead() { if Self.readStart.IsZero() { Self.readStart = time.Now() } - if Self.bufLength >= common.MAXIMUM_SEGMENT_SIZE*300 { + if Self.bufLength >= Self.calcThreshold { Self.lastReadStart, Self.readStart = Self.readStart, time.Now() Self.calcBandWidth() } @@ -410,7 +442,21 @@ func (Self *bandwidth) SetCopySize(n uint16) { func (Self *bandwidth) calcBandWidth() { t := Self.readStart.Sub(Self.lastReadStart) - atomic.StoreUint64(&Self.readBandwidth, math.Float64bits(float64(Self.bufLength)/t.Seconds())) + bufferSize, err := syscall.GetsockoptInt(int(Self.fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) + //logs.Warn(bufferSize) + if err != nil { + logs.Warn(err) + Self.bufLength = 0 + return + } + if Self.bufLength >= uint32(bufferSize) { + atomic.StoreUint64(&Self.readBandwidth, math.Float64bits(float64(Self.bufLength)/t.Seconds())) + // calculate the hole socket buffer, the time meaning to fill the buffer + //logs.Warn(Self.Get()) + } else { + Self.calcThreshold = uint32(bufferSize) + } + // socket buffer size is bigger than bufLength, so we don't calculate it Self.bufLength = 0 } From 0b5c903d89c39216979452d30fc50cb93861e67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 27 Dec 2019 10:59:56 +0800 Subject: [PATCH 147/171] fix update --- lib/install/install.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/install/install.go b/lib/install/install.go index 66bb28b..6156e3f 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -91,11 +91,13 @@ func copyStaticFile(srcPath, bin string) string { if _, err := copyFile(filepath.Join(srcPath, bin), "/usr/local/bin/"+bin); err != nil { log.Fatalln(err) } else { - copyFile(filepath.Join(srcPath, "nps"), "/usr/local/bin/"+bin+"-update") + copyFile(filepath.Join(srcPath, bin), "/usr/local/bin/"+bin+"-update") + chMod("/usr/local/bin/"+bin+"-update", 0755) binPath = "/usr/local/bin/" + bin } } else { - copyFile(filepath.Join(srcPath, "nps"), "/usr/bin/"+bin+"-update") + copyFile(filepath.Join(srcPath, bin), "/usr/bin/"+bin+"-update") + chMod("/usr/bin/"+bin+"-update", 0755) binPath = "/usr/bin/" + bin } } else { From 4de24ff13a0fd2523cd2e598bea44f756f0219d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 27 Dec 2019 11:12:46 +0800 Subject: [PATCH 148/171] update docs --- docs/_coverpage.md | 2 +- docs/nps_use.md | 4 +++- docs/use.md | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/_coverpage.md b/docs/_coverpage.md index cb361da..68e0cc3 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -1,6 +1,6 @@ ![logo](logo.svg) -# NPS 0.25.2 +# NPS 0.25.4 > 一款轻量级、高性能、功能强大的内网穿透代理服务器 diff --git a/docs/nps_use.md b/docs/nps_use.md index 4058869..2681e8b 100644 --- a/docs/nps_use.md +++ b/docs/nps_use.md @@ -40,4 +40,6 @@ nps-update.exe update ``` -更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 \ No newline at end of file +更新完成后,执行执行`sudo nps start`或者`nps.exe start`重新运行即可完成升级 + +如果无法更新成功,可以直接自行下载releases压缩包然后覆盖原有的nps二进制文件和web目录 diff --git a/docs/use.md b/docs/use.md index 00547b2..5f775ab 100644 --- a/docs/use.md +++ b/docs/use.md @@ -36,6 +36,8 @@ npc-update.exe update 更新完成后,执行执行`sudo npc start`或者`npc.exe start`重新运行即可完成升级 +如果无法更新成功,可以直接自行下载releases压缩包然后覆盖原有的npc二进制文件 + ## 配置文件模式 此模式使用nps的公钥或者客户端私钥验证,各种配置在客户端完成,同时服务端web也可以进行管理 ``` From 5e1b0be81c62559c9beecee03f9cc369d8a80105 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Fri, 27 Dec 2019 13:02:28 +0800 Subject: [PATCH 149/171] fix mux send window size counting --- lib/mux/conn.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 0f28acb..52fb642 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -446,7 +446,20 @@ func (Self *SendWindow) allow() { } func (Self *SendWindow) sent(sentSize uint32) { - atomic.AddUint64(&Self.remainingWait, ^(uint64(sentSize)<= sentSize { + atomic.AddUint64(&Self.remainingWait, ^(uint64(sentSize)< Date: Fri, 27 Dec 2019 13:14:49 +0800 Subject: [PATCH 150/171] bump version to 0.25.4 --- build.sh | 2 +- gui/npc/AndroidManifest.xml | 2 +- lib/version/version.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 70c4856..5059486 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #/bash/sh -export VERSION=0.25.3 +export VERSION=0.25.4 sudo apt-get install gcc-mingw-w64-i686 env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go diff --git a/gui/npc/AndroidManifest.xml b/gui/npc/AndroidManifest.xml index 463634d..901a508 100755 --- a/gui/npc/AndroidManifest.xml +++ b/gui/npc/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/lib/version/version.go b/lib/version/version.go index 78dbbef..c2f1489 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,6 +1,6 @@ package version -const VERSION = "0.25.3" +const VERSION = "0.25.4" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { From 9b29bd64bd23c46d491d65a6d16e7fadc888e45c Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Fri, 27 Dec 2019 23:24:19 +0800 Subject: [PATCH 151/171] fix windows --- lib/mux/mux.go | 25 ++-------------------- lib/mux/sysGetsock_nowindows.go | 34 ++++++++++++++++++++++++++++++ lib/mux/sysGetsock_windows.go | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 lib/mux/sysGetsock_nowindows.go create mode 100644 lib/mux/sysGetsock_windows.go diff --git a/lib/mux/mux.go b/lib/mux/mux.go index ab02323..254945e 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -7,7 +7,6 @@ import ( "net" "os" "sync/atomic" - "syscall" "time" "github.com/astaxie/beego/logs" @@ -64,26 +63,6 @@ func NewMux(c net.Conn, connType string) *Mux { return m } -func getConnFd(c net.Conn) (fd *os.File, err error) { - switch c.(type) { - case *net.TCPConn: - fd, err = c.(*net.TCPConn).File() - if err != nil { - return - } - return - case *net.UDPConn: - fd, err = c.(*net.UDPConn).File() - if err != nil { - return - } - return - default: - err = errors.New("mux:unknown conn type, only tcp or kcp") - return - } -} - func (s *Mux) NewConn() (*conn, error) { if s.IsClose { return nil, errors.New("the mux has closed") @@ -442,7 +421,7 @@ func (Self *bandwidth) SetCopySize(n uint16) { func (Self *bandwidth) calcBandWidth() { t := Self.readStart.Sub(Self.lastReadStart) - bufferSize, err := syscall.GetsockoptInt(int(Self.fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) + bufferSize, err := sysGetSock(Self.fd) //logs.Warn(bufferSize) if err != nil { logs.Warn(err) @@ -451,7 +430,7 @@ func (Self *bandwidth) calcBandWidth() { } if Self.bufLength >= uint32(bufferSize) { atomic.StoreUint64(&Self.readBandwidth, math.Float64bits(float64(Self.bufLength)/t.Seconds())) - // calculate the hole socket buffer, the time meaning to fill the buffer + // calculate the whole socket buffer, the time meaning to fill the buffer //logs.Warn(Self.Get()) } else { Self.calcThreshold = uint32(bufferSize) diff --git a/lib/mux/sysGetsock_nowindows.go b/lib/mux/sysGetsock_nowindows.go new file mode 100644 index 0000000..cc1ce48 --- /dev/null +++ b/lib/mux/sysGetsock_nowindows.go @@ -0,0 +1,34 @@ +// +build !windows + +package mux + +import ( + "errors" + "net" + "os" + "syscall" +) + +func sysGetSock(fd *os.File) (bufferSize int, err error) { + return syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) +} + +func getConnFd(c net.Conn) (fd *os.File, err error) { + switch c.(type) { + case *net.TCPConn: + fd, err = c.(*net.TCPConn).File() + if err != nil { + return + } + return + case *net.UDPConn: + fd, err = c.(*net.UDPConn).File() + if err != nil { + return + } + return + default: + err = errors.New("mux:unknown conn type, only tcp or kcp") + return + } +} diff --git a/lib/mux/sysGetsock_windows.go b/lib/mux/sysGetsock_windows.go new file mode 100644 index 0000000..58a5b6d --- /dev/null +++ b/lib/mux/sysGetsock_windows.go @@ -0,0 +1,37 @@ +// +build windows + +package mux + +import ( + "errors" + "net" + "os" +) + +func sysGetSock(fd *os.File) (bufferSize int, err error) { + // https://github.com/golang/sys/blob/master/windows/syscall_windows.go#L1184 + // not support, WTF??? + // return syscall.GetsockoptInt((syscall.Handle)(unsafe.Pointer(fd.Fd())), syscall.SOL_SOCKET, syscall.SO_RCVBUF) + bufferSize = 10 * 1024 * 1024 + return +} + +func getConnFd(c net.Conn) (fd *os.File, err error) { + switch c.(type) { + case *net.TCPConn: + //fd, err = c.(*net.TCPConn).File() + //if err != nil { + // return + //} + return + case *net.UDPConn: + //fd, err = c.(*net.UDPConn).File() + //if err != nil { + // return + //} + return + default: + err = errors.New("mux:unknown conn type, only tcp or kcp") + return + } +} From 1f64715fabb6fe675734071dd914c14d5ae22c4e Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sat, 28 Dec 2019 20:40:00 +0800 Subject: [PATCH 152/171] fix mux kcp connection --- lib/mux/mux_test.go | 15 +++++++++++---- lib/mux/sysGetsock_nowindows.go | 14 +++++++++++++- lib/mux/sysGetsock_windows.go | 9 +++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/mux/mux_test.go b/lib/mux/mux_test.go index 151def1..fb5adb2 100644 --- a/lib/mux/mux_test.go +++ b/lib/mux/mux_test.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/cnlh/nps/lib/common" "github.com/cnlh/nps/lib/goroutine" + "github.com/xtaci/kcp-go" "io" "log" "net" @@ -33,7 +34,8 @@ func TestNewMux(t *testing.T) { //poolConnCopy, _ := ants.NewPoolWithFunc(200000, common.copyConn, ants.WithNonblocking(false)) time.Sleep(time.Second * 3) go func() { - m2 := NewMux(conn2, "tcp") + //m2 := NewMux(conn2, "tcp") + m2 := NewMux(conn2, "kcp") for { //logs.Warn("npc starting accept") c, err := m2.Accept() @@ -82,7 +84,8 @@ func TestNewMux(t *testing.T) { }() go func() { - m1 := NewMux(conn1, "tcp") + //m1 := NewMux(conn1, "tcp") + m1 := NewMux(conn1, "kcp") l, err := net.Listen("tcp", "127.0.0.1:7777") if err != nil { logs.Warn(err) @@ -144,12 +147,14 @@ func TestNewMux(t *testing.T) { func server() { var err error - l, err := net.Listen("tcp", "127.0.0.1:9999") + //l, err := net.Listen("tcp", "127.0.0.1:9999") + l, err := kcp.Listen("127.0.0.1:9999") if err != nil { logs.Warn(err) } go func() { conn1, err = l.Accept() + logs.Info("accept", conn1) if err != nil { logs.Warn(err) } @@ -159,7 +164,9 @@ func server() { func client() { var err error - conn2, err = net.Dial("tcp", "127.0.0.1:9999") + //conn2, err = net.Dial("tcp", "127.0.0.1:9999") + logs.Warn("dial") + conn2, err = kcp.Dial("127.0.0.1:9999") if err != nil { logs.Warn(err) } diff --git a/lib/mux/sysGetsock_nowindows.go b/lib/mux/sysGetsock_nowindows.go index cc1ce48..86c78ad 100644 --- a/lib/mux/sysGetsock_nowindows.go +++ b/lib/mux/sysGetsock_nowindows.go @@ -4,13 +4,18 @@ package mux import ( "errors" + "github.com/xtaci/kcp-go" "net" "os" "syscall" ) func sysGetSock(fd *os.File) (bufferSize int, err error) { - return syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) + if fd != nil { + return syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) + } else { + return 1400 * 320, nil + } } func getConnFd(c net.Conn) (fd *os.File, err error) { @@ -27,6 +32,13 @@ func getConnFd(c net.Conn) (fd *os.File, err error) { return } return + case *kcp.UDPSession: + //fd, err = (*net.UDPConn)(unsafe.Pointer(c.(*kcp.UDPSession))).File() + //if err != nil { + // return + //} + // Todo + return default: err = errors.New("mux:unknown conn type, only tcp or kcp") return diff --git a/lib/mux/sysGetsock_windows.go b/lib/mux/sysGetsock_windows.go index 58a5b6d..5cf213f 100644 --- a/lib/mux/sysGetsock_windows.go +++ b/lib/mux/sysGetsock_windows.go @@ -4,6 +4,7 @@ package mux import ( "errors" + "github.com/xtaci/kcp-go" "net" "os" ) @@ -11,6 +12,7 @@ import ( func sysGetSock(fd *os.File) (bufferSize int, err error) { // https://github.com/golang/sys/blob/master/windows/syscall_windows.go#L1184 // not support, WTF??? + // Todo // return syscall.GetsockoptInt((syscall.Handle)(unsafe.Pointer(fd.Fd())), syscall.SOL_SOCKET, syscall.SO_RCVBUF) bufferSize = 10 * 1024 * 1024 return @@ -30,6 +32,13 @@ func getConnFd(c net.Conn) (fd *os.File, err error) { // return //} return + case *kcp.UDPSession: + //fd, err = (*net.UDPConn)(unsafe.Pointer(c.(*kcp.UDPSession))).File() + //if err != nil { + // return + //} + // Todo + return default: err = errors.New("mux:unknown conn type, only tcp or kcp") return From 86e0a52bb9cdb1d5814ec4936e50bb093acbccf8 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Mon, 30 Dec 2019 00:22:50 +0800 Subject: [PATCH 153/171] fix android build --- build.android.sh | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/build.android.sh b/build.android.sh index 02c97fe..d9f8141 100644 --- a/build.android.sh +++ b/build.android.sh @@ -4,18 +4,36 @@ #fyne-cross --targets=linux/amd64,windows/amd64,darwin/amd64 gui/npc/npc.go cd /go -go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne - +apt-get install libegl1-mesa-dev libgles2-mesa-dev libx11-dev -y +#go get -u fyne.io/fyne/cmd/fyne fyne.io/fyne +mkdir -p /go/src/fyne.io +cd src/fyne.io +git clone https://github.com/fyne-io/fyne.git +cd fyne +git checkout v1.2.0 +go install -v ./cmd/fyne +#fyne package -os android fyne.io/fyne/cmd/hello +echo "fyne install success" mkdir -p /go/src/github.com/cnlh/nps cp -R /app/* /go/src/github.com/cnlh/nps cd /go/src/github.com/cnlh/nps +#go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne +rm cmd/npc/sdk.go +#go get -u ./... +#go mod tidy +#rm -rf /go/src/golang.org/x/mobile +echo "tidy success" +cd /go/src/github.com/cnlh/nps go mod vendor cd vendor cp -R * /go/src cd .. rm -rf vendor #rm -rf ~/.cache/* +echo "vendor success" cd gui/npc +#rm -rf /go/src/golang.org/x/mobile +#go get -u fyne.io/fyne/cmd/fyne@v1.2.0 #export ANDROID_NDK_HOME=/usr/local/android_sdk/ndk-bundle fyne package -appID org.nps.client -os android -icon ../../docs/logo.png mv npc.apk /app/android_client.apk From fe1c6e10dd188a66a76e8a850cf492eaa544a4e8 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Mon, 30 Dec 2019 00:25:36 +0800 Subject: [PATCH 154/171] master to dev (#341) From 4ea547824147d67bd07d7c35794b292a5cb111fb Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Dec 2019 18:09:13 +0800 Subject: [PATCH 155/171] change README --- README.md | 92 ++++++++++++++++++++++++---------------------------- README_zh.md | 78 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 49 deletions(-) create mode 100644 README_zh.md diff --git a/README.md b/README.md index dfa9f50..5543904 100644 --- a/README.md +++ b/README.md @@ -1,78 +1,72 @@ -# nps +# NPS ![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) [![Gitter](https://badges.gitter.im/cnlh-nps/community.svg)](https://gitter.im/cnlh-nps/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) ![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) -nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 +NPS is a lightweight, high-performance, powerful **intranet penetration** proxy server, with a powerful web management terminal. - -## 背景 ![image](https://github.com/cnlh/nps/blob/master/image/web.png?raw=true) -1. 做微信公众号开发、小程序开发等----> 域名代理模式 +## Feature -2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式 +- Comprehensive protocol support, compatible with almost all commonly used protocols, such as tcp, udp, http(s), socks5, p2p, http proxy ... +- Full platform compatibility (linux, windows, macos, Qunhui, etc.), support installation as a system service simply. +- Comprehensive control, both client and server control are allowed. +- Https integration, support to convert backend proxy and web services to https, and support multiple certificates. +- Just simple configuration on web ui can complete most requirements. +- Complete information display, such as traffic, system information, real-time bandwidth, client version, etc. +- Powerful extension functions, everything is available (cache, compression, encryption, traffic limit, bandwidth limit, port reuse, etc.) +- Domain name resolution has functions such as custom headers, 404 page configuration, host modification, site protection, URL routing, and pan-resolution. +- Multi-user and user registration support on server. -3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式 +**Didn't find the feature you want? It doesn't matter, click [Enter the document](https://cnlh.github.io/nps/) to find it!** -4. 在外网使用HTTP代理访问内网站点----> http代理模式 +## Quick start -5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 -## 特点 -- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理... -- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务 -- 控制全面,同时支持服务端和客户端控制 -- https集成,支持将后端代理和web服务转成https,同时支持多证书 -- 操作简单,只需简单的配置即可在web ui上完成其余操作 -- 展示信息全面,流量、系统信息、即时带宽、客户端版本等 -- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等) -- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能 -- 服务端支持多用户和用户注册功能 +### Installation -**没找到你想要的功能?不要紧,点击[进入文档](https://cnlh.github.io/nps/)查找吧** -## 快速开始 - -### 安装 > [releases](https://github.com/cnlh/nps/releases) -下载对应的系统版本即可,服务端和客户端是单独的 +Download the corresponding system version, the server and client are separate. -### 服务端启动 -下载完服务器压缩包后,解压,然后进入解压后的文件夹 +### Server start -- 执行安装命令 +After downloading the server compressed package, unzip it, and then enter the unzipped folder. -对于linux|darwin ```sudo ./nps install``` +- execute installation command -对于windows,管理员身份运行cmd,进入安装目录 ```nps.exe install``` +For linux、darwin ```sudo ./nps install``` -- 启动 +For windows, run cmd as administrator and enter the installation directory ```nps.exe install``` -对于linux|darwin ```sudo nps start``` +- start up -对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` +For linux、darwin ```sudo nps start``` -```安装后windows配置文件位于 C:\Program Files\nps,linux和darwin位于/etc/nps``` +For windows, run cmd as administrator and enter the program directory ```nps.exe start``` -**如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** -- 访问服务端ip:web服务端口(默认为8080) -- 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) -- 创建客户端 +```After installation, the windows configuration file is located at C:\Program Files\nps, linux or darwin is located at /etc/nps``` -### 客户端连接 -- 点击web管理中客户端前的+号,复制启动命令 -- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 +**If you don't find it started successfully, you can check the log (Windows log files are located in the current running directory, linux and darwin are located in /var/log/nps.log).** -如果需要注册到系统服务可查看[注册到系统服务](https://cnlh.github.io/nps/#/use?id=注册到系统服务) +- Access server IP:web service port (default is 8080). +- Login with username and password (default is admin/123, must be modified when officially used). +- Create a client. -### 配置 -- 客户端连接后,在web中配置对应穿透服务即可 -- 更多高级用法见[完整文档](https://cnlh.github.io/nps/) +### Client connection +- Click the + sign in front of the client in web management and copy the startup command. +- Execute the startup command, Linux can be executed directly, Windows will replace ./npc with npc.exe and execute it with cmd. -## 贡献 -- 如果遇到bug可以直接提交至dev分支 -- 使用遇到问题可以通过issues反馈 -- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 -- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 +If you need to register to the system service, you can check [Register to the system service](https://cnlh.github.io/nps/#/use?id=注册到系统服务) + +### Configuration +- After the client connects, configure the corresponding penetration service in the web. +- For more advanced usage, see [Complete Documentation](https://cnlh.github.io/nps/) + +## Contribution +- If you encounter a bug, you can submit it to the dev branch directly. +- If you encounter a problem, you can feedback through the issue. +- The project is under development, and there is still a lot of room for improvement. If you can contribute code, please submit PR to the dev branch. +- If there is feedback on new features, you can feedback via issues or qq group. \ No newline at end of file diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..dfa9f50 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,78 @@ + +# nps +![](https://img.shields.io/github/stars/cnlh/nps.svg) ![](https://img.shields.io/github/forks/cnlh/nps.svg) +[![Gitter](https://badges.gitter.im/cnlh-nps/community.svg)](https://gitter.im/cnlh-nps/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) +![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) + +nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 + + +## 背景 +![image](https://github.com/cnlh/nps/blob/master/image/web.png?raw=true) + +1. 做微信公众号开发、小程序开发等----> 域名代理模式 + +2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式 + +3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式 + +4. 在外网使用HTTP代理访问内网站点----> http代理模式 + +5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式 +## 特点 +- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理... +- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务 +- 控制全面,同时支持服务端和客户端控制 +- https集成,支持将后端代理和web服务转成https,同时支持多证书 +- 操作简单,只需简单的配置即可在web ui上完成其余操作 +- 展示信息全面,流量、系统信息、即时带宽、客户端版本等 +- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等) +- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能 +- 服务端支持多用户和用户注册功能 + +**没找到你想要的功能?不要紧,点击[进入文档](https://cnlh.github.io/nps/)查找吧** +## 快速开始 + +### 安装 +> [releases](https://github.com/cnlh/nps/releases) + +下载对应的系统版本即可,服务端和客户端是单独的 + +### 服务端启动 +下载完服务器压缩包后,解压,然后进入解压后的文件夹 + +- 执行安装命令 + +对于linux|darwin ```sudo ./nps install``` + +对于windows,管理员身份运行cmd,进入安装目录 ```nps.exe install``` + +- 启动 + +对于linux|darwin ```sudo nps start``` + +对于windows,管理员身份运行cmd,进入程序目录 ```nps.exe start``` + +```安装后windows配置文件位于 C:\Program Files\nps,linux和darwin位于/etc/nps``` + +**如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)** +- 访问服务端ip:web服务端口(默认为8080) +- 使用用户名和密码登陆(默认admin/123,正式使用一定要更改) +- 创建客户端 + +### 客户端连接 +- 点击web管理中客户端前的+号,复制启动命令 +- 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 + +如果需要注册到系统服务可查看[注册到系统服务](https://cnlh.github.io/nps/#/use?id=注册到系统服务) + +### 配置 +- 客户端连接后,在web中配置对应穿透服务即可 +- 更多高级用法见[完整文档](https://cnlh.github.io/nps/) + +## 贡献 +- 如果遇到bug可以直接提交至dev分支 +- 使用遇到问题可以通过issues反馈 +- 项目处于开发阶段,还有很多待完善的地方,如果可以贡献代码,请提交 PR 至 dev 分支 +- 如果有新的功能特性反馈,可以通过issues或者qq群反馈 From aad7ed8f2473cb786c3e9f14b92f9698f968f3c9 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 1 Jan 2020 22:17:56 +0800 Subject: [PATCH 156/171] change slide window design --- lib/common/netpackager.go | 34 +---- lib/mux/conn.go | 276 ++++++++++++++++++++++++-------------- lib/mux/mux.go | 2 +- lib/mux/mux_test.go | 21 ++- 4 files changed, 193 insertions(+), 140 deletions(-) diff --git a/lib/common/netpackager.go b/lib/common/netpackager.go index c6956f5..45456c5 100644 --- a/lib/common/netpackager.go +++ b/lib/common/netpackager.go @@ -162,10 +162,9 @@ func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) { } type MuxPackager struct { - Flag uint8 - Id int32 - Window uint32 - ReadLength uint32 + Flag uint8 + Id int32 + Window uint64 BasePackager } @@ -178,19 +177,8 @@ func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (e err = Self.BasePackager.NewPac(content...) //logs.Warn(Self.Length, string(Self.Content)) case MUX_MSG_SEND_OK: - // MUX_MSG_SEND_OK contains two data - switch content[0].(type) { - case int: - Self.Window = uint32(content[0].(int)) - case uint32: - Self.Window = content[0].(uint32) - } - switch content[1].(type) { - case int: - Self.ReadLength = uint32(content[1].(int)) - case uint32: - Self.ReadLength = content[1].(uint32) - } + // MUX_MSG_SEND_OK contains one data + Self.Window = content[0].(uint64) } return } @@ -210,10 +198,6 @@ func (Self *MuxPackager) Pack(writer io.Writer) (err error) { WindowBuff.Put(Self.Content) case MUX_MSG_SEND_OK: err = binary.Write(writer, binary.LittleEndian, Self.Window) - if err != nil { - return - } - err = binary.Write(writer, binary.LittleEndian, Self.ReadLength) } return } @@ -235,12 +219,7 @@ func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) { //logs.Warn("unpack", Self.Length, string(Self.Content)) case MUX_MSG_SEND_OK: err = binary.Read(reader, binary.LittleEndian, &Self.Window) - if err != nil { - return - } - n += 4 // uint32 - err = binary.Read(reader, binary.LittleEndian, &Self.ReadLength) - n += 4 // uint32 + n += 8 // uint64 } n += 5 //uint8 int32 return @@ -251,7 +230,6 @@ func (Self *MuxPackager) reset() { Self.Flag = 0 Self.Length = 0 Self.Content = nil - Self.ReadLength = 0 Self.Window = 0 } diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 52fb642..a2b2f5f 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -3,6 +3,7 @@ package mux import ( "errors" "github.com/astaxie/beego/logs" + "github.com/cnlh/nps/lib/common" "io" "math" "net" @@ -10,8 +11,6 @@ import ( "sync" "sync/atomic" "time" - - "github.com/cnlh/nps/lib/common" ) type conn struct { @@ -146,25 +145,44 @@ func (s *conn) SetWriteDeadline(t time.Time) error { } type window struct { - remainingWait uint64 // 64bit alignment - off uint32 - maxSize uint32 - closeOp bool - closeOpCh chan struct{} - mux *Mux + maxSizeDone uint64 + // 64bit alignment + // maxSizeDone contains 4 parts + // 1 31 1 31 + // wait maxSize useless done + // wait zero means false, one means true + off uint32 + closeOp bool + closeOpCh chan struct{} + mux *Mux } -func (Self *window) unpack(ptrs uint64) (remaining, wait uint32) { - const mask = 1<> dequeueBits) & mask) - wait = uint32(ptrs & mask) +const windowBits = 31 +const waitBits = dequeueBits + windowBits +const mask1 = 1 +const mask31 = 1<> dequeueBits) & mask31) + done = uint32(ptrs & mask31) + //logs.Warn("unpack", maxSize, done) + if ((ptrs >> waitBits) & mask1) == 1 { + wait = true + return + } return } -func (Self *window) pack(remaining, wait uint32) uint64 { - const mask = 1< 0 { n = uint32(l) @@ -213,27 +233,33 @@ func (Self *ReceiveWindow) calcSize() { conns := Self.mux.connMap.Size() n := uint32(math.Float64frombits(atomic.LoadUint64(&Self.mux.latency)) * Self.mux.bw.Get() / float64(conns)) + //logs.Warn(n) if n < common.MAXIMUM_SEGMENT_SIZE*10 { n = common.MAXIMUM_SEGMENT_SIZE * 10 } - //bufLen := Self.bufQueue.Len() - //if n < bufLen { - // n = bufLen - //} - if n < Self.maxSize/2 { - n = Self.maxSize / 2 + for { + ptrs := atomic.LoadUint64(&Self.maxSizeDone) + size, read, wait := Self.unpack(ptrs) + if n < size/2 { + n = size / 2 + // half reduce + } + // set the minimal size + if n > 2*size { + n = 2 * size + // twice grow + } + if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { + //logs.Warn("window too large", n) + n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) + } + // set the maximum size + //logs.Warn("n", n) + if atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(n, read, wait)) { + // only change the maxSize + break + } } - // set the minimal size - if n > 2*Self.maxSize { - n = 2 * Self.maxSize - } - if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { - logs.Warn("window too large", n) - n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) - } - // set the maximum size - //logs.Warn("n", n) - atomic.StoreUint32(&Self.maxSize, n) Self.count = -10 } Self.count += 1 @@ -245,30 +271,40 @@ func (Self *ReceiveWindow) Write(buf []byte, l uint16, part bool, id int32) (err return errors.New("conn.receiveWindow: write on closed window") } element, err := NewListElement(buf, l, part) - //logs.Warn("push the buf", len(buf), l, (&element).l) + //logs.Warn("push the buf", len(buf), l, element.L) if err != nil { return } Self.calcSize() // calculate the max window size - var wait uint32 + var wait bool + var maxSize, read uint32 start: - ptrs := atomic.LoadUint64(&Self.remainingWait) - _, wait = Self.unpack(ptrs) - newRemaining := Self.remainingSize(l) + ptrs := atomic.LoadUint64(&Self.maxSizeDone) + maxSize, read, wait = Self.unpack(ptrs) + remain := Self.remainingSize(maxSize, l) // calculate the remaining window size now, plus the element we will push - if newRemaining == 0 { + if remain == 0 && !wait { //logs.Warn("window full true", remaining) - wait = 1 - } - if !atomic.CompareAndSwapUint64(&Self.remainingWait, ptrs, Self.pack(0, wait)) { - goto start - // another goroutine change the status, make sure shall we need wait - } + wait = true + if !atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(maxSize, read, wait)) { + // only change the wait status, not send the read size + goto start + // another goroutine change the status, make sure shall we need wait + } + //logs.Warn("receive window full") + } else if !wait { + if !atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(maxSize, 0, wait)) { + // reset read size here, and send the read size directly + goto start + // another goroutine change the status, make sure shall we need wait + } + } // maybe there are still some data received even if window is full, just keep the wait status + // and push into queue. when receive window read enough, send window will be acknowledged. Self.bufQueue.Push(element) // status check finish, now we can push the element into the queue - if wait == 0 { - Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, Self.maxSize, newRemaining) - // send the remaining window size, not including zero size + if !wait { + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, Self.pack(maxSize, read, false)) + // send the current status to send window } return nil } @@ -279,7 +315,7 @@ func (Self *ReceiveWindow) Read(p []byte, id int32) (n int, err error) { } pOff := 0 l := 0 - //logs.Warn("receive window read off, element.l", Self.off, Self.element.l) + //logs.Warn("receive window read off, element.l", Self.off, Self.element.L) copyData: if Self.off == uint32(Self.element.L) { // on the first Read method invoked, Self.off and Self.element.l @@ -291,14 +327,13 @@ copyData: Self.element, err = Self.bufQueue.Pop() // if the queue is empty, Pop method will wait until one element push // into the queue successful, or timeout. - // timer start on timeout parameter is set up , - // reset to 60s if timeout and data still available + // timer start on timeout parameter is set up Self.off = 0 if err != nil { Self.CloseWindow() // also close the window, to avoid read twice return // queue receive stop or time out, break the loop and return } - //logs.Warn("pop element", Self.element.l, Self.element.part) + //logs.Warn("pop element", Self.element.L, Self.element.Part) } l = copy(p[pOff:], Self.element.Buf[Self.off:Self.element.L]) pOff += l @@ -320,22 +355,41 @@ copyData: } func (Self *ReceiveWindow) sendStatus(id int32, l uint16) { - var remaining, wait uint32 + var maxSize, read uint32 + var wait bool for { - ptrs := atomic.LoadUint64(&Self.remainingWait) - remaining, wait = Self.unpack(ptrs) - remaining += uint32(l) - if atomic.CompareAndSwapUint64(&Self.remainingWait, ptrs, Self.pack(remaining, 0)) { - break + ptrs := atomic.LoadUint64(&Self.maxSizeDone) + maxSize, read, wait = Self.unpack(ptrs) + if read <= (read+uint32(l))&mask31 { + read += uint32(l) + remain := Self.remainingSize(maxSize, 0) + if wait && remain > 0 || remain == maxSize { + if atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(maxSize, 0, false)) { + // now we get the current window status success + // receive window free up some space we need acknowledge send window, also reset the read size + // still having a condition that receive window is empty and not send the status to send window + // so send the status here + //logs.Warn("receive window free up some space", remain) + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, Self.pack(maxSize, read, false)) + break + } + } else { + if atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(maxSize, read, wait)) { + // receive window not into the wait status, or still not having any space now, + // just change the read size + break + } + } + } else { + //overflow + if atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(maxSize, uint32(l), wait)) { + // reset to l + Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, Self.pack(maxSize, read, false)) + break + } } runtime.Gosched() // another goroutine change remaining or wait status, make sure - // we need acknowledge other side - } - // now we get the current window status success - if wait == 1 { - //logs.Warn("send the wait status", remaining) - Self.mux.sendInfo(common.MUX_MSG_SEND_OK, id, atomic.LoadUint32(&Self.maxSize), remaining) } return } @@ -380,12 +434,14 @@ type SendWindow struct { buf []byte setSizeCh chan struct{} timeout time.Time + // send window receive the receive window max size and read size + // done size store the size send window has send, send and read will be totally equal + // so send minus read, send window can get the current window size remaining } func (Self *SendWindow) New(mux *Mux) { Self.setSizeCh = make(chan struct{}) - Self.maxSize = common.MAXIMUM_SEGMENT_SIZE * 10 - atomic.AddUint64(&Self.remainingWait, uint64(common.MAXIMUM_SEGMENT_SIZE*10)< 0 { + return uint32(l) + } + return 0 +} + +func (Self *SendWindow) SetSize(currentMaxSizeDone uint64) (closed bool) { // set the window size from receive window defer func() { if recover() != nil { @@ -408,26 +472,34 @@ func (Self *SendWindow) SetSize(windowSize, newRemaining uint32) (closed bool) { return true } //logs.Warn("set send window size to ", windowSize, newRemaining) - var remaining, wait, newWait uint32 + var maxsize, send uint32 + var wait, newWait bool + currentMaxSize, read, _ := Self.unpack(currentMaxSizeDone) for { - ptrs := atomic.LoadUint64(&Self.remainingWait) - remaining, wait = Self.unpack(ptrs) - if remaining == newRemaining { - //logs.Warn("waiting for another window size") - return false // waiting for receive another usable window size + ptrs := atomic.LoadUint64(&Self.maxSizeDone) + maxsize, send, wait = Self.unpack(ptrs) + if read > send { + logs.Error("read > send") + return } - if newRemaining == 0 && wait == 1 { - newWait = 1 // keep the wait status, - // also if newRemaining is not zero, change wait to 0 + if read == 0 && currentMaxSize == maxsize { + return } - if atomic.CompareAndSwapUint64(&Self.remainingWait, ptrs, Self.pack(newRemaining, newWait)) { + send -= read + remain := Self.remainingSize(currentMaxSize, send) + if remain == 0 && wait { + // just keep the wait status + newWait = true + } + // remain > 0, change wait to false. or remain == 0, wait is false, just keep it + if atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(currentMaxSize, send, newWait)) { break } // anther goroutine change wait status or window size } - if wait == 1 { + if wait && !newWait { // send window into the wait status, need notice the channel - //logs.Warn("send window remaining size is 0") + //logs.Warn("send window allow") Self.allow() } // send window not into the wait status, so just do slide @@ -446,18 +518,20 @@ func (Self *SendWindow) allow() { } func (Self *SendWindow) sent(sentSize uint32) { - var remaining, wait uint32 + var maxSie, send uint32 + var wait bool for { - ptrs := atomic.LoadUint64(&Self.remainingWait) - remaining, wait = Self.unpack(ptrs) - if remaining >= sentSize { - atomic.AddUint64(&Self.remainingWait, ^(uint64(sentSize)< common.MAXIMUM_SEGMENT_SIZE { sendSize = common.MAXIMUM_SEGMENT_SIZE //logs.Warn("cut buf by mss") } else { sendSize = uint32(len(Self.buf[Self.off:])) } - if remaining < sendSize { + if remain < sendSize { // usable window size is small than // window MAXIMUM_SEGMENT_SIZE or send buf left - sendSize = remaining + sendSize = remain //logs.Warn("cut buf by remainingsize", sendSize, len(Self.buf[Self.off:])) } //logs.Warn("send size", sendSize) diff --git a/lib/mux/mux.go b/lib/mux/mux.go index 254945e..c0bcdd8 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -303,7 +303,7 @@ func (s *Mux) readSession() { if connection.isClose { continue } - connection.sendWindow.SetSize(pack.Window, pack.ReadLength) + connection.sendWindow.SetSize(pack.Window) continue case common.MUX_CONN_CLOSE: //close the connection connection.closeFlag = true diff --git a/lib/mux/mux_test.go b/lib/mux/mux_test.go index fb5adb2..0d71ee4 100644 --- a/lib/mux/mux_test.go +++ b/lib/mux/mux_test.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/cnlh/nps/lib/common" "github.com/cnlh/nps/lib/goroutine" - "github.com/xtaci/kcp-go" "io" "log" "net" @@ -34,8 +33,8 @@ func TestNewMux(t *testing.T) { //poolConnCopy, _ := ants.NewPoolWithFunc(200000, common.copyConn, ants.WithNonblocking(false)) time.Sleep(time.Second * 3) go func() { - //m2 := NewMux(conn2, "tcp") - m2 := NewMux(conn2, "kcp") + m2 := NewMux(conn2, "tcp") + //m2 := NewMux(conn2, "kcp") for { //logs.Warn("npc starting accept") c, err := m2.Accept() @@ -84,8 +83,8 @@ func TestNewMux(t *testing.T) { }() go func() { - //m1 := NewMux(conn1, "tcp") - m1 := NewMux(conn1, "kcp") + m1 := NewMux(conn1, "tcp") + //m1 := NewMux(conn1, "kcp") l, err := net.Listen("tcp", "127.0.0.1:7777") if err != nil { logs.Warn(err) @@ -147,14 +146,14 @@ func TestNewMux(t *testing.T) { func server() { var err error - //l, err := net.Listen("tcp", "127.0.0.1:9999") - l, err := kcp.Listen("127.0.0.1:9999") + l, err := net.Listen("tcp", "127.0.0.1:9999") + //l, err := kcp.Listen("127.0.0.1:9999") if err != nil { logs.Warn(err) } go func() { conn1, err = l.Accept() - logs.Info("accept", conn1) + //logs.Info("accept", conn1) if err != nil { logs.Warn(err) } @@ -164,9 +163,9 @@ func server() { func client() { var err error - //conn2, err = net.Dial("tcp", "127.0.0.1:9999") - logs.Warn("dial") - conn2, err = kcp.Dial("127.0.0.1:9999") + conn2, err = net.Dial("tcp", "127.0.0.1:9999") + //logs.Warn("dial") + //conn2, err = kcp.Dial("127.0.0.1:9999") if err != nil { logs.Warn(err) } From 49b3da01cdefe089747cbde68def6fa772481d05 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 1 Jan 2020 23:18:23 +0800 Subject: [PATCH 157/171] add some logs --- lib/mux/conn.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index a2b2f5f..f6ea2ae 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -250,7 +250,7 @@ func (Self *ReceiveWindow) calcSize() { // twice grow } if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { - //logs.Warn("window too large", n) + logs.Warn("window too large, calculated:", n, "limit:", common.MAXIMUM_WINDOW_SIZE/uint32(conns)) n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) } // set the maximum size @@ -479,7 +479,7 @@ func (Self *SendWindow) SetSize(currentMaxSizeDone uint64) (closed bool) { ptrs := atomic.LoadUint64(&Self.maxSizeDone) maxsize, send, wait = Self.unpack(ptrs) if read > send { - logs.Error("read > send") + logs.Error("window read > send: max size:", currentMaxSize, "read:", read, "send", send) return } if read == 0 && currentMaxSize == maxsize { From a0a2cd1d47b276ba591833a473dfb0d9ea30567c Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 1 Jan 2020 23:34:58 +0800 Subject: [PATCH 158/171] bump version to v0.26.0 --- build.sh | 2 +- docs/_coverpage.md | 2 +- gui/npc/AndroidManifest.xml | 2 +- lib/version/version.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index 5059486..6b236c4 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #/bash/sh -export VERSION=0.25.4 +export VERSION=0.26.0 sudo apt-get install gcc-mingw-w64-i686 env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -ldflags "-s -w -extldflags -static -extldflags -static" -buildmode=c-shared -o npc_sdk.dll cmd/npc/sdk.go diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 68e0cc3..652591b 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -1,6 +1,6 @@ ![logo](logo.svg) -# NPS 0.25.4 +# NPS 0.26.0 > 一款轻量级、高性能、功能强大的内网穿透代理服务器 diff --git a/gui/npc/AndroidManifest.xml b/gui/npc/AndroidManifest.xml index 901a508..6543fbd 100755 --- a/gui/npc/AndroidManifest.xml +++ b/gui/npc/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/lib/version/version.go b/lib/version/version.go index c2f1489..6a4c8ab 100644 --- a/lib/version/version.go +++ b/lib/version/version.go @@ -1,8 +1,8 @@ package version -const VERSION = "0.25.4" +const VERSION = "0.26.0" // Compulsory minimum version, Minimum downward compatibility to this version func GetVersion() string { - return "0.25.0" + return "0.26.0" } From f5fce6d1f4871e891194ed023e843524b5bed03a Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Thu, 2 Jan 2020 23:47:27 +0800 Subject: [PATCH 159/171] change window calculation --- lib/common/const.go | 4 +- lib/mux/conn.go | 101 +++++--------------------------- lib/mux/mux.go | 2 +- lib/mux/sysGetsock_nowindows.go | 2 +- lib/mux/sysGetsock_windows.go | 2 +- 5 files changed, 21 insertions(+), 90 deletions(-) diff --git a/lib/common/const.go b/lib/common/const.go index 2fd5bb6..2f195f3 100644 --- a/lib/common/const.go +++ b/lib/common/const.go @@ -49,6 +49,6 @@ const ( MUX_PING_RETURN MUX_PING int32 = -1 MAXIMUM_SEGMENT_SIZE = PoolSizeWindow - MAXIMUM_WINDOW_SIZE = 1 << 25 // 1<<31-1 TCP slide window size is very large, - // we use 32M, reduce memory usage + MAXIMUM_WINDOW_SIZE = 1 << 27 // 1<<31-1 TCP slide window size is very large, + // we use 128M, reduce memory usage ) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index f6ea2ae..6d65f7c 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -202,6 +202,7 @@ type ReceiveWindow struct { bufQueue ReceiveWindowQueue element *common.ListElement count int8 + bw *bandwidth once sync.Once // receive window send the current max size and read size to send window // means done size actually store the size receive window has read @@ -211,9 +212,10 @@ func (Self *ReceiveWindow) New(mux *Mux) { // initial a window for receive Self.bufQueue.New() Self.element = common.ListElementPool.Get() - Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*10, 0, false) + Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*30, 0, false) Self.mux = mux Self.window.New() + Self.bw = NewBandwidth(nil) } func (Self *ReceiveWindow) remainingSize(maxSize uint32, delta uint16) (n uint32) { @@ -232,10 +234,11 @@ func (Self *ReceiveWindow) calcSize() { //logs.Warn("ping, bw", Self.mux.latency, Self.bw.Get()) conns := Self.mux.connMap.Size() n := uint32(math.Float64frombits(atomic.LoadUint64(&Self.mux.latency)) * - Self.mux.bw.Get() / float64(conns)) + (Self.mux.bw.Get() + Self.bw.Get())) //logs.Warn(n) - if n < common.MAXIMUM_SEGMENT_SIZE*10 { - n = common.MAXIMUM_SEGMENT_SIZE * 10 + if n < common.MAXIMUM_SEGMENT_SIZE*30 { + //logs.Warn("window small", n, Self.mux.bw.Get(), Self.bw.Get()) + n = common.MAXIMUM_SEGMENT_SIZE * 30 } for { ptrs := atomic.LoadUint64(&Self.maxSizeDone) @@ -313,6 +316,13 @@ func (Self *ReceiveWindow) Read(p []byte, id int32) (n int, err error) { if Self.closeOp { return 0, io.EOF // receive close signal, returns eof } + Self.bw.StartRead() + n, err = Self.readFromQueue(p, id) + Self.bw.SetCopySize(uint16(n)) + return +} + +func (Self *ReceiveWindow) readFromQueue(p []byte, id int32) (n int, err error) { pOff := 0 l := 0 //logs.Warn("receive window read off, element.l", Self.off, Self.element.L) @@ -363,7 +373,7 @@ func (Self *ReceiveWindow) sendStatus(id int32, l uint16) { if read <= (read+uint32(l))&mask31 { read += uint32(l) remain := Self.remainingSize(maxSize, 0) - if wait && remain > 0 || remain == maxSize { + if wait && remain > 0 || read >= maxSize/2 || remain == maxSize { if atomic.CompareAndSwapUint64(&Self.maxSizeDone, ptrs, Self.pack(maxSize, 0, false)) { // now we get the current window status success // receive window free up some space we need acknowledge send window, also reset the read size @@ -441,7 +451,7 @@ type SendWindow struct { func (Self *SendWindow) New(mux *Mux) { Self.setSizeCh = make(chan struct{}) - Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*10, 0, false) + Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*30, 0, false) Self.mux = mux Self.window.New() } @@ -654,82 +664,3 @@ func (Self *SendWindow) SetTimeOut(t time.Time) { // waiting for receive a receive window size Self.timeout = t } - -//type bandwidth struct { -// readStart time.Time -// lastReadStart time.Time -// readEnd time.Time -// lastReadEnd time.Time -// bufLength int -// lastBufLength int -// count int8 -// readBW float64 -// writeBW float64 -// readBandwidth float64 -//} -// -//func (Self *bandwidth) StartRead() { -// Self.lastReadStart, Self.readStart = Self.readStart, time.Now() -// if !Self.lastReadStart.IsZero() { -// if Self.count == -5 { -// Self.calcBandWidth() -// } -// } -//} -// -//func (Self *bandwidth) EndRead() { -// Self.lastReadEnd, Self.readEnd = Self.readEnd, time.Now() -// if Self.count == -5 { -// Self.calcWriteBandwidth() -// } -// if Self.count == 0 { -// Self.calcReadBandwidth() -// Self.count = -6 -// } -// Self.count += 1 -//} -// -//func (Self *bandwidth) SetCopySize(n int) { -// // must be invoke between StartRead and EndRead -// Self.lastBufLength, Self.bufLength = Self.bufLength, n -//} -//// calculating -//// start end start end -//// read read -//// write -// -//func (Self *bandwidth) calcBandWidth() { -// t := Self.readStart.Sub(Self.lastReadStart) -// if Self.lastBufLength >= 32768 { -// Self.readBandwidth = float64(Self.lastBufLength) / t.Seconds() -// } -//} -// -//func (Self *bandwidth) calcReadBandwidth() { -// // Bandwidth between nps and npc -// readTime := Self.readEnd.Sub(Self.readStart) -// Self.readBW = float64(Self.bufLength) / readTime.Seconds() -// //logs.Warn("calc read bw", Self.readBW, Self.bufLength, readTime.Seconds()) -//} -// -//func (Self *bandwidth) calcWriteBandwidth() { -// // Bandwidth between nps and user, npc and application -// writeTime := Self.readStart.Sub(Self.lastReadEnd) -// Self.writeBW = float64(Self.lastBufLength) / writeTime.Seconds() -// //logs.Warn("calc write bw", Self.writeBW, Self.bufLength, writeTime.Seconds()) -//} -// -//func (Self *bandwidth) Get() (bw float64) { -// // The zero value, 0 for numeric types -// if Self.writeBW == 0 && Self.readBW == 0 { -// //logs.Warn("bw both 0") -// return 100 -// } -// if Self.writeBW == 0 && Self.readBW != 0 { -// return Self.readBW -// } -// if Self.readBW == 0 && Self.writeBW != 0 { -// return Self.writeBW -// } -// return Self.readBandwidth -//} diff --git a/lib/mux/mux.go b/lib/mux/mux.go index c0bcdd8..f89bbc4 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -220,7 +220,7 @@ func (s *Mux) pingReturn() { case data = <-s.pingCh: atomic.StoreUint32(&s.pingCheckTime, 0) case <-s.closeChan: - break + return } _ = now.UnmarshalText(data) latency := time.Now().UTC().Sub(now).Seconds() / 2 diff --git a/lib/mux/sysGetsock_nowindows.go b/lib/mux/sysGetsock_nowindows.go index 86c78ad..85d2197 100644 --- a/lib/mux/sysGetsock_nowindows.go +++ b/lib/mux/sysGetsock_nowindows.go @@ -14,7 +14,7 @@ func sysGetSock(fd *os.File) (bufferSize int, err error) { if fd != nil { return syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_RCVBUF) } else { - return 1400 * 320, nil + return 5 * 1024 * 1024, nil } } diff --git a/lib/mux/sysGetsock_windows.go b/lib/mux/sysGetsock_windows.go index 5cf213f..579d620 100644 --- a/lib/mux/sysGetsock_windows.go +++ b/lib/mux/sysGetsock_windows.go @@ -14,7 +14,7 @@ func sysGetSock(fd *os.File) (bufferSize int, err error) { // not support, WTF??? // Todo // return syscall.GetsockoptInt((syscall.Handle)(unsafe.Pointer(fd.Fd())), syscall.SOL_SOCKET, syscall.SO_RCVBUF) - bufferSize = 10 * 1024 * 1024 + bufferSize = 5 * 1024 * 1024 return } From 726056591d92bb5395d91648dbd502188a2d3110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Thu, 2 Jan 2020 23:57:13 +0800 Subject: [PATCH 160/171] change md --- README.md | 5 ++++- README_zh.md | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5543904..dbd50c5 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,11 @@ [![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) ![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) +[README](https://github.com/cnlh/nps/blob/master/README.md)|[中文文档](https://github.com/cnlh/nps/README_zh.md) + NPS is a lightweight, high-performance, powerful **intranet penetration** proxy server, with a powerful web management terminal. + ![image](https://github.com/cnlh/nps/blob/master/image/web.png?raw=true) ## Feature @@ -69,4 +72,4 @@ If you need to register to the system service, you can check [Register to the sy - If you encounter a bug, you can submit it to the dev branch directly. - If you encounter a problem, you can feedback through the issue. - The project is under development, and there is still a lot of room for improvement. If you can contribute code, please submit PR to the dev branch. -- If there is feedback on new features, you can feedback via issues or qq group. \ No newline at end of file +- If there is feedback on new features, you can feedback via issues or qq group. diff --git a/README_zh.md b/README_zh.md index dfa9f50..64a1c47 100644 --- a/README_zh.md +++ b/README_zh.md @@ -5,6 +5,8 @@ [![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) ![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) +[README](https://github.com/cnlh/nps/blob/master/README.md)|[中文文档](https://github.com/cnlh/nps/README_zh.md) + nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 From 8590dfde30113974a81c588377002aaacf3df330 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 4 Jan 2020 15:55:19 +0800 Subject: [PATCH 161/171] change md --- README.md | 2 +- README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dbd50c5..e0aeaad 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) ![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) -[README](https://github.com/cnlh/nps/blob/master/README.md)|[中文文档](https://github.com/cnlh/nps/README_zh.md) +[README](https://github.com/cnlh/nps/blob/master/README.md)|[中文文档](https://github.com/cnlh/nps/blob/master/README_zh.md) NPS is a lightweight, high-performance, powerful **intranet penetration** proxy server, with a powerful web management terminal. diff --git a/README_zh.md b/README_zh.md index 64a1c47..03d7e58 100644 --- a/README_zh.md +++ b/README_zh.md @@ -5,7 +5,7 @@ [![Build Status](https://travis-ci.org/cnlh/nps.svg?branch=master)](https://travis-ci.org/cnlh/nps) ![GitHub All Releases](https://img.shields.io/github/downloads/cnlh/nps/total) -[README](https://github.com/cnlh/nps/blob/master/README.md)|[中文文档](https://github.com/cnlh/nps/README_zh.md) +[README](https://github.com/cnlh/nps/blob/master/README.md)|[中文文档](https://github.com/cnlh/nps/blob/master/README_zh.md) nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务器。目前支持**tcp、udp流量转发**,可支持任何**tcp、udp**上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还**支持内网http代理、内网socks5代理**、**p2p等**,并带有功能强大的web管理端。 From 6bbe276b18a088a21125966ce38a380aacd2f2df Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sat, 4 Jan 2020 20:49:17 +0800 Subject: [PATCH 162/171] change window calculation, bandwidth calculation --- lib/mux/conn.go | 72 +++++++++++++++++++++++++++++++++++++++++++------ lib/mux/mux.go | 2 +- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 6d65f7c..85ba1ef 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -202,7 +202,7 @@ type ReceiveWindow struct { bufQueue ReceiveWindowQueue element *common.ListElement count int8 - bw *bandwidth + bw *writeBandwidth once sync.Once // receive window send the current max size and read size to send window // means done size actually store the size receive window has read @@ -215,7 +215,7 @@ func (Self *ReceiveWindow) New(mux *Mux) { Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*30, 0, false) Self.mux = mux Self.window.New() - Self.bw = NewBandwidth(nil) + Self.bw = NewWriteBandwidth() } func (Self *ReceiveWindow) remainingSize(maxSize uint32, delta uint16) (n uint32) { @@ -232,9 +232,15 @@ func (Self *ReceiveWindow) calcSize() { // calculating maximum receive window size if Self.count == 0 { //logs.Warn("ping, bw", Self.mux.latency, Self.bw.Get()) - conns := Self.mux.connMap.Size() - n := uint32(math.Float64frombits(atomic.LoadUint64(&Self.mux.latency)) * - (Self.mux.bw.Get() + Self.bw.Get())) + //conns := Self.mux.connMap.Size() + muxBw := Self.mux.bw.Get() + connBw := Self.bw.Get() + //logs.Warn("muxbw connbw", muxBw, connBw) + var n uint32 + if connBw > 0 && muxBw > 0 { + n = uint32(math.Float64frombits(atomic.LoadUint64(&Self.mux.latency)) * + (muxBw + connBw)) + } //logs.Warn(n) if n < common.MAXIMUM_SEGMENT_SIZE*30 { //logs.Warn("window small", n, Self.mux.bw.Get(), Self.bw.Get()) @@ -252,9 +258,12 @@ func (Self *ReceiveWindow) calcSize() { n = 2 * size // twice grow } - if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { - logs.Warn("window too large, calculated:", n, "limit:", common.MAXIMUM_WINDOW_SIZE/uint32(conns)) - n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) + if connBw > 0 && muxBw > 0 { + limit := uint32(common.MAXIMUM_WINDOW_SIZE * (connBw / (muxBw + connBw))) + if n > limit { + logs.Warn("window too large, calculated:", n, "limit:", limit, connBw, muxBw) + n = limit + } } // set the maximum size //logs.Warn("n", n) @@ -664,3 +673,50 @@ func (Self *SendWindow) SetTimeOut(t time.Time) { // waiting for receive a receive window size Self.timeout = t } + +type writeBandwidth struct { + writeBW uint64 // store in bits, but it's float64 + readEnd time.Time + duration float64 + bufLength uint32 +} + +const writeCalcThreshold uint32 = 5 * 1024 * 1024 + +func NewWriteBandwidth() *writeBandwidth { + return &writeBandwidth{} +} + +func (Self *writeBandwidth) StartRead() { + if Self.readEnd.IsZero() { + Self.readEnd = time.Now() + } + Self.duration += time.Now().Sub(Self.readEnd).Seconds() + if Self.bufLength >= writeCalcThreshold { + Self.calcBandWidth() + } +} + +func (Self *writeBandwidth) SetCopySize(n uint16) { + Self.bufLength += uint32(n) + Self.endRead() +} + +func (Self *writeBandwidth) endRead() { + Self.readEnd = time.Now() +} + +func (Self *writeBandwidth) calcBandWidth() { + atomic.StoreUint64(&Self.writeBW, math.Float64bits(float64(Self.bufLength)/Self.duration)) + Self.bufLength = 0 + Self.duration = 0 +} + +func (Self *writeBandwidth) Get() (bw float64) { + // The zero value, 0 for numeric types + bw = math.Float64frombits(atomic.LoadUint64(&Self.writeBW)) + if bw <= 0 { + bw = 0 + } + return +} diff --git a/lib/mux/mux.go b/lib/mux/mux.go index f89bbc4..52bd81c 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -443,7 +443,7 @@ func (Self *bandwidth) Get() (bw float64) { // The zero value, 0 for numeric types bw = math.Float64frombits(atomic.LoadUint64(&Self.readBandwidth)) if bw <= 0 { - bw = 100 + bw = 0 } //logs.Warn(bw) return From 933809f93930fff3218b3525f1f9ac57644766d1 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Sun, 5 Jan 2020 21:00:31 +0800 Subject: [PATCH 163/171] add work flow --- image/work_flow.svg | 821 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 821 insertions(+) create mode 100644 image/work_flow.svg diff --git a/image/work_flow.svg b/image/work_flow.svg new file mode 100644 index 0000000..5b3794b --- /dev/null +++ b/image/work_flow.svg @@ -0,0 +1,821 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 页-1 + + + + + + + + + + + + + + + + + + + + + + + + 防火墙 + NAT + + 工作表.2 + + + + 工作表.3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 服务器 + Application2 10.0.0.4:PORT + + 工作表.5 + + + + 工作表.6 + + + + 工作表.7 + + + + + + + + + + Application210.0.0.4:PORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 服务器.8 + Application1 10.0.0.3:PORT + + 工作表.9 + + + + 工作表.10 + + + + 工作表.11 + + + + + + + + + + Application110.0.0.3:PORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 服务器.12 + Application3 10.0.0.5:PORT + + 工作表.13 + + + + 工作表.14 + + + + 工作表.15 + + + + + + + + + + Application310.0.0.5:PORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 主机 + NPC Client 10.0.0.2 Dial To: ->10.0.0.3:PORT ->10.0.0.4:PORT ... + + 工作表.17 + + + + + + 工作表.18 + + + + + + + + 工作表.19 + + + + + + NPCClient10.0.0.2Dial To:->10.0.0.3:PORT->10.0.0.4:PORT->10.0.0.5:PORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 主机.20 + NPS Server 1.1.1.1 Listen On: 8003->10.0.0.3:PORT 8004->10.0.... + + 工作表.21 + + + + + + 工作表.22 + + + + + + + + 工作表.23 + + + + + + NPSServer1.1.1.1Listen On:8003->10.0.0.3:PORT8004->10.0.0.4:PORT8005->10.0.0.5:PORT + + + + + + + + + + + + + + + + + + 用户 + User1 Wants:APP1 + + 工作表.25 + + + + + + User1Wants:APP1 + + + + + + + + + + + + + + + + + + 用户.26 + User2 Wants:APP2 + + 工作表.27 + + + + + + User2Wants:APP2 + + + + + + + + + + + + + + + + + + 用户.28 + User3 Wants:APP3 + + 工作表.29 + + + + + + User3Wants:APP3 + + + 动态连接线.1003 + ->8003 Multi Conn + + + + + + + + ->8003Multi Conn + + 动态连接线.1004 + ->8004 Multi Conn + + + + + + + + ->8004Multi Conn + + 动态连接线.1005 + ->8005 Multi Conn + + + + + + + + ->8005Multi Conn + + 动态连接线.1006 + NPS & NPC Multiplexing Connection TCP or KCP Only One Conn Pe... + + + + + + + + NPS & NPCMultiplexingConnectionTCP or KCPOnly OneConn PeerNPC + + 动态连接线.1007 + ->PORT Multi Conn + + + + + + + + ->PORTMulti Conn + + 动态连接线.1008 + ->PORT Multi Conn + + + + + + + + ->PORTMulti Conn + + 动态连接线.1009 + ->PORT Multi Conn + + + + + + + + ->PORTMulti Conn + + 动态连接线.1010 + NPS & NPC + + + + + + + + NPS&NPC + + 工作表.1011 + + + + 工作表.1012 + + + + 工作表.1013 + Internet + + + + Internet + + 工作表.1014 + Intranet + + + + Intranet + + From c595db19b919decd77381576daa105fa6173cd06 Mon Sep 17 00:00:00 2001 From: avengexyz <58532751+avengexyz@users.noreply.github.com> Date: Sun, 5 Jan 2020 22:20:55 +0800 Subject: [PATCH 164/171] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8625.4?= =?UTF-8?q?=E7=89=88=E6=9C=ACwebapi=E5=8F=82=E6=95=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 自己测试的25.4版本 webapi 需要的参数 --- docs/webapi.md | 231 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 docs/webapi.md diff --git a/docs/webapi.md b/docs/webapi.md new file mode 100644 index 0000000..539766b --- /dev/null +++ b/docs/webapi.md @@ -0,0 +1,231 @@ +获取客户端列表 + +url='http://你的域名或者网址/client/list/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| search | 搜索 | +| order | 排序asc 正序 desc倒序 | +| offset | 分页(第几页) | +| limit | 条数(分页显示的条数) | + +*** +获取单个客户端 + +url='http://你的域名或者网址/client/getclient/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 客户端id | + +*** +添加客户端 + +url='http://你的域名或者网址/client/add/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| remark | 备注 | +| u | basic权限认证用户名 | +| p | basic权限认证密码 | +| limit | 条数(分页显示的条数) | +| vkey | 客户端验证密钥 | +| config\_conn\_allow | 是否允许客户端以配置文件模式连接 1允许 0不允许 | +| compress | 压缩1允许 0不允许 | +| crypt | 是否加密(1或者0)1允许 0不允许 | +| rate\_limit | 带宽限制 单位KB/S 空则为不限制 | +| flow\_limit | 流量限制 单位M 空则为不限制 | +| max\_conn | 客户端最大连接数量 空则为不限制 | +| max\_tunnel | 客户端最大隧道数量 空则为不限制 | + +*** +修改客户端(25.4版本有问题暂时不能用) + +url='http://你的域名或者网址/client/edit/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| remark | 备注 | +| u | basic权限认证用户名 | +| p | basic权限认证密码 | +| limit | 条数(分页显示的条数) | +| vkey | 客户端验证密钥 | +| config\_conn\_allow | 是否允许客户端以配置文件模式连接 1允许 0不允许 | +| compress | 压缩1允许 0不允许 | +| crypt | 是否加密(1或者0)1允许 0不允许 | +| rate\_limit | 带宽限制 单位KB/S 空则为不限制 | +| flow\_limit | 流量限制 单位M 空则为不限制 | +| max\_conn | 客户端最大连接数量 空则为不限制 | +| max\_tunnel | 客户端最大隧道数量 空则为不限制 | +| id | 要修改的客户端id | + +*** +删除客户端 + +url='http://你的域名或者网址/client/del/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 要删除的客户端id | + +*** +获取域名解析列表 + +url='http://你的域名或者网址/index/hostlist/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| search | 搜索(可以搜域名/备注什么的) | +| offset | 分页(第几页) | +| limit | 条数(分页显示的条数) | + +*** +添加域名解析 + +url='http://你的域名或者网址/index/addhost/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| remark | 备注 | +| host | 域名 | +| scheme | 协议类型(三种 all http https) | +| location | url路由 空则为不限制 | +| client\_id | 客户端id | +| target | 内网目标(ip:端口) | +| header | request header 请求头 | +| hostchange | request host 请求主机 | + +*** +修改域名解析 + +url='http://你的域名或者网址/index/edithost/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| remark | 备注 | +| host | 域名 | +| scheme | 协议类型(三种 all http https) | +| location | url路由 空则为不限制 | +| client\_id | 客户端id | +| target | 内网目标(ip:端口) | +| header | request header 请求头 | +| hostchange | request host 请求主机 | +| id | 需要修改的域名解析id | + +*** +删除域名解析 + +url='http://你的域名或者网址/index/delhost/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 需要删除的域名解析id | + +*** +获取单条隧道信息 + +url='http://你的域名或者网址/index/getonetunnel/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 隧道的id | + +*** +获取隧道列表 + +url='http://你的域名或者网址/index/gettunnel/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| client\_id | 穿透隧道的客户端id | +| type | 类型tcp udp httpProx socks5 secret p2p | +| search | 搜索 | +| offset | 分页(第几页) | +| limit | 条数(分页显示的条数) | + +*** +添加隧道 + +url='http://你的域名或者网址/index/add/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| type | 类型tcp udp httpProx socks5 secret p2p | +| remark | 备注 | +| port | 服务端端口 | +| target | 目标(ip:端口) | +| client\_id | 客户端id | + +*** +修改隧道 + +url='http://你的域名或者网址/index/edit/'; + +*** +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| type | 类型tcp udp httpProx socks5 secret p2p | +| remark | 备注 | +| port | 服务端端口 | +| target | 目标(ip:端口) | +| client\_id | 客户端id | +| id | 隧道id | + +*** +删除隧道 + +url='http://你的域名或者网址/index/del/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 隧道id | + +*** +隧道停止工作 + +url='http://你的域名或者网址/index/stop/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 隧道id | + +*** +隧道开始工作 + +url='http://你的域名或者网址/index/start/'; + +post提交的数据 + +| 参数 | 含义 | +| --- | --- | +| id | 隧道id | \ No newline at end of file From 103268a5dca130df2890c13969aea1d0d70faafe Mon Sep 17 00:00:00 2001 From: avengexyz <58532751+avengexyz@users.noreply.github.com> Date: Mon, 6 Jan 2020 01:11:25 +0800 Subject: [PATCH 165/171] =?UTF-8?q?=E9=87=8D=E6=96=B0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=9A=84wenapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重新修改的wenapi --- docs/webapi.md | 96 ++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/docs/webapi.md b/docs/webapi.md index 539766b..836358b 100644 --- a/docs/webapi.md +++ b/docs/webapi.md @@ -1,8 +1,9 @@ 获取客户端列表 -url='http://你的域名或者网址/client/list/'; +``` +POST /client/list/ +``` -post提交的数据 | 参数 | 含义 | | --- | --- | @@ -14,9 +15,10 @@ post提交的数据 *** 获取单个客户端 -url='http://你的域名或者网址/client/getclient/'; +``` +POST /client/getclient/ +``` -post提交的数据 | 参数 | 含义 | | --- | --- | @@ -25,9 +27,9 @@ post提交的数据 *** 添加客户端 -url='http://你的域名或者网址/client/add/'; - -post提交的数据 +``` +POST /client/add/ +``` | 参数 | 含义 | | --- | --- | @@ -47,9 +49,9 @@ post提交的数据 *** 修改客户端(25.4版本有问题暂时不能用) -url='http://你的域名或者网址/client/edit/'; - -post提交的数据 +``` +POST /client/edit/ +``` | 参数 | 含义 | | --- | --- | @@ -70,9 +72,9 @@ post提交的数据 *** 删除客户端 -url='http://你的域名或者网址/client/del/'; - -post提交的数据 +``` +POST /client/del/ +``` | 参数 | 含义 | | --- | --- | @@ -81,9 +83,9 @@ post提交的数据 *** 获取域名解析列表 -url='http://你的域名或者网址/index/hostlist/'; - -post提交的数据 +``` +POST /index/hostlist/ +``` | 参数 | 含义 | | --- | --- | @@ -94,9 +96,10 @@ post提交的数据 *** 添加域名解析 -url='http://你的域名或者网址/index/addhost/'; +``` +POST /index/addhost/ +``` -post提交的数据 | 参数 | 含义 | | --- | --- | @@ -112,9 +115,9 @@ post提交的数据 *** 修改域名解析 -url='http://你的域名或者网址/index/edithost/'; - -post提交的数据 +``` +POST /index/edithost/ +``` | 参数 | 含义 | | --- | --- | @@ -131,9 +134,9 @@ post提交的数据 *** 删除域名解析 -url='http://你的域名或者网址/index/delhost/'; - -post提交的数据 +``` +POST /index/delhost/ +``` | 参数 | 含义 | | --- | --- | @@ -142,9 +145,9 @@ post提交的数据 *** 获取单条隧道信息 -url='http://你的域名或者网址/index/getonetunnel/'; - -post提交的数据 +``` +POST /index/getonetunnel/ +``` | 参数 | 含义 | | --- | --- | @@ -153,9 +156,9 @@ post提交的数据 *** 获取隧道列表 -url='http://你的域名或者网址/index/gettunnel/'; - -post提交的数据 +``` +POST /index/gettunnel/ +``` | 参数 | 含义 | | --- | --- | @@ -168,9 +171,9 @@ post提交的数据 *** 添加隧道 -url='http://你的域名或者网址/index/add/'; - -post提交的数据 +``` +POST /index/add/ +``` | 参数 | 含义 | | --- | --- | @@ -183,10 +186,9 @@ post提交的数据 *** 修改隧道 -url='http://你的域名或者网址/index/edit/'; - -*** -post提交的数据 +``` +POST /index/edit/ +``` | 参数 | 含义 | | --- | --- | @@ -200,9 +202,9 @@ post提交的数据 *** 删除隧道 -url='http://你的域名或者网址/index/del/'; - -post提交的数据 +``` +POST /index/del/ +``` | 参数 | 含义 | | --- | --- | @@ -211,9 +213,9 @@ post提交的数据 *** 隧道停止工作 -url='http://你的域名或者网址/index/stop/'; - -post提交的数据 +``` +POST /index/stop/ +``` | 参数 | 含义 | | --- | --- | @@ -222,10 +224,10 @@ post提交的数据 *** 隧道开始工作 -url='http://你的域名或者网址/index/start/'; - -post提交的数据 +``` +POST /index/start/ +``` | 参数 | 含义 | | --- | --- | -| id | 隧道id | \ No newline at end of file +| id | 隧道id | From 35311010a60058d1eb0db7389361d990d390bd68 Mon Sep 17 00:00:00 2001 From: cnlh Date: Tue, 7 Jan 2020 10:02:58 +0800 Subject: [PATCH 166/171] fixed #354 --- cmd/npc/npc.go | 2 +- cmd/nps/nps.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index da29a05..ea1a5ec 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -114,7 +114,7 @@ func main() { } err := service.Control(s, os.Args[1]) if err != nil { - logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + logs.Error("Valid actions: %q\n%s", service.ControlAction, err.Error()) } return } diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 306da88..36141f0 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -94,13 +94,13 @@ func main() { } err = service.Control(s, os.Args[1]) if err != nil { - logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + logs.Error("Valid actions: %q\n%s", service.ControlAction, err.Error()) } return case "start", "restart", "stop", "uninstall": err := service.Control(s, os.Args[1]) if err != nil { - logs.Error("Valid actions: %q\n", service.ControlAction, err.Error()) + logs.Error("Valid actions: %q\n%s", service.ControlAction, err.Error()) } return case "update": From 4b02ab8d1fef441e2410a1e232a4085b475722a7 Mon Sep 17 00:00:00 2001 From: he liu Date: Wed, 8 Jan 2020 14:28:42 +0800 Subject: [PATCH 167/171] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dfa9f50..b7d39d9 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 - 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能 - 服务端支持多用户和用户注册功能 -**没找到你想要的功能?不要紧,点击[进入文档](https://cnlh.github.io/nps/)查找吧** +**没找到你想要的功能?不要紧,点击[进入文档](https://ehang-io.github.io/nps)查找吧** ## 快速开始 ### 安装 @@ -65,11 +65,11 @@ nps是一款轻量级、高性能、功能强大的**内网穿透**代理服务 - 点击web管理中客户端前的+号,复制启动命令 - 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行 -如果需要注册到系统服务可查看[注册到系统服务](https://cnlh.github.io/nps/#/use?id=注册到系统服务) +如果需要注册到系统服务可查看[注册到系统服务](https://ehang-io.github.io/nps/#/use?id=注册到系统服务) ### 配置 - 客户端连接后,在web中配置对应穿透服务即可 -- 更多高级用法见[完整文档](https://cnlh.github.io/nps/) +- 更多高级用法见[完整文档](https://ehang-io.github.io/nps) ## 贡献 - 如果遇到bug可以直接提交至dev分支 From 6c7ac5962633a274c0f3e64112b2c68329a40d69 Mon Sep 17 00:00:00 2001 From: ffdfgdfg Date: Wed, 8 Jan 2020 21:57:14 +0800 Subject: [PATCH 168/171] change package path --- Dockerfile.npc | 4 ++-- Dockerfile.nps | 6 +++--- bridge/bridge.go | 16 ++++++++-------- build.android.sh | 8 ++++---- client/client.go | 11 ++++++----- client/control.go | 10 +++++----- client/health.go | 6 +++--- client/local.go | 14 +++++++------- client/register.go | 2 +- cmd/npc/npc.go | 12 ++++++------ cmd/npc/sdk.go | 6 +++--- cmd/nps/nps.go | 20 ++++++++++---------- go.mod | 2 +- gui/npc/npc.go | 8 ++++---- lib/common/util.go | 2 +- lib/config/config.go | 6 +++--- lib/conn/conn.go | 12 ++++++------ lib/daemon/daemon.go | 2 +- lib/daemon/reload.go | 2 +- lib/file/db.go | 6 +++--- lib/file/file.go | 4 ++-- lib/file/obj.go | 2 +- lib/goroutine/pool.go | 4 ++-- lib/install/install.go | 4 ++-- lib/mux/conn.go | 2 +- lib/mux/mux.go | 2 +- lib/mux/mux_test.go | 4 ++-- lib/mux/pmux.go | 2 +- lib/mux/queue.go | 2 +- server/connection/connection.go | 2 +- server/proxy/base.go | 8 ++++---- server/proxy/http.go | 12 ++++++------ server/proxy/https.go | 10 +++++----- server/proxy/p2p.go | 2 +- server/proxy/socks5.go | 6 +++--- server/proxy/tcp.go | 10 +++++----- server/proxy/transport.go | 4 ++-- server/proxy/transport_windows.go | 2 +- server/proxy/udp.go | 8 ++++---- server/server.go | 12 ++++++------ server/test/test.go | 4 ++-- server/tool/utils.go | 2 +- web/controllers/auth.go | 2 +- web/controllers/base.go | 8 ++++---- web/controllers/client.go | 8 ++++---- web/controllers/index.go | 8 ++++---- web/controllers/login.go | 6 +++--- web/routers/router.go | 2 +- web/static/page/error.html | 2 +- web/views/login/index.html | 2 +- web/views/public/layout.html | 4 ++-- 51 files changed, 153 insertions(+), 152 deletions(-) diff --git a/Dockerfile.npc b/Dockerfile.npc index ae6715a..2ef275e 100755 --- a/Dockerfile.npc +++ b/Dockerfile.npc @@ -1,10 +1,10 @@ FROM golang as builder -WORKDIR /go/src/github.com/cnlh/nps +WORKDIR /go/src/ehang.io/nps COPY . . RUN go get -d -v ./... RUN CGO_ENABLED=0 go build -ldflags="-w -s -extldflags -static" ./cmd/npc/npc.go FROM scratch -COPY --from=builder /go/src/github.com/cnlh/nps/npc / +COPY --from=builder /go/src/ehang.io/nps/npc / VOLUME /conf ENTRYPOINT ["/npc"] diff --git a/Dockerfile.nps b/Dockerfile.nps index 698ced9..faf02ba 100755 --- a/Dockerfile.nps +++ b/Dockerfile.nps @@ -1,11 +1,11 @@ FROM golang as builder -WORKDIR /go/src/github.com/cnlh/nps +WORKDIR /go/src/ehang.io/nps COPY . . RUN go get -d -v ./... RUN CGO_ENABLED=0 go build -ldflags="-w -s -extldflags -static" ./cmd/nps/nps.go FROM scratch -COPY --from=builder /go/src/github.com/cnlh/nps/nps / -COPY --from=builder /go/src/github.com/cnlh/nps/web /web +COPY --from=builder /go/src/ehang.io/nps/nps / +COPY --from=builder /go/src/ehang.io/nps/web /web VOLUME /conf CMD ["/nps"] diff --git a/bridge/bridge.go b/bridge/bridge.go index 7894b66..0827260 100755 --- a/bridge/bridge.go +++ b/bridge/bridge.go @@ -11,16 +11,16 @@ import ( "sync" "time" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/mux" + "ehang.io/nps/lib/version" + "ehang.io/nps/server/connection" + "ehang.io/nps/server/tool" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/mux" - "github.com/cnlh/nps/lib/version" - "github.com/cnlh/nps/server/connection" - "github.com/cnlh/nps/server/tool" ) type Client struct { diff --git a/build.android.sh b/build.android.sh index d9f8141..918a66a 100644 --- a/build.android.sh +++ b/build.android.sh @@ -14,16 +14,16 @@ git checkout v1.2.0 go install -v ./cmd/fyne #fyne package -os android fyne.io/fyne/cmd/hello echo "fyne install success" -mkdir -p /go/src/github.com/cnlh/nps -cp -R /app/* /go/src/github.com/cnlh/nps -cd /go/src/github.com/cnlh/nps +mkdir -p /go/src/ehang.io/nps +cp -R /app/* /go/src/ehang.io/nps +cd /go/src/ehang.io/nps #go get -u fyne.io/fyne fyne.io/fyne/cmd/fyne rm cmd/npc/sdk.go #go get -u ./... #go mod tidy #rm -rf /go/src/golang.org/x/mobile echo "tidy success" -cd /go/src/github.com/cnlh/nps +cd /go/src/ehang.io/nps go mod vendor cd vendor cp -R * /go/src diff --git a/client/client.go b/client/client.go index 7a6f1da..98c918d 100755 --- a/client/client.go +++ b/client/client.go @@ -11,11 +11,11 @@ import ( "github.com/astaxie/beego/logs" "github.com/xtaci/kcp-go" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/config" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/mux" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/config" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/mux" ) type TRPClient struct { @@ -44,6 +44,7 @@ func NewRPClient(svraddr string, vKey string, bridgeConnType string, proxyUrl st var NowStatus int var CloseClient bool + //start func (s *TRPClient) Start() { CloseClient = false diff --git a/client/control.go b/client/control.go index d8b98f3..63bf7ea 100644 --- a/client/control.go +++ b/client/control.go @@ -19,12 +19,12 @@ import ( "strings" "time" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/config" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/version" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/config" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/version" "github.com/xtaci/kcp-go" "golang.org/x/net/proxy" ) diff --git a/client/health.go b/client/health.go index e804cf9..2726c5b 100644 --- a/client/health.go +++ b/client/health.go @@ -7,10 +7,10 @@ import ( "strings" "time" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/sheap" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/sheap" "github.com/pkg/errors" ) diff --git a/client/local.go b/client/local.go index 9c903f6..13dfb60 100644 --- a/client/local.go +++ b/client/local.go @@ -8,14 +8,14 @@ import ( "sync" "time" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/config" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/mux" + "ehang.io/nps/server/proxy" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/config" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/mux" - "github.com/cnlh/nps/server/proxy" "github.com/xtaci/kcp-go" ) diff --git a/client/register.go b/client/register.go index c03fb3c..dda4445 100644 --- a/client/register.go +++ b/client/register.go @@ -5,7 +5,7 @@ import ( "log" "os" - "github.com/cnlh/nps/lib/common" + "ehang.io/nps/lib/common" ) func RegisterLocalIp(server string, vKey string, tp string, proxyUrl string, hour int) { diff --git a/cmd/npc/npc.go b/cmd/npc/npc.go index ea1a5ec..cb2efba 100644 --- a/cmd/npc/npc.go +++ b/cmd/npc/npc.go @@ -1,16 +1,16 @@ package main import ( + "ehang.io/nps/client" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/config" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/install" + "ehang.io/nps/lib/version" "flag" "fmt" "github.com/astaxie/beego/logs" "github.com/ccding/go-stun/stun" - "github.com/cnlh/nps/client" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/config" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/install" - "github.com/cnlh/nps/lib/version" "github.com/kardianos/service" "os" "runtime" diff --git a/cmd/npc/sdk.go b/cmd/npc/sdk.go index b8cc38f..5d199a2 100644 --- a/cmd/npc/sdk.go +++ b/cmd/npc/sdk.go @@ -2,10 +2,10 @@ package main import ( "C" + "ehang.io/nps/client" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/version" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/client" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/version" ) var cl *client.TRPClient diff --git a/cmd/nps/nps.go b/cmd/nps/nps.go index 36141f0..18ea025 100644 --- a/cmd/nps/nps.go +++ b/cmd/nps/nps.go @@ -1,26 +1,26 @@ package main import ( + "ehang.io/nps/lib/install" "flag" - "github.com/cnlh/nps/lib/install" "log" "os" "path/filepath" "runtime" "strings" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/daemon" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/version" + "ehang.io/nps/server" + "ehang.io/nps/server/connection" + "ehang.io/nps/server/tool" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/daemon" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/version" - "github.com/cnlh/nps/server" - "github.com/cnlh/nps/server/connection" - "github.com/cnlh/nps/server/tool" - "github.com/cnlh/nps/web/routers" + "ehang.io/nps/web/routers" "github.com/kardianos/service" ) diff --git a/go.mod b/go.mod index 141d73c..cad2acc 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/cnlh/nps +module ehang.io/nps go 1.13 diff --git a/gui/npc/npc.go b/gui/npc/npc.go index 0c55ed4..516a87a 100644 --- a/gui/npc/npc.go +++ b/gui/npc/npc.go @@ -1,16 +1,16 @@ package main import ( + "ehang.io/nps/client" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/daemon" + "ehang.io/nps/lib/version" "fmt" "fyne.io/fyne" "fyne.io/fyne/app" "fyne.io/fyne/layout" "fyne.io/fyne/widget" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/client" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/daemon" - "github.com/cnlh/nps/lib/version" "io/ioutil" "os" "path" diff --git a/lib/common/util.go b/lib/common/util.go index 1db0d27..71e604e 100755 --- a/lib/common/util.go +++ b/lib/common/util.go @@ -16,7 +16,7 @@ import ( "strings" "sync" - "github.com/cnlh/nps/lib/crypt" + "ehang.io/nps/lib/crypt" ) //Get the corresponding IP address through domain name diff --git a/lib/config/config.go b/lib/config/config.go index 96531e2..62e2d2b 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -6,8 +6,8 @@ import ( "regexp" "strings" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/file" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/file" ) type CommonConfig struct { @@ -241,7 +241,7 @@ func dealTunnel(s string) *file.Tunnel { t.StripPre = item[1] case "multi_account": t.MultiAccount = &file.MultiAccount{} - if common.FileExists(item[1]){ + if common.FileExists(item[1]) { if b, err := common.ReadAllFromFile(item[1]); err != nil { panic(err) } else { diff --git a/lib/conn/conn.go b/lib/conn/conn.go index db03c40..c1ca1b1 100755 --- a/lib/conn/conn.go +++ b/lib/conn/conn.go @@ -3,11 +3,11 @@ package conn import ( "bufio" "bytes" + "ehang.io/nps/lib/goroutine" "encoding/binary" "encoding/json" "errors" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/goroutine" "io" "net" "net/http" @@ -16,11 +16,11 @@ import ( "strings" "time" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/mux" - "github.com/cnlh/nps/lib/rate" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/mux" + "ehang.io/nps/lib/rate" "github.com/xtaci/kcp-go" ) diff --git a/lib/daemon/daemon.go b/lib/daemon/daemon.go index 3c41086..521745c 100644 --- a/lib/daemon/daemon.go +++ b/lib/daemon/daemon.go @@ -9,7 +9,7 @@ import ( "strconv" "strings" - "github.com/cnlh/nps/lib/common" + "ehang.io/nps/lib/common" ) func InitDaemon(f string, runPath string, pidPath string) { diff --git a/lib/daemon/reload.go b/lib/daemon/reload.go index 2db00ac..5216eff 100644 --- a/lib/daemon/reload.go +++ b/lib/daemon/reload.go @@ -8,8 +8,8 @@ import ( "path/filepath" "syscall" + "ehang.io/nps/lib/common" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/common" ) func init() { diff --git a/lib/file/db.go b/lib/file/db.go index c48df2e..50be394 100644 --- a/lib/file/db.go +++ b/lib/file/db.go @@ -9,9 +9,9 @@ import ( "strings" "sync" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/rate" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/rate" ) type DbUtils struct { diff --git a/lib/file/file.go b/lib/file/file.go index 63f3cb7..beab47f 100644 --- a/lib/file/file.go +++ b/lib/file/file.go @@ -9,8 +9,8 @@ import ( "sync" "sync/atomic" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/rate" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/rate" ) func NewJsonDb(runPath string) *JsonDb { diff --git a/lib/file/obj.go b/lib/file/obj.go index 36c783b..31f3e63 100644 --- a/lib/file/obj.go +++ b/lib/file/obj.go @@ -6,7 +6,7 @@ import ( "sync/atomic" "time" - "github.com/cnlh/nps/lib/rate" + "ehang.io/nps/lib/rate" "github.com/pkg/errors" ) diff --git a/lib/goroutine/pool.go b/lib/goroutine/pool.go index 287c711..ca91d6d 100644 --- a/lib/goroutine/pool.go +++ b/lib/goroutine/pool.go @@ -1,8 +1,8 @@ package goroutine import ( - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/file" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/file" "github.com/panjf2000/ants/v2" "io" "net" diff --git a/lib/install/install.go b/lib/install/install.go index 6156e3f..8973d0d 100644 --- a/lib/install/install.go +++ b/lib/install/install.go @@ -1,11 +1,11 @@ package install import ( + "ehang.io/nps/lib/common" "encoding/json" "errors" "fmt" "github.com/c4milo/unpackit" - "github.com/cnlh/nps/lib/common" "io" "io/ioutil" "log" @@ -50,7 +50,7 @@ func downloadLatest(bin string) string { fmt.Println("the latest version is", version) filename := runtime.GOOS + "_" + runtime.GOARCH + "_" + bin + ".tar.gz" // download latest package - downloadUrl := fmt.Sprintf("https://github.com/cnlh/nps/releases/download/%s/%s", version, filename) + downloadUrl := fmt.Sprintf("https://ehang.io/nps/releases/download/%s/%s", version, filename) fmt.Println("download package from ", downloadUrl) resp, err := http.Get(downloadUrl) if err != nil { diff --git a/lib/mux/conn.go b/lib/mux/conn.go index 85ba1ef..c0a5b7a 100644 --- a/lib/mux/conn.go +++ b/lib/mux/conn.go @@ -1,9 +1,9 @@ package mux import ( + "ehang.io/nps/lib/common" "errors" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" "io" "math" "net" diff --git a/lib/mux/mux.go b/lib/mux/mux.go index 52bd81c..5b591ed 100644 --- a/lib/mux/mux.go +++ b/lib/mux/mux.go @@ -9,8 +9,8 @@ import ( "sync/atomic" "time" + "ehang.io/nps/lib/common" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" ) type Mux struct { diff --git a/lib/mux/mux_test.go b/lib/mux/mux_test.go index 0d71ee4..a3ed3fc 100644 --- a/lib/mux/mux_test.go +++ b/lib/mux/mux_test.go @@ -2,9 +2,9 @@ package mux import ( "bufio" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/goroutine" "fmt" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/goroutine" "io" "log" "net" diff --git a/lib/mux/pmux.go b/lib/mux/pmux.go index f4e9d4a..b8de236 100644 --- a/lib/mux/pmux.go +++ b/lib/mux/pmux.go @@ -12,8 +12,8 @@ import ( "strings" "time" + "ehang.io/nps/lib/common" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" "github.com/pkg/errors" ) diff --git a/lib/mux/queue.go b/lib/mux/queue.go index 9a62fa2..cc80407 100644 --- a/lib/mux/queue.go +++ b/lib/mux/queue.go @@ -1,8 +1,8 @@ package mux import ( + "ehang.io/nps/lib/common" "errors" - "github.com/cnlh/nps/lib/common" "io" "math" "runtime" diff --git a/server/connection/connection.go b/server/connection/connection.go index dbd74ca..aac1c34 100644 --- a/server/connection/connection.go +++ b/server/connection/connection.go @@ -5,9 +5,9 @@ import ( "os" "strconv" + "ehang.io/nps/lib/mux" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/mux" ) var pMux *mux.PortMux diff --git a/server/proxy/base.go b/server/proxy/base.go index 93774f3..7df5921 100644 --- a/server/proxy/base.go +++ b/server/proxy/base.go @@ -6,11 +6,11 @@ import ( "net/http" "sync" + "ehang.io/nps/bridge" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/file" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/bridge" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/file" ) type Service interface { diff --git a/server/proxy/http.go b/server/proxy/http.go index 936aae3..1470c3c 100644 --- a/server/proxy/http.go +++ b/server/proxy/http.go @@ -13,13 +13,13 @@ import ( "strings" "sync" + "ehang.io/nps/bridge" + "ehang.io/nps/lib/cache" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/file" + "ehang.io/nps/server/connection" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/bridge" - "github.com/cnlh/nps/lib/cache" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/server/connection" ) type httpServer struct { diff --git a/server/proxy/https.go b/server/proxy/https.go index 303b92d..3f0be1d 100644 --- a/server/proxy/https.go +++ b/server/proxy/https.go @@ -6,13 +6,13 @@ import ( "net/url" "sync" + "ehang.io/nps/lib/cache" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/file" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/cache" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/file" "github.com/pkg/errors" ) diff --git a/server/proxy/p2p.go b/server/proxy/p2p.go index b789ced..7c9b70f 100644 --- a/server/proxy/p2p.go +++ b/server/proxy/p2p.go @@ -5,8 +5,8 @@ import ( "strings" "time" + "ehang.io/nps/lib/common" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" ) type P2PServer struct { diff --git a/server/proxy/socks5.go b/server/proxy/socks5.go index dd27dfd..f2ee2d5 100755 --- a/server/proxy/socks5.go +++ b/server/proxy/socks5.go @@ -7,10 +7,10 @@ import ( "net" "strconv" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/file" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/file" ) const ( diff --git a/server/proxy/tcp.go b/server/proxy/tcp.go index 1f593ba..58ce3e0 100755 --- a/server/proxy/tcp.go +++ b/server/proxy/tcp.go @@ -7,13 +7,13 @@ import ( "path/filepath" "strconv" + "ehang.io/nps/bridge" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/file" + "ehang.io/nps/server/connection" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/bridge" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/server/connection" ) type TunnelModeServer struct { diff --git a/server/proxy/transport.go b/server/proxy/transport.go index d622683..e08bfd0 100644 --- a/server/proxy/transport.go +++ b/server/proxy/transport.go @@ -7,8 +7,8 @@ import ( "strconv" "syscall" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" ) func HandleTrans(c *conn.Conn, s *TunnelModeServer) error { diff --git a/server/proxy/transport_windows.go b/server/proxy/transport_windows.go index cf4c22d..def673b 100644 --- a/server/proxy/transport_windows.go +++ b/server/proxy/transport_windows.go @@ -3,7 +3,7 @@ package proxy import ( - "github.com/cnlh/nps/lib/conn" + "ehang.io/nps/lib/conn" ) func HandleTrans(c *conn.Conn, s *TunnelModeServer) error { diff --git a/server/proxy/udp.go b/server/proxy/udp.go index 958e3c2..abe2c7f 100755 --- a/server/proxy/udp.go +++ b/server/proxy/udp.go @@ -4,11 +4,11 @@ import ( "net" "strings" + "ehang.io/nps/bridge" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/conn" + "ehang.io/nps/lib/file" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/bridge" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/conn" - "github.com/cnlh/nps/lib/file" ) type UdpModeServer struct { diff --git a/server/server.go b/server/server.go index 868a94d..b1de97e 100644 --- a/server/server.go +++ b/server/server.go @@ -1,21 +1,21 @@ package server import ( + "ehang.io/nps/lib/version" "errors" - "github.com/cnlh/nps/lib/version" "math" "os" "strconv" "strings" "time" + "ehang.io/nps/bridge" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/file" + "ehang.io/nps/server/proxy" + "ehang.io/nps/server/tool" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" - "github.com/cnlh/nps/bridge" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/server/proxy" - "github.com/cnlh/nps/server/tool" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/load" "github.com/shirou/gopsutil/mem" diff --git a/server/test/test.go b/server/test/test.go index 0a8fbfd..a30d03d 100644 --- a/server/test/test.go +++ b/server/test/test.go @@ -5,9 +5,9 @@ import ( "path/filepath" "strconv" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/file" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/file" ) func TestServerConfig() { diff --git a/server/tool/utils.go b/server/tool/utils.go index fb8fa55..09dfaf7 100644 --- a/server/tool/utils.go +++ b/server/tool/utils.go @@ -5,8 +5,8 @@ import ( "strconv" "time" + "ehang.io/nps/lib/common" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/common" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/load" "github.com/shirou/gopsutil/mem" diff --git a/web/controllers/auth.go b/web/controllers/auth.go index 3b6b4c5..9eb22ca 100644 --- a/web/controllers/auth.go +++ b/web/controllers/auth.go @@ -4,8 +4,8 @@ import ( "encoding/hex" "time" + "ehang.io/nps/lib/crypt" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/crypt" ) type AuthController struct { diff --git a/web/controllers/base.go b/web/controllers/base.go index 1ba5a07..426692f 100755 --- a/web/controllers/base.go +++ b/web/controllers/base.go @@ -7,11 +7,11 @@ import ( "strings" "time" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/crypt" + "ehang.io/nps/lib/file" + "ehang.io/nps/server" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/crypt" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/server" ) type BaseController struct { diff --git a/web/controllers/client.go b/web/controllers/client.go index 8a3ae31..52bcee8 100644 --- a/web/controllers/client.go +++ b/web/controllers/client.go @@ -1,11 +1,11 @@ package controllers import ( + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/file" + "ehang.io/nps/lib/rate" + "ehang.io/nps/server" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/lib/rate" - "github.com/cnlh/nps/server" ) type ClientController struct { diff --git a/web/controllers/index.go b/web/controllers/index.go index 5b60495..e28e49a 100755 --- a/web/controllers/index.go +++ b/web/controllers/index.go @@ -1,10 +1,10 @@ package controllers import ( - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/server" - "github.com/cnlh/nps/server/tool" - + "ehang.io/nps/lib/file" + "ehang.io/nps/server" + "ehang.io/nps/server/tool" + "github.com/astaxie/beego" ) diff --git a/web/controllers/login.go b/web/controllers/login.go index 39c5c55..5414325 100755 --- a/web/controllers/login.go +++ b/web/controllers/login.go @@ -6,10 +6,10 @@ import ( "sync" "time" + "ehang.io/nps/lib/common" + "ehang.io/nps/lib/file" + "ehang.io/nps/server" "github.com/astaxie/beego" - "github.com/cnlh/nps/lib/common" - "github.com/cnlh/nps/lib/file" - "github.com/cnlh/nps/server" ) type LoginController struct { diff --git a/web/routers/router.go b/web/routers/router.go index 31221eb..51ab97d 100755 --- a/web/routers/router.go +++ b/web/routers/router.go @@ -1,8 +1,8 @@ package routers import ( + "ehang.io/nps/web/controllers" "github.com/astaxie/beego" - "github.com/cnlh/nps/web/controllers" ) func Init() { diff --git a/web/static/page/error.html b/web/static/page/error.html index c063fc3..90f4cf4 100644 --- a/web/static/page/error.html +++ b/web/static/page/error.html @@ -5,6 +5,6 @@ nps error -404 not found,power by nps +404 not found,power by nps \ No newline at end of file diff --git a/web/views/login/index.html b/web/views/login/index.html index ffe89d0..fbe6488 100755 --- a/web/views/login/index.html +++ b/web/views/login/index.html @@ -37,7 +37,7 @@

    - goto nps + goto nps

    diff --git a/web/views/public/layout.html b/web/views/public/layout.html index a19cc62..04534f5 100755 --- a/web/views/public/layout.html +++ b/web/views/public/layout.html @@ -105,7 +105,7 @@