From 4720216e5ea085b3291c02c83aa81037c69cac9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 25 Apr 2017 15:14:19 +0200 Subject: [PATCH] tech: upgraded macaron & macaron inject, binding, session --- vendor/github.com/Unknwon/com/.gitignore | 24 -- vendor/github.com/Unknwon/com/README.md | 12 +- vendor/github.com/Unknwon/com/cmd_test.go | 140 -------- vendor/github.com/Unknwon/com/convert.go | 2 +- vendor/github.com/Unknwon/com/convert_test.go | 56 ---- vendor/github.com/Unknwon/com/dir_test.go | 58 ---- vendor/github.com/Unknwon/com/example_test.go | 299 ------------------ vendor/github.com/Unknwon/com/file_test.go | 61 ---- vendor/github.com/Unknwon/com/html_test.go | 35 -- vendor/github.com/Unknwon/com/http_test.go | 111 ------- vendor/github.com/Unknwon/com/math.go | 15 +- vendor/github.com/Unknwon/com/path.go | 6 +- vendor/github.com/Unknwon/com/path_test.go | 67 ---- vendor/github.com/Unknwon/com/regex_test.go | 70 ---- vendor/github.com/Unknwon/com/slice_test.go | 99 ------ vendor/github.com/Unknwon/com/string.go | 157 +++++++-- vendor/github.com/Unknwon/com/string_test.go | 82 ----- .../github.com/go-macaron/binding/.travis.yml | 14 - .../github.com/go-macaron/binding/binding.go | 50 +-- .../github.com/go-macaron/inject/.travis.yml | 14 - vendor/github.com/go-macaron/inject/inject.go | 80 ++++- .../github.com/go-macaron/session/.gitignore | 2 - .../github.com/go-macaron/session/.travis.yml | 14 - .../github.com/go-macaron/session/README.md | 4 +- vendor/github.com/go-macaron/session/file.go | 12 +- vendor/golang.org/x/crypto/LICENSE | 27 ++ vendor/golang.org/x/crypto/PATENTS | 22 ++ vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go | 77 +++++ vendor/gopkg.in/macaron.v1/.gitignore | 2 - vendor/gopkg.in/macaron.v1/.travis.yml | 13 - vendor/gopkg.in/macaron.v1/README.md | 14 +- vendor/gopkg.in/macaron.v1/context.go | 49 ++- vendor/gopkg.in/macaron.v1/logger.go | 18 +- vendor/gopkg.in/macaron.v1/macaron.go | 84 ++++- vendor/gopkg.in/macaron.v1/macaronlogo.png | Bin 70275 -> 88924 bytes vendor/gopkg.in/macaron.v1/render.go | 196 ++++++++++-- vendor/gopkg.in/macaron.v1/router.go | 22 +- vendor/gopkg.in/macaron.v1/static.go | 15 + vendor/vendor.json | 36 +++ 39 files changed, 740 insertions(+), 1319 deletions(-) delete mode 100644 vendor/github.com/Unknwon/com/.gitignore delete mode 100644 vendor/github.com/Unknwon/com/cmd_test.go delete mode 100644 vendor/github.com/Unknwon/com/convert_test.go delete mode 100644 vendor/github.com/Unknwon/com/dir_test.go delete mode 100644 vendor/github.com/Unknwon/com/example_test.go delete mode 100644 vendor/github.com/Unknwon/com/file_test.go delete mode 100644 vendor/github.com/Unknwon/com/html_test.go delete mode 100644 vendor/github.com/Unknwon/com/http_test.go delete mode 100644 vendor/github.com/Unknwon/com/path_test.go delete mode 100644 vendor/github.com/Unknwon/com/regex_test.go delete mode 100644 vendor/github.com/Unknwon/com/slice_test.go delete mode 100644 vendor/github.com/Unknwon/com/string_test.go delete mode 100644 vendor/github.com/go-macaron/binding/.travis.yml delete mode 100644 vendor/github.com/go-macaron/inject/.travis.yml delete mode 100644 vendor/github.com/go-macaron/session/.gitignore delete mode 100644 vendor/github.com/go-macaron/session/.travis.yml create mode 100644 vendor/golang.org/x/crypto/LICENSE create mode 100644 vendor/golang.org/x/crypto/PATENTS create mode 100644 vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go delete mode 100644 vendor/gopkg.in/macaron.v1/.gitignore delete mode 100644 vendor/gopkg.in/macaron.v1/.travis.yml diff --git a/vendor/github.com/Unknwon/com/.gitignore b/vendor/github.com/Unknwon/com/.gitignore deleted file mode 100644 index 0da157fe9ce..00000000000 --- a/vendor/github.com/Unknwon/com/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test -.idea - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.iml diff --git a/vendor/github.com/Unknwon/com/README.md b/vendor/github.com/Unknwon/com/README.md index 55d01d62137..8d821abd65e 100644 --- a/vendor/github.com/Unknwon/com/README.md +++ b/vendor/github.com/Unknwon/com/README.md @@ -1,7 +1,7 @@ -Common functions -=== +Common Functions +================ -[![Build Status](https://drone.io/github.com/Unknwon/com/status.png)](https://drone.io/github.com/Unknwon/com/latest) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/Unknwon/com) +[![Build Status](https://travis-ci.org/Unknwon/com.svg)](https://travis-ci.org/Unknwon/com) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/Unknwon/com) This is an open source project for commonly used functions for the Go programming language. @@ -17,8 +17,4 @@ Your contribute is welcome, but you have to check following steps after you adde 2. Make sure you wrote test cases with any possible condition for **all functions** in file `*_test.go`. 3. Make sure you wrote benchmarks for **all functions** in file `*_test.go`. 4. Make sure you wrote useful examples for **all functions** in file `example_test.go`. -5. Make sure you ran `go test -bench="."` and got **PASS** . - -## Performance - -See results on [drone.io](https://drone.io/github.com/Unknwon/com/latest) by `go test -bench="."`. +5. Make sure you ran `go test` and got **PASS** . diff --git a/vendor/github.com/Unknwon/com/cmd_test.go b/vendor/github.com/Unknwon/com/cmd_test.go deleted file mode 100644 index 97ad78f2e5c..00000000000 --- a/vendor/github.com/Unknwon/com/cmd_test.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "fmt" - "runtime" - "strings" - "testing" -) - -func TestColorLogS(t *testing.T) { - if runtime.GOOS != "windows" { - // Trace + path. - cls := ColorLogS("[TRAC] Trace level test with path( %s )", "/path/to/somethere") - clsR := fmt.Sprintf( - "[\033[%dmTRAC%s] Trace level test with path(\033[%dm%s%s)", - Blue, EndColor, Yellow, "/path/to/somethere", EndColor) - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Error + error. - cls = ColorLogS("[ERRO] Error level test with error[ %s ]", "test error") - clsR = fmt.Sprintf( - "[\033[%dmERRO%s] Error level test with error[\033[%dm%s%s]", - Red, EndColor, Red, "test error", EndColor) - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Warning + highlight. - cls = ColorLogS("[WARN] Warnning level test with highlight # %s #", "special offer!") - clsR = fmt.Sprintf( - "[\033[%dmWARN%s] Warnning level test with highlight \033[%dm%s%s", - Magenta, EndColor, Gray, "special offer!", EndColor) - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Success. - cls = ColorLogS("[SUCC] Success level test") - clsR = fmt.Sprintf( - "[\033[%dmSUCC%s] Success level test", - Green, EndColor) - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Default. - cls = ColorLogS("[INFO] Default level test") - clsR = fmt.Sprintf( - "[INFO] Default level test") - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - } else { - // Trace + path. - cls := ColorLogS("[TRAC] Trace level test with path( %s )", "/path/to/somethere") - clsR := fmt.Sprintf( - "[TRAC] Trace level test with path(%s)", - "/path/to/somethere") - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Error + error. - cls = ColorLogS("[ERRO] Error level test with error[ %s ]", "test error") - clsR = fmt.Sprintf( - "[ERRO] Error level test with error[%s]", - "test error") - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Warning + highlight. - cls = ColorLogS("[WARN] Warnning level test with highlight # %s #", "special offer!") - clsR = fmt.Sprintf( - "[WARN] Warnning level test with highlight %s", - "special offer!") - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Success. - cls = ColorLogS("[SUCC] Success level test") - clsR = fmt.Sprintf( - "[SUCC] Success level test") - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - - // Default. - cls = ColorLogS("[INFO] Default level test") - clsR = fmt.Sprintf( - "[INFO] Default level test") - if cls != clsR { - t.Errorf("ColorLogS:\n Expect => %s\n Got => %s\n", clsR, cls) - } - } -} - -func TestExecCmd(t *testing.T) { - stdout, stderr, err := ExecCmd("go", "help", "get") - if err != nil { - t.Errorf("ExecCmd:\n Expect => %v\n Got => %v\n", nil, err) - } else if len(stderr) != 0 { - t.Errorf("ExecCmd:\n Expect => %s\n Got => %s\n", "", stderr) - } else if !strings.HasPrefix(stdout, "usage: go get") { - t.Errorf("ExecCmd:\n Expect => %s\n Got => %s\n", "usage: go get", stdout) - } -} - -func BenchmarkColorLogS(b *testing.B) { - log := fmt.Sprintf( - "[WARN] This is a tesing log that should be colored, path( %s ),"+ - " highlight # %s #, error [ %s ].", - "path to somewhere", "highlighted content", "tesing error") - for i := 0; i < b.N; i++ { - ColorLogS(log) - } -} - -func BenchmarkExecCmd(b *testing.B) { - for i := 0; i < b.N; i++ { - ExecCmd("go", "help", "get") - } -} diff --git a/vendor/github.com/Unknwon/com/convert.go b/vendor/github.com/Unknwon/com/convert.go index 9c3af84aa18..25b3e0e5620 100644 --- a/vendor/github.com/Unknwon/com/convert.go +++ b/vendor/github.com/Unknwon/com/convert.go @@ -32,7 +32,7 @@ func (f StrTo) Uint8() (uint8, error) { } func (f StrTo) Int() (int, error) { - v, err := strconv.ParseInt(f.String(), 10, 32) + v, err := strconv.ParseInt(f.String(), 10, 0) return int(v), err } diff --git a/vendor/github.com/Unknwon/com/convert_test.go b/vendor/github.com/Unknwon/com/convert_test.go deleted file mode 100644 index e97e27f42e5..00000000000 --- a/vendor/github.com/Unknwon/com/convert_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "testing" - - . "github.com/smartystreets/goconvey/convey" -) - -func TestHexStr2int(t *testing.T) { - Convey("Convert hex format string to decimal", t, func() { - hexDecs := map[string]int{ - "1": 1, - "002": 2, - "011": 17, - "0a1": 161, - "35e": 862, - } - - for hex, dec := range hexDecs { - val, err := HexStr2int(hex) - So(err, ShouldBeNil) - So(val, ShouldEqual, dec) - } - }) -} - -func TestInt2HexStr(t *testing.T) { - Convey("Convert decimal to hex format string", t, func() { - decHexs := map[int]string{ - 1: "1", - 2: "2", - 17: "11", - 161: "a1", - 862: "35e", - } - - for dec, hex := range decHexs { - val := Int2HexStr(dec) - So(val, ShouldEqual, hex) - } - }) -} diff --git a/vendor/github.com/Unknwon/com/dir_test.go b/vendor/github.com/Unknwon/com/dir_test.go deleted file mode 100644 index c6fbf9d27d3..00000000000 --- a/vendor/github.com/Unknwon/com/dir_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "os" - "testing" - - . "github.com/smartystreets/goconvey/convey" -) - -func TestIsDir(t *testing.T) { - Convey("Check if given path is a directory", t, func() { - Convey("Pass a file name", func() { - So(IsDir("file.go"), ShouldEqual, false) - }) - Convey("Pass a directory name", func() { - So(IsDir("testdata"), ShouldEqual, true) - }) - Convey("Pass a invalid path", func() { - So(IsDir("foo"), ShouldEqual, false) - }) - }) -} - -func TestCopyDir(t *testing.T) { - Convey("Items of two slices should be same", t, func() { - s1, err := StatDir("testdata", true) - So(err, ShouldEqual, nil) - - err = CopyDir("testdata", "testdata2") - So(err, ShouldEqual, nil) - - s2, err := StatDir("testdata2", true) - os.RemoveAll("testdata2") - So(err, ShouldEqual, nil) - - So(CompareSliceStr(s1, s2), ShouldEqual, true) - }) -} - -func BenchmarkIsDir(b *testing.B) { - for i := 0; i < b.N; i++ { - IsDir("file.go") - } -} diff --git a/vendor/github.com/Unknwon/com/example_test.go b/vendor/github.com/Unknwon/com/example_test.go deleted file mode 100644 index bc1930bf84a..00000000000 --- a/vendor/github.com/Unknwon/com/example_test.go +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com_test - -import ( - "fmt" - "io/ioutil" - "net/http" - - "github.com/Unknwon/com" -) - -// ------------------------------ -// cmd.go -// ------------------------------ - -func ExampleColorLogS() { - coloredLog := com.ColorLogS(fmt.Sprintf( - "[WARN] This is a tesing log that should be colored, path( %s ),"+ - " highlight # %s #, error [ %s ].", - "path to somewhere", "highlighted content", "tesing error")) - fmt.Println(coloredLog) -} - -func ExampleColorLog() { - com.ColorLog(fmt.Sprintf( - "[WARN] This is a tesing log that should be colored, path( %s ),"+ - " highlight # %s #, error [ %s ].", - "path to somewhere", "highlighted content", "tesing error")) -} - -func ExampleExecCmd() { - stdout, stderr, err := com.ExecCmd("go", "help", "get") - fmt.Println(stdout, stderr, err) -} - -// ------------- END ------------ - -// ------------------------------ -// html.go -// ------------------------------ - -func ExampleHtml2JS() { - htm := "
Click me
\n\r" - js := string(com.Html2JS([]byte(htm))) - fmt.Println(js) - // Output:
Click me
\n -} - -// ------------- END ------------ - -// ------------------------------ -// path.go -// ------------------------------ - -func ExampleGetGOPATHs() { - gps := com.GetGOPATHs() - fmt.Println(gps) -} - -func ExampleGetSrcPath() { - srcPath, err := com.GetSrcPath("github.com/Unknwon/com") - if err != nil { - fmt.Println(err) - return - } - fmt.Println(srcPath) -} - -func ExampleHomeDir() { - hd, err := com.HomeDir() - fmt.Println(hd, err) -} - -// ------------- END ------------ - -// ------------------------------ -// file.go -// ------------------------------ - -func ExampleIsFile() { - if com.IsFile("file.go") { - fmt.Println("file.go exists") - return - } - fmt.Println("file.go is not a file or does not exist") -} - -func ExampleIsExist() { - if com.IsExist("file.go") { - fmt.Println("file.go exists") - return - } - fmt.Println("file.go does not exist") -} - -// ------------- END ------------ - -// ------------------------------ -// dir.go -// ------------------------------ - -func ExampleIsDir() { - if com.IsDir("files") { - fmt.Println("directory 'files' exists") - return - } - fmt.Println("'files' is not a directory or does not exist") -} - -// ------------- END ------------ - -// ------------------------------ -// string.go -// ------------------------------ - -func ExampleIsLetter() { - fmt.Println(com.IsLetter('1')) - fmt.Println(com.IsLetter('[')) - fmt.Println(com.IsLetter('a')) - fmt.Println(com.IsLetter('Z')) - // Output: - // false - // false - // true - // true -} - -func ExampleExpand() { - match := map[string]string{ - "domain": "gowalker.org", - "subdomain": "github.com", - } - s := "http://{domain}/{subdomain}/{0}/{1}" - fmt.Println(com.Expand(s, match, "Unknwon", "gowalker")) - // Output: http://gowalker.org/github.com/Unknwon/gowalker -} - -// ------------- END ------------ - -// ------------------------------ -// http.go -// ------------------------------ - -func ExampleHttpGet() ([]byte, error) { - rc, err := com.HttpGet(&http.Client{}, "http://gowalker.org", nil) - if err != nil { - return nil, err - } - p, err := ioutil.ReadAll(rc) - rc.Close() - return p, err -} - -func ExampleHttpGetBytes() ([]byte, error) { - p, err := com.HttpGetBytes(&http.Client{}, "http://gowalker.org", nil) - return p, err -} - -func ExampleHttpGetJSON() interface{} { - j := com.HttpGetJSON(&http.Client{}, "http://gowalker.org", nil) - return j -} - -type rawFile struct { - name string - rawURL string - data []byte -} - -func (rf *rawFile) Name() string { - return rf.name -} - -func (rf *rawFile) RawUrl() string { - return rf.rawURL -} - -func (rf *rawFile) Data() []byte { - return rf.data -} - -func (rf *rawFile) SetData(p []byte) { - rf.data = p -} - -func ExampleFetchFiles() { - // Code that should be outside of your function body. - // type rawFile struct { - // name string - // rawURL string - // data []byte - // } - - // func (rf *rawFile) Name() string { - // return rf.name - // } - - // func (rf *rawFile) RawUrl() string { - // return rf.rawURL - // } - - // func (rf *rawFile) Data() []byte { - // return rf.data - // } - - // func (rf *rawFile) SetData(p []byte) { - // rf.data = p - // } - - files := []com.RawFile{ - &rawFile{rawURL: "http://example.com"}, - &rawFile{rawURL: "http://example.com/foo"}, - } - err := com.FetchFiles(&http.Client{}, files, nil) - fmt.Println(err, len(files[0].Data()), len(files[1].Data())) -} - -func ExampleFetchFilesCurl() { - // Code that should be outside of your function body. - // type rawFile struct { - // name string - // rawURL string - // data []byte - // } - - // func (rf *rawFile) Name() string { - // return rf.name - // } - - // func (rf *rawFile) RawUrl() string { - // return rf.rawURL - // } - - // func (rf *rawFile) Data() []byte { - // return rf.data - // } - - // func (rf *rawFile) SetData(p []byte) { - // rf.data = p - // } - - files := []com.RawFile{ - &rawFile{rawURL: "http://example.com"}, - &rawFile{rawURL: "http://example.com/foo"}, - } - err := com.FetchFilesCurl(files) - fmt.Println(err, len(files[0].Data()), len(files[1].Data())) -} - -// ------------- END ------------ - -// ------------------------------ -// regex.go -// ------------------------------ - -func ExampleIsEmail() { - fmt.Println(com.IsEmail("test@example.com")) - fmt.Println(com.IsEmail("@example.com")) - // Output: - // true - // false -} - -func ExampleIsUrl() { - fmt.Println(com.IsUrl("http://example.com")) - fmt.Println(com.IsUrl("http//example.com")) - // Output: - // true - // false -} - -// ------------- END ------------ - -// ------------------------------ -// slice.go -// ------------------------------ - -func ExampleAppendStr() { - s := []string{"a"} - s = com.AppendStr(s, "a") - s = com.AppendStr(s, "b") - fmt.Println(s) - // Output: [a b] -} - -// ------------- END ------------ diff --git a/vendor/github.com/Unknwon/com/file_test.go b/vendor/github.com/Unknwon/com/file_test.go deleted file mode 100644 index 4ff00dcd2d9..00000000000 --- a/vendor/github.com/Unknwon/com/file_test.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "testing" - - . "github.com/smartystreets/goconvey/convey" -) - -func TestIsFile(t *testing.T) { - if !IsFile("file.go") { - t.Errorf("IsExist:\n Expect => %v\n Got => %v\n", true, false) - } - - if IsFile("testdata") { - t.Errorf("IsExist:\n Expect => %v\n Got => %v\n", false, true) - } - - if IsFile("files.go") { - t.Errorf("IsExist:\n Expect => %v\n Got => %v\n", false, true) - } -} - -func TestIsExist(t *testing.T) { - Convey("Check if file or directory exists", t, func() { - Convey("Pass a file name that exists", func() { - So(IsExist("file.go"), ShouldEqual, true) - }) - Convey("Pass a directory name that exists", func() { - So(IsExist("testdata"), ShouldEqual, true) - }) - Convey("Pass a directory name that does not exist", func() { - So(IsExist(".hg"), ShouldEqual, false) - }) - }) -} - -func BenchmarkIsFile(b *testing.B) { - for i := 0; i < b.N; i++ { - IsFile("file.go") - } -} - -func BenchmarkIsExist(b *testing.B) { - for i := 0; i < b.N; i++ { - IsExist("file.go") - } -} diff --git a/vendor/github.com/Unknwon/com/html_test.go b/vendor/github.com/Unknwon/com/html_test.go deleted file mode 100644 index 2c9f4047870..00000000000 --- a/vendor/github.com/Unknwon/com/html_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "testing" -) - -func TestHtml2JS(t *testing.T) { - htm := "
Click me
\n\r" - js := string(Html2JS([]byte(htm))) - jsR := `
Click me
\n` - if js != jsR { - t.Errorf("Html2JS:\n Expect => %s\n Got => %s\n", jsR, js) - } -} - -func BenchmarkHtml2JS(b *testing.B) { - htm := "
Click me
\n\r" - for i := 0; i < b.N; i++ { - Html2JS([]byte(htm)) - } -} diff --git a/vendor/github.com/Unknwon/com/http_test.go b/vendor/github.com/Unknwon/com/http_test.go deleted file mode 100644 index 902b6607a5d..00000000000 --- a/vendor/github.com/Unknwon/com/http_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "io/ioutil" - "net/http" - "strings" - "testing" -) - -var examplePrefix = ` - - - Example Domain -` - -func TestHttpGet(t *testing.T) { - // 200. - rc, err := HttpGet(&http.Client{}, "http://example.com", nil) - if err != nil { - t.Fatalf("HttpGet:\n Expect => %v\n Got => %s\n", nil, err) - } - p, err := ioutil.ReadAll(rc) - if err != nil { - t.Errorf("HttpGet:\n Expect => %v\n Got => %s\n", nil, err) - } - s := string(p) - if !strings.HasPrefix(s, examplePrefix) { - t.Errorf("HttpGet:\n Expect => %s\n Got => %s\n", examplePrefix, s) - } -} - -func TestHttpGetBytes(t *testing.T) { - p, err := HttpGetBytes(&http.Client{}, "http://example.com", nil) - if err != nil { - t.Errorf("HttpGetBytes:\n Expect => %v\n Got => %s\n", nil, err) - } - s := string(p) - if !strings.HasPrefix(s, examplePrefix) { - t.Errorf("HttpGet:\n Expect => %s\n Got => %s\n", examplePrefix, s) - } -} - -func TestHttpGetJSON(t *testing.T) { - -} - -type rawFile struct { - name string - rawURL string - data []byte -} - -func (rf *rawFile) Name() string { - return rf.name -} - -func (rf *rawFile) RawUrl() string { - return rf.rawURL -} - -func (rf *rawFile) Data() []byte { - return rf.data -} - -func (rf *rawFile) SetData(p []byte) { - rf.data = p -} - -func TestFetchFiles(t *testing.T) { - files := []RawFile{ - &rawFile{rawURL: "http://example.com"}, - &rawFile{rawURL: "http://example.com"}, - } - err := FetchFiles(&http.Client{}, files, nil) - if err != nil { - t.Errorf("FetchFiles:\n Expect => %v\n Got => %s\n", nil, err) - } else if len(files[0].Data()) != 1270 { - t.Errorf("FetchFiles:\n Expect => %d\n Got => %d\n", 1270, len(files[0].Data())) - } else if len(files[1].Data()) != 1270 { - t.Errorf("FetchFiles:\n Expect => %d\n Got => %d\n", 1270, len(files[1].Data())) - } -} - -func TestFetchFilesCurl(t *testing.T) { - files := []RawFile{ - &rawFile{rawURL: "http://example.com"}, - &rawFile{rawURL: "http://example.com"}, - } - err := FetchFilesCurl(files) - if err != nil { - t.Errorf("FetchFilesCurl:\n Expect => %v\n Got => %s\n", nil, err) - } else if len(files[0].Data()) != 1270 { - t.Errorf("FetchFilesCurl:\n Expect => %d\n Got => %d\n", 1270, len(files[0].Data())) - } else if len(files[1].Data()) != 1270 { - t.Errorf("FetchFilesCurl:\n Expect => %d\n Got => %d\n", 1270, len(files[1].Data())) - } -} diff --git a/vendor/github.com/Unknwon/com/math.go b/vendor/github.com/Unknwon/com/math.go index 70b7e251fb4..99c56b65947 100644 --- a/vendor/github.com/Unknwon/com/math.go +++ b/vendor/github.com/Unknwon/com/math.go @@ -14,11 +14,16 @@ package com -// PowInt is int type of math.Pow function. +// PowInt is int type of math.Pow function. func PowInt(x int, y int) int { - num := 1 - for i := 0; i < y; i++ { - num *= x + if y <= 0 { + return 1 + } else { + if y % 2 == 0 { + sqrt := PowInt(x, y/2) + return sqrt * sqrt + } else { + return PowInt(x, y-1) * x + } } - return num } diff --git a/vendor/github.com/Unknwon/com/path.go b/vendor/github.com/Unknwon/com/path.go index a501c8538d8..b1e860def42 100644 --- a/vendor/github.com/Unknwon/com/path.go +++ b/vendor/github.com/Unknwon/com/path.go @@ -64,9 +64,9 @@ func GetSrcPath(importPath string) (appPath string, err error) { // it returns error when the variable does not exist. func HomeDir() (home string, err error) { if runtime.GOOS == "windows" { - home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") - if home == "" { - home = os.Getenv("USERPROFILE") + home = os.Getenv("USERPROFILE") + if len(home) == 0 { + home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") } } else { home = os.Getenv("HOME") diff --git a/vendor/github.com/Unknwon/com/path_test.go b/vendor/github.com/Unknwon/com/path_test.go deleted file mode 100644 index da5488d4400..00000000000 --- a/vendor/github.com/Unknwon/com/path_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "os" - "runtime" - "testing" -) - -func TestGetGOPATHs(t *testing.T) { - var gpsR []string - - if runtime.GOOS != "windows" { - gpsR = []string{"path/to/gopath1", "path/to/gopath2", "path/to/gopath3"} - os.Setenv("GOPATH", "path/to/gopath1:path/to/gopath2:path/to/gopath3") - } else { - gpsR = []string{"path/to/gopath1", "path/to/gopath2", "path/to/gopath3"} - os.Setenv("GOPATH", "path\\to\\gopath1;path\\to\\gopath2;path\\to\\gopath3") - } - - gps := GetGOPATHs() - if !CompareSliceStr(gps, gpsR) { - t.Errorf("GetGOPATHs:\n Expect => %s\n Got => %s\n", gpsR, gps) - } -} - -func TestGetSrcPath(t *testing.T) { - -} - -func TestHomeDir(t *testing.T) { - _, err := HomeDir() - if err != nil { - t.Errorf("HomeDir:\n Expect => %v\n Got => %s\n", nil, err) - } -} - -func BenchmarkGetGOPATHs(b *testing.B) { - for i := 0; i < b.N; i++ { - GetGOPATHs() - } -} - -func BenchmarkGetSrcPath(b *testing.B) { - for i := 0; i < b.N; i++ { - GetSrcPath("github.com/Unknwon/com") - } -} - -func BenchmarkHomeDir(b *testing.B) { - for i := 0; i < b.N; i++ { - HomeDir() - } -} diff --git a/vendor/github.com/Unknwon/com/regex_test.go b/vendor/github.com/Unknwon/com/regex_test.go deleted file mode 100644 index b027bd1c8de..00000000000 --- a/vendor/github.com/Unknwon/com/regex_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "testing" -) - -func TestIsEmail(t *testing.T) { - emails := map[string]bool{ - `test@example.com`: true, - `single-character@b.org`: true, - `uncommon_address@test.museum`: true, - `local@sld.UPPER`: true, - `@missing.org`: false, - `missing@.com`: false, - `missing@qq.`: false, - `wrong-ip@127.1.1.1.26`: false, - } - for e, r := range emails { - b := IsEmail(e) - if b != r { - t.Errorf("IsEmail:\n Expect => %v\n Got => %v\n", r, b) - } - } -} - -func TestIsUrl(t *testing.T) { - urls := map[string]bool{ - "http://www.example.com": true, - "http://example.com": true, - "http://example.com?user=test&password=test": true, - "http://example.com?user=test#login": true, - "ftp://example.com": true, - "https://example.com": true, - "htp://example.com": false, - "http//example.com": false, - "http://example": true, - } - for u, r := range urls { - b := IsUrl(u) - if b != r { - t.Errorf("IsUrl:\n Expect => %v\n Got => %v\n", r, b) - } - } -} - -func BenchmarkIsEmail(b *testing.B) { - for i := 0; i < b.N; i++ { - IsEmail("test@example.com") - } -} - -func BenchmarkIsUrl(b *testing.B) { - for i := 0; i < b.N; i++ { - IsEmail("http://example.com") - } -} diff --git a/vendor/github.com/Unknwon/com/slice_test.go b/vendor/github.com/Unknwon/com/slice_test.go deleted file mode 100644 index 6a94156c231..00000000000 --- a/vendor/github.com/Unknwon/com/slice_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "fmt" - "testing" - - . "github.com/smartystreets/goconvey/convey" -) - -func TestAppendStr(t *testing.T) { - Convey("Append a string to a slice with no duplicates", t, func() { - s := []string{"a"} - - Convey("Append a string that does not exist in slice", func() { - s = AppendStr(s, "b") - So(len(s), ShouldEqual, 2) - }) - - Convey("Append a string that does exist in slice", func() { - s = AppendStr(s, "b") - So(len(s), ShouldEqual, 2) - }) - }) -} - -func TestCompareSliceStr(t *testing.T) { - Convey("Compares two 'string' type slices with elements and order", t, func() { - Convey("Compare two slices that do have same elements and order", func() { - So(CompareSliceStr( - []string{"1", "2", "3"}, []string{"1", "2", "3"}), ShouldBeTrue) - }) - - Convey("Compare two slices that do have same elements but does not have same order", func() { - So(!CompareSliceStr( - []string{"2", "1", "3"}, []string{"1", "2", "3"}), ShouldBeTrue) - }) - - Convey("Compare two slices that have different number of elements", func() { - So(!CompareSliceStr( - []string{"2", "1"}, []string{"1", "2", "3"}), ShouldBeTrue) - }) - }) -} - -func TestCompareSliceStrU(t *testing.T) { - Convey("Compare two 'string' type slices with elements and ignore the order", t, func() { - Convey("Compare two slices that do have same elements and order", func() { - So(CompareSliceStrU( - []string{"1", "2", "3"}, []string{"1", "2", "3"}), ShouldBeTrue) - }) - - Convey("Compare two slices that do have same elements but does not have same order", func() { - So(CompareSliceStrU( - []string{"2", "1", "3"}, []string{"1", "2", "3"}), ShouldBeTrue) - }) - - Convey("Compare two slices that have different number of elements", func() { - So(!CompareSliceStrU( - []string{"2", "1"}, []string{"1", "2", "3"}), ShouldBeTrue) - }) - }) -} - -func BenchmarkAppendStr(b *testing.B) { - s := []string{"a"} - for i := 0; i < b.N; i++ { - s = AppendStr(s, fmt.Sprint(b.N%3)) - } -} - -func BenchmarkCompareSliceStr(b *testing.B) { - s1 := []string{"1", "2", "3"} - s2 := []string{"1", "2", "3"} - for i := 0; i < b.N; i++ { - CompareSliceStr(s1, s2) - } -} - -func BenchmarkCompareSliceStrU(b *testing.B) { - s1 := []string{"1", "4", "2", "3"} - s2 := []string{"1", "2", "3", "4"} - for i := 0; i < b.N; i++ { - CompareSliceStrU(s1, s2) - } -} diff --git a/vendor/github.com/Unknwon/com/string.go b/vendor/github.com/Unknwon/com/string.go index 1ebb9014040..7080d174a81 100644 --- a/vendor/github.com/Unknwon/com/string.go +++ b/vendor/github.com/Unknwon/com/string.go @@ -15,53 +15,66 @@ package com import ( + "bytes" "crypto/aes" "crypto/cipher" "crypto/rand" - "encoding/base64" "errors" - "io" r "math/rand" "strconv" "strings" "time" + "unicode" + "unicode/utf8" ) -// AESEncrypt encrypts text and given key with AES. -func AESEncrypt(key, text []byte) ([]byte, error) { +// AESGCMEncrypt encrypts plaintext with the given key using AES in GCM mode. +func AESGCMEncrypt(key, plaintext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } - b := base64.StdEncoding.EncodeToString(text) - ciphertext := make([]byte, aes.BlockSize+len(b)) - iv := ciphertext[:aes.BlockSize] - if _, err := io.ReadFull(rand.Reader, iv); err != nil { + + gcm, err := cipher.NewGCM(block) + if err != nil { return nil, err } - cfb := cipher.NewCFBEncrypter(block, iv) - cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b)) - return ciphertext, nil + + nonce := make([]byte, gcm.NonceSize()) + if _, err := rand.Read(nonce); err != nil { + return nil, err + } + + ciphertext := gcm.Seal(nil, nonce, plaintext, nil) + return append(nonce, ciphertext...), nil } -// AESDecrypt decrypts text and given key with AES. -func AESDecrypt(key, text []byte) ([]byte, error) { +// AESGCMDecrypt decrypts ciphertext with the given key using AES in GCM mode. +func AESGCMDecrypt(key, ciphertext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } - if len(text) < aes.BlockSize { - return nil, errors.New("ciphertext too short") - } - iv := text[:aes.BlockSize] - text = text[aes.BlockSize:] - cfb := cipher.NewCFBDecrypter(block, iv) - cfb.XORKeyStream(text, text) - data, err := base64.StdEncoding.DecodeString(string(text)) + + gcm, err := cipher.NewGCM(block) if err != nil { return nil, err } - return data, nil + + size := gcm.NonceSize() + if len(ciphertext)-size <= 0 { + return nil, errors.New("Ciphertext is empty") + } + + nonce := ciphertext[:size] + ciphertext = ciphertext[size:] + + plainText, err := gcm.Open(nil, nonce, ciphertext, nil) + if err != nil { + return nil, err + } + + return plainText, nil } // IsLetter returns true if the 'l' is an English letter. @@ -138,3 +151,103 @@ func RandomCreateBytes(n int, alphabets ...byte) []byte { } return bytes } + +// ToSnakeCase can convert all upper case characters in a string to +// underscore format. +// +// Some samples. +// "FirstName" => "first_name" +// "HTTPServer" => "http_server" +// "NoHTTPS" => "no_https" +// "GO_PATH" => "go_path" +// "GO PATH" => "go_path" // space is converted to underscore. +// "GO-PATH" => "go_path" // hyphen is converted to underscore. +// +// From https://github.com/huandu/xstrings +func ToSnakeCase(str string) string { + if len(str) == 0 { + return "" + } + + buf := &bytes.Buffer{} + var prev, r0, r1 rune + var size int + + r0 = '_' + + for len(str) > 0 { + prev = r0 + r0, size = utf8.DecodeRuneInString(str) + str = str[size:] + + switch { + case r0 == utf8.RuneError: + buf.WriteByte(byte(str[0])) + + case unicode.IsUpper(r0): + if prev != '_' { + buf.WriteRune('_') + } + + buf.WriteRune(unicode.ToLower(r0)) + + if len(str) == 0 { + break + } + + r0, size = utf8.DecodeRuneInString(str) + str = str[size:] + + if !unicode.IsUpper(r0) { + buf.WriteRune(r0) + break + } + + // find next non-upper-case character and insert `_` properly. + // it's designed to convert `HTTPServer` to `http_server`. + // if there are more than 2 adjacent upper case characters in a word, + // treat them as an abbreviation plus a normal word. + for len(str) > 0 { + r1 = r0 + r0, size = utf8.DecodeRuneInString(str) + str = str[size:] + + if r0 == utf8.RuneError { + buf.WriteRune(unicode.ToLower(r1)) + buf.WriteByte(byte(str[0])) + break + } + + if !unicode.IsUpper(r0) { + if r0 == '_' || r0 == ' ' || r0 == '-' { + r0 = '_' + + buf.WriteRune(unicode.ToLower(r1)) + } else { + buf.WriteRune('_') + buf.WriteRune(unicode.ToLower(r1)) + buf.WriteRune(r0) + } + + break + } + + buf.WriteRune(unicode.ToLower(r1)) + } + + if len(str) == 0 || r0 == '_' { + buf.WriteRune(unicode.ToLower(r0)) + break + } + + default: + if r0 == ' ' || r0 == '-' { + r0 = '_' + } + + buf.WriteRune(r0) + } + } + + return buf.String() +} diff --git a/vendor/github.com/Unknwon/com/string_test.go b/vendor/github.com/Unknwon/com/string_test.go deleted file mode 100644 index ed90977b04a..00000000000 --- a/vendor/github.com/Unknwon/com/string_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2013 com authors -// -// Licensed under the Apache License, Version 2.0 (the "License"): you may -// not use this file except in compliance with the License. You may obtain -// a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. - -package com - -import ( - "testing" -) - -func TestIsLetter(t *testing.T) { - if IsLetter('1') { - t.Errorf("IsLetter:\n Expect => %v\n Got => %v\n", false, true) - } - - if IsLetter('[') { - t.Errorf("IsLetter:\n Expect => %v\n Got => %v\n", false, true) - } - - if !IsLetter('a') { - t.Errorf("IsLetter:\n Expect => %v\n Got => %v\n", true, false) - } - - if !IsLetter('Z') { - t.Errorf("IsLetter:\n Expect => %v\n Got => %v\n", true, false) - } -} - -func TestExpand(t *testing.T) { - match := map[string]string{ - "domain": "gowalker.org", - "subdomain": "github.com", - } - s := "http://{domain}/{subdomain}/{0}/{1}" - sR := "http://gowalker.org/github.com/Unknwon/gowalker" - if Expand(s, match, "Unknwon", "gowalker") != sR { - t.Errorf("Expand:\n Expect => %s\n Got => %s\n", sR, s) - } -} - -func TestReverse(t *testing.T) { - if Reverse("abcdefg") != "gfedcba" { - t.Errorf("Reverse:\n Except => %s\n Got =>%s\n", "gfedcba", Reverse("abcdefg")) - } - if Reverse("上善若水厚德载物") != "物载德厚水若善上" { - t.Errorf("Reverse:\n Except => %s\n Got =>%s\n", "物载德厚水若善上", Reverse("上善若水厚德载物")) - } -} - -func BenchmarkIsLetter(b *testing.B) { - for i := 0; i < b.N; i++ { - IsLetter('a') - } -} - -func BenchmarkExpand(b *testing.B) { - match := map[string]string{ - "domain": "gowalker.org", - "subdomain": "github.com", - } - s := "http://{domain}/{subdomain}/{0}/{1}" - for i := 0; i < b.N; i++ { - Expand(s, match, "Unknwon", "gowalker") - } -} - -func BenchmarkReverse(b *testing.B) { - s := "abscef中文" - for i := 0; i < b.N; i++ { - Reverse(s) - } -} diff --git a/vendor/github.com/go-macaron/binding/.travis.yml b/vendor/github.com/go-macaron/binding/.travis.yml deleted file mode 100644 index 2774fb35d50..00000000000 --- a/vendor/github.com/go-macaron/binding/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: false -language: go - -go: - - 1.3 - - 1.4 - - 1.5 - - tip - -script: go test -v -cover -race - -notifications: - email: - - u@gogs.io diff --git a/vendor/github.com/go-macaron/binding/binding.go b/vendor/github.com/go-macaron/binding/binding.go index 4b958ec964d..dbd7beb45f6 100644 --- a/vendor/github.com/go-macaron/binding/binding.go +++ b/vendor/github.com/go-macaron/binding/binding.go @@ -32,7 +32,7 @@ import ( "gopkg.in/macaron.v1" ) -const _VERSION = "0.2.0" +const _VERSION = "0.3.2" func Version() string { return _VERSION @@ -145,7 +145,7 @@ func Form(formStruct interface{}, ifacePtr ...interface{}) macaron.Handler { if parseErr != nil { errors.Add([]string{}, ERR_DESERIALIZATION, parseErr.Error()) } - mapForm(formStruct, ctx.Req.Form, nil, errors) + errors = mapForm(formStruct, ctx.Req.Form, nil, errors) validateAndMap(formStruct, ctx, errors, ifacePtr...) } } @@ -185,7 +185,7 @@ func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) macaron.Hand ctx.Req.MultipartForm = form } } - mapForm(formStruct, ctx.Req.MultipartForm.Value, ctx.Req.MultipartForm.File, errors) + errors = mapForm(formStruct, ctx.Req.MultipartForm.Value, ctx.Req.MultipartForm.File, errors) validateAndMap(formStruct, ctx, errors, ifacePtr...) } } @@ -243,10 +243,10 @@ func Validate(obj interface{}) macaron.Handler { } var ( - alphaDashPattern = regexp.MustCompile("[^\\d\\w-_]") - alphaDashDotPattern = regexp.MustCompile("[^\\d\\w-_\\.]") - emailPattern = regexp.MustCompile("[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[a-zA-Z0-9](?:[\\w-]*[\\w])?") - urlPattern = regexp.MustCompile(`(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`) + AlphaDashPattern = regexp.MustCompile("[^\\d\\w-_]") + AlphaDashDotPattern = regexp.MustCompile("[^\\d\\w-_\\.]") + EmailPattern = regexp.MustCompile("[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[a-zA-Z0-9](?:[\\w-]*[\\w])?") + URLPattern = regexp.MustCompile(`(http|https):\/\/(?:\\S+(?::\\S*)?@)?[\w\-_]+(\.[\w\-_]+)*([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`) ) type ( @@ -255,7 +255,7 @@ type ( // IsMatch checks if rule matches. IsMatch func(string) bool // IsValid applies validation rule to condition. - IsValid func(Errors, string, interface{}) bool + IsValid func(Errors, string, interface{}) (bool, Errors) } // RuleMapper represents a validation rule mapper, // it allwos users to add custom validation rules. @@ -361,12 +361,12 @@ VALIDATE_RULES: break VALIDATE_RULES } case rule == "AlphaDash": - if alphaDashPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { + if AlphaDashPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { errors.Add([]string{field.Name}, ERR_ALPHA_DASH, "AlphaDash") break VALIDATE_RULES } case rule == "AlphaDashDot": - if alphaDashDotPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { + if AlphaDashDotPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { errors.Add([]string{field.Name}, ERR_ALPHA_DASH_DOT, "AlphaDashDot") break VALIDATE_RULES } @@ -414,7 +414,7 @@ VALIDATE_RULES: break VALIDATE_RULES } case rule == "Email": - if !emailPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { + if !EmailPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { errors.Add([]string{field.Name}, ERR_EMAIL, "Email") break VALIDATE_RULES } @@ -422,7 +422,7 @@ VALIDATE_RULES: str := fmt.Sprintf("%v", fieldValue) if len(str) == 0 { continue - } else if !urlPattern.MatchString(str) { + } else if !URLPattern.MatchString(str) { errors.Add([]string{field.Name}, ERR_URL, "Url") break VALIDATE_RULES } @@ -449,7 +449,7 @@ VALIDATE_RULES: case strings.HasPrefix(rule, "Default("): if reflect.DeepEqual(zero, fieldValue) { if fieldVal.CanAddr() { - setWithProperType(field.Type.Kind(), rule[8:len(rule)-1], fieldVal, field.Tag.Get("form"), errors) + errors = setWithProperType(field.Type.Kind(), rule[8:len(rule)-1], fieldVal, field.Tag.Get("form"), errors) } else { errors.Add([]string{field.Name}, ERR_EXCLUDE, "Default") break VALIDATE_RULES @@ -457,9 +457,13 @@ VALIDATE_RULES: } default: // Apply custom validation rules. + var isValid bool for i := range ruleMapper { - if ruleMapper[i].IsMatch(rule) && !ruleMapper[i].IsValid(errors, field.Name, fieldValue) { - break VALIDATE_RULES + if ruleMapper[i].IsMatch(rule) { + isValid, errors = ruleMapper[i].IsValid(errors, field.Name, fieldValue) + if !isValid { + break VALIDATE_RULES + } } } } @@ -493,7 +497,7 @@ func SetNameMapper(nm NameMapper) { // Takes values from the form data and puts them into a struct func mapForm(formStruct reflect.Value, form map[string][]string, - formfile map[string][]*multipart.FileHeader, errors Errors) { + formfile map[string][]*multipart.FileHeader, errors Errors) Errors { if formStruct.Kind() == reflect.Ptr { formStruct = formStruct.Elem() @@ -506,12 +510,12 @@ func mapForm(formStruct reflect.Value, form map[string][]string, if typeField.Type.Kind() == reflect.Ptr && typeField.Anonymous { structField.Set(reflect.New(typeField.Type.Elem())) - mapForm(structField.Elem(), form, formfile, errors) + errors = mapForm(structField.Elem(), form, formfile, errors) if reflect.DeepEqual(structField.Elem().Interface(), reflect.Zero(structField.Elem().Type()).Interface()) { structField.Set(reflect.Zero(structField.Type())) } } else if typeField.Type.Kind() == reflect.Struct { - mapForm(structField, form, formfile, errors) + errors = mapForm(structField, form, formfile, errors) } inputFieldName := parseFormName(typeField.Name, typeField.Tag.Get("form")) @@ -526,11 +530,11 @@ func mapForm(formStruct reflect.Value, form map[string][]string, sliceOf := structField.Type().Elem().Kind() slice := reflect.MakeSlice(structField.Type(), numElems, numElems) for i := 0; i < numElems; i++ { - setWithProperType(sliceOf, inputValue[i], slice.Index(i), inputFieldName, errors) + errors = setWithProperType(sliceOf, inputValue[i], slice.Index(i), inputFieldName, errors) } formStruct.Field(i).Set(slice) } else { - setWithProperType(typeField.Type.Kind(), inputValue[0], structField, inputFieldName, errors) + errors = setWithProperType(typeField.Type.Kind(), inputValue[0], structField, inputFieldName, errors) } continue } @@ -551,13 +555,14 @@ func mapForm(formStruct reflect.Value, form map[string][]string, structField.Set(reflect.ValueOf(inputFile[0])) } } + return errors } // This sets the value in a struct of an indeterminate type to the // matching value from the request (via Form middleware) in the // same type, so that not all deserialized values have to be strings. // Supported types are string, int, float, and bool. -func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors Errors) { +func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors Errors) Errors { switch valueKind { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if val == "" { @@ -582,7 +587,7 @@ func setWithProperType(valueKind reflect.Kind, val string, structField reflect.V case reflect.Bool: if val == "on" { structField.SetBool(true) - return + break } if val == "" { @@ -617,6 +622,7 @@ func setWithProperType(valueKind reflect.Kind, val string, structField reflect.V case reflect.String: structField.SetString(val) } + return errors } // Don't pass in pointers to bind to. Can lead to bugs. diff --git a/vendor/github.com/go-macaron/inject/.travis.yml b/vendor/github.com/go-macaron/inject/.travis.yml deleted file mode 100644 index 2774fb35d50..00000000000 --- a/vendor/github.com/go-macaron/inject/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: false -language: go - -go: - - 1.3 - - 1.4 - - 1.5 - - tip - -script: go test -v -cover -race - -notifications: - email: - - u@gogs.io diff --git a/vendor/github.com/go-macaron/inject/inject.go b/vendor/github.com/go-macaron/inject/inject.go index b4a6ea45fe7..1c1f98eaaa0 100644 --- a/vendor/github.com/go-macaron/inject/inject.go +++ b/vendor/github.com/go-macaron/inject/inject.go @@ -50,6 +50,34 @@ type Invoker interface { Invoke(interface{}) ([]reflect.Value, error) } +// FastInvoker represents an interface in order to avoid the calling function via reflection. +// +// example: +// type handlerFuncHandler func(http.ResponseWriter, *http.Request) error +// func (f handlerFuncHandler)Invoke([]interface{}) ([]reflect.Value, error){ +// ret := f(p[0].(http.ResponseWriter), p[1].(*http.Request)) +// return []reflect.Value{reflect.ValueOf(ret)}, nil +// } +// +// type funcHandler func(int, string) +// func (f funcHandler)Invoke([]interface{}) ([]reflect.Value, error){ +// f(p[0].(int), p[1].(string)) +// return nil, nil +// } +type FastInvoker interface { + // Invoke attempts to call the ordinary functions. If f is a function + // with the appropriate signature, f.Invoke([]interface{}) is a Call that calls f. + // Returns a slice of reflect.Value representing the returned values of the function. + // Returns an error if the injection fails. + Invoke([]interface{}) ([]reflect.Value, error) +} + +// IsFastInvoker check interface is FastInvoker +func IsFastInvoker(h interface{}) bool { + _, ok := h.(FastInvoker) + return ok +} + // TypeMapper represents an interface for mapping interface{} values based on type. type TypeMapper interface { // Maps the interface{} value based on its immediate type from reflect.TypeOf. @@ -102,18 +130,50 @@ func New() Injector { // It panics if f is not a function func (inj *injector) Invoke(f interface{}) ([]reflect.Value, error) { t := reflect.TypeOf(f) - - var in = make([]reflect.Value, t.NumIn()) //Panic if t is not kind of Func - for i := 0; i < t.NumIn(); i++ { - argType := t.In(i) - val := inj.GetVal(argType) - if !val.IsValid() { - return nil, fmt.Errorf("Value not found for type %v", argType) - } - - in[i] = val + switch v := f.(type) { + case FastInvoker: + return inj.fastInvoke(v, t, t.NumIn()) + default: + return inj.callInvoke(f, t, t.NumIn()) } +} +func (inj *injector) fastInvoke(f FastInvoker, t reflect.Type, numIn int) ([]reflect.Value, error) { + var in []interface{} + if numIn > 0 { + in = make([]interface{}, numIn) // Panic if t is not kind of Func + var argType reflect.Type + var val reflect.Value + for i := 0; i < numIn; i++ { + argType = t.In(i) + val = inj.GetVal(argType) + if !val.IsValid() { + return nil, fmt.Errorf("Value not found for type %v", argType) + } + + in[i] = val.Interface() + } + } + return f.Invoke(in) +} + +// callInvoke reflect.Value.Call +func (inj *injector) callInvoke(f interface{}, t reflect.Type, numIn int) ([]reflect.Value, error) { + var in []reflect.Value + if numIn > 0 { + in = make([]reflect.Value, numIn) + var argType reflect.Type + var val reflect.Value + for i := 0; i < numIn; i++ { + argType = t.In(i) + val = inj.GetVal(argType) + if !val.IsValid() { + return nil, fmt.Errorf("Value not found for type %v", argType) + } + + in[i] = val + } + } return reflect.ValueOf(f).Call(in), nil } diff --git a/vendor/github.com/go-macaron/session/.gitignore b/vendor/github.com/go-macaron/session/.gitignore deleted file mode 100644 index 9297dbcd7c4..00000000000 --- a/vendor/github.com/go-macaron/session/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -ledis/tmp.db -nodb/tmp.db \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/.travis.yml b/vendor/github.com/go-macaron/session/.travis.yml deleted file mode 100644 index 2774fb35d50..00000000000 --- a/vendor/github.com/go-macaron/session/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: false -language: go - -go: - - 1.3 - - 1.4 - - 1.5 - - tip - -script: go test -v -cover -race - -notifications: - email: - - u@gogs.io diff --git a/vendor/github.com/go-macaron/session/README.md b/vendor/github.com/go-macaron/session/README.md index 280ace36dc7..b11bd4a793d 100644 --- a/vendor/github.com/go-macaron/session/README.md +++ b/vendor/github.com/go-macaron/session/README.md @@ -1,4 +1,4 @@ -# session [![Build Status](https://travis-ci.org/go-macaron/session.svg?branch=master)](https://travis-ci.org/go-macaron/session) [![](http://gocover.io/_badge/github.com/go-macaron/session)](http://gocover.io/github.com/go-macaron/session) +# session [![Build Status](https://travis-ci.org/go-macaron/session.svg?branch=master)](https://travis-ci.org/go-macaron/session) Middleware session provides session management for [Macaron](https://github.com/go-macaron/macaron). It can use many session providers, including memory, file, Redis, Memcache, PostgreSQL, MySQL, Couchbase, Ledis and Nodb. @@ -9,7 +9,7 @@ Middleware session provides session management for [Macaron](https://github.com/ ## Getting Help - [API Reference](https://gowalker.org/github.com/go-macaron/session) -- [Documentation](http://go-macaron.com/docs/middlewares/session) +- [Documentation](https://go-macaron.com/docs/middlewares/session) ## Credits diff --git a/vendor/github.com/go-macaron/session/file.go b/vendor/github.com/go-macaron/session/file.go index 438269ea845..9bbc7aed20b 100644 --- a/vendor/github.com/go-macaron/session/file.go +++ b/vendor/github.com/go-macaron/session/file.go @@ -86,7 +86,7 @@ func (s *FileStore) Release() error { return err } - return ioutil.WriteFile(s.p.filepath(s.sid), data, os.ModePerm) + return ioutil.WriteFile(s.p.filepath(s.sid), data, 0600) } // Flush deletes all session data. @@ -121,7 +121,7 @@ func (p *FileProvider) filepath(sid string) string { // Read returns raw session store by session ID. func (p *FileProvider) Read(sid string) (_ RawStore, err error) { filename := p.filepath(sid) - if err = os.MkdirAll(path.Dir(filename), os.ModePerm); err != nil { + if err = os.MkdirAll(path.Dir(filename), 0700); err != nil { return nil, err } p.lock.RLock() @@ -129,7 +129,7 @@ func (p *FileProvider) Read(sid string) (_ RawStore, err error) { var f *os.File if com.IsFile(filename) { - f, err = os.OpenFile(filename, os.O_RDWR, os.ModePerm) + f, err = os.OpenFile(filename, os.O_RDONLY, 0600) } else { f, err = os.Create(filename) } @@ -187,15 +187,15 @@ func (p *FileProvider) regenerate(oldsid, sid string) (err error) { if err != nil { return err } - if err = os.MkdirAll(path.Dir(oldname), os.ModePerm); err != nil { + if err = os.MkdirAll(path.Dir(oldname), 0700); err != nil { return err } - if err = ioutil.WriteFile(oldname, data, os.ModePerm); err != nil { + if err = ioutil.WriteFile(oldname, data, 0600); err != nil { return err } } - if err = os.MkdirAll(path.Dir(filename), os.ModePerm); err != nil { + if err = os.MkdirAll(path.Dir(filename), 0700); err != nil { return err } if err = os.Rename(oldname, filename); err != nil { diff --git a/vendor/golang.org/x/crypto/LICENSE b/vendor/golang.org/x/crypto/LICENSE new file mode 100644 index 00000000000..6a66aea5eaf --- /dev/null +++ b/vendor/golang.org/x/crypto/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/crypto/PATENTS b/vendor/golang.org/x/crypto/PATENTS new file mode 100644 index 00000000000..733099041f8 --- /dev/null +++ b/vendor/golang.org/x/crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go new file mode 100644 index 00000000000..593f6530084 --- /dev/null +++ b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go @@ -0,0 +1,77 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC +2898 / PKCS #5 v2.0. + +A key derivation function is useful when encrypting data based on a password +or any other not-fully-random data. It uses a pseudorandom function to derive +a secure encryption key based on the password. + +While v2.0 of the standard defines only one pseudorandom function to use, +HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved +Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To +choose, you can pass the `New` functions from the different SHA packages to +pbkdf2.Key. +*/ +package pbkdf2 // import "golang.org/x/crypto/pbkdf2" + +import ( + "crypto/hmac" + "hash" +) + +// Key derives a key from the password, salt and iteration count, returning a +// []byte of length keylen that can be used as cryptographic key. The key is +// derived based on the method described as PBKDF2 with the HMAC variant using +// the supplied hash function. +// +// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you +// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by +// doing: +// +// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) +// +// Remember to get a good random salt. At least 8 bytes is recommended by the +// RFC. +// +// Using a higher iteration count will increase the cost of an exhaustive +// search but will also make derivation proportionally slower. +func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { + prf := hmac.New(h, password) + hashLen := prf.Size() + numBlocks := (keyLen + hashLen - 1) / hashLen + + var buf [4]byte + dk := make([]byte, 0, numBlocks*hashLen) + U := make([]byte, hashLen) + for block := 1; block <= numBlocks; block++ { + // N.B.: || means concatenation, ^ means XOR + // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter + // U_1 = PRF(password, salt || uint(i)) + prf.Reset() + prf.Write(salt) + buf[0] = byte(block >> 24) + buf[1] = byte(block >> 16) + buf[2] = byte(block >> 8) + buf[3] = byte(block) + prf.Write(buf[:4]) + dk = prf.Sum(dk) + T := dk[len(dk)-hashLen:] + copy(U, T) + + // U_n = PRF(password, U_(n-1)) + for n := 2; n <= iter; n++ { + prf.Reset() + prf.Write(U) + U = U[:0] + U = prf.Sum(U) + for x := range U { + T[x] ^= U[x] + } + } + } + return dk[:keyLen] +} diff --git a/vendor/gopkg.in/macaron.v1/.gitignore b/vendor/gopkg.in/macaron.v1/.gitignore deleted file mode 100644 index 57ee3ec50fe..00000000000 --- a/vendor/gopkg.in/macaron.v1/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -macaron.sublime-project -macaron.sublime-workspace \ No newline at end of file diff --git a/vendor/gopkg.in/macaron.v1/.travis.yml b/vendor/gopkg.in/macaron.v1/.travis.yml deleted file mode 100644 index 6eeb32a4e38..00000000000 --- a/vendor/gopkg.in/macaron.v1/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -sudo: false -language: go - -go: - - 1.3 - - 1.4 - - 1.5 - -script: go test -v -cover -race - -notifications: - email: - - u@gogs.io diff --git a/vendor/gopkg.in/macaron.v1/README.md b/vendor/gopkg.in/macaron.v1/README.md index 704ecf34077..cfc7f6fdb4d 100644 --- a/vendor/gopkg.in/macaron.v1/README.md +++ b/vendor/gopkg.in/macaron.v1/README.md @@ -1,12 +1,10 @@ -Macaron [![Build Status](https://travis-ci.org/go-macaron/macaron.svg?branch=v1)](https://travis-ci.org/go-macaron/macaron) [![](http://gocover.io/_badge/github.com/go-macaron/macaron)](http://gocover.io/github.com/go-macaron/macaron) +Macaron [![Build Status](https://travis-ci.org/go-macaron/macaron.svg?branch=v1)](https://travis-ci.org/go-macaron/macaron) ======================= ![Macaron Logo](https://raw.githubusercontent.com/go-macaron/macaron/v1/macaronlogo.png) Package macaron is a high productive and modular web framework in Go. -##### Current version: 0.8.0 - ## Getting Started The minimum requirement of Go is **1.3**. @@ -70,18 +68,18 @@ There are already many [middlewares](https://github.com/go-macaron) to simplify ## Use Cases -- [Gogs](http://gogs.io): A painless self-hosted Git Service -- [Peach](http://peachdocs.org): A modern web documentation server +- [Gogs](https://gogs.io): A painless self-hosted Git Service +- [Peach](https://peachdocs.org): A modern web documentation server - [Go Walker](https://gowalker.org): Go online API documentation -- [Switch](http://gopm.io): Gopm registry +- [Switch](https://gopm.io): Gopm registry - [YouGam](http://yougam.com): Online Forum - [Critical Stack Intel](https://intel.criticalstack.com/): A 100% free intel marketplace from Critical Stack, Inc. ## Getting Help - [API Reference](https://gowalker.org/gopkg.in/macaron.v1) -- [Documentation](http://go-macaron.com) -- [FAQs](http://go-macaron.com/docs/faqs) +- [Documentation](https://go-macaron.com) +- [FAQs](https://go-macaron.com/docs/faqs) - [![Join the chat at https://gitter.im/Unknwon/macaron](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-macaron/macaron?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) ## Credits diff --git a/vendor/gopkg.in/macaron.v1/context.go b/vendor/gopkg.in/macaron.v1/context.go index bb6caa41414..dffc50cf6f6 100644 --- a/vendor/gopkg.in/macaron.v1/context.go +++ b/vendor/gopkg.in/macaron.v1/context.go @@ -15,7 +15,7 @@ package macaron import ( - "crypto/md5" + "crypto/sha256" "encoding/hex" "html/template" "io" @@ -32,8 +32,8 @@ import ( "time" "github.com/Unknwon/com" - "github.com/go-macaron/inject" + "golang.org/x/crypto/pbkdf2" ) // Locale reprents a localization interface. @@ -72,6 +72,14 @@ func (r *Request) Body() *RequestBody { return &RequestBody{r.Request.Body} } +// ContextInvoker is an inject.FastInvoker wrapper of func(ctx *Context). +type ContextInvoker func(ctx *Context) + +func (invoke ContextInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { + invoke(params[0].(*Context)) + return nil, nil +} + // Context represents the runtime context of current request of Macaron instance. // It is the integration of most frequently used middlewares and helper methods. type Context struct { @@ -84,7 +92,7 @@ type Context struct { Req Request Resp ResponseWriter params Params - Render // Not nil only if you use macaran.Render middleware. + Render Locale Data map[string]interface{} } @@ -145,9 +153,6 @@ func (ctx *Context) RemoteAddr() string { } func (ctx *Context) renderHTML(status int, setName, tplName string, data ...interface{}) { - if ctx.Render == nil { - panic("renderer middleware hasn't been registered") - } if len(data) <= 0 { ctx.Render.HTMLSet(status, setName, tplName, ctx.Data) } else if len(data) == 1 { @@ -159,7 +164,7 @@ func (ctx *Context) renderHTML(status int, setName, tplName string, data ...inte // HTML calls Render.HTML but allows less arguments. func (ctx *Context) HTML(status int, name string, data ...interface{}) { - ctx.renderHTML(status, _DEFAULT_TPL_SET_NAME, name, data...) + ctx.renderHTML(status, DEFAULT_TPL_SET_NAME, name, data...) } // HTML calls Render.HTMLSet but allows less arguments. @@ -221,6 +226,12 @@ func (ctx *Context) QueryEscape(name string) string { return template.HTMLEscapeString(ctx.Query(name)) } +// QueryBool returns query result in bool type. +func (ctx *Context) QueryBool(name string) bool { + v, _ := strconv.ParseBool(ctx.Query(name)) + return v +} + // QueryInt returns query result in int type. func (ctx *Context) QueryInt(name string) int { return com.StrTo(ctx.Query(name)).MustInt() @@ -353,6 +364,13 @@ func (ctx *Context) SetCookie(name string, value string, others ...interface{}) } } + if len(others) > 5 { + if v, ok := others[5].(time.Time); ok { + cookie.Expires = v + cookie.RawExpires = v.Format(time.UnixDate) + } + } + ctx.Resp.Header().Add("Set-Cookie", cookie.String()) } @@ -401,30 +419,29 @@ func (ctx *Context) GetSecureCookie(key string) (string, bool) { // SetSuperSecureCookie sets given cookie value to response header with secret string. func (ctx *Context) SetSuperSecureCookie(secret, name, value string, others ...interface{}) { - m := md5.Sum([]byte(secret)) - secret = hex.EncodeToString(m[:]) - text, err := com.AESEncrypt([]byte(secret), []byte(value)) + key := pbkdf2.Key([]byte(secret), []byte(secret), 1000, 16, sha256.New) + text, err := com.AESGCMEncrypt(key, []byte(value)) if err != nil { panic("error encrypting cookie: " + err.Error()) } + ctx.SetCookie(name, hex.EncodeToString(text), others...) } // GetSuperSecureCookie returns given cookie value from request header with secret string. -func (ctx *Context) GetSuperSecureCookie(secret, key string) (string, bool) { - val := ctx.GetCookie(key) +func (ctx *Context) GetSuperSecureCookie(secret, name string) (string, bool) { + val := ctx.GetCookie(name) if val == "" { return "", false } - data, err := hex.DecodeString(val) + text, err := hex.DecodeString(val) if err != nil { return "", false } - m := md5.Sum([]byte(secret)) - secret = hex.EncodeToString(m[:]) - text, err := com.AESDecrypt([]byte(secret), data) + key := pbkdf2.Key([]byte(secret), []byte(secret), 1000, 16, sha256.New) + text, err = com.AESGCMDecrypt(key, text) return string(text), err == nil } diff --git a/vendor/gopkg.in/macaron.v1/logger.go b/vendor/gopkg.in/macaron.v1/logger.go index 109b7b3330d..3c54c24d57e 100644 --- a/vendor/gopkg.in/macaron.v1/logger.go +++ b/vendor/gopkg.in/macaron.v1/logger.go @@ -19,27 +19,39 @@ import ( "fmt" "log" "net/http" + "reflect" "runtime" "time" ) -var ColorLog = true +var ( + ColorLog = true + LogTimeFormat = "2006-01-02 15:04:05" +) func init() { ColorLog = runtime.GOOS != "windows" } +// LoggerInvoker is an inject.FastInvoker wrapper of func(ctx *Context, log *log.Logger). +type LoggerInvoker func(ctx *Context, log *log.Logger) + +func (invoke LoggerInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { + invoke(params[0].(*Context), params[1].(*log.Logger)) + return nil, nil +} + // Logger returns a middleware handler that logs the request as it goes in and the response as it goes out. func Logger() Handler { return func(ctx *Context, log *log.Logger) { start := time.Now() - log.Printf("Started %s %s for %s", ctx.Req.Method, ctx.Req.RequestURI, ctx.RemoteAddr()) + log.Printf("%s: Started %s %s for %s", time.Now().Format(LogTimeFormat), ctx.Req.Method, ctx.Req.RequestURI, ctx.RemoteAddr()) rw := ctx.Resp.(ResponseWriter) ctx.Next() - content := fmt.Sprintf("Completed %s %v %s in %v", ctx.Req.RequestURI, rw.Status(), http.StatusText(rw.Status()), time.Since(start)) + content := fmt.Sprintf("%s: Completed %s %v %s in %v", time.Now().Format(LogTimeFormat), ctx.Req.RequestURI, rw.Status(), http.StatusText(rw.Status()), time.Since(start)) if ColorLog { switch rw.Status() { case 200, 201, 202: diff --git a/vendor/gopkg.in/macaron.v1/macaron.go b/vendor/gopkg.in/macaron.v1/macaron.go index 94fd3f0ce20..30ffca1cd18 100644 --- a/vendor/gopkg.in/macaron.v1/macaron.go +++ b/vendor/gopkg.in/macaron.v1/macaron.go @@ -24,6 +24,7 @@ import ( "os" "reflect" "strings" + "sync" "github.com/Unknwon/com" "gopkg.in/ini.v1" @@ -31,7 +32,7 @@ import ( "github.com/go-macaron/inject" ) -const _VERSION = "0.8.0.1013" +const _VERSION = "1.2.1.0213" func Version() string { return _VERSION @@ -42,20 +43,63 @@ func Version() string { // and panics if an argument could not be fullfilled via dependency injection. type Handler interface{} -// validateHandler makes sure a handler is a callable function, -// and panics if it is not. -func validateHandler(h Handler) { +// handlerFuncInvoker is an inject.FastInvoker wrapper of func(http.ResponseWriter, *http.Request). +type handlerFuncInvoker func(http.ResponseWriter, *http.Request) + +func (invoke handlerFuncInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { + invoke(params[0].(http.ResponseWriter), params[1].(*http.Request)) + return nil, nil +} + +// internalServerErrorInvoker is an inject.FastInvoker wrapper of func(rw http.ResponseWriter, err error). +type internalServerErrorInvoker func(rw http.ResponseWriter, err error) + +func (invoke internalServerErrorInvoker) Invoke(params []interface{}) ([]reflect.Value, error) { + invoke(params[0].(http.ResponseWriter), params[1].(error)) + return nil, nil +} + +// validateAndWrapHandler makes sure a handler is a callable function, it panics if not. +// When the handler is also potential to be any built-in inject.FastInvoker, +// it wraps the handler automatically to have some performance gain. +func validateAndWrapHandler(h Handler) Handler { if reflect.TypeOf(h).Kind() != reflect.Func { panic("Macaron handler must be a callable function") } + + if !inject.IsFastInvoker(h) { + switch v := h.(type) { + case func(*Context): + return ContextInvoker(v) + case func(*Context, *log.Logger): + return LoggerInvoker(v) + case func(http.ResponseWriter, *http.Request): + return handlerFuncInvoker(v) + case func(http.ResponseWriter, error): + return internalServerErrorInvoker(v) + } + } + return h } -// validateHandlers makes sure handlers are callable functions, -// and panics if any of them is not. -func validateHandlers(handlers []Handler) { - for _, h := range handlers { - validateHandler(h) +// validateAndWrapHandlers preforms validation and wrapping for each input handler. +// It accepts an optional wrapper function to perform custom wrapping on handlers. +func validateAndWrapHandlers(handlers []Handler, wrappers ...func(Handler) Handler) []Handler { + var wrapper func(Handler) Handler + if len(wrappers) > 0 { + wrapper = wrappers[0] } + + wrappedHandlers := make([]Handler, len(handlers)) + for i, h := range handlers { + h = validateAndWrapHandler(h) + if wrapper != nil && !inject.IsFastInvoker(h) { + h = wrapper(h) + } + wrappedHandlers[i] = h + } + + return wrappedHandlers } // Macaron represents the top level web application. @@ -100,7 +144,7 @@ func New() *Macaron { } // Classic creates a classic Macaron with some basic default middleware: -// mocaron.Logger, mocaron.Recovery and mocaron.Static. +// macaron.Logger, macaron.Recovery and macaron.Static. func Classic() *Macaron { m := New() m.Use(Logger()) @@ -122,7 +166,7 @@ func (m *Macaron) Handlers(handlers ...Handler) { // Action sets the handler that will be called after all the middleware has been invoked. // This is set to macaron.Router in a macaron.Classic(). func (m *Macaron) Action(handler Handler) { - validateHandler(handler) + handler = validateAndWrapHandler(handler) m.action = handler } @@ -138,7 +182,7 @@ func (m *Macaron) Before(handler BeforeHandler) { // and panics if the handler is not a callable func. // Middleware Handlers are invoked in the order that they are added. func (m *Macaron) Use(handler Handler) { - validateHandler(handler) + handler = validateAndWrapHandler(handler) m.handlers = append(m.handlers, handler) } @@ -151,6 +195,7 @@ func (m *Macaron) createContext(rw http.ResponseWriter, req *http.Request) *Cont Router: m.Router, Req: Request{req}, Resp: NewResponseWriter(rw), + Render: &DummyRender{rw}, Data: make(map[string]interface{}), } c.SetParent(m) @@ -208,7 +253,7 @@ func (m *Macaron) Run(args ...interface{}) { addr := host + ":" + com.ToStr(port) logger := m.GetVal(reflect.TypeOf(m.logger)).Interface().(*log.Logger) - logger.Printf("listening on %s (%s)\n", addr, Env) + logger.Printf("listening on %s (%s)\n", addr, safeEnv()) logger.Fatalln(http.ListenAndServe(addr, m)) } @@ -234,7 +279,8 @@ const ( var ( // Env is the environment that Macaron is executing in. // The MACARON_ENV is read on initialization to set this variable. - Env = DEV + Env = DEV + envLock sync.Mutex // Path of work directory. Root string @@ -247,11 +293,21 @@ var ( ) func setENV(e string) { + envLock.Lock() + defer envLock.Unlock() + if len(e) > 0 { Env = e } } +func safeEnv() string { + envLock.Lock() + defer envLock.Unlock() + + return Env +} + func init() { setENV(os.Getenv("MACARON_ENV")) diff --git a/vendor/gopkg.in/macaron.v1/macaronlogo.png b/vendor/gopkg.in/macaron.v1/macaronlogo.png index a2ab537b6d88d2876f8913083b0400648cd1c7a4..399759769a8d7f5549d550baccdd2ea5716e2bac 100644 GIT binary patch delta 86942 zcmce+Wl&vRmoB>TV8JE0yF+jd?(R--cZY?$I|O%^Ai>?;J-E9Q{O0|>KBxQkIsNa} zT~)hk?PrW<$Q*O7J@;HAun2O!398l(4gi5*?IkpwKp=Rue?DNKj7)402x7uQMZ;M` zR)+h#oehJbv7M0#gS(AA=%0(%o%`>tjft}%k-LqxtrNF9AIZNoxc}b&12d8k{Y%B! zijPD?R)I*^&e4SED+3z?6A3>Y5fKruqp>Nsl8D$pbl@-N?^iw&b7yCJZbn8oH#Y`1 zRt7sqGe%}EE-pqU7Dg5p`o9|VP9C<-hVJyXPNe^~^1lp;m^giRw6J%!u(Kul$FQN1 zor^Oc3CTa6{`d7Cf!f&rZ%4LH|4IumVfdRNqr0I!BQpaNiQm z|0B)B-Qs_s{UiA|jUNv9-y!n;9aL^vJ7Wt|4-rFW6MhyZW;S|eCVFO86(%P3J#z{1;o;(ZtZ%&QZnA&YEB7pPCUVnAX%I^5^}RP*cgo$=e`jg@rySt_-+ulJ z`mbsF@5=E0Q!Q>`J8L^fWqZT#CjTVz-=Y6v|6d{n3wIN14G{|)6I-W$<<7*!^dGGM zE&~3qT+RQP`(H%=LFHxqXWIXlW$^Ds_Am7BD&vRyTc`iEV)@~c4p-kmAVH9%h>(gq z*csph+2Q2t1((@mrlAZx4ip=l zIr=nJuA*RppBPv)`2Pz4{tx8;UjX=@L;L?akm(63BIo*N%Z2k%bcv#*cQz}`7*-%X z@`T$-KA0mV8Mco?R?1~PeISVwfs)mX<`K$p>NX~9HCzlV7+eZwt~5_^YYQD&gJyst zIXOH^)~N4BqjfW>K98KdOg5^>Pnvq0$xjw87v>LY$c~+|2iGX|_SZFyUZu*Yx}TDC zBanLS(AF@3nfTtE^AHcoTJhHt9%X=t9F(d-?PsB(m#tt{4_hG5O|41uDO`A5%Ah(q zB|&IFY$QKXghCqA=UWcCv8L3geCxP9&cxktcTVc!J$E9UND58f_)q<)`wJ5&uAAv# zNr}8kKM#tOW^e9K2aGl)%c3XfzFN;!CXI>eWDMrv!@ady;UU(xp8nvWyO#rCtI?Z_ z9HA#+l{8_c@#3U$niK_&!OZejdT(U7%YNz2VnE>Dh$x;B!_o;*hnemfW2MDGOpk$M z1^Ho@B}Kgq>la#~ge4f4kvWJ%%D@tnlX1NareR%cC4?8M8-GKN*Sb>AlB!K{XVD~# zp`i8Y6tr47q>mo|$}4gIo5vowsBG8S(fRAUHLecYz)QKzOW(?Gp<{E?t%?r>=SlHd zVSoIqrHXeB0)vKin&VPkhYdxaBD5kl%}HTTJ`v);Fbq{)woKA^eouc|%y&G}MOry3 z$UnpvblDOpQ-#KnxXnepTQIo=B$Hs`ex@f}*&|y+VU%cb^uJRaAa4LrAF{%jG1aF# z=@5URM!IxMnZg8ZcSqhtKRSA;7#fp zIq5-0Cin(5nF(ufAYwXwnoh@R+D-V*iV2Yh_2xjFUMaLkKVp0{rosE9S;5h~-RRKa zMhxxXh~LwQibsh2ql!kdRc9WW-kB1vRJW98L9^oYmm&xVTvwee%$q(>N^xBjhz7jG zYj*HnEVw1Pg_8>BKrq5k1uH4@BXn@NpTyDVaH4;@qgEG4cUw~0?+Gr}Q` zCe?hgIx*pOyRjHo9*=3g5N!&Jybh9O>3ZC#egI4;Pa`6j#L!+I*2tdd+OQT)T4Y&d zT*>ruxOwZ>oB+New_F@-odnDe=JiA{KwrVxq!>7OJSu@`x1V*W&MvY;PD6>=W(gOw zzlb_P62y##hG0F0Du!q!f9s5klkrA;w-=>C_xjkxIM1oY4f!+QdoU4r6t*J2RIUkP zOda$n3pzF$dUH);P!q4>hRFv(KNqrueBncAka4hkkQ=%qPKg)GvgJ*SRSeizW;A5^ zsQ@I^33B!uU2`H1la)n^1Uo2ged_RsKFsTh1Sj&Xq- z_y3~&Gf#x(W=2s6-FQ$@ObCDU6F_E0<8hfXwNBM;EO7FOHrV--RCNbavi3|!XuTvyj#NY=Af z&OaUV;R1KX|D<0Ntmc0y29_%A9Gyw+3SMS-d&m0z^=E%+qO@|pJwL04=YX^40gO~| zuc6Xjzi2K((i$W)*)|IDRn8q)s-+tdZ~jOBi@h$!!Ji{$88kAl{ zu0Z6_?sN|Mr^tk6`Em69SQ$>Y5S8Or+R~xhqG1(=9^#);LT`hI(0&04l6L5o6!>$y zax{B(f_tu<;USfjCx^?8@e zg)HO7lWKHP3-3__9OSt#>5SOW92mqgKKi6l{BA*$x@zEqp133cX9ECg1O@Q$h^I1gmsdh7vS9J^>Z zBULKAPw|8Nn2}`pJxrCgO4Ry9$js?7p0K4Bafsd2q)R_==`ai82fR-1Lv(r!n54N2 zWHA#vL?lybj}W=i_|D=JjDJji>cKQ3uvp78gkVy7ckt7U(x9&X1%qAS0%_d8wjFg9 z5x7Y39B}>3iHK+x%pq?W>)aF|WhGPCuI-}1ke?VD-?d`QRIU}1-PdYS+E~^JNFSW! z7P@b7eYK#9yXX;+HPoWs3jAlo1b z>YEUPd|l&Jy zF~PY!1=jsVJbukbPJ;@`fK5}+pDwS z$_DgBrAvfOmT4I4@}>apzPcTk(Nj_{ieBlF&8?19C(=YNT;7D12>@Bm*T!v9J=!r9=5||cw^TY>ZG{s!(SQr%g^r*Ed+rvI84*= z=h&u9+M%b>gWp9u>biQi=Zm`W#d?B+g;72m_)#eNp*%tzYk<+m=#0jK>xGFZQSBU` zVZzrR_e?(ho)`f{to5Xcp60E-!*wa1jtqz*Hmf+kl8OI2@se*K6>4f_0hfu{=XmzS zJ6fS6hH&lr`}21Yych|rQJ#T;{y*WrsJeJr+YPnWzDfQk6}e!k;<6p?YVxfu@C=k0xhQrBDxo zV?vC~_h8W>a$}7$Kh)^$>Mx+;YE95={64T##dOFC3Of#YJ6_0xfJWr+%T9LboHWMC zt2f(c4(rad$J@f#fY8$kmyh6mRo2eJ{K8z50Xea6-IkS}Xt4IJvvJ$~Cg+17UEZ2B zwhC-1c2kzE`}x}9wTfJ(_a@%s3trznEiOav>ULYAr*gRdbUk}bstP^qmsWdzZE=7% z=_bcXB)JH;orB%)YxsL zdfvmJv$<7R3tUs3a-(-t^SSI2?5$uC%pUcceKtA>+7=n^`}_ABYoMI$0w7#VY`E?C)tHD6_GCx(d~XIZD#A7dG^8{=4zg{3TVA zWI-YQ&Mp&qOUUy-9n`sCi;on)k>oioHh3*i`|(^9blch;8WxB)rlL~fH-d&&y?rxU zq)&p-k7ts>VM|r&Vx5$~p$bxH)2S5?NklYqw2>NqSn5l!t-paCazZ6arLU%5P0OIk&Op+mL+1ZxLIxovzDY9?;q-y*K16D<-Bz?s%`xw z$cQaXHi8foR(;eaNKJxy*k%7M1rwQ;%icst9XiHJmkIA}to{(QOB4gVYG9Uy!n{60 zB)Siat()7sf%h)+>OQ;9x8oJKyV{PU-8ka-$d+&pkf+~J`F6BE%L z4h~axx7PcZJ*Ci-pxu-vOLuH##@zLI>(_Q(^h?j9AZp^n35HUXNYn~;OucHBt~ore z){yoKml7Sd|L~8p`Hz8y9qEhCdsHvIiv`cfbA*+6MAEfS{bCyF6nP9l9|B1zt-U>@ z&Iyu;Xlbibz?>}_epo!5r+~9~e!U*S@9$iqyGHp{Y-yX-1V5ODYbL6;X{t3275hPJY^ED;GJ^Sk@|aQS7f9vx*_U+#`j&6s(^f31?5s%V z&N(@0e%|guO$%`yCSJpuuZaFwpux`73~%5#ziU~`$r8A%YN;GoEn1X#$*4&BLm=*# z3cr=i#WS`{4wX9jGN-yocgPkN*|$?W{P^@no#rlNaM%r{nwp=hE-HG|yrbYQ8LX)p zz`qw$j2aG%Z!A9pSPx@{z9$fS6s?sF=qYGgfB4a-L8mVY=WRtOrj^=D#P712S^|@{ z$OKYajv#*FvrZFRm6`DLVff2W-a zq6xCSF6?m_fFLIYq9n1#8--l>`tx+Si7#LhzLi#nE9D$eTs|G-uYbN-C*T9h>UpMQ z($5i^EESB3B&NvyPYk}RZUxXGp$F0~1PP(;=i^bLbE%D zf-Q4CO8;uG5Bn!}WY~M3{CFjwjY7$Yj%la1pQd+T`N*(kIGXZ){Ca|L;L|MZi-|bQ zf~H|nA_8WR7?dG-`r)}SjpCb9kbYRX3jBOMa5^Am_~1t47(kDYl{fXtdB&$hT=40N zu>6X0$1eWrw}!Oj@_;5ibvaYASra|E&McXj<-rsP9|CVmw$*&q0_qFS_2!Uhfm+*W z?lYd<#{shu`Z&eS$anKqS&ftrnpUEfrLJ);6$W@L{annQpC{}7sIyh6bh%pGFHm&6 z`-f3ih}&4<@(+ANg%52(O-&+#RO(mFs~3hRDL!M5H14-3Z8VhKy@=?lZoh9AwS@D^G^g*=F>=7Wk=MjMErd8Zw~@X4Fx0 zbC$37O%h5GhY*op98s$4=%%xMX}t-QFUKi4OY_x2oM_&@w0Cr0kCC!Tr0vj6^OP00 z9WUS5>UgBYs0cz`k}6wo9BOnPNgQLOxtRNS9Lx-u3#iR{gt2hod^PD-i)^L`2N>a; zqXfH5W={7>cuZX(E|Pgx3+B{yR=p@^^yh5K81J|K?nOS!BI zKBB6&u?Yy2HiO8j$Z>_CE^e~>)#4ki##c3E8<69h zYXeN2tUnc|<|BQ^9C2wJb3n*j+5srbvwbQc0imAB|a?`HRnTzoIDGjU7x zgjJV8%ocboB#&Z3rv-i*?e7iiFn2N-CT5ZcVN3WCLv}w{TiqG>_7W++0ECFyf-lD+ ze|MVP@w+ejXNKqMqa1XEuOA|b_r)QCNgkv#*z;K247bEyJLS2Txtc;pP5nu8hN)>? zUr{Wre9x*Z0Pi>`Og1I@=A#nV4ML&26E;r0jSQXww+DKPj*C>slma41cQUN6hVIXS zR#?RFJ68J#6Tj#>JvqUs0n(W6WQ#r#4kS!aRAR{Fp47`*iw(cQY#D9z*`9a${ulDa z7>%p6K3hVGM8tjz0w#sGPyN2&pxy3dVjAwjuIB-}vz8|}*ce_X+;J7;BOlszOm#=a zMy_8Ntf$7hbrb!lLYwVoO)#dlKVojqj>TcDH>RHbp)~~V?#=9}fnCgV?!3?$PD)b; z0_~M~DMzp1_qqKmqi1@D-;DIK}=$f12*pUQ_69?^59WK7n^jov18KVF_i z-#$LYh@qQKkUX4p14cv+@`WkVPJFC0n0^htdI}K9MA>f-F$8?)2j2B$NKB{u{BgxM z28+ztW05ksxOak*@Xa&e#^gfEVtDAXec@N03kWsn=fiQeM37xfRqnNXsPeXUH^Cf} zHFp;zXyA=R+^C#RS2X(-HV@U(rt_CxpSPqW_fKFBih<8`e>b7yn{-bd6n_j4x8Q@n zE3}L?tczoyS!@}m#CuI%Cg+eIL)awK=M68|#hlig5>W86mt7vcEFOK5Edg6Za<5CT z=T+}ecfv2O%Xx^v^eI@vWi^t*g-DK7NqColB&&vNQm3Qjk(Oy%@>-8Z1l%86l?h8| zrgN3}w99wYfRR^xh$zpw1!;z(?PsusGl|hL38Zq`)TQW&`X3)+?nz3cQgXXzxiX+s6uhTpOTIkdvq{1J!jR4E~jOf#q!RoeF!XacSXfwsb0Mv zF3OG3(!JMbE)~=kO~_`rl|rY9*eIuwR**$LKP^M zWx(nEfZh5;_ER4N4L{nSBb*M+bf2~@=01$B>^nrYy$xMg-&m-0ZWe+|o>ynTg)^6y zUj%cHl8K~N`A7k(UPO@EjNmjbb@_k)SVZvP1EyRvv#mxCUs?{86dQ&J8BrHS@FyW3 zs{)Y;dF4IzanlcNn*cLgzENyZir0g?vh(L?-SUfmFpyb6@kw zCIS;k=risW^PCj5Aj?yJRe);^MYCrz4-AW@yjyk$ua1qU!MG9u`=p(J-QTMPoSFD7 z0fWvYV5hJBgky!diCplw@xaQdJfHc*CD&I-)!Mb9jK$FoUzj2 zXq&T@bn{Vd0tzV_78!X2V}Vp>W8|~q+Wvi#ptq8uPF7N1n@2BbtE#jIMiPxM>JLg$hZKgz zPO(DX?wWjiF(Y_BQ+${l$a2&1wU4x!t&7pqAWyPm9iha%Z$+zhS!UkKgzh#0g1Aif zqL7+Clln!>1sHLflng4OcvD2vF(mJ}r;B__s(9UWI&+Q<;RJ$m?zjdHgNh-L6%5BA zEq}mHrrMMmz;#v{Ff`_F5c(LuFYh2xA<2C-{E=M><#I+v6X(C)7#Mhi=A+n0f3&fA zM6MTIqmO`t`Fn2u7$24Q?sMx1kW(-JG;E`E-9H(7w&gbv;2Ouc_`KqBLianb_hW(E zsIsLtZW$_mC*f&fXkW7s3M{KbUe(HL{!_KomoV&Td>stwxVBX5$apBN(_ih4rVA!# zc5@tUAYPcP!AVf11uZWB{OKNR_Ug)NqAo{s%BtLos~xCKzw?ItprRv$9xu^|HZP-30{$g@^2hAX<|T@{*LvV{r6+25XXk z@KXC@hSCv-_x=H_;l`2yU3-J!Om_Uao=``&BW<1Y*f-anqkx(?=Hw##hSwdY519b* z7>`7iil_F!XL7HM+73D47lJ{VOgHHwD!9%PzaX#-!@@*0KX=eyIC+tV!Vp4CmG8^JiSgJO{D#JgfG@T5B6PJ+l{dEFYPu4LHWKM_M*cTf2`XYLF z8@xI}A(zWUxRgv3&jqh4U4)!yLmXuGR<@u0!pv5#H6%o_zoall$hF$2(ch+Hz*E&% z^$}f3+o*8~bM-1&Ipwa8IwoY}Gng7_tLee=o4Pgr2BXbX&UjeF$vGpMQNOb^Dtm%= zRW?49_(fY-yH1!7_!2(@jl67!(YAstNZq#LSFxQ*LX74vV?-|mH|h_)n@#8|x0DXX zk^FM3{}okAO+NWLigsTh=GcrE91KGpAg^sqw`RxLisc*3=Xd)iGdPlt-J&-zYhvHM z)%p`pa}v_Ew$$4Vmer`TWUzD0UT6J)^>*MaOzHp?vcTLW+R; z3rX4o5@oK=k|EQy`w(HYa^=dM4PmQZ49lE8MC~TM9|uH^XJzL0mqZsa=odX&6h_8Zzfg& zvCuM4;5P*>Vr}QXs^Xy_CGmy7Zd>8A;>bz+ck%DE)sR=};5pZMhSES`+VrWjQugm& z@OvJ8FRz`tUqnVcUe;|rWUzhHFfA9x(@pnRvA$b^V#y3qBk%P~Ttu^XA=(rm$Wu{j zru_w2n1{*W_AsLv21&CWdMhm~Y^Qq0O6!~NKq8!yI`tVUO$7)G+5lI*`dJW%=1~mj`)2O-N^ZE;*@WcG*sbre2+Lu@~YM*-epdX&%(WQ z#l%$B=IKwzBSmT75K|-^0~hCAV3HC)3v6+5NtY{^uG~$hp*|0TK{(85NTF9k8OE6| zJ;G$ohTEsMv9Z;0$i>Qza14u9KI507z8W{(>X2ziTo0>xL$b7q^>;~F!jdfMbth3h z)M2FXJ|k{L7Om)b^Ppqp@qTFD;_p1RFkOu~ek+3NtI#LKNIy2&4-V{W0r1-1QGWa! zn(WS_<^lOnpd`+$9vXaYA2Ew-!eselV@)Pa0~IkWiSpvZmMv&<{{?UvETWxmd$1^l z08lmovHH%u`vKe?wZ|1DufQ`hky!DkG&w=8(y8w1{@XK(7MrDNE=V<6=HsW{+hmp~ zwO#TEam8|+Hy1dOwGUSipwUxZCCvEzCmhiJv+tKDtUu4&SAZ~4vF?p35Bp6-+EN4ljf0eeZ2OU`=m zEGT#p&JJ@(WJ^UN`NUw4mR4h{^U0qk@Pl=f7aM~ZyY_G3i}+~Iz-?_s8z+jFSHiFa zyo`nu7vYq1>t^mrnKSqA6<9?v<7L`96?B6}zzeUIlxua-ONHzWe9Av%*OP{D&>3!N4@B&FD zYx%>#FLx0FJD9jdVZBsBu)~4t!ejdyw=hWs#=5iy1E9P72JM719CGg~kCEsS znfBWaj))tt9Hq_m3=qbjA;o0Xx_;^E{!WsPTPHD@^Hi;S;Pqq8`(dsx);7!kzF0mn z=FAM4t$X#9+|6&{JK2$Fy+WOfa$qEeijU2y4ELTl;Y~rk7#1ec*OB4?n-=Cg?+nj%u56f}z>Uy63tth98c>3EFV! zz>uQ;-npQUSs}+H3ASI@(A*;TYbYvV0((hC0@$buAQXueL7`lsYQm!$UPxZa@M**M z@y|!%yIFo1{|J!q327Odf@%@D9m#%TS^(0g3gz_ffA3JPI zP0{JKRoceuH$|h7_+r9(h%>f3U%gno4fw*uW(*ZYy5^*wJ2O<>itjve$#HG0Ud>A% zKDGx}PAurUmTr`jJ0I`-#=?4})0^Hx>N_I>U_%{soQo7YV4{*J&YWUzjzQ!bq;VmH ztQWTuqe#$lqn||GsxcDn5HDI{`BdB>XmK$`f0(59?kn^|K#f_%(s6ZM`tk4LPi9`H zw72U?^10e08vMYa0=GaUjh1;m^bf?G#$6Cg}g{ySy+N| zo-`Q8MYMM}Mh~q5&Hgq5%)jCN{k4MC0zsLx$Dya6RW}w}#ZGA9B-v12m|KVY*U!!n zGI6$Bk`>G#S2&43jHe)Xs<8o+RAJLfBbsgfn%@!>~IwismU_aY`;{^ zh>V4&7CyQ^XHp{Aiq#r#!oH5$cTh&fLA=X>4qH|7(g4AVPhD!@vffS~c$>MHy4t(U zgn_mPsU{V5$Ef5?b|RS1_c(7hS`ZkBG2pK!^J!?ej9Z>0eu4J%WbKk#D>}g$fK(F^ z&qVVgi%aJFQiJ-*DFf7hO?P#z`#rVG^Lpmj1iw@7m28f;cZZw$c?o-S@bJ&Rsyw22 z4&3B;VKJ%mdHu%fd6rCguv!&Fn;v(xcN}eqYn$b|ERnUq>H{kW_{x|jWo@SJGi zmnDL}oQM^19#8(AE`6L{ifV${iu)Q=_cVQW1%zo~>+9-?<5T%&w)vI{QY~T4A)r$e-rAO3_%2pMN@V znP%5=+0Y29{ct^@C-B;rm>o@1IiKFOC3k4?Nzlu^trXh%8&OXYQ$mOP%^ebc67ESn zN#bv`MyN&Mx@>#)tujk5;QV^du{zfbZo{5htY!RFG(%EjDD-|7|Al#{&VI6MtmcTr zeEMy2Lsa-p2;|Hr#oyoTf9l^%ci;I(0LihiHqywTm4m_?0eRb2{jETgE$I z*T~0@huH#NJcUQpD%Of8eLk4nV$(^o6@jnMBabC!kNB?*xH(l!z&L@R>y2^GnnVpf zw)CLqq3JQ5!)2-ye>G>8;lZ^;)7(jdenw71y&t?nYK=~Z`{OO7TEAxeJ@-nlfU<4CfpY7R6Cmv7 z3K-3T_|#t!1lTHx#S8&+uv_SF-x97y7QY8aFA%NRK#!OX#lPeI8JpcL9pb~!rUpC% z>5P;FbIJK#E>wm$NWE^pUM~HX3~p7U5i9(HvFsEfB;hKe15^%l%Q!)nVa!SEJxvYo zY_ADCz4|h5g>%*;K&lm{9p057pzFv&FzC+7LR!{8m+1A0Bij7JKwraQSM{mCt-{y0 z@j>zIFOXl1TvEha%HDHcX#`KYo>#--oZbJG`EpqtL9f27nRa#xu`2!xz}d1d$;i2J{j$k zBbCKUVPmnjEn%&S^Ffy8(m_$9|8%|LcXzL(o+x$&)=&0jU&$SUtX@T=c0Qv$3(61561(d-HKZV& z4B0(yH`UN0f*GRc(yNbS(rV^a<&~@a{jv&8UbhK#z!)jX(IMmJf@i^`(t87=_|_KL z96Ek(zmhUVp6-aXc6=;~4*Rpi1scwiGg|FCz!V>GKQ=XUOnR|&s5cGsN(;ULwwSQ3 zO28%bC0Sg~t5aFJ85L8%VC3@bxx(1>eJZ6jB}nMtnJ~%$=gfjxAq3kzMbpb?fS%Tt z^R}$vE0+so{%;Ni9% zz>Phro1x9PY45RLw`3VUaIf|0In4R!^_dE8Q*C2#ede8;KuWHR`*|Z*VRPHx-R%%t ze8*BY31>bd#3f!d+-89)J!j17Ow!-l9rpDLQs^(SZ+Y?^wvW%P<>icvKz*bC#G4KN z&pc{J%N&w}9WwkdQgvsQq0LN=tzK3*02=XxqdPm>LLHNZE!!O)jHMHV zCafk752l()GqAbKG+NG)?QD%OO)9&I2kn#zPOlGx;MLNslk%cQAZa{C^T(;S@Eg3N zOn6f(RE<0~TecfP(aUt&DjG{C5HP2G6smD+F)pqgE@$HA|0ruke;MV4Nfyhb2ru(G#}W#l3Y~ zxnAq>^1}0>@r;;%zKNX7^5=s1SN~T=oeP?K+R;Zoij2N3p~Rm~*OoIY0KsHZHA~=V z*=$ERd=vlT%aPD84<`B$L>Uh>F3vocbfU&bKCN8Yut-@p13xRj)R0e+f4s-snqGWA zHU{1VTxRGlDm6>vDzxp1EI(*GET8(%b_zzWib)5Cr(31SA=(pOpb_j|ZFd zSq=~Sk7Jtt<>j0lhKl?9nrcI*JlgFJKhjf(%)2T-;*F3{GrP!;A6 zsghI%r@yNq}95CKm{(M)%f=FEtSP=yNQ+}j^>kKE8qNzU#PlW62=(tF(20Y_Hy zEk1c`dU(HgVfB7RAr1PUtg2qP`7I`n)r_9=8QVIMiOL~^X=$)c7;>C9f}aznnPGhc z+x%)5bt#~JeyLl8FHlGzz|*~R0F%bg|579i;k7JFxD>o^4FH_uSS)kqf!QGk^F7j$ zBRke@dlf6sOGR^HubKB5~YtDR9> zpYr?>9LNw(Z$peU6^rq)_tR0xYBMHTUk-oRc+x?@F!wAmLA(d|`S)XWN|ZjOmMHK& z)QyUDh|Ehnn`jl8`Hk!aue~og4R>p6`6%`h@!!jbi2|1hOZa|8pj5|L+Y&;1W|Vq( z<^sB7xJuIl8%yuIbj4sdMFf6_*$K|78Tr)Bl;4+WLnnM-?m=?6sozROeZbFUj`9l5 zETjh8>!yz*8TdRq;9T1~e*ZZ%gVMm)KVQSdt>y)W)#+j9aw%dNO?!i|d~(CEyJ@Lx zgG8p^mox7EBYJ>v9qUw70w=Dx!X^J z3`lPwI{AG5cE!)0qR&|r&M^8clrXKW@T^&4Q;f_KS^wgIoP518xSS5;xeL_Aw7BOq zAVM+S8Cf$&S38PU5Lqz9s?569@D}diXnv1=;%TZanYt~#CwA!gQ<#X_K8`S*(b`~S z_yG9%VzIZ4T;rRH%=tAk+Ee>Aax95H%?%=n)bKyC*A=y1*iB{4?eb%Vhr+oH6U$YJ zWAVY2)(AGV7+hd|n9-lzzO1s_fwKjF3w(LodEob#!%qdD5*fw3J*w!mF>UBcJDC9P0O$CG7m_+pU>d`{nvbYyax#wVb@|vVr?2 zVc9ig4;ZpjP!Se1U-7PRT@8mF&eK4R7ywy1v)O!eFyQF=-m-uUv0azO7(q^#`wS@I z99f|%OiN=nL)iRo+->oI$KoH(?y#dx?iuiZ4i5J@kw<#OGG|JflSRaS!w(g7(af2NrZ+OGpcT#9=G-fitTJMtg~6u7F!ozN#g zF6k*yI}8+KXL}5#ZDgY#+nHJq1s?Q-{4!f@yLm`v6F%|VUbIq1L%rEmTRD{oWe(@r zYY}sToyG4@uV@OgmO^rLQK2hx^HDDhW^onRDIHD&E3f^+<2c>a|iUc4&c4F zF2O3m>D=OcqI2lec+X^zDKeNfxMw8av}8Sgoe)#4T&^f>;?(y&5NoH(sHvXw?k8$b zX?8uzq?e!OM-?;F_;#C*b=H(m4E4aBuz3F&Fg8rVShKWg@w!ez+ol;HpQ6gS&dAht zUb#qVN&|~be>!AERDsmOz6BiYRatJE25D(sW%M21zDy~<>uj=HVIpWC$(G5S6Wfj^ zv(xAD4z{;DXmsslqEOVo8)???DBIO@CqnxnY>|mXw)kIcof-JcDzW)qL(uKyvqB?w z2|Xb@PH&MA3H!k6a`tbb!V`%8tS}MNs0laR!-BI$5Zf_XTaV|G9s#U_Zg#gD)mLZ=xIv}T6nm@J}2ta^&ZApt-R#bIbOc;X(nt>Vo z_%je*M)ysv# zWoR93r2M5uD?z`SvVn?JnXzBLg3T+aupg&6a_-cQUZ*FFwxm-^+l+c{$jyG1T$WGm zg|LJd(l8HoDLd5l9q1^`>>Xrk)&%J2mbN_G!BZl3$kQj52p>8|<5AD3lNYAeWia@tRcL{4f|Z;@Ww-Mx?SBr6gsY33IokDaLx7^(A(LcTo8={j^SKBE zB1Da8o&FmS@ zbxCm%$V2ENKj~90*B}c*-J>KpQ974GKavUVU>K@C!?-BJZy^sdQlV_4f2e-O6Fkaj z7G9UaxzGRXB?>V4unmCAMqlH&89bFB##dO{;w^^wkHC~j&Cz0=zlv{fy?5DOi|zOc zrT_ffqvJ>Ivv(Bsy3kVrjww)liY!gByTbm1?n$f5^X~~bS{b+dBv``9;)3wt&^&ji z^;||N*CnT83xdEai_Pk=KMq;OKi(Gx3l4zUsPC;P$MkvYLIftc$k(Xo z{^b3w3p{7Bh8#J}^v8rJJp5vNi|g<3vznrb6QZ%#eBJlSNe8*eCjrHRg4*KW!ZG&- z+vIRZ3P4@{Ivz-VA!Lbx`vg4+E32vUL{eF9d!lX4+dCvO>ExAg8{!1vi8++#Dd(4FMx{{goRB+{TL#B z4^VdCkMs0z93+(tUJ6|IRm4;bpQY+{M5o_NyOoV=i_deV3NzIzC2np!rKs1+b${kK zmL+XY`xY2$3aME)N8(=oOGnxFwzQ@EPo02NDdY3#KwFL+PJQvErKNwUgd$Z)0{@2I zuII~*Vg0;ZPWsf>%LQJepR1SFp9eL(IDvp@we1SH0$d1+lvvd+Shu;!rIZ@%0fKBb zpYxv?lz2~~zj_~0o zXC{r0(<$S3?$e;rln2Pn+;dIRu;N4s@Eo;o&5aL)kZKHJD)LB#ayp~@LQoab2kM#h zVXeoivQ^8p@UI+6#IRjF8)xwCa^V~PQ?5!oBsti;)OSCc+D)S;vz-p*{u}@g2DI*^ zQG6D>hUe03NCwG{91E2?PaD{u)ui173?`_XU9h_0`XZdzGI1rApjp%Ebf}a9?~`*n z*orUzzStp811tRbP-Z`f_>B5J?wdGNEP8iF#b!nONlfey_4`xRW*z-BFGF1CCl{L; zcOpDdad}B&vg#NuoE8||ju!wB%N6VvN1@qt{QN^N->rFb`1mfp2#sEmpGvw|+Me@MM;_KGpJ-y^ zVUlueXH-HG)hXYjvgcB}s2C;RWRy&qG$8YsG6JgQoDmitmUg8#Dc`!p>9&i0E zjP~I2kG`jfjw`p+FD|?@KDQrYXEpid?-qCM6GPm_zs=g(B_TM!%UGaE(B2@1LqN%u zR3fn@F}B|{EAr;>84c;J%z~6UTh$rL=^kMh4pbnT5~NbX+JKs$`AeRv%8*1zEpc()l_(m z{arvy5YTTJ0RJlLeU6o!e?S$r z^!P~5bPE(BLj(mcrjgxseR0BCalr>n=vr0C#zq~5ANLCHTF$fQ2prBu!sOWZf+LOa z)&?Bz7a*6DALepmU~G}?6}~vLe_t!-4tK>(7^fiSEe-~cZL~+|VItbP9GG0DswX@M+CTB|P>>mq4aaS! zo>@@1@Ug=WFhYA{6gi-{cO$(vUY`4o+PbtaqA!`K_qoCWbAOn)iIzT%prRoiO49i!N#HP=vR*F`Xf-CaJ3CD-8Di+uta_4m;=;w|B3$sO%+GZe#* zB+r8S5SWS$oK-{KT=)?tk#z4ul!0OJ=JqEczA557EB6Fu$3uQ@TMaU1tsR@<+TV=g zGxjhRsfmjeCK^}|Fx@V4V5Q1ZPl_d3Jl|oFBaKyC zU%Kxv=P~v{bICzCD;n4UskjUJ)}m)V?=xXg(M+>5=lXv*rs0~rAr_B>FzEo1FWr+l z7e^Jz2vl$IP6?eX$rdy1@CD=vUCy?VeiDOSd+FFH0QuC)9S3 zp3!@6^#@}1{G5T4iGz^D+tTa}a^Ry53yF+(UMhok0P4-@b8sr0IWigb5?pbyaI+7K z|64x}xIN2Tn_JdL0v^A|>knYvjcl{!Se<|Qc}HdC_5IWE>MxvOXM& zHC0zHvf8Wz9mU1N;D3&uB>;S!3*cOrC?@jFf>gPw^5(f0^qalEi37q-s_vCbt8cXG z#GEg8)s=lV?c|D%7xnwMd(9X(;){eWCx6j+;k7&lD%% zAfjWSa(k<6yB#{GwsniA983C&sA_+LaG)2X0@maO6_5Ev%WYA7uWU)rle_90W}75- z;@atFy?{+tUlh%bDVX$PA$-!X9asnOK%4_u$zl$yBO7;bzxn-XBWClm9{;fT#-aT_ z^6Blp+x&sJ0s4FDPpGB}RtY;6Fv}rNc-@9?&fRkNn6>JR(B5^;ynp%I+eUvE~ zF%JBD`~wTeoOZ_WCvCk8`eCLqZcQcR&p!D4jMXzvS$pp6mDdd#HuM2o@BBiyKZT8~ z$#x2wauf+%6!kt|=m=v1pYR-D= zvSA_nD;F#-P!v3 zhR=^##OWU~L7nxu^v!MeM0F1MX7a#g@Sc}MOEPq_PBO*4@w%EF)6wuK zDd!KQx8j6>5}rIb4uG#Ja37`Zz5ufubu1B!)qZjFSsU!x`QKolxQe*RIb~a8djb{# zNu^9m%{eRD7E8>5v%G(X-8-gtfYoh_?bD9#w=80E_HOkBVtRBYn$6*kVIzBe0?`=RVsxLH|Ie3jF>h|FKP9SvR*&|Gvv&w%lW?+5+)#ESetFra@n!w|rQE&JKr5{G(p8{6E zQeJjOYKqa#0yt8xk43dNZ2fY&A>8gZ!$mBqB&a0>i`+r~Fd+C=n z*wV`R0~S#N3w3&UT()^+m|>wmfwNogB6AeaXWD!s}Wn? z8)E^sbJKs`F2UrS?%;HBkM@qa>LsT>9pYvA?|c;?FIGMOW1ZBB?f?pEj=` zML(xO#|Z2=;Xp+e`f-cdB--KrxqaKtRUfZdHRiR;j-AHd_}!KcGXp5f%b;8*S`na- zB47Cv5>zJ=CvRK49gB8Y!#nSi|UNfX|aD)0oC=I4Gk8?UfwRWwg zg9M{S?5~Qt5XfNdZrs)@@62gStL~=w>W7EUL68)0C&=PyZkbK4{hGbea1#`JxqXUn zzin;vvPJVY)Q5fE%_eMCi}%e3B~ObVYAy&akhz92uSXFE>-?SHe0`tIj?EKIra=^s zJWzko5djF^f$PehZu(2_hq&$<*EKr=?v~$TkvdIHcgTc9djn>ztDD}NX{y_yc$NQ@QlelMevb@iqe!Cd0lW?O{}51 z`pz}CU+`w;8brz$rSKU*1;8FQ-LSmsi9US_-;G$D1FGSk6VrMEkV-M8R1&0rm2rPb z^uSa%`EgI>VSm6_Q+?aUHEU+fxnMxa`g<>4>cWg1eE_Jgoa6a+bA#05;|4|uSn6F9 z*SXu>uN$lY3caq73cmQb0&I-1QO_Q^{_EPx%KyOvZkRvOtD*W}48huj)Ekjkw1kX7`#p)q zfl46Kufi!}+`}xgO{aT^XizqZ0DljM+tuiDL;w~k+G${2RJQTls9?Cdrlo&1g|CMU zQHRr;-TfkECdrbF2@M-Jzw)13ANo)KxsZ?ymF7 zrwl26H>k7c)_HtU?8*RO?3@z;By{YO0U}*hP1P@{3KZk)SHFKg+G;S(ZVbTH0rUyP zXk;dZ*YX${lX~i_Uw>!H@ZVAz?#4Gg^k~p391j%D?^gb%PmiMVu*ErOce4lUc#~vI z1)VdcQbVT;0{9L5)C|7Uv3%7kKJY(y za@A+v8g~>rZWw<%U@t}GU0@)r;{euN-}Fxr@P)eY{He}R9!Xd>nX+U%uNeRO<}n1C z^q$lTs9@OA=3Nr^MQ8$ruOCDN$rB1C8>3vPR+xv(W@iwDz#7KFSimVJ#k zuTYxI6l#%2#F51K67-v`e<ExpeBuGwBVe1MAz~#zxqu zP@J<1atAfFwXa+_<%GMhSXl9=lqq{;6?|!dv(nQb*gK#@zzLt7MZE5RefFz!SM%qt zm0A6qjzxby*U$cGHo0lDZjgltCy%ZqQ9ue@j%X4O| zs9ESN?(w(AsK8)T69-F${{((YUDRVbd!7|_Qj6IPvkGu;o3}1__Q_|5ue$l%S6mxY zdPZE8q90Q-;3>YxkISW`|LE6kZeO6z8}M)8xs-n^c|A>jxe(qieQrUhrLEDRCtVit zm9RxX{YlJ=oAs<`Q7#wR`G+VyaLUtLpe?!j#E+sr&vuj10Jccr%6p_0IUA9F7rYYq z>D(Azh8T=sVCoDd>@SP+s4g8JCAv65LwSj!`dB*cln3F4_6vvA0tLLXoQe7`edyeN ze>{IA+Xr1X?AUvV44w3dU5GAt*WEZ^2Cp0gEpOgNYbq(-Uk{^5tSH7uQ)v?&Fd76W zW~@TK_TS;sM>b3cofXU=ha%6z7AX{LS@Gegr5C)u@fU*5@`qjZ&GeFGs6=SAbqX~4 zu#LOS{B416YHPU2K@qM#wckTYdw#zL*k^x{trbs)w4`L``Zb$X7j3PpEgL_C*0Y7V z$O?rz>5`~D1Sl82v1QaPV~2eq=N4aB+3rukrikP}F8cCnWYz`e$|aBrb+Q_CVxqOa z?!9;4o&4(fA>+xOi|XYXCSW?7b{sw|%GQn=RMa;8t+JtcDK8_fgW{qcL^j4AX$yY^ z0`HS(hrqcqq6dk1AWzEVbPm7t%`Ibj+VZs63{fRLVG#`b{mUpVUM<)oG%np%Uih9L zBqu232jz%WL0C4J63w=Pi39ub8N%|B<=uM>Q2V|ufOctaHRf$;y4Q+Vj)@Y|aVq4& zFZ!fd58rHwq;yZo+>d)wf5Z2u%h7+PgXR9VHh0D6G!5%wuH+e*q{7zny}ZHJI5w8# zwoF86G7yELQBL_=SFXDGtXHTF>(h&852-z*H(Kw4>#K6LvXNl35z!Dod;i-Fl=dZ`^pqrP!wdHD^*?uDyON0A^>tKJ5sL(V) z>j}_HILt;FODVh`e)+`&L~kP&o`9G@tE_YsSCU@6Xy>mTPUk=Tl99F0ZaD(53h8N} z6X>addLYS}WW)fy4LD4evg={h&|Kf#-rVx;m{Wgo)CFsr9)+u70gPT{quaM`{-j|a zL)7FtCN-ZQdR%qQiBIx8h(mu;tkn5sIsCTcB-!5HzA!7?a|#BI2&KDH9NGa4PR1>g z)Fa38O2~qst-ap%RDCpE~o1IUDlhG2u7$?LPjMQ2Q-j0{LZ;O>rM{yX%O% z!cr^FMRe}j-%=ngTc9Wt-r90Y(vWppv)9KB@a$l13~_(0RVQG~@F*0G^2S<-2nz*+ z^XbNbe}CN5Vlw};Ih20@fO0R$d~6ZOKDY z<%jA1XPrHI|Dz!anY6M>L!_OeFvk(kWsIk$8e(ot&fhuwgeyJ&OL4 z%E`NfoIgsxQE_qcL>-eFF^+WJZ5r)rsCEB_$l4sw*45 zhAF3XUed)lNlmqktnsUGF4l(Zjj-tj5KLJt^OxKBwpn<7vi z$`4&-Jm8o74t*?0F4gJfW9aVC5+xd)AL)S{J5n1ftGBvzq4ux=M4(w|x<|OL!xGW@ zHV=!&ggH`5PY7}TRIl8;ZX{m zKuCuD?pBX~9hGr%QSKiTmYi&NFhtvOVQ|t+Ab}NZw7`ENy39jW}H)2K^7=5dG?(8#kUrq|bF zZ@;RhK)4zH&;u~Q3W2?AZEc4^yL)@shg~obc#o!&9~kf@hl;5)SW%X)G>)vlXG~Qp z9wqqLIQb7(jXS`_*u1hQ9;mAfzc%j`WC!IP?5rq~V zIU;!UZB)NV7nj{J8f!WRdILf7yeU{rCKiiC7wUC-IKaVNkSu_REpg zqh8!FI4S6^uWfAywi~ID7HZc--UnpJZ<_n-E%Q^8)wHFGBa;$QammWlle^0CIy(Hpy=#4xI8 z%dB+%=|RZLQU@k3_wcq8|RoPJZswLg>41ZuI%~EWtsyBcnKz!655G zE$yFg|B}zrm9J7}qP`Qs!Nt+nWzg((xrwAO$_@W1WI0ct=u|Y6^hf=>L?JK02Lt_d zj0#K>E8E9Q!9d6u+V=J8kk@~+z~gV*1>;q$8iH@j+@eu2o&Mv32d>!J2Dt1u&qjBo*w7Qkw;6PtM}6JxH!)A?4-Uj z+p5I-IsMW*r}n;o!|6|ro%_`XAfZlBMJ_=f1g z{xUE7?b2heKR~H3<36<`K{J8n04s`j-Qpd8H|6!bn>;?C9b|t`hTTt)DV2&pDnr!@ z(a`1R_yL?L@P(TYb`mgelCoga6>g{r*KKQjV!_o90=Ua+sSI_Q58*B@VN{6nX~a_* z9l6u_j}(Yf3K@-<<#cjk1h>?s*(xE4V-8}X!l=`q*zfP}_t|yNxw~Dc?a|(a)hm;@w(f{-rKj)Vy3BDZh4u$N~N1jmd(aWrT($JyZ#vc^5=m&>1 zmj$&-Fdp$g?sVop;tK>)(6Ms5K@lv3v1BJCJN1rKYC6ihr#UZ=_mCf4_7BXUdjS@> zf~T>(g}I)Crx4+$=3tOkorA>(6+lknuFTk`T@1CiY}tRg<#D2oDzhIlow$o+TABj4 zGYFDo_(f78aWH}}P)fo~AJiW@p-=yw*#WsJd#Nch|CZ zEU1WzMAQXEssxat^b%Sq0Rp7w<@Nr)-*4`{0Tq7`T+sYKndIFvckayGGc#w-IdkTm zzGr0@%pTEmle$ZQX(&HiS3*dZ@U|(G;0ozTfypQU?J%Uc7!>Fb&eSp!FVX}J5p&>Dr?r*=iVD|>r?mG ztSN2$fq*a}&PK)LtgUJEN!Aq2$iAN}{@3h2XH*I92D*Vqst&&;pZ`+`i$d@cPz3`! z_P9EvwY6^yHpF42SZwlTkB2$fM4HX2P5OWLyj}71h+Q&uB~$|r4K`o{Y5f42-{wA@ zGJ4J#dg5HLEv>>p6hsiQ1fGG2v1a5Mf|dRYr;hCU?4`x)N^REku0B6VYG@1-dDI3X z$-K18>wP*SgqJZXgdfp>)o5sIG3n3AwuWxHZt|wL$6wm%E+mf>7=vB)&JF`=K*fJ? znHil$*3_3N5xMRhcmjEGe9KY1$3JCuaVV?moX}wQRBT6uv>x1HH#rp0PKrQ>%MlWME#{`2|9`t_2lPpz_IrewaqlZ-JH>Woz-;yQFz z0r2hGRnie*was_lqEAoN#k^QHff|3C_#_!oH5E*?4{Dp4tfsDr{6caf+59&1EQH=p2`>&QV3lqZmfc-g>OL`l49r@!!fSmn8jO5B9ETDr zmf12L7H!?uHDAscaq25Y5RU7$##ZhSWbABcpbsJtuydMiP(#3tSXG2RnBao^*yo5L z7Kc?*P3M*!ZW%GH{It*aR1bfgJM#274KI9sS=ZxF_#|#fNr}XwicNQx%&hU1Kwcbv zDwV~uxVQuPbSw>4mWpA9fM#KYN{7N0U*EmmvzC^5r|hW- zBr|hb3@&h_4!*l}{%%d*%AKHC*2NQvZGL~K6lUA~EE{5bT|-oAySaZp_G#%&ntH}v zH?{l;Z8GWx;-a^kxC=sDS0DP;Xlf27`)L4j!#7~HPm1*YXvO*1to#?UgVu;&8!=ko z2!qH_2}+}qXk?}agW)(nDOIQ|UPmNz2;3bW)7}|l5O7vd6e})QMvW6`e-2xN7| zHIvK!X0|$uE2Bnx2#P&KN%FuU!v-vey@L4Zu}lnOG0 zAS)`ks&=dPA|6DFpmg%~W7o7CHg(&ZJx}U1!;)r`_H2LHFegw`HP?z&R8BZdD}OSP zjred)lqgB7ZO3Q)j+%9{ECt#^ctrt_0wm=f8CHA&;U{qlEP?uUKA%t0nJuSZ^2zGn zOsDoQUjJ!=LS=bhc%W8_h2Bd`v51LZKn<|MfYW)vCPp;Y<1fBq)gZz}RrUF!VDx_n zVT~#j9a?`c>2L5Rg^Ga~=508{214hgQ*F6W@TWWwspEJpLQ zWjm`Sm_g3s%fU#ZDl;ns^LfM4DW8mKH}CENW3QdEd79Rq^Z3RZU(yo{C4|DNjIBg@ zs1oZW4=3E9qTE3e&u}_)DNxz;@7(zI>bWz{m{fn%?c7UF>e6QT)UDHQn6a}uJ11*s zIEaNud=5JegM8$L7aBx&2u&~)PPje3cx8hxwyPl!+Z~7|D?+hk zWn6z7tMkXCiVE%&DDjC3;d6ZcV7VJ8%2Lqs#(RdJQ+DltH&QSQu5vHpQuL+-@^XfD|7wTPN-_Y_ZYXdRofKD>YaW~DrJ9G zEzQyLDOVle_RRMd_qS@2_sqJX*G1C!#g1!inLkD>>7BP!*F_*bA$KPV0(*oaWpK*Z zXl~qdEMfaeGB?ep4OMSnvSGuz`!>0Te$UEXG-2)S?K*aR9b2}g9aS}qLTZZ1_^y1A zPdMVAMPXqfZiVS&J8(ngrZuCd-PnKIg_KeukX4C{FnBArA(0}@O>OUucr zgpdN(O~K*{Dv(HvRTP02;t~fTz}M;`Ihj^dP3eXipImzU03^~5|7OeM!Gtt+PHw8LoB+(oqsh00Q&@qB;DN2|KG zI=VFj{dPQP3ITWZg7qsJpN0#rqV$ZsPX2HN6kQxnO%+yG$(-E=EGK1S zF=q<4UHco7Wm~t7TyT4z4~Y~Y`36-bs2e$N#SXm$8}FB#(rIcWH8aN(2uit7a_2_l z7*qm7A$W>_zb+I(;gNsL&kA&*O@eyUr=?m=bsILX2eK++rZ>*q@ll(TTMpg4Vn@#E z2QUB2NmI9co|>O~ZB0WU9D?2%%-!^DlabZ;uDQGCdm9?x`e4SI?*NNRyowSOxd+ZJ zl$E|>hx!6VAxC->$XWVEZ^2Lq`;w)(KFhS!JLSrh8+ghBSZpj7GpGSoPRdkc=Wz zyr9BgK8r#{By&^a7(vwLgyjl<#n$hWmX!RQ<2$rFDG~c%@vw2d07HLMU0KMVB-E@c z5ipI0eD4|!-r<sZUM1uLDT_rn2RK1bF@ru!J!>ha0O%qu3XJ?s4U7k6Z;Ik%m+YSv9>{R7@#&ZvLcxZ+Vuu)aRSk)i{O1mUKV z4^He&*!CAo!z!T8TkBade@-Eh6$R@8LBb!MoLW8>br~f(;Lw|UKWWY{=mKlelF0*G zt811$vwg{e+rv9IFE{!dexj( zaa{b?**kxx+w)osEw2I(rk6JjLk3n#UYC9dF%xTR+<|yy1hiRB-Z|+VI(>ZKi1Sz7 zQL<;@1)r5(C(xmSv`UND>4~g*zyITDDUQ^UjaV6l$pyjM?Mn&q`{jF5mC(0cvr2qp zTDvX+GJ3tajbwnGat7jD9{KrvPd+rAo8tH!vd(`PC@V{9TIBOfIu@2K`tc>7&s#8X zK(}Fhto8|B|5<`MUgq9jIA0qNE`qfY$b`Yc004w8Og3rjeVE`9+95gr8kbVSP5D&+ z`2#|;r?849LT_h?6dyQlY0qF>*S*p2qw#z#0m;G28Pj0_m*cOa`IxY*%CHZ$aR8u_ z{4ak7BJB6kib9Rva`%?XS_xX^Lem$r9c;acO1VbktydPW$uk)3t{tA3SezSE&C>omZ>GNyf zmlh3an0;&EGt&9D77xDdo-eX;+H|Xd#~**%++wc)`i!SJta`~^)wp0m$%WgWy>St( zIY6*ZDpHJ7^)qF1T@ydX@GJ>c&GJW$DG*pgwB0! z&h*oaCR1C$(g=l04^{$}%v-W_T+PdOtQWm8@kc~<8o&d}*TMagcGdoaMR^zU#CY2>oZwq$ap#mY4WHnvdwsAeXt38cjg zn1_-l&J@g0jDV#MDOG3aeZl)HbW?wZokA-WPvkuCuP8GX3lzNgQw5E%mqpoUA{_iE z#gW!atT+J%02_txT3;xbh}s;jPtEPt7gWJyI%g@7LHfHws@Wqfm0Sg$FA8d{m>|O# zq!4-_urC@h<)MH-8aGm4@~PO=xdO|bb+kM<*)#8kQ>$ml9ns)5uQYTBJ>-(q+Pq2J3cns?L$KlOxM);qdI7f zkWw>fb*)cYYcVk*Gw%b-S~gnrcp(dXNe8n zijG%Yy6Kag+pj(6Q$u$C$(2A>7z{!|Rw-Hmq5$vVe>4WYILoj znSj6{#gjmu;#OR-bBIU0kdw#}R2+>bwa~*d8HonR27G+J)6GF zG1^93jHaweBtj~S(g=S7GvUKpjaj1~g1gCCHH9ive^-G0A!OYle<2YI$j|&SQ>>W0 zFK+-@3V|u8D>(;lUr7b|s!v8{{_wX;%D6IhDEpn%rP<3ayz-f_!P%wK124_o2BT!m z6Ux!-@<)3O%dpMsIvmjXUbIW*(oP6!fnkm)W^jokm}_WBCvEnaXIkri1-lJHnKg$94u2#}Q+>ic8? z5`U`Wy8mvv=$3z3J3j5)xy=?+LCc{vSPYOITOL#J`(^2McaAu3g(1J750MpCpg>tE z0Ns0HKH|svk#vd#!>f6{dzq|y0&%@nZ#4D@!=wOoNd$kjE!u>6i2T$x5_f!6#N#m^ zV3`yx33gI%GPPn91^GB}SpInfR2(RLFLjNq)FvZSFyX@VjLa5tIfNET>p`t!`{o7b zjGdPyC{c{J-y2}fn!-|r=O-BR&kae&_P&rm33pn8{1-?coy-DJZ7diPN(_p*+n*1{ zpTJbGOdx-K&xITbZXj;kQC%-VdagJzrFa)36Mq~u;N3MQIA>vuJP=SSNeTRM2nf*$ zu1ImIfnyD9lRgGT&Tp5knR;d6*~0=ls}zm}q9(moZ1zQZ4cQ<%eu3$kXl9DVkeR0W z29_YtpEm525^2(NTk9^mkxg>RNe;|>Q-}1scN_MSx z*VcbO4P9P+ip@R6ucYe34^)&z=UT4OY{v7=E?FH!AgiLHB06IS64u?2*|puZo?VUi z>MZb}qSIq0g=L6HL<)r?iFnWhnNWXHXMnXxr)M5KRYb;O;x zSK~#T__Cy#`5p^01WHB~#xdVX^X}+7_q?$y%2F&T9Rop9!m^AJeLdleX|xutfu_7a zp<%@m`PJX;_`8#Ihx}#A(!5{?6Pf|;0Q@dv6K^Tt zw&JEE5CLMzy2xonLggA%3l|X#Rd5-maptxzy1B3H{rH*Qp4Hp7UGv|6PI!cw4Z(gu zo_{qcxP|Po3ltR>A;>0^EgSOLs%z|4^BLQAc%@z8WPB$OOGRB{tjd4wi3Q*)3kKC; zXaXAu@EK6vkJEZ82qb8stHVB_4F*G!#$Y<}?ElPcHR-C?Cx&V(8;Mx(ZA6y*PEcCd z&I9>dg)f-cgqxPvPrxa@oHqYWO`N^Sc&yI3HFh^%iyO zYRNe*sxh|lheGUK0u#u+Q_`BCLKTljgzfZ_(Ivn7Eps@7AQ*pj<_8*M2C-bu!71v+ zX2DOij)=hZFYZ-TCa02TY9`+MmfXC27ma!0UEnAslT3Xum71YC!1m^Y5wC~6c2F;t z5peFF!u@UQ{@TA-TK#WXHwcJUsn#K#xGjm>a=7wy{9AK7-aLIO);%5?yi-#ZQCJq>$q6J4=;RkPB-v!XZU~p0W_QPA(8c9TT)=X21Lr~dVE&M$} z_q!H$SRd9~POXjU28J|dbZ{7yVH7$XxDv91T3ysvxqHW^IgBom<{orFQ-(vXtj~Kt zoD_~}23CKi3tRGvU}r%Aa2mH<-4Y+eQrgPeeQY5S%rWC-+fC0Pe8Ng!cu&FbR4$x9Vh&RR z*+Qrn0r1*^j5?%MdG+NZaBijui^`&X#4220J~;hz_sdCmDZ~EP(x8zEk3q&acD@q=YAEIFS^CQ5_v3 zJ#1oWLXZc66>Qz3phF%M%l+8Ai)Tu%VuUfN7}Qi{ikVGDZ5G^-Wf`$i8lw;>>NKVZ zo=|~~qI@Rc^^vPUSHh|I8=O_7u!gHu!IbV9SYqKfQLKa{Nk>ZVN)2)%y-u&qoU zg&kUSYG$HbG~Fw4P4~D^I=e^;&*-4|u!n&%9_4M07tZ?7SAt~PY|qX}I|6=Vb(nn@td3`vcYf+J?_DOA8 zK51#$Ix7x@qpz#jxO?T|zyE*t^Wrl;8`P!ymZggZ`?r=Z(7UTWMo(=ZzGvHp>NU&X zoG_`l=adn>Zbo^5RympdbvCCNY8ceVfd~o+3jrG_^^I6aNO9O7LOR{&MJL|nE8kj~ zYPA}L}a~8K~L4>zf;%oy_zzR&Ut`rA2=?v^X@BP1fwJ zcygob%B5UvC}aYJD<>?!(wLfdoG;+VS|e6(nV+=R{=MpSgr8NSa2L=)L+sVRcy67$- z!oma(Vgavl=}$ScJ2P5zc!7HMxfd^}yP+EAsd4kRS7uKB>}6@nYukT*T7Q1+Z=tS|G?NoA ze0#yk>Dk%W)Na{Qv%755sJZtJ`~dk27Kr66c<2f$lYSwce0>|KZMsqV@=nWZN}q5Xe*g7p^x*d1*lnZaT1tl0IuBz@B$(#&1s*B4#Tn4Oj4tX#Qz+Besq zF^chGvBBjcOJYh*&v-O|MdCy}j6F$mTi~evE9ZUh1%monycl#EQjPvVR48=+QA&{F zyPM%b6|d~xxn)s{_O?p1!IUeMNYR(Mic4R&VZBvvPK1B@p!(m}WO1aSiR6{Vk=fWFnBw`R9q}f^&SLbnxso!5sD?^kxfo}3Mm|! zg_QfZTmVZ^?$yjV=oqa&ATyGQt^WFk9dkA>o!7@#yX$Wbs~KrPXfZ7l1M6Wi02IH!x?yYmV7pQ@QEKxqWBee9k>YRwTnIcM|L^I>m26R;*=LrSqhw zrQTdwQL*FGi#wbEWJQWi*vXQxddM0IvY#)k{Gc4jY7?$Pgb}vS7>TUTcxiTbt1V@y z7dlx$!PwuZfuTT$6s+D;{Luw%y49{(_VUiP8|HsCHa1qC^V;ka*E~LC(T1fzTrM?K z`%LiSNM&0BLq5r8!Uydav)fX1zTM@EzP<6RSMgl#?2c5Da4qWAZ(99%(Mi;%2Ihn! zEWCU3^2!OTu7a??8}z({!YSoqa{da;S(a!3+>5g~%4w8%@dT}81QOQ7B744j!1)DEkE78Yx5I1Ep+Fmnk~7| zJWuGgG9qE;C$+_HzAu#}6J{tGkLisDv>ks`;$xvXYZu)VdgD#W zxi6jklGB-y_N14>6pRvqa*3~)fk1y$JoAPp`2i87d@my9cwAy+!DppGn{bEMN^9PP zt1v-*%afOQ@9>7VClqjUYVLTU!$oJ z6CqZnk2dt09l|Q2a|86NPA$830g=)^7!C{lE4gz5QrKjxj|HW8*gr=AXYPNYfym{O zyY#xphnBYfaOGyB)|l%FhhXsz?ZQ6JQHdZ<%6-!{5^(I%s;Sd%fmxusWkgm*rAcFP zS537vZpEyW6wA9T(cTDj}$#fETs zy^<*fdXn2uG@`h~r{EF&f?&l1Uk5H`pL*aCwpmHuaBv=T7+oS%WrW;~_s4<^0hP;% zN4)c3ya^M#4l+YQ*J6EHqX|Jy8`D@aOqTSM@y5(TsYF`>1b4LIM=aW`f-1k#CkS6XRXFrFZY%ao>jLZxLH&4uVMd#%~V_(!%$EV*07+nV)BWDy*%N6)awd zFO#G}A1yA_+S87&u6HMl*l~v*n2f-lJv`hN*PSkuV~f`{J!a8zQm}!nv#1v~sGs-N+;go? z=N(n>?hO<~1yzxhEhCzL3-_XJc;*uv%t)9fMKxxq(R1g4cmqeS=t93sANSNs)fIbY zGJan>@w`74WC#=&6$#|?{oNO=*C*p;W)mE)0%M83jDCg7cti`QAuOu< z69CXRJUxgtf6_mq$03eeMXV+hI&ORotajE4K)FV#kHzhQ4x9mh_-w_UeXG!MYsAV; z0A{!V06+jqL_t(tQ_gsRT$oW)X37N{hywz&Q@9{ALl<#Z&76N{zX^zzN~YFC#kq9V zcgdiqhUy8_sp9tb8n~}gRwJSBl#FFN9okUM&Z#B$^nV@s!QIxWM|V~y(&Fy`p$E*< z@DbGoT+monk!P)c+Y^BG1;Sm(p-|NXZD#4LHYpGeTlo&ROp&sp>I5mPYbULH$=SN? zy}KGb?9+G^P$O&=_)_P}Oly0MwbHsZYwti7Lb$)5oe3JMr;x&u)fnz_v~5%HCd`n* zy?l&%c=(`w5S3^&#wbMruwd{cSSd`_Zd&`6DH>=r=#9{SXcd(~pMw4#mg(c+!0N>h zUL-746c-(Rs(>*2KNrxhLY|8G7c$HhaG%H3UD2O-;9v@1p$T)ysrAZaW zsu>BbskJ|U6r@KR?z%;9=f7wRx##1Ox|~2X@kl%Y#G*^I&dD%o8g^`){rZbTMZQJQ z{es~<7lrAs-d&T7hD+dO8SlxA5H?OjOPJ~li6oR<;nk)pF#m`7_wZfXhQdiHP~`Ue z9Tc6J?X!1fT{M2h7gv3;Zg{?HVym;Co6>6FTXRl-?bN2#?I09^pp#LEnkCfq>Y51F@+W~Up_!=6?!*6k$49#C)?I3Rfv8|H2{EQnGRKK1 ziV>oJ{Ycee_Xre1W7723rau?+`M!p6N6I~gP#85y0&z<5K!DU$RG8a22vYw^&HjWp zH854g&rZgp3r%9A;FjRVA4IaUdP7n=p~EZV9o$*LzHzj{)T|H|=6Vk^G@6lQZ+&x7y2cvx(PRrN&<4kRFdK}8sNX@@o+`V5)ptg8>kVW9y73vY@B zP;%fs0#_mpI-|y!V$SMItg#gJd*1cDao=Vx68svQCMt2X4$2Bp?L(LC4*45PQk|(E4nFVP?OjfP z>#-uQV`pf@7YuEPCa88{NQELv)yCDYO&W4?p9S{}_z+YT`l%*KXRL*9e1FD`)3&ZK zwdy!@r`rct%EA^sOt%OuB09A|CUAV4<*;jOH?JQ*>-N4c^RqTq&1==YW!9XQ9on44 zdu1l)C1kh2^C;u$;x#U7ew#}x>S4%#Fqx2D+RGS9q$9P2bePVBv_P~YDLGP5$&i1Y zwEl(dk#O*PU7T%#SrC<>>FGGEXw+5LOc$9P+e9e9aG*n$;#Msh_AJ##xJ?J9lVyCx zIY<-4>Nga-TeZ*?bY>pv_&rd5Me3?XuDs(qI$;m-MBb}%ORkurZn4Wg{9%wYuf?c;-5#h^B;um2 zi2OtoAw4FuxYcabI^rQIMHqGG%#Y_D^w=DbHpzY%8T}^#>zrYa7 z`P|`u%a~M+&NymYb)$sL@XgAs%u%L{0!-8#2sFH>wM)VJO)IDO+y3e!D}ItOSj(TQ zAGk)L4lYm)PYo~cIDXYev(ePu3m5B%)uHlnht;Z&*H(SJ683;lm6b67%1R^Wwn;CrDH*GE+a?4;uiq+5y#>_d}Vo$xN7AB`{23;-_XB8GE zWh<(hX#aP1#N zqt_d=VnrrWQ{kPvY}p6QH{kQtnqet}j)K@AumvGC!1p5_#Sd8>h8g`?gOCrqqz%vB zS=almAJDgr*|0%If1pZxU_k~F5vxW+jrR|K4+Y$2MPapnOWP`DJdp4wg)rvX`4xOZ z)(Y|~%8BFaaEQrlgoB)i5tEQ#2}nGK|BHgN?ha-Br;I%a&eI_vT$+ zVXM_{+I>fxMqx@?^48V9?s?_5GUhvHbHz?wJm!Y#oP@rkkJeY$OnZLpr+lWG1m^Xz za3BaM`wHrI)J>&&kP5@zT2I&Z>4M+qER zVuk?N6>@;sCJ;|XTV|vilHRH%^Y1zT4UunA5xqzMDn+C!*(GCS8cEkodB@B8k{)!J-K( z9yDd<_1NR_hw~jaQ$)7FE4_4P%iwvh%|5qX$2L(t2wa`RO>5g3-5CZBX3)Xx!mMg?KB-Wfi3=^oKuA6RGrb4AJU?3tbq_RxmZUU@H=!0XaO}d1^I8;q>9IKV zZXheLnb`BmoaNj}VbK|Fnn^Ez?OD6#@g=TnzZipcky}w7v?Y?MS*h?0w7z!1{8?l@ z8+*V;`!c9&NHHT90g^`8*N->U#CMi&eFx9EmrIJu!_21dkE_8OwY`R>%lC40>T80#jycO zNH+Es2|%h5*u+oF>hjAC&m4dleDMMA{cxMkobmGNiU!FKxnLUB=Q%*w@fB*VNp=O* z1q=j()){yEYPPH%yzSpNucks|@ers%9CAGWU+4U(^3^3+v*!)&r@ zisjLF$ax;UgfbfllgXfeXj$|AW9IkF&q^DlF&&_6)c=3rpU5A9SC%Y$qcs zegNA;Mo$Vl5m*ak74TJNs>2xFy=CXbN1yI1t^WivJ8TIW(p4y%c5d5tY$P=s3iDX? z!)hHAYNhhp#_d;*TYPnT%eJ4^NhZnT4**$#vJ%K@@ApHD76%1?rK{Vtdi>146h5h# zi;hYUPRvclK3?(o)vH`wKsZKS z?FH_yT&arL@vv{J&Y0c+S9NLFuEQZoY63cj)GDU*(9#-Nl^vM#`IUkW@o}?}VKsed zT-RPQSi}k&a0!QhgW#Lt&Wl@gYIj$ysbpL+Y_s!>5u{-!Eqs5DnFH|5*GhW9_{^JY zE8tQKLXQ+|DS(=S7-%9nX9w}7{5n|;_}h~Lf%?C%dhW&#4Fy+dD3&dHXpnHAplS{uT8>946*m)u(j(=6NLclMd+wRTzg#~lzjdp{ z+ProTd8`>7E24U72OP?J;Yu zB zMytx>Q)f+khS8-%ip9HXl4IvzfqRl*KN9)jRC@l2@V;Ws67!ScMfug~M=)g$>00pyuBHMR7_eg_C3wBiE79YbDaRduT)WW*n{!CS z>XcxAPhJYwx?_|X;s=w)kWmpvfCQ;hUW*UJ$KVcuUuGpX8voeF zW3nrN<*)-5m9X#xS#CHUi){uA-bI;HL|;HpNQ4qvojIv(eb`z5h8LO*!csltV96Bj zx5U7Zr&{z{s2gB~P><<1v76uMB3VCrG!MTMwZ9;Hft_~HUd9)b<)dJa zun_=IFg>B6A`eCpd0^{K3^FAs#MVmXrKJzfyZ7RMi>hP061Q`J-Hb|qH@uo((5_Xn z*OIOY!lW|#`A=k1EC)&|T2Z!mS(GZSn%WI_5MqjzDChv4$yYG$K_sj5F;j5`t7h%I0%o`X6jSyLsuGrhn3=y!I1bASO&!L-m!zxTry z*A}n&BC}nGuNuu6ZMRg_M`^2y3ZDQ0Ro($Bq9g)Zz*@jgu!2p`7ASrgZj@7*)yGR_a&UB%CafB9QCM{Ef@eqaCfd1@(wZDME_^c7qBCu zf?!Z;neNo(z~W^HVk;)YNK5YW0^mB!Tc^JKZD+DF7rrtTWY;f)7$7L~&(~Y z-@+73uTW*lXe`l4B}SI%hdO{xZy3Nd6mTO_M!<|Xih=SYQXiBb4SZ+bWy1=4tw`py z9kkgKP0;OsJXk;AD)7>T3w{DIus-5ey;sgM=pZ|UO7S)w@697@sqT&v~nQz!WnX@Ig| zVW=MPbY$m@z5M+J!_e*tB4b#ZrF$Z!miqr48j8RLGenxhx*oqEB=P|r%&+G*05Jmr(D(b`4r z^0M@QU~Mp76Ui#*{?x&DP0NhjZ`wcgRm*Sh9vJ4<4GjGK!e@I;r8mowGN$O0HS;fd zZ_$u`Z_H|kdRVlvz&04+Koi0uV=ze1e>G*<;RQ&Rs67mik*5=%mlMJxuB|&)!Vm~ zEuL32?Ur*#B86XU<{6|)k zgeikuw)%t-sJF%!jwWg~DH>-%+i}CbES)*%!yiU;g)`Uw<5s2MjiWX|koU15e1^k+ z$Zt5bBN`2duw7PeLO_Pn8i;D7P#g}tO-4I`r7l7p4Z!VpKpu^P4w`3a7t!GiQVjcU zHD)Y6i2=jDOUP(}0pK(>2BRlpyU5S-N)`{15?smH^TuQAlZoi&?6g$L6H7wNAejLB zm&|vVwa#eu!kV%r7c97cz?BQ{?%hv+s^0i<8z8U@heKz_(#M*5Z+Lge+`e0@R^Ofd z^7Nj)SOj=KUq_*PszBU5jM~< zPz}Kd6da6pM^1L8ut-p%*yH+H-H+6*hAa~6oa36*Zs?@ag@)XAcW!~!XM;a~7&l`9 zLf`?wk_Z6*%1^%Mjfi7ya6xT$QdIQ%ob9mb&Ays&)tVn(`0DDDPFd=@=5rTVaiCyr z3B3Av2+D@RM zDqzB9UMy3wUD-k+1tvD(_|~A+r^&AzJrPK=Kv;!cvjoC|d?Z)W8qCDl00xOp@el8_ zgo7XMTRgl_^`3Yw2TfAN>b1K!-D8hbd%NUjn&E0&>rY^RCRXXOyWhKi;rSb;V{EXj zz{2|nT-Ug5#b8^ga&f*nE}fE{Y6_t|w?4Z=e!CME4|r$s1j#ie69`LIpWu67Ke#`U zd6eAQ_o1q?RV58to3!4ev26*OvNw2>x&W3mDMQ1cPeio_yka~-)UkJ=T-76e1VV+{ zgs@N5?~U&+>UUz-(vUrWuUA=(J4O@15O(X>p+pap;i+7U9w!4B@#+PzMI6Qr6PYmD zmlA4-xl4b1=Zm*qJ7xAA{T@J~MzWkPuw;d<-e?q>nmILk!P|2$J^!pzR|job9d|Xj zpP!n7m|rznl7P9PX@K# z9c9&9)-3;S>xT9BY+SnVS=OEl0>{G9g1~5zab;y$0I13bn%beKkuhR)mE1gSa7kofA5af=@|XJ$WLr%%GakRo}!ejqMxw@qqb zh)-+qRPIzmuQl>WF*TKL8Gy(MrGI;bpbZ_;B|hYta;FMO$X>_5GclP<5tgw|S~ zM&y2lVcMTP&on7=$g|T zE02AI^69Bhf6?u@&Yj*hFVrUqARhB;i2VMbNU|>Gz*qc{RXVCrOKv4KTu!T&l$){$ejv71>kY@!h8GmkJfB>JX6zH6E{QE!0woN+P|lt zONxoQUq}O?{Y0JEhbUw-a;CgztFVzky$QB(IP%)Rdg=R1zZ&$xk7G6V z+&ik=J_&^h2MI(8VK8H9R*O;JSm9lNwPuB|{E+p=FZVv~r}~E!MYc>`rXTY0vhn7; zw)bwV^(J8IgNm4f1(Z7w`(RXlSy6i& zLiNJlC4&7UvXbr^Uw|_Ib^Hk@t_r6Y^xRbKj)kD_0MfFF^<*bL&`-1}3Z`3s`#h%u z8uBZ?`S#{>ZsLdcxMd7gL=wxM8urzc>rd~o>&Neg#dmL7lVM2eY!!u7n^8BWjRHEA1r{H0rnL8Sujl5 zny)Ly_lS_lf+}kvEJ{^H;FSnTn19t#Npa=IW&b!{Z@na8$+*l6CA#uDs91o7rxrKy zDNUHeCYHvjjYyt~ZFkqce&;3*7+JMJ$?bnQ5m^!0A`9)6581Ua!r@>R-5G)4DZ3et+kdH}0RqswvhEV%)Fk zk||b}r@M08kB?X!&ij+8+0NabfD~%*Kwc%$Y_33ze3#b;3$&9D_~^1yZ3cJQswvZM zK9?32L|a`lrYOGb?OUaP3*TMzl+9vnQG9KWk$5(~=M$e@m)4@-hKMt(Pey*r>-)d; z{WQSyGfp&WSz@o|FOV1QqDi#gAvSq4Es>U@+^D{K?0g6i7%he%jSy%8dh{?#7da`( zZ7(-F>|=4o7OVJ$zt#^FsGg|NU1+ey@*kKuy}3?czaT7(dPTV5fQsh&goSlRA6 z)gEXmbl2Lii^t+c{s?SAJ&Eg|9`*}tb+dKIm#BdH!rE{mwcFZSZy-ZQZ&Gk1jAeP^ zEchf#=Gg7JXl>c+iys~G!Ch06rdJ0Z8Q+648z_*K{>t&oXC^XR7nbd*jdB%`awvhU zPzM=q;v>bE;X@IBhXAk=vJtx6vRd@EL`ZV4U-H(hyZS$fr#@9qMbj**MNY8U(uHr# zxjZu```Kh#{&7`)SaGPsCT1Wod9$)8;-CkmZrs%wgXIK+Dd?7}maTkt&ixlXiWigW z#8OfMRT3btK+wCYb(b?A9r}6cNjod{TtEM>{l+7HeERi&Pn~hvX+1|olKPR-Up}6J ziALU6x=-m7Nf~323X_XO>d=Kxzu>KTeN$4*gUcJdFSzd3Y-v)%*yp`tmj{Oco$N9N z)ENV$Q#mRHS%s52Qt{Y!@Lc})r|ckqcu+Ai%&ppJZH?0=;XzOUD&hzdR3I!WrMWmG zA9@gSDom|^*v>Ob0G+HLX5GWdgHy9moxto|KWF>!iwXzb_{~YVZM#*wA-{nODx1lO z#S;z8vVf52IEo8CLmGTB?8U^g91gwKy(?J0Va<(yE1nqkDXSvbObrF;pi1V9QiSSf z*{}ZewO33TdDqt`^ipk|Cx(uyHA1k?GG$7b1?&^{bITP!y2@40jR_)!-UA%BnYHrIqQ+C@^3beYF=e<7rvhVKbJEi`Ee=MHe*lcWLE z8B-Cmn(o;7;1Ez({;)XXQyFWuGn3DT?@I3ZwI4i}|NUvRKv?Q$K%2oVcpZ#7QVH@{ zBUngbX#yhMC>&kl>hKOgI9yF*;OzTb0$B-vMcBQgWY)NIdcE-Nzq71qBQ$AHLiJSF zaWOL`BR>aDKO_11IlYE_x_Wb+r}5d@8A4juRYf*aWtUuiq*&j7 z|IF%>TaZ6Ck(%3Pi`xt3DB1iA8%0J`>NlWF(NMTo&*~)}Vb4M=l`D@Cuhg(^-Mh2z z?*9lL*NSpcElJ*cCTBJZ&F;eG$F3U9C091=u4~A!YVDfb{DR5--<)&FjKB2xy3ZTm zcb-#PT?>l2PAV$$$J>s~Z_}aEk0U34mz4zq!R>JRxe;SKj8oWBj!9In!&DH4pRIJ-=P#SaG}X8L*TcL zuwRE?vl2q$)3HGom6ka|!UJPK9uQDS=bivbB~5w#M+8ziitNO_=>7|D+Bolj%aeVZ z7mrvxXW|*_=6!yi-o0aE=N!ASzG8Ek$LsS-p->;G5k{sM_(6vsG~7GKFzACtFX}Q2 zZrlnTD-(2`*jb3M=+3Or4E6S>r&BV~FnxiK| z=KGhu_x<1V+P3}9ZO&}7xwa91HrnFUk-#QtmhrQnD35Qc_2309Y#=4nBq$@(*YB#| zvUtuFKvp;7X{|!dp?|ZX_X#8eM! z7E8N7``-?byvOI=H}J1JH*a_%Y)R`F$!OEhYtOsG@5sMD;4HYY)|7dF$`&Z%`6JP! zMUymcgO)_2HTUecZQ3mE_sXn(lq<3>YN5x@2Zn&^AO@`(VWY_{hbyH8IU!<Cf*ChGXUPpSb$ty#*eBP-eC_$$qZ585`_t6#D`nG~~3ucT<%cTpeud?aTfFRusvp zh#nX6KadMu1VBS3k>|AOy<1m*HS3PPknl(`+Hn_VgmJTvOvhaG@v=|Nxos{lZ}5ZF z^#U=%GBwgrJ|+jHVU!cH-Zf34PFbpWvjlNaYvtjyYZmHMFIZk(UP)g zpyc2_rDAX5blO0ZdyN;c|nNal43$8AHAf;=UE@ds=o_F_@Th4uT z&V3h;>h|{!%UT|H!aK3F7Ur6I_$`7x8$Gn+VU0oEPl{_?MsvAqTO^YB$3r@`oVG#(*Kp;4T z9VS48RF-f&d$geNTk@q$OLBoLfk_o;>QkXo*s~roB=F;-S3a#~sSH5e{*0PX6CC7B z)r`0MXrg^zo_@Z?k@?Rp)oyG=j%#Rt8TpDgn*{2Fmw*(1qe-SiScOC|)-2`POghiT zCGXAt>qVq+l7%jpzU04+F&A|4ks1!jSFnK0f;4wT_y}iy3Iv`@s$!gGNNV!>&*HG43KvvjU|Jx>%1Aok6 zJ<&)m*!F_mDOFZPxo%h4-oBuE4=cB$m>4?lB6l=@3j%uvujD(%9PQAo5S9Ri`t3X` zW1K^V-RWopPsM^?@!RSByUj>2QL z4xWENep5~*0<*{e&t+KH$w|8#b=|*W3p#`kP1(1Y6=7A`pj)tl%=f%L&JK znHfxf&CB0W(-0LF9gx3@tkfov%R{*=4>xK&%LdyCyOTO8&q3wWEgP3C`0mEt@BMv2 zQ<>D^`n51x&i3So-*15xjDi>(kr3gtUqH!CPdi@O4(Eun#fyjAvho`1wJE6?)||pr zdsg996IPW;;m`}8-ShlSQlHLk&N;Vmu-TS>dRmHJpOuV;Yy7^(r6pf~^|JKc+rhrC z&3;Xn+hLG4E$_4eug|`I`W=1W5xW^Ea{Ju^5Y)tCEsZ}4>dqx>d;O&Jy^0Vkg@!EesWtig60D@{HNWW|0WQ$Bm?9~oK-@<_r-b~4Xy)HZBd z@zUG}E|!tiKEityS)Km;e@|`SuKmnLbC$CLM*XbZ(t{wwTt!MMazv*Tjibin9*^L5 zBW{7Je7Z>^fd%|*)?NK>LKZ${B`yws`#Qhgkx{qndzTwOfDOl%ZQBph+B0mS20!e) zC+UF*6r-dK1YzwgJ)_l0Cv|HTYN#5M-Tvgi!4gFX+mKA@DOnve(oAn%_4d;qeIojG z&{Mmhdi(mR{>IwaidP?8iu$N8cJj9{(DkuyD_z+*<$Gen3};|*YfIVKvqAY-kQFI6di8Z9!+s_ z1pKGK`e=&Y9H^IeZ(RSt504Ihfk}j1Xg^dHS0cNNLgf+Gm6V9HR9KjQa6!%F1IZQY z`q)P&S<*5dtA^JeaBofIsVEoypdply(zEg&{`{&N2VFF7%*bqePFADO8>{p9wAEf8 zyn{ov)s{KbnwmQ_H@$#}&e!Se3mXD{@0ck!^m+!At9D{h5&ULoo;Ut;ioubd`48#A z_j7Sy3APMKp{Yn#@rVY00TZyrB?=|i_vLR-OR=R6f|#&3EV6ZpYxPbqcCi{v7Rl)_ zOP(#O=aui?@{Op(0k)$Z(Fz_yX3#lIVKNZZXgl;laZPItpn_p#M$Up_(xVfa1;SGK zc0)4Z!{%8oh2v|56ifbU$VNag2ptb)B}-0lbYSv_=E_dZjm3R`UYy)pXG{OvmKrw% zI$WVsKp~HHk~#u=2*ia)>^e*X!DlQVtAXCl%io!M|0VZ`xAs9+q`voHA8uQO=j)?NZq*N4L4L`5hBybHk>45Q(FTW&f`Hb$bOq=65<2g|T#j?#weY&q9vT60!2ev(b-K(NPY`??R8$7~aqS~OtK0>>ove_S%QOJ*i z<6GD;N_vlQvA@W!Ss<*YT501x0)w4iRawHVK;sxR`)sUKq1E)}{~s6Vm|~z`^l+LZ zBY#{i_JW6hV}97Pg1r}fvP|X3)DA%;f`YjC5W0KO7U_0FaL0!4=G-?>SVR?Cx{85L_osOT~V9a#xZuG>guMjXOCi3_K*=oURb_^CmWrVW4G%4+tQ4=S>Lx7^up@l4N$Xx-36rQ1D-X*q(v7=Z|WtbINMYO zR2KJ+glF!TR2+m$% znGx@3fVPl4kqmfr)s?$PNmKt->Ds&1NDQ}Sj}CeOIm^J@S0_v@@P9lDiyG9p$48v^ z%JfTrY_{}&#Vi?}cl%>fmB%LqV)gKHO-ByNWNT2WX-T)Yu58hz+g{#_{QpQ+Q2l&5 zG9hOJp*su|U^kljfDf`qFEuVcuexak`l@ICLpjUQTU4iwHIL#LUI>7 zN?`e8vZW?Im0Jg1I`FY@N^Yx42*9mm1&OtP@x3_VvjzS}1=Tn@Dx;=xB9@buYDiRX zUHRReg@gD7iju34lgOrMgy7qJde?5>c&s_uyBpk53uIP%k=4FHRrB8q3nD9)V>g@h zPKaLXOMiHA{zI2Nh!hE`NkFITfHI7d-o4qZV0fa}+mG*cQ$ux?1m$-`!SgnHKaBH# zNsaYE@PG+=WRWQ=rJecRYQVa=HV_WSg3b*6l}|nR<>%LSKl99|CWP!QI=*htXld{S zf-pry{}e#1aA6PIYDuHfC>c}jX6CVv9-rEac;2T3wWR<3EMTt4?*@*UKUSBLF>+5( zD{bFZ50@zk4OB+7sX9p?NoW#It6ArNOg8#z zX!+H6LSw;p2YHMFY6Kjn1hIz|T|*!&m1Fwtg&p`!_Lyc9Fd;Tl2BQue0Stfyg9Mti z8g@AKQM0M@k*Wx(A1X5Te0E|FjXCw+in>P02+KNxCBldmgI079L4k^%A`fJL!Uvl$ zEf&3@agTq-v?)VTCy$(8ldxMe5!O;!*UR5uJU;5o@3gbtt;ogXFJNAzq|_e^kmDGS zH26WAIZBlUd$2ySYw6tUfvoPw6R~l5nW82k=l08E$=tc3{Aurxe{yH(^0Ga?khH$0 zF|w(~9p6#k5QC*wI4#6NBlqU5ARX|^Xjn{EUUau=YTs&^! zKdyeGZ0Gfgj(c0&^-2L@OgWlTLuS6W zPwkEWTyyF^8 zfE`lwAO#lGC!&paATwKsyDr2S{{J#G$$YZ2TfgWvIHf=|29waRucg323|Iw;$o)iq z0JxA+5!NAU%Gci{efiIS^_-pel_7yu!;sJoKd|SBe=@B2gkT2L3?IErL3d4WW5ARl(V!;xp%|>@@ zTI_|?8R589W#iboLM20^O|-CTwOF;J*1TwRwN3(Q!71yOT2EYmN^3Q2@P|Kqv-N|= z*Ui1}f@^2qe8wpYK7Qr288`Rr7^+zRXm*N0(-@9MVkw#SZpWW+88a#o=5j=qJjj{z z3M?U6S6uByVvIlh0GZV&@z#ZJ%^edfu-Ah`hmNKmjKZQ+8ny7)p|C4-s%?-$9hTeeQ@9x&KU> z6-y|^LX9R}l)Z(s51@c6fC@^>G~(y9XAIAfq;Ge_;3zwk3aNK7YC6HrkCSF%-sfD=ZeL7xRo<=wRWOM5}b3qm@p zB_79mB&yVZG)Rybq?m3~ttZ+cr`^CoV;3#jzO`(`@~4Kc_s$+y%W~%a{iX1{-VxgpJy(Q|3B`o13-!*Yj;ogDD2oIG7*33svnM9Zr>Kira$0iUoM(4`Cr{7J|9#cnyDQ0E1YG}uo$ju# zu3WF)d-X!M!oqVm@mpi^ZIe!axAR|)C);|$^sjEUc=NAZURI-dVdI|lC$QpfU}g+h zOnEszuVSt@e74SpG1U9%S6Z*5w=q4OU0jo-p8*q??7UXL<1J3QurVdGuf5h|RV>+Y z_#p&;?B$e1y+vEF@nEKCq59uZO1nPo6acFT9naco;f89}njQug4@VSn>Q_R>0US&4 zaWN{8*OpU}tb8ZaMbTuUO<+vv(^||6;#xXr5X>yhd_03h zi)VPe)|fslrEhj$@xDRaYg<%aBOKg?kR zHwV_dxR4z-tHlAcH_e+?JUi##XI^>i^w}?GcR%35Ew%M9zf6@zy;saKK}K3vSJY~M zJyUXr^%~$Q?*8J>v(|6kaObkZ^8^5BEZcZ@sw?d)pPC{iE!M&K&JMCL!loGuU9=dd zhsl$k`EHi-%y(~pa@A3j3jxuwOc`4HQ#|hcM~IBz6!z$cKK`pUz01^+c4@1%`zYM7iu3UWmTSa2%{AqT;00JW*_Kz8y)|DF7C{N+h|NSd@4}G?55H{mVgC zBezt+P{vjqNhnr_>=ZH}9cf@^Pdl=(2$JWtj_|*KCY%|=s_Fu9$X^P8!r4H7l!E=h zA92An;T^k2g|U0L)+|-8UwIu;_{1roZro2ad-QmCN-mV7zx?aGiLumzysBz2@fFER zcxYsaT$t1ZintZeC==ykKoWT_o6@*;@qZu!a1&D+jQkc1j&U6fpfKU+0{LU|C)2G^ zn+ev`!t-GOwMu9qe{o6ax|f!JPQB(`=KIz4$K7c+-!0*9S)->& z4^H$tvqYojhyvPWX$XZAX?9P~UcC?exzAH`o`bdO0F1b%sFIwI*Z2$u%%pe)cwNny z2goWJh(&|zz~tUM`^Qg9P*S-Uag2Ac)YpJP%P<= zVLgI}g&{-(Fcbh+5FQ49J3bk2_^rHt@B7XHuneKN#`2m#O7Gr&9C@cjvAqkr1z1)L z2o}JVMYY&_puzL0&hUF1-YLGv~r3EZ&Ukw$%E_Gt#YpVXzou(X$^~^X3zu zF##ozni*-<@PJoKs=DlCvTeDV3)ryYOt+20go_s*>XgPwjVu#pkwVGUEw6mmeAE&%k2 zKuwt(_0@lYs7N7yFb^!|SS%X)33}LrNq!0GW4vq|%#*`pJhHx|Ata?{b${f<$G(Il zy8O5yt>4nGZNK}~J$PRx-*ErlgWvY4=~-3qAmlMbMwpiMYzwS7#$59bv|(+%KhflZ zPPRAwE{;bWoU{ljFVf8zD?3jkL=I>)ri5zqNS1gca^k3e3rdt@&RrPSqTl#^b>ATE zYLp`CyY&Xf;&&;Gh9D?L$6|GLx5BGcG#-;+{X%5LKDAkJ)U3q)aesqgx|?pncB!o2 z_^5L*-8ljXI3a0*OiHO8G(8n}O{j!EfjKO|)_9_T>6-J`n6LQwrw!C!W93IZ^vT~e zXZql3c!{xpLMMYvWlm(yPu%H~T)&8Wnr?wL1gioge5>dGbhqdL8aZzbElm9Myzck= z;7KQBUz`TUbG&Y=R<>&KH)Bq^T4W1g)h_0GYaO<^{5+s!Re{#l-!8`;V^t@}oCKCQ6Iv7I+7_P^1$paC6|bpT~*1d7Ihe=X&V%P zK@9?^tLr21-;_1|$jP%tk+&%7&^F<=_bp8JQ=XplRMeR>Y&FdCxFN`@pK^*}6F=x? zF#!61xQbhGBI<^pmAYUg@k>RW_ESY&d|pMpwydU3E3Rw6wO;!L&)*~d`-+D6w-xpA zAFG4O1r3sYZL_^^rIvPf$eR0B`cRqzDD0{#&gnt?wQaz02arsP#iTUA;M4#QiQGL8WJOl zEi?(&@-RTB<}=D$(SMJ12=m`tVWc!tpz(Hh>ZOfwE8sCXI!43Mdhrh}6~KgZz-ToP zjCi`!CPka-o~U^B?v-3n<`Fu-$Fu0b;~xIxyretph{~pB=;X=3u9yLGW!`$GdfuXc z4DlmQ=v>eXv^G^V&;Iab3WNs5g53?gk?b0sS6Q-g#ebDx9S%}}{=j#mYEk!Ly~+Op zhLAKd6~^&iEV_>#U-k9%#~x9)^t;QI%GI--bsHC_g=)&YHdSEYAfqHL8ui!J*1f~; zBuKOOP9G}z6Q_=G%3{SLp|y?Qf1;CrEro?fZ;I672N5v^`83D0Xf=?%w4A(GVa&lR z>Z6|?wkB?KhkC2vOD6y*ZcV0kzj{@*FYbmjU9s^Xo#=1T?|k5g1l7D^2jMs%@B#-9 zmTW~1{O~051)Hyk8R^G|01SQ1TZux(a3UgE;`3vVt6T(aUyp=GG&sQvjga=gCK#j8K*4|zeH z~@CA{eJHEK5AYWtaTbrIV!3Usz2bV&>OU#xCA~oD|-N z);x6Gyl6w!2RXo$f*5GU<~W#HHW&bA>+C5zWh}V({7Dx+Uv%Sf#}{2c@<6Sjf8stk z%jH~wmuf4HmbKC~Pv5L7ITsejP1kBR)h4-=gw$A9^E&f3FeZI!wJ8k1!^U|=k&jYe zb1dS{>2l%|_ue7C(FI@Iq}FeFT1vjv;Zxolp}NwiuCDTNJ(G&l=PvseNjbUsM-x1> z{~rMmg(|lehFAlk8{B(9I^E)D#{d98 z07*naRLVGruw($BWvgg@TuZL3^Jzs}>a^03YoOhg^W|~Vzj_SCiVcl(4)+}nrU`RJ zQTq`X>6o$J9$52Bx?#e|YDttZW9$QjDQxl{37rODwV<6zZ7p{n^aFc_e^&{_pd7%d z5`;$uNm!_>e+U4#M|x$iWD33jLTX0Ng%NwYtjk^L8!kt?1p{It0Z>F|aN@>OTsV^m z`#%i7b^j)TeH0e90IU`=bLuB&C*7F`S2sadi}k9DCNIjGb}S(BJ0Ye=uSDLegM%OJCn`+!gVPHOtbxUL23QMo3ax8UYh#{C4N0 zfkD!th;rq8-Lj?X@-~ylgT|HG2;XTHd40swE9 zEQC6*SkNLrsQ6Sgg(TUQa%J|l59X0H+`4WA02J`d`q%V=w9JCHf66r%6V_Vc1cZD3Q|*)f)ua9`yS~jYB!j%PIJ30K&a#h z#v2ZKh2)36E|@R>a}4z&$j~PcLy*&enPmbSTMfb5d6nTr#F}^gF^_!pKfJ@~CHVufu8J2{+;3*Od7E`|8{3)T(SSX&L1LnMShH! zfvv#G1T2VV-{6G`Qw%ncQ}rclpVHg1ecqKLE#rm;__o20e=dNT382JeXEFF#FU}|v ztCS1GnFvZv<(tOib(9QetN|w7eF4DLz?N#~TtD*Y#?|xR_vUo%cI@=`u4f^pqmUgG zC>)9`STIApPJ%5bq~cLY8$@5?LH``SFa<-+1A;AO<RUox$yl(zYSY`J^%J&4 z($X^mkiw3Ee~^WxF%;IK&W!BA`wgWy$FJ)KOxDbQ*uVqdY_etLl{Ncg@SX@ANHEIL z!#XA~rpK#Dfrk0Zrd|CL8z{&uqovsK zg&nPf$38bOZm}O$-wX$@ricX6aF&XEnO;nA#_44u?>L;lD#_-urE@3!^Ft;n8ik|r zJrIa35j#QMec#`5;+Y5C{n}07;~gWN_KXXFe>{jqNe+!s!)+_z?XUAN0SJVEv0a9Z zrskSh*{0QBG4)nXYvnBuUo7GUuxf*i8aab}6J8KZ7j&RC!VY{noQIw|JPJ9>3xL(FS<+@{mc@hh zf1fs1mldsk^5#XzugWNYN0*d77v0^@o!|FRw>RTVm(6=@*ps1@G&F&W1V5MFnc(BFhkrT^z%u>*`Fv%iZdbQjmuk;KXN$E8 zvRRHoi8X0;+u}(l`B(2O z!YM@&g--WS5ZDRH69ABf6E7h7`2-eHvgjk+?F3l0t&Xf(dxl}*KF#HnWM9=6>z=r| z7_fo>s4bw?{T@=*Z(CqRri+l`&KrGaCcezWoMWd52!^h5`cx=r2h&^uq)_m}%F zT|tsN`|V=OjI#$skGlW8(=DFtf4f$KZ{>o>2u}o~P!IIj>}nSe4cb>V$I5HpsM);u z<#jJiB#@%uN=qn&*abx@Om>KA7J0m=f!wtI<%zI*Bk}La{D0hjaKXUglly0OJ7IG} zFbPbDPE7@1<><8nt7Ia}?X;xJ&6}#0eR_Vhep8vOq&UM3N1tqWr*vcCf9(cVNNXYn zcDJi{Tvjr|=pR@Y6#YYt-ww>r5{CzaVACe%P2p8u_f+UK01FdGG<4ncu{8%ynZ3oT zTC*at2=o~M&(V7HO#%)y6_;Y&ACH{Yf6gGtK`JHho9M~79&|TnG608S+aedjze-Q{oYHqjHk)AUE zU##GPPa)*nj+*lJ2yaHgi<<&CAc{k15<>@)+R_~+qSZikP%B^e@=xzPJxy9RdqYcE z6froIr@Q=(x4==3}*WbWi&D7@A+yt$vcb_me z*I1$ng0MIoLIS|&gk6QQPBKiKXoB4%yTBndIP+lcyZ4sjeQ4f6ZZXkbz>eWc(1WpuPBy zM}5^`LxT*Flyo^@FgPBpSW@)KdZsq9Qr^=(I8E*zarbM36Bc#OFX z|47mmpAE!A|9bcTb|!!&ZJ6CaMmy9tVoR{!pM%q3v4;7BipqgVOv&!yIwum=JE~*R&R{1pZnc)e|RNijb_gL6*>5ubvGBJqS^-qld6y- z;K96DmCO|6VFF}Os>5~6sgHlXuVizKj@i=pTLX#s+Hg?wLNT)-)uSj)WhD(;R^GDW zKi8vrI-mlt4m`$R*N2-j-;*RRV%H<|y7AH6UR`?+aM&DOaN=guq7mQ!zMJRLH&ewyof+BP#e?%+sKw^44P0zo40B&<9BE1Q~=9c zUO5I}w$ z>4)wGEDoTJI@wFWWRh+=Od(VOph5e2^5dX>a4fu(-y6Fxw^s()aH0Sa0q5`lV|Bz- zhfAUh4KUaWwFCg8U=$>km1M9X>MLI-NQgbnhY&U1#h>(s-eOZr&F}tKcSer1e`)!= zYs=m!TucmPCNYSP1gt#aNS4|$R>$!)B1nd|Sdi#5_P#15EVce{(wUNXxu!a$2H2Xf zsP;p|HxbXW+pM{;y{=WReDlX~XA)>O2mo_7vE6L}6|Hsx*oZOP@1|$+yLRt!wqkdm zj_vq>m~6`mS#b2i@rDu0G^|Mty0h8=gssaZ~U zI!-ea)Ja4@1u{API5WffK?+ zRA6%^FRsJobl`(d1+Yx34dGDDYKxi~u_;zN_6yD%>Ws;OxR%fqr`P66e;a_fjV5{3 zf%g8fNsS4BN_arFb*JAvg$!P?odX!Lc9;$VSP@EzM;*}MouCV`-EU_6uOR^o}8;_0`RG5wzAL$Hip3Lv8>q}lEE zHwz-+(E01<&c0{mgBL$9e}KfV8SU-Lo(%LNAPPrJdiM|jqkfGLFM(MFL%c-Kf>0m; z8$OF_gMa}+%}!PoD8(#~+nNRo&w&lg$1a|7;eAX!^vY+ro(VL~jRf5ccV06k0lU3heZl1K zrDP878>3J`(Rpj4PycbDiCcWSmHn9Kjt~_ zMGPyLdNFN#mGCVSUZl#W|;@3|8h0U*H(TidZPe?m|0^rW5@wWZLqEd;wj z?;s~;#{OfU5&wmiP&pN(I~HmpFV&-_$Eq8uSN(E^09O2F^k{{;kNnK61hGC;PVnf4 zjC-*kL?B*uWOe(wPR;$t3coeur^?3o8Ypx7;Wz_^(xohjpkynO0yP|^61=gZl7@K5 z+2tGve)5pTe`=nr78xpCjkW7vvqc($DOOdbeyJ#$=87o?Cd*l@2d;X&S*Z?OO*R9t z&x2#Co92uNjK#bHzl<6e)GjD#TKTo$*Uf}Cq7G!gOG!Hyz(VI@t*}mUB@tijw!s28 zw@(ZvX8}N!Bk#cbtsXAkBCuzAyme`?kgB^=jiW(EJzJ~oh3OWf;o zOhoY+v1laR+Tc`N3sth6Z4VuaVIPcf-jp8sF#O?-!#F;2Lbvft@x8d}`LhhY9Nv(b z595gBO$b1!Gl@laGt15uD8PuWD4u-Y_p2VdT(@|N1%yhnt2!2dtqJn{@XInJo9nE4 zU{_>2e-KMy|L{lrGoIOxfp{|31=8uRK*jnWW)vQ}?ui>`jr<0TF9OV&Gh4ALIzb*fQ#q|kkQB}Pbj7E}a08lAVtHFd97AMHWCOtu^bti@--I7#( z*isV>JM%{z`^fAUMFWLp6TQ9brr)|!ifhYVe>OYSc35@D-N{l&*9z$hAgUXupe)rc zgcfpAR*!&h5COQE4c8;Ac_g5Kk9iYczUhOPd=l5K0FJv*PzOHgTmTCdFET{?6Y=Og zJH!Gp3Zk<)d8i!Pgk$G;!ZK*Un1?e&J4t5!$pSoT?aLDvOfgJRW3}NXk2=Nx6&>he>L>bo$8@lABMsfaqfbBWq_`ukOFhUcSR4@Kpb4nh_hJBW6NHXm z_jIq--n4n$kIzpzR$BS(T49QMlpq0Hf9fExDu^tQhjrBCna7^|#GIew-mbT;Y*MYX zz(CP_Dl&ufE|^&Y${>GZc#R^(yvIE(P$)^;{L-3u%#nTm5tHBh2Y~`@s1=g&iOS)C zY6VP|QT_}6090^+niuoS7|?sTzD5jl%^m6@Yzzh;PKCYSgPO7KfG~*7mH7~;f5NdZ zz*clVpGWRtl^mAA(D?w?{<`20Urkc!yT_5(!LppikuN_1CCek`PI zo@VAu1wbg<$*PS;HZ#{hhv^=Ye_51e+vQ*$epu|D^c#H;)YhfZke|`d=2)FZ6_Wft^9g3`BjFah?YtSL0+BlFCYKt7t@?MeP@?xX+wS}1x6K%C1`;G z10i#Mvcmx7$7KeM35%njzfV-}v%rGlp?G8(n z09b66SQ^F*<&z#GCbRxvf5wP+3Cx~t8azUe!RG4G=PMx=J~qDBZ@DlSr(ca*fx%MB z2=Z>i9{2wj(>>etQJV;0K|-|P==(poAnwXMq@pPRI}ewCgpR&XImLz0*SZhLXaNz;oK#Jt^ZSy&a4f7bY#;~5Y;0Hm^z zU*dY zDjX>ZIM%@63kD`90ox{~sD8sJ@oWGYxP!tMs!LK+Qv0y2=7i#X^BP!3LI4QN6ZVQ) zveFlyo-Y!#l+&6wii7oh3&boGTKoKyU|6Uq_(bS5(Qekef8Bw+D;*1R+C3Q)YC`yu zv^jgbP2V%)5SZ{?)4W!vzr6I9e_wI}qH2g)8Q<$gvL4uo3PBnk1(K~xkACy2<;(-W zFRhP}eu6zKVIEn>Oo%O^IGiKFGDd=ArXPTn&Omo(S*|IL?Jpn{gf{InLHi%qQ z&pAvXjTk9Ve{D#*Gzzg+?1#)95QWnDNlmud?DmvACaoE;qQm_}iGF^Ibv6>Gq|`|j zOfqH!Y5Ii6ZbMvr*~aIlREco_^O@=Qbm)Wt3qVL0Tmi6ak;Xh_^;OYNNhZ1RKe<&6QzkvWtUns^r6%&<<$GB;k zxIE2+>=soHyKP++?6&&nu}G;E0-(qeog#8!PI^`?k(rQfYE_4a>RI%e$>=YZ;iNedzLl_G}DH@-dE%tk!J-tE124G2P-NT{_iaS ztMU>-e+KF&fuckq1j>3K96RmP3AT)GZ>|kG)Z)6vSQbtcF}NWA^l{+ebF5);0sD%Q zOn130G$qp;q-OW@RK;a?$iU{PF>8zr(i`9Kh6e)8;RtYHrC+bhC+8OFyfY+1Cm5fY z9})wCDHuQ)#m%|_y6Knp{sIUWfs_&E+yKm?|{5FPYgrNwaev* zf3VO1$!BJ7W~AqVCy}q1T1I&|0v8h=&7GC`cFI7E2Jm>$UH?6|>zG&j3c#hG zEdOS8Ny>4d554V$gDkGJdp9@uAy<^t9e$X7gAHzfAH2#NXBtP2TNgK$YA>k3{IO4~Bi%#L9Su={|Sg6_#`50Kv z6rE+}+xoz%t@k6}arK8GzzPGT2*~>xW#JdE$S* z{x0e&IOoSLHPC^McNX9 zj2^vU!Z{Z$obdP47CnFMkYq*i!`)nQDbr!KP=u5qhhxM^z`P&_m555vZMQr6GnN4g z^nG!@iE-5B74`Ip#|ModtBjv^K>dCxS!xuKc_cX}4J?~tqS>&i+%O@s3o zH-$(FAhT+29kh3UN^#f)k3`Q|&!;7CmVr-1-pCjjfJ}*d?EVEke=fKwThC7?U&VbV z{efwjs+59Wrw_R0`QapAOdY))R99F-;Jf3defDs~m2=1jSmdM*9!bMF>gI6n#PvE5kFmDQ3EMUr`rB zoWZ8a_LCYykZuQSj0XnH8waWh&M)wnzm~k*x7Ch#}iISRqs!0awy4akhz#moMH(0 z#e8U;nk~GzW-52vO1l)FHLj3&^{_?NV=t*f*v=p&eYT6b$fwMBDe^T zp7QQxa%Rslt7`lSxTzx9Ec#sZ2R;N=6VLN{REw`<`TWAaU(dV>Crsc)j@6E@(PK#V4C2xQ2xPjxsge?4H;FHx~{`uw|29k%Y7Ti;=3 zBjF$e7h%bhz*d|dLsFhXsH>m6^__6drklH_z$uBzo?<=m2eMEKfG>apk`{mkI2`}A<)G%1|R&cu)l%jb%X*LIbni0Sv>OInTN(?=RUQt`hm&{I3WNg&<3X* zlj70le@~fr3%{8Udm(gMfMp(&E}eDpFNzl20_%;0^7;x#&*6WS=s7QFq=0%M@t& zlBrjIB87bOGF&bhV5kL^H*yr&>g5=K3*Sfs{rG(XS%zoER>cNGNoqn6V31p~$c-X&R9BEI@duCl-5C#)*;DHL5fSYyUDV-Ba z;3@G&scOyq>ky@T3o@_=l7Y-;=$PpT^z7UJlj=lz*5VppEDtXE2r$Hu=>sY?;q))x zf9q9qEsZh%#zj{xnQ{Svs-H}ITw%AYkQf_>q%}ZNzG&10F^0v{E_+lCRQ=d3)nlPq zWX>FJGz@y3WtVsW;tg|4y#d;!9BWg3hQopblmu)UD-v%liI8s9W2TY1U6&CeRnq4E zOUMG_lJJEg*kOoeAGy)-O02oQVe|4ie@tkuQ}NMW_}ONF_d=QND*_Wmp!vm;UrmI+ zNOgkDfp`Nsf1Dr~5KCif+jKJIT`h7DIUe- z6fuY=q=qSAOKmfZgxQ>@^|)YczChhu7ikL_?XTYSK#B!?DX>S$Bo%qGB<64ae_<3D zujeZ%HO+7;Y;~PFQWjbkvK#IAQPpxpWVWK!BKs@ONLj9 z)|WoG@%eGz3I@Gl{lO#y5Bm2Df5)Wt9K4`H^LAYU?=;z}Y~_iWK5BY~A^82>Co@G& ziBy!V{r26%S3P#^4599XaoSqfaNC9!!qTh2zNBFF+Oh6LGl361De2QduPS?vfKNK` zmdCrIANpWJk0)YLA4o+3+w^gTFKwI^GF|)ORg1?ZH7?ozS{I1W$!m)ee?7>-cpAJE zDalAt=_`}V#OAXX$w9WI^8zeX&XhIM0u8gANeIjU)#YGtrO`MYCtpNO$w|-O568~i zPFTiureKnAR#{t3^c{;tEEcwh3x|)qX$!bo-@zgg$hUg5Icm=U`8G_*j) zc;lmk3VQ7GewCD_mia>(t!3(bE4}?B-va2P9%)`xu3r27!ioPFf6MPp%)ulB4<7g8 z$h5q^Uv7%Jt;-t%S_b4xbdd#}w?pzfkdR}2GazKzxN*UPyG}X0@sp<(5HmA276Ck% z_s#;aFENIzrr$hA)wvs2=crlqpQ2Ei{IvreFi zu!5=uBEF5fGCQq+f3_n~<%h|RobcbHq87)#HNhbG#k5|5rHA6#%BV?6s@7}%p zBg;$51W7X*cB49yx4D7YJZXn%Ru4NbLETa;)FIN)p{Y7A=xxO$1BZekU(oO1pQ{q7 zd7FLB8eL$4f2mDAElGXe3 zEisR!G!Tpdvl76HeMqqd$Z29%kmLL0q**QX>%W?J&l#hTPni%hHSC|^xxE3luV|$d z%KpjNd^hw2fh(gF))>$TwT2L}a99efr$^gxAQi4Fe|;TChib&1up+gg9 zZ&j+b9C)nd;H{RRhY*^T4ze(k(52qFT{!{$%bNl?5wo6n$gR_R?IBX8wK~7^&Xh0H z8Y&kkf8oXiWNx@$wSgm?lw#6}&6H0f7+4qQBTh(_Dt{muw|Wmeyzq@P_#WhonBcs} z4lO(-Z+>CyPm!wicNf6GTmo(abc_nQGkYUH0m6)XEM7SR<_^vNdh>g~BAt1AS7In! zw9I#x0>~hYpRffrV$#fOmCT+GKqD_9;B$ezz z!~ZGd$O^9=EfdHbRru!L(|h#)1{jfZRfAviK;f7ek?3Ar2&{OD=dnTF3U;k(SI_?^ z*zQ}z=`?J>4}C`072N;&rw;78&(JR`;~x8lX1|sOfl!DShg}&D=QJ%58O^oh?aah5obfh2+b;-JuA7?-)qM}^ z?gJV_@S_MUT%15lS{c8@w;Wm~-+91T5feP{`YG8l$$myvb4Y^88=hbiVnL2fN`Nm4 zrdi~RO*5aYY%4Uo^Ne@z+fEL!*jSwce~$&~W;){m8dy`&iCktBV1sqm7<8;sU1~;8 zfo0XeX#ei*qTQF9FpP)nmOe3NEs*w7C+tuG`4O|9^OBR(d@`Y!{%q8N4+wN=Umv$i zj+ERv6zI z5!e~TTyYqi?3?Mb#4DFSxoFaP=OS8QXxupTl)L^5WZJ-RMa4z^;T%v>Es6DA|MkoP zp`br+{%imJM}FS}kB-^X=?sHh2H6Qc8d)>U7Q=WTY9NMtXEiZd3$DEVe@_pq-rUA; z1P);h7K~`KY;l7xDn%NE?R*p4-C3S{;$4R)&Yq~m&hj)*zlx_`{(~A1F3xbnd}{%FasNL+{9-)B#Jgq{Y^_guO3d`J7H@iw=f)um9=5 z3J>C)xCkaWFiT}aqhE`8JzNZav`d@)PT>OEy?U0kXQh2vgW`!IP;>|X*J%pY1=O?FRFfm1D>u3u~vjpcd>kVR2trAExf0e$a#Fg4dc%q&gfHHQHFRrM^ zB_$%w-_ggQIkO2cL?8g+U(2%rUrexq7kp>O0xN5R-FtUNp)~ZgEFpzeA4nkKEzmOt!-<4#;K666)h?IHtf z;G*Uq$#wIde^+M5G)y}jVgx5W_RXSjTAxc7)rJ#vg=K@GK#W-eW}yu{g|%o$;0YTr zJ*0G7oT(Sp;`9o9YHlJaF;Nq7|s;uMGLMqiNeo0B%G##x=^e%NgVQ( zZG8Hgxf`Fle&%8Kym6YQdiSqr4kpPUXBrhp5fOjg66S519p6qlEm0uv1ROZz?w1db z$o8Ykf8l`FVbPiGd;y{DM26EQ$uU2%?k2&e*~_PcW@Y~j0IQ|bo6AIk)d{n9>}X>ji$gD`^> zHM16Z>isD4XB2Kcpgfk=G-#V+-fXpCznLdII{S+w#=UY3%i*HtAIUxQ-dO0;QTM!d z?1>M5`I)oF0pFC%Sp#UaPEEui8KhhDgm!PNG2|C0*31Dr7WQO0W-yKIje20#U79ni ze;3UMb8)i1?6d&rJ4be}o5~Vt2h1(6(cCyhhJ>Dw&eoGqwF%S=up+BsP4)wCJg{ZS zlMAO_b{ETlv;;Rrh5aQ-r=}nK@R#2=+j0gks&0s7D@iMX9`n($Gx+<0&~MKan;hA) zXwuRLFBYeY$i#xb-#_mP^^?;#G_Ak-^iC$La02L~tsUh%T3Rr5Bm-VCxm z<*LRQQa~w`j7n;SKwzePRq=rRi<7fT1-db>Wi4X3Lz?vX|&(Wn&{0(TDaEd7wHBz^h zrQd;kqjdoYTq|<#46h{>%xPOJfAE8(MZQUDq4_X);|F8_)*`2=HuqsktMh31T0Ept za!Z?h%}Ll$N_fyN0v4ck@l=;v$%@sk`Q?t|hM>3*fQ^YwwA6L$8?)|xE-38VZP+o( z)`y)Anir-Hpa59-fJ7QGRh%HlVZl%lSgZLG@njlDpqu9+&nn#^g*PpFe{jjvOYbns zvVcD(Lw{9#HfrkUpEbLCoHW0pCJOuNHZr;it(XUah6-n?z0)BRSh8gNvWG6e7cc@f znSi&u0a&3Zv%SOadHb4(x95{ftD53o*m%bYU_1l;*VWp%bm6#@4@1(>kUO6{QuX%w zesMj`hsPzzfN9-Qy=q3HfAXUxg=hS=J^gF0t6?`k)J@7huy|Rs>b1m$nmx!%6atZt zJP5&N#j9s8op9Rm?a33L?XmEuz_8f*B58uCYs6pmf+rckE~2aI@Es@(83$aNUxD=@ zNA}f>`=gkGEPLlc?B-bJQ2z=xz3;)XpCECuD7eP-b!My*GtSHqe=mvsh(8gB^$yPL zW_Y?+Q}UkacG1K>1Xi5%<|n)oSdG;APqhmtoHa7Cao)q-9GaBl@hFrXq69N1r&+#P z2FV}@4l1@}+_D1L){=&}RA$LOvf0yPTr9QM2l2F?vt!;~vlHok-f8mmxV0>qamb>E zM6$Tnr@_32Fg!d}m3JLsnLuM+eZA4KfuwwOg93Wm`09s4W1CM;QQBHN#kr@mS z!HtT67xn?mV_kt|hyoce-r-8o1vif5ySjjlt^M(~Ho!`51FRg!KlIrr5oaEOm6mA% zup+*M{Ma{SutUaM?hSwkp4Eg_V8yq)2UsDa7G9EK_l|Cgf3&s*j(gzr0ld0scrDUF zC=n)#y?GOSNiQ~xxCT;?JQCRnR5lq3e8u-B`+@g63Ppx`mo2mZH322n8;-@87vvrF zve5;W6cy?~!MYciM|<+zQCYhq{?7xjOo6(GuKb@h-u!d68>%P3g4qdV7CQjJw)p%| z&UBu4;J+Rye-IO$XnH3MCSRekY|Z;>s9tm8^oc;jtg5l*Fl88}Pn^~`BNZa}2^OiP zBpBA9*XHSWz@cyAtyQ$$V7i-m3UWu6UQaH0@RD097k>4Zlwj$meh_qo_g)!B+E@jh z9??q`pAs;z7OB8y2^2Q^8sooIHE2K91d~72#iSo=e2GtNlE$&~>aqvbUXv7oEVu#xwF_>@Tf_S;;( ze_U^^L6j?Gqm<3BjsIl9xW5dIZJPUVuGE<5nVF`lDgYOx1Y&}}rI#n_gE9n=K!3YI za=|#A3YS+nQA{Rrh4+`F42(qOJ1k?dftc0hl|WCWOJmpok2TeN&kF7I^oqc0{CHMC zI_AC)?oXt2zhYTsT^tm@p|H$1*r<>(fBS}iqCEWYA4z4L48p97tn~)ZE;UkJTe0Z# zW7jh5|nJk-Qe0jxxJ$dsK&Kmh0O`e|U<(#gQA z?nZ%l#m#WHVODGobVKzvJG@ypH_Iu&>f+)g6vF}RR8|x%!2T1!NU^6*C~1u0e=CZT z%4CekIgiw2c<#Cv$F2|=8fKcr{dRuL^^vvz@N+{-8blewz+Qm_qXPs946H8Q1&jZo z=GXCgRL9%}=W{!`?VYGU6ToUYN-ciypRd~^^_$Y2PKCS?PEalidete#E}_ZpYx?~2 z)|}3aWtn7Kw663Cj|?_A7PPVIf5ZyZ0T-8!9yp1_AKEI?;lYd}h6$HY)U&Rwh zrdvS}U}s1f*6FbsR;+6I`#xca3aTLvvjux5}D9J z0d^q(6+5L#lVX_wj=elkaNe@;nMD)MIzlQgTE}_AHVbtbf3_WxAtN97{5!w9`{_TH z`(nTn(NB>Yke_0oWZ5e%Q0`O`L3>n!`-b-kdWP1QIBfeMaWl& zu<~0jt<@FLI&k8o5=WT!%HvnQB z)SW8?22=aL84DNPf8jL?pSk_u*v4P(_B3t$rHiFG-aFl+=BK79cB>thkO+cU1LM!A zuUT*Xs=p>COM1F0HIyz}^5A99vfdaI0%oF1WO@r(E`DJMn_7;&f7U}%X0N*! zRW^Y>e}g4^w2KRq3#kdbwl1kDmegqNY8csj49*aQFG27#VU5$G_03APW@vT(##P^4 zykzPnJb(c#j1vCqLxSVR6g?qB9l{1*fA1TVvwhezefW?6zw6FX4l`=Wn{9KL~I}h{=*$^%vD+Jz}!Xd3$ zf6d6w9yn4McQfU9+BUp1+!q-hf0jRT#T$yhaxIl`iDl{YMh6Hj@Stsl5!s4)wZ6~+ zHh6iOmRQ{c8zebBo`Fu?#RN))`Xt`|c!Re^Y>a?Q?4(PZU=|8_*h_wO8* z+&piBt6|-of~2oD2f872+R4stsoOU9e|iMvp1P;FtuB8_plbD^%TQCHP|dm{2(ph% zZv(rKjvV*ODaSrMdub%4*Uby7LkS%Hk~c}RQ(#bjEurOmoT?{OAdk*wU_mv0H!(rCOA@_WKZAmCXN08Mqq>Jy>z)sL`z z`8SlxO{)yUC%t<`KuO!T#vh0~f50O%u}kn%0RY_q|A9BwKVP_9=nWct*ABLCw&j$LaZc$Qeat=M96ep43ISByTGP zzI&^)>$w3RGDzG|ux8V}8P=Gj=+fY=z<`b7pIB4|kZ4 zB$Zhi_Hi(25%#RKsx==he(++U_N1#h?F?hl8`Gg*^l{-gNrf2jf1zVvzQB^w{jnd* zArOnP>z|ux&64WNGvk$ua@~;Ohtrjskkz}f*^yZSABrwa5~>?fPL6iG3Q}RYBI0{% z-Am(sE+nsSXTSyJa)ao3#>Huxl5$5$GqeUM7Gw-08T@ttKvxt1uwvO%w&@R)6Wyju z4J2@z_)Z^T@+1b_fAQ8sq0~M%Z-DF%k9WC}Ktc!`NBd-_tJ(32C%?bzuh*IBJ7L2N zPO_XFa`((H{GQ&&udnxMDXK-Bh_%!gZTj_K8Bg29>t9eV2ST3-FpVukbHUK@ZG52U zt~3A5x9#W)dB{yKrY?T;l9+VhQLYguUAnI|tIK%5HS5?#e>MIjRCih+PD}mT+^}Xi z43W}os?^J=HQSZsMv$rj*lccuD|PA*tD2;wf~d*UU@=p(r%DYl2LSy@$X3J?sWk6w z=7)vU1a+c5X&$RLR2eQ^HSf&I*T;Xx*TbiNxh&z$AK0{M>8EQydvZ)<$@go-X9UXn zqLpEfO5uhzf8^Rnhh_FX;Js=oqwBJ2=mt{V##p5Mh6gvzkV)GwJJqVzuK9Awlygo& zG;Ft1H*n@|J<1;`NL2lV@{qBwUT#h6^5puU)9Sz(s|TKXl7ZS+ir=2{pF^*h_TrXk z>Yz$LEOwDi2cEdws#>7%Ey!cQ7Mx&O<$ms{6x{T~e<2%QnmA9G#@PwLGRJ=Sq*)Ui zZC%EpFLc}X#>N0&iLoBgJM{!NzfnBttn-O+i%m>)>>vO0>oxGl*Qfn8AQk|O!FBv! z3wj=YRWWQ8rA4A}BPxX6#Nviady9Nf8jy~rjl<^OfBB+LEB$UPur8x-8Lbl zen5f0zJFin$o2i#j1#@7DUbN8x7@w<+1rJTkg*sET#}d@mcsGlC1P2J-u3e7j*RZ_ zSHwK>8Yqnm>kXon;zzUwI+ogg*x=OqwR09v8ht$Si2c^$Z`=I#-6!RtSI%fLJ2PVP ztSOevUVnF1H$|mnQ+a(dSpR-g$>QhBWo8-RRso1R!FQL0Ia=n%?ryPxZtwin%~5(NrJB&%U)h1%sZC2o%=dsz$p|n3KoQU|#$Rm!06+jqL_t*S zx;72Jqm@(gryx!T#UGGCYj|wh%s9X7q zw=^Tphd;wgf{qE93zN~qC;az1C8gl;b$@wiFe zR{2}lpouLVHRaQnsw}w|t*Nfp+%QH+HUj5K5Cz`hJ|GC$g=~<`F68@At zEVJ{>6T{-E7d~zeRac}roZw~Y7D-8yLq_QEi3n(q;D1vQ0CR(v10#&ZN#?7^hzFhJUPfv4*9{ zhPjggtd2qb%2`icPckV3Sd}0SfJM|@HpwOGk!e_eE=JeUb}0iUd{+nFk z&Ja&jt@!0?PqZeM?Xam~C=e55>C?)nG#<7Ky!cwY<9q#&5&Xv!2?!ThSAjpaCg^a; z+5KjWy8ols9cSLvgG^YxAB}z?&>~5N1yuF+10OA#aK?eLl7)}tCu$q}XSkJAhus2c zF9?qca~R*)o;4To7=r! zgP>MZARK|0XsgAy{=?PNuX&7lquo2>vzbDol9G};tuhK3nk49PV7BH)5yMG)ehO@i zhH4+F`slfhVt+nheKGIO6xgYM_MlG;>^TF+y+60ck~_2t)(?10%jpRc2383qZD3wH zoLO#}^20r6-bKd%;^eRswp?E@qqKdmdE`oaufv{M*${y~3b;_5TqamRi+4D1;@uA4 ziUSEhPgFtK4bIC@ywR%qQ1zBeetz&WI``a$A-@%A)PH5*nCEU&)ABBidvep8qOwG@ zyg{mv0DuU8csfS7;|hpAr?foGn*nZ-Omu-vOLe+ne;%Ysb9rgFcJtKLPu%c0k_x-( zZLCi)-&Uw2^1=@oG7w*r{P6>O z?VjRM(|@(vjFJV=)n{);)g3^X5BVxfv9mJrkJW z*=(c09EaTc%&E?teLtRG4QV&1$;NPE**81Q>TFs+d)fW}IR4OyAI&P$GXEL`)4i*u zu59VVGX^26`rjf2%{evv-uG?}IJ-Wy2%;0PbbkWFhWb1LAdjcH-AcYxzj67*(+)tM z0d83M>vRCC6Ji=1&JG1rG$0YF+cZ8Mq5%-t#rnZ$;6M2lc1u!OS=%JV)Ra4h-t_oE z1Xi3-9V%rnCFV{^lOL;|8Z#qawdMt=msmnc3njA=&>;SyO`>^v6UCdBAMu*+iC5|W zT7TZ*hLaRKH$2WImHDN$vCR>0hCP4ZStBOB`vB7sLm@yH6IMLqGz*hg@VnqxVfiDM z-?VuAUxsKU3n!)qwiI`_MWnt^=gIM=C^iU|hC$T?Awd-YwnRpD+dsN&4?^)jlvEN{ zt4+?P`*!e5y4zz?YG8A5bj#dvOD3FtAb)@rv4%w7>p!&lJR`EQ%#T81ZtMeIem8n zE7TETg!pwkUA-JGXCFRLl3$3G5Wu3oJjq1;6}GYadH?S1%INXJ=4J~H8z930cYk5M zGrd-)f73butG^AradK`np^l&dhdiZOYS^;uQe;_AAZwDtqQI?w$cX2d?t67%PZ;`} zu&zGXD#n1c+yS6kAZ5EyZe!U*JO)Iboe)^DX}_@(GRdDKaFIjUC^6v9w`cm@J^#MB z&KCm%UI+z}0Z;Xk9%(6RSGD1XAAiQ4JX~*;V2E-Nbgt04yIBT}ee0WWYQLkwbAZnl z$;vHHM`GGmxy>-*w#`%9MEbq)5(t~XK7EiQ@WSrPfV@=65v*9)P`=^n#s9fZ$V?d+ z2Z5#DM+97u%5Gz4%+~G98xQmLJm56dnRXof8upj$9#>p(06Ty%+*TDKkbh-XuqGwR z;l`*%3$KUu%x@bu7r$LLbJ}-!3Dg1z6Be2OyGr%5={H1rUi-w5G*9Z2i)Vd(qO|%2 zI8Vfw86+zOf(=aBF>=!TPbX8mU$nY5BvnE^OL)j>GqSt|q6H=MICSJ3mTva2)VSj7 zlQz9E<$t>kvtr#QOb}A$=6{LZp%dQ!0@!5j{KCJTXJR^RBLg?hBAxv795LzRh1JRI ze(ON8^Ibs-Y)~btsyBZ2%+byBKVLog))%g_5;NI%cq<*()gYu*MFw>w$AmBd+wB2 z#;$ZnVKLBagwn;I{JYD+XP@G+xn1FyF6Kbq2{sUQb3>DsUXXp{krUpz?T7JypE~rJ z1wh61MY1bp?y+yUyBVSmOQ-zfZ-ei8XHNgj9s}3ZHNyLgZnUtaY_wYE*%>itYYXYf zDDl1}b;~p)?nPOt6n`*YVHF_xQ)zvC|ID0&vbx&mj+pq)BXjQl`#m6!{G9NkCKO>| z3EjiQOlH*zxS}QR{pVZ6@Xul&d`RD(Lr&RO@n-h7TisnPR`A*_fL^+`Cl0)#ejIq! zMgqPKHLJc`*zoPFwfHWKKN0jrz9O04(AzR|`q`0GU>&`B^?&`*@AJJ*U?mo)EJJFY z9&N6Q6#)x7_?8(bdvd!!5wPXN8k|7XZdhy1_QsNk%K+6hm(GVAq4oXeE_kW<99{3oj_{ugD=Z_zawlxss zg4luUmrVZqUk|+d-S7LPcP&_7-yDO>PvIV2Bo_e6_^<^yA<_)L0l?TV6f5BA9laT+ zSygqP?7m}0J@DD7k^0ixG2v$+D~%Xz5sWAn(JmPPssLPoM59N;x8Uf}=zcjKSu%Ic zYW$f+w}0mJvb-G z*l`JG_Slk$Lt03FraPy*@*FSs9OS|jXzD11U z{KrzdyOlv(inD)W`Ganrada}Jz}{T4s)o;|Nq?QTn9)&_W_{$h<&RocUJqa;Cks+j ztZ78*r3aA?;3YzOgK}fNCTB_Pjt^4JNyG}hEjpvfacNoo17|cmz8*tSA`<{905B0YEw9>{V zh?c?+LrZ;kFpO+fOPZ~3wt9m{6{%s$BuVnQ4^Gbt+_2;st}6=GmQ0*G?V7L697LU@ zIYQOPjKdX1rbb&v4j6!(MhI+Tz-abuYkw%7Ni2A@Shz*SPbR^8;i3~5NgMJ`8h-a{ zm&)G!$0MEsXT$n=udjXR!V3z?q$b}7;jp`2J>Txlxi{>{>Aj-5QEHB9@l@C@Ccm<6 z;1gR3&OU^QmE?eQnOiq<~gGu*tB0amKnDOHe0+OKIxOss^pxL){+!7 zWUlxU;v?})Se(sG)NUxAd^#EJL4RyS7H&qZ*>t`;*8Trg7-{eYx}JCYA>KZtepw&3 z1NQ|BlY~54O0^vd$PF&YR8vAF_kB11Z(~iM&{;dete^9g8xQSw(8v#i&itHp4FQ2s zw9GEFOCQYN7}Az>+ixv-TjcpQ($o!XbnTy+D#NLk1dqQT1%1^|{rtdXLVqoWUvtqD zYoLSJnKMVDD(wdP3E@wk57`yFy$%$apoY1Aosg0S5G?NbMo6@6C9 z@`jCha)dj(>%TR3{z;{f_S^(tfv_~Iz{{bKD*iU#bPou($sm%Omz;Y%(v z_+VS57GHPthea5G;ll;NV1KA|;goYuXC{Z={mM;|lzkuZH^Sdo)x5*kJbTZ)!^gbs z{OOUiL(-rVa*jUd`u72>j#yYy8?^#2?30juEfI3x==Mf3V& zewlLFHzr@C!-ego56m`!W8HtqZSQ^ocUC>t!e1VQ|8%2sTh{{()d#m7L)?0;W7cWief9Uh!inVXqnwCsb(g)lSwxnKJk?=}skWlL3b(H| zKy4*~+S&%(`QH3`TiyW`P-QSlL!AMejAujkq`xar^26(eL!{!L>RWgb?JH!jr)qPW z)$M>g|NChqwa>tHbxkq&=mSUry|ficv~>l^%h5y2jei-j!z(dTl3EZ)&|oA$>6zk@ zc?52a)Yq$t$Y;rD@cX9f@;M8i97Em};YYhd_ULQ#_WQr~t^+WNGW&m1w%7DV3!x@d z3pUiCr(X5Wf(q(c?(7A7MF}G6*$Xy21;q-Y=y_-Pdm071pp=9VN&=*p&2F;2%=~|E zb|=|{a(@H^5}gk=vpeN0Z@&4>d+&Q?RyCzzKw>VN(l75v+OCrcAaOOe9!ye zRKsz)#?zs=s}Zee-YcRY=6$BzQe8gxF9)Ly7v3}nyeO#BV$Wx;dPP6ksyBYXREUP7 zihsYZ4jGXiCerB~O$McYSUL}f!)vzO_@CuSHX0vV*IVsC9IE;TMc&m%NX_B zidH`oTtyLd4W7a{(5st@le^CE`qp#o^kyayAlDqaBHd&Va%^U1fhG-!55hVwQUTF> z9VbQBO3`3V*xSAtKGzXS$BCS$u!a)NdViC31TX3fIGt%iSQZbK^!5xNq7qlTeasyU zBWRrr@h&d94~N?cXSA_Kq%f@Y0WOhy(hN%sze}LT4i}ex|QSHRcq>3eR!GcqXl0oz4&Qh3afP}(?PzY z=e+Y8QsJFd*5Fd~R;qz04&zqv+;AIKOt*e@Qq>E0e3Uew_L>m;^TJ)v(EZtqebknE zGe%zh?CmUj{M{Rx+he5jQ1w2f0e>aVVPcL$H2b&T^+n0)v-)b~Xdewpsa6GJ`Z4_vg_kzKQnT3~K!_aFO?m&7&drSxQyev7yl+7|>2Ax;eGtvD-!tEZcc z%&Hd{WwRD!#Py0H44%RSDGw2zY$(NHu8JefiwoNVA=VTOp#~Wlp&3v9hJVBbP&))h zQ2f)ED4svg0>4B2A}4O;IDOw)A-~H2Wtc`#KPa$y*0}EdvIoyQ1?Psqy7cLCy?PJE zT=u{?ea^U5WgVgrf#C+2P;OXuhQKwiU%vkSvyM6Hwgo5fmW(Ic`SjtdU4Ch>&BR;7 zP2ose%@dVRUU4`2=AOE^On+ZAwJa!zpqoW z>BMt1q7fn>LLx?nXToo?W!+^B|mWk+dz^bD|~o8S1T! zHW%r$Sa*FE9=gM`O^j=+I_0Z-&t0Y}EqmG4{yjbEZJd9>y??jn6@NaCkiVv?whn}9 zkpvM>Z<6a=qHkTdd#^w&Q40~2fQz^;`i}g4G65LC3s?gV6|5Chgs?J?gB$@6z5RhW zipq(uLeMzgKxg3`6{r%`D;s*i=opPbeZeFjSHG)$q3S8=XQtUCW|^R*sayX<#k@;r z;JmnxCd@?CYkvAxMt__whB#YX^zd14E^5^cIA>!^dpOT&(>sJP3pH(ARR6^*j~#r< zjBCTX)U%ty2E<5@u@r{j5*-b1l`VeuCbs>{&3n=hdVyj!75{hLe^vi__>E5=#hk-e zeCG!JV_nh&5gERkih-yzRQp5Oy{8|Bwqbh)Q82DL*^{mu5P#=jO8ml0ml%*+c>6nR z8dz$Y+fR`l5fT|)N|xq?-V0U?xzWT5b zXnAe@!iOJbZR^&IyznMlTE@_cq9J9hs1q|_aFfsRqJIr?Jq+=qRlt&3cSGIxtDm`U z4aT4t)+$Q(@^TqByBmJ1T+-<2*AGq|bK7Y-2}WJ^yiC>flS; zc?a8uV09vbj_QCEarD3$y}IMOI5}x|(pQDsQfZOAU)`qyRPr%(pK?yOAL>=K-SI$N zSH%!3iXqvjQOveN5_WC*wzBliizDB@y*e)1&ws{+-5>DeT6^`KUVMvTx}i*&68?~z z3huCH4=QPF4+UWE@gvt!|6^KOhG0$~bh4Z}INR-Vu|VtgEz$P6SF2tvSvGR~L9Xl* zE-Gfcd78w;gOFMy4Xd75E)|$BghfwYWLArXA*wVuSDX>`0;)U>NR{)(+8zh9G+@Rc{5-VMUyiN2eH(Md-WpE9YPL;sN(E?!}Er zo;$s`tpA;=>ZV3r`Rpt?cYH}teHKN;ME2vzNXYnEa?|IZ-~PvAl~E>%UO&gEyTsE8 z&ZBO>_N2P1%CD0^$5JmwfOw$>A1?coSgILVL_d5Blt zAO6k>(D~)3jB-ya>E4Ilv`8ES9!3SIU~YkIK4xa{*S80os^)H>+;w~o-x%jc0Qmob~{!nBs7Y&$GGqMjd+EONRW{0t*xw)yirD<{9`fuK2pMO5L z<*=KdJIv@Dcu|yzM}$R(&W%veE&d>D3x$aX#S(^uNC^gg7VnEj{cT@G!{JTfKm#Vd zF3n~&kG7|zkJIUO%;#!){)<_sP(qAI;ss11u0qIT?tW*POE=)p>)`N>2unId!B7g( zDwxn)iOpqCuYdUb%S)0BaN}q7uYbRLI>Y+csCM348mn?E3vYPk-GFo0pQ>6to%$@g z1mRIA6isAYPO8oksad#u=3g#Qs_JvGLaBB4e@FyOIQNda?7@T6^F}R}%-KU_Uz5*O zyWyk_&s_V3$~h)g#9=~mC2@;z!|=~AvI6ZB&DAsj>?QA3E4<%WklL5siWbwibwx86Q^uZI@F~C=!^bQ z(=xm2aYKGooK*Gn<;xS5a>CR(rwz}{IMeQM3cp zSVYWEe~gPAoR=b4eAN$rUNZH@xXqvP)b2fN&>KP}O{zn#e`cCKb?`HdQmTD(vnQCJ znQF|E>ehdK=gCE=l5`q7Ou*uVwLdj!KH}twgN``$A3}P;32xXj!5$4OM&zcHKyRgA z%Gi`|eeq{kwe^;G#D5`Bq0GmWOwk4e8+1u!}cL_zOCz!DAY79cMy$L7qkqkRfN4&OWECj zCVQ)GAX1;Ml=cmMdsoY@=2q`&=|^X)4|B@#e;t=|#Oa?k%1)=tABY(!Qwv_{3PDKj z$Gty1$Hp7|TYqmUopt6v5+Wt(je7gs^^Q780Cd!yZ_HzkL04>Q4YNjnFbX$Su>&07 zgdB&??5kezs=x=6Rp!L1>O@H4$T>I`*pHkI|KCkSI&Jf9a z(cJDY>AD|=LvMfMd*_g`W4sMDUcHX1BN00imC_|apBfcRh_l5rmoLZ~`~eI=f-|$s zQ~p4jRO&(lHKvGaFxeQ2Fwpwu)i+i=e({5tUwXJGK~AJngpiHo_)hd%aAGYmzfs0@%&l$x}NgyICT2V-XC!T9L=Fs2%1<(KVm??EirPpL~g`zU~;HjGX9#<+qcR4wBd0=O?^kQEE zaw*me;+Qk1Q4hmZa17ph7xOl~(Nw--LF<2C`L46ZE{?f#*FO2u)s7|qnnfQNa>q<= z^ndtRII2X0fn6DT48vBuGAMv5Zvc`Jmy>L+p^}V-7}qVy(mRWUO{Su zfL?+r-pEuv7vA#K-!?se(+lc+-zT)$&wrJwbllI){`}3UVUmYl{K#d7K?gszv5oQ> zQ@*$O%3;D{T8i=_e;9lY^}d>E%jcZ^x_aHd7=ij0Jox&5Ue0F~KDik#a~Vih=L^SJ zO-F#zmy>xF+$$v6iu^T2sfg}bU-qZfk6rnm>MYyUug>Lnanc=2KNi!69qVcjFn^EV z58qm31;m~2!IE`d`V+qWuL-rgHtAZ@BxmY5*}(_>EYw~R^|rjT@tGMfV|SI(EmC|> znJpmXL8sDL*}t#T4^^EwVH|8o%XpB# z_~)G~ry?u~(!rBdC4Z|nJ0oX2_n4SB@#^(W@cEM<`I0E8zUFb_?n?3m*~3eASKV%p zsiIQ8-NX+x`YQrWTdw-ZWqV*(e4tYRGfwBq3E|QLodAdTtmu$(>c9m zf~>c}w#p3qeHux;d&FrW*E|zrJ{IMXV^K7b12XhXacaUwj(>6vFwWnMyx29*Z+_~E zYjJUB5{P85;!^WJDEAr!B>qss9IN>isU-rdd_-U{wr%+L`UlUU3_zsd+hIXQ+24=< zB+tiwJdB^v^`x6xc*9F?22)0zwxz`rF(P^;O)2`Qpk)APO>lBd@2@`d^Eu})?n`z% zQCDnI$+CCxl7Bwr`@2rfrBR*uz=xKPZam3{uZH25Ja)G(ZP3*bYo6Za3$cz+SPqAy zq5Kq!F;{dqZ2tbk;~U<2qMWXa7fjf=;iRGHx`ppbSw$yqX!c03rbfysn1*9;@yA9z zzx!659Aqg?&y*sM;*{O#y}H-X`(KLB8+1X43c=?f?ti*2=KY)tdp|%}90z$0xfSg?Q^)4d*WW+=MC=arv7@&-#-Dww&dHy>BR^{gx>$W~^bIe6 z5>6ReOyUyS|$i`uq@p ztA7Mu27MC)J+5S@TY<&F#WGKU4JY6J($uIW?~Sr{k?RNsVT0BcSyi#M!m9D$G>6X8 zvE|$H`==d;5&C|qU`2P2=7?5^0$oZ~ThUFgejIcZOoH801Um0-pamyZNkVpo!?R#v z?XAA&v)R*bS1!l(yK_+8Es^881~}>7?0*=VkzeZTXg;-Z(H&L8&U?HdXGl&7R3bHX z)oWkg^x~Ydqb3H|GLV zZsFr0>p<(awhlQQi^gCd1cfnKIdmysXkvt*0vUpsF4m}PJA|4P*_vr}A&f$EAb$w4 znL%vcInWX4Aa0cmMYOU?u(R`Us9RA1j<{Ky!N7ESe29IBL5&>pAXA2Sy{Dz_rRIg# zJ&C;?Di_kNlArH~5%?&vS4_-?n+Bcb;|?Rim=-$yM&*cjbA_ z{ZonAZD7ack170!!sAZ3?zt;W!zR!3x3>c{+Jb!8^K{demCtT?`F_fz(tooc7Ifze zNO71|PZ)pET}5_FigV+JRh13zFKEX8)R8m(`IwlNe~wRZz;?*bybv!jEaISe5sGh$ z`(j3F`oW^dwRX`E&o4sLHA#zf!F5<5ad+JuXUcKil7c$G!nAGS5 z^u3=Jb;xS>6|$&0N7{Kz$s17U51RE&gP%q5Qt1X(I37SiiXq^v5JtLY-MyzDja}6{ zdqGiMzogQWaKEIn?bTS4-caddZhrlffIWZgW<{sf#c7er16kc*S$|rZknIqhk@^oy zXa4z2H0bHJQnyzxhH zVB?mS*6rj{r@V|1% z`|66hfBlS&`rX8WlYh>*%wS0^mW__A5S($np$K$iA=nrps5_8odC74yp zJY|O_kfTCRsS03jQ4t-?BK;yz%+(pP&1!a({BqKj)VinXfRSa3wvD z^~2vuFFWqoyWW1rXUe_!`}%gomXTmDhro=W4N;BgL|`=-IxAaXd)2youlx;Tja!ng z?}ww`^Db+EwG&z;ftIuA##cTHI)@(`2Q3NWVO(sAPab%w#<=L%+;lM|(y(UR7Yk0R z{?C$z#L5o2b$_YP<4#)H#V!S`X5l(z6^b1+^X*j)Le|7OPkR*VqnOz!8uFdCxItya zi(q-tc0rE$c}WUKp%&L$%>#U`_5QElfA5b+o_yNfK5PDwtLvJSp1@+9Wm`>136GWZ zklQ87p{2p5EgxzbKIb`frZ67YuX{4&RoEY27gM;vGAJb-;lG%oV?xTBQQc>#CY@=#H5mP%qD(_*tTs`>1#LH$4r@QaAaQ@GG#M& zAk5q$2-T3P(V;|YdwLGz(~w>S!S0Uix)kGH8X$e( zI}Ogt37u8-#jrA+Pw^vww+OQYEIHw6cp`34L0@)N6-X3r}2I z5ilA>#P>v6CcYJsI$^5_kq-(c_&{O_UC;{xbDGU8-G-c{%^S+g@0)toF?TJ!p~E!z zuRqkbhV{sp0#%8eKu};V&jGxIY@3DI5O7W(^)+*`z;YJyto1e5H26JDkp{OvWK0`q z6@TTZd;6BHRqX2p#OcUM50`HEC6C{)&l+}(n{$$LFE}U(t|%Pui^}Q(9&i3kAM#lvX(rw~NC6kyHu1A;=-3DtlnBBnUz#5IPGa~Pczox?5Qorqyrix9Ecvd{!rhm{O0q(n?<^jAL`m4pzUqQJ(@sj(-+Xs(( zt5HrHTG8x=e=8GJgRb~P3J(W~i$V+(&7Ljal|L|zY_;ltO<+YgGER#F_?G^xUF*_m zu~FA9ToTI|eL51EM)_Dwh$nrB_bwjgL5}9wtYW^&FX;jemwh(p-1&4g3HbJSD1Rz@ zKjE5Z{}M?X{dQSvSRQU?oWWPSGHP%Pm#o=#c!l8k#y^M(BG&Bm{zhM*wdUTc`7`Dn zJ7?(=KGWcHzejo}0{|9wiOd2;Hi>%3ejF8mUW5q*Vz4LT5#5B(wNiX`j_IO)Xw#$3 zW|Pny^SN}}Hg250Wzo&wqw`LD+G3ewgPOywRdcNcwGNc*t*IkIsj)zujnn^}lXi*Xkh~ebxN=T+Wz_DqR7D z4~WR%Y$(NoQiBpt3qb&NI=y&ECb$8A?fg&U%J^_^MMM>_4!U8%MFGc%`CGgZHe7VK zuABRp(X8Mg$A}Zpzf5Pe4S&W%4tGGQBjoQ`S^4aY=kvymvkg6C?t4B%&iGaJZA$Py z6I^%(7(!t__ z8*%AlC4BDqS+#x+97_Vy3Whzh1Nf8{8#_u~ees}K5g(Vfh1diK7 zdo7jCA9vjgxB8qT?+GHSTzX*3lGXn>`;1+5S2%j+tCz#E`G27n*{Q2+X~)E8qA!M| z0~vOm*s$u6^^ae6L*CTeerL}d_y^hSoPs1a1&G(AlLbUpr&)lQ<3gk(fPi$BzSgZv zw*K?R7qHiJbji}^{pJB@ZS{niT`wv|v{t~R0S5SDw7pUedEWfutz{3fvL!CV&`Bc( z{bt(V#FPPlm48gB*-U4K$OpX(q`ow}jpaD>EYeuXwpVYtYU}gY?9|R|7vocQ$ASDa z0M%ZI*}JQFe;tEr@sXie$;lPl{bHbTM(Lb$|4B`$V6?ktRSs*y^$TWr9U~qkF3!|ec4gV4 zmprK)TlKB!h@yd4m~6I#;0J9&G|Qtx`m~hIt^h@{jM@ZFBws^^$t2_<(_h(to+)HM zeo&p%rhnNw{;2%ak;OxeR%;IMmXAdv?LK#_*J3nBvxkn!G&oaFkMV{-v_{RWthqf( zLFbfs1mu!J0FC%gc~&Dwf%FW4y4FBb^|?RHyGqRpoiXIh+mF;a(#MHr#~5A|?Gaey z2Li#(hFGvX;BNS^_O1JC=)o&4W=LyaC>Kqg8h?lV*{FL~yr-1fzPY@dD=jPQN^2iK z)bIYP_mnz*^lb~y;;gyz8YE|0Ws3*-GL;3^PUSi+J_KMP?=+djTzv=;-q+l?@ww|M znkv}KKFh19RM+4BXn@tbI|e0b+yXh{w--*%nDB?CUdzBt%EW^Z#E=TRY?4&HmdRic z$A4!)L=4uyz4E0w7k5;yY*E~B%4hG8P(ba9I=RPQ_4L`{tnn{Pfp*5%d^>r=i+6rO z=Zw8-{>{$OlkaP6?Er3Yuv!l?mp>R2c$uR}mXx~8s1x~NPCXy2`u_S&&t3bl0+ekj z($uMBpSaTuEPU44_dlAE>X>M^*$2f0y?^A3NKwB&ZCGsp3SXqKqLn~cS11e_ah0?p z2=IyyPI2h7S!=L$+nOUcJ%8&D>Ns}4#iBvKRhI95WZjN}t5PG!V!vt1U2n|`nR72( z?+UXvq-C=t;;$?30GvQCJMs(6bJ%qDaAUx?>8mrhE&j*96b_wkHZ4i~iVH1rX@6zU zDIn8|P6AL?All`Tut|Dtc*clBH?_LqZwKXf!e)lzYQv2}3`IiH*EL~zOjh106VIP} zu&9N|o zF+nUvvqB7_Mg)$xSr(I+VT7^HwtpY*C$J*z`bv%?hiJ+eg#vDIY8h8tRD=iMSp5Es zb=2i>E9YNwV`E$|L=OdhgppT1{phglqRU+ovj}by4-;%=WlDI;IEceAtz!DEZQg)m zK#s|3t2qJJ{Gf!oDJ_?Zi;rc+tXM)~A7wmb(M>t`;?Wiqh61Pma*KL@OMgMjqpp4Y zXkEter(HsN(ds(4#6fk~U0;P*^)R-I;x-OVcj%0s&FgDFUwn?|>$g@>J-{j$eEhn> zie`$&VG$Mfq9loS1|&0mQqCCpw^}4K#Y&u#8eDZOCJ~W7urG>aSxveEn@q9D7goG; z_lUVpTB#vy)g$2VA;_75@S)5JBM{^w}G1j_mQ^ku99>ZEz)R88nrFSfZ@k}+arNy!h=>%xv};l(RuS=*6!@`ODO`%w+#q`!Z(M%Q zd9+NA0BxU&rJq5etbab}T@QWQm}_77Ash@pTKV*)4;M`>(U&bLq42rRv9~WPuZ%i# z2AVi#c9p;Gs@c34O7qt3?>@N-$B`#WDZK%!p7Vi#lT057>~wi2Uq0ECUT};hGw*b_ zK4;8UctaOvm~`CsZ=WiA<~lN4aQ(W$O6CrJcD}gsl1mhB_J63Go;y|N9B{u|%qaM= z5f&j>`Gg24s99~|#8&L9BAHf;E)AYXv8D~PDxbaPF1mBYB_(3%uW%)h#=fgUFMqA< zEd@$xSs5!oFcRJL!Yxm>toqk6DS_>q3c%8b5h9)H3f$buvJUG}Np*ZTBUbucX zR0al)xO#rKFaNLCxMWx^P@oOvb`^L!xR)6`&AD?yH-ES|D(?>7e5U>~g zSm%luAOf0_z>4MtRs^LGEY0#^xt<=bZ|GR}(eD(nqWcTwdZ`9hJ4~a*{v z!?>Polz;H-gX5y)s9l^Epac^c+>Ux|#KjMu#}Ayeu)-aU9ps1z{_2%SR=jZASNlSY zQ0p9X$s?!oxnq_#$aa<f2jDMBmPC{VdK1tCN1vc1N9}N6$bU6M8Q8jM8AQNKvAZ#GZ%JQ8r)#AL z1vJ3wL6D#FlP0hFR?I)Uyd6DlT?$PJGc#udi%24w_(s4m&$m`|dY) zpMUvh;`mD94^W>@`q6)X=Gx-(rBJOHq2!Ak?3cF`8B_Xq3NUB6}F%x8#Z z>Wk>tK)<~mqXt-eOSxTL2aZTJ4#X)#Mt@)T(tJ5}=n0K}S>d)24!2uK7W^P_QHsPk zDbs2e^KCq{L|w}zcg;Pe4_x{IHABF4#*!uQIqNbx`C0S5y5v)eCN*hpg$>239oQqVlP7Nq#;#znqw z-d&?`&S#v#V+ofyE3NE?0vcfLhB!avP%>Z?TyW1NhU`&u{ouB?c{<4L1Xj(QpmJMu z69~BAG>i$$v3&U8$b>SwDID_v0lk$r|sXF>0;RG~}#{UycD z%%Q{K=25w<#yj8@skHnhT(5>g%(RA8zQm)+^1qK}f>Qs$#+W}_~{fLqm8^+DAeH(V2{Yl#P7 zO!8ArRIhFR2L&|1`X2=9gTovY(jts9m8I?>)9##R8aQ@t#4#wp9)EcPeaIq#v|C8r z6_0yF?a>MnU`F0_`WZjB1qI{a1IR(}5i{}AWcT$It7ZJCC691=k=YsNJ}&h)!hEI4dv>mV})vbiI- zKd!s@7Y_vkZv!zGj(_CFj_r+s+Vb107TxhY)s^7BHLi+?(aWL%Rxb&**QbNqDk)m5 z>OO2EE}M4?pEB@32y4sS%1aqiXTzIJmrp;&ytNP z7YBITVXX+(vkB2t;V7=SDbY(N8K~$2tp3G#I56cQ>yJ6mBy;U`PgOj5=^Pwt)O1xu zp`TVX!1`(Q>-E*DvYal219H*8;tOZW_Pnz^f|E6LK)(eAypfXuTwO+|ao{3{Y9vO+ z`Z?lm@d&NQjDL}~dLh=aB+^p*(u&7ttW-NgTvxqaX*kr66JN{bX02Q6T2~ulQI2x# z+Rc%)EONKbBy#8O>sVRjzOQH|q%g>vc=b3rt z`OM5SGnvf&a@KAH`VY#pbh;xYJ@$)sib8z%Zwq>xVH*sY*NvmcTUC9o+g>J_6bH}o zM313**DLOtCA?`^+?6?%%n`GLni%Ode~C4Gr1|d36rF3`twTrn zlQ=7${127Q&C$z!UdWqK}5&IuB9%@1>5_73-xE?prBF~H!-W-#6e!YUsz!3lF zAhW`1jK+xQRN2=lFBIv520xSBglJF>a`4S0sLqgL03GWy8 z$Q(uPQxJ%yQV)wZv243BJIXd|gMAq$tm=WqnvGs~g&GP1arZT3MRCO@FB;twa-9n} z`btB@FNrnfoYIfzuuex7P^Xe}l3beDSC!j2kCR z0e6av%bT`ya5sJXn%tx->KjQeN+`%1a9r6-a%l@U-+G$WXqNOx_!j!tXjP4M?Tzd` zid||JW>zIk^zMRO#Q9~Ll$6h82CvEp*&d2e{MB^S$@DqfGN>&nfUU;2urp4!ZUIZK zoA1%$JzAr#FI*tq9dcHDZ9|qj*5f%3-l}TX2bLgy9$;Bx>3UFDC^M4;fNQ+8z ztP?(I7>(u{234@f9CKC}yM?9*$=gk052&?wS(v9zbs_3pOt5gf_KWDl zBb6?ka`JP-nU(NZ9~+fzC4pmj1(5vt7^$5oBDxI>W&UD}JL6S8K}%j{s0hWUH`0PRoK#J@GseCO3F`z3wpe68H-R1EQb z74u75nw|#&vYsC;@HxIe|659X`&(a~rJwO|R(P}wN&Z^*hD6s`=U9D^LV$!B??2(Z z`!*pNkR?bp6}rW+(WILVWvwE%CUA#Ox@(50o+VsP3V%NFNTQmy5C4@h#ss&v=FOO2 zcSdD#&kTDQvFZ=bDm#7#w5>c>yEIdk)&qP9OcM1NNB28wB0BjK5Dx^LVb_FKraF$5a4|>^>sM%OWHcB`;!R zW7KbCz_eAGVUU?3hGSUEHthNr@frI{uS>={D~7`Z|Ams?O*o>38C0gxZeQIx&@`(K z3Dj6Q-eR!7{4UHQ#6ooSZNtF7{F7~N@5H`k(`U8QLKP&;3xf`?yd_`6MX3}YDSvq} zRQ}~@skIDuy5a=Df>m$$^tiugtll{K_LX4^LZ`xr3R04^^sDz8peZ*!$Z zOX`3$i6w<6tNsvU6IC3ZjA=Ba;UEl14$_FJ=GT-*?loT7GYwS)W?R12;IAh`PnCi% zr;D7}&8q4hYFk-y2J3{Yc#0xG1_E4KT32bK@9hs~QvflKW=H*OzVYkn;w8^TROltU zOp=px2o{p2j>Q+*APVdDX$JSoI3p6e?;`@s$I3prX0`jGG)Jvc#T8ax&u0ERcD67hjLr4V`HgizP+c8Csd|h7M5zARQO&-;BhXc)j5Qn z1QO^rh@bw^%0M(?gR~h%7V}Sd!SOZ4dt~6=;Dj z+49Y<4?b+W!0fjmM8Em7mqc@c!uLENg|mHMl;Bi!I-P~OD%QI1k74lVq(4Ty>mg z`UdowH^s9d{yeylU52ovm9y3WZV`Ug$(^k=EIgknRWCEXhT4-7%EHp zDS{5)8u$BVs`lxy2Ujhs9^R=(2imtfzNH4(FRuXWu&`W;p*BP-RYe0l9A+NF%*a&^ zD}j!JV$x>Hc>I8n#}wz@3v|Td-W40;oOpi`TS(~64f0MIEK~w`8;42q%42)5vjq*7 z1zARNfutrTdm*!T+h;cajy3I1p6vygo4%J+I2?cGZfXg4nLSEV84fBrxG#4J53Y{; z*};NdTN$}Ht~R>&a{dWP)cprz-iU^(WDc`KDVKH@x)L0A+$KuW3_nITv9D065E@r1 zuU&;98<_U;h8Y04poTuJhJPwJQr+i$(*gL}W*&VGj5jVf*2#-1YW^nTzHYsi+C+wC z#CjW!W*l;;i~uVPG5Mb?;O+XYDbNS3?TwH*6pE*eNb_sAu;Od#tGhdhwLo>78ZK)K zgI3rrvYxb2E+Nr%mX-wGIMvi@F7hk#xP+&K-F@JX1Jq3ioP^K6D+P}*>io>u7vo^~ zi`Tm^aD^ZKo54dXO!Zro$YV&ds*J&;b;B#N=8aZR6MV&UWzHB*9RDaOk30P=HJfi> zKz>u42xbFk={67qFqyvQqly@ltDL{++9&$#I_YP{LdNfPwEf+o{Oy$cGqD(I^XuoR zg7p~p1b~4ciO(f>4|?2Z|4skyX#0Kd+M5f9!Vs=cz4m06>p%00Z21%uH3CWMXSH4t zvIqDDVy*~dCs=RzUut(s;!j;!xjh+ZJX(r7QUlrBHVv~4tI`8qX!vcyDf9$3|08;o zPiml|xW?DEaTMZ5dPYi0G8Q#&YkM{*#*rFJ0eorY8NrIN2+lf*(`>evZLEy0UgA0N zQ5TzBJYT~PtKtK#TK1+Y|GwB>ol;(Ly&9ZkY&wU^lUe3YqOke;VN|tGd_)LD|JUnU z+l`ZrABsRu4$E9_GTK|FO*x@#J%~Y^ zz%>1JY~$|HdF6)LeE@*f5>c_Z>JU^!#Y--RSZhS%O0psy+86@Vqfcyb>`H7Xf0P&#l`s1ZTWmKjVr;<#SGSYXc0C9w_&)jKgpcrWth25ly2Ma)ym|VDqFBKXA|AYL00pP!u{D1YH etKGlL^hc8mJ&~~lRPFJD&P5Mrh^@vDBmM(%?lOJ= delta 68146 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
bm~S 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
_RaSlFIA0%~qr8J+*y^OkNT#>x_Rkonvk< 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 z000000000000000C;$Ke0000000000000000000024EEI!p=-3;Q#;t07*qoM6N<$ Eg7!kI$p8QV diff --git a/vendor/gopkg.in/macaron.v1/render.go b/vendor/gopkg.in/macaron.v1/render.go index 3706e4fe414..f45e431240a 100644 --- a/vendor/gopkg.in/macaron.v1/render.go +++ b/vendor/gopkg.in/macaron.v1/render.go @@ -21,6 +21,7 @@ import ( "encoding/xml" "fmt" "html/template" + "io" "io/ioutil" "net/http" "os" @@ -72,6 +73,7 @@ type ( // TemplateFileSystem represents a interface of template file system that able to list all files. TemplateFileSystem interface { ListFiles() []TemplateFile + Get(string) (io.Reader, error) } // Delims represents a set of Left and Right delimiters for HTML template rendering @@ -86,6 +88,8 @@ type ( RenderOptions struct { // Directory to load templates. Default is "templates". Directory string + // Addtional directories to overwite templates. + AppendDirectories []string // Layout template name. Will not render a layout if "". Default is to "". Layout string // Extensions to parse template files from. Defaults are [".tmpl", ".html"]. @@ -172,8 +176,32 @@ func NewTemplateFileSystem(opt RenderOptions, omitData bool) TplFileSystem { fs := TplFileSystem{} fs.files = make([]TemplateFile, 0, 10) - if err := filepath.Walk(opt.Directory, func(path string, info os.FileInfo, err error) error { - r, err := filepath.Rel(opt.Directory, path) + // Directories are composed in reverse order because later one overwrites previous ones, + // so once found, we can directly jump out of the loop. + dirs := make([]string, 0, len(opt.AppendDirectories)+1) + for i := len(opt.AppendDirectories) - 1; i >= 0; i-- { + dirs = append(dirs, opt.AppendDirectories[i]) + } + dirs = append(dirs, opt.Directory) + + var err error + for i := range dirs { + // Skip ones that does not exists for symlink test, + // but allow non-symlink ones added after start. + if !com.IsExist(dirs[i]) { + continue + } + + dirs[i], err = filepath.EvalSymlinks(dirs[i]) + if err != nil { + panic("EvalSymlinks(" + dirs[i] + "): " + err.Error()) + } + } + lastDir := dirs[len(dirs)-1] + + // We still walk the last (original) directory because it's non-sense we load templates not exist in original directory. + if err = filepath.Walk(lastDir, func(path string, info os.FileInfo, err error) error { + r, err := filepath.Rel(lastDir, path) if err != nil { return err } @@ -181,19 +209,31 @@ func NewTemplateFileSystem(opt RenderOptions, omitData bool) TplFileSystem { ext := GetExt(r) for _, extension := range opt.Extensions { - if ext == extension { - var data []byte - if !omitData { + if ext != extension { + continue + } + + var data []byte + if !omitData { + // Loop over candidates of directory, break out once found. + // The file always exists because it's inside the walk function, + // and read original file is the worst case. + for i := range dirs { + path = filepath.Join(dirs[i], r) + if !com.IsFile(path) { + continue + } + data, err = ioutil.ReadFile(path) if err != nil { return err } + break } - - name := filepath.ToSlash((r[0 : len(r)-len(ext)])) - fs.files = append(fs.files, NewTplFile(name, data, ext)) - break } + + name := filepath.ToSlash((r[0 : len(r)-len(ext)])) + fs.files = append(fs.files, NewTplFile(name, data, ext)) } return nil @@ -208,6 +248,15 @@ func (fs TplFileSystem) ListFiles() []TemplateFile { return fs.files } +func (fs TplFileSystem) Get(name string) (io.Reader, error) { + for i := range fs.files { + if fs.files[i].Name()+fs.files[i].Ext() == name { + return bytes.NewReader(fs.files[i].Data()), nil + } + } + return nil, fmt.Errorf("file '%s' not found", name) +} + func PrepareCharset(charset string) string { if len(charset) != 0 { return "; charset=" + charset @@ -225,8 +274,7 @@ func GetExt(s string) string { } func compile(opt RenderOptions) *template.Template { - dir := opt.Directory - t := template.New(dir) + t := template.New(opt.Directory) t.Delims(opt.Delims.Left, opt.Delims.Right) // Parse an initial template in case we don't have any. template.Must(t.Parse("Macaron")) @@ -248,24 +296,25 @@ func compile(opt RenderOptions) *template.Template { } const ( - _DEFAULT_TPL_SET_NAME = "DEFAULT" + DEFAULT_TPL_SET_NAME = "DEFAULT" ) -// templateSet represents a template set of type *template.Template. -type templateSet struct { +// TemplateSet represents a template set of type *template.Template. +type TemplateSet struct { lock sync.RWMutex sets map[string]*template.Template dirs map[string]string } -func newTemplateSet() *templateSet { - return &templateSet{ +// NewTemplateSet initializes a new empty template set. +func NewTemplateSet() *TemplateSet { + return &TemplateSet{ sets: make(map[string]*template.Template), dirs: make(map[string]string), } } -func (ts *templateSet) Set(name string, opt *RenderOptions) *template.Template { +func (ts *TemplateSet) Set(name string, opt *RenderOptions) *template.Template { t := compile(*opt) ts.lock.Lock() @@ -276,14 +325,14 @@ func (ts *templateSet) Set(name string, opt *RenderOptions) *template.Template { return t } -func (ts *templateSet) Get(name string) *template.Template { +func (ts *TemplateSet) Get(name string) *template.Template { ts.lock.RLock() defer ts.lock.RUnlock() return ts.sets[name] } -func (ts *templateSet) GetDir(name string) string { +func (ts *TemplateSet) GetDir(name string) string { ts.lock.RLock() defer ts.lock.RUnlock() @@ -332,8 +381,8 @@ func ParseTplSet(tplSet string) (tplName string, tplDir string) { func renderHandler(opt RenderOptions, tplSets []string) Handler { cs := PrepareCharset(opt.Charset) - ts := newTemplateSet() - ts.Set(_DEFAULT_TPL_SET_NAME, &opt) + ts := NewTemplateSet() + ts.Set(DEFAULT_TPL_SET_NAME, &opt) var tmpOpt RenderOptions for _, tplSet := range tplSets { @@ -346,7 +395,7 @@ func renderHandler(opt RenderOptions, tplSets []string) Handler { return func(ctx *Context) { r := &TplRender{ ResponseWriter: ctx.Resp, - templateSet: ts, + TemplateSet: ts, Opt: &opt, CompiledCharset: cs, } @@ -379,7 +428,7 @@ func Renderers(options RenderOptions, tplSets ...string) Handler { type TplRender struct { http.ResponseWriter - *templateSet + *TemplateSet Opt *RenderOptions CompiledCharset string @@ -486,11 +535,11 @@ func (r *TplRender) addYield(t *template.Template, tplName string, data interfac } func (r *TplRender) renderBytes(setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) (*bytes.Buffer, error) { - t := r.templateSet.Get(setName) + t := r.TemplateSet.Get(setName) if Env == DEV { opt := *r.Opt - opt.Directory = r.templateSet.GetDir(setName) - t = r.templateSet.Set(setName, &opt) + opt.Directory = r.TemplateSet.GetDir(setName) + t = r.TemplateSet.Set(setName, &opt) } if t == nil { return nil, fmt.Errorf("html/template: template \"%s\" is undefined", tplName) @@ -523,12 +572,14 @@ func (r *TplRender) renderHTML(status int, setName, tplName string, data interfa r.Header().Set(_CONTENT_TYPE, r.Opt.HTMLContentType+r.CompiledCharset) r.WriteHeader(status) - out.WriteTo(r) + if _, err := out.WriteTo(r); err != nil { + out.Reset() + } bufpool.Put(out) } func (r *TplRender) HTML(status int, name string, data interface{}, htmlOpt ...HTMLOptions) { - r.renderHTML(status, _DEFAULT_TPL_SET_NAME, name, data, htmlOpt...) + r.renderHTML(status, DEFAULT_TPL_SET_NAME, name, data, htmlOpt...) } func (r *TplRender) HTMLSet(status int, setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) { @@ -544,7 +595,7 @@ func (r *TplRender) HTMLSetBytes(setName, tplName string, data interface{}, html } func (r *TplRender) HTMLBytes(name string, data interface{}, htmlOpt ...HTMLOptions) ([]byte, error) { - return r.HTMLSetBytes(_DEFAULT_TPL_SET_NAME, name, data, htmlOpt...) + return r.HTMLSetBytes(DEFAULT_TPL_SET_NAME, name, data, htmlOpt...) } func (r *TplRender) HTMLSetString(setName, tplName string, data interface{}, htmlOpt ...HTMLOptions) (string, error) { @@ -581,13 +632,94 @@ func (r *TplRender) prepareHTMLOptions(htmlOpt []HTMLOptions) HTMLOptions { func (r *TplRender) SetTemplatePath(setName, dir string) { if len(setName) == 0 { - setName = _DEFAULT_TPL_SET_NAME + setName = DEFAULT_TPL_SET_NAME } opt := *r.Opt opt.Directory = dir - r.templateSet.Set(setName, &opt) + r.TemplateSet.Set(setName, &opt) } func (r *TplRender) HasTemplateSet(name string) bool { - return r.templateSet.Get(name) != nil + return r.TemplateSet.Get(name) != nil +} + +// DummyRender is used when user does not choose any real render to use. +// This way, we can print out friendly message which asks them to register one, +// instead of ugly and confusing 'nil pointer' panic. +type DummyRender struct { + http.ResponseWriter +} + +func renderNotRegistered() { + panic("middleware render hasn't been registered") +} + +func (r *DummyRender) SetResponseWriter(http.ResponseWriter) { + renderNotRegistered() +} + +func (r *DummyRender) JSON(int, interface{}) { + renderNotRegistered() +} + +func (r *DummyRender) JSONString(interface{}) (string, error) { + renderNotRegistered() + return "", nil +} + +func (r *DummyRender) RawData(int, []byte) { + renderNotRegistered() +} + +func (r *DummyRender) PlainText(int, []byte) { + renderNotRegistered() +} + +func (r *DummyRender) HTML(int, string, interface{}, ...HTMLOptions) { + renderNotRegistered() +} + +func (r *DummyRender) HTMLSet(int, string, string, interface{}, ...HTMLOptions) { + renderNotRegistered() +} + +func (r *DummyRender) HTMLSetString(string, string, interface{}, ...HTMLOptions) (string, error) { + renderNotRegistered() + return "", nil +} + +func (r *DummyRender) HTMLString(string, interface{}, ...HTMLOptions) (string, error) { + renderNotRegistered() + return "", nil +} + +func (r *DummyRender) HTMLSetBytes(string, string, interface{}, ...HTMLOptions) ([]byte, error) { + renderNotRegistered() + return nil, nil +} + +func (r *DummyRender) HTMLBytes(string, interface{}, ...HTMLOptions) ([]byte, error) { + renderNotRegistered() + return nil, nil +} + +func (r *DummyRender) XML(int, interface{}) { + renderNotRegistered() +} + +func (r *DummyRender) Error(int, ...string) { + renderNotRegistered() +} + +func (r *DummyRender) Status(int) { + renderNotRegistered() +} + +func (r *DummyRender) SetTemplatePath(string, string) { + renderNotRegistered() +} + +func (r *DummyRender) HasTemplateSet(string) bool { + renderNotRegistered() + return false } diff --git a/vendor/gopkg.in/macaron.v1/router.go b/vendor/gopkg.in/macaron.v1/router.go index f9b421a3302..21b00ec98ca 100644 --- a/vendor/gopkg.in/macaron.v1/router.go +++ b/vendor/gopkg.in/macaron.v1/router.go @@ -82,6 +82,9 @@ type Router struct { groups []group notFound http.HandlerFunc internalServerError func(*Context, error) + + // handlerWrapper is used to wrap arbitrary function from Handler to inject.FastInvoker. + handlerWrapper func(Handler) Handler } func NewRouter() *Router { @@ -173,7 +176,7 @@ func (r *Router) Handle(method string, pattern string, handlers []Handler) *Rout h = append(h, handlers...) handlers = h } - validateHandlers(handlers) + handlers = validateAndWrapHandlers(handlers, r.handlerWrapper) return r.handle(method, pattern, func(resp http.ResponseWriter, req *http.Request, params Params) { c := r.m.createContext(resp, req) @@ -251,23 +254,25 @@ func (r *Router) Combo(pattern string, h ...Handler) *ComboRouter { return &ComboRouter{r, pattern, h, map[string]bool{}, nil} } -// Configurable http.HandlerFunc which is called when no matching route is +// NotFound configurates http.HandlerFunc which is called when no matching route is // found. If it is not set, http.NotFound is used. // Be sure to set 404 response code in your handler. func (r *Router) NotFound(handlers ...Handler) { - validateHandlers(handlers) + handlers = validateAndWrapHandlers(handlers) r.notFound = func(rw http.ResponseWriter, req *http.Request) { c := r.m.createContext(rw, req) - c.handlers = append(r.m.handlers, handlers...) + c.handlers = make([]Handler, 0, len(r.m.handlers)+len(handlers)) + c.handlers = append(c.handlers, r.m.handlers...) + c.handlers = append(c.handlers, handlers...) c.run() } } -// Configurable handler which is called when route handler returns +// InternalServerError configurates handler which is called when route handler returns // error. If it is not set, default handler is used. // Be sure to set 500 response code in your handler. func (r *Router) InternalServerError(handlers ...Handler) { - validateHandlers(handlers) + handlers = validateAndWrapHandlers(handlers) r.internalServerError = func(c *Context, err error) { c.index = 0 c.handlers = handlers @@ -276,6 +281,11 @@ func (r *Router) InternalServerError(handlers ...Handler) { } } +// SetHandlerWrapper sets handlerWrapper for the router. +func (r *Router) SetHandlerWrapper(f func(Handler) Handler) { + r.handlerWrapper = f +} + func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) { if t, ok := r.routers[req.Method]; ok { h, p, ok := t.Match(req.URL.Path) diff --git a/vendor/gopkg.in/macaron.v1/static.go b/vendor/gopkg.in/macaron.v1/static.go index 4ff8342fc5e..60c521110e7 100644 --- a/vendor/gopkg.in/macaron.v1/static.go +++ b/vendor/gopkg.in/macaron.v1/static.go @@ -16,6 +16,7 @@ package macaron import ( + "encoding/base64" "log" "net/http" "path" @@ -35,6 +36,9 @@ type StaticOptions struct { // Expires defines which user-defined function to use for producing a HTTP Expires Header // https://developers.google.com/speed/docs/insights/LeverageBrowserCaching Expires func() string + // ETag defines if we should add an ETag header + // https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching#validating-cached-responses-with-etags + ETag bool // FileSystem is the interface for supporting any implmentation of file system. FileSystem http.FileSystem } @@ -172,10 +176,21 @@ func staticHandler(ctx *Context, log *log.Logger, opt StaticOptions) bool { ctx.Resp.Header().Set("Expires", opt.Expires()) } + if opt.ETag { + tag := GenerateETag(string(fi.Size()), fi.Name(), fi.ModTime().UTC().Format(http.TimeFormat)) + ctx.Resp.Header().Set("ETag", tag) + } + http.ServeContent(ctx.Resp, ctx.Req.Request, file, fi.ModTime(), f) return true } +// GenerateETag generates an ETag based on size, filename and file modification time +func GenerateETag(fileSize, fileName, modTime string) string { + etag := fileSize + fileName + modTime + return base64.StdEncoding.EncodeToString([]byte(etag)) +} + // Static returns a middleware handler that serves static files in the given directory. func Static(directory string, staticOpt ...StaticOptions) Handler { opt := prepareStaticOptions(directory, staticOpt) diff --git a/vendor/vendor.json b/vendor/vendor.json index ee79351492d..4e884428eb7 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -6,6 +6,12 @@ "path": "appengine/cloudsql", "revision": "" }, + { + "checksumSHA1": "7HXb3cry6luicWeJM9Uxwzfo9Rs=", + "path": "github.com/Unknwon/com", + "revision": "0db4a625e949e956314d7d1adea9bf82384cc10c", + "revisionTime": "2017-02-13T07:20:14Z" + }, { "checksumSHA1": "6nleggdedlS1mdzSnu1xf1Pnd+8=", "path": "github.com/aws/aws-sdk-go", @@ -358,6 +364,24 @@ "version": "v1.21.1", "versionExact": "v1.21.1" }, + { + "checksumSHA1": "OkqfwXeTVoiIxNMDA7HKvmrCDw8=", + "path": "github.com/go-macaron/binding", + "revision": "48920167fa152d02f228cfbece7e0f1e452d200a", + "revisionTime": "2016-12-22T07:05:54Z" + }, + { + "checksumSHA1": "y0olVbiMQ6/UOa/eh52XYnies90=", + "path": "github.com/go-macaron/inject", + "revision": "d8a0b8677191f4380287cfebd08e462217bac7ad", + "revisionTime": "2016-06-27T17:00:12Z" + }, + { + "checksumSHA1": "gO0dj0NqsmBTkf4D0JzJDtOEx+U=", + "path": "github.com/go-macaron/session", + "revision": "b8e286a0dba8f4999042d6b258daf51b31d08938", + "revisionTime": "2017-03-20T17:22:09Z" + }, { "checksumSHA1": "42vkdsxNaLyPu+FktCzZ/8zsNSE=", "path": "github.com/go-sql-driver/mysql", @@ -452,6 +476,12 @@ "revision": "5db88ed452e937f2fd557de6f4f1af7f2eabed0b", "revisionTime": "2016-08-23T18:01:44Z" }, + { + "checksumSHA1": "1MGpGDQqnUoRpv7VEcQrXOBydXE=", + "path": "golang.org/x/crypto/pbkdf2", + "revision": "3543873453996aaab2fc6b3928a35fc5ca2b5afb", + "revisionTime": "2017-04-18T16:44:36Z" + }, { "checksumSHA1": "WHc3uByvGaMcnSoI21fhzYgbOgg=", "path": "golang.org/x/net/context/ctxhttp", @@ -487,6 +517,12 @@ "path": "gopkg.in/gomail.v2", "revision": "81ebce5c23dfd25c6c67194b37d3dd3f338c98b1", "revisionTime": "2016-04-11T21:29:32Z" + }, + { + "checksumSHA1": "1HJvJZheB5NNl3i1R9zZJpiJ1G0=", + "path": "gopkg.in/macaron.v1", + "revision": "a325110f8b392bce3e5cdeb8c44bf98078ada3be", + "revisionTime": "2017-02-13T09:12:08Z" } ], "rootPath": "github.com/grafana/grafana"