diff options
71 files changed, 582 insertions, 505 deletions
diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index aab46f49..bb635e41 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -113,14 +113,14 @@ admin_password = Password confirm_password = Confirm Password admin_email = Admin Email install_gogs = Install Gogs -test_git_failed = Fail to test 'git' command: %v +test_git_failed = Failed to test 'git' command: %v sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version. invalid_db_setting = Database setting is not correct: %v invalid_repo_path = Repository root path is invalid: %v run_user_not_match = Run user isn't the current user: %s -> %s smtp_host_missing_port = SMTP Host port missing from address. invalid_smtp_from = SMTP From field is invalid: %v -save_config_failed = Fail to save configuration: %v +save_config_failed = Failed to save configuration: %v invalid_admin_setting = Admin account setting is invalid: %v install_success = Welcome! We're glad that you chose Gogs, have fun and take care. invalid_log_root_path = Log root path is invalid: %v @@ -1231,7 +1231,7 @@ config.mailer_subject_prefix = Subject Prefix config.mailer_host = Host config.mailer_user = User config.send_test_mail = Send Test Email -config.test_mail_failed = Fail to send test email to '%s': %v +config.test_mail_failed = Failed to send test email to '%s': %v config.test_mail_sent = Test email has been sent to '%s'. config.oauth_config = OAuth Configuration @@ -6,7 +6,7 @@ require ( github.com/bgentry/speakeasy v0.1.0 // indirect github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0 github.com/editorconfig/editorconfig-core-go/v2 v2.2.1 - github.com/fatih/color v1.7.0 // indirect + github.com/fatih/color v1.9.0 // indirect github.com/go-macaron/binding v1.0.1 github.com/go-macaron/cache v0.0.0-20190810181446-10f7c57e2196 github.com/go-macaron/captcha v0.0.0-20190813234938-24f40749f36d @@ -30,8 +30,7 @@ require ( github.com/klauspost/compress v1.8.6 // indirect github.com/klauspost/cpuid v1.2.1 // indirect github.com/lib/pq v1.2.0 - github.com/mattn/go-colorable v0.1.4 // indirect - github.com/mattn/go-isatty v0.0.10 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect github.com/mattn/go-runewidth v0.0.4 // indirect github.com/mattn/go-sqlite3 v1.11.0 github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 @@ -56,14 +55,15 @@ require ( github.com/urfave/cli v1.22.1 golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582 + golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c // indirect golang.org/x/text v0.3.2 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect - gopkg.in/clog.v1 v1.2.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.52.0 gopkg.in/ldap.v2 v2.5.1 gopkg.in/macaron.v1 v1.3.4 + unknwon.dev/clog/v2 v2.1.0 xorm.io/builder v0.3.6 xorm.io/core v0.7.2 xorm.io/xorm v0.8.0 @@ -13,6 +13,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -43,6 +44,8 @@ github.com/editorconfig/editorconfig-core-go/v2 v2.2.1/go.mod h1:6XDmqAZsQu8ikS+ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -69,6 +72,7 @@ github.com/go-macaron/toolbox v0.0.0-20190813233741-94defb8383c6/go.mod h1:YFNJ/ github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -82,6 +86,7 @@ github.com/gogs/go-gogs-client v0.0.0-20200128182646-c69cb7680fd4 h1:C7NryI/RQhs github.com/gogs/go-gogs-client v0.0.0-20200128182646-c69cb7680fd4/go.mod h1:fR6z1Ie6rtF7kl/vBYMfgD5/G5B1blui7z426/sj2DU= github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0 h1:K02vod+sn3M1OOkdqi2tPxN2+xESK4qyITVQ3JkGEv4= github.com/gogs/go-libravatar v0.0.0-20191106065024-33a75213d0a0/go.mod h1:Zas3BtO88pk1cwUfEYlvnl/CRwh0ybDxRWSwRjG8I3w= +github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a h1:8DZwxETOVWIinYxDK+i6L+rMb7eGATGaakD6ZucfHVk= github.com/gogs/minwinsvc v0.0.0-20170301035411-95be6356811a/go.mod h1:TUIZ+29jodWQ8Gk6Pvtg4E09aMsc3C/VLZiVYfUhWQU= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= @@ -96,6 +101,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= @@ -107,11 +113,13 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/issue9/assert v1.3.1 h1:L8pRpbnzMIPFJqrMKR/oG03uWrtVeZyYBpI2U2Jx1JE= github.com/issue9/assert v1.3.1/go.mod h1:9Ger+iz8X7r1zMYYwEhh++2wMGWcNN2oVI+zIQXxcio= github.com/issue9/identicon v1.0.1 h1:pCDfjMDM6xWK0Chxo8Lif+ST/nOEtmXgMITgV1YA9Og= github.com/issue9/identicon v1.0.1/go.mod h1:UKNVkUFI68RPz/RlLhsAr1aX6bBSaYEWRHVfdjrMUmk= @@ -132,8 +140,10 @@ github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= @@ -145,9 +155,13 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -162,6 +176,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/msteinert/pam v0.0.0-20190215180659-f29b9f28d6f9 h1:ZivaaKmjs9q90zi6I4gTLW6tbVGtlBjellr3hMYaly0= github.com/msteinert/pam v0.0.0-20190215180659-f29b9f28d6f9/go.mod h1:np1wUFZ6tyoke22qDJZY40URn9Ae51gX7ljIWXN5TJs= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= @@ -208,6 +223,7 @@ github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNue github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI= github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= @@ -249,6 +265,7 @@ github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e h1:Qf3QQl/zmEbWD github.com/unknwon/paginater v0.0.0-20170405233947-45e5d631308e/go.mod h1:TBwoao3Q4Eb/cp+dHbXDfRTrZSsj/k7kLr2j1oWRWC0= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -297,7 +314,12 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c h1:jceGD5YNJGgGMkJz79agzOln1K9TaZUjv5ird16qniQ= +golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -316,6 +338,7 @@ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMt google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -323,15 +346,15 @@ google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRn google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e h1:wGA78yza6bu/mWcc4QfBuIEHEtc06xdiU0X8sY36yUU= gopkg.in/bufio.v1 v1.0.0-20140618132640-567b2bfa514e/go.mod h1:xsQCaysVCudhrYTfzYWe577fCe7Ceci+6qjO2Rdc0Z4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/clog.v1 v1.2.0 h1:BHfwHRNQy497iBNsRBassPixSAxRbn2z5KVkdBFbwxc= -gopkg.in/clog.v1 v1.2.0/go.mod h1:L6fgdpdhFgKX4eGuDvt+N6X2GwZE160NRrIHzvaF8ZM= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= @@ -352,6 +375,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +unknwon.dev/clog/v2 v2.1.0 h1:4iXteBnL9ESvxoNkiaWx4UTU6yEgEmDxFaMANyiq4b8= +unknwon.dev/clog/v2 v2.1.0/go.mod h1:zvUlyibDHI4mykYdWyWje2G9nF/nBzfDOqRo2my4mWc= xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8= xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU= xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw= @@ -11,7 +11,7 @@ import ( "os" "github.com/urfave/cli" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/cmd" "gogs.io/gogs/internal/setting" @@ -39,6 +39,6 @@ func main() { cmd.Restore, } if err := app.Run(os.Args); err != nil { - log.Fatal(2, "Failed to run: %v", err) + log.Fatal("Failed to start application: %v", err) } } diff --git a/internal/assets/conf/conf_gen.go b/internal/assets/conf/conf_gen.go index 6f01abbc..7c41238f 100644 --- a/internal/assets/conf/conf_gen.go +++ b/internal/assets/conf/conf_gen.go @@ -213,7 +213,7 @@ // ../../../conf/locale/locale_cs-CZ.ini (70.566kB) // ../../../conf/locale/locale_de-DE.ini (71.043kB) // ../../../conf/locale/locale_en-GB.ini (63.539kB) -// ../../../conf/locale/locale_en-US.ini (66.198kB) +// ../../../conf/locale/locale_en-US.ini (66.204kB) // ../../../conf/locale/locale_es-ES.ini (71.938kB) // ../../../conf/locale/locale_fa-IR.ini (90.359kB) // ../../../conf/locale/locale_fi-FI.ini (68.026kB) @@ -324,7 +324,7 @@ func confAppIni() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "conf/app.ini", size: 16969, mode: os.FileMode(0644), modTime: time.Unix(1582129140, 0)} + info := bindataFileInfo{name: "conf/app.ini", size: 16969, mode: os.FileMode(0644), modTime: time.Unix(1582129260, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x67, 0x21, 0x50, 0xe6, 0xae, 0x51, 0x62, 0x82, 0xa4, 0xb2, 0x2f, 0x2d, 0x1e, 0x7a, 0x64, 0xa9, 0x23, 0x99, 0xaa, 0x6b, 0x23, 0xce, 0x29, 0x9d, 0xee, 0xce, 0x16, 0xd6, 0x60, 0x1a, 0xd, 0xa1}} return a, nil } @@ -4564,12 +4564,12 @@ func confLocaleLocale_enGbIni() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "conf/locale/locale_en-GB.ini", size: 63539, mode: os.FileMode(0644), modTime: time.Unix(1575868928, 0)} + info := bindataFileInfo{name: "conf/locale/locale_en-GB.ini", size: 63539, mode: os.FileMode(0644), modTime: time.Unix(1582135308, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe1, 0x8b, 0x15, 0x87, 0xbf, 0x3a, 0x2e, 0x5b, 0x4, 0x53, 0x4a, 0x5, 0x30, 0x4, 0x90, 0xda, 0x3e, 0x4, 0xd3, 0x14, 0x5, 0xe2, 0x29, 0xab, 0xc1, 0xfb, 0xa5, 0xa3, 0x32, 0x4b, 0x63, 0x46}} return a, nil } -var _confLocaleLocale_enUsIni = "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\xbd\xeb\x72\x1c\xb9\xb1\x30\xf8\xbf\x9e\x02\xa3\x13\x0c\xcd\x44\x50\xad\x98\xf1\x77\xbe\xdd\x98\x10\xe5\xe5\x50\xa3\xcb\x39\x94\xc4\x43\x4a\xf6\xe7\xd5\x2a\x6a\xd0\x55\xe8\x6e\x98\xd5\x40\xbb\x80\x62\xab\xc7\xe1\x37\xd8\x07\xd8\xe7\xdb\x27\xd9\x40\x5e\x70\xa9\xaa\x26\x25\xfb\xec\x1f\xb2\x0b\x48\x24\xee\x89\xcc\x44\x66\x42\xee\x76\x75\xab\x5c\x23\xce\xc4\xb9\xd8\x49\x6d\x3a\xe5\x9c\x70\xaa\x5b\x3d\xd9\x58\xe7\x55\x2b\x5e\x69\x2f\x9c\xea\xef\x74\xa3\xaa\x6a\x63\xb7\x4a\x9c\x89\xd7\x76\xab\xaa\x56\xba\xcd\xd2\xca\xbe\x15\x67\xe2\x05\xff\xae\xd4\x97\x5d\x67\xfb\x00\xf4\x2b\xfe\xaa\x36\xaa\xdb\x85\x32\xaa\xdb\x55\x4e\xaf\x4d\xad\x8d\x38\x13\x37\x7a\x6d\xc4\x1b\x83\x29\x76\xf0\x9c\xf4\x7e\xf0\x98\x36\xec\x38\xe9\xe3\xae\xea\xd5\x5a\x3b\xaf\x7a\x71\x26\xae\xe9\x67\xb5\x57\x4b\xa7\x7d\xa8\xe9\xcf\xf8\xab\xda\xc9\x75\xf8\xbc\x92\x6b\x55\x79\xb5\xdd\x75\x12\xb2\x3f\xd0\xcf\xaa\x93\x66\x3d\x20\xcc\x25\xfd\xac\x9a\x5e\x49\xaf\x6a\xa3\xf6\xe2\x4c\x5c\xc0\xc7\x62\xb1\xa8\x06\xa7\xfa\x7a\xd7\xdb\x95\xee\x54\x2d\x4d\x5b\x6f\xb1\x53\x1f\x9d\xea\x05\xa5\x0b\x69\x5a\x11\xd2\xa1\xc1\xaa\xad\xb5\xa9\xa5\xa3\x56\xab\x56\x68\x23\xa4\xab\x00\x95\x91\x5b\x2e\x1d\x7e\x56\x6a\x2b\x75\x17\xc6\x28\xfc\xaf\x76\xd2\xb9\xbd\x85\x81\xbc\xa2\x9f\x55\xaf\x6a\x7f\xd8\x29\xe8\xf0\x93\x0f\x87\x9d\xaa\x1a\xb9\xf3\xcd\x46\x86\x66\xe2\xaf\xaa\xea\xd5\xce\x3a\xed\x6d\x7f\x00\x38\xfe\xa8\x6c\xbf\x96\x46\xff\x2e\xbd\xb6\x61\xac\xdf\x67\x9f\xd5\x56\xf7\xbd\x0d\x03\xf9\x16\x7e\x54\x46\xed\xeb\x80\x47\x9c\x89\x77\x6a\x9f\x63\x09\x39\x5b\xbd\xee\x71\x14\x43\xe6\x5b\xf8\x0a\x58\x30\x8f\x30\x61\x56\xc4\xb6\xb2\xfd\x2d\xa5\xbe\x0c\x3f\x47\x28\x6d\xbf\xa6\xdc\xb2\x5d\xd2\xc8\xb5\xa2\xdc\xb7\xf0\x51\x00\xb8\x4a\xb6\x5b\x6d\xea\x9d\x34\x2a\x0c\xdd\x79\xf8\x12\x57\xe1\xab\x92\x4d\x63\x07\xe3\x6b\xa7\xbc\xd7\x66\x1d\xe6\xe0\x1c\x93\xc4\x0d\x25\x55\x59\x5e\x4c\x3b\xd8\x21\xce\xb2\x38\x13\x7f\xb1\x43\x2f\xae\xf0\x13\xf3\xb2\x42\x90\x19\x4b\x56\xb2\xf1\xfa\x4e\x7b\xad\xb0\x32\xfe\xa8\x76\x43\xd7\xd5\xbd\xfa\xdb\xa0\x9c\x0f\x59\x57\x43\xd7\x89\x6b\xfa\xae\xb4\x73\x03\x94\x78\x03\x3f\xaa\xaa\x91\xa6\x81\xee\x5c\xc0\x8f\xaa\xfa\xa4\x8d\xf3\xb2\xeb\x3e\x57\xf4\x23\x00\xe3\x2f\x1c\x27\xaf\x3d\x34\x96\x12\xc5\x8d\x57\x3b\x17\x06\x5a\xbc\xd4\xbd\xf3\x4f\xbc\xde\x2a\x71\x3d\x98\xaa\xb5\xcd\xad\xea\xeb\xb0\xfd\x60\xe3\xbc\x59\x89\x83\x1d\x1e\xf7\x4a\xf4\x83\x31\xda\xac\xc5\x2b\xbb\x76\x42\x1b\xa7\x5b\x25\x5e\x00\xf4\xa9\xd8\x75\x4a\x3a\x25\x7a\x25\x5b\xf1\x4c\x0a\x2f\xfb\xb5\xf2\x67\x8f\xea\x65\x27\xcd\xed\x23\xb1\xe9\xd5\xea\xec\xd1\x89\x7b\xf4\xfc\xd5\xa0\x5b\xd5\x69\xa3\xdc\xb3\xa7\xf2\xb9\x68\x64\xaf\x56\x43\xd7\x1d\xc4\x52\xad\xc2\x5e\x39\xd8\x41\x34\x1b\x69\xd6\x61\x9f\x1c\xfc\x26\x54\xa8\x8d\xf0\x1b\xed\x44\xd8\xa8\xdf\x55\x61\x94\xb4\x57\x75\xbb\x64\x12\x04\x0d\x82\xe4\x5e\x39\xf1\xf6\x70\xf3\x5f\x97\xa7\xe2\xca\x3a\xbf\xee\x15\xfc\xbe\xf9\xaf\x4b\xed\xd5\x1f\x4e\xc5\xdb\x9b\x9b\xff\xba\x14\xb6\x17\x1f\xf4\x8b\x5f\x16\x55\xbb\xac\x79\x5c\x5e\x48\x2f\x97\xa1\x0b\x71\xae\x42\x26\x6e\xa5\x98\x07\x1b\x2a\x10\x38\x20\x66\xce\xc3\x26\xa5\x0d\x3a\xbb\x1d\xdb\x65\x4d\x7b\x38\xe2\x78\x17\x36\x72\xbb\x4c\x03\x7c\x85\x43\x37\x38\x25\xde\xbc\x7b\xf7\xfe\xc5\x2f\x42\x99\xb5\x36\x4a\xec\xb5\xdf\x88\xc1\xaf\xfe\xf7\x7a\xad\x8c\xea\x65\x57\x37\x3a\x8c\x4d\xef\x94\x17\x2b\xdb\x63\x4f\x17\x95\x73\x5d\xbd\xb5\x6d\xa8\xe5\xe6\xe6\x52\xbc\xb5\x6d\xa0\x69\x7e\x03\x0d\xf1\x9b\xca\xfd\xad\x0b\xe3\x15\x2b\xfc\xb0\x51\x02\x96\x2e\x00\xd9\x15\x0f\x8f\x68\xa9\x8d\x0b\xf1\x6c\xd9\x3f\xcf\xda\x25\x97\xce\x76\x83\xa7\x12\xfb\x8d\x32\x30\x4f\xce\xcb\xde\x0b\xe9\x98\xd0\x2f\x2a\xd5\xf7\xb5\xda\xee\xfc\x21\xcc\x0e\xb5\x61\x8c\x1d\x91\x34\xd2\x18\xeb\xc5\x52\x09\x80\x5f\x54\xc6\xd6\xb8\x53\x03\xd9\x6c\xb5\x93\xcb\x4e\xd5\x48\xc0\x7b\xa6\x48\x7f\x09\x8b\x03\x0b\x12\x84\x28\x20\xc2\x88\x85\x43\x01\xa8\x73\x58\x39\xd2\x08\x40\x2a\x68\xab\xe7\x2d\x64\xba\x10\x67\x0d\x49\x43\x4c\x98\xb4\xb0\xe2\x69\xe0\x35\x73\xbe\xdb\x75\xba\xc1\xaa\x5f\x61\x5e\x5a\x3e\xe1\x88\xa4\xb9\xcf\xe1\x60\xfa\x39\x2f\x5b\x04\x83\x0f\x43\xda\x8b\x82\x06\x43\xf9\x8d\xea\x95\xd8\x0c\x6b\x3c\x38\x3a\x3b\xb4\xdf\x01\x05\xe7\xf1\x4d\x74\x52\x5c\x5b\xeb\x71\xce\x23\x40\xaa\xe2\xbc\xeb\xe0\x54\xee\xd5\xd6\xfa\x30\x70\x54\x2c\xd0\xa2\xbd\xee\xba\xd0\x53\x27\xef\x54\x2b\xbc\xc5\xfd\xd6\xea\x5e\x35\x01\xf1\xa2\xea\x07\x53\xd3\x62\xbf\x1e\x0c\x2e\x78\x4e\x2b\x57\x16\x40\x6d\x07\xe7\xc5\x46\xde\xa9\x30\xf0\x81\x35\xf0\x76\xb6\x9d\xd0\xa5\x7e\x30\xb0\x85\x17\x55\x6b\xb7\x12\x8e\xf9\x17\xf0\x83\xbe\x73\xfc\xda\x09\xb9\x5a\xa9\xc6\x3b\x71\x73\xf3\x5a\x34\x9d\x35\x4a\x7c\xbc\xbe\x74\x61\x1b\x6c\xea\x9d\xed\x81\x25\xb8\x79\x2d\xae\x6c\xef\x63\x5a\x36\xd0\x01\xc2\x0c\xdb\xa5\xea\xc5\x7e\xa3\x9b\x0d\x0e\x7b\x28\x11\x56\xb1\xea\x85\x76\x62\x70\xda\xac\x4f\x45\xa7\x42\x0f\xb4\xc7\x05\x10\xfa\xc0\xab\x2e\x80\xaf\x94\xf4\x43\xaf\xe0\xd0\xaf\x97\x83\xee\xbc\x36\x75\xa8\x90\xf0\x00\x59\x10\xbf\x60\x06\x94\xb8\x81\x8c\x23\xf0\xf5\xce\xee\x90\x79\x81\x5d\xb5\xcc\xca\x11\xc2\xb0\xe5\xc3\x04\xda\x9d\xc2\xf5\xee\xa8\x49\x61\xc1\x0d\xda\x6d\xc4\xaa\xb7\x5b\xe1\x0e\xce\xab\x2d\x14\x6c\xa5\xda\x5a\xb3\xa8\x36\xde\xef\x78\x6c\x5e\x7f\xf8\x70\x85\x83\x13\x53\xef\x1b\x1d\x99\xad\x5d\x58\x25\x5d\x60\xa3\x8c\x08\x68\xc3\x32\x1e\xfa\x6e\xb4\xc2\x3f\x5e\x5f\x72\xce\x91\x99\x0b\x4d\x78\x1a\xfe\xdc\xa4\x09\x84\x95\xe0\xec\x56\xed\x61\xbd\x6b\x23\x80\xd9\x59\x54\x9d\x5d\xd7\xbd\xb5\x9e\x97\xfb\xa5\x5d\xe3\x12\x2f\x32\x52\x4d\x2f\x78\xd1\x86\xc1\xd9\xf7\x81\xd5\xeb\xec\x1a\x08\x5e\x18\xaf\x45\xa5\x0c\x90\x96\xc6\x1a\x67\x3b\xc5\x94\xf3\x57\x48\x15\x17\x98\x8a\x44\x74\x06\x32\xce\xd2\x9b\x40\x59\x5a\x0d\x3d\xf6\x16\xe9\x69\x00\x38\x15\xb2\x73\x56\xec\x7a\x6d\x7c\xa8\x18\xe6\x88\x30\x2c\xaa\xca\xee\x42\x89\x8c\x86\xbc\xa7\x84\x44\x38\xa0\xdf\x31\x1f\x58\x3d\x58\x39\xba\xc9\x0e\x27\xb7\xf5\xbb\x9a\x4e\xa2\x9b\xb7\x1f\xae\xf0\x38\x82\x54\x58\x04\x67\xe2\x65\x6f\xb7\x29\x21\x8d\xcf\xdb\x80\x0f\x60\x64\xdb\xf6\xca\xb9\x53\x71\xfd\xf2\x42\xfc\xfb\x1f\x7e\xfa\x69\x21\xde\xf8\x40\xf6\x02\x25\xf8\x6b\xd8\xc1\x92\x66\x21\x81\xda\x5e\xf8\x8d\x12\x8f\x02\x19\x7b\x24\x9e\x41\xee\xff\xa1\xbe\xc8\xed\xae\x53\x8b\xc6\x6e\x9f\x87\x55\xba\x95\x7e\x51\x85\x1c\xd5\x33\xd1\xb8\x51\xa6\x55\x3d\x31\xae\x94\x95\x91\x5e\xca\xce\xd8\x58\xe4\xd6\xc3\xd8\xaf\x74\xbf\x4d\x13\xc4\x7c\x7c\x98\xa9\x90\xc3\x5c\xa0\xee\x6a\x63\xbd\x5e\x1d\x12\x28\xf4\xf4\x5d\x48\xa4\xa5\x59\xd1\x4e\xa3\xe3\x2a\x8e\x31\xee\x4b\x58\x81\xef\xfd\x46\xf5\x3c\xdc\x2e\x8d\xb7\x5d\xad\x02\xd3\x32\x5a\x2d\xef\x31\x15\x57\x4b\x0e\x12\x97\xc9\x0b\x22\x18\x17\x2f\xde\x09\x75\xa7\x4c\x58\xd8\xbb\xde\xb6\x43\x03\x2b\x87\x57\x4c\x27\x7a\xe5\xec\xd0\x37\x8a\x16\x6a\x24\xc8\xa1\x69\x81\xea\x37\xb2\xeb\x0e\x8b\x8a\x0f\xc6\x75\x2f\xef\xa4\x97\x7d\x56\xc5\x2b\x4e\xa2\xd6\x4f\x60\x27\x8d\x8a\x25\x42\xcf\x9b\xc1\xf9\x40\x3d\xa0\x15\x0e\x1b\x85\xd9\x4e\xc8\x5e\x89\x61\xd7\x59\xd9\xaa\x56\x2c\x0f\x40\xe3\x5d\x58\x0b\xad\x5a\xc9\xa1\xf3\x8b\x6a\xa5\xda\x40\x94\x54\x5b\x53\x5d\x9d\xb5\xb7\x50\x19\x0d\xd5\x4b\x06\x10\xe7\x84\xf4\x12\x20\x8e\x95\x8c\x8d\xa5\xf2\x11\x2c\x36\x8a\x6a\xf0\x16\x58\x94\x94\x6f\x77\xca\x50\x37\x98\x31\x11\x81\xef\x68\x85\x35\xa2\xd3\x4b\xea\x74\x1a\xcb\x11\x93\xc1\xa3\x73\x13\xa4\xd9\x3c\x6f\xb6\xc0\x64\x50\x61\xc1\xbb\x71\xd9\x53\x61\x4d\x77\x20\x66\x24\x6c\x31\x14\x20\x99\x2f\x71\x89\x2c\x45\x71\x8d\x29\x12\x49\x6d\x65\x7e\xac\xf6\x1a\xd9\x5e\x71\x27\x3b\xdd\x06\x8c\x8c\x20\x9c\x16\xf3\x6d\x59\x54\xc4\x2b\xd7\x24\x57\xd7\x77\x1a\xe4\xd8\xb8\xc5\x10\x25\xc9\xda\x61\x84\xff\x14\x00\x82\x80\xec\x66\xcb\xc6\xd6\xbc\x0f\x9d\x74\x51\x8e\xc5\x75\x12\xba\x0b\x35\x04\xfe\xdd\x9d\x8a\x3b\x0d\x6c\x00\x2d\x72\x18\x97\x65\xe0\x31\x3b\x15\xaa\x72\x4a\x01\x06\xa1\xcd\xd3\x61\x87\x65\x16\x24\xc4\x91\x5c\xc5\x7c\x7f\x60\x07\x5b\x6b\x1e\x7b\x61\x14\xb2\x2d\x3c\xaa\x23\xb6\x4f\xf4\x7a\xbd\xf1\xc2\xd8\xfd\x82\xb8\xdf\xde\x79\x1c\x1d\x90\x2d\x14\xb5\xd4\x43\x23\x78\xef\xc9\xc1\xdb\x40\x5f\x60\xeb\x89\x75\x2f\x0d\x2c\x3f\x46\xac\x5c\x6c\x57\x64\x08\x21\x6f\x22\x43\x22\xd0\x58\x98\x9f\xf0\x9f\x91\xfa\x11\xd1\xcb\xf3\x88\xda\x25\x18\x2c\xcd\x0a\x01\xac\x18\xa9\x2b\x09\x80\xf5\xda\x82\x00\xca\x02\x5f\xe0\xb0\x2a\xaf\x9c\xaf\xd7\xda\xd7\xab\x40\x82\x03\xe2\x97\x01\x41\x60\xf8\x94\xf3\xe2\xf1\x5a\xfb\xc7\xa2\xb1\xdb\xad\x34\xed\xcf\xe2\xe4\x8e\x64\x87\x3f\x04\xda\x1a\xf6\xa7\xee\x60\x84\x48\xac\xed\x15\x8a\x08\x77\xaa\x77\x61\xef\xb4\x56\x39\x11\x78\x66\x37\xec\x80\xdb\x88\x72\x17\x89\x87\xad\xdd\x9b\x40\x45\x60\xc8\xed\x6a\xa5\x1b\x2d\x3b\xb1\xd4\x46\xf6\x87\x88\x05\xce\xa6\x13\x77\x2a\xde\xbd\xff\x00\x80\x6b\x1b\x98\xa1\x96\x01\x16\x95\x36\xb0\xda\x83\x8c\x41\x2b\x22\x17\xb0\x38\x49\x63\x5b\x1a\xdb\x07\x86\x00\x7a\xc3\x05\x8f\xb0\xcf\x81\x9b\x40\xe9\x44\x07\x01\x17\x60\xa1\x5c\xe4\x74\xc3\x30\x6c\xa5\x6f\x36\xc4\x07\xe3\x12\x72\x61\x09\x86\x96\x36\x43\xdf\x2b\x83\x2b\xeb\x67\x71\xe2\xc4\x93\xe7\xe2\x24\x3b\xac\xeb\xad\x76\x81\xb5\x8c\x7c\x2a\x9f\xdc\x02\x12\x28\xb7\x38\x9d\x53\x6f\xf3\xc3\x1d\x0a\x86\x13\x5e\xac\xb4\xea\xda\x71\x7b\x03\x1b\x8f\x47\xe7\x7a\x3a\xd3\x21\x53\x60\xe6\x80\x04\xa1\x18\x9b\x62\xa7\xc5\xa5\xc5\x1b\x29\x1b\xdc\xbc\x42\x5e\x73\x6e\x40\x76\xff\x4c\xfc\x59\x75\x8d\xdd\xaa\xef\xc4\x9f\xd5\xe3\x5e\x89\x75\x07\xb3\x2e\x3d\x09\xf8\xd6\x29\x58\x91\xa7\x28\x25\xac\x06\x03\x87\x90\x97\xb7\x0a\x74\x02\xa9\xdb\x73\xfc\xdf\xd1\x89\xaa\x3e\x6d\xec\x56\x7d\xae\x06\x94\xae\x6c\xd7\x46\xf9\x1c\xb6\x9f\xed\x91\xa1\x89\xc2\x7a\x82\x89\x3b\xcb\xed\xb5\x6f\x36\x75\xd4\x53\x86\x81\xf4\xea\x0b\xcc\x17\x64\x25\xb5\x65\xd8\x96\x21\xab\xda\x1e\x60\x4d\x85\x8e\xbf\x3d\xa4\x25\xa5\x95\xab\xdc\xc6\xee\x41\x0d\x18\x21\x6e\x36\x76\x0f\x0a\xc0\x42\x06\x5b\x2c\x16\x55\x63\xbb\x4e\x2e\x6d\x98\x95\xbb\x04\x7f\x91\xa7\x96\xc8\xb7\x87\xda\xf6\x6b\xaa\xb6\x54\x7b\x6d\x0f\xa4\x69\xa3\x5c\xd4\xb4\xb9\x0a\xe8\x35\x29\x64\x81\xac\x9f\xb8\x8a\x14\x4c\x0b\x6d\x6a\xd0\x5f\x71\xcd\x6f\x0c\x4a\x47\x79\x3b\xab\xea\x13\x29\x6b\x3f\x57\x0c\x57\xb4\x09\x49\x29\x0e\xba\x2b\x74\x8a\x6e\xa4\x54\x74\x95\x53\xb2\x87\xcd\x74\x03\x3f\xaa\xea\x93\x1c\xfc\xe6\x73\xa6\x5e\xad\x79\xe5\xb1\x9a\x15\x54\x80\x44\x62\x13\x9f\xb8\x51\xbb\xc0\x52\x6e\x1d\x2c\xd9\xae\x57\xb2\x3d\x90\x00\x1a\x17\xef\x1f\xf1\x44\xd3\x26\x1c\x04\xdf\x55\xce\x06\xea\x53\x7f\x23\x8a\x5f\xb4\x69\xb1\x7c\xc9\x0d\xa0\xde\x77\xbb\x83\x65\x62\xfb\xfe\x70\x5a\xaa\x26\x36\xd2\x89\xa5\x52\x86\x45\xc8\x76\xc1\x8a\x9f\xb0\xbc\x64\x83\x04\x04\x34\xd3\xb0\x03\xb1\xa4\x9d\xb0\x29\xa1\x85\x48\xf3\xa9\x16\x3c\x02\x1c\x73\xac\x81\x55\xfb\xe6\x2a\xc2\xa0\xd7\xc4\x32\x9d\x89\xf3\xc1\x6f\x94\xf1\x2c\xcf\xdd\x40\x7a\x05\x2c\x28\xec\xbf\x46\x76\x55\xaf\xb6\x2a\x48\x89\xf5\x16\x75\xcd\xf8\x25\xde\xaa\x6a\x65\xfb\x35\xec\x56\xdc\x4e\x67\xe2\x25\x24\xa4\xfd\x15\x00\x94\xcf\x0f\x37\x82\xe0\x94\x3f\xb2\x26\xbf\x36\x76\x0f\x3a\xdf\x70\xec\x8e\xa7\x71\xd8\xc1\x79\xce\x87\x25\x32\x63\x20\x07\x38\x65\x7c\x9a\x8c\x73\x61\xd4\x5e\xe4\x50\x34\x64\x71\x46\x02\x7c\x20\x8c\xcf\x96\xcf\x4f\xdc\xb3\xa7\xcb\xe7\xf1\xbc\x6a\x36\xaa\xb9\xc5\x2d\xa0\xcd\xd2\x7e\x01\x05\x13\x71\x0c\x26\x90\x84\x93\x56\x6c\xec\xd0\x93\x90\x17\x84\x20\xaf\x20\xb7\x98\xfb\x5d\x6f\x89\x5b\x68\x60\x63\xc3\x1e\x4b\xeb\x1a\xd4\xc0\x61\x65\xc3\xa1\xca\x4b\x7b\xd7\xdb\x8d\x5e\x6a\x1f\x08\x20\xe8\x44\x2e\xe1\xff\x15\x25\xab\x76\x04\x91\x31\x45\x7d\x24\xd7\xda\x89\x5d\x2c\x80\xe7\x4a\x67\xd7\x6b\x54\xaa\x3e\xb0\x3c\x02\x9b\x08\x43\xd9\xe9\xad\xf6\x93\xd5\x1d\xe8\xb8\xa4\x5d\x42\x8a\x6b\x9e\x26\xe8\x4e\x1a\xe8\x5e\x35\xca\xf8\xee\x10\xeb\xdb\x4b\xed\xc5\x1f\xc4\x56\x9b\xc1\x07\xa1\x7c\xa3\x8c\xf0\xfd\x41\xc8\xb5\x0c\xd5\x6e\xa4\xab\x07\x43\x33\xa6\x5a\x5e\xef\xaf\x35\x70\x05\xa1\x5e\xde\x95\x19\x54\x29\xa8\x8a\xef\xe3\x64\xfe\xb0\x20\x15\x36\x94\x0a\x27\x75\x68\x8f\x0e\x52\x95\x9c\x5b\x16\xb6\x8f\xdc\x24\x01\x0a\x09\x4b\xc8\x1a\x95\x16\x46\xa7\x9b\x5b\x18\xaf\xe5\xe0\xbd\x0d\x12\x73\x17\x16\x23\x8c\x58\x6c\xf1\x05\x40\x81\x3e\x03\xb0\x85\x3c\x5c\x4d\xe3\x31\xaa\xa0\x58\x80\xf0\xf3\x85\xbf\xef\xd5\x0f\xa9\x78\xdc\x3b\x50\x82\x50\x60\xe9\x6c\x5b\x5d\x43\x26\xde\x4e\xf0\xe6\xe3\x53\xb5\x21\x7d\x71\x9c\xcb\xbe\x1c\x0b\xc8\x0f\x3b\x44\x7d\xd9\xe9\x3e\xc8\x4e\x3d\x70\x53\x50\x7a\x31\xaa\x2b\x29\x17\xa6\x3d\xf6\x65\x8b\xd3\xc1\xeb\xad\xad\xdd\x06\xf9\x20\x6e\x9e\xe8\x94\x59\xfb\x0d\xaa\x0f\x03\x07\xee\x45\x18\x6f\x2f\xfe\x27\xe8\xbd\x65\xe3\x55\xef\x16\x95\xb1\xa6\x06\x72\x94\x6d\xa2\x77\xd6\x3c\x41\x12\xc5\x22\x15\x2b\x70\xe9\x36\x81\x2b\x0e\xeb\xad\xb7\xc3\x7a\x43\x3a\xc7\x0a\x77\x8f\xdf\xdb\x7a\x25\x1b\x0f\x37\x53\x1f\xf6\xf6\x09\x7d\x94\xc4\x70\x02\x0c\x63\x40\x83\x39\xa2\x9b\x57\x94\x33\x2d\xa3\x4c\x20\xe3\xbd\x6a\xec\x9d\xea\x0f\x3c\x17\xbf\x86\x54\x21\x85\x4f\x95\x33\x88\x98\xc7\x13\xb3\x8b\x16\x5f\x53\xea\x71\x78\xae\x91\x21\xc5\xc5\x3d\xcd\xcc\x3a\x38\xd3\xc2\xdd\xd1\x4e\x26\x5e\xfb\x48\xa5\xf0\xcd\x14\x64\x70\xb8\xc6\xa8\xd4\xa2\xaa\x3e\x85\x45\xfd\xb9\xa2\x9d\xa2\xb2\xa9\x26\x2a\xc2\x39\xbc\xa3\x90\x6c\x46\x78\x16\x8d\xfe\xa4\x7a\xbd\x3a\x20\x50\x41\x23\x8e\x6d\x98\x72\xbd\xc6\x53\x37\xb1\xb6\xd7\x39\x6d\xa7\xe4\xd5\xd0\x9d\x8a\x3d\xf2\xbc\xa9\x4c\xd4\x48\x11\x37\x2c\x02\xa5\x80\xfb\xee\xea\xd3\xd6\xb6\xb2\xfb\x5c\x1d\xe0\x5e\xef\x2f\xca\x55\x06\xee\x52\x6d\xb5\xb5\x2d\x16\x7a\x0b\x3f\xaa\xea\xd3\xca\xf6\xdb\xcf\x55\xe0\xa7\xde\x8d\x64\xc8\xc0\x78\x51\x5a\x26\xc7\x40\xd6\xaf\xf9\x5d\x71\xec\xf3\xd5\x8c\xb8\x79\xad\xd2\x95\x31\xfc\x8a\x9d\xbf\xb9\x79\xfd\x81\x75\x64\x37\xaf\xc5\xad\x22\xdc\xaf\xbd\xdf\xb9\x8f\xa0\xf9\x45\x35\xee\xc7\xeb\xcb\xea\x4a\x1e\x82\x6c\x87\xc9\xf4\x01\x19\x1f\x94\xdc\x52\x23\xc3\x4f\x44\x11\x36\x0b\x25\x86\x9f\xb6\xcf\xef\x3c\x2a\x10\x3a\x7e\x2d\x84\x5b\x24\x72\xd5\x3b\xb5\xff\xa5\x97\xa6\xe1\xc2\x81\x1b\x5c\x42\x02\x96\xbc\xb0\xdb\xad\xf6\x37\xc3\x76\x2b\x61\x63\xe0\xb7\x70\x98\x40\xd9\x6f\x95\x73\x78\xa1\x4f\xd9\x5b\x4c\xa0\xec\x8b\x8d\xd5\x4d\x96\xdb\xc0\x77\xf5\xa1\x57\x8a\x6a\x7d\xc9\xd7\x67\x15\x48\x00\xc8\x9e\xe2\xaf\x2a\x6a\x48\x14\xdd\x73\xff\x36\xb9\x4a\xfa\xad\x92\xdd\x6e\x23\x41\xc6\xc8\xc0\x22\xd9\x0b\x99\x66\xd8\xaa\x5e\x37\xa0\x65\x93\x6e\xf3\xfd\x93\xfa\x87\x9c\x08\x16\x28\x5a\xeb\xbf\x05\x4d\xf8\x8d\x84\xf1\x28\x36\xd7\x3d\xdc\xb4\x53\xc0\x28\x02\xca\x53\x40\x68\x7b\x01\xe5\x4a\xcc\x4e\xff\xce\x63\x01\xa8\xc2\x77\xc4\x77\x12\x20\x40\xe0\x4c\x50\xb1\x3e\xe0\x4b\x82\xf0\xc9\xc7\xc0\x89\x2b\x51\x6f\xe5\x97\x87\x0a\x6e\xed\x4c\x39\x54\xb1\xa7\x42\xa4\x2a\x90\x78\xbc\x95\x64\x62\xf1\x5b\x35\xf4\xf7\x00\x7f\xbc\xbe\x5c\xfc\x56\x69\xd3\x74\x43\x7b\xb4\x21\x6e\x58\x3a\xdf\x07\xb6\xeb\xf1\x89\x7b\x1c\x50\x9a\x5b\x63\xf7\x26\xc2\x7f\xc4\x6f\x01\xdf\x3f\xb3\xd1\x46\xad\x0d\xa9\x2f\x92\xf9\x86\x68\x75\x1b\xb8\x18\x50\x43\x2c\xd2\x79\x9a\xab\x26\xe2\x2e\x07\xc5\x2e\xa9\x8e\x22\xa1\x0b\x22\x02\x68\x69\xe4\x56\x2d\x92\xa1\x49\x1d\x98\xe1\x3a\x48\xe0\x26\x17\x99\x03\x13\xc0\x54\x1a\xd8\x65\x80\x58\xe0\x0d\xe3\xb4\xdc\x88\x0c\x1d\x2d\x6e\xfb\xf5\x4c\xe9\xf7\xd3\xdb\xcf\x23\xe5\xbd\x92\xdb\x19\x04\x91\xc0\x1c\x2d\x88\x73\x0f\x85\xe0\xd0\x19\x51\xc8\x69\xb9\x00\xb5\x48\xa3\x14\x07\x3c\x9f\x9b\x5c\xc1\x10\xc7\xb9\x54\x40\x15\x52\x56\xbd\xd5\x8e\x27\xeb\xc3\x06\x54\x8d\x39\xeb\x10\xb5\xd7\x9d\x6a\x02\x57\xcd\x4b\xce\x81\xcc\x1a\x52\xc0\x36\x80\x15\x97\x8b\x0a\x8e\xea\x1e\x6c\x89\x32\x0d\x17\x69\x1c\xe9\xbc\xdc\xca\x5b\x25\xdc\x10\x58\xb3\x8d\xf4\x24\xa5\x94\x93\x15\xb8\x64\x40\x85\x75\xc6\x96\x4f\xd0\xdb\xbd\x09\xc7\xdb\x43\xf8\x01\xec\x1b\x51\xe7\x0a\xd1\x29\x62\x42\x1e\x81\x8e\xa1\x8d\xda\x3a\xf5\x45\xc3\x25\xd9\x2b\x7d\xa7\x48\x5f\x17\xd5\x94\x90\xb7\xa8\x3a\xe9\x7c\x1d\xd6\x23\x36\x17\xc4\x59\x7b\x17\x36\x6b\xa8\x2f\xe4\x8a\x3e\xac\x1a\x30\x7e\x01\x0c\xa8\xa0\x33\xd4\xbf\xb0\x14\xe3\x14\x75\x9d\xdd\xab\xf6\x54\x84\x55\x64\xca\xdb\x7c\xa0\x08\xb2\xdb\xcb\x83\x23\x09\x86\xe9\x9a\x35\x34\x56\x8b\x2a\xa9\xfb\xdc\xa6\x0e\x07\x6e\x64\xd2\xef\x02\x23\xc3\x2b\xc4\xae\xd2\xbd\x75\x80\x42\x2d\xdf\xcf\xe2\xc4\x55\x03\x5e\x14\x00\xf8\x21\x43\x03\x56\x32\x74\x12\xdd\x65\x4c\x11\xa1\x38\x0d\xa2\x8c\xd0\xfe\xb1\x0b\xeb\x6c\xd8\xa2\x08\xb4\xa4\x9b\x85\x28\xbb\xb5\x76\x58\x76\xea\x09\x4a\xc6\x9a\x57\x75\x54\x32\x8e\x78\xe0\xd8\xac\xbb\xaa\x72\x5e\x77\x5d\x18\x63\xb6\x1b\x2b\x24\x55\xc8\x85\xcd\x07\x03\xe1\x36\x7a\x27\x2c\xdc\xca\xe5\x83\x94\x16\x6c\x26\x08\x7a\x2b\x5a\x05\x92\xb7\xed\x85\xef\xa5\x71\x2b\x05\xd7\x94\x5b\x54\xf4\x2f\xa8\xea\x20\x57\xa2\x9d\xd8\x91\x9a\x51\x89\x01\x55\xe7\xa7\x0e\xcc\x4e\x36\x91\x65\xd5\x68\x24\x00\x77\x61\xd0\x06\x18\xd3\x84\xc9\x71\x1b\xc2\x02\x9b\x0c\x01\x5c\x8b\x17\x8b\x64\x76\x1c\x56\x85\x06\x0e\xeb\x87\xd5\xf4\x40\xbf\x2b\xb4\xc3\xaa\x91\x41\x2a\xf6\xc3\x07\xc8\x61\xd6\x69\xbc\x25\xaa\x4f\x61\x9d\x7f\xae\x50\x76\xaa\xe3\x5d\xe3\x05\xca\x52\xc8\x71\x43\x62\xf5\x57\xab\x4d\x0d\x17\x67\xff\x61\xb5\x81\x5b\xb6\xaa\xb0\x2d\x19\xa9\x07\xc9\x02\xee\x00\x46\x2f\xcb\x4e\x37\x6c\x06\x77\xa8\x56\x16\x76\x0f\x68\x0f\x5f\xf2\xef\xca\x79\x19\x08\x04\x59\x46\x84\x5f\x85\x3a\x12\x0b\xa1\xae\xfa\x25\xff\xa6\xd4\x98\x54\x0d\x26\xa6\x7c\xa4\x9f\x55\x15\xf8\xea\x05\x10\xf5\x20\x0a\xc0\x45\x6b\x46\xca\xc3\x49\x1d\xb6\x35\xe7\x2d\x32\xf8\x9d\xf4\x5e\xf5\x06\xaf\x45\x70\xcb\xe7\x45\x29\x3b\xa2\xc8\x28\x43\x18\x5b\x36\x0f\xfc\x5c\x25\x23\x42\xb6\x1f\x9c\xbb\x0f\x8a\xc3\x8f\x57\xa7\x15\xed\x69\x47\x6c\xf9\x7f\xaa\x83\xab\x9c\x6a\x86\x1e\x87\xf5\x86\x7e\xce\xab\x67\x49\x5f\x3c\xb2\x91\x4c\xf6\x1b\xae\x34\xe7\x70\x15\xad\xb1\x33\xf1\x02\x7f\xb0\x82\xaa\xda\xc1\xf4\x65\x86\x90\x34\x9f\xb1\x2b\x64\x07\x9b\x2b\xa6\x4a\x2d\x8d\x76\x02\x91\x00\xa3\xc2\xf7\x6e\x70\x2c\xaf\x6c\x2f\xa4\x39\xa4\x1b\x3c\xd5\xc1\xc1\x67\xb2\xfb\x7c\x77\x0a\xe5\x02\xd8\x5e\x2d\xf9\x92\x37\x59\xc7\x6c\x65\xab\xc4\x9d\x96\x51\xb1\x95\xb1\x4b\xf1\x3c\x67\x65\x69\xa1\x43\x00\x31\x08\x15\xd9\xcc\x2d\xf1\x34\x7b\xcb\x1a\x05\xbf\x51\x1a\xef\x58\x0d\x70\x52\xab\xa1\xeb\xf8\x4c\x7c\x39\x74\x1d\xda\x7a\x4d\xed\x8d\x43\x15\x74\xd7\x7c\x49\x3f\xab\x61\xd7\x06\xa1\x35\x8d\xe5\x47\x48\x88\x63\x59\xe6\x67\xc2\x28\x8c\x2a\x17\x8b\x2a\x4d\x04\x6f\x33\xe9\xb4\x3b\x2c\x78\x37\xcf\x58\x16\xd3\xc6\x6e\xc7\x20\x49\xeb\x07\x94\x8a\x3a\x0e\x13\x85\xc6\x3c\x30\xb4\x7b\x79\x10\x1b\xbb\x17\x9d\x36\xb7\x8e\x66\x2a\x8c\x53\x2e\x98\x83\xa2\xd6\x6b\x33\x28\x12\x95\xc2\xcf\xa9\x1d\x2b\x5d\xfe\x93\x29\xc0\xf2\xc0\xda\x30\x34\x16\xa0\x0d\x20\x96\x07\x01\xd2\xe0\x71\xab\x83\xb1\xb9\x01\x5b\x1b\xf0\x2d\x3a\x18\x3b\x24\xba\xf6\xd1\x29\x71\x81\x06\x10\xb4\xc7\x9a\x8d\xb5\x8e\x6e\x20\x12\xf5\x0b\x69\xa0\x0c\x24\xe2\x47\xd3\x92\xf0\xe0\xac\x9d\xb3\x21\x06\xec\x73\xda\x41\x35\xdd\x0e\x26\x68\xda\x50\x17\x74\x6b\x78\xce\x38\xd1\xd0\x82\xfb\x04\x34\xa6\xd6\x5b\x14\x58\x3f\xb2\x19\x06\x4c\x78\x94\x45\x20\x7b\x51\xb6\x67\xbc\x4a\xa8\x5e\xbe\xc2\x7b\x60\xb1\xf0\x52\xc8\x2f\xa1\x71\xfa\x23\x5d\xb2\x5d\xc1\xae\x71\x3f\x62\x7e\x18\xbc\x2c\xff\x1d\xd8\x10\x44\xbd\x4a\xd8\x63\xf5\x08\x84\x54\x11\x05\xe4\x2c\xc3\xcd\x75\x1d\x65\xb6\x47\xad\x9f\xec\x18\x2e\xb7\x97\xae\xe8\x38\xad\x71\x12\x9d\x24\xdc\x15\x15\x44\x29\xd3\x9f\xa7\xa6\x51\x6d\xff\x2a\x2d\x61\x7c\x8b\x0a\xc5\x14\x17\xa5\x93\x73\xa4\x98\xca\xb1\xc1\x7b\xcc\x27\x9b\xf7\x82\xb0\x2a\xb6\x22\xcb\x49\xef\xae\xd7\xa0\x13\x29\x49\xf0\x84\xe8\x16\x04\x16\x46\xc1\x82\x4d\x54\xa2\xab\x8b\x8a\x51\x85\x63\x0b\x7e\x71\x4a\xd4\xba\xdd\x28\x30\x0c\xa6\x64\xde\x01\x9c\x8b\x0b\x3f\xb6\xb1\x53\x44\x0e\xb1\xaf\x2f\x28\x61\x94\xcf\x9d\xc1\x6c\xe0\xce\xb5\x9b\xeb\x4d\x1f\xd8\x77\x15\x4f\x0c\x6d\xd0\x24\x2d\xda\x16\x14\x64\x49\xbc\x00\x3a\x25\xf6\x12\x2f\x81\x98\x4a\xfd\x71\x5c\x7b\x5a\x40\xbf\x96\xd7\x47\xd8\xb7\x72\xfb\x7c\x57\xc9\xb6\x85\xc5\x9d\x2c\x34\x5a\x20\x1c\xa5\x0a\x32\x40\xe5\x10\x68\xc1\x11\x53\xeb\xe2\x72\xcb\xa1\x9e\xe9\xeb\x2f\xb4\x02\xfb\xf1\xdf\x70\x97\x55\x54\x95\xee\xb2\x62\x23\x47\x5b\x6b\xd2\xcb\xe9\x1e\x93\x6d\x0b\x9c\x10\xad\xe5\x8c\x9f\xa1\xd5\x1c\xd9\x9a\x50\x0b\x8a\x2f\x61\x78\xfe\x53\x1d\x80\xf9\xa1\x95\x00\x67\x92\x76\x42\x82\x51\x2a\x58\xb2\xa3\x2c\xe3\x26\xa2\x72\x39\xe7\xe7\x70\xe9\xe4\x14\xc1\x02\x63\x28\xcd\x21\x30\xfa\x60\xfa\x8b\x4c\xb4\xb7\x62\x2d\xa3\xad\x4f\x3c\xd0\x4a\x56\x5c\xc3\x25\xdb\x46\xaf\x37\xdd\x41\xe8\xed\xce\xf6\x1e\x56\x12\x9b\x3a\x24\xe1\x35\x7c\xf5\xaa\xb1\x6b\xa3\x7f\x87\x81\xdd\xa2\xcd\x72\xbc\x3c\x79\xe6\x7c\x6f\xcd\xfa\xf9\x0b\x30\x69\xba\x0d\x84\x67\x63\xf7\x7f\x7c\xf6\x94\xd2\xc5\x05\x4c\xa1\x1d\xbc\x78\xa5\xfd\xeb\x61\xf9\xd8\x89\xf5\xa0\x5b\x38\x6b\x9f\xc9\xcc\xc9\x82\xcc\xa0\xd0\xa0\x7c\x6f\xe2\xb0\x80\xcb\x85\xed\x85\xb3\xdd\x9d\x1a\x15\xb1\xdb\x2d\x4e\xef\xb2\x53\x5b\x84\x84\xf6\x83\xe5\x94\x32\x30\x72\xaa\xa7\xf1\xb9\xb9\x79\xbd\x88\x4b\x3c\xcd\x0f\x4d\x1b\x33\xa8\x85\x96\x85\x98\xc3\x00\xdc\x90\xce\x34\x9d\x40\xa0\x62\xe1\x52\xc0\x78\x4c\x4b\xc1\x3c\xba\xc0\xac\x4c\xf4\x3b\x20\xb5\x04\x14\x5c\x5c\x9c\x85\x76\x20\x03\x16\xd2\x9a\x89\x96\x96\x16\x56\xb6\x78\xc3\xa1\xc3\xe2\x34\x30\xee\xb1\x79\xb0\x5c\x47\xfb\x9b\x28\x1a\xf6\x9d\xe8\x19\x77\x20\xa3\x68\x34\x22\x89\xa6\x8d\x61\x0a\xaa\xa6\x90\xa6\x71\x2b\x72\x6a\x86\x36\xa2\x48\xd1\x70\x41\x2a\x07\xf4\xfa\x2b\xa9\xd9\xa4\xde\xd4\x71\xae\xee\x2b\x28\x1a\xf4\xe9\x1c\x86\xc3\x1a\x54\x9c\xd0\x44\x5d\x4a\xb4\xa8\x83\x0c\x63\xeb\x4c\xcc\x7b\x67\xe9\x0a\x58\x70\x22\xcc\x89\xf3\x81\x55\xc9\xb7\x72\x68\x04\x58\xdf\xa3\xf5\x20\x68\x5e\xfe\x37\xd1\xca\x83\xab\xbc\xbd\x55\x66\xa6\x08\xa4\x1f\x2b\x54\x7d\xe5\xa5\x5e\x76\x6b\x15\x6a\x18\x1c\xca\x9a\x7e\x70\x3f\xe7\x79\xe8\x14\x57\x80\xdb\xd5\x2a\xa4\xad\x56\x55\x71\x6f\x46\x46\x72\x68\x4f\x99\x67\xb1\xff\x40\x34\x17\xcd\x33\xc1\x32\xa7\xb8\x2e\x73\x6c\xa3\x03\xc6\xf1\xb2\xdc\xb3\x61\xd7\x12\x41\xca\x6e\xd4\x70\xe7\x06\xaa\x25\x9c\x5c\x29\xb1\xeb\x64\xa3\x16\xec\x39\x03\xa6\xb2\x40\xdc\xc2\xe1\xcc\x37\x7b\x1a\xef\xc7\x3b\xeb\xd4\x98\xd8\x8d\x14\x93\x99\x9c\xb8\xc8\x9b\xbe\xf1\x7e\x87\x86\x1c\xb9\x71\x7f\x62\x19\xc8\x5c\x00\xd8\x1f\xd1\x59\xb3\x56\x7d\x34\xf8\x0c\x4d\xda\x75\x92\xcc\x45\x61\xf7\x86\xee\x46\x5e\x28\x5a\x29\xb0\x6d\x67\x0b\x45\xd2\x48\x7c\xfa\xf1\xb3\x3b\xf9\xf4\xd3\x67\xf7\xe8\xf9\x95\xea\x1d\x58\xd3\x9f\x63\x37\x3e\x84\xe5\x01\x23\x22\x1d\xdd\x72\xf7\xaa\x0d\x1d\x92\xdd\xa9\x50\x8b\xf5\x42\x3c\x0b\x43\xf0\xfc\xe4\xd3\x1f\x3e\xbb\x67\x4f\xe1\xf7\x62\x3a\x99\xc9\x1c\x1f\xe7\xf6\xeb\xd6\x52\x23\x4d\xfd\xb7\x91\x8b\xd7\x03\xa3\x0a\x06\x7a\x61\xa2\xc2\xc1\x0b\x4c\x7d\xb9\x04\xf9\x56\xd6\xa9\xa6\x57\x1e\xe4\x78\xd4\x7f\xa2\x8c\x0b\xa9\x45\x89\x50\xd1\xf4\x26\xf7\xc3\x46\x19\x2a\xc7\xa9\x45\x29\xd2\x0f\xf2\xed\x69\x35\x73\xaf\x5b\x62\x4b\x8b\x69\xa4\x91\x8d\x46\x03\x91\x11\x89\x96\x1e\xdf\x55\xc5\xdd\x74\xd8\xc1\x5f\x85\x75\x56\x43\x5f\xa2\x37\xc4\xb3\x1a\xf5\xdd\xcc\x64\xf2\xa5\xcb\x74\x32\xe5\x51\xf5\xe5\x14\x4b\x22\xa0\xc7\x11\x80\x05\x85\x41\x99\x60\x4c\xac\x47\xe4\xf5\xd8\x3d\xbd\x8b\x6b\xef\xe8\xa2\x2b\x2f\xf2\xdd\x3d\xa8\x88\x74\x16\x77\xf0\x64\xde\x1f\xe8\x67\xf4\xec\xf3\x2a\x70\x32\xb2\xd7\xdd\xe1\x5b\xc9\x82\xf8\x55\x36\x9b\x92\x26\x01\xe5\x61\x3b\x6f\x3a\x23\x1a\x75\x2a\x9e\x2d\x9f\xd3\xa4\xdd\x2a\xb5\x23\x96\x0c\x9b\x34\x22\x60\xcf\x9e\x2e\xcb\x6d\xd9\x2b\x74\xc6\xf3\x6a\x4a\x31\xaf\x63\xde\xbd\x03\x73\x04\x41\x5c\x1d\x19\x9a\x92\xc2\x1e\x59\x16\xc7\x31\x96\x3c\xc6\x08\x59\x3c\x75\xb9\xf4\xf8\xdc\x9d\x1e\x1f\xc9\x69\x95\x8e\x93\xaf\x22\x47\x5c\x78\xce\x4e\x2c\x6a\x0f\x3b\x75\xa7\x3a\x64\x3c\xda\x40\x4c\xc0\xd0\x62\x15\xe8\x44\x94\x6d\xfd\xb1\xd5\x7e\x0f\xf7\x31\xd3\x8c\xaf\xdd\x3e\xb1\xde\x72\x54\x58\x76\xc0\x85\x59\x23\x1f\x10\xe5\x87\xd9\x73\xc0\x55\x71\x82\x02\xdb\xca\x45\x5e\xf1\x2c\x87\xc9\x01\x40\xe4\x36\xe2\x6e\xc1\xc2\x49\xe9\x9f\x26\x0a\xb8\x7c\x72\x98\x82\x75\xed\x6d\xdc\x29\x1b\x34\x70\x16\xe7\x57\x6f\xdc\xa2\x8a\x15\x32\x52\xd8\x25\xd8\x84\x3d\x6a\xfc\xc1\x0c\xba\xeb\x26\x5b\x8d\xf5\x67\x58\x9c\xb8\x5b\x68\x13\xf2\xb7\xb1\x53\x93\x0e\x61\x67\xca\x7c\x1c\x77\xe5\xb2\x15\x80\xb5\x41\x4b\xc6\x82\x5a\xec\xea\x77\xe2\x6d\xba\x85\x0b\x33\xbb\x3b\x04\xd1\x27\xfa\x55\x9c\xd2\x01\x2b\xf6\x20\xbc\x8c\xfc\x39\xb4\x47\x8a\x2f\x02\xff\xda\x47\xe6\x99\x1b\x4c\xec\x73\x3e\x95\x39\x0f\x3d\x3b\x99\x89\xa3\x9e\x2d\x36\xc7\x56\xef\x18\x4f\xd9\xe7\x87\x98\x6c\xbb\x2a\xe9\xdb\xd1\x45\x9e\xf7\x2a\x5b\xde\x57\xb3\xd5\xc6\x6d\x8f\x55\x8f\x96\xb7\x40\x19\x10\x4d\x65\x81\x49\x42\xc5\x22\xae\x88\x8c\x5d\x90\x4e\xec\x55\xd7\xe5\xab\x03\xaf\x78\x5c\x5c\x24\x23\xb9\xa9\x90\x99\xdc\xa2\x82\x0b\x81\x85\x09\xb2\x2f\x7a\xd4\x44\x25\x15\xdd\x62\xc1\x00\x98\x43\x71\x4d\xe5\x16\x58\x0c\x2e\xbf\x22\x39\xba\xa4\xab\xb0\x2c\x3c\x43\x06\x95\x39\xed\xa0\x23\x69\x79\xae\xe0\xd8\x67\xf7\x46\xe0\x0f\xa0\xe4\xd6\x11\x01\x02\x16\x55\xad\xe8\x66\x39\xab\xe4\x9e\x29\xc1\x2b\x10\x6c\x00\x37\x30\x4f\x1b\x35\x3d\x5d\x2f\x16\x40\x0f\xb4\x7c\x74\x93\x5e\xb6\xf6\x9e\xc6\xe5\x55\x14\x3a\x14\x24\x06\xd0\xd7\x0c\x2f\xc8\xa4\x23\x22\x48\x4b\x2e\xd9\xc6\xd1\x7a\x2f\x2c\x89\x09\x28\x53\xe5\xab\xc4\x9a\x33\xad\x4f\x77\x97\x8c\x6c\xa7\xfa\xad\x34\x60\xb9\x8b\xf7\x2c\xac\x9f\xb8\x38\x7f\xf7\xee\xfd\x87\xa4\x96\x08\xc4\xcf\xb4\xc0\x6b\xb1\xe7\xd2\xa4\x5d\xec\xbf\x14\x77\x6d\x09\x91\x3c\xa8\xa8\xc4\x31\xb8\x5c\xf6\xcb\x8c\x9c\xd7\x16\xb4\x36\x70\x5f\xcd\xd2\x6b\xd1\xfe\xf6\xe8\x0a\xf9\x14\x86\xf8\x73\xc5\x77\xff\xef\xc3\xff\x2a\x37\x9f\xc8\x2c\x5a\x80\xde\x26\xc3\x97\xe4\x5a\x2f\xd6\xd6\xb6\x13\x73\x0a\x10\x4b\x07\xf0\x1e\x6b\xec\x76\x67\x81\xf3\x59\x09\xb0\x7a\x3d\x0d\xbb\xcb\xf6\x40\x25\x41\xa4\x31\xfa\x6f\x03\x28\xa4\xc0\x48\x75\x51\xdd\x69\xa7\x97\xba\x43\x11\xfa\x4f\xf1\x03\xd3\xc3\xaf\x91\x73\x75\x56\xb9\x76\xe2\x99\xdb\x49\x23\x9a\x4e\x3a\x77\xf6\x68\xd0\x22\xf0\xcd\x5e\x7d\xf1\x8f\x9e\x5f\xf5\x60\x1f\xf9\xec\x69\x80\x78\x3e\x41\x57\xaf\x6c\xdf\xe0\x6d\x6b\xb4\x04\x07\x62\x45\xe9\x61\x9b\x1a\xe0\x62\xb2\xad\x8a\x03\xff\x4f\xd4\xb9\xb2\xfd\x6d\xea\xc7\xf7\x74\xc1\x60\x57\x48\xb0\xef\x64\x37\x94\xb7\x4d\xa1\xf6\x50\xc6\xfd\x50\x81\xe7\x78\x2a\x0b\x4e\x02\x10\x33\x28\x64\x68\xb3\xfe\x23\x0c\x9a\xbf\x3f\x1a\xc9\x6b\xd5\xed\x82\x78\xf8\x5d\x05\x2d\xa1\x5b\xf9\x71\xf8\x19\xc8\x63\xb7\xea\x90\x07\xbe\xd5\x90\x3a\x33\x1b\x59\x90\x0a\xd9\xb1\x64\x96\xcd\x66\x20\xa7\xd0\x89\xfc\x26\xfb\x40\x06\x55\xf1\xd8\x72\x4d\xaf\xc1\x35\x1c\xd3\x3b\x09\x17\xdc\x31\xfe\x10\x24\xae\xb5\xd7\x6b\x63\xfb\x6c\x18\x6e\xc0\x64\x48\x2c\x62\x96\xe0\x88\x46\xae\xea\x74\xa3\x8c\x03\x6a\x87\xbf\x38\x65\x52\x5c\x0a\x86\x85\xcb\xc7\x70\x60\xd0\x56\x08\x3f\xe8\x7b\xa6\x14\x01\x72\x95\x95\x1c\xbc\xad\xb5\xd1\x1e\x7c\x89\x74\x90\xba\x51\xf7\x59\xae\x57\x3c\xa1\xd8\xd8\x09\x1d\xa0\x91\xfa\x13\x1e\x72\x07\xa2\xe9\x21\x3f\xa0\x6c\x82\xc8\x0d\x99\xec\x1c\x60\xfc\x20\x41\xa0\xa9\x28\x05\x2f\xaa\x77\xfd\x60\xf0\xae\x7d\x30\xaa\x48\x4c\x82\x11\xf2\x01\xe6\x40\x61\x32\x9e\xf8\x5e\x36\xb7\x81\xb8\xf4\x6a\xa5\x7a\x65\x1a\x70\x58\x90\x3e\x53\x64\xa0\x49\x85\x35\x74\x10\x84\x62\x8c\x5c\x07\x91\xf5\x0e\xfc\x66\xd0\xff\x4a\xbc\xe1\x94\xef\x37\x76\xe8\x7f\x60\x40\x56\x95\x47\x38\xba\xf0\x19\xe5\x73\x3b\x49\xa1\x40\x56\x87\xc2\xa8\x70\x28\xc8\x1e\x3d\xb3\x33\x1d\x87\x63\xff\xd6\xe8\x4d\x48\xf8\x40\x75\xe7\x0e\xa6\x49\xca\xbb\x1b\xf8\xaa\xf6\xd2\x37\x1b\xb4\xc1\xf8\x33\xfd\x04\x13\x8c\xb5\xfc\x1d\x53\x6f\xe2\x07\x6c\x01\x47\x9b\xc2\xa5\x05\x4c\x2b\x37\x8b\xc9\x90\x12\x0b\x63\x96\xc3\x42\xbc\x95\x5f\xf4\x76\xd8\x8a\x7f\xff\xf1\xa7\xcc\x46\x93\x1c\x01\x16\x53\x9c\xe4\x21\x00\xb6\x10\xe4\x8d\x9a\x8a\x91\x49\x47\xaf\x64\xb3\x21\xb7\x15\xbb\xaa\x31\x1a\x0c\xb0\x92\x1f\xa2\x51\x5a\x20\x69\x00\xa7\x5a\xb1\xa5\x36\x44\x40\x28\x1a\x5a\x7a\x52\x1a\x9b\x2c\xe6\x4d\x46\xc6\x36\x8f\xdf\x6e\x39\x32\xc6\x70\xbf\x01\x89\x51\xaa\xad\x83\xa8\xc4\x74\xaf\xb0\xa0\xae\x28\xf8\x16\x47\x2f\x8a\xd1\xb7\x30\x7c\x51\x9e\x7b\xfc\x08\x89\x3e\xd0\x25\x55\x07\x3f\xc8\x65\x37\xa8\x47\xcf\x71\x21\x31\x49\x67\xac\xb4\x45\xdf\x52\xfc\xaf\x6c\x8f\x12\xc4\x02\xe9\x76\x5a\xef\x17\x10\x01\x24\x2d\xf7\x19\xa8\xe2\xd4\x27\x71\x4b\x66\x8a\xc6\xa7\xaf\xde\x7c\x00\x3b\xdc\x7b\x8a\xd7\x78\x37\x53\xb3\x1b\xdb\x5f\x30\xa6\x15\x04\xeb\xc8\xae\x63\x39\x70\x99\xcc\x07\x63\x79\xc0\x00\x0c\x1c\x88\x65\x27\xc3\xd2\xe4\xba\x02\x9f\xa1\x9d\x43\xa1\xc3\x68\x98\xcf\x82\x8f\x4e\xd8\xb1\x0d\x84\xac\x5c\x58\x8c\x2d\xb9\xbd\x36\xb2\x63\x9f\xd7\x37\x98\x48\x05\x43\x22\x5c\x3c\x95\x56\x5b\xec\xa2\x23\xf3\xb8\x3d\x8c\x36\x1a\xe8\xa5\xd5\x90\xdb\xe6\x11\x55\xa0\x33\x8e\x22\xb4\xd9\x55\x85\xc7\x14\xa7\xd3\xa1\x15\xbe\xaa\x20\x01\xd6\x9d\x36\xb7\xc0\xdc\xed\x0e\x29\x21\xe3\x65\x2f\xec\x4e\xab\xf6\xbb\x2c\x8f\x95\x2b\x57\x30\xfb\xff\xef\xff\xfd\xff\x3c\xb9\x08\xed\xbe\xf0\x7d\xf7\xe4\x82\x25\xcb\x00\x8f\xe3\x88\x08\xc4\xfb\xff\xac\x06\xb3\x27\x7b\xd9\x8f\xf8\xab\xe2\x6f\xa0\x52\xd5\x60\x1c\x99\x60\xc0\x8f\x8a\xbe\x02\xb1\xaa\x28\xb2\x5c\xa0\x52\x55\x65\xe2\x21\xfb\xce\x16\xe7\xec\xdf\x06\xdd\xdc\xd6\x78\xa1\x76\x26\xfe\x2b\x7c\x09\x88\x56\x46\xac\x46\x38\xb5\xe2\x11\x04\x8b\x76\x74\x8e\xe5\x5e\xab\x40\xb7\xc8\x91\x3e\x1d\x59\xb2\x64\x9d\x0e\x7c\x68\x30\x60\xa7\x8d\xaa\x76\x83\xdb\xa0\x0c\xc7\xb5\x5d\x0d\x6e\x03\xb1\x58\xbe\x60\xac\x9f\x1c\x03\x4c\xcd\x04\xc7\x52\xf6\xaa\xde\x46\x2f\x87\xf1\xee\x8e\x0b\x87\x1c\xe9\xd2\x95\xdc\x41\xf9\x45\x55\xe1\x11\x8c\x6e\x0e\xae\x8a\xa7\x2a\x9d\xa6\xbe\x57\x80\xb4\x57\x2a\x40\x7a\xd5\xb3\x81\xa1\x34\x6d\xed\xe5\x1a\x4b\x06\xd6\x87\x8a\xda\x5e\x78\xb9\x26\x44\x80\xf9\x17\xfa\x59\x79\x09\xe6\x68\x1f\xe4\x7a\x1a\xe6\x6e\x37\x74\xdd\x34\x18\x5e\x27\x97\x0a\x92\x2f\xe1\x47\xb5\x0d\x8d\xf4\xd6\x28\x3c\x3d\xf9\xa3\x6a\xc0\x79\xc3\x45\x37\x0e\x57\xad\x35\xb3\x08\x65\x1b\x28\x8e\x01\xea\x0e\xf1\x27\x0c\x41\xdd\xcb\x7d\x48\x93\x7b\xfc\xdc\x68\x47\x41\x13\x5f\xe3\x2f\x4c\xc6\x7b\x1b\x00\x85\xcb\x9a\x08\x0f\x12\x08\xed\x91\x2b\xfe\x8d\x59\xde\x06\x9e\xae\x4f\xb3\xc3\xe6\x3c\xde\x5a\x81\x19\xc8\x54\xbb\x8d\xdd\x9b\xea\x4e\xb7\xca\xc2\x99\x41\xa1\x15\x30\x6c\xe4\xb2\xb7\x7b\xc7\x4c\x67\x18\x6d\xfc\x0c\xd3\x6b\x1e\xa7\x30\x0c\xaf\x3f\xbc\xbd\xfc\x77\x01\x38\xc2\x3c\x2c\xaa\x38\x13\x0b\x7b\xa7\x7a\x8a\xfe\xf1\x9e\x7e\xa6\x4c\x72\x57\xcd\x86\x0c\x4c\x35\x55\x1a\xb9\x08\xea\xbc\xec\x0a\xc8\x9b\x90\x30\x03\x88\xa1\x09\xcf\xbb\x6e\x26\x8f\x0c\x91\xea\xe5\x21\x9a\x52\xb5\x02\xae\x77\x02\x09\x86\x2b\x9e\x04\xcc\x26\x37\x63\xd6\x8f\x64\x88\x11\x07\x58\xa9\x36\x2c\xfd\x05\x04\x9a\x44\x0b\xbb\x77\x6a\x8f\xec\x2d\x65\xa1\xdd\x55\x1d\xed\xef\xc0\x7f\x29\x07\x08\xff\x38\xfb\xd7\x56\xfb\x22\x73\xd7\x2b\x58\x07\xd8\x2c\x87\x24\x0e\x46\x16\x1b\xe4\x18\x10\x45\x83\x1a\x90\x19\x6b\xea\x70\xa4\xd6\xbc\xe1\x2e\x50\x6e\x08\x99\xc2\x58\xf3\x04\xce\x5b\xc8\x2c\x1a\x01\xa4\x28\x6f\x89\xe7\x25\xc4\x60\xdb\xc1\xf9\x7a\xa9\x6a\x6b\x6a\x99\xc6\xe6\x2f\x6c\x37\xbc\x04\x57\x34\xc9\xfb\x33\x1c\x7c\xf2\x16\xbd\x17\x7a\x1b\x04\x55\xc1\xfd\xe0\x58\x70\x39\x72\x90\x7c\x30\x5e\x23\xf4\x23\xc7\x0c\xb4\x76\xcc\xe0\x53\x6c\xc7\x00\xcb\x66\xf5\x39\x3e\x56\x9c\x65\xbd\xca\xf5\x76\x93\x7e\x05\xaa\x55\x43\x68\x2f\x52\xff\xe6\x0d\x00\x92\x86\x71\xbf\x92\x8a\xe6\x9b\x7a\x87\x36\xab\xd0\xa4\x74\x94\x81\xc7\x57\x69\x16\x30\x7f\x4d\xce\x0b\x2d\x30\x7b\xe0\xe8\xcd\xcb\x8d\xbc\x20\x7a\xa8\x6c\xb1\x58\xe4\xf5\x45\x75\x02\x68\xed\x02\xb7\x9e\x0e\xf1\x53\x8c\xc5\x05\xdc\x9c\xf6\x78\x37\x0a\xa7\xe7\xd3\x45\x80\x65\xd5\x65\x5e\x60\x6d\x59\x2f\xb5\x54\x6b\x8d\x51\x3b\x41\xa8\x56\x14\x2f\x24\x21\x59\xca\xe6\xd6\xed\x24\x04\x6f\xc4\xf6\xc0\xf9\x6c\xfb\x6c\xbd\x36\xaa\xab\xc1\x18\x5b\x9c\x09\xfc\x8c\x99\x40\x59\xb3\x45\x4f\x1e\x73\xa3\x35\x2f\xdb\xb6\xf6\xdb\x1d\x5b\x39\x3d\x3e\x71\x4f\x9f\x71\xb7\x9f\x3f\xce\xa0\x12\xc0\xe3\xb4\x2d\x5b\x8c\x24\x4b\xb6\x95\x79\xde\xd8\x34\x39\xcf\xa3\xa6\xd1\x21\x18\xa3\x15\xb7\xe0\xa3\xce\x61\xd8\x84\xfa\xe2\x95\x69\x55\x2b\x32\x19\x23\x9b\x1b\x42\x82\x43\xdb\x1d\x6a\x6f\x71\x95\x26\x6a\x83\xfd\x65\x00\x1e\x76\x52\x95\x31\xdb\x8c\xe0\x4f\x42\x77\x1f\x81\x5b\x7a\x54\x9d\x41\x46\xaa\x2e\x31\x10\xa9\x06\x66\x1d\x58\xfd\x66\xa2\xc7\x63\xc2\xb3\x82\xb8\x6c\xe0\x00\x03\xed\x01\x7b\x01\x8c\xce\x29\xc2\x29\xca\x1e\xfa\x8b\x9c\x0e\xb2\x57\x00\x58\x41\x13\x4b\x54\x7a\x53\xe6\x23\x31\xb2\xd4\x1d\x2f\x5e\x22\x6b\x4b\x85\xd1\x35\x69\xc7\x80\x30\x33\x09\xa4\x49\x65\x99\x69\x40\x85\x74\x52\x5b\x23\xc9\xc6\xcd\x56\x6a\xab\x63\x24\xd8\x5c\x6f\xc2\x6b\x81\x97\x7f\xad\x5d\x2d\x23\x75\x34\x9e\x55\xa7\x24\x09\xef\x24\x19\x8e\x62\xf4\x18\x89\x27\xef\x88\x71\xbe\xaf\x22\xa0\x0f\x50\x87\x3b\x6c\xe9\x74\x8f\x21\x55\x59\x60\x93\x82\x33\xf9\x8e\x88\x86\x00\xbc\x7b\x35\x07\x63\x00\xeb\x69\xb5\x14\x84\x7a\x32\xaa\x50\x4d\x6a\x55\xaa\xa8\x90\x33\x73\xd6\xf0\xeb\xbb\x40\xd4\xb8\x36\xb6\x46\x45\x46\x76\x71\x50\x74\x87\x4d\x37\x98\x7c\x8f\x34\x1f\x51\xc7\x70\xac\x22\xb2\xa8\xad\xf7\x9b\xac\x5a\x26\xa9\x13\x5b\x30\xb6\xbf\x75\xda\x34\x2a\x85\x99\x55\x2d\xd7\xbf\xb8\x5f\xa5\x97\x42\x10\x80\xdd\x07\xdd\x40\xed\xc3\x2c\xc0\xd1\x50\x54\x62\xfb\xb8\xad\x90\x1c\xf2\xfe\x59\x4b\x6d\xd2\xf6\xf2\x16\x7c\x91\xf0\x54\xf1\x9b\xec\x04\x29\x7b\x3a\x59\xca\xe7\x38\x8c\xa0\xe0\x4a\x53\xf6\xf5\x8b\xda\x58\xa6\xad\x81\xf4\x04\x5e\x10\x67\x27\x48\xae\x68\x4c\x93\x9d\x64\x21\x3b\xb5\x07\x82\x48\xda\x9a\x2c\xc2\x69\x3b\xbc\x44\x31\x30\x5e\x28\x3d\x25\xa3\x9a\x34\xd9\xd0\x54\xf4\x42\x0d\x92\xe1\x08\x1b\x1d\x8b\x13\x6c\x44\x88\x1f\x42\x13\xce\x01\x37\x2c\x5b\xdd\x13\x29\xc6\x0f\x12\x56\x13\xb1\x21\x17\x36\x68\x7e\x64\xca\xdc\xa8\xfd\x91\x3f\x73\x6c\xeb\x7a\xa4\xd6\x1c\x07\x74\x42\xf7\x25\x83\x17\x11\x54\x2c\x34\x30\xe1\x4f\x1c\x3f\x11\x7a\x66\xfc\x4b\xb8\x5c\xc8\xe0\x9c\x51\x68\x23\x5a\x59\x29\x7f\xa5\x41\x32\x7c\xa9\x4d\x1b\xd3\x24\xe8\x71\xa2\x4b\x7c\x4c\x4f\x92\x1c\x79\xae\xc7\x1c\x3a\x1b\x5f\x80\x96\x94\xd2\x38\xa2\xd5\xfb\xf0\x3f\xa6\x1a\xb5\x27\x45\xf9\x5e\xf5\x31\xe2\x13\x06\xb0\x0f\x64\x1f\x64\xae\x2c\x79\x31\x96\xb3\xb2\xac\x40\x32\x42\x22\x0a\xd1\x90\x9f\x67\x37\x9d\x92\x7d\x1d\xcb\x5f\x84\x4f\xd1\x4d\xb0\x44\xc1\x2d\x97\xdb\x46\xd5\xe4\x30\xef\xec\x3c\x18\x56\x97\x43\x62\x8d\xdb\x39\x60\xbb\x53\xa6\x80\x7d\xbf\x53\x26\x17\x1b\x0b\xc4\xd6\xa9\x76\x84\x19\x6e\x71\xe6\xe1\xa5\x83\xd0\x87\x70\x8f\x45\x3f\xa7\xed\xcc\x80\xb0\x99\x72\x06\xd4\xd8\x1c\xee\x9d\x9d\x00\xd1\xbe\x8d\xec\xc1\x78\xf6\xd2\xfc\xa8\xfd\x64\x82\x30\xb3\x06\xcb\x9a\x18\xff\x0c\x80\xe2\xa9\x5f\x54\x13\x91\x51\x65\x05\x3e\xc4\x15\x6f\x19\x16\xf1\x46\x35\xec\x2e\x19\xb8\xcc\x56\xad\xc0\x31\xd0\x29\xd0\xa9\x96\x0b\x61\x5c\x5c\x9b\x95\xcd\x69\x5c\x90\x63\xa5\x39\x50\x29\xd0\x4f\x44\x63\x46\x8c\xc2\x43\x3a\x94\x47\xb1\xa7\x8f\x38\x28\x8f\x5c\x5a\xf4\xd1\xa4\xd1\x42\x47\x4e\x8c\x68\x3e\x6e\x18\x05\xf0\x39\xd2\xaa\x99\x0b\x12\x18\x12\xa7\xfc\xb1\x22\x83\x23\x07\x2b\x24\xee\x0f\xc2\x33\x89\xcd\x85\xd0\x44\xee\x80\x56\x21\x8e\xf8\x44\x45\xa4\xb6\x18\x82\x0f\xd1\xc2\xfa\xf6\x72\x29\xce\xc4\x49\x0b\x8b\x3b\xce\x65\x58\xba\x29\x0b\x57\x32\x67\x92\x1e\x87\x27\xba\x98\xe1\x3c\x2f\x70\x0b\x78\x53\x83\xeb\x32\xde\xda\x74\x33\x25\xee\xdd\xe0\x63\x98\xa3\x98\x27\xdb\x98\x4a\xde\xb3\xdb\x12\xc4\x5a\x1b\x75\x1c\xf5\x91\x72\xa4\x38\x07\x75\xf9\x34\x67\x21\xbb\xae\x8e\xaa\xaa\xf3\xae\x13\xf8\x31\x0b\xea\xe8\x8d\x0f\x6f\x83\x30\x98\x9a\xda\x92\x7d\xcf\x5c\x21\x5c\xad\x6d\xbd\x3c\x50\x19\xdc\x76\x10\x79\xf7\x48\x91\xad\x32\x41\x72\x09\xec\x1c\x16\x79\x1b\x13\x66\x8a\x38\x8a\x3e\x69\x7b\x3f\x93\xb3\x80\xf5\xe8\xe9\xa8\x70\xb3\x20\x81\x68\x00\xc8\x7b\xf8\x31\x07\x82\x26\xdf\x51\x7a\xbb\xa6\x20\x60\xec\x6d\x36\x5b\xb1\x92\x2e\x95\xb8\x54\xe8\x79\xff\x70\xb9\xad\x75\x3e\x1c\x73\x68\xe1\xff\xd6\x42\xe0\x0d\xf8\xbc\xa7\x9e\x54\x00\x2b\x9a\x94\x08\x3b\x89\x95\x51\xf8\x3b\xe9\xa2\x32\xe3\x63\xb0\x3b\x26\xf3\x61\xf9\x7c\x52\xb8\x5e\xc9\x5b\x35\x83\x01\xb5\x59\x04\x0d\xca\x23\x3b\x44\xad\x91\x1d\xb2\x73\xe5\x0b\x4e\xc5\x17\x5f\x6e\xf1\x18\x3f\x7c\xb4\xc3\xdb\x98\x55\xee\x70\x33\x6c\x6b\xea\xa3\x43\x0a\xc0\x5f\xb1\x38\x8f\x40\x2d\x43\x95\xbf\xc5\xef\xd4\xdd\x7f\x0b\x1c\xf6\x09\xf4\xf4\x37\x2e\xc6\xde\x8d\x08\x9d\x45\xec\x3e\x27\xa7\x97\xe8\xfd\xc2\xd6\x17\x6d\xa6\xdc\xa1\x62\x7f\x8c\xcd\xb4\x99\xb3\x06\x9e\x02\x70\xff\x55\x6a\xa8\x0b\x92\x06\x1f\xdc\xdf\x32\x8b\x1b\x15\x41\x68\xd2\xc1\xb9\x2f\x07\xef\x15\x8c\x2a\xc3\x5d\xc3\xe7\x28\xf3\x3e\x64\x7d\x51\x80\x8e\xcd\xb4\xc4\x08\x74\x34\x51\x34\xcc\xc8\x52\x3c\x93\x42\xb7\x64\xcd\xfe\x28\x0e\x37\x7c\x3d\x87\xc5\x52\x0c\x3a\xd6\x17\x71\xf0\xe7\x37\x62\x21\x2e\xb7\x57\xab\x88\x87\x2e\xb9\x5b\x9c\x1d\xec\x2a\x86\xbb\x60\xd9\xe8\xdb\xaa\xd8\x59\x7a\x80\xe9\x0a\x7e\xa4\x9a\x39\xa6\x29\xf0\xbb\x17\xd9\x67\x5c\xe6\x85\x45\x0e\x25\x72\xd4\x69\x8e\xb1\x44\x7a\x8b\xc2\x95\x89\xa2\x7c\xb2\xf8\xf7\x57\xcb\x02\x56\x63\xcd\x9d\xea\x1d\xb9\x2f\x10\x46\x52\x60\xfe\xda\xea\x34\x3d\x23\x5d\x07\xd7\x8d\x46\x64\x37\xf2\x4e\x8d\x0e\x71\x66\x79\x22\x0b\x55\xe6\x37\xb6\xb3\x89\xc5\x82\xaf\x31\x00\x5a\x49\x9d\xb4\xb3\xdc\x51\x5a\x9a\xb4\x73\x21\xc4\x79\x79\xea\x20\xe4\x4c\x67\x30\x63\xa4\x29\x2b\x33\x63\xc4\x31\x6c\x20\xc4\x1d\x63\x03\xe2\x29\x16\xf2\x5c\x07\xd0\x68\xa6\x35\x0b\x36\xef\xb1\x89\x3c\x46\x6e\x76\xa9\x41\x08\x4e\x5e\x9a\xda\x14\x96\x98\x84\xfb\xb8\x21\xdd\x7c\xe5\x49\x77\x8b\x6d\x7d\x40\x6f\x9b\x91\xc9\x9d\xec\xbd\x6e\xf4\x4e\x46\x52\x79\x95\xa5\x30\xa4\xf4\x5e\x36\x9b\xb0\xad\x73\xa6\xeb\x37\xd4\x3f\x90\xda\x21\xac\x47\xb4\x65\x0f\x82\x96\x97\xcb\xdf\x66\x4a\xc7\xa8\xd8\x79\xe9\x98\x18\x50\xfc\x56\xe1\x5d\x58\x26\xae\xe5\x77\x62\x94\xd9\xd8\xed\x4e\xf6\xaa\xd4\xc6\x86\x94\xa8\x8e\x9d\x85\xe3\x59\x62\x60\xbf\xb7\x22\x5e\xe4\xc0\x5b\x65\xe1\x04\x2b\xf5\x88\xa0\x70\x8c\x2a\x90\x12\x2d\x04\xe1\x3e\x83\x68\x0c\xe3\x0a\xa9\x86\x33\x41\xbf\x28\xbf\xb8\x44\x1c\x5f\x1e\x72\xcf\x6d\xdd\x2b\x37\x74\x30\x23\xe0\x51\x86\x1f\x2b\x3b\x98\x76\x11\x81\xe0\xc1\xa8\xc0\x6d\xa5\xba\xb2\x43\x04\x9f\x93\x22\xff\xd6\x90\xbb\x54\x8d\x0c\x8c\x3a\xb4\x39\xf4\x75\xa3\x64\x9b\xf5\xbe\x57\xf0\x6a\xc3\x18\xff\x56\xf5\xeb\xd8\xd1\xaf\xc1\x5f\x8c\xe9\x06\x03\x70\xa3\x87\x6d\x77\x10\xad\x5e\x01\xd5\xf5\x82\xd4\x0d\x5c\xdd\x46\xba\x3a\x7f\x18\x2c\x2c\x90\x58\x1b\x2b\x91\x46\x13\xb3\x54\x7e\x0f\xd1\xae\xc0\x99\x22\xd4\x8b\xaa\x32\xf7\xf3\xc8\x63\xea\x29\xd4\xf1\x34\x70\x2e\x2d\x11\xee\x7f\x83\x0f\x24\xdf\x34\x73\x23\x31\x73\x66\xd5\x01\xf1\xe3\x35\xb4\x87\x2d\xe3\xad\x80\x11\x02\x6e\xa7\x65\xcd\x07\x1e\x23\xec\x6e\xf5\x53\x74\xb7\x12\xda\x78\x3b\xe3\x86\x45\xf8\x01\x13\x31\x35\x5c\x0d\xa6\xfd\x6b\xe8\xc5\xc9\xa7\xff\xf1\x99\xb7\x84\x97\xcb\x3a\x3f\x1d\xd0\x62\x35\x7e\x16\x50\x63\x85\x4f\xca\x2b\xae\xcd\x59\xc7\x48\xf9\xc4\x43\x78\x8b\x8b\x27\xd9\x70\x61\x06\x59\xa8\xe7\x33\xe9\xad\xd8\xa9\x3e\x50\x45\x1a\xcd\x68\xb3\xbb\x28\x86\x06\xb8\xfd\x3e\xd5\x14\x56\x4d\xcc\xf9\x30\x41\x1b\xc9\x20\xc1\x94\x54\x10\x51\xb4\xd2\xcb\x7a\xd9\xb3\x79\xbe\xf4\x32\xda\x64\xce\xe3\x22\xd8\x76\x48\xd1\x98\xc8\xd6\x0b\xee\x03\x33\xe2\xce\x6d\xd7\xae\x06\x8f\x74\x54\x05\x7f\x20\x37\xf3\x4e\x37\x5e\xc4\x74\xed\x28\x1c\x12\x3e\x9a\xb2\xc6\x27\x68\xe2\x53\x73\xab\x5e\xb9\x0d\x3c\x10\x11\x00\x56\x6a\x2f\xb6\x16\x18\xda\x48\x91\xa4\xa9\xc1\x04\x11\xf7\x6b\x6e\x45\x54\x74\x83\x4c\x8a\x68\x40\x8a\x67\x1f\x32\x54\x60\xb1\xf5\x75\xd8\xd0\x03\x62\x0e\x5f\xa2\x08\x51\x89\xcb\xfd\x76\xc7\xeb\x1a\xbf\x15\x87\xeb\x61\x2b\x0d\x1a\x17\x6b\x23\x6c\xdf\xaa\x9e\x62\xee\x82\x73\xb7\xdf\xcc\x61\x46\xbe\x14\x91\x12\x3b\x97\xdd\x30\x21\x5a\x4c\x8f\xcb\x36\x50\x39\xbe\xec\x0d\x00\x38\x61\xd7\x90\xce\x17\xbb\x94\x9e\xc8\x3d\x5c\x9a\x65\x46\x7f\x51\x7f\x9a\x1b\xdc\x64\x8b\x78\x4c\xe6\x60\x41\xcf\x51\x1b\xd8\x44\x83\x21\xa2\x00\xa5\xa2\xb2\xfd\x37\xd2\x0b\x3d\xf6\x71\xe3\xd0\xe6\x4a\xd6\xee\xe5\xf0\xe7\x64\xd4\x20\x57\x55\x4c\xe5\xf7\xff\x76\xd2\xfe\x40\xaf\x6a\xc9\xad\x9a\xda\xac\x86\x44\x1c\xb5\x9c\x7f\x09\x07\x89\x76\x10\xe6\x1a\x9e\x73\xb0\x3d\x8f\xd0\x82\x09\x2b\x09\x4d\x99\xc1\x2a\xf0\x67\xbf\xe4\x47\x5e\x01\x03\xd1\xcb\x8c\xda\x67\x04\x88\xee\xc9\xd2\xdd\x12\x33\x36\xdc\x49\x8d\x3b\x14\xc3\x45\x60\x29\x74\x4e\x80\x26\x9b\x46\x2d\xaa\xcc\x7a\x26\x63\x2e\x92\xb2\x26\xcb\x9e\xd1\x2c\x65\xb9\xf3\xda\xa5\x31\x40\x9b\x54\xa8\x27\xae\xa8\xdb\xd6\xed\xa0\x6a\x12\xfd\xdf\x59\x20\x25\xe1\x6b\xdc\x02\x16\x79\xc7\x98\xa3\xfc\x57\x76\xa8\x76\xc3\x32\x9c\xe9\x18\x9d\x1a\x17\x7a\x66\x30\xe4\x2d\x7b\x92\xd0\xdd\x3c\x71\x67\x05\xfa\xd1\x19\x38\x3b\x38\xd1\x47\x33\xfc\xcf\x33\x66\x0c\xba\xf3\xdc\xd4\xe7\x17\x83\x02\x35\xbe\xf8\x9e\x2f\xa7\x7f\x28\x3b\xa9\x30\x06\x51\xf8\x9f\x67\xc4\xc7\x50\x08\x55\x8d\xeb\x90\x30\x02\x72\x4a\x49\x6f\x65\x9c\x46\x2b\x90\xc7\x87\xc3\xe1\xf0\x64\xbb\x7d\xd2\xb6\x8f\x67\x7a\x9d\x31\xd1\xb1\xdb\x23\x2b\x08\xd2\x56\x8d\xce\x91\x0c\x53\x26\x93\xcc\x8f\x1d\x98\xb4\xe4\xf3\xf4\x11\x14\xb4\x4b\xe5\xc1\xef\x30\x23\x23\xb0\x93\xd2\xec\xb9\x70\x42\xda\x5d\xa7\x92\xd7\x59\x20\x79\x18\x4d\x22\xef\xcb\x48\x9e\xcb\xb2\x46\xc1\x96\xef\x6d\x60\xb4\x6a\x24\xfe\xda\xae\x52\x63\x46\x83\x82\xef\x28\x1e\x1d\x92\x4c\x8e\x4a\xc3\x1a\x65\xa9\x19\xc0\x79\x49\x2a\xd5\xfe\xdf\x29\x4d\xcd\x55\x3f\xb7\x0c\x1e\x90\xa7\xaa\xbd\xbe\xd5\xe2\x4c\xfc\x59\xdf\x6a\xf8\xbd\xa0\xf0\xd8\x59\x38\x6c\x6f\x21\xfb\xbb\x22\x9f\xfb\x1a\x72\xc0\x22\x6e\x43\x4e\xc0\x02\x9f\x06\x44\x2f\xc3\xa1\x6b\x45\xa7\x6f\x91\xdf\xb0\xcd\x00\x8a\x96\x03\x05\x43\xfb\x2b\x44\x26\xb3\x6b\x05\x5e\xe0\x51\x86\xd1\x9e\x16\xd5\x02\x2b\xa4\x35\x0e\xc1\x12\x6b\x7a\x05\x9a\x36\xb9\x8f\xaf\x44\x85\x74\x04\xcf\xdf\x89\x86\x04\x92\x5b\x28\x9d\xa4\x96\x04\x8f\xb1\xad\x72\xac\xef\xe8\x15\x2d\xcc\x67\xd3\xb5\xd2\x52\x25\xf4\x1c\xad\x97\x82\x40\xa1\x84\x5c\xda\x81\x0c\xbc\x48\x35\x9a\x08\x04\xf5\x03\x9e\xfb\xa1\x9a\x6e\x82\x70\x91\xea\x00\x3b\x7f\xaa\x80\xae\x56\x4e\x1c\xdc\xa4\xb3\x8a\x07\xca\x9d\x38\x04\x87\x95\x1e\x52\x6a\xba\x42\x21\x5d\x42\xd1\x9f\x94\x37\xee\x0f\xfa\x99\x15\x20\x74\xb0\xcd\x43\x19\xeb\x75\xa3\xea\x1f\x99\x8f\xca\x7d\xd1\xd0\x56\x63\xad\x88\x75\x0f\x62\x30\xc7\x67\x60\x36\x28\xec\x77\xd5\x7b\x78\x34\x22\xce\xd0\xf4\x12\x1e\x16\x12\xa0\x7a\xc0\x15\x32\xe2\x70\x34\xcd\x2e\x1b\x44\x8e\x92\xc6\xa1\x4e\xd8\x3c\xd1\x55\xb3\x6f\x44\x73\xda\x02\x27\xcb\xc5\xa7\x1e\xb3\xac\xec\xb9\x1f\xe2\x91\xb2\xef\x23\x60\x0b\xf4\xc8\xa2\xa8\xe8\xc7\x80\xd0\x52\x81\x56\xd2\x31\x20\x78\xac\x19\x9d\x7a\x8e\x81\x0c\x86\xef\xc8\xce\xc4\x47\xfe\x9d\x80\xe7\x8c\x69\x27\x99\xf5\x12\xe5\xf0\xcc\x2f\x0a\x7d\xb7\x93\x44\x1c\xe8\x3a\x40\xe5\x9e\x21\x34\xc9\xbb\xc1\x6d\xe0\x61\xd0\xa8\x01\xe6\xa0\xae\x5c\xd1\x43\xde\x3f\x47\x00\x13\x07\xaf\xf8\x1d\x43\xb6\x7d\x42\x5d\xa1\xd3\x2d\xc4\x9b\x80\xdb\xc5\xc0\xee\x3e\xe2\x7c\xd0\x7e\x40\x60\x03\x64\xab\x4e\x0b\xb6\x91\xa2\xa6\x19\x78\x1a\x92\x8d\x56\x52\x2b\x46\x06\x6d\xe3\x8c\x91\x45\x6b\x3d\x98\x68\xf2\x9b\xac\x5b\xa7\xed\xcd\x9e\x5d\xc3\x9b\x22\x70\x40\xd7\x3e\x3e\xab\x66\x0d\xb9\x2f\x4c\x9a\x32\xae\x31\x11\xfb\x17\x65\x35\x2c\x03\x66\x6c\xf0\xbd\x41\x04\xbf\x4b\x35\xed\x7a\xeb\xe1\xce\x2d\xb7\x11\xbe\xe2\xc4\x99\xd5\x33\x2d\x10\x7d\x9f\x30\x27\x5b\x3d\xf0\x0e\x9a\xed\x1b\x5c\x2c\xf0\x74\xaf\x6c\x1a\xdd\x2a\xe3\x65\x97\xa4\x51\x88\x31\xba\xd1\x5e\x41\xb4\xb0\x6c\xfe\xf0\x55\x91\xb4\x05\x30\xf4\xa3\xcc\x6d\x8a\x21\xf0\x23\xdb\xcb\x2e\x16\x8b\xf1\x32\xaf\xa9\xbd\xb8\x91\x89\x33\xbf\x8a\x69\xf7\x80\x8f\x5c\xba\xb0\x72\x41\xf9\x82\xa9\x07\xec\x10\xc4\x1a\x5f\xb6\x59\x4c\x46\x6b\x64\x9c\xc8\x23\x05\x93\xb6\x1c\x6d\x86\x99\x22\x91\xcb\xa0\xb0\x12\x69\x4c\x49\x13\xb8\xeb\xd5\x1d\xec\xc0\x30\xe2\x3c\xae\x33\xcd\x60\xed\xfc\x48\xaa\xe3\x87\x25\x0b\x19\x4b\x1b\xe7\x03\x21\x42\x3b\x20\x9e\xc1\xaf\xc3\x19\x83\x29\x60\x20\x17\xe8\x27\x8e\x58\xfe\x58\x73\x89\x39\xda\xfc\xd2\x5c\xb2\x1e\x27\x06\x74\x5e\x52\x97\x31\x9a\x03\x45\x92\x31\xd6\x3c\x89\x4b\x92\x67\x02\x18\x0b\x14\xf2\x4b\xa4\xf1\x89\x99\xd2\xf6\x72\xd2\xa7\xb8\x1a\xeb\xb4\x10\x03\xd5\x8e\x8b\x74\xbf\xb1\xa0\x9d\x00\x22\x58\xd6\xf1\x75\xd8\x72\xbb\x57\xe2\x95\x6d\x4f\x6e\xf5\xde\x66\xdb\xc1\xae\xf2\x71\x9a\x0c\x12\x3c\xe6\x16\x58\xc9\x54\x02\x5d\xc4\x0e\x3b\xe9\xe2\xe3\xfb\x23\x45\xc8\x46\x35\xb7\xf7\xf6\xba\x78\x2a\xee\x9f\xed\x2c\x1a\x5a\x45\x5c\x64\x6e\x05\x9f\xf7\x15\xc3\x31\xc0\x17\x03\x70\x7f\xe1\x83\xd7\x14\xba\x9b\xec\xa5\xb7\xff\x42\x8b\xb8\x06\x6a\x11\x7c\x4e\x68\x2f\x97\x9e\xd0\xde\xab\x19\x0a\x90\x2f\xb1\xaf\xa5\xbc\x1b\x6b\x6f\xf1\x41\xc6\x25\xfc\x4c\x39\x6b\xed\x39\x33\x1c\x14\xaf\xcb\xdc\xa5\x74\xba\xa9\x33\xd6\xe6\x97\x90\x30\xc3\xe0\x90\xef\x58\x06\x49\x2e\xac\x53\x50\x77\x30\x0d\xbd\x4a\x18\xc6\xe5\x60\x1a\xf1\xce\xee\xa7\xa8\x02\x98\x36\x35\xeb\xfc\x12\xca\x90\x13\x9f\x9f\x7c\x58\x27\x88\xbc\xb3\xa4\x97\xc6\xb2\xa5\x48\x11\x99\xdf\xf3\x13\xa4\x37\x7a\xe6\x20\xce\x7a\x44\xb6\xe7\xd3\x1e\x91\x17\x4a\x38\x11\xbf\x2e\x5e\xf2\x5c\x9c\xe4\xb1\xf1\x6c\xc4\x2e\xdb\xbb\x20\xb1\xb6\x79\x53\xce\x29\x6d\xa6\x31\x81\x59\x1d\x91\x44\x10\xc2\xf0\x45\xf8\xac\x7f\x4e\xa1\x67\xb2\x91\x5d\x4d\x62\x5a\x90\xb9\xf9\xcd\xf9\x90\x94\x35\xa2\xeb\xec\xbe\xa6\x60\xdf\x79\x15\xe7\x10\x37\x93\x03\x78\x47\x5f\x0b\x40\x08\x91\xa4\xca\x90\x04\x3b\x0c\x02\x50\x36\x43\x7d\x99\x36\x83\xd3\x46\xed\x28\x40\xe9\xdd\xf9\x5f\x19\x14\x78\xfc\x8f\xd7\x97\xf7\x80\x73\xb3\xff\x54\x3c\x3f\xbc\x0c\x43\x8f\x94\x0f\xc9\xf8\xc7\xeb\x4b\x6c\xbd\xdf\xa8\x43\x69\x62\xe6\xe5\x32\x9b\x1c\x14\xa4\x47\xe3\x8d\x17\xe6\xe0\x34\xae\xfa\x23\x23\x0e\x30\x35\xc1\x8c\x86\xbe\xd3\xeb\x8d\xdf\x2b\x08\xab\x73\x04\x57\x31\x1f\x65\x23\x8e\xcc\x08\x5d\x1d\x7f\xf3\x9c\xcc\x35\x34\x4e\xce\x91\xd6\xc5\xc2\x94\x33\x9e\x28\x30\x54\x14\x1f\x08\xe7\xfc\x8c\x65\x45\xff\xbb\x27\x2d\x47\x1d\x15\x65\xc7\x1b\x27\x5e\x02\xcc\xb4\x3c\x0e\x8d\xf3\x07\xf4\x32\x98\x47\xf0\x4e\x6e\x21\x58\x6a\x80\xfa\xf9\x5e\x1c\x0b\x7e\xa6\xe9\x4c\xbc\xc3\x5f\xf7\x83\x17\x4f\x3b\x85\x79\x4f\x9f\xf7\xf5\x35\x8f\x64\xc3\xd1\x20\x73\x2b\x50\x14\xb5\xff\x1e\xce\xce\x7f\x88\xbf\x87\xa5\xf2\x0f\xf1\x77\x6d\x5a\xf5\xe5\x1f\x7c\x6b\x16\x9f\x15\x0f\xe4\xee\x74\x12\xf2\x04\x55\xdf\x61\x10\xa0\x58\x7e\xfa\x0f\x5d\x37\xde\x2d\xa5\xd4\x44\xc1\xb3\x76\xf8\x6c\x52\xaf\x97\x03\x9e\x7c\x7c\xa5\x39\x89\x0e\xb4\x9c\x4a\x0d\x78\xb7\x84\x41\x31\xe0\x40\x06\xdf\x26\x71\x26\xde\x60\x34\x0c\xbe\x1b\x67\x4e\x06\xb2\xc7\xe5\x71\x87\xd1\xd5\x07\x5f\xd7\xe1\xde\x1a\xe0\x94\x81\xbb\x8f\x78\xcb\xc9\x96\xdd\x49\xce\x94\xe0\x4e\xf1\x3b\x5a\x3e\xbe\x80\x2f\xf1\x7f\x5a\x93\x4b\xe2\x78\xc7\x03\x9e\x74\xde\xd6\x2e\x9c\x1d\x6c\xf0\x92\x09\xca\x70\x7b\x56\xf8\xa2\x87\xed\xec\x9d\xb0\xbd\x5e\xeb\xb0\xe2\xe8\xd9\x98\x88\xd8\xa8\x3d\xbd\xce\xb3\x91\x0e\xf1\xc6\xb7\x46\x30\x74\x3d\x56\x23\xe3\x03\xb7\xae\xac\xa0\xd4\x91\x2c\x46\x72\x49\xe4\x87\xe1\xc5\x83\x4c\x6b\x60\xee\x54\xef\xe3\xb5\xa9\x17\x1f\xac\xb8\x56\xeb\xa1\x93\x7d\x1e\x04\x60\x5c\x60\xbc\x20\x19\x0f\xa9\x37\xe1\xcc\x0f\xcb\x42\xf4\x84\x2b\x57\x10\x70\x38\x00\xba\xfd\x08\xb2\x49\x8f\x81\x84\xc7\xb5\xa0\x9e\xc9\x81\xa2\xe9\x09\x3d\xba\x52\x06\x40\x2a\x2a\xce\x46\x83\xda\x00\x77\xc8\x73\xad\xe0\x30\xf1\xd4\x06\x8c\x83\x34\xd3\x82\x64\x15\xc7\x91\x90\xe8\x7e\x79\xa4\xe9\x41\x68\x8c\xd1\x36\x0a\x0c\x91\x34\xee\x08\xc5\x6f\x94\x62\x93\xc0\x66\xb5\x8c\xe0\x9f\x13\x02\x7c\x1b\xe6\x2c\x90\x26\xfc\xf9\x9e\x5f\x97\x99\x82\x45\xc5\x48\x7a\x52\xa6\x1c\x94\x4c\x2e\x02\x52\x40\x93\x34\x7a\xee\x08\xb7\x58\xb3\xc9\x5e\x6c\x05\xd5\x15\xc4\x8c\x73\x33\xcd\x1b\x4d\xd3\x6c\xb8\x2d\xbd\xca\xd6\x30\xf8\x59\x69\xd3\xea\x3b\xdd\x0e\xb2\xa3\xb7\xb0\x8e\xe3\xfd\xa9\xc4\xdb\x58\x03\x1a\x91\xa3\xb8\x47\x1d\x02\xda\x06\xa1\x72\x1f\xf7\x64\x4c\xbe\x4a\xcf\x5c\xcd\xf6\x28\x90\xdd\x68\x1e\x46\x3b\x09\xc3\xae\xa6\x67\x6b\x72\x5d\x3d\x2a\xe2\x61\x7d\x60\xf0\x6e\x5e\xa5\x3f\x4f\xb8\x3c\xb2\xe7\xfa\xb5\x0f\x38\x81\xfd\x79\x21\xbd\x9c\x05\xe3\x09\x7d\xcf\x1e\x55\x0a\x0a\x01\xcb\xd5\x4a\x2f\xd3\x6d\xa8\xb1\x14\x4a\x6b\x29\x9b\xdb\x59\x3d\xeb\x2c\xfe\x99\xfd\x95\xab\x72\xc3\xc0\xb1\x30\x0e\x1e\x6f\xa1\xe2\x70\x90\x9c\x4c\x99\xd7\xc9\x85\xc3\x75\x4e\x9a\xb8\xc1\xc9\x93\x0b\xba\x32\x7e\xbb\x22\xd3\xf8\x95\x0e\xa2\xd0\xb4\x39\x7a\x74\x64\xa0\xb8\x03\xc5\xc3\x53\xff\xcc\x68\x1d\x1f\xa8\x44\x88\x1e\x8c\xaf\x76\x1c\xdf\x4f\x47\x09\x5b\x16\x05\x8d\x7b\x13\xe8\xe4\x01\x4d\x95\xa6\xae\x67\xa7\x14\x54\x28\xe4\x06\xa9\x30\x0c\xf7\x29\x71\x90\xa7\xd1\x64\x98\x1e\x16\xcc\x6c\x38\x71\x0f\x1d\x6f\x21\x9c\x74\xd8\xed\x73\x0e\xe2\xc5\xcc\x1c\xdc\x05\x05\x7e\x61\xa7\x4c\x0b\x16\xb5\x18\x71\x74\xaa\x60\xba\x7f\x7d\x3c\x70\x23\x75\x4c\xbe\x9b\x47\xc6\x72\xf7\x03\xcf\xa4\x4c\xf7\x3c\x1f\xe3\xef\xd4\x9e\x6c\x57\x93\x7c\x2b\x6f\x81\x9f\x66\x6a\x0c\x31\x35\x99\xcc\xce\xa0\x9a\x3d\x07\xd2\xbb\x60\xb1\x69\x5c\xa0\x3f\xde\xbc\x32\x32\xdf\x5c\x44\xbe\x4c\xea\x6c\xeb\x91\x7d\xee\x79\xdb\x42\x7f\x0a\x3b\xdd\xa3\x05\x46\x01\x6f\x0b\x5c\x65\x50\xfd\xe9\x7a\x19\x55\xcc\x91\xf5\xa7\xd7\x13\xb6\xcf\xcd\x51\xf3\x86\xcd\x74\x69\xb6\x58\x61\xc2\x03\x07\x19\xac\xc7\xe4\xde\x4a\x86\x7a\xf9\x25\x4d\x1e\xf5\xb1\x3c\x14\x47\x6b\xf6\x9e\x48\xfc\xdc\x28\xbc\xaf\x3d\x36\x72\x17\xb3\xa3\x46\xd1\x42\x73\x55\x46\x52\x7f\x8d\x3c\xba\x32\x4d\x58\xa1\xb1\x86\xa7\x37\x53\xf8\xa9\xc0\x7f\x2e\x27\x03\x5f\xbc\xc4\x59\x46\xa0\x22\x25\x29\xbe\x8a\x00\xec\x63\x5e\x76\x51\xae\x8b\x3d\xaa\x9d\x68\x0d\x91\x12\x6a\xa4\x9d\x8a\x37\xbe\xa4\xa2\x02\xb3\xa8\xed\xd0\x6c\xf0\x86\x17\x34\x51\x10\xee\x49\x5c\xbd\xbf\xf9\x20\x50\x07\xed\x7b\xbd\x5e\x87\x63\x57\xfc\x79\xa3\x4c\xa0\x69\x70\x4b\x84\x74\xcd\x36\xcd\x80\xfa\xca\x57\x76\xed\x4e\xc5\x5e\x71\x94\x5d\xd3\xd2\x21\x94\xbf\x73\xc3\x4a\x18\x34\x95\x14\x1b\xeb\xf0\xf1\x0e\xb7\x53\x8d\x5e\x1d\x16\xe2\x52\xc9\xde\x88\x6d\x90\x20\x98\x64\xde\xeb\x84\x1c\x7b\x02\x01\x84\x9e\x3d\x95\xb9\xb2\x9e\x86\x24\x5f\xbe\x74\x3c\x4d\x86\x67\x0c\x3a\x17\xd6\x96\x47\xf8\x3e\x1b\x00\x78\x26\x0d\x0f\x64\x0d\xb1\xa7\xd9\xd2\xf4\x2b\x96\xe9\xa4\x0d\x69\x8d\x52\x7b\xbf\x9a\xf0\x12\xaa\x85\x47\xdd\x3d\xb5\xe5\x4c\x7c\x50\x0e\x42\x7e\xc2\xf7\x03\xe0\x3c\x04\x37\x2a\xf4\x49\x80\x7b\x0d\xe8\x67\x71\x59\x44\xac\x61\x4a\x95\x23\x9b\x00\x1e\x23\x37\xd5\x99\xcd\xd6\x91\x05\xa7\x0e\x38\xf6\xe3\x7e\xe2\xda\x47\x53\x47\xac\xee\x6f\x83\x1a\xd4\x42\xbc\xf1\x62\x2b\x0f\xf0\xd6\x2c\x58\x24\x3a\xd5\x58\xd3\x3a\x36\x94\xd3\x1e\xbc\xb4\x9d\x18\x76\xec\x35\x3f\x99\x92\x69\xdb\x7a\x95\x8d\xd5\x75\xfc\xb8\x0f\x30\xeb\xc1\xeb\xd0\x72\x2f\xdd\xed\xc8\x46\x25\xc8\x7f\xdf\xd8\x8b\x14\x88\x38\x96\xa0\x07\x33\xb4\xb9\xb7\xfd\xf9\x0d\x90\x72\x7e\x0e\xc4\xed\x2c\x06\xa7\xbc\xa6\x9f\x53\x20\x34\x10\x82\x3e\xe1\xaf\x29\xc8\x8e\xde\x1d\x8f\x2f\x90\x4f\x41\x96\xb6\x0d\xe3\xf8\x8b\x6d\x0f\x53\x5d\x38\xaf\xae\xa8\x10\x07\x5a\xb4\xb3\x7b\xb8\x09\x5e\x1e\x20\x43\x7b\xa7\xba\x15\xbe\x69\x11\xa4\x56\xc5\xc1\x80\xe0\xd6\x20\xdd\xc2\x22\x09\xa0\x79\x86\x3b\x13\xf0\x32\xcd\x2d\x7b\xf1\x21\xba\xe2\x71\xad\x71\x9b\x30\x54\x10\xb5\xeb\x0d\x4a\x1c\xb0\x1a\x41\x09\x8e\x31\x9a\x4e\x83\xc4\xbe\xcb\xc2\x29\xb0\x9a\x6c\xd7\x2b\x07\x3e\x5c\x40\xc3\xe0\x51\x5b\x06\x41\x91\x0d\xa3\x75\x64\x91\x56\x13\xa3\xae\x1d\xd4\x33\xd3\x22\x8a\x8c\x0b\x2b\x0b\x62\xe2\x4e\x20\x92\x0f\x17\x00\xf1\xab\x3b\x63\x16\x8c\xc0\x93\x86\xfd\x75\x41\xfe\xb2\x03\x24\x4e\x8c\x5d\x13\xdf\xe8\x90\x00\xa0\xce\x2a\x1c\x0c\xac\xa2\xca\x0c\xa8\xc3\x58\x7d\xbc\xbe\xcc\x89\xf9\xa9\x90\xe1\x78\x47\x3d\x47\xab\x3c\x3c\xa3\xd6\xab\xb5\xec\x5b\x8e\x4d\x44\x07\xcc\x46\x7a\x3c\x48\xfa\x30\x7c\xac\xa2\x80\x88\x81\x84\x0b\xc3\x4a\xdc\x6a\x03\x71\x7d\x41\x32\x21\xa5\x62\x10\x12\x93\x81\x52\x38\x54\x86\x5d\x38\x67\xf0\xd0\xe2\x8a\xa0\xef\xdf\xff\xc7\xcd\xfb\x77\xa7\xe2\xcb\x93\xfd\x7e\xff\x24\x14\x7f\x32\xf4\x9d\x32\xa1\x2f\xed\xa9\xf8\x5f\x6f\x2f\x4f\x85\xf2\xcd\x0f\x0b\xf1\x16\x8f\x9f\x44\xd5\xc9\x6e\x19\x5c\x20\xc0\x08\x78\xe8\xff\x85\x63\x89\xb6\x0e\x29\x6c\xf3\x07\xfc\x73\x26\x32\x4c\x23\x3b\xc8\xf2\xdb\xf7\xe0\x28\x9b\x31\x24\xf4\x34\xc9\x0d\xfc\x18\x67\x24\xfa\x0d\x60\xbc\x50\xe1\xcd\x32\xe9\xc4\xcd\xeb\xf3\x9f\xfe\xfd\x7f\x8a\xd7\x6f\xcf\x2f\xc4\x46\x7d\x11\xad\x5e\x2b\xbc\x9e\xe4\xad\x7d\xa7\x79\xd2\xff\xd7\x93\xb0\x1a\x9e\xdc\xe8\xb5\x91\x7e\xe8\x15\x2f\x00\xa4\x13\x39\x8f\xd4\xc9\xe6\x76\xee\xdd\xcb\x31\x88\x6e\xac\xa1\x01\x78\xd3\x58\x53\xf6\x1e\x41\xd8\x99\xeb\x02\xdc\xb8\x92\xf2\x3a\xac\x99\xc8\xc8\x6c\x94\x09\x84\x7e\xe8\xda\xf2\x8c\x5e\x2a\x5e\x02\xaa\xfd\xe3\xb8\x30\x04\xfe\x83\x67\x32\xce\xc4\x7f\x40\xc8\xa7\x0d\x5b\x3f\x85\x2c\xee\x1d\x00\x8f\xcb\x86\xcd\x50\x67\x82\xdd\x99\x78\x23\x4c\x10\x1d\x58\xa8\x4c\x79\x51\xb0\x1c\xe3\x20\x15\xdf\x99\xb8\x54\x5e\x6c\xa3\xca\x0f\xd6\x38\x62\x9b\x94\x28\x4d\x63\xe7\xb3\x79\x50\x7e\xc9\x63\x01\xb2\xd9\xe8\x74\x00\x4b\x3f\xb5\xd9\xec\x79\x8c\xc4\x7b\x8c\x8b\xe4\xc1\x1f\x67\xb2\x52\xe4\xdf\x14\x52\x11\xc2\x5c\xce\xcd\x0e\xc5\x62\x9c\x9d\xb8\xec\xe0\xe0\xeb\xe2\x5c\x6d\x30\x2e\x33\x8e\x75\x38\x9b\x1d\xa9\x3e\x68\xd4\xd1\xc5\xf3\x14\x1d\x57\xdb\x53\xc1\x4e\x9f\xa7\x64\xcf\x77\xca\x51\x22\xda\x53\x31\x98\xf4\x1b\x1d\xee\x48\x7c\xe5\x4f\xb0\x27\x0e\x9f\xd1\xdc\xb3\x3d\xc5\x57\xac\x53\xc2\x62\xda\xd1\xc2\x9e\xa3\xb0\xcf\xbf\x07\x34\x9a\xb8\xe4\xd6\x01\xff\xff\xf7\x26\xef\x0a\xf4\xcd\x1d\x4c\xb3\xe9\xad\xd1\xbf\xcf\xf4\x0d\xaf\x57\x92\xcb\x2e\x8e\x39\x3b\xee\xde\x07\x5c\xce\x12\x63\xa0\x05\x9e\xba\x13\x9f\x08\x9f\xd6\x4d\x01\x28\x53\xfc\xc9\x23\x00\x69\xb1\xb2\x6d\xdc\xb2\xd3\x60\xaa\x02\x3e\x86\xf3\x77\xc8\x18\xb2\x91\x63\x37\x8e\x33\xf2\x20\xcd\xc7\xcf\x42\x54\xe4\x46\xd2\x95\x0e\x2f\x26\xdf\xc4\x0f\xa2\x40\x88\x2f\x52\x14\xa7\x38\x1c\xe1\xa5\x5a\x60\x9e\xa9\x9e\x5a\xa7\x25\x09\x92\x78\x84\x89\x94\x44\x80\xa3\x3a\x26\xc2\x09\xad\x99\xa9\xce\x21\xd5\x70\x4c\x0e\xc3\x28\x04\x2c\x1f\xf0\xab\xe6\xf0\xa6\xdd\x8b\x98\x56\x4a\xb5\x7c\x48\x02\xff\x53\x9e\x90\x10\x06\x09\x0e\x93\x9c\xb3\x09\xf2\x71\xe9\xc7\x1c\x40\xe8\x39\x37\xaf\x38\x6c\xef\xe4\x19\xca\xc3\x68\xa8\x5b\xed\x1a\xdb\xb7\xf7\xe3\x7e\x81\x40\xff\x0c\x76\xb3\xf6\xb2\x7b\xa0\xe9\x2f\x08\xea\xdb\xf0\xe3\x98\xf0\xab\x30\xf8\x7a\xcd\x28\xb3\xb5\x5b\x09\xe6\xaf\x2f\xe0\xc7\xe4\x70\xde\x48\x63\xd0\xd4\x1f\x7f\xe5\x73\xbd\xeb\xec\x81\xdf\x19\x7d\x01\x5f\xfc\x74\xfa\x14\x24\x7b\x95\x73\xf9\xfc\x02\xdf\xc6\x7c\x65\x7d\xb3\x91\xdf\x3d\x7b\xba\x7c\x1e\xf8\x70\xba\x07\xe8\xac\xbd\x65\x2f\x1f\xd9\xc2\xbe\x89\x0f\xcd\xec\xe2\xeb\x95\xc9\x46\x45\xb6\x2d\x1a\x16\x69\x83\x43\x31\x7a\xd2\x2f\x3d\xc9\x84\xad\x1a\x71\x69\x30\x07\xb1\x9d\x34\xf6\xa9\x37\x73\x9d\x49\x4a\x03\x80\x82\x11\xd8\xe0\x73\x27\xb2\x7d\x02\x0c\x07\x69\x6f\xc5\x87\x8d\x3a\xc4\xc0\xd5\xf0\xa2\x1c\x5c\xea\x96\x6f\xe7\x40\xf3\xf8\x49\xd1\xfc\xea\xd1\xd6\xe5\x20\xf3\x53\x26\x10\xc3\x07\xb5\x45\xe6\x20\xda\xd4\x8c\x5c\x7d\x5a\x38\xd0\xcc\xf5\x62\xfa\x86\x67\x84\x1a\xbf\x35\x9a\x7a\x7a\xf4\xad\xd1\xbc\x68\xfe\xe0\x68\x56\x14\x24\x84\x38\x08\xb3\x16\xe3\xc5\xb4\x4c\x9f\x13\x4d\x5d\xfd\x8a\x17\x45\xe7\x67\x6e\xac\x22\x7a\x70\xaa\xef\x73\x18\x69\xf3\xce\x7d\xc5\xdb\xa2\xe3\xb0\x74\x5f\xa1\x2d\x9a\x6b\x4b\x6e\x50\x1c\x1b\xf0\xb5\x3a\xa3\x3c\xf8\xff\xd4\x99\xea\x1b\x9f\x13\x98\xc5\xfa\xc0\x93\x02\xad\x5e\xad\x16\x18\x5a\xb9\x76\x76\xe8\xc1\x9c\xe0\x17\xf8\x16\x37\xf0\x8d\x20\x14\x58\xf2\x8c\x22\x4c\x62\x62\x74\xb2\x24\xaf\x4a\x48\x04\xf7\x5a\xd0\xc0\xc6\x0a\xcf\xc4\x0b\xbd\x5a\xa1\xab\xed\x3b\xeb\x53\x53\x16\x58\xc4\x6d\xec\xbe\x0e\xbf\xe0\x85\x52\xb0\x2a\xdc\xd8\x3d\x16\xba\x09\x29\x19\x98\xdb\x75\xda\xd7\x14\xd5\xf9\x26\x7c\x40\x5c\xea\x0c\x62\x30\x10\x83\x92\x61\x3e\xe2\x67\x0e\x15\x50\xc6\xe0\x1a\x7c\x11\x75\xd2\xc6\xc0\x89\xa0\xed\x48\x57\x54\xb0\x55\x18\xee\xa4\x05\x42\x08\xea\x8c\x04\x92\xbf\x20\x74\xd2\x46\x45\x79\x82\xa0\x81\x06\xea\xfe\xcb\x9b\x77\xf8\x09\x31\x95\x29\x1a\x16\x04\xd7\x7e\xa9\x3b\x1a\x6f\x88\xb8\xe8\x86\x1d\x04\x6e\x54\x2d\x07\x94\x0c\x79\x22\x4b\xce\x9c\x21\xf3\xf0\xda\x88\xc3\x5b\x5b\x6f\xa5\x39\x44\xd7\xed\x1b\xbb\x55\xa4\xca\xd9\x2b\xa2\x83\x10\x82\x3b\x79\x8e\x5a\x2b\x42\x11\x82\xe2\x01\x61\xb5\x70\x40\x5b\x71\x44\xf1\xc5\x5c\x64\x71\xce\xc3\x30\xf1\xcc\xf8\x05\x72\xc1\xcc\x1f\x43\xb4\xbd\x5c\x81\x23\x5f\xf8\x1f\x53\x77\xbd\x4a\xc5\xae\x7a\xf5\x64\x5c\x8c\x1c\xee\xc2\xbf\x98\x26\x37\xe8\xec\x91\x66\x20\xcd\x0c\xfb\x86\x7a\x2b\x4e\x1c\xc5\xdd\xa4\x9d\x5f\x22\xc6\xd5\x5f\xd3\xfb\x9c\xb8\xf6\xe1\x65\xc5\xa2\x4f\xb9\x27\xdf\x15\x32\xa8\x22\x8e\x03\x98\xaf\xe0\xeb\x74\xbb\xde\xb6\x43\xe3\x17\x45\xbb\x8b\xd2\xc8\x91\x2a\x5e\x75\xa2\xb3\x6b\xd0\x79\x40\xa0\x64\xb4\xf7\x1d\x4c\xab\x7a\xe7\xd1\xb4\x5f\x66\x64\x5e\x6f\x77\x3d\xde\x94\x30\x7a\x2f\xd7\xf1\xf5\x3c\xb9\xc6\x30\x2d\x29\x0f\x14\xff\x21\x27\xfc\x28\xca\x44\x4e\x80\xbd\x00\xb2\x68\xab\x5e\xae\x81\xb1\x6f\xf2\xf8\xfe\x41\x18\xb5\x86\x99\xf3\xac\x01\xc5\x11\xc7\xa9\xd3\x63\x8d\x73\x4a\x27\x9e\x6c\xfa\x69\xdb\x52\x80\xf1\x98\xd3\x59\xd9\xa2\xec\x7f\x89\xbf\x16\x8b\xc5\xcc\xaa\x99\xbe\x9e\xbe\xeb\xd5\x93\xf1\x5c\x67\xf0\x71\x00\xfe\xac\x1e\x77\x9d\xd8\x59\x6d\xbc\x40\xa7\x34\xe9\x8b\x95\xc2\x17\x45\x34\xb5\xda\x9a\x27\x70\x5e\xa6\x66\x8c\x5d\x31\x63\x75\xb4\x50\xd2\x92\x19\xaf\x6a\x70\x72\xe3\x1d\x01\x5e\x6e\xe5\xb6\x80\xd5\x93\x36\x06\xb8\x9b\x4e\x36\x14\xf2\xfb\x09\xaa\x34\x0b\x98\x01\xc6\xb3\x97\xe5\xad\x78\xb1\x38\x86\x99\x3f\x6e\xb9\x9e\xb1\x5b\x5b\x63\x7b\xd4\x77\xc7\x5b\x76\x2f\xd7\xf7\x3e\x14\x37\xaa\x2d\xbf\xb0\xc6\x2a\x1e\x38\x4d\xc7\x7b\xa0\x74\x92\xcb\xf0\x10\xcf\x13\x28\x25\xed\x91\x09\xcf\x33\xc1\x45\x4e\xc5\xd9\xbe\x2a\x1e\xfe\x4d\x25\x38\xa6\x0d\x70\x02\xfc\xbb\xaa\x3e\xd9\x7e\xfd\xb9\x82\x5b\x49\x08\x83\x1e\xe3\x97\xe6\x57\x90\xa0\x66\x0e\x30\xa1\x47\xf7\x01\xbe\x1c\xba\x2e\x41\x97\xef\xb4\xbd\x0a\xdb\xb4\x34\xea\x09\x00\xa8\xe4\x87\x67\xd9\xc8\xa7\x83\x5e\x66\x5b\xf0\x93\x1e\xb6\x5f\x27\x2f\xce\xbc\x3a\x7c\xa0\x28\xf9\x06\xd2\xab\x05\x15\xf9\x5a\x9c\x89\x2b\xf8\x51\x69\x73\xa7\x7d\xe0\x1f\xb6\x0a\xad\x02\xdf\x40\x02\x9c\x37\xd6\xa8\xaa\xf0\x46\xa8\x20\xd8\x7a\xcd\x9e\x08\x67\xec\x93\x40\xe9\x85\x1d\xe4\x59\x61\x16\x99\x3f\x41\x12\x50\x96\xae\xa7\x01\x39\x8c\xca\x8c\x53\x7a\x80\x8e\xe4\x31\x94\x84\x21\x84\xd4\xfb\xa0\x8b\x67\xcf\x02\x75\x18\x38\xe0\x25\xe0\x02\x1b\x49\x83\x92\x1f\x2c\xaa\x80\x59\x9b\x22\x12\x97\x5b\xa4\x6a\x32\x5a\xb3\x41\x8f\xf5\x54\x2c\x70\xa9\x60\xd0\xff\x47\x84\x2f\xde\xdd\x21\xb5\xab\xc4\x67\x0b\x31\x99\x1e\xb3\xcd\xf5\xb0\x80\x28\x88\x24\x7f\xac\xe6\x9f\x72\x7a\x3f\x5e\x1b\xff\xc4\x63\x4e\x53\x1c\xf7\x3e\xe7\x04\xe8\xd2\x80\x66\x8d\x81\x79\x38\xd2\x88\xc8\xca\x7e\xab\xd3\x69\xdc\x3f\x81\x61\x8a\x7b\x25\xbf\x25\x23\xe7\x88\x3f\xe3\xaf\x94\xd5\xd9\x86\x3d\x55\x2f\xe9\xe7\x51\x9b\x9a\xfb\x7c\x26\x4a\xd0\x8c\x98\x15\x03\x17\x31\x7d\xad\x01\x0e\xb9\x62\xd8\x7e\xfd\xaf\x79\x62\x14\x4f\x8b\x4e\x5a\x2d\xef\xa4\x97\xfd\xb1\x46\x63\x2e\xb7\xfd\xab\x9b\x3e\x36\x53\x2b\x28\xcc\x58\x5b\x35\x79\xec\x13\x3a\x78\x6f\x91\xf2\xe9\xcf\xbc\xc1\xf1\x9e\x30\x33\x13\x23\x1b\x13\x7c\xf4\x13\x6d\x1d\x1e\x7e\xf9\xf3\x88\xa1\xd1\x7d\x4f\x80\x8e\x5b\x19\x28\x53\x0c\x6b\x99\x37\xf2\xde\x12\x39\x37\x63\x47\x46\x2b\xff\xfc\xb3\xa0\xf3\x06\x2a\xe7\x6d\xcb\x6a\x4b\x7a\x05\x90\xc7\x2f\xa9\x46\x57\x59\x4c\xf9\xf1\x9b\xb6\x69\xe4\x80\x6f\x25\x87\xc5\x62\xbd\x55\x44\xeb\x17\xf4\x7f\xa3\x77\x75\xf1\x14\xe8\xdb\x98\x9e\xbd\x0a\xfa\x73\x2c\x46\x2a\x27\xe2\xa3\x9a\x51\x7a\xa2\xaf\x10\x10\x81\xdd\x3f\x22\x10\x7e\x03\x6f\x39\x9b\x33\x2e\x5f\xd6\x81\xff\xeb\xde\x76\x2a\x36\x54\x5c\xdb\x4e\xa5\xe6\x95\x41\x1d\xcb\x82\xb1\x4c\x4c\x27\xfd\x04\xbf\xcb\x18\xd3\xcb\xf7\x7c\x39\x95\xce\xd8\xfc\xa5\x0f\xe0\xc7\x09\x3b\x88\x37\x3f\x8f\xa1\x0d\x84\xd4\xa7\xd3\xf8\x9d\xdd\x57\x78\x14\x2f\x20\x6a\xe4\x99\xf8\x0f\xab\x0d\xa5\x94\x95\x62\x5a\xe0\x8c\xd2\x1b\x34\xd7\x41\xc6\xc2\x47\xaa\xa7\xf9\xa3\xb7\xf6\xe0\x24\x8a\xaf\xec\xd1\x5b\xd9\xc0\xd8\x53\x6c\x52\x83\x56\x3c\xe5\x2b\x71\x88\x75\xf4\xf4\x0d\x86\x8b\x28\xea\xcd\x21\xbe\xa6\x62\x08\x05\x30\xae\xee\x94\x75\xf9\xa0\x00\x8c\x2e\x90\x6a\xcb\xed\x00\x7b\xee\xd4\x0e\x88\x48\x50\xb6\x23\x87\xf8\x9a\x76\x84\x5a\x20\x30\x1d\xfb\x39\x1c\x6d\x8f\x6c\x5b\x81\x26\xe8\xb9\xf1\x99\x1b\x37\x31\xbd\xf6\xf6\x21\x3b\xff\xc1\x74\xb7\x1d\xf1\x33\x6e\x31\x77\xa4\x62\x0e\xda\x5c\xce\xb0\x1c\x68\x46\x3f\xfb\x7a\xfb\xc3\x44\x00\x02\x0e\x86\x92\x11\x34\x33\x90\x2f\x5e\x9f\x98\x9e\x4b\xd8\xae\xc4\x22\x02\xaf\x40\xb4\x81\x32\x1f\x3e\x92\x11\x8e\x9f\x5f\x42\x7e\x31\x3f\x54\x80\x61\xe4\x99\x6c\x01\xa2\x8e\x7b\x35\x6c\xb0\xac\xd6\x29\xb2\x48\xcc\x01\x2a\x12\xf1\x29\x1c\xef\xd8\x9c\xdb\xcb\x2e\x96\x14\x5c\x9f\x15\x7e\xb9\x0c\xb5\x95\x87\xf1\x6b\xdc\x10\x2a\xa2\xd8\x35\xc7\x05\xab\x69\x53\xd2\xb9\xfe\x4a\xdf\x29\x93\x16\xcc\x51\xe1\x6a\x91\x6f\xf5\xe9\x02\xc9\xc8\xb5\xce\x99\xe0\x75\x0f\xa1\x12\x79\xe6\x03\xe9\xc8\x16\x06\xa0\xff\x39\xf6\xb9\x91\x66\x4c\x1b\xc0\x5c\x51\xc9\xed\xe3\xfb\x48\xc4\x3f\xdd\x1c\x20\x29\xf7\xb7\x07\x48\x06\x46\x06\x36\x6d\x4e\x1e\xee\x6b\x16\xd2\x83\x7f\xba\x59\x40\x61\xbe\xb2\x59\xa7\xdc\x26\xe4\x63\x02\xbd\x98\xa3\x14\xf7\xb5\x76\x24\x68\xc1\x32\xbe\xce\xa5\x2d\x26\x1b\x60\x81\x0b\x92\xe0\xac\x05\x6e\xa6\xa0\x5e\x2c\xc6\xfb\x29\x33\x21\xce\xf6\x54\xe6\xa3\xc0\x6d\x01\x63\x61\xf2\xe5\xa2\xf3\x30\xa1\x32\xd6\x80\x7c\x8e\x97\xc5\xd1\xdf\x2b\x43\x4e\xd7\x55\xbe\x3f\x10\x4f\x04\x8f\x8c\x15\x2f\x88\xc6\x3b\x2a\x52\x67\xe9\x18\x6b\xa5\xfa\x04\x33\xf7\xb9\x6a\xa5\xdb\x2c\xad\xec\xe1\xaa\x84\x7f\x57\x85\x1f\x7f\x95\x13\xaa\x31\x87\x8c\xaf\x04\x67\x83\x5a\x8c\xa7\x1c\xfc\x26\x88\x8b\x51\xce\x38\x2f\x12\x1c\xbe\x2f\xbf\x66\x66\x72\x3d\x50\xa8\x1c\x72\x32\x00\x9f\x72\xe7\xd5\x56\xbc\xc3\x84\x6a\x6b\x8d\x46\x7b\xe6\xb7\xf8\x4b\x9b\x75\x55\xc4\x7b\x7a\x19\x3e\x2a\x88\xf0\x43\x29\x97\xd2\xf9\xca\x5b\x0f\xcf\xc4\x7e\x08\xff\x7f\x16\x27\x6d\x95\xba\xbe\x58\x0e\xba\x6b\x39\x9c\xd2\x2f\xe1\x43\xbc\x49\x66\x59\x19\xa0\xdc\xed\xea\x3b\x24\x96\xbb\x5d\xc7\xdd\x62\xb7\xaf\x04\xb7\xd6\xbe\xe6\x38\x2d\x67\x79\xd4\x96\x1c\xc6\xe6\x20\x76\x06\x02\x9b\xe5\x35\x88\x76\xd8\xac\xf0\x31\x81\x88\x77\x12\x08\xc3\x37\x13\x11\xca\x79\xe9\xb5\xf3\xc0\x45\xde\xf0\x6f\x97\x01\x24\x6b\x45\x8c\xc6\x47\x1f\x39\x0a\x98\x86\x9a\x8c\x43\xe3\xb4\xd0\x24\x00\xd6\xc1\xcd\x55\xc9\xa3\x0a\x66\x7e\xad\xf4\x72\xc9\xda\xad\x67\x4b\x50\x5a\x2f\x9f\xa3\xe6\xf7\x34\x4b\x28\x16\x5c\x9e\x51\xdc\xbf\xa6\xe4\x92\xa9\x48\xe9\xf8\xf4\x75\x91\xe4\xbc\x2c\xeb\x92\xcd\xa4\x16\xbe\x32\xcb\xd3\xd8\x61\x26\xa5\xb0\xeb\x4c\x81\xdd\x42\xf4\x01\x92\x91\x8a\x2c\xf4\x0f\x2b\x92\xd0\x17\x71\xd4\x13\xd4\xab\xe7\x69\x9d\x5d\x6b\x23\x50\x57\x5f\x76\x8f\x24\x97\x12\x27\x07\x7b\x2b\x50\x40\x10\xf2\x3c\x65\xc3\x46\xc4\x45\x2a\xd0\x9f\x3c\x81\xac\x83\x27\x80\x29\xda\xb5\x5b\xcc\x2d\x24\x56\x48\xc4\xc5\x84\x5a\x89\x39\x48\xb7\xd7\xf8\xee\xef\x0d\xfc\x98\x85\xe9\x07\xd0\xda\x0e\xf9\xee\x68\x3a\x25\x4d\x3d\x98\xa5\x36\x6d\x6d\xe9\xf5\xec\x8b\x90\x28\x06\xb3\x04\x13\xca\xf7\x40\x6e\xdc\xbd\x85\x32\x0e\xe1\xbc\xeb\x04\x66\x71\xc9\xcc\x2f\x6d\x9e\x55\x48\x98\x89\xe9\x20\x03\x5e\x99\x24\x65\x97\x78\x30\x09\xa1\x6f\xc9\x80\x87\xb3\xbf\x0a\xc7\xa8\x95\x09\x22\xa2\xf9\xf6\xa6\xc2\xf9\x16\xce\x33\x7d\xa7\x46\x8d\x2c\x3d\xb3\x09\xe4\x01\x0c\xa3\x26\xce\xa2\xf8\xf6\x46\x02\x5f\x61\xd6\x78\xaa\x1e\x69\xe4\x41\xf4\xaa\xb1\x7d\x4b\x22\x7c\x67\x9d\x07\x9a\x8b\xef\xac\xde\x8f\xf2\x58\xab\xef\xc5\xf9\x0d\xdd\x08\x27\xc1\xba\x49\xcd\xb7\x62\x2d\xfb\xa5\x5c\xa3\x1f\x12\x05\x98\xb2\xa5\x2f\xfc\x91\xe2\xf7\x0d\x30\x34\xa8\x0d\x7c\xe4\x0c\xfa\x63\x6d\xeb\x15\x04\x66\x91\x5d\x57\x3b\xb7\x21\x1b\x8f\x6b\x85\xd7\x54\x8f\x17\xce\x6d\x9e\x4a\x7a\x88\x5e\x81\x35\x84\x7b\x8c\x6f\x14\x7d\xdf\x48\x70\xe5\xff\x19\xc2\x28\x01\x69\x87\xd2\xcc\xe3\x87\xd1\xfa\xe1\xde\x8a\x46\x7d\xc9\xe8\x7a\x36\xb6\x3d\x34\xc5\xab\xaf\xea\x01\x47\xbe\xb9\x86\x24\xba\x02\x6b\x14\xd8\xd2\x13\x15\x03\xbe\xd6\x3a\xcf\x19\x64\xcf\x6f\x57\x93\x35\x7f\x4f\x15\xf7\xcc\xc2\xe3\x6f\xa9\x35\xef\x66\xa8\xe1\x9e\x35\xd4\x2b\x6d\xb4\x9f\x6c\x85\x6b\x48\xd6\xb2\xd3\xbf\xff\x93\x1b\x62\x0e\xf1\xbf\xba\x21\xfa\xac\x55\xe3\x2e\xe5\x0c\x02\x84\xae\xab\x87\x1d\xb1\x37\x37\xf8\x12\xff\xc7\xdd\x88\xc3\x01\x6b\x7d\xe3\xeb\xb5\xed\xed\xe0\x35\xbe\xd9\x86\x69\xe2\x15\xa7\xb9\x99\x02\x70\xe7\x73\xa8\x07\x0a\xc1\xc9\x65\xde\x42\xb2\xf8\x08\x8f\xee\xa5\x52\xc0\x1e\x72\x19\xd9\x81\x66\x1c\x55\xf6\xc0\x37\x52\xa9\x73\xce\xc8\x4a\x52\x19\xbb\xf4\x92\xe2\x2a\x12\xf0\x7b\x4a\xc9\x60\xe1\xa6\x55\xf5\x75\x67\xed\xed\xb0\x03\xce\x0e\x22\x43\x61\xb2\xb8\x84\x64\xf1\x21\x24\x4f\x6b\xe0\x56\xc5\x62\xa3\x46\x1d\x2b\xb7\xea\xd5\xa4\xcc\xcb\x5e\x4d\xe1\x79\xe4\x36\x4a\xee\x26\xe3\xf6\x5a\xc9\xdd\x64\xd4\x00\x72\x3a\x00\x00\x7b\x7c\x14\xf2\x52\xba\x05\x85\x42\x5e\xe2\x4d\xdb\x1d\xab\x43\x83\x41\xd8\x18\xde\x04\x31\xe5\x48\x09\xe2\xa7\xc6\xad\xa2\xdb\xd1\x49\xab\xec\xf2\xaf\xaa\xf1\x8e\xa1\xdf\xe3\x67\xce\x70\x5b\xeb\x9d\xef\xe5\x2e\xb0\xc2\xe0\x82\x80\xc3\xf4\x0b\xa7\x07\x56\xb8\xb9\x9d\x8c\x14\x42\x4f\x87\x0a\xa1\x8f\x8f\xd5\xd6\xed\xa4\xa9\x9d\xef\x87\xc6\x0f\xbd\x72\xb1\xc2\xb7\x37\x3b\x69\xc4\x4d\xcc\x98\xd4\x38\x29\x99\xaf\xd0\x71\xe1\xb9\x9a\x1b\xd9\x6c\xd4\x6c\xd5\x17\x21\xe7\xde\xba\x27\x65\xf3\xca\x27\xc5\xe7\x76\x4a\x6f\x57\xba\x0b\x44\x69\x39\x34\xb7\xca\xd7\x1b\xe9\x36\xb5\x87\x57\x44\x33\x5c\x57\x0c\x26\x7e\x01\x30\xf1\x5a\xba\x8d\xf8\x00\xda\xc7\x19\xac\xeb\xa6\xde\x2a\x2f\xc1\x5c\x2b\xc3\xf2\xea\x42\xbc\xa5\xe4\xb9\x52\xa0\x95\xac\x49\x02\xa2\x5d\x18\x98\xd2\x0c\xc3\x7b\x50\x5c\x92\x50\x74\x1e\x41\xe6\xb0\x19\xf5\x85\x8e\xf4\xe6\xd0\xd0\xbb\xf5\x5f\x7c\x68\xc3\x35\xa6\x64\xb0\x20\xc5\xae\x1b\x16\x01\x6f\xc0\x92\x07\xa2\xd5\xbe\xba\x80\xed\x3b\xa1\x60\x09\x18\x09\xd7\xab\x0b\x71\x25\x07\x37\x0b\xb8\x93\xb8\x99\x8e\x42\x72\xf5\x0c\xc8\x35\x8f\xe1\xa8\x52\x87\x43\x89\x64\x05\x55\x08\x0b\xf0\x62\xc6\xe8\xb0\xf5\x4e\xa2\x25\xef\x47\xa7\x7a\xf1\x16\x23\xc6\x5e\x85\x34\x82\x35\x6a\x9f\xdf\x2e\xa5\x6b\xee\x73\x4c\x64\x30\x94\x2c\x40\x9e\xc0\x14\xe6\x85\x5b\x36\x8a\x07\x12\x4d\x79\x45\x74\x5d\x4c\x4b\x07\xe8\xce\x3a\x4a\xe3\xa8\xe7\xf1\x71\x3e\x4a\x07\x3f\x9c\x5e\xad\xb5\xf3\x14\x78\x04\xa2\x8b\x83\xb3\xea\x35\x24\xb3\x7c\x93\xbb\x1f\x7f\xb0\xd0\xcb\xac\x63\xa5\x1d\x29\x77\xf3\xe1\xc8\xeb\x0b\xc2\x91\x3f\x04\x45\x3d\x03\xe1\x85\xed\x17\x4b\xc5\x0a\xdb\x31\x22\x64\x58\x8e\x1d\x5d\xf2\x76\x79\x69\x90\x2c\x59\x54\x1b\x61\xb8\x04\xa9\x33\x1b\xe5\x9d\x74\x6e\x0f\x76\xe8\xac\xf6\x87\x8b\x13\xa1\x3d\xf9\x1c\xc2\xb5\x03\x58\x73\x0f\x86\xac\xe8\xb8\xf5\x29\x36\x22\x19\xf9\x45\x16\x83\x06\x82\x72\x1e\xba\x60\x4d\x63\x91\xad\x14\xb0\x0c\x2a\xd7\xc8\x56\x7e\x41\xe1\x04\x86\x94\x02\xb3\x93\x25\x69\xe6\x18\x74\xc1\xb9\x97\x7a\xab\x8f\x96\x65\x9d\xe6\xf7\x37\xca\x8b\x27\x3f\x82\xd3\xac\x53\x62\xdd\xd9\x25\x44\xa3\xc5\x90\xba\x5d\x40\xf1\x03\xe1\xd0\xae\xce\x17\x25\xe8\xde\xb9\xc1\xf0\xb3\x5c\xa4\xbb\xde\x6e\xf4\x52\x7b\x9c\x90\x99\x02\x0c\xc0\x6f\x87\xae\xe3\x5a\x0e\x35\xd1\x12\x2f\x0a\x41\x18\xa8\x90\x81\x2b\xd4\xf6\x99\x1d\x05\xaf\x79\x0c\x8b\x15\x44\x0c\xf2\x96\x98\x60\xc8\xca\x64\xcf\xae\x06\xb6\x0f\x43\x4f\xe6\x78\xf4\x76\x67\xfb\xd0\x05\x5c\x6c\x0f\xe1\x42\x70\x81\xe0\x05\xef\x3d\xb7\x64\xd2\x5d\x07\xaf\x18\x24\xfd\xbc\x38\xef\xbd\x4a\x2f\xd7\x06\xbc\x40\x53\xdb\xbd\x49\x7a\xd5\xac\xa5\xf8\x3e\x4d\x68\x6f\x0a\xcb\x61\x03\x67\x1a\x78\x5e\x78\x57\x32\x08\x59\x79\x78\x95\x18\x0d\x29\x3d\x84\x68\xfb\x18\xc1\x03\x5d\x03\x48\xeb\x9a\x37\x60\x23\x1d\x59\x21\x1d\xa9\x7f\x5b\xa8\xd0\x8b\xea\x73\xfd\x58\xd9\x00\xbc\xd3\x8c\x9e\x49\x93\x7b\x26\x57\x36\x65\xc6\x00\xed\x3c\x9b\xb2\xfb\x5e\x03\xb0\x3d\x45\x9e\x18\x51\xf7\xe2\xa2\xbf\xa0\xf2\x50\x22\xa7\xde\x90\x50\x1a\x4a\x41\x52\xba\x04\xe3\xfb\x2f\x54\x32\x03\xe1\x1e\xd7\x97\x6d\xe7\xa2\x36\x2c\x51\x5e\x4f\x63\x5a\xde\x04\x4c\x99\x5e\x93\x63\x3a\xe9\x0f\xc5\x99\xf8\x33\xfe\xa2\x74\x50\x22\x22\xf7\xd6\x73\xda\xd8\xff\x8f\x20\x83\x6c\x16\x4e\xee\xdf\x55\x05\xda\xf0\x82\x6e\xbb\x63\x84\xdb\x11\x2c\xbe\xe0\xc2\xc1\x5a\x88\xa8\x53\x56\xd6\x0b\x4c\xc9\x5f\xb9\xc5\x14\x05\x51\xf9\xda\x18\x9f\xaf\xa5\x74\xa6\x59\x31\x20\x38\xa5\x4f\xcd\xde\xb2\x26\x13\xfa\x51\x7b\xb3\xda\x00\x6a\xfe\x30\xc9\x5a\xe9\x54\x33\xf4\xda\x1f\x20\x50\xae\x6d\x6c\x87\xae\xc3\x90\x06\x31\x72\x43\x1a\xb7\x73\xe4\x1c\x84\xa9\x10\xcd\xe3\x4c\xbc\xb6\x8e\xdb\xbd\xc3\xf7\x6f\xaf\x6c\xcf\x29\xa0\xdf\x6b\xc1\xf2\x5c\x9b\x56\xbc\x78\x57\xa6\x17\x56\x6e\x31\x72\x22\xbe\xe5\xef\x8a\x08\x8a\x1c\x1e\x11\xa3\x23\xaa\xc5\x7a\x21\x5e\xbc\x7f\xfb\x7f\x9d\xb8\x1c\x21\x1f\x8d\x5c\xdd\x15\x7d\xcf\xc1\x64\x16\x71\xb2\x37\xda\xac\x7f\xa6\x27\xa7\x18\x07\x3c\x92\x65\x7b\x34\x41\xdf\x75\x61\x00\xbc\xfa\xe2\xe1\xd6\xd3\x58\x4f\xaf\x5d\x6f\xf4\x7a\x03\xe6\x1e\xba\x53\x6b\x74\xf3\x08\xdb\x76\xc1\x33\x19\xf8\x2e\x7a\xcf\x0e\xf8\x2d\xba\xb9\xfa\x45\x3a\x95\x83\xc0\x10\x01\x40\x1c\x22\xe9\x31\x54\xa3\x9a\xf3\xaf\x16\xe7\x9c\x7b\x14\x7a\xfc\x0c\x39\x50\xa4\xc8\x21\x84\xd6\x3b\xbd\x36\x4f\x34\xbc\xfe\x12\x48\xa3\xea\x5a\x8a\x57\x50\xc4\xa2\x5c\x4c\x6a\x60\x23\x37\x78\xc6\xe3\xdd\xfd\xad\x71\x03\x37\xfd\x66\x78\xa8\xe5\x5b\xa9\x21\xa4\x29\xfc\x1f\x83\xdd\xa9\x5e\xaf\x0e\xf5\xba\xb7\xc3\xae\xce\x68\xf2\x99\xf8\x13\xe4\x08\xc8\xc9\xa8\x35\x95\xc3\x02\x74\x95\x08\x81\x27\x61\xac\x5f\x01\x74\x36\x1b\x69\xe0\xb1\x04\xbe\x41\x12\x21\xf1\x11\x92\x02\x22\x35\xbc\xb1\x26\xc8\x17\x18\x2b\xa8\x43\xc3\x5f\x2c\x16\x7b\x01\x46\xe8\x52\xc3\xc3\xd1\x97\x14\x17\x1c\x6f\xf5\xb2\x55\x90\x30\x06\x24\xaa\x0d\x82\x36\x76\x8b\x16\x47\x42\x77\x09\x00\x10\x88\x27\x00\x8c\xc7\xd2\x85\xa2\xa0\x41\x3f\x13\x2f\x95\x6f\x36\x22\x65\x85\x42\xb4\x1b\xd1\x8b\xeb\x0b\xef\xd6\xd8\x67\xa8\xac\xe8\x32\x5e\x30\x47\x00\x34\x49\x29\x20\xb6\x81\x03\xaa\x9d\x0c\xc7\x85\x13\xe7\xad\xb8\x39\x67\x52\xb3\xf5\xbb\x9a\x2e\x06\x6e\xde\x7e\xb8\xba\x87\x76\x05\x50\xa2\x2b\x00\x99\x11\x97\x90\x45\x04\x06\xb2\x32\x2a\xc3\x01\x97\x90\x4e\x39\x0e\x2a\xaa\x5a\x22\x58\x6e\x1e\xee\x3e\x0e\x3a\xec\xf0\x5e\x39\xdf\xeb\x06\xdf\xc9\xa7\x32\x0b\xf1\x76\xe8\xbc\xde\x75\x8a\x53\xd8\x0e\x16\x62\x2d\xec\x64\xcf\x2f\x8a\x37\x76\xbb\x95\xe2\xf1\xe9\xe3\x45\x71\x0a\xd4\xbe\x73\x29\x50\xeb\x87\xcb\x1b\xf1\xab\x69\xfa\x03\x9a\xcb\x50\x4f\x6f\xf5\x2e\x80\xd5\xb8\xe6\x43\x87\x6f\xf5\x0e\x60\x71\xad\x33\xb9\x95\xdb\xda\xa9\xfe\x4e\x37\x71\x4f\x5e\x9d\xbf\x05\x15\x9e\x6e\x54\x4e\xec\xa9\x6a\x78\xf9\x8e\x85\xa8\xd4\x88\xf3\xc1\xdb\x42\x88\xe2\x52\xd9\x03\x53\xe3\xe3\x11\x2d\x5d\x78\x5c\x27\x3c\x76\x09\x5d\xb0\xda\xc5\xd1\xc7\xcb\xe2\x58\xb1\xc8\xd5\x67\x77\x6f\xe9\x4c\x1e\x4b\x73\x65\xf1\x87\x3c\x03\x17\xc5\x69\x9b\xb3\x5e\x25\x9e\xaf\x34\x3a\xcd\x91\x65\x6c\xf2\x7d\xe3\x36\x1b\x45\xb1\x2c\x51\x40\xd6\xc8\x00\x90\xf5\xcf\x08\x75\xb4\x03\x9a\x96\xc8\x2d\xb5\xa6\x63\x3c\x63\xcc\x79\x8f\x01\x27\x2d\x51\xe0\x9d\x75\x74\x0c\x3d\x82\x1a\xb9\x68\x80\x59\x1e\xd0\x82\x88\x2e\x99\xc9\x20\x22\x31\xea\x29\x50\xac\x72\x04\x95\xc7\x43\xc5\x05\x00\xbc\x0f\x71\xce\x59\x37\x47\x9c\x73\xd9\x8c\x07\x18\x68\x44\x83\x12\x38\xf9\x61\xb1\xef\xc6\x65\xb6\xe8\x88\x29\x19\xb9\x6c\xd0\x71\xa0\xfd\x66\x58\xd6\x72\xa7\x6b\x65\x5a\x74\xe3\x39\x13\xe7\x57\x6f\xc4\xaf\xf4\x59\x91\x81\xc5\xc2\x58\x5f\x3b\x70\x88\xfa\x1e\x3c\xe0\x94\xff\x81\xb3\x48\x13\x1f\x2d\x31\x48\x13\x5f\x1a\x64\x10\xac\xdc\xed\x22\x87\x97\x19\x40\xc0\x8e\xcf\x40\x30\xe0\x4a\x0e\xf1\xf1\xfa\x92\x01\xc6\x4c\x1d\x25\xdb\xd5\xaa\xd3\x46\xd5\x5b\x74\x46\x7b\x8f\x9f\xe2\xad\x6d\x23\x6a\x8a\x64\x54\xf7\x76\x40\x2d\xfa\x3a\x7b\xdb\xe4\x1a\x12\xc3\xd8\x31\x78\x3f\xe0\xc9\x88\x37\xc7\xa8\x90\xc9\xb2\xa8\xa2\x90\x95\x57\x02\x96\x0b\x0d\xf8\x0f\xd6\xbd\xb5\xbe\xde\x49\x3c\x40\x20\x1d\x5d\x12\xaf\xad\xf5\xe2\x4a\xfa\x0d\x17\xea\xec\x7a\x5a\xe2\xd2\xae\x8f\x80\x53\x64\x63\xdc\x24\xdc\x44\x4c\x1b\xaf\x22\x68\x75\x6c\x9b\xdb\x64\xf3\x74\xf3\x7a\x7e\x92\x02\xd4\x94\xf3\xcf\x32\x83\xf8\xe2\x6b\x8a\x50\x5f\xe3\xfc\x93\x34\xe3\xc1\x86\xc4\x6b\x43\xcb\x20\x2f\x76\x64\xe2\x42\x56\xce\x80\x67\xc9\xc0\x4d\x18\xce\x05\xd6\xc1\x4c\x80\xf2\x21\x9b\x8c\x14\x00\x28\xb2\x7e\x2d\xef\x22\x6b\xe9\xb1\x27\xd9\xa5\xe5\x08\x44\x9c\x7b\xec\x55\x8e\xee\x56\x1d\x6a\x08\x0e\x47\x75\xfe\xa7\x3a\x60\x50\xb8\x71\xbd\xb7\xea\xb0\x0e\xad\x8f\x60\x6b\x65\xc4\xf7\x8f\x9d\xdb\x3c\xc1\xac\xc7\x3f\x4c\xca\x6c\xb5\xd1\xdb\x61\x8b\xae\xe3\xfa\x77\x85\x6f\xe2\xc2\x7b\x17\x90\x01\xb5\x05\x69\x50\x5c\x84\x8c\xfb\x8a\xba\x99\x52\xae\x4a\x4b\x68\x67\xd3\x5a\xc8\x75\x5a\x73\x4b\x02\xa0\x8b\x81\x4e\x05\xa6\x63\x0e\x56\xb4\x2c\xef\xdd\xc0\x17\xf2\x4a\x39\x36\x78\x4b\xa8\x4e\x92\xf3\x4b\x78\x5b\x88\xe5\x67\x82\xdc\xca\x2f\x49\x8d\x06\x1a\x32\x54\xc4\x8d\x35\x6f\x04\xbe\xeb\x15\x06\x3d\xad\x3b\xdd\x28\xe3\xe8\x51\x29\x4a\x14\x97\x94\x38\xa6\x07\x1b\xef\x77\xf5\x1a\x70\x33\x35\x80\xe0\x92\xaf\x12\x66\x62\x44\x40\xdb\x04\x63\x50\x6f\xf5\x3a\xbe\xd3\x46\xfc\x08\xe8\x47\x61\x28\xc4\x5b\xce\x65\x04\xe4\x53\x5b\xaf\x02\x53\x1b\x06\x1e\x6f\xcb\x9a\x43\x7a\x38\x9a\x18\xde\x8b\x94\x17\x67\x0b\x5a\x18\x67\x0b\x1a\x37\x3b\x4f\x00\x47\xd6\xd5\x10\x33\xdf\x76\xe8\x87\x54\x63\x7c\x78\xd4\xcf\x84\xe3\xe6\x02\x73\x29\x8a\xfd\x7b\xc8\x8d\xd5\xb5\xcb\x54\xd9\x0b\xb6\xb9\x9a\xad\xb0\x5d\xd6\xb9\xda\x20\xa5\xe6\x42\x76\x4a\xcd\x95\x0e\x29\x95\x28\x58\x4e\x60\xdb\x65\xed\x5c\xc7\x34\xf6\xe6\xe6\xb2\x24\xe4\x29\x37\xf1\xc2\xdf\x07\xe9\xef\xd1\xce\x3a\xbf\xee\x95\x7b\x24\xac\xe9\x0e\x3f\x64\x25\x68\xe5\xe6\x2b\x95\x52\xc7\x38\xdc\xdf\x3a\xed\xd5\x1f\x1e\xc1\xd5\xfb\x23\xaf\xdb\xe5\xa3\x1f\xaa\xfc\xb8\xd3\xe0\xf4\x9c\x9d\x77\xba\x39\x32\x3e\x51\xf3\xaf\x82\x70\x98\x45\x7d\xe7\xa7\xaf\x50\x68\x24\x57\x98\x72\x68\xf9\xb4\x4a\x7c\x6f\x3c\xab\x72\x9e\x97\xdb\xb5\x81\x27\x0a\x52\x46\x7a\x72\x11\x22\x03\x5c\x33\x9a\x5f\x20\x39\x35\x10\x5f\xd1\x0a\x32\x75\xe0\x8b\xc8\x95\x98\x9b\x77\xa3\xd7\x46\xbc\x31\x18\x09\x20\x6e\x4a\xdd\xa5\x9b\x8c\xb7\xa1\xfd\xf9\xe5\xc5\xb8\xfd\x13\x52\xc6\xbd\xb8\x9f\xa4\xd1\x8e\x6b\xe4\xce\x37\x1b\x99\x36\xd9\x05\x26\x44\x76\x01\x83\x16\x35\x61\x29\x74\x64\x88\x84\x81\x8d\xc0\x11\x5d\x5c\x82\xe5\x51\xec\xac\x53\x3e\x69\x52\x8a\x42\xd7\x21\x2f\x6a\x5e\xf2\xc2\x5c\x9a\x03\x0f\xc6\x99\xe7\x80\x42\xb3\x33\x0f\x91\x33\x53\x28\x89\xff\x0a\x9f\xe2\x12\x3e\xe3\x08\x61\xa4\x20\xb8\xfc\xb2\x03\x69\x9d\x43\x0a\xdc\x81\xd9\x21\x1d\x3b\x0f\x0a\x56\xf9\xdc\xe4\xcc\xd8\x5b\xf8\x9e\x6f\x21\xc1\x1e\x3d\xea\x29\x3f\x52\x49\xd5\xd9\x9c\x42\xfe\x7a\xf9\x7e\x04\xe9\x06\xb8\xef\xae\x03\x19\xd6\x5f\x40\x75\x02\x09\x40\x82\xf5\x97\x11\xf4\x0c\x85\xa0\x9c\x19\x7a\x00\xd7\x68\x70\xea\x92\xb2\x05\x2e\xd0\xe0\xd8\x85\x1d\xc4\x70\x11\xa4\x5e\x61\xa4\x80\x33\xf1\x32\x14\xf0\x16\xc3\x43\x42\x04\x58\xd8\x8b\x21\x29\xf0\xc6\x3f\x8b\x93\xbb\x69\x69\x87\x1e\xf8\x1f\x12\x78\x7a\xca\x97\x62\x65\x86\xc2\x8b\x38\xf0\x68\x0b\x18\xc7\x1d\xec\xff\xe6\x87\x1d\x21\xa7\xa3\x1e\x4f\x0a\xb8\xfb\x4e\x86\xcd\x70\xdb\x3d\x8b\x09\x21\x65\x2b\x77\x48\x1e\x10\xf4\x1c\xbf\x4b\x20\x30\x10\xb9\x93\x5d\x84\x7a\x43\x09\x93\x5a\x4d\x5e\xa7\xa1\xd7\x0a\xd3\x34\xa0\x95\x7e\x46\xfc\xd0\xb3\x76\x9e\x91\x24\xe8\x5d\x6f\xef\x34\x1b\xc0\x23\xfc\x15\x25\xa5\x93\x1b\xbf\x13\x66\x86\x20\xd4\xe9\x1c\xb5\xb7\x3a\xaa\x0d\x2e\xe0\xab\x38\x4f\x88\x6e\x84\x8d\x8e\xb0\x89\x74\xdc\x28\x4f\x25\x18\x78\xdd\xc4\x91\xe1\x7b\xef\x57\x17\x71\x6c\xf0\x8a\x7c\xd4\x99\x4e\xaf\x54\xbc\x50\xa7\xde\x5c\xea\x95\x2a\x80\xc3\x39\xec\x38\x74\x63\x38\xae\x6f\xc4\x7b\xd3\x1d\x46\x9d\xc8\x51\x51\x4f\x12\xa6\x38\x32\x1a\xac\x1c\xb2\x81\xc1\x84\xf9\x21\x67\x68\x3a\xa5\x32\x70\x3a\xa6\xc6\xd4\x79\xdd\x93\x8b\x6a\xda\xd9\xaf\x28\x69\x34\xa2\x2b\xd5\x42\x9c\x8e\xb6\x8e\x25\x68\x5c\x5f\x72\x8e\x38\x87\x9c\x44\x32\xd7\xda\xa7\x86\xbf\xd2\x7e\xbe\xd1\x01\x8a\xdb\x03\x21\x6d\x36\x7a\xbd\x81\x87\xaf\xb2\x56\x61\x64\x9b\x83\xf1\xf2\x8b\x78\xcd\xf9\x39\x86\xc0\x2b\x42\xe9\x20\xf7\x39\xe2\x13\xa1\xd4\x25\x24\xc0\xd9\x2e\x85\xd3\x66\xdd\x61\x48\x97\x1f\x8e\x16\xaf\xb3\x50\x41\x19\xa2\x8b\x94\x5a\x62\x0b\x65\xe6\xb1\x71\x1c\x99\x88\xe3\x25\x24\x7c\x8f\x6a\x0b\x88\x24\x53\x14\x5c\x37\xb5\xec\xd7\x64\x0a\x71\xde\xaf\xe1\x1d\x6b\x57\xa0\x06\xd6\x52\x65\xa7\x46\x64\x36\xc7\xe7\x06\x82\xc3\x13\x7a\x39\x34\xbc\x60\x43\x7a\x9e\x99\x12\xe0\x4f\x94\x15\xb8\x00\xff\xa2\x64\x89\x3d\x53\x04\x82\x3b\xa6\x12\x10\xd7\xf1\xde\x02\x64\xf2\x81\xe0\xaf\x2e\x66\x80\x73\xd1\x38\x2e\xa1\x20\x12\xcf\x2e\xa1\x00\x45\xcc\x62\xce\x28\x86\xe4\xa9\xeb\x3b\x7b\x81\x2c\x9a\x1e\xdf\x0a\x08\xff\x3e\x48\x77\x1b\xfd\x43\x8a\xdb\x31\x4e\x73\xcd\x46\xb5\x43\x87\x42\x0d\xfe\x4c\xf0\xea\x8b\x67\x53\x1c\xd8\xbe\x9c\x01\xd1\x59\xec\xe0\x38\x3c\x4b\xf8\x59\x00\xa8\x2f\xaa\x19\x32\xab\xbc\x5f\xf1\x9b\xcc\x60\x12\x1a\xcb\x3e\xa5\x83\x01\x65\xfc\x15\xa6\x64\x30\x33\x61\x19\x62\xd3\x49\xce\x45\x11\xfd\x68\xfd\xb1\x7a\x9e\x88\x8a\x3d\x69\xd8\x81\x83\x1e\xe8\xa6\xbb\x82\x91\x73\x0d\xc3\x42\x8c\x26\x8c\xa4\x5c\xc7\xd8\x3d\x10\xac\x09\x21\x29\x8e\x4f\x84\x27\x17\x0a\xe2\xdc\xc2\x0c\xc5\x5a\x55\x17\x18\x0a\xd9\xe1\x91\x1f\x3e\x82\xc4\x12\xf3\x5b\x55\x40\xbc\xa0\xcf\x02\x46\x1b\x54\x96\x60\x16\x0a\x6c\x6f\x30\x8d\x50\x66\x1e\x43\xac\x7e\x44\x60\x0a\x00\x07\xaa\xbe\x1b\x4a\x19\x43\x72\xcd\x00\x74\xde\x75\x93\xd1\xc8\xe5\xa3\x3c\x0d\x1e\x3f\xc9\xdc\xba\xb2\x3e\x8d\xa7\x91\xb3\xec\x0e\x56\xf1\x62\xd2\xda\xa8\x43\xa4\x19\x61\xff\xa7\x87\xec\xcc\xab\x4f\x38\xf6\x9f\x39\x4e\x08\x99\x34\xb0\x25\x51\x66\xbd\x5b\x84\x73\x3c\x81\x28\x84\x55\xaf\x4c\xf6\x9e\x18\x7e\x15\x85\xc0\x1d\x10\x23\x16\x9f\x7c\xfa\xf1\xb3\xe3\x90\xc5\xde\x66\xf8\x3e\xfd\xf4\x39\xa0\xfc\xf4\x87\xcf\x88\x95\x5e\xa7\x27\xac\xe9\xe9\xdd\xac\xc4\x8f\x9f\xdd\x53\xd7\x37\x4f\xc7\x65\x85\xf4\x23\xb0\x90\xf9\x3f\x12\xe2\x9d\xec\x55\xcd\xf1\xad\x68\x51\x62\xb2\x76\xd6\x50\x8c\x3b\xe5\x14\x84\x36\xa3\x67\xdc\xe2\xeb\x2b\xd4\x22\xfe\x1e\x8d\x0f\xf6\x72\xbe\x8b\x69\xc8\x68\x9c\xf1\x49\xbc\x33\xf1\x1b\xc6\xb8\xa5\x27\xf2\xb2\x02\x4f\xd1\x1e\xe0\x29\x16\xfd\x37\xe8\x68\x40\xf0\x5b\x05\xf1\x71\x13\x02\x0c\x97\xfb\x2d\x08\x30\xb0\x6e\xc2\xc0\x81\x76\xbf\xa9\x11\x14\xe9\x36\x35\x03\x13\x54\x2b\x40\x83\xfe\xf5\x88\x70\x3c\x46\x81\x84\x7f\xe3\x05\x58\xbc\x1f\x9c\x23\x84\x87\xf9\x8e\x8e\xce\x04\x1d\x0e\xd2\x37\x63\xa3\xa1\x1a\xa3\x8b\x23\xf6\xcd\x08\xe1\x81\xc0\x09\x3e\x7a\x33\xfa\xdb\x3b\x8b\x83\x17\xdf\xf7\xe6\x51\x33\x6a\x1f\x1f\x07\xff\x57\x37\x0d\x91\x98\x58\x07\x13\x12\xc6\x4f\x9b\xfb\xa7\xb4\xb9\x67\xd1\xf1\xe6\x86\xd0\xd8\x5e\xae\xb3\x9d\x2d\xd7\x45\x67\xa1\x89\x50\x86\xfa\x39\xdd\xfb\x39\x42\x76\xd6\x06\x94\xdc\x38\xc0\xf9\x8d\x2d\x83\xe0\xdf\xb4\xc5\x31\xe2\xf7\xe4\xa1\xc5\xb9\x0d\x9d\x3f\x51\x4c\x21\xc1\xc9\x1d\x23\x0b\xa3\xf7\xaf\xce\x02\x12\x52\xac\xaa\xa8\x31\x06\x5c\xa7\x3a\xc3\xcc\x83\xbe\x53\x99\x46\xfd\x0b\xc3\x7a\xb4\xc2\x78\xf5\x47\x15\xc2\x53\x6e\x34\xea\x59\xc5\xdf\x36\xf6\x45\x6d\xd5\x27\x6f\x6d\xf7\xb9\x92\xeb\x30\x13\x72\x6d\xab\x90\x4b\x71\x39\x00\xd0\xd8\x7d\x85\x9f\xe1\xd7\x8f\x81\x90\xff\x48\x4f\x92\x88\x13\x57\xfd\xb8\x85\x04\x7c\xe3\x19\x12\x36\x90\xb0\xb1\x03\xbc\x30\xf7\x63\x0b\x9f\xad\x3c\xc0\xd7\x1e\xbe\xf6\x4a\xdd\x62\x61\x60\x10\x7e\x14\x5b\x6b\xfc\x06\x52\x0e\xf0\x7d\x50\x92\xde\xa7\xc3\xa7\x4f\xce\xc2\x11\xc1\x1f\x27\xae\xc2\xea\x28\x9d\x3f\x4e\x5c\x15\x6a\xa5\x54\xfc\x79\xe2\xaa\x56\x1e\x28\x09\x7e\x9d\xb8\x2a\x54\x4f\x49\xf8\xf3\x04\xf8\x3a\xbf\x61\x84\xf8\xfb\xc4\x55\xa1\x1d\x94\x88\x3f\x4f\x5c\xd5\xcb\x7d\x9d\xda\x45\xbf\x20\x35\xb5\x8a\x7e\x55\xd5\xa7\xb6\xb7\xbb\xdf\xad\x51\x9f\x2b\xbe\xcc\xde\x2a\x47\xb6\xf9\x2f\x7a\xbb\x63\x97\x1c\xd5\xe3\x05\x27\x3c\x9e\x0b\x2f\xbd\x74\x56\xb6\x8b\x8a\xc2\xbb\xd5\xda\xec\x86\xa8\xe6\x27\x3b\xa8\xc7\x9e\xc0\xd2\xf3\x27\xe8\xbc\x7f\xd8\xa9\x45\x05\x57\x5c\xde\xda\x7a\x09\xdc\x3c\x5c\x6e\x81\x85\xdb\xf7\x7f\xff\x3b\xc0\xeb\xdf\xd5\x3f\xfe\x21\xde\xfe\xf2\x83\x50\x5f\x1a\xa5\x5a\x27\xb6\x64\x75\xcb\x60\x5b\xf9\xe5\x65\x01\xb9\xa8\xc8\x13\x9e\xcc\x3c\xd1\x13\x1e\xaa\xaf\xfe\xbf\x00\x00\x00\xff\xff\xee\x19\x97\x59\x96\x02\x01\x00" +var _confLocaleLocale_enUsIni = "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\xbd\xeb\x72\x1c\xb9\xb1\x30\xf8\xbf\x9e\x02\xa3\x13\x0c\xcd\x44\x50\xad\x98\xf1\x77\xbe\xdd\x98\x10\xe5\xe5\x50\xa3\xcb\x39\x94\xc4\x43\x4a\xf6\xe7\xd5\x2a\x6a\xd0\x55\xe8\x6e\x98\xd5\x40\xbb\x80\x62\xab\xc7\xe1\x37\xd8\x07\xd8\xe7\xdb\x27\xd9\x40\x5e\x70\xa9\xaa\x26\x25\xfb\xec\x1f\xb2\x0b\x48\x24\xee\x89\xcc\x44\x66\x42\xee\x76\x75\xab\x5c\x23\xce\xc4\xb9\xd8\x49\x6d\x3a\xe5\x9c\x70\xaa\x5b\x3d\xd9\x58\xe7\x55\x2b\x5e\x69\x2f\x9c\xea\xef\x74\xa3\xaa\x6a\x63\xb7\x4a\x9c\x89\xd7\x76\xab\xaa\x56\xba\xcd\xd2\xca\xbe\x15\x67\xe2\x05\xff\xae\xd4\x97\x5d\x67\xfb\x00\xf4\x2b\xfe\xaa\x36\xaa\xdb\x85\x32\xaa\xdb\x55\x4e\xaf\x4d\xad\x8d\x38\x13\x37\x7a\x6d\xc4\x1b\x83\x29\x76\xf0\x9c\xf4\x7e\xf0\x98\x36\xec\x38\xe9\xe3\xae\xea\xd5\x5a\x3b\xaf\x7a\x71\x26\xae\xe9\x67\xb5\x57\x4b\xa7\x7d\xa8\xe9\xcf\xf8\xab\xda\xc9\x75\xf8\xbc\x92\x6b\x55\x79\xb5\xdd\x75\x12\xb2\x3f\xd0\xcf\xaa\x93\x66\x3d\x20\xcc\x25\xfd\xac\x9a\x5e\x49\xaf\x6a\xa3\xf6\xe2\x4c\x5c\xc0\xc7\x62\xb1\xa8\x06\xa7\xfa\x7a\xd7\xdb\x95\xee\x54\x2d\x4d\x5b\x6f\xb1\x53\x1f\x9d\xea\x05\xa5\x0b\x69\x5a\x11\xd2\xa1\xc1\xaa\xad\xb5\xa9\xa5\xa3\x56\xab\x56\x68\x23\xa4\xab\x00\x95\x91\x5b\x2e\x1d\x7e\x56\x6a\x2b\x75\x17\xc6\x28\xfc\xaf\x76\xd2\xb9\xbd\x85\x81\xbc\xa2\x9f\x55\xaf\x6a\x7f\xd8\x29\xe8\xf0\x93\x0f\x87\x9d\xaa\x1a\xb9\xf3\xcd\x46\x86\x66\xe2\xaf\xaa\xea\xd5\xce\x3a\xed\x6d\x7f\x00\x38\xfe\xa8\x6c\xbf\x96\x46\xff\x2e\xbd\xb6\x61\xac\xdf\x67\x9f\xd5\x56\xf7\xbd\x0d\x03\xf9\x16\x7e\x54\x46\xed\xeb\x80\x47\x9c\x89\x77\x6a\x9f\x63\x09\x39\x5b\xbd\xee\x71\x14\x43\xe6\x5b\xf8\x0a\x58\x30\x8f\x30\x61\x56\xc4\xb6\xb2\xfd\x2d\xa5\xbe\x0c\x3f\x47\x28\x6d\xbf\xa6\xdc\xb2\x5d\xd2\xc8\xb5\xa2\xdc\xb7\xf0\x51\x00\xb8\x4a\xb6\x5b\x6d\xea\x9d\x34\x2a\x0c\xdd\x79\xf8\x12\x57\xe1\xab\x92\x4d\x63\x07\xe3\x6b\xa7\xbc\xd7\x66\x1d\xe6\xe0\x1c\x93\xc4\x0d\x25\x55\x59\x5e\x4c\x3b\xd8\x21\xce\xb2\x38\x13\x7f\xb1\x43\x2f\xae\xf0\x13\xf3\xb2\x42\x90\x19\x4b\x56\xb2\xf1\xfa\x4e\x7b\xad\xb0\x32\xfe\xa8\x76\x43\xd7\xd5\xbd\xfa\xdb\xa0\x9c\x0f\x59\x57\x43\xd7\x89\x6b\xfa\xae\xb4\x73\x03\x94\x78\x03\x3f\xaa\xaa\x91\xa6\x81\xee\x5c\xc0\x8f\xaa\xfa\xa4\x8d\xf3\xb2\xeb\x3e\x57\xf4\x23\x00\xe3\x2f\x1c\x27\xaf\x3d\x34\x96\x12\xc5\x8d\x57\x3b\x17\x06\x5a\xbc\xd4\xbd\xf3\x4f\xbc\xde\x2a\x71\x3d\x98\xaa\xb5\xcd\xad\xea\xeb\xb0\xfd\x60\xe3\xbc\x59\x89\x83\x1d\x1e\xf7\x4a\xf4\x83\x31\xda\xac\xc5\x2b\xbb\x76\x42\x1b\xa7\x5b\x25\x5e\x00\xf4\xa9\xd8\x75\x4a\x3a\x25\x7a\x25\x5b\xf1\x4c\x0a\x2f\xfb\xb5\xf2\x67\x8f\xea\x65\x27\xcd\xed\x23\xb1\xe9\xd5\xea\xec\xd1\x89\x7b\xf4\xfc\xd5\xa0\x5b\xd5\x69\xa3\xdc\xb3\xa7\xf2\xb9\x68\x64\xaf\x56\x43\xd7\x1d\xc4\x52\xad\xc2\x5e\x39\xd8\x41\x34\x1b\x69\xd6\x61\x9f\x1c\xfc\x26\x54\xa8\x8d\xf0\x1b\xed\x44\xd8\xa8\xdf\x55\x61\x94\xb4\x57\x75\xbb\x64\x12\x04\x0d\x82\xe4\x5e\x39\xf1\xf6\x70\xf3\x5f\x97\xa7\xe2\xca\x3a\xbf\xee\x15\xfc\xbe\xf9\xaf\x4b\xed\xd5\x1f\x4e\xc5\xdb\x9b\x9b\xff\xba\x14\xb6\x17\x1f\xf4\x8b\x5f\x16\x55\xbb\xac\x79\x5c\x5e\x48\x2f\x97\xa1\x0b\x71\xae\x42\x26\x6e\xa5\x98\x07\x1b\x2a\x10\x38\x20\x66\xce\xc3\x26\xa5\x0d\x3a\xbb\x1d\xdb\x65\x4d\x7b\x38\xe2\x78\x17\x36\x72\xbb\x4c\x03\x7c\x85\x43\x37\x38\x25\xde\xbc\x7b\xf7\xfe\xc5\x2f\x42\x99\xb5\x36\x4a\xec\xb5\xdf\x88\xc1\xaf\xfe\xf7\x7a\xad\x8c\xea\x65\x57\x37\x3a\x8c\x4d\xef\x94\x17\x2b\xdb\x63\x4f\x17\x95\x73\x5d\xbd\xb5\x6d\xa8\xe5\xe6\xe6\x52\xbc\xb5\x6d\xa0\x69\x7e\x03\x0d\xf1\x9b\xca\xfd\xad\x0b\xe3\x15\x2b\xfc\xb0\x51\x02\x96\x2e\x00\xd9\x15\x0f\x8f\x68\xa9\x8d\x0b\xf1\x6c\xd9\x3f\xcf\xda\x25\x97\xce\x76\x83\xa7\x12\xfb\x8d\x32\x30\x4f\xce\xcb\xde\x0b\xe9\x98\xd0\x2f\x2a\xd5\xf7\xb5\xda\xee\xfc\x21\xcc\x0e\xb5\x61\x8c\x1d\x91\x34\xd2\x18\xeb\xc5\x52\x09\x80\x5f\x54\xc6\xd6\xb8\x53\x03\xd9\x6c\xb5\x93\xcb\x4e\xd5\x48\xc0\x7b\xa6\x48\x7f\x09\x8b\x03\x0b\x12\x84\x28\x20\xc2\x88\x85\x43\x01\xa8\x73\x58\x39\xd2\x08\x40\x2a\x68\xab\xe7\x2d\x64\xba\x10\x67\x0d\x49\x43\x4c\x98\xb4\xb0\xe2\x69\xe0\x35\x73\xbe\xdb\x75\xba\xc1\xaa\x5f\x61\x5e\x5a\x3e\xe1\x88\xa4\xb9\xcf\xe1\x60\xfa\x39\x2f\x5b\x04\x83\x0f\x43\xda\x8b\x82\x06\x43\xf9\x8d\xea\x95\xd8\x0c\x6b\x3c\x38\x3a\x3b\xb4\xdf\x01\x05\xe7\xf1\x4d\x74\x52\x5c\x5b\xeb\x71\xce\x23\x40\xaa\xe2\xbc\xeb\xe0\x54\xee\xd5\xd6\xfa\x30\x70\x54\x2c\xd0\xa2\xbd\xee\xba\xd0\x53\x27\xef\x54\x2b\xbc\xc5\xfd\xd6\xea\x5e\x35\x01\xf1\xa2\xea\x07\x53\xd3\x62\xbf\x1e\x0c\x2e\x78\x4e\x2b\x57\x16\x40\x6d\x07\xe7\xc5\x46\xde\xa9\x30\xf0\x81\x35\xf0\x76\xb6\x9d\xd0\xa5\x7e\x30\xb0\x85\x17\x55\x6b\xb7\x12\x8e\xf9\x17\xf0\x83\xbe\x73\xfc\xda\x09\xb9\x5a\xa9\xc6\x3b\x71\x73\xf3\x5a\x34\x9d\x35\x4a\x7c\xbc\xbe\x74\x61\x1b\x6c\xea\x9d\xed\x81\x25\xb8\x79\x2d\xae\x6c\xef\x63\x5a\x36\xd0\x01\xc2\x0c\xdb\xa5\xea\xc5\x7e\xa3\x9b\x0d\x0e\x7b\x28\x11\x56\xb1\xea\x85\x76\x62\x70\xda\xac\x4f\x45\xa7\x42\x0f\xb4\xc7\x05\x10\xfa\xc0\xab\x2e\x80\xaf\x94\xf4\x43\xaf\xe0\xd0\xaf\x97\x83\xee\xbc\x36\x75\xa8\x90\xf0\x00\x59\x10\xbf\x60\x06\x94\xb8\x81\x8c\x23\xf0\xf5\xce\xee\x90\x79\x81\x5d\xb5\xcc\xca\x11\xc2\xb0\xe5\xc3\x04\xda\x9d\xc2\xf5\xee\xa8\x49\x61\xc1\x0d\xda\x6d\xc4\xaa\xb7\x5b\xe1\x0e\xce\xab\x2d\x14\x6c\xa5\xda\x5a\xb3\xa8\x36\xde\xef\x78\x6c\x5e\x7f\xf8\x70\x85\x83\x13\x53\xef\x1b\x1d\x99\xad\x5d\x58\x25\x5d\x60\xa3\x8c\x08\x68\xc3\x32\x1e\xfa\x6e\xb4\xc2\x3f\x5e\x5f\x72\xce\x91\x99\x0b\x4d\x78\x1a\xfe\xdc\xa4\x09\x84\x95\xe0\xec\x56\xed\x61\xbd\x6b\x23\x80\xd9\x59\x54\x9d\x5d\xd7\xbd\xb5\x9e\x97\xfb\xa5\x5d\xe3\x12\x2f\x32\x52\x4d\x2f\x78\xd1\x86\xc1\xd9\xf7\x81\xd5\xeb\xec\x1a\x08\x5e\x18\xaf\x45\xa5\x0c\x90\x96\xc6\x1a\x67\x3b\xc5\x94\xf3\x57\x48\x15\x17\x98\x8a\x44\x74\x06\x32\xce\xd2\x9b\x40\x59\x5a\x0d\x3d\xf6\x16\xe9\x69\x00\x38\x15\xb2\x73\x56\xec\x7a\x6d\x7c\xa8\x18\xe6\x88\x30\x2c\xaa\xca\xee\x42\x89\x8c\x86\xbc\xa7\x84\x44\x38\xa0\xdf\x31\x1f\x58\x3d\x58\x39\xba\xc9\x0e\x27\xb7\xf5\xbb\x9a\x4e\xa2\x9b\xb7\x1f\xae\xf0\x38\x82\x54\x58\x04\x67\xe2\x65\x6f\xb7\x29\x21\x8d\xcf\xdb\x80\x0f\x60\x64\xdb\xf6\xca\xb9\x53\x71\xfd\xf2\x42\xfc\xfb\x1f\x7e\xfa\x69\x21\xde\xf8\x40\xf6\x02\x25\xf8\x6b\xd8\xc1\x92\x66\x21\x81\xda\x5e\xf8\x8d\x12\x8f\x02\x19\x7b\x24\x9e\x41\xee\xff\xa1\xbe\xc8\xed\xae\x53\x8b\xc6\x6e\x9f\x87\x55\xba\x95\x7e\x51\x85\x1c\xd5\x33\xd1\xb8\x51\xa6\x55\x3d\x31\xae\x94\x95\x91\x5e\xca\xce\xd8\x58\xe4\xd6\xc3\xd8\xaf\x74\xbf\x4d\x13\xc4\x7c\x7c\x98\xa9\x90\xc3\x5c\xa0\xee\x6a\x63\xbd\x5e\x1d\x12\x28\xf4\xf4\x5d\x48\xa4\xa5\x59\xd1\x4e\xa3\xe3\x2a\x8e\x31\xee\x4b\x58\x81\xef\xfd\x46\xf5\x3c\xdc\x2e\x8d\xb7\x5d\xad\x02\xd3\x32\x5a\x2d\xef\x31\x15\x57\x4b\x0e\x12\x97\xc9\x0b\x22\x18\x17\x2f\xde\x09\x75\xa7\x4c\x58\xd8\xbb\xde\xb6\x43\x03\x2b\x87\x57\x4c\x27\x7a\xe5\xec\xd0\x37\x8a\x16\x6a\x24\xc8\xa1\x69\x81\xea\x37\xb2\xeb\x0e\x8b\x8a\x0f\xc6\x75\x2f\xef\xa4\x97\x7d\x56\xc5\x2b\x4e\xa2\xd6\x4f\x60\x27\x8d\x8a\x25\x42\xcf\x9b\xc1\xf9\x40\x3d\xa0\x15\x0e\x1b\x85\xd9\x4e\xc8\x5e\x89\x61\xd7\x59\xd9\xaa\x56\x2c\x0f\x40\xe3\x5d\x58\x0b\xad\x5a\xc9\xa1\xf3\x8b\x6a\xa5\xda\x40\x94\x54\x5b\x53\x5d\x9d\xb5\xb7\x50\x19\x0d\xd5\x4b\x06\x10\xe7\x84\xf4\x12\x20\x8e\x95\x8c\x8d\xa5\xf2\x11\x2c\x36\x8a\x6a\xf0\x16\x58\x94\x94\x6f\x77\xca\x50\x37\x98\x31\x11\x81\xef\x68\x85\x35\xa2\xd3\x4b\xea\x74\x1a\xcb\x11\x93\xc1\xa3\x73\x13\xa4\xd9\x3c\x6f\xb6\xc0\x64\x50\x61\xc1\xbb\x71\xd9\x53\x61\x4d\x77\x20\x66\x24\x6c\x31\x14\x20\x99\x2f\x71\x89\x2c\x45\x71\x8d\x29\x12\x49\x6d\x65\x7e\xac\xf6\x1a\xd9\x5e\x71\x27\x3b\xdd\x06\x8c\x8c\x20\x9c\x16\xf3\x6d\x59\x54\xc4\x2b\xd7\x24\x57\xd7\x77\x1a\xe4\xd8\xb8\xc5\x10\x25\xc9\xda\x61\x84\xff\x14\x00\x82\x80\xec\x66\xcb\xc6\xd6\xbc\x0f\x9d\x74\x51\x8e\xc5\x75\x12\xba\x0b\x35\x04\xfe\xdd\x9d\x8a\x3b\x0d\x6c\x00\x2d\x72\x18\x97\x65\xe0\x31\x3b\x15\xaa\x72\x4a\x01\x06\xa1\xcd\xd3\x61\x87\x65\x16\x24\xc4\x91\x5c\xc5\x7c\x7f\x60\x07\x5b\x6b\x1e\x7b\x61\x14\xb2\x2d\x3c\xaa\x23\xb6\x4f\xf4\x7a\xbd\xf1\xc2\xd8\xfd\x82\xb8\xdf\xde\x79\x1c\x1d\x90\x2d\x14\xb5\xd4\x43\x23\x78\xef\xc9\xc1\xdb\x40\x5f\x60\xeb\x89\x75\x2f\x0d\x2c\x3f\x46\xac\x5c\x6c\x57\x64\x08\x21\x6f\x22\x43\x22\xd0\x58\x98\x9f\xf0\x9f\x91\xfa\x11\xd1\xcb\xf3\x88\xda\x25\x18\x2c\xcd\x0a\x01\xac\x18\xa9\x2b\x09\x80\xf5\xda\x82\x00\xca\x02\x5f\xe0\xb0\x2a\xaf\x9c\xaf\xd7\xda\xd7\xab\x40\x82\x03\xe2\x97\xf8\x23\xb0\x7c\xca\x79\xf1\x78\xad\xfd\x63\xd1\xd8\xed\x56\x9a\xf6\x67\x71\x72\x47\xd2\xc3\x1f\x02\x75\x0d\x3b\x54\x77\x30\x46\x24\xd8\xf6\x0a\x85\x84\x3b\xd5\xbb\xb0\x7b\x5a\xab\x9c\x08\x5c\xb3\x1b\x76\xc0\x6f\x44\xc9\x8b\x04\xc4\xd6\xee\x4d\xa0\x23\x30\xe8\x76\xb5\xd2\x8d\x96\x9d\x58\x6a\x23\xfb\x43\xc4\x02\xa7\xd3\x89\x3b\x15\xef\xde\x7f\x00\xc0\xb5\x0d\xec\x50\xcb\x00\x8b\x4a\x1b\x58\xef\x41\xca\xa0\x35\x91\x8b\x58\x9c\xa4\xb1\x2d\x8d\xed\x03\x4b\x00\xbd\xe1\x82\x47\x18\xe8\xc0\x4f\xa0\x7c\xa2\x83\x88\x0b\xb0\x50\x2e\xf2\xba\x61\x18\xb6\xd2\x37\x1b\xe2\x84\x71\x11\xb9\xb0\x08\x43\x4b\x9b\xa1\xef\x95\xc1\xb5\xf5\xb3\x38\x71\xe2\xc9\x73\x71\x92\x1d\xd7\xf5\x56\xbb\xc0\x5c\x46\x4e\x95\xcf\x6e\x01\x09\x94\x5b\x9c\xcf\xa9\xb7\xf9\xf1\x0e\x05\xc3\x19\x2f\x56\x5a\x75\xed\xb8\xbd\x81\x91\xc7\xc3\x73\x3d\x37\xd7\x21\x5b\x60\xf6\x80\x44\xa1\x18\x9d\x62\xb7\xc5\xe5\xc5\x9b\x29\x1b\xde\xbc\x4a\x5e\x77\x6e\x40\x96\xff\x4c\xfc\x59\x75\x8d\xdd\xaa\xef\xc4\x9f\xd5\xe3\x5e\x89\x75\x07\xf3\x2e\x3d\x09\xf9\xd6\x29\x58\x95\xa7\x28\x29\xac\x06\x03\x07\x91\x97\xb7\x0a\xf4\x02\xa9\xe3\x73\x3c\xe0\xd1\xa9\xaa\x3e\x6d\xec\x56\x7d\xae\x06\x94\xb0\x6c\xd7\x46\x19\x1d\xb6\xa0\xed\x91\xa9\x89\x02\x7b\x82\x89\xbb\xcb\xed\xb5\x6f\x36\x75\xd4\x55\x86\xa1\xf4\xea\x0b\xcc\x18\x64\x25\xd5\x65\xd8\x9a\x21\xab\xda\x1e\x60\x55\x85\x8e\xbf\x3d\xa4\x45\xa5\x95\xab\xdc\xc6\xee\x41\x15\x18\x21\x6e\x36\x76\x0f\x4a\xc0\x42\x0e\x5b\x2c\x16\x55\x63\xbb\x4e\x2e\x6d\x98\x95\xbb\x04\x7f\x91\xa7\x96\xc8\xb7\x87\xda\xf6\x6b\xaa\xb6\x54\x7d\x6d\x0f\xa4\x6d\xa3\x5c\xd4\xb6\xb9\x0a\x68\x36\x29\x65\x81\xb4\x9f\xb8\x8a\x94\x4c\x0b\x6d\x6a\xd0\x61\x71\xcd\x6f\x0c\x4a\x48\x79\x3b\xab\xea\x13\x29\x6c\x3f\x57\x0c\x57\xb4\x09\xc9\x29\x0e\xba\x2b\xf4\x8a\x6e\xa4\x58\x74\x95\x53\xb2\x87\xed\x74\x03\x3f\xaa\xea\x93\x1c\xfc\xe6\x73\xa6\x62\xad\x79\xe5\xb1\xaa\x15\xd4\x80\x44\x66\x13\xaf\xb8\x51\xbb\xc0\x56\x6e\x1d\x2c\xd9\xae\x57\xb2\x3d\x90\x10\x1a\x17\xef\x1f\xf1\x54\xd3\x26\x1c\x06\xdf\x55\xce\x06\xfa\x53\x7f\x23\x8a\x5f\xb4\x69\xb1\x7c\xc9\x11\xa0\xee\x77\xbb\x83\x65\x62\xfb\xfe\x70\x5a\xaa\x27\x36\xd2\x89\xa5\x52\x86\xc5\xc8\x76\xc1\xca\x9f\xb0\xbc\x64\x83\x24\x04\xb4\xd3\xb0\x03\xb1\xa4\x9d\xb0\x2a\xa1\x85\x48\xf7\xa9\x16\x3c\x06\x1c\x73\xad\x81\x5d\xfb\xe6\x2a\xc2\xa0\xd7\xc4\x36\x9d\x89\xf3\xc1\x6f\x94\xf1\x2c\xd3\xdd\x40\x7a\x05\x6c\x28\xec\xbf\x46\x76\x55\xaf\xb6\x2a\x48\x8a\xf5\x16\xf5\xcd\xf8\x25\xde\xaa\x6a\x65\xfb\x35\xec\x56\xdc\x4e\x67\xe2\x25\x24\xa4\xfd\x15\x00\x94\xcf\x0f\x38\x82\xe0\x94\x3f\xb2\x36\xbf\x36\x76\x0f\x7a\xdf\x70\xf4\x8e\xa7\x71\xd8\xc1\x99\xce\x07\x26\x32\x64\x20\x0b\x38\x65\x7c\x9a\x8c\x73\x61\xd4\x5e\xe4\x50\x34\x64\x71\x46\x02\x7c\x20\x8c\xcf\x96\xcf\x4f\xdc\xb3\xa7\xcb\xe7\xf1\xc4\x6a\x36\xaa\xb9\xc5\x2d\xa0\xcd\xd2\x7e\x01\x25\x13\x71\x0d\x26\x90\x84\x93\x56\x6c\xec\xd0\x93\xa0\x17\x04\x21\xaf\x20\xb7\x98\xfb\x5d\x6f\x89\x63\x68\x60\x63\xc3\x1e\x4b\xeb\x1a\x54\xc1\x61\x65\xc3\xb1\xca\x4b\x7b\xd7\xdb\x8d\x5e\x6a\x1f\x08\x20\xe8\x45\x2e\xe1\xff\x15\x25\xab\x76\x04\x91\x31\x46\x7d\x24\xd7\xda\x89\x5d\x2c\x80\x27\x4b\x67\xd7\x6b\x54\xac\x3e\xb0\x3c\x02\xab\x08\x43\xd9\xe9\xad\xf6\x93\xd5\x1d\xe8\xb8\xa4\x5d\x42\xca\x6b\x9e\x26\xe8\x4e\x1a\xe8\x5e\x35\xca\xf8\xee\x10\xeb\xdb\x4b\xed\xc5\x1f\xc4\x56\x9b\xc1\x07\xc1\x7c\xa3\x8c\xf0\xfd\x41\xc8\xb5\x0c\xd5\x6e\xa4\xab\x07\x43\x33\xa6\x5a\x5e\xef\xaf\x35\xf0\x05\xa1\x5e\xde\x95\x19\x54\x29\xac\x8a\xef\xe3\x64\xfe\xb0\x20\x35\x36\x94\x0a\x67\x75\x68\x8f\x0e\x92\x95\x9c\x5b\x16\xb6\x8f\x1c\x25\x01\x0a\x09\x4b\xc8\x1a\x95\x16\x46\xa7\x9b\x5b\x18\xaf\xe5\xe0\xbd\x0d\x52\x73\x17\x16\x23\x8c\x58\x6c\xf1\x05\x40\x81\x4e\x03\xb0\x85\x3c\x5c\x4d\xe3\x31\xaa\xa0\x58\x80\xf0\xf3\x85\xbf\xef\xd5\x0f\xa9\x78\xdc\x3b\x50\x82\x50\x60\xe9\x6c\x5b\x5d\x43\x26\xde\x50\xf0\xe6\xe3\x53\xb5\x21\x9d\x71\x9c\xcb\xbe\x1c\x0b\xc8\x0f\x3b\x44\x7d\xd9\xe9\x3e\xc8\x4f\x3d\xf0\x53\x50\x7a\x31\xaa\x2b\x29\x18\xa6\x3d\xf6\x65\x8b\xd3\xc1\xeb\xad\xad\xdd\x06\x39\x21\x6e\x9e\xe8\x94\x59\xfb\x0d\xaa\x10\x03\x17\xee\x45\x18\x6f\x2f\xfe\x27\xe8\xbe\x65\xe3\x55\xef\x16\x95\xb1\xa6\x06\x72\x94\x6d\xa2\x77\xd6\x3c\x41\x12\xc5\x62\x15\x2b\x71\xe9\x46\x81\x2b\x0e\xeb\xad\xb7\xc3\x7a\x43\x7a\xc7\x0a\x77\x8f\xdf\xdb\x7a\x25\x1b\x0f\xb7\x53\x1f\xf6\xf6\x09\x7d\x94\xc4\x70\x02\x0c\x63\x40\x83\x39\xa2\x9b\x57\x94\x33\x2d\xa3\x4c\x20\xe3\xbd\x6a\xec\x9d\xea\x0f\x3c\x17\xbf\x86\x54\x21\x85\x4f\x95\x33\x88\x98\xc7\x13\xb3\x8b\x16\x5f\x53\xea\x71\x78\xae\x91\x21\xc5\xc5\x3d\xcd\xcc\x3a\x38\xd3\xc2\xdd\xd1\x4e\x26\x6e\xfb\x48\xa5\xf0\xcd\x14\x64\x70\xb8\xc6\xa8\xd4\xa2\xaa\x3e\x85\x45\xfd\xb9\xa2\x9d\xa2\xb2\xa9\x26\x2a\xc2\x39\xbc\xa3\x90\x6c\x46\x78\x16\x8f\xfe\xa4\x7a\xbd\x3a\x20\x50\x41\x23\x8e\x6d\x98\x72\xbd\xc6\x53\x37\xb1\xb6\xd7\x39\x6d\xa7\xe4\xd5\xd0\x9d\x8a\x3d\xf2\xbc\xa9\x4c\xd4\x4a\x11\x37\x2c\x02\xa5\x80\x3b\xef\xea\xd3\xd6\xb6\xb2\xfb\x5c\x1d\xe0\x6e\xef\x2f\xca\x55\x06\xee\x53\x6d\xb5\xb5\x2d\x16\x7a\x0b\x3f\xaa\xea\xd3\xca\xf6\xdb\xcf\x55\xe0\xa7\xde\x8d\xe4\xc8\xc0\x78\x51\x5a\x26\xc9\x40\xd6\xaf\xf9\x7d\x71\xec\xf3\xd5\x8c\xc8\x79\xad\xd2\xb5\x31\xfc\x8a\x9d\xbf\xb9\x79\xfd\x81\xf5\x64\x37\xaf\xc5\xad\x22\xdc\xaf\xbd\xdf\xb9\x8f\xa0\xfd\x45\x55\xee\xc7\xeb\xcb\xea\x4a\x1e\x82\x74\x87\xc9\xf4\x01\x19\x1f\x94\xdc\x52\x23\xc3\x4f\x44\x11\x36\x0b\x25\x86\x9f\xb6\xcf\xef\x3d\x2a\x10\x3a\x7e\x2d\x04\x5c\x24\x72\xd5\x3b\xb5\xff\xa5\x97\xa6\xe1\xc2\x81\x1b\x5c\x42\x02\x96\xbc\xb0\xdb\xad\xf6\x37\xc3\x76\x2b\x61\x63\xe0\xb7\x70\x98\x40\xd9\x6f\x95\x73\x78\xa9\x4f\xd9\x5b\x4c\xa0\xec\x8b\x8d\xd5\x4d\x96\xdb\xc0\x77\xf5\xa1\x57\x8a\x6a\x7d\xc9\x57\x68\x15\x48\x00\xc8\x9e\xe2\xaf\x2a\x6a\x49\x14\xdd\x75\xff\x36\xb9\x4e\xfa\xad\x92\xdd\x6e\x23\x41\xc6\xc8\xc0\x22\xd9\x0b\x99\x66\xd8\xaa\x5e\x37\xa0\x69\x93\x6e\xf3\xfd\x93\xfa\x87\x9c\x08\x16\x28\x5a\xeb\xbf\x05\x4d\xf8\x8d\x84\xf1\x28\x36\xd7\x3d\xdc\xb4\x53\xc0\x28\x02\xca\x53\x40\x68\x7b\x01\xe5\x4a\xcc\x4e\xff\xce\x63\x01\xa8\xc2\x77\xc4\x77\x12\x20\x40\xe0\x4c\x50\xb1\x3e\xe0\x4b\x82\xf0\xc9\xc7\xc0\x89\x2b\x51\x6f\xe5\x97\x87\x0a\x6e\xed\x4c\x39\x54\xb3\xa7\x42\xa4\x2c\x90\x78\xbc\x95\x64\x62\xf1\x5b\x35\xf4\xf7\x00\x7f\xbc\xbe\x5c\xfc\x56\x69\xd3\x74\x43\x7b\xb4\x21\x6e\x58\x3a\xdf\x07\xb6\xeb\xf1\x89\x7b\x1c\x50\x9a\x5b\x63\xf7\x26\xc2\x7f\xc4\x6f\x01\xdf\x3f\xb3\xe1\x46\xad\x0d\x29\x30\x92\x09\x87\x68\x75\x1b\xb8\x18\x50\x44\x2c\xd2\x79\x9a\x2b\x27\xe2\x2e\x07\xe5\x2e\xa9\x8f\x22\xa1\x0b\x22\x02\xe8\x69\xe4\x56\x2d\x92\xb1\x49\x1d\x98\xe1\x3a\x48\xe0\x26\x17\x99\x03\x13\xc0\x54\x1a\xd8\x65\x80\x58\xe0\x2d\xe3\xb4\xdc\x88\x0c\x1d\x2d\x6e\xfb\xf5\x4c\xe9\xf7\xd3\x1b\xd0\x23\xe5\xbd\x92\xdb\x19\x04\x91\xc0\x1c\x2d\x88\x73\x0f\x85\xe0\xd0\x19\x51\xc8\x69\xb9\x00\xb5\x48\xa3\x14\x07\x3c\x9f\x9b\x5c\xc1\x10\xc7\xb9\x54\x41\x15\x52\x56\xbd\xd5\x8e\x27\xeb\xc3\x06\xd4\x8d\x39\xeb\x10\x35\xd8\x9d\x6a\x02\x57\xcd\x4b\xce\x81\xcc\x1a\x52\xc0\x3e\x80\x95\x97\x8b\x0a\x8e\xea\x1e\xec\x89\x32\x1d\x17\x69\x1d\xe9\xbc\xdc\xca\x5b\x25\xdc\x10\x58\xb3\x8d\xf4\x24\xa5\x94\x93\x15\xb8\x64\x40\x85\x75\xc6\x96\x4f\xd0\xdb\xbd\x09\xc7\xdb\x43\xf8\x01\xec\x1b\x51\xe7\x4a\xd1\x29\x62\x42\x1e\x81\x8e\xa1\x8d\xfa\x3a\xf5\x45\xc3\x45\xd9\x2b\x7d\xa7\x48\x63\x17\x15\x95\x90\xb7\xa8\x3a\xe9\x7c\x1d\xd6\x23\x36\x17\xc4\x59\x7b\x17\x36\x6b\xa8\x2f\xe4\x8a\x3e\xac\x1a\x30\x80\x01\x0c\xa8\xa2\x33\xd4\xbf\xb0\x14\xe3\x14\x75\x9d\xdd\xab\xf6\x54\x84\x55\x64\xca\x1b\x7d\xa0\x08\xb2\xdb\xcb\x83\x23\x09\x86\xe9\x9a\x35\x34\x56\x8b\x2a\x29\xfc\xdc\xa6\x0e\x07\x6e\x64\xd2\xef\x02\x23\xc3\x2b\xc4\xae\xd2\xdd\x75\x80\x42\x3d\xdf\xcf\xe2\xc4\x55\x03\x5e\x16\x00\xf8\x21\x43\x03\x96\x32\x74\x12\xdd\x65\x4c\x11\xa1\x38\x0d\xa2\x8c\xd0\xfe\xb1\x0b\xeb\x6c\xd8\xa2\x08\xb4\xa4\xdb\x85\x28\xbb\xb5\x76\x58\x76\xea\x09\x4a\xc6\x9a\x57\x75\x54\x33\x8e\x78\xe0\xd8\xac\xbb\xaa\x72\x5e\x77\x5d\x18\x63\xb6\x1d\x2b\x24\x55\xc8\x85\xcd\x07\x03\xe1\x36\x7a\x27\x2c\xdc\xcc\xe5\x83\x94\x16\x6c\x26\x08\x7a\x2b\x5a\x05\x92\xb7\xed\x85\xef\xa5\x71\x2b\x05\x57\x95\x5b\x54\xf6\x2f\xa8\xea\x20\x57\xa2\xad\xd8\x91\x9a\x51\x89\x01\x55\xe7\xa7\x0e\xcc\x4e\x36\x91\x65\xd5\x68\x28\x00\xf7\x61\xd0\x06\x18\xd3\x84\xc9\x71\x1b\xc2\x02\x9b\x0c\x01\x5c\x8d\x17\x8b\x64\x76\x1c\x56\x85\x06\x0e\xeb\x87\xd5\xf4\x40\xbf\x2b\xb4\xc5\xaa\x91\x41\x2a\xf6\xc3\x07\xc8\x61\xd6\x69\xbc\x25\xaa\x4f\x61\x9d\x7f\xae\x50\x76\xaa\xe3\x7d\xe3\x05\xca\x52\xc8\x71\x43\x62\xf5\x57\xab\x4d\x0d\x97\x67\xff\x61\xb5\x81\x9b\xb6\xaa\xb0\x2f\x19\xa9\x07\xc9\x0a\xee\x00\x86\x2f\xcb\x4e\x37\x6c\x0a\x77\xa8\x56\x16\x76\x0f\x68\x0f\x5f\xf2\xef\xca\x79\x19\x08\x04\x59\x47\x84\x5f\x85\x3a\x12\x0b\xa1\xae\xfa\x25\xff\xa6\xd4\x98\x54\x0d\x26\xa6\x7c\xa4\x9f\x55\x15\xf8\xea\x05\x10\xf5\x20\x0a\xc0\x65\x6b\x46\xca\xc3\x49\x1d\xb6\x35\xe7\x2d\x32\xf8\x9d\xf4\x5e\xf5\x06\x2f\x46\x70\xcb\xe7\x45\x29\x3b\xa2\xc8\x28\x43\x18\x5b\x36\x11\xfc\x5c\x25\x43\x42\xb6\x21\x9c\xbb\x13\x8a\xc3\x8f\xd7\xa7\x15\xed\x69\x47\x6c\xf9\x7f\xaa\x83\xab\x9c\x6a\x86\x1e\x87\xf5\x86\x7e\xce\xab\x67\x49\x5f\x3c\xb2\x93\x4c\x36\x1c\xae\x34\xe9\x70\x15\xad\xb1\x33\xf1\x02\x7f\xb0\x82\xaa\xda\xc1\xf4\x65\xc6\x90\x34\x9f\xb1\x2b\x64\x0b\x9b\x2b\xa6\x4a\x2d\x8d\x76\x02\x91\x00\xa3\xc2\x77\x6f\x70\x2c\xaf\x6c\x2f\xa4\x39\xa4\x5b\x3c\xd5\xc1\xc1\x67\xb2\x3b\x7d\x77\x0a\xe5\x02\xd8\x5e\x2d\xf9\xa2\x37\x59\xc8\x6c\x65\xab\xc4\x9d\x96\x51\xb1\x95\xb1\x4b\xf1\x3c\x67\x65\x69\xa1\x43\x00\x31\x08\x15\xd9\xcc\x2d\xf1\x34\x7b\xcb\x1a\x05\xbf\x51\x1a\xef\x59\x0d\x70\x52\xab\xa1\xeb\xf8\x4c\x7c\x39\x74\x1d\xda\x7b\x4d\x6d\x8e\x43\x15\x74\xdf\x7c\x49\x3f\xab\x61\xd7\x06\xa1\x35\x8d\xe5\x47\x48\x88\x63\x59\xe6\x67\xc2\x28\x8c\x2a\x17\x8b\x2a\x4d\x04\x6f\x33\xe9\xb4\x3b\x2c\x78\x37\xcf\x58\x17\xd3\xc6\x6e\xc7\x20\x49\xeb\x07\x94\x8a\x3a\x0e\x13\x85\x06\x3d\x30\xb4\x7b\x79\x10\x1b\xbb\x17\x9d\x36\xb7\x8e\x66\x2a\x8c\x53\x2e\x98\x83\xa2\xd6\x6b\x33\x28\x12\x95\xc2\xcf\xa9\x2d\x2b\x19\x00\x90\x39\xc0\xf2\xc0\xda\x30\x34\x18\xa0\x0d\x20\x96\x07\x01\xd2\xe0\x71\xcb\x83\xb1\xc9\x01\x5b\x1c\xf0\x4d\x3a\x18\x3c\x24\xba\xf6\xd1\x29\x71\x81\x46\x10\xb4\xc7\x9a\x8d\xb5\x8e\x6e\x20\x12\xf5\x0b\x69\xa0\x0c\x24\xe2\x47\xd3\x92\xf0\xe0\xac\x9d\xb3\x31\x06\xec\x73\xda\x41\x35\xdd\x0f\x26\x68\xda\x50\x17\x74\x6f\x78\xce\x38\xd1\xd8\x82\xfb\x04\x34\xa6\xd6\x5b\x14\x58\x3f\xb2\x29\x06\x4c\x78\x94\x45\x20\x7b\x51\xb6\x67\xbc\x4a\xa8\x5e\xbe\xc2\x7b\x60\xb1\xf0\x52\xc8\x2f\xa2\x71\xfa\x23\x5d\xb2\x5d\xc1\xae\x71\x3f\x62\x7e\x18\xbc\x2c\xff\x1d\xd8\x11\x44\xbd\x4a\xd8\x63\xf5\x08\x84\x54\x11\x05\xe4\x2c\xc3\xcd\x75\x1d\x65\xb6\x47\xad\x9f\xec\x18\x2e\xb7\x97\xae\xe8\x38\xad\x71\x12\x9d\x24\xdc\x15\x15\x44\x29\xd3\x9f\xa7\xa6\x51\x6d\xff\x2a\x2d\x61\x7c\x8b\x0a\xc5\x14\x17\xa5\x93\x73\xa4\x98\xca\xb1\xd1\x7b\xcc\x27\xbb\xf7\x82\xb0\x2a\xb6\x24\xcb\x49\xef\xae\xd7\xa0\x13\x29\x49\xf0\x84\xe8\x16\x04\x16\x46\xc1\x82\x5d\x54\xa2\xab\x8b\x8a\x51\x85\x63\x0b\x7e\x71\x4a\xd4\xba\xdd\x28\x30\x0e\xa6\x64\xde\x01\x9c\x8b\x0b\x3f\xb6\xb1\x53\x44\x0e\xb1\xaf\x2f\x28\x61\x94\xcf\x9d\xc1\x6c\xe0\xce\xb5\x9b\xeb\x4d\x1f\xd8\x77\x15\x4f\x0c\x6d\xd0\x2c\x2d\x5a\x17\x14\x64\x49\xbc\x00\x3a\x25\xf6\x12\x2f\x81\x98\x4a\xfd\x71\x5c\x7b\x5a\x40\xbf\x96\xd7\x47\xd8\xb7\x72\xfb\x7c\x57\xc9\xb6\x85\xc5\x9d\xac\x34\x5a\x20\x1c\xa5\x0a\x32\x40\xe5\x10\x68\xc5\x11\x53\xeb\xe2\x72\xcb\xa1\x9e\xe9\xeb\x2f\xb4\x02\xfb\xf1\xdf\x70\x97\x55\x54\x95\xee\xb2\x62\x23\x47\x5b\x6b\xd2\xcb\xe9\x1e\x93\x6d\x0b\x9c\x10\xad\xe5\x8c\x9f\xa1\xd5\x1c\xd9\x9a\x50\x0b\x8a\x2f\x61\x78\xfe\x53\x1d\x80\xf9\xa1\x95\x00\x67\x92\x76\x42\x82\x61\x2a\x58\xb3\xa3\x2c\xe3\x26\xa2\x72\x39\xe7\xe7\x70\xe9\xe4\x14\xc1\x02\x63\x28\xcd\x21\x30\xfa\x60\xfe\x8b\x4c\xb4\xb7\x62\x2d\xa3\xbd\x4f\x3c\xd0\x4a\x56\x5c\xc3\x25\xdb\x46\xaf\x37\xdd\x41\xe8\xed\xce\xf6\x1e\x56\x12\x9b\x3a\x24\xe1\x35\x7c\xf5\xaa\xb1\x6b\xa3\x7f\x87\x81\xdd\xa2\xdd\x72\xbc\x3c\x79\xe6\x7c\x6f\xcd\xfa\xf9\x0b\x30\x6b\xba\x0d\x84\x67\x63\xf7\x7f\x7c\xf6\x94\xd2\xc5\x05\x4c\xa1\x1d\xbc\x78\xa5\xfd\xeb\x61\xf9\xd8\x89\xf5\xa0\x5b\x38\x6b\x9f\xc9\xcc\xd1\x82\x4c\xa1\xd0\xa8\x7c\x6f\xe2\xb0\x80\xdb\x85\xed\x85\xb3\xdd\x9d\x1a\x15\xb1\xdb\x2d\x4e\xef\xb2\x53\x5b\x84\x84\xf6\x83\xf5\x94\x32\x30\x72\xaa\xa7\xf1\xb9\xb9\x79\xbd\x88\x4b\x3c\xcd\x0f\x4d\x1b\x33\xa8\x85\x96\x85\x98\xc3\x00\xdc\x90\xce\x34\x9d\x40\xa0\x62\xe1\x52\xc0\x78\x4c\x4b\xc1\x3c\xba\xc0\xac\x4c\xf4\x3b\x20\xb5\x04\x14\x5c\x5c\x9c\x85\x76\x20\x03\x16\xd2\x9a\x89\x96\x96\x16\x56\xb6\x78\xc3\xa1\xc3\xe2\x34\x30\xee\xb1\x79\xb0\x5c\x47\xfb\x9b\x28\x1a\xf6\x9d\xe8\x19\x77\x20\xa3\x68\x34\x22\x89\xa6\x8d\x61\x0a\xaa\xa6\x90\xa6\x71\x2b\x72\x6a\x86\x76\xa2\x48\xd1\x70\x41\x2a\x07\xf4\xfa\x2b\xa9\xd9\xa4\xde\xd4\x71\xae\xee\x2b\x28\x1a\xf4\xe9\x1c\x86\xc3\x1a\x54\x9c\xd0\x44\x5d\x4a\xb4\xaa\x83\x0c\x63\xeb\x4c\xcc\x7b\x67\xe9\x0a\x58\x70\x22\xcc\x89\xf3\x81\x55\xc9\xb7\x72\x68\x04\x58\xe0\xa3\x05\x21\x68\x5e\xfe\x37\xd1\xca\x83\xab\xbc\xbd\x55\x66\xa6\x08\xa4\x1f\x2b\x54\x7d\xe5\xa5\x5e\x76\x6b\x15\x6a\x18\x1c\xca\x9a\x7e\x70\x3f\xe7\x79\xe8\x18\x57\x80\xdb\xd5\x2a\xa4\xad\x56\x55\x71\x6f\x46\x66\x72\x68\x53\x99\x67\xb1\x0f\x41\x34\x19\xcd\x33\xc1\x32\xa7\xb8\x2e\x73\x6c\xa3\x03\x06\xf2\xb2\xdc\xb3\x61\xd7\x12\x41\xca\x6e\xd4\x70\xe7\x06\xaa\x25\x9c\x5c\x29\xb1\xeb\x64\xa3\x16\xec\x3d\x03\xe6\xb2\x40\xdc\xc2\xe1\xcc\x37\x7b\x1a\xef\xc7\x3b\xeb\xd4\x98\xd8\x8d\x14\x93\x99\x9c\xb8\xc8\x9b\xbe\xf1\x7e\x87\x86\x1c\xb9\x81\x7f\x62\x19\xc8\x5c\x00\xd8\x1f\xd1\x59\xb3\x56\x7d\x34\xfa\x0c\x4d\xda\x75\x92\x4c\x46\x61\xf7\x86\xee\x46\x5e\x28\x5a\x29\xb0\x7d\x67\x0b\x45\xd2\x48\x7c\xfa\xf1\xb3\x3b\xf9\xf4\xd3\x67\xf7\xe8\xf9\x95\xea\x1d\x58\xd4\x9f\x63\x37\x3e\x84\xe5\x01\x23\x22\x1d\xdd\x72\xf7\xaa\x0d\x1d\x92\xdd\xa9\x50\x8b\xf5\x42\x3c\x0b\x43\xf0\xfc\xe4\xd3\x1f\x3e\xbb\x67\x4f\xe1\xf7\x62\x3a\x99\xc9\x24\x1f\xe7\xf6\xeb\xd6\x52\x23\x4d\xfd\xb7\x91\x9b\xd7\x03\xa3\x0a\x06\x7a\x61\xa2\xc2\xc1\x0b\x4c\x7d\xb9\x04\xf9\x56\xd6\xa9\xa6\x57\x1e\xe4\x78\xd4\x7f\xa2\x8c\x0b\xa9\x45\x89\x50\xd1\xf4\x26\xf7\xc3\x46\x19\x2a\xc7\xa9\x45\x29\xd2\x0f\xf2\xed\x69\x35\x73\xaf\x5b\x62\x4b\x8b\x69\xa4\x91\x8d\x46\x03\x91\x11\x89\x96\x1e\xdf\x55\xc5\xdd\x74\xd8\xc1\x5f\x85\x75\x56\x43\x5f\xa2\x37\xc4\xb3\x1a\xf5\xdd\xcc\x64\xf2\xa5\xcb\x74\x32\xe5\x51\xf5\xe5\x14\x4b\x22\xa0\xc7\x11\x80\x05\x85\x41\x99\x60\x4c\xac\x47\xe4\xf5\xd8\x3d\xbd\x8b\x6b\xef\xe8\xa2\x2b\x2f\xf2\xdd\x3d\xa8\x88\x74\x16\x77\xf0\x64\xe2\x1f\xe8\x67\xf4\xee\xf3\x2a\x70\x32\xb2\xd7\xdd\xe1\x5b\xc9\x82\xf8\x55\x36\x9b\x92\x26\x01\xe5\x61\x5b\x6f\x3a\x23\x1a\x75\x2a\x9e\x2d\x9f\xd3\xa4\xdd\x2a\xb5\x23\x96\x0c\x9b\x34\x22\x60\xcf\x9e\x2e\xcb\x6d\xd9\x2b\x74\xc8\xf3\x6a\x4a\x31\xaf\x63\xde\xbd\x03\x73\x04\x41\x5c\x1d\x19\x9a\x92\xc2\x1e\x59\x16\xc7\x31\x96\x3c\xc6\x08\x59\x3c\x75\xb9\xf4\xf8\xdc\x9d\x1e\x1f\xc9\x71\x95\x8e\x93\xaf\x22\x47\x5c\x78\xce\x4e\x2c\x6a\x0f\x3b\x75\xa7\x3a\x64\x3c\xda\x40\x4c\xc0\xd0\x62\x15\xe8\x44\x94\x6d\xfd\xb1\xd5\x7e\x0f\xf7\x31\xd3\x8c\xaf\xdd\x3e\xb1\xde\x72\x54\x58\x76\xc0\x85\x59\x23\x1f\x10\xe5\x87\xd9\x73\xc0\x55\x71\x82\x02\xdb\xca\x45\x5e\xf1\x2c\x87\xc9\x01\x40\xe4\x36\xe2\x6e\xc1\xc2\x49\xe9\x9f\x26\x0a\xb8\x7c\x72\x9a\x82\x75\xed\x6d\xdc\x29\x1b\x34\x70\x16\xe7\x57\x6f\xdc\xa2\x8a\x15\x32\x52\xd8\x25\xd8\x84\x3d\x6a\xfc\xc1\x0c\xba\xeb\x26\x5b\x8d\xf5\x67\x58\x9c\xb8\x5b\x68\x13\xf2\xb7\xb1\x53\x93\x0e\x61\x67\xca\x7c\x1c\x77\xe5\xb2\x15\x80\xb5\x41\x4b\xc6\x82\x5a\xec\xea\x77\xe2\x6d\xba\x85\x0b\x33\xbb\x3b\x04\xd1\x27\xfa\x56\x9c\xd2\x01\x2b\xf6\x20\xbc\x8c\x7c\x3a\xb4\x47\x8a\x2f\x02\xff\xda\x47\xe6\x99\x1b\x4c\xec\x73\x3e\x95\x39\x0f\x3d\x3b\x99\x89\xa3\x9e\x2d\x36\xc7\x56\xef\x18\x4f\xd9\xe7\x87\x98\x6c\xbb\x2a\xe9\xdb\xd1\x45\x9e\xf7\x2a\x5b\xde\x57\xb3\xd5\xc6\x6d\x8f\x55\x8f\x96\xb7\x40\x19\x10\x4d\x65\x81\x49\x42\xc5\x22\xae\x88\x8c\x5d\x90\x4e\xec\x55\xd7\xe5\xab\x03\xaf\x78\x5c\x5c\x24\x23\xb9\xa9\x90\x99\xdc\xa2\x82\x0b\x81\x85\x09\xb2\x2f\x7a\xd5\x44\x25\x15\xdd\x62\xc1\x00\x98\x43\x71\x4d\xe5\x16\x58\x0c\x2e\xbf\x22\x39\xba\xa4\xab\xb0\x2c\x44\x43\x06\x95\x39\xee\xa0\x33\x69\x79\xae\xe0\xd8\x67\xf7\x46\xe0\x0f\xa0\xe4\xd6\x11\x01\x02\x16\x55\xad\xe8\x66\x39\xab\xe4\x9e\x29\xc1\x2b\x10\x6c\x00\x37\x30\x4f\x1b\x35\x3d\x5d\x2f\x16\x40\x0f\xb4\x7c\x74\x93\x5e\xb6\xf6\x9e\xc6\xe5\x55\x14\x3a\x14\x24\x06\xd0\xd7\x0c\x2f\xc8\xa4\x23\x22\x48\x4b\x2e\xd9\xc6\xd1\x7a\x2f\x2c\x89\x09\x28\x53\xe5\xab\xc4\x9a\x33\xad\x4f\x77\x97\x8c\x6c\xa7\xfa\xad\x34\x60\xb9\x8b\xf7\x2c\xac\x9f\xb8\x38\x7f\xf7\xee\xfd\x87\xa4\x96\x08\xc4\xcf\xb4\xc0\x6b\xb1\xf7\xd2\xa4\x5d\xec\xc3\x14\x77\x6d\x09\x91\xbc\xa8\xa8\xc4\x31\xb8\x5c\xf6\xcb\x8c\x9c\xd7\x16\xb4\x36\x70\x5f\xcd\xd2\x6b\xd1\xfe\xf6\xe8\x0a\xf9\x14\x86\xf8\x73\xc5\x77\xff\xef\xc3\xff\x2a\x37\x9f\xc8\x2c\x5a\x80\xde\x26\xc3\x97\xe4\x5e\x2f\xd6\xd6\xb6\x13\x73\x0a\x10\x4b\x07\xf0\x20\x6b\xec\x76\x67\x81\xf3\x59\x09\xb0\x7a\x3d\x0d\xbb\xcb\xf6\x40\x25\x41\xa4\x31\xfa\x6f\x03\x28\xa4\xc0\x48\x75\x51\xdd\x69\xa7\x97\xba\x43\x11\xfa\x4f\xf1\x03\xd3\xc3\xaf\x91\x83\x75\x56\xb9\x76\xe2\x99\xdb\x49\x23\x9a\x4e\x3a\x77\xf6\x68\xd0\x22\xf0\xcd\x5e\x7d\xf1\x8f\x9e\x5f\xf5\x60\x1f\xf9\xec\x69\x80\x78\x3e\x41\x57\xaf\x6c\xdf\xe0\x6d\x6b\xb4\x04\x07\x62\x45\xe9\x61\x9b\x1a\xe0\x62\xb2\xad\x8a\x03\xff\x4f\xd4\xb9\xb2\xfd\x6d\xea\xc7\xf7\x74\xc1\x60\x57\x48\xb0\xef\x64\x37\x94\xb7\x4d\xa1\xf6\x50\xc6\xfd\x50\x81\xf7\x78\x2a\x0b\x4e\x02\x10\x37\x28\x64\x68\xb3\xfe\x23\x0c\x9a\xbf\x3f\x22\xc9\x6b\xd5\xed\x82\x78\xf8\x5d\x05\x2d\xa1\x5b\xf9\x71\x08\x1a\xc8\x63\xd7\xea\x90\x07\xfe\xd5\x90\x3a\x33\x1b\x59\xa0\x0a\xd9\xb1\x64\x96\xcd\x66\x20\xa7\xd0\x89\xfc\x26\xfb\x40\x06\x55\xf1\xd8\x72\x4d\xaf\xc1\x3d\x1c\xd3\x3b\x09\x17\xdc\x31\x06\x11\x24\xae\xb5\xd7\x6b\x63\xfb\x6c\x18\x6e\xc0\x64\x48\x2c\x62\x96\xe0\xa8\x46\xae\xea\x74\xa3\x8c\x03\x6a\x87\xbf\x38\x65\x52\x5c\x0a\x86\x85\xcb\xc7\x70\x60\xd0\x56\x08\x3f\xe8\x7b\xa6\x14\x01\x72\x95\x95\x1c\xbc\xad\xb5\xd1\x1e\x7c\x89\x74\x90\xba\x51\xf7\x59\xae\x57\x3c\xa1\xd8\xd8\x09\x9d\xa0\x91\xfa\x13\x1e\x72\x07\xa2\xe9\x21\x3f\xa0\x6c\x82\xc8\x15\x99\xec\x1c\x60\xfc\x20\x41\xa0\xa9\x28\x05\x30\xaa\x77\xfd\x60\xf0\xae\x7d\x30\xaa\x48\x4c\x82\x11\xf2\x01\xe6\x40\xa1\x32\x9e\xf8\x5e\x36\xb7\x81\xb8\xf4\x6a\xa5\x7a\x65\x1a\x70\x58\x90\x3e\x53\x64\xa0\x49\x85\x35\x74\x10\x84\x62\x8c\x5c\x07\x91\xf5\x0e\xfc\x66\xd0\xff\x4a\xbc\xe1\x94\xef\x37\x76\xe8\x7f\x60\x40\x56\x95\x47\x38\xba\xf0\x19\xe5\x73\x3b\x49\xa1\x40\x56\x87\xc2\xa8\x70\x28\xc8\x1e\xbd\xb3\x33\x1d\x87\x63\x1f\xd7\xe8\x4f\x48\xf8\x40\x75\xe7\x0e\xa6\x49\xca\xbb\x1b\xf8\xaa\xf6\xd2\x37\x1b\xb4\xc1\xf8\x33\xfd\x04\x13\x8c\xb5\xfc\x1d\x53\x6f\xe2\x07\x6c\x01\x47\x9b\xc2\xa5\x05\x4c\x2b\x37\x8b\xcb\x90\x12\x0b\x63\x96\xc3\x42\xbc\x95\x5f\xf4\x76\xd8\x8a\x7f\xff\xf1\xa7\xcc\x46\x93\x1c\x01\x16\x53\x9c\xe4\x21\x00\xb6\x10\xe4\x8f\x9a\x8a\x91\x49\x47\xaf\x64\xb3\x21\xb7\x15\xbb\xaa\x31\x22\x0c\xb0\x92\x1f\xa2\x51\x5a\x20\x69\x00\xa7\x5a\xb1\xa5\x36\x44\x40\x28\x1a\x5a\x7a\x52\x1a\x9b\x2c\xe6\x4d\x46\xc6\x36\x8f\xdf\x6e\x39\x32\xc6\x70\xbf\x01\x89\x51\xaa\xad\x83\xa8\xc4\x74\xaf\xb0\xa0\xae\x28\x00\x17\x47\x30\x8a\x11\xb8\x30\x84\x51\x9e\x7b\xfc\x08\x89\x7e\xd0\x25\x55\x07\x3f\xc8\x65\x37\xa8\x47\xcf\x71\x21\x31\x49\x67\xac\xb4\x45\xdf\x52\x0c\xb0\x6c\x8f\x12\xc4\x02\xe9\x76\x5a\xef\x17\x10\x05\x24\x2d\xf7\x19\xa8\xe2\xd4\x27\x71\x4b\x66\x8a\xc6\xa7\xaf\xde\x7c\x00\x3b\xdc\x7b\x8a\xd7\x78\x37\x53\xb3\x1b\xdb\x5f\x30\xae\x15\x04\xec\xc8\xae\x63\x39\x78\x99\xcc\x07\x63\x79\xc0\x20\x0c\x1c\x8c\x65\x27\xc3\xd2\xe4\xba\x02\x9f\xa1\x9d\x43\xa1\xc3\x68\x98\xcf\x82\x8f\x4e\xd8\xb1\x0d\x84\xac\x5c\x58\x8c\x2d\xb9\xbd\x36\xb2\x63\x9f\xd7\x37\x98\x48\x05\x43\x22\x5c\x3c\x95\x56\x5b\xec\xa2\x23\xf3\xd8\x3d\x8c\x36\x1a\xe8\xa5\xd5\x90\xdb\xe6\x11\x55\xa0\x33\x8e\xa2\xb4\xd9\x55\x85\xc7\x14\xa7\xd3\xa1\x15\xbe\xaa\x20\x01\xd6\x9d\x36\xb7\xc0\xdc\xed\x0e\x29\x21\xe3\x65\x2f\xec\x4e\xab\xf6\xbb\x2c\x8f\x95\x2b\x57\x30\xfb\xff\xef\xff\xfd\xff\x3c\xb9\x08\xed\xbe\xf0\x7d\xf7\xe4\x82\x25\xcb\x00\x8f\xe3\x88\x08\xc4\xfb\xff\xac\x06\xb3\x27\x7b\xd9\x8f\xf8\xab\xe2\x6f\xa0\x52\xd5\x60\x1c\x99\x60\xc0\x8f\x8a\xbe\x02\xb1\xaa\x28\xba\x5c\xa0\x52\x55\x65\xe2\x21\xfb\xce\x16\xe7\xec\xdf\x06\xdd\xdc\xd6\x78\xa1\x76\x26\xfe\x2b\x7c\x09\x88\x58\x46\xac\x46\x38\xb5\xe2\x11\x04\x8b\x76\x74\x8e\xe5\x5e\xab\x40\xb7\xc8\x95\x3e\x1d\x59\xb2\x64\x9d\x0e\x7c\x68\x30\x60\xa7\x8d\xaa\x76\x83\xdb\xa0\x0c\xc7\xb5\x5d\x0d\x6e\x03\xf1\x58\xbe\x60\xbc\x9f\x1c\x03\x4c\xcd\x04\xc7\x52\xf6\xaa\xde\x46\x2f\x87\xf1\xee\x8e\x0b\x87\x1c\xe9\xd2\x95\xdc\x41\xf9\x45\x55\xe1\x11\x8c\x6e\x0e\xae\x8a\xa7\x2a\x9d\xa6\xbe\x57\x80\xb4\x57\x2a\x40\x7a\xd5\xb3\x81\xa1\x34\x6d\xed\xe5\x1a\x4b\x06\xd6\x87\x8a\xda\x5e\x78\xb9\x26\x44\x80\xf9\x17\xfa\x59\x79\x09\xe6\x68\x1f\xe4\x7a\x1a\xea\x6e\x37\x74\xdd\x34\x20\x5e\x27\x97\x0a\x92\x2f\xe1\x47\xb5\x0d\x8d\xf4\xd6\x28\x3c\x3d\xf9\xa3\x6a\xc0\x79\xc3\x45\x37\x0e\x57\xad\x35\xb3\x08\x65\x1b\x28\x92\x01\xea\x0e\xf1\x27\x0c\x41\xdd\xcb\x7d\x48\x93\x7b\xfc\xdc\x68\x47\x81\x13\x5f\xe3\x2f\x4c\xc6\x7b\x1b\x00\x85\xcb\x9a\x08\x0f\x12\x08\xed\x91\x2b\xfe\x8d\x59\xde\x06\x9e\xae\x4f\xb3\xc3\xe6\x3c\xde\x5a\x81\x19\xc8\x54\xbb\x8d\xdd\x9b\xea\x4e\xb7\xca\xc2\x99\x41\xc1\x15\x30\x74\xe4\xb2\xb7\x7b\xc7\x4c\x67\x18\x6d\xfc\x0c\xd3\x6b\x1e\xa7\x40\x0c\xaf\x3f\xbc\xbd\xfc\x77\x01\x38\xc2\x3c\x2c\xaa\x38\x13\x0b\x7b\xa7\x7a\x8a\x00\xf2\x9e\x7e\xa6\x4c\x72\x57\xcd\x86\x0c\x4c\x35\x55\x1a\xb9\x08\xea\xbc\xec\x0a\xc8\x9b\x90\x30\x03\x88\xe1\x09\xcf\xbb\x6e\x26\x8f\x0c\x91\xea\xe5\x21\x9a\x52\xb5\x02\xae\x77\x02\x09\x86\x2b\x9e\x04\xcc\x26\x37\x63\xd6\x8f\x64\x88\x11\x07\x58\xa9\x36\x2c\xfd\x05\x04\x9b\x44\x0b\xbb\x77\x6a\x8f\xec\x2d\x65\xa1\xdd\x55\x1d\xed\xef\xc0\x7f\x29\x07\x08\xff\x38\xfb\xd7\x56\xfb\x22\x73\xd7\x2b\x58\x07\xd8\x2c\x87\x24\x0e\x46\x16\x1b\xe4\x18\x10\x45\x83\x1a\x90\x19\x6b\xea\x70\xa4\xd6\xbc\xe1\x2e\x50\x6e\x08\x99\xc2\x58\xf3\x04\xce\x5b\xc8\x2c\x1a\x01\xa4\x28\x6f\x89\xe7\x25\xc4\x60\xdb\xc1\xf9\x7a\xa9\x6a\x6b\x6a\x99\xc6\xe6\x2f\x6c\x37\xbc\x04\x57\x34\xc9\xfb\x33\x1c\x7c\xf2\x16\xbd\x17\x7a\x1b\x04\x55\xc1\xfd\xe0\x78\x70\x39\x72\x90\x7c\x30\x66\x23\xf4\x23\xc7\x0c\xb4\x76\xcc\xe0\x53\x7c\xc7\x00\xcb\x66\xf5\x39\x3e\x56\x9c\x65\xbd\xca\xf5\x76\x93\x7e\x05\xaa\x55\x43\x78\x2f\x52\xff\xe6\x0d\x00\x92\x86\xb1\xbf\x92\x8a\xe6\x9b\x7a\x87\x36\xab\xd0\xa4\x74\x94\x81\xc7\x57\x69\x16\x30\x7f\x4d\xce\x0b\x2d\x30\x7b\xe0\xe8\xcd\xcb\x8d\xbc\x20\x7a\xa8\x6c\xb1\x58\xe4\xf5\x45\x75\x02\x68\xed\x02\xb7\x9e\x0e\xf1\x53\x8c\xc7\x05\xdc\x9c\xf6\x78\x37\x0a\xa7\xe7\xd3\x45\x80\x65\xd5\x65\x5e\x60\x6d\x59\x2f\xb5\x54\x6b\x8d\x91\x3b\x41\xa8\x56\x14\x31\x24\x21\x59\xca\xe6\xd6\xed\x24\x04\x70\xc4\xf6\xc0\xf9\x6c\xfb\x6c\xbd\x36\xaa\xab\xc1\x18\x5b\x9c\x09\xfc\x8c\x99\x40\x59\xb3\x45\x4f\x1e\x73\xa3\x35\x2f\xdb\xb6\xf6\xdb\x1d\x5b\x39\x3d\x3e\x71\x4f\x9f\x71\xb7\x9f\x3f\xce\xa0\x12\xc0\xe3\xb4\x2d\x5b\x8c\x26\x4b\xb6\x95\x79\xde\xd8\x34\x39\xcf\xa3\xa6\xd1\x21\x18\x23\x16\xb7\xe0\xa3\xce\xa1\xd8\x84\xfa\xe2\x95\x69\x55\x2b\x32\x19\x23\x9b\x1b\x42\x82\x43\xdb\x1d\x6a\x6f\x71\x95\x26\x6a\x83\xfd\x65\x00\x1e\x76\x52\x95\x31\xdb\x8c\xe0\x4f\x42\x77\x1f\x81\x5b\x7a\x54\x9d\x41\x46\xaa\x2e\x31\x10\xa9\x06\x66\x1d\x58\xfd\x66\xa2\xc7\x63\xc2\xb3\x82\xd8\x6c\xe0\x00\x03\xed\x01\x7b\x01\x8c\xd0\x29\xc2\x29\xca\x1e\xfa\x8b\x9c\x0e\xb2\x57\x00\x58\x41\x13\x4b\x54\x7a\x53\xe6\x23\x31\xb2\xd4\x1d\x2f\x5e\x22\x6b\x4b\x85\x11\x36\x69\xc7\x80\x30\x33\x09\xa6\x49\x65\x99\x69\x40\x85\x74\x52\x5b\x23\xc9\xc6\xcd\x56\x6a\xab\x63\x34\xd8\x5c\x6f\xc2\x6b\x81\x97\x7f\xad\x5d\x2d\x23\x75\x34\x9e\x55\xa7\x24\x09\xef\x24\x19\x8e\x62\xf4\x18\x89\x27\xef\x88\x71\xbe\xaf\x22\xa0\x0f\x50\x87\x3b\x6c\xe9\x74\x8f\x61\x55\x59\x60\x93\x82\x33\xf9\x8e\x88\x86\x00\xbc\x7b\x35\x07\x63\x00\xeb\x69\xb5\x14\x84\x7a\x32\xaa\x50\x4d\x6a\x55\xaa\xa8\x90\x33\x73\xd6\xf0\xeb\xbb\x40\xd4\xb8\x36\xb6\x46\x45\x46\x76\x71\x50\x74\x87\x4d\x37\x98\x7c\x8f\x34\x1f\x51\xc7\x70\xac\x22\xb2\xa8\xad\xf7\x9b\xac\x5a\x26\xa9\x13\x5b\x30\xb6\xbf\x75\xda\x34\x2a\x85\x9a\x55\x2d\xd7\xbf\xb8\x5f\xa5\x97\x42\x10\x80\xdd\x07\xdd\x40\xed\xc3\x2c\xc0\xd1\x50\x54\x62\xfb\xb8\xad\x90\x1c\xf2\xfe\x59\x4b\x6d\xd2\xf6\xf2\x16\x7c\x91\xf0\x54\xf1\x9b\xec\x04\x29\x7b\x3a\x59\xca\xe7\x38\x8c\xa0\xe0\x4a\x53\xf6\xf5\x8b\xda\x58\xa6\xad\x81\xf4\x04\x5e\x10\x67\x27\x48\xae\x68\x4c\x93\x9d\x64\x21\x3b\xb5\x07\x02\x49\xda\x9a\x2c\xc2\x69\x3b\xa4\x28\x50\x98\xfe\x94\x8c\x6a\xd2\x64\x43\x53\xd1\x0b\x35\x48\x86\x23\x6c\x74\x2c\x4e\xb0\x11\x21\x7e\x08\x4d\x38\x07\xdc\xb0\x6c\x75\x4f\xa4\x18\x3f\x48\x58\x4d\xc4\x86\x5c\xd8\xa0\xf9\x91\x29\x73\xa3\xf6\x47\xfe\xcc\xb1\xad\xeb\x91\x5a\x73\x1c\xd0\x09\xdd\x97\x0c\x5e\x44\x50\xb1\xd0\xc0\x84\x3f\x71\xfc\x44\xe8\x99\xf1\x2f\xe1\x72\x21\x83\x73\x46\xa1\x8d\x68\x65\xa5\xfc\x95\x06\xc9\xf0\xa5\x36\x6d\x4c\x93\xa0\xc7\x89\x2e\xf1\x31\x3d\x49\x72\xe4\xb9\x1e\x73\xe8\x6c\x7c\x01\x5a\x52\x4a\xe3\x88\x56\xef\xc3\xff\x98\x6a\xd4\x9e\x14\xe5\x7b\xd5\xc7\x88\x4f\x18\xc4\x3e\x90\x7d\x90\xb9\xb2\xe4\xc5\x58\xce\xca\xb2\x02\xc9\x08\x89\x28\x44\x43\x7e\x9e\xdd\x74\x4a\xf6\x75\x2c\x7f\x11\x3e\x45\x37\xc1\x12\x05\xb7\x5c\x6e\x1b\x55\x93\xc3\xbc\xb3\xf3\x60\x58\x5d\x0e\x89\x35\x6e\xe7\x80\xed\x4e\x99\x02\xf6\xfd\x4e\x99\x5c\x6c\x2c\x10\x5b\xa7\xda\x11\x66\xb8\xc5\x99\x87\x97\x0e\xc2\x1f\xc2\x3d\x16\xfd\x9c\xb6\x33\x03\xc2\x66\xca\x19\x50\x63\x73\xb8\x77\x76\x02\x44\xfb\x36\xb2\x07\xe3\xd9\x4b\xf3\xa3\xf6\x93\x09\xc2\xcc\x1a\x2c\x6b\x62\xfc\x33\x00\x8a\xa7\x7e\x51\x4d\x44\x46\x95\x15\xf8\x10\x57\xbc\x65\x58\xc4\x1b\xd5\xb0\xbb\x64\xe0\x32\x5b\xb5\x02\xc7\x40\xa7\x40\xa7\x5a\x2e\x84\x71\x71\x6d\x56\x36\xa7\x71\x41\x8e\x95\xe6\x40\xa5\x40\x3f\x11\x8d\x19\x31\x0a\x0f\xe9\x50\x1e\xc5\x9e\x3e\xe2\xa0\x3c\x72\x69\xd1\x47\x93\x46\x0b\x1d\x39\x31\xaa\xf9\xb8\x61\x14\xc0\xe7\x48\xab\x66\x2e\x48\x60\x48\x9c\xf2\xc7\x8a\x0c\x8e\x1c\xac\x90\xb8\x3f\x08\xcf\x24\x36\x17\x42\x13\xb9\x03\x5a\x85\x38\xe2\x33\x15\x91\xda\x62\x08\x3e\x44\x0b\xeb\xdb\xcb\xa5\x38\x13\x27\x2d\x2c\xee\x38\x97\x61\xe9\xa6\x2c\x5c\xc9\x9c\x49\x7a\x1c\x9e\xe8\x62\x86\xf3\xbc\xc0\x2d\xe0\x4d\x0d\xae\xcb\x78\x6b\xd3\xcd\x94\xb8\x77\x83\x8f\x61\x8e\x62\x9e\x6c\x63\x2a\x79\xcf\x6e\x4b\x10\x6b\x6d\xd4\x71\xd4\x47\xca\x91\xe2\x1c\xd4\xe5\xd3\x9c\x85\xec\xba\x3a\xaa\xaa\xce\xbb\x4e\xe0\xc7\x2c\xa8\xa3\x77\x3e\xbc\x0d\xc2\x60\x6a\x6a\x4b\xf6\x3d\x73\x85\x70\xb5\xb6\xf5\xf2\x40\x65\x70\xdb\x41\xf4\xdd\x23\x45\xb6\xca\x04\xc9\x25\xb0\x73\x58\xe4\x6d\x4c\x98\x29\xe2\x28\xfe\xa4\xed\xfd\x4c\xce\x02\xd6\xa3\xa7\xa3\xc2\xcd\x82\x04\xa2\x01\x20\xef\xe1\xc7\x1c\x08\x9a\x7c\x47\xe9\xed\x9a\x82\x80\xb1\xb7\xd9\x6c\xc5\x4a\xba\x54\xe2\x52\xa1\xe7\xfd\xc3\xe5\xb6\xd6\xf9\x70\xcc\xa1\x85\xff\x5b\x0b\x81\x37\xe0\xf3\x9e\x7a\x52\x01\xac\x68\x52\x22\xec\x24\x56\x46\xe1\xef\xa4\x8b\xca\x8c\x8f\xc1\xee\x98\xcc\x87\xe5\xf3\x49\xe1\x7a\x25\x6f\xd5\x0c\x06\xd4\x66\x11\x34\x28\x8f\xec\x10\xb5\x46\x76\xc8\xce\x95\x2f\x38\x15\x5f\x7c\xb9\xc5\x63\x0c\xf1\xd1\x0e\x6f\x63\x56\xb9\xc3\xcd\xb0\xad\xa9\x8f\x0e\x29\x00\x7f\xc5\xe2\x3c\x02\xb5\x0c\x55\xfe\x16\xbf\x53\x77\xff\x2d\x70\xd8\x27\xd0\xd3\xdf\xb8\x18\x7b\x37\x22\x74\x16\xb5\xfb\x9c\x9c\x5e\xa2\xf7\x0b\x5b\x5f\xb4\x99\x72\x87\x8a\xfd\x31\x36\xd3\x66\xce\x1a\x78\x0a\xc0\xfd\x57\xa9\xa1\x2e\x48\x1a\x7c\x70\x7f\xcb\x2c\x6e\x54\x04\xa1\x49\x07\xe7\xbe\x1c\xbc\x57\x30\xaa\x0c\x77\x0d\x9f\xa3\xcc\xfb\x90\xf5\x45\x01\x3a\x36\xd3\x12\x23\xd0\xd1\x44\xd1\x30\x23\x4b\xf1\x4c\x0a\xdd\x92\x35\xfb\xa3\x38\xdc\xf0\xf5\x1c\x16\x4b\x31\xe8\x58\x5f\xc4\xc1\x9f\xdf\x88\x85\xb8\xdc\x5e\xad\x22\x1e\xba\xe4\x6e\x71\x76\xb0\xab\x18\xee\x82\x65\xa3\x6f\xab\x62\x67\xe9\x11\xa6\x2b\xf8\x91\x6a\xe6\x98\xa6\xc0\xef\x5e\x64\x9f\x71\x99\x17\x16\x39\x94\xc8\x91\xa7\x39\xc6\x12\xe9\x2d\x0a\x57\x26\x8a\xf2\xc9\xe2\xdf\x5f\x2d\x0b\x58\x8d\x35\x77\xaa\x77\xe4\xbe\x40\x18\x49\x81\xf9\x6b\xab\xd3\xf4\x8c\x74\x1d\x5c\x37\x1a\x91\xdd\xc8\x3b\x35\x3a\xc4\x99\xe5\x89\x2c\x54\x99\xdf\xd8\xce\x26\x16\x0b\xbe\xc6\x00\x68\x25\x75\xd2\xce\x72\x47\x69\x69\xd2\xce\x85\x30\xe7\xe5\xa9\x83\x90\x33\x9d\xc1\x8c\x91\xa6\xac\xcc\x8c\x11\xc7\xb0\x81\x10\x77\x8c\x0d\x88\xa7\x58\xc8\x73\x1d\x40\xa3\x99\xd6\x2c\xd8\xbc\xc7\x26\xf2\x18\xb9\xd9\xa5\x06\x21\x38\x79\x69\x6a\x53\x58\x62\x12\xee\xe3\x86\x74\xf3\x95\x27\xdd\x2d\xb6\xf5\x01\xbd\x6d\x46\x26\x77\xb2\xf7\xba\xd1\x3b\x19\x49\xe5\x55\x96\xc2\x90\xd2\x7b\xd9\x6c\xc2\xb6\xce\x99\xae\xdf\x50\xff\x40\x6a\x87\xb0\x1e\xd1\x96\x3d\x08\x5a\x5e\x2e\x7f\x9b\x29\x1d\xe3\x62\xe7\xa5\x63\x62\x40\xf1\x5b\x85\x77\x61\x99\xb8\x96\xdf\x89\x51\x66\x63\xb7\x3b\xd9\xab\x52\x1b\x1b\x52\xa2\x3a\x76\x16\x8e\x67\x89\x81\xfd\xde\x8a\x78\x91\x03\xef\x95\x85\x13\xac\xd4\x23\x82\xc2\x31\xaa\x40\x4a\xb4\x10\x86\xfb\x0c\xa2\x31\x8c\x2b\xa4\x1a\xce\x04\xfd\xa2\xfc\xe2\x12\x71\x7c\x79\xc8\x3d\xb7\x75\xaf\xdc\xd0\xc1\x8c\x80\x47\x19\x7e\xac\xec\x60\xda\x45\x04\x82\x47\xa3\x02\xb7\x95\xea\xca\x0e\x11\x7c\x52\x8a\xfc\x5b\x43\xee\x52\x35\x32\x30\xea\xd0\xe6\xd0\xd7\x8d\x92\x6d\xd6\xfb\x5e\xc1\xcb\x0d\x63\xfc\x5b\xd5\xaf\x63\x47\xbf\x06\x7f\x31\xa6\x1b\x0c\xc0\x8d\x1e\xb6\xdd\x41\xb4\x7a\x05\x54\xd7\x0b\x52\x37\x70\x75\x1b\xe9\xea\xfc\x71\xb0\xb0\x40\x62\x6d\xac\x44\x1a\x4d\xcc\x52\xf9\x3d\x44\xbb\x02\x67\x8a\x50\x2f\xaa\xca\xdc\xcf\x23\x8f\xa9\xa7\x50\xc7\xd3\xc0\xb9\xb4\x44\xb8\xff\x0d\x3e\x90\x7c\xd3\xcc\x8d\xc4\xcc\x99\x55\x07\xc4\x8f\xd7\xd0\x1e\xb6\x8c\xb7\x02\x46\x08\xb8\x9d\x96\x35\x1f\x78\x8c\xb0\xbb\xd5\x4f\xd1\xdd\x4a\x68\xe3\xed\x8c\x1b\x16\xe1\x07\x4c\xc4\xd4\x70\x35\x98\xf6\xaf\xa1\x17\x27\x9f\xfe\xc7\x67\xde\x12\x5e\x2e\xeb\xfc\x74\x40\x8b\xd5\xf8\x59\x40\x8d\x15\x3e\x29\xaf\xb8\x36\x67\x1d\x23\xe5\x13\x0f\xe1\x2d\x2e\x9e\x64\xc3\x85\x19\x64\xa1\x9e\xcf\xa4\xb7\x62\xa7\xfa\x40\x15\x69\x34\xa3\xcd\xee\xa2\x18\x1a\xe0\xf6\xfb\x54\x53\x58\x35\x31\xe7\xc3\x04\x6d\x24\x83\x04\x53\x52\x41\x44\xd1\x4a\x2f\xeb\x65\xcf\xe6\xf9\xd2\xcb\x68\x93\x39\x8f\x8b\x60\xdb\x21\x45\x63\x22\x5b\x2f\xb8\x0f\xcc\x88\x3b\xb7\x5d\xbb\x1a\x3c\xd2\x51\x15\xfc\x81\xdc\xcc\x3b\xdd\x78\x11\xd3\xb5\xa3\x70\x48\xf8\x70\xca\x1a\x9f\xa1\x89\xcf\xcd\xad\x7a\xe5\x36\xf0\x48\x44\x00\x58\xa9\xbd\xd8\x5a\x60\x68\x23\x45\x92\xa6\x06\x13\x44\xdc\xaf\xb9\x15\x51\xd1\x0d\x32\x29\xa2\x01\x29\x9e\x7e\xc8\x50\x81\xc5\xd6\xd7\x61\x43\x0f\x88\x39\x7c\x89\x22\x44\x25\x2e\xf7\xdb\x1d\xaf\x6b\xfc\x5e\x1c\xae\x87\xad\x34\x68\x5c\xac\x8d\xb0\x7d\xab\x7a\x8a\xb9\x0b\xce\xdd\x7e\x33\x87\x19\xf9\x52\x44\x4a\xec\x5c\x76\xc3\x84\x68\x31\x3d\x2e\xdb\x40\xe5\xf8\xb2\x37\x00\xe0\x84\x5d\x43\x3a\x5f\xec\x52\x7a\x22\xf7\x70\x69\x96\x19\xfd\x45\xfd\x69\x6e\x70\x93\x2d\xe2\x31\x99\x83\x05\x3d\x47\x6d\x60\x13\x0d\x86\x88\x02\x94\x8a\xca\xf6\xdf\x48\x2f\xf4\xd8\xc7\x8d\x43\x9b\x2b\x59\xbb\x97\xc3\x9f\x93\x51\x83\x5c\x55\x31\x95\xdf\xff\xdb\x49\xfb\x03\xbd\xac\x25\xb7\x6a\x6a\xb3\x1a\x12\x71\xd4\x72\xfe\x25\x1c\x24\xda\x41\x98\x6b\x78\xd0\xc1\xf6\x3c\x42\x0b\x26\xac\x24\x34\x65\x06\xab\xc0\x9f\xfd\x92\x1f\x79\x05\x0c\x44\x2f\x33\x6a\x9f\x11\x20\xba\x27\x4b\x77\x4b\xcc\xd8\x70\x27\x35\xee\x50\x0c\x17\x81\xa5\xd0\x39\x01\x9a\x6c\x1a\xb5\xa8\x32\xeb\x99\x8c\xb9\x48\xca\x9a\x2c\x7b\x46\xb3\x94\xe5\xce\x6b\x97\xc6\x00\x6d\x52\xa1\x9e\xb8\xa2\x6e\x5b\xb7\x83\xaa\x49\xf4\x7f\x67\x81\x94\x84\xaf\x71\x0b\x58\xe4\x1d\x63\x8e\xf2\x5f\xd9\xa1\xda\x0d\xcb\x70\xa6\x63\x74\x6a\x5c\xe8\x99\xc1\x90\xb7\xec\x49\x42\x77\xf3\xc4\x9d\x15\xe8\x47\x67\xe0\xec\xe0\x44\x1f\xcd\xf0\x3f\xcf\x98\x31\xe8\xce\x73\x53\x9f\x5f\x0c\x0a\xd4\xf8\xe2\x7b\xbe\x9c\xfe\xa1\xec\xa4\xc2\x18\x44\xe1\x7f\x9e\x11\x9f\x43\x21\x54\x35\xae\x43\xc2\x08\xc8\x29\x25\xbd\x95\x71\x1a\xad\x40\x1e\x1f\x0e\x87\xc3\x93\xed\xf6\x49\xdb\x3e\x9e\xe9\x75\xc6\x44\xc7\x6e\x8f\xac\x20\x48\x5b\x35\x3a\x47\x32\x4c\x99\x4c\x32\x3f\x76\x60\xd2\x92\xcf\xd3\x47\x50\xd0\x2e\x95\x07\xbf\xc3\x8c\x8c\xc0\x4e\x4a\xb3\xe7\xc2\x09\x69\x77\x9d\x4a\x5e\x67\x81\xe4\x61\x34\x89\xbc\x2f\x23\x79\x2e\xcb\x1a\x05\x5b\xbe\xb7\x81\xd1\xaa\x91\xf8\x6b\xbb\x4a\x8d\x19\x0d\x0a\xbe\xa5\x78\x74\x48\x32\x39\x2a\x0d\x6b\x94\xa5\x66\x00\xe7\x25\xa9\x54\xfb\x7f\xa7\x34\x35\x57\xfd\xdc\x32\x78\x40\x9e\xaa\xf6\xfa\x56\x8b\x33\xf1\x67\x7d\xab\xe1\xf7\x82\xc2\x63\x67\xe1\xb0\xbd\x85\xec\xef\x8a\x7c\xee\x6b\xc8\x01\x8b\xb8\x0d\x39\x01\x0b\x7c\x1e\x10\xbd\x0c\x87\xae\x15\x9d\xbe\x45\x7e\xc3\x36\x03\x28\x5a\x0e\x14\x0c\xed\xaf\x10\x99\xcc\xae\x15\x78\x81\x47\x19\x46\x7b\x5a\x54\x0b\xac\x90\xd6\x38\x04\x4b\xac\xe9\x25\x68\xda\xe4\x3e\xbe\x14\x15\xd2\x11\x3c\x7f\x2b\x1a\x12\x48\x6e\xa1\x74\x92\x5a\x12\x3c\xc6\xb6\xca\xb1\xbe\xa3\x97\xb4\x30\x9f\x4d\xd7\x4a\x4b\x95\xd0\x73\xb4\x5e\x0a\x02\x85\x12\x72\x69\x07\x32\xf0\x22\xd5\x68\x22\x10\xd4\x0f\x78\xf0\x87\x6a\xba\x09\xc2\x45\xaa\x03\xec\xfc\xa9\x02\xba\x5a\x39\x71\x70\x93\xce\x2a\x1e\x28\x77\xe2\x10\x1c\x56\x7a\x48\xa9\xe9\x0a\x85\x74\x09\x45\x7f\x52\xde\xb8\x3f\xe8\x67\x56\x80\xd0\xc1\x36\x0f\x65\xac\xd7\x8d\xaa\x7f\x64\x3e\x2a\xf7\x45\x43\x5b\x8d\xb5\x22\xd6\x3d\x88\xc1\x1c\x9f\x81\xd9\xa0\xb0\xdf\x55\xef\xe1\xd1\x88\x38\x43\xd3\x4b\x78\x58\x48\x80\xea\x01\x57\xc8\x88\xc3\xd1\x34\xbb\x6c\x10\x39\x4a\x1a\x87\x3a\x61\xf3\x44\x57\xcd\xbe\x13\xcd\x69\x0b\x9c\x2c\x17\x9f\x7b\xcc\xb2\xb2\xe7\x7e\x88\x47\xca\xbe\x8f\x80\x2d\xd0\x23\x8b\xa2\xa2\x1f\x03\x42\x4b\x05\x5a\x49\xc7\x80\xe0\xc1\x66\x74\xea\x39\x06\x32\x18\xbe\x23\x3b\x13\x1f\xf9\x77\x02\x9e\x33\xa6\x9d\x64\xd6\x4b\x94\xc3\x33\xbf\x28\xf4\xdd\x4e\x12\x71\xa0\xeb\x00\x95\x7b\x86\xd0\x24\xef\x06\xb7\x81\xc7\x41\xa3\x06\x98\x83\xba\x72\x45\x0f\x79\xff\x1c\x01\x4c\x1c\xbc\xe2\xb7\x0c\xd9\xf6\x09\x75\x85\x4e\xb7\x10\x6f\x02\x6e\x17\x03\xbb\xfb\x88\xf3\x41\xfb\x01\x81\x0d\x90\xad\x3a\x2d\xd8\x46\x8a\x9a\x66\xe0\x79\x48\x36\x5a\x49\xad\x18\x19\xb4\x8d\x33\x46\x16\xad\xf5\x60\xa2\xc9\x6f\xb2\x6e\x9d\xb6\x37\x7b\x78\x0d\x6f\x8a\xc0\x01\x5d\xfb\xf8\xb0\x9a\x35\xe4\xbe\x30\x69\xca\xb8\xc6\x44\xec\x5f\x94\xd5\xb0\x0c\x98\xb1\xc1\xf7\x06\x11\xfc\x2e\xd5\xb4\xeb\xad\x87\x3b\xb7\xdc\x46\xf8\x8a\x13\x67\x56\xcf\xb4\x40\xf4\x7d\xc2\x9c\x6c\xf5\xc0\x4b\x68\xb6\x6f\x70\xb1\xc0\xf3\xbd\xb2\x69\x74\xab\x8c\x97\x5d\x92\x46\x21\xc6\xe8\x46\x7b\x05\xd1\xc2\xb2\xf9\xc3\x57\x45\xd2\x16\xc0\xd0\x8f\x32\xb7\x29\x86\xc0\x8f\x6c\x2f\xbb\x58\x2c\xc6\xcb\xbc\xa6\xf6\xe2\x46\x26\xce\xfc\x2a\xa6\xdd\x03\x3e\x72\xe9\xc2\xca\x05\xe5\x0b\xa6\x1e\xb0\x43\x10\x6b\x7c\xd9\x66\x31\x19\xad\x91\x71\x22\x8f\x14\x4c\xda\x72\xb4\x19\x66\x8a\x44\x2e\x83\xc2\x4a\xa4\x31\x25\x4d\xe0\xae\x57\x77\xb0\x03\xc3\x88\xf3\xb8\xce\x34\x83\xb5\xf3\x23\xa9\x8e\x1f\x97\x2c\x64\x2c\x6d\x9c\x0f\x84\x08\xed\x80\x78\x06\xbf\x0e\x67\x0c\xa6\x80\x81\x5c\xa0\x9f\x38\x62\xf9\x83\xcd\x25\xe6\x68\xf3\x4b\x73\xc9\x7a\x9c\x18\xd0\x79\x49\x5d\xc6\x68\x0e\x14\x49\xc6\x58\xf3\x24\x2e\x49\x9e\x09\x60\x2c\x50\xc8\x2f\x91\xc6\x27\x66\x4a\xdb\xcb\x49\x9f\xe2\x6a\xac\xd3\x42\x0c\x54\x3b\x2e\xd2\xfd\xc6\x82\x76\x02\x88\x60\x59\xc7\xd7\x61\xcb\xed\x5e\x89\x57\xb6\x3d\xb9\xd5\x7b\x9b\x6d\x07\xbb\xca\xc7\x69\x32\x48\xf0\x98\x5b\x60\x25\x53\x09\x74\x11\x3b\xec\xa4\x8b\x0f\xf0\x8f\x14\x21\x1b\xd5\xdc\xde\xdb\xeb\xe2\xa9\xb8\x7f\xb6\xb3\x68\x68\x15\x71\x91\xb9\x15\x7c\xde\x57\x0c\xc7\x00\x5f\x0c\xc0\xfd\x85\x8f\x5e\x53\xe8\x6e\xb2\x97\xde\xfe\x0b\x2d\xe2\x1a\xa8\x45\xf0\x39\xa1\xbd\x5c\x7a\x42\x7b\xaf\x66\x28\x40\xbe\xc4\xbe\x96\xf2\x6e\xac\xbd\xc5\x07\x19\x97\xf0\x33\xe5\xac\xb5\xe7\xcc\x70\x50\xbc\x2e\x73\x97\xd2\xe9\xa6\xce\x58\x9b\x5f\x42\xc2\x0c\x83\x43\xbe\x63\x19\x24\xb9\xb0\x4e\x41\xdd\xc1\x34\xf4\x2a\x61\x18\x97\x83\x69\xc4\x3b\xbb\x9f\xa2\x0a\x60\xda\xd4\xac\xf3\x4b\x28\x43\x4e\x7c\x7e\xf2\x61\x9d\x20\xf2\xce\x92\x5e\x1a\xcb\x96\x22\x45\x64\x7e\xcf\x8f\x90\xde\xe8\x99\x83\x38\xeb\x11\xd9\x9e\x4f\x7b\x44\x5e\x28\xe1\x44\xfc\xba\x78\xc9\x73\x71\x92\xc7\xc6\xb3\x11\xbb\x6c\xef\x82\xc4\xda\xe6\x4d\x39\xa7\xb4\x99\xc6\x04\x66\x75\x44\x12\x41\x08\xc3\x57\xe1\xb3\xfe\x39\x85\x9e\xc9\x46\x76\x35\x89\x69\x41\xe6\xe6\x77\xe7\x43\x52\xd6\x88\xae\xb3\xfb\x9a\x82\x7d\xe7\x55\x9c\x43\xdc\x4c\x0e\xe0\x1d\x7d\x2d\x00\x21\x44\x92\x2a\x43\x12\xec\x30\x08\x40\xd9\x0c\xf5\x65\xda\x0c\x4e\x1b\xb5\xa3\x00\xa5\xb7\xe7\x7f\x65\x50\xe0\xf1\x3f\x5e\x5f\xde\x03\xce\xcd\xfe\x53\xf1\x04\xf1\x32\x0c\x3d\x52\x3e\x24\xe3\x1f\xaf\x2f\xb1\xf5\x7e\xa3\x0e\xa5\x89\x99\x97\xcb\x6c\x72\x50\x90\x1e\x8d\x37\x5e\x98\x83\xd3\xb8\xea\x8f\x8c\x38\xc0\xd4\x04\x33\x1a\xfa\x4e\xaf\x37\x7e\xaf\x20\xac\xce\x11\x5c\xc5\x7c\x94\x8d\x38\x32\x23\x74\x75\xfc\xcd\x73\x32\xd7\xd0\x38\x39\x47\x5a\x17\x0b\x53\xce\x78\xa2\xc0\x50\x51\x7c\x20\x9c\xf3\x33\x96\x15\xfd\xef\x9e\xb4\x1c\x75\x54\x94\x1d\x6f\x9c\x78\x09\x30\xd3\xf2\x38\x34\xce\x1f\xd0\xcb\x60\x1e\xc1\x3b\xb9\x85\x60\xa9\x01\xea\xe7\x7b\x71\x2c\xf8\x99\xa6\x33\xf1\x0e\x7f\xdd\x0f\x5e\x3c\xed\x14\xe6\x3d\x7d\xde\xd7\xd7\x3c\x92\x0d\x47\x83\xcc\xad\x40\x51\xd4\xfe\x7b\x38\x3b\xff\x21\xfe\x1e\x96\xca\x3f\xc4\xdf\xb5\x69\xd5\x97\x7f\xf0\xad\x59\x7c\x5a\x3c\x90\xbb\xd3\x49\xc8\x13\x54\x7d\x87\x41\x80\x62\xf9\xe9\x3f\x74\xdd\x78\xb7\x94\x52\x13\x05\xcf\xda\xe1\xb3\x49\xbd\x5e\x0e\x78\xf2\xf1\x95\xe6\x24\x3a\xd0\x72\x2a\x35\xe0\xdd\x12\x06\xc5\x80\x03\x19\x7c\x9b\xc4\x99\x78\x83\xd1\x30\xf8\x6e\x9c\x39\x19\xc8\x1e\x97\xc7\x1d\x46\x57\x1f\x7c\x5d\x87\x7b\x6b\x80\x53\x06\xee\x3e\xe2\x2d\x27\x5b\x76\x27\x39\x53\x82\x3b\xc5\xef\x68\xf9\xf8\x02\xbe\xc4\xff\x69\x4d\x2e\x89\xe3\x1d\x0f\x78\xd2\x79\x5b\xbb\x70\x76\xb0\xc1\x4b\x26\x28\xc3\xed\x59\xe1\x8b\x1e\xb6\xb3\x77\xc2\xf6\x7a\xad\xc3\x8a\xa3\x67\x63\x22\x62\xa3\xf6\xf4\x3a\xcf\x46\x3a\xc4\x1b\xdf\x1a\xc1\xd0\xf5\x58\x8d\x8c\x0f\xdc\xba\xb2\x82\x52\x47\xb2\x18\xc9\x25\x91\x1f\x86\x17\x0f\x32\xad\x81\xb9\x53\xbd\x8f\xd7\xa6\x5e\x7c\xb0\xe2\x5a\xad\x87\x4e\xf6\x79\x10\x80\x71\x81\xf1\x82\x64\x3c\xa4\xde\x84\x33\x3f\x2c\x0b\xd1\x13\xae\x5c\x41\xc0\xe1\x00\xe8\xf6\x23\xc8\x26\x3d\x06\x12\x1e\xd7\x82\x7a\x26\x07\x8a\xa6\x27\xf4\xe8\x4a\x19\x00\xa9\xa8\x38\x1b\x0d\x6a\x03\xdc\x21\xcf\xb5\x82\xc3\xc4\x53\x1b\x30\x0e\xd2\x4c\x0b\x92\x55\x1c\x47\x42\xa2\xfb\xe5\x91\xa6\x07\xa1\x31\x46\xdb\x28\x30\x44\xd2\xb8\x23\x14\xbf\x51\x8a\x4d\x02\x9b\xd5\x32\x82\x7f\x4e\x08\xf0\x6d\x98\xb3\x40\x9a\xf0\xe7\x7b\x7e\x5d\x66\x0a\x16\x15\x23\xe9\x49\x99\x72\x50\x32\xb9\x08\x48\x01\x4d\xd2\xe8\xb9\x23\xdc\x62\xcd\x26\x7b\xb1\x15\x54\x57\x10\x33\xce\xcd\x34\x6f\x34\x4d\xb3\xe1\xb6\xf4\x2a\x5b\xc3\xe0\x67\xa5\x4d\xab\xef\x74\x3b\xc8\x8e\xde\xc2\x3a\x8e\xf7\xa7\x12\x6f\x63\x0d\x68\x44\x8e\xe2\x1e\x75\x08\x68\x1b\x84\xca\x7d\xdc\x93\x31\xf9\x2a\x3d\x73\x35\xdb\xa3\x40\x76\xa3\x79\x18\xed\x24\x0c\xbb\x9a\x9e\xad\xc9\x75\xf5\xa8\x88\x87\xf5\x81\xc1\xbb\x79\x95\xfe\x3c\xe1\xf2\xc8\x9e\xeb\xd7\x3e\xe0\x04\xf6\xe7\x85\xf4\x72\x16\x8c\x27\xf4\x3d\x7b\x54\x29\x28\x04\x2c\x57\x2b\xbd\x4c\xb7\xa1\xc6\x52\x28\xad\xa5\x6c\x6e\x67\xf5\xac\xb3\xf8\x67\xf6\x57\xae\xca\x0d\x03\xc7\xc2\x38\x78\xbc\x85\x8a\xc3\x41\x72\x32\x65\x5e\x27\x17\x0e\xd7\x39\x69\xe2\x06\x27\x4f\x2e\xe8\xca\xf8\xed\x8a\x4c\xe3\x57\x3a\x88\x42\xd3\xe6\xe8\xd1\x91\x81\xe2\x0e\x14\x0f\x4f\xfd\x33\xa3\x75\x7c\xa0\x12\x21\x7a\x30\xbe\xda\x71\x7c\x3f\x1d\x25\x6c\x59\x14\x34\xee\x4d\xa0\x93\x07\x34\x55\x9a\xba\x9e\x9d\x52\x50\xa1\x90\x1b\xa4\xc2\x30\xdc\xa7\xc4\x41\x9e\x46\x93\x61\x7a\x58\x30\xb3\xe1\xc4\x3d\x74\xbc\x85\x70\xd2\x61\xb7\xcf\x39\x88\x17\x33\x73\x70\x17\x14\xf8\x85\x9d\x32\x2d\x58\xd4\x62\xc4\xd1\xa9\x82\xe9\xfe\xf5\xf1\xc0\x8d\xd4\x31\xf9\x6e\x1e\x19\xcb\xdd\x0f\x3c\x93\x32\xdd\xf3\x7c\x8c\xbf\x53\x7b\xb2\x5d\x4d\xf2\xad\xbc\x05\x7e\x9a\xa9\x31\xc4\xd4\x64\x32\x3b\x83\x6a\xf6\x1c\x48\xef\x82\xc5\xa6\x71\x81\xfe\x78\xf3\xca\xc8\x7c\x73\x11\xf9\x32\xa9\xb3\xad\x47\xf6\xb9\xe7\x6d\x0b\xfd\x29\xec\x74\x8f\x16\x18\x05\xbc\x2d\x70\x95\x41\xf5\xa7\xeb\x65\x54\x31\x47\xd6\x9f\x5e\x4f\xd8\x3e\x37\x47\xcd\x1b\x36\xd3\xa5\xd9\x62\x85\x09\x0f\x1c\x64\xb0\x1e\x93\x7b\x2b\x19\xea\xe5\x97\x34\x79\xd4\xc7\xf2\x50\x1c\xad\xd9\x7b\x22\xf1\x73\xa3\xf0\xbe\xf6\xd8\xc8\x5d\xcc\x8e\x1a\x45\x0b\xcd\x55\x19\x49\xfd\x35\xf2\xe8\xca\x34\x61\x85\xc6\x1a\x9e\xde\x4c\xe1\xa7\x02\xff\xb9\x9c\x0c\x7c\xf1\x12\x67\x19\x81\x8a\x94\xa4\xf8\x2a\x02\xb0\x8f\x79\xd9\x45\xb9\x2e\xf6\xa8\x76\xa2\x35\x44\x4a\xa8\x91\x76\x2a\xde\xf8\x92\x8a\x0a\xcc\xa2\xb6\x43\xb3\xc1\x1b\x5e\xd0\x44\x41\xb8\x27\x71\xf5\xfe\xe6\x83\x40\x1d\xb4\xef\xf5\x7a\x1d\x8e\x5d\xf1\xe7\x8d\x32\x81\xa6\xc1\x2d\x11\xd2\x35\xdb\x34\x03\xea\x2b\x5f\xd9\xb5\x3b\x15\x7b\xc5\x51\x76\x4d\x4b\x87\x50\xfe\xce\x0d\x2b\x61\xd0\x54\x52\x6c\xac\xc3\xc7\x3b\xdc\x4e\x35\x7a\x75\x58\x88\x4b\x25\x7b\x23\xb6\x41\x82\x60\x92\x79\xaf\x13\x72\xec\x09\x04\x10\x7a\xf6\x54\xe6\xca\x7a\x1a\x92\x7c\xf9\xd2\xf1\x34\x19\x9e\x31\xe8\x5c\x58\x5b\x1e\xe1\xfb\x6c\x00\xe0\x99\x34\x3c\x90\x35\xc4\x9e\x66\x4b\xd3\xaf\x58\xa6\x93\x36\xa4\x35\x4a\xed\xfd\x6a\xc2\x4b\xa8\x16\x1e\x75\xf7\xd4\x96\x33\xf1\x41\x39\x08\xf9\x09\xdf\x0f\x80\xf3\x10\xdc\xa8\xd0\x27\x01\xee\x35\xa0\x9f\xc5\x65\x11\xb1\x86\x29\x55\x8e\x6c\x02\x78\x8c\xdc\x54\x67\x36\x5b\x47\x16\x9c\x3a\xe0\xd8\x8f\xfb\x89\x6b\x1f\x4d\x1d\xb1\xba\xbf\x0d\x6a\x50\x0b\xf1\xc6\x8b\xad\x3c\xc0\x5b\xb3\x60\x91\xe8\x54\x63\x4d\xeb\xd8\x50\x4e\x7b\xf0\xd2\x76\x62\xd8\xb1\xd7\xfc\x64\x4a\xa6\x6d\xeb\x55\x36\x56\xd7\xf1\xe3\x3e\xc0\xac\x07\xaf\x43\xcb\xbd\x74\xb7\x23\x1b\x95\x20\xff\x7d\x63\x2f\x52\x20\xe2\x58\x82\x1e\xcc\xd0\xe6\xde\xf6\xe7\x37\x40\xca\xf9\x39\x10\xb7\xb3\x18\x9c\xf2\x9a\x7e\x4e\x81\xd0\x40\x08\xfa\x84\xbf\xa6\x20\x3b\x7a\x77\x3c\xbe\x40\x3e\x05\x59\xda\x36\x8c\xe3\x2f\xb6\x3d\x4c\x75\xe1\xbc\xba\xa2\x42\x1c\x68\xd1\xce\xee\xe1\x26\x78\x79\x80\x0c\xed\x9d\xea\x56\xf8\xa6\x45\x90\x5a\x15\x07\x03\x82\x5b\x83\x74\x0b\x8b\x24\x80\xe6\x19\xee\x4c\xc0\xcb\x34\xb7\xec\xc5\x87\xe8\x8a\xc7\xb5\xc6\x6d\xc2\x50\x41\xd4\xae\x37\x28\x71\xc0\x6a\x04\x25\x38\xc6\x68\x3a\x0d\x12\xfb\x2e\x0b\xa7\xc0\x6a\xb2\x5d\xaf\x1c\xf8\x70\x01\x0d\x83\x47\x6d\x19\x04\x45\x36\x8c\xd6\x91\x45\x5a\x4d\x8c\xba\x76\x50\xcf\x4c\x8b\x28\x32\x2e\xac\x2c\x88\x89\x3b\x81\x48\x3e\x5c\x00\xc4\xaf\xee\x8c\x59\x30\x02\x4f\x1a\xf6\xd7\x05\xf9\xcb\x0e\x90\x38\x31\x76\x4d\x7c\xa3\x43\x02\x80\x3a\xab\x70\x30\xb0\x8a\x2a\x33\xa0\x0e\x63\xf5\xf1\xfa\x32\x27\xe6\xa7\x42\x86\xe3\x1d\xf5\x1c\xad\xf2\xf0\x8c\x5a\xaf\xd6\xb2\x6f\x39\x36\x11\x1d\x30\x1b\xe9\xf1\x20\xe9\xc3\xf0\xb1\x8a\x02\x22\x06\x12\x2e\x0c\x2b\x71\xab\x0d\xc4\xf5\x05\xc9\x84\x94\x8a\x41\x48\x4c\x06\x4a\xe1\x50\x19\x76\xe1\x9c\xc1\x43\x8b\x2b\x82\xbe\x7f\xff\x1f\x37\xef\xdf\x9d\x8a\x2f\x4f\xf6\xfb\xfd\x93\x50\xfc\xc9\xd0\x77\xca\x84\xbe\xb4\xa7\xe2\x7f\xbd\xbd\x3c\x15\xca\x37\x3f\x2c\xc4\x5b\x3c\x7e\x12\x55\x27\xbb\x65\x70\x81\x00\x23\xe0\xa1\xff\x17\x8e\x25\xda\x3a\xa4\xb0\xcd\x1f\xf0\xcf\x99\xc8\x30\x8d\xec\x20\xcb\x6f\xdf\x83\xa3\x6c\xc6\x90\xd0\xd3\x24\x37\xf0\x63\x9c\x91\xe8\x37\x80\xf1\x42\x85\x37\xcb\xa4\x13\x37\xaf\xcf\x7f\xfa\xf7\xff\x29\x5e\xbf\x3d\xbf\x10\x1b\xf5\x45\xb4\x7a\xad\xf0\x7a\x92\xb7\xf6\x9d\xe6\x49\xff\x5f\x4f\xc2\x6a\x78\x72\xa3\xd7\x46\xfa\xa1\x57\xbc\x00\x90\x4e\xe4\x3c\x52\x27\x9b\xdb\xb9\x77\x2f\xc7\x20\xba\xb1\x86\x06\xe0\x4d\x63\x4d\xd9\x7b\x04\x61\x67\xae\x0b\x70\xe3\x4a\xca\xeb\xb0\x66\x22\x23\xb3\x51\x26\x10\xfa\xa1\x6b\xcb\x33\x7a\xa9\x78\x09\xa8\xf6\x8f\xe3\xc2\x10\xf8\x0f\x9e\xc9\x38\x13\xff\x01\x21\x9f\x36\x6c\xfd\x14\xb2\xb8\x77\x00\x3c\x2e\x1b\x36\x43\x9d\x09\x76\x67\xe2\x8d\x30\x41\x74\x60\xa1\x32\xe5\x45\xc1\x72\x8c\x83\x54\x7c\x67\xe2\x52\x79\xb1\x8d\x2a\x3f\x58\xe3\x88\x6d\x52\xa2\x34\x8d\x9d\xcf\xe6\x41\xf9\x25\x8f\x05\xc8\x66\xa3\xd3\x01\x2c\xfd\xd4\x66\xb3\xe7\x31\x12\xef\x31\x2e\x92\x07\x7f\x9c\xc9\x4a\x91\x7f\x53\x48\x45\x08\x73\x39\x37\x3b\x14\x8b\x71\x76\xe2\xb2\x83\x83\xaf\x8b\x73\xb5\xc1\xb8\xcc\x38\xd6\xe1\x6c\x76\xa4\xfa\xa0\x51\x47\x17\xcf\x53\x74\x5c\x6d\x4f\x05\x3b\x7d\x9e\x92\x3d\xdf\x29\x47\x89\x68\x4f\xc5\x60\xd2\x6f\x74\xb8\x23\xf1\x95\x3f\xc1\x9e\x38\x7c\x46\x73\xcf\xf6\x14\x5f\xb1\x4e\x09\x8b\x69\x47\x0b\x7b\x8e\xc2\x3e\xff\x1e\xd0\x68\xe2\x92\x5b\x07\xfc\xff\xdf\x9b\xbc\x2b\xd0\x37\x77\x30\xcd\xa6\xb7\x46\xff\x3e\xd3\x37\xbc\x5e\x49\x2e\xbb\x38\xe6\xec\xb8\x7b\x1f\x70\x39\x4b\x8c\x81\x16\x78\xea\x4e\x7c\x22\x7c\x5a\x37\x05\xa0\x4c\xf1\x27\x8f\x00\xa4\xc5\xca\xb6\x71\xcb\x4e\x83\xa9\x0a\xf8\x18\xce\xdf\x21\x63\xc8\x46\x8e\xdd\x38\xce\xc8\x83\x34\x1f\x3f\x0b\x51\x91\x1b\x49\x57\x3a\xbc\x98\x7c\x13\x3f\x88\x02\x21\xbe\x48\x51\x9c\xe2\x70\x84\x97\x6a\x81\x79\xa6\x7a\x6a\x9d\x96\x24\x48\xe2\x11\x26\x52\x12\x01\x8e\xea\x98\x08\x27\xb4\x66\xa6\x3a\x87\x54\xc3\x31\x39\x0c\xa3\x10\xb0\x7c\xc0\xaf\x9a\xc3\x9b\x76\x2f\x62\x5a\x29\xd5\xf2\x21\x09\xfc\x4f\x79\x42\x42\x18\x24\x38\x4c\x72\xce\x26\xc8\xc7\xa5\x1f\x73\x00\xa1\xe7\xdc\xbc\xe2\xb0\xbd\x93\x67\x28\x0f\xa3\xa1\x6e\xb5\x6b\x6c\xdf\xde\x8f\xfb\x05\x02\xfd\x33\xd8\xcd\xda\xcb\xee\x81\xa6\xbf\x20\xa8\x6f\xc3\x8f\x63\xc2\xaf\xc2\xe0\xeb\x35\xa3\xcc\xd6\x6e\x25\x98\xbf\xbe\x80\x1f\x93\xc3\x79\x23\x8d\x41\x53\x7f\xfc\x95\xcf\xf5\xae\xb3\x07\x7e\x67\xf4\x05\x7c\xf1\xd3\xe9\x53\x90\xec\x55\xce\xe5\xf3\x0b\x7c\x1b\xf3\x95\xf5\xcd\x46\x7e\xf7\xec\xe9\xf2\x79\xe0\xc3\xe9\x1e\xa0\xb3\xf6\x96\xbd\x7c\x64\x0b\xfb\x26\x3e\x34\xb3\x8b\xaf\x57\x26\x1b\x15\xd9\xb6\x68\x58\xa4\x0d\x0e\xc5\xe8\x49\xbf\xf4\x24\x13\xb6\x6a\xc4\xa5\xc1\x1c\xc4\x76\xd2\xd8\xa7\xde\xcc\x75\x26\x29\x0d\x00\x0a\x46\x60\x83\xcf\x9d\xc8\xf6\x09\x30\x1c\xa4\xbd\x15\x1f\x36\xea\x10\x03\x57\xc3\x8b\x72\x70\xa9\x5b\xbe\x9d\x03\xcd\xe3\x27\x45\xf3\xab\x47\x5b\x97\x83\xcc\x4f\x99\x40\x0c\x1f\xd4\x16\x99\x83\x68\x53\x33\x72\xf5\x69\xe1\x40\x33\xd7\x8b\xe9\x1b\x9e\x11\x6a\xfc\xd6\x68\xea\xe9\xd1\xb7\x46\xf3\xa2\xf9\x83\xa3\x59\x51\x90\x10\xe2\x20\xcc\x5a\x8c\x17\xd3\x32\x7d\x4e\x34\x75\xf5\x2b\x5e\x14\x9d\x9f\xb9\xb1\x8a\xe8\xc1\xa9\xbe\xcf\x61\xa4\xcd\x3b\xf7\x15\x6f\x8b\x8e\xc3\xd2\x7d\x85\xb6\x68\xae\x2d\xb9\x41\x71\x6c\xc0\xd7\xea\x8c\xf2\xe0\xff\x53\x67\xaa\x6f\x7c\x4e\x60\x16\xeb\x03\x4f\x0a\xb4\x7a\xb5\x5a\x60\x68\xe5\xda\xd9\xa1\x07\x73\x82\x5f\xe0\x5b\xdc\xc0\x37\x82\x50\x60\xc9\x33\x8a\x30\x89\x89\xd1\xc9\x92\xbc\x2a\x21\x11\xdc\x6b\x41\x03\x1b\x2b\x3c\x13\x2f\xf4\x6a\x85\xae\xb6\xef\xac\x4f\x4d\x59\x60\x11\xb7\xb1\xfb\x3a\xfc\x82\x17\x4a\xc1\xaa\x70\x63\xf7\x58\xe8\x26\xa4\x64\x60\x6e\xd7\x69\x5f\x53\x54\xe7\x9b\xf0\x01\x71\xa9\x33\x88\xc1\x40\x0c\x4a\x86\xf9\x88\x9f\x39\x54\x40\x19\x83\x6b\xf0\x45\xd4\x49\x1b\x03\x27\x82\xb6\x23\x5d\x51\xc1\x56\x61\xb8\x93\x16\x08\x21\xa8\x33\x12\x48\xfe\x82\xd0\x49\x1b\x15\xe5\x09\x82\x06\x1a\xa8\xfb\x2f\x6f\xde\xe1\x27\xc4\x54\xa6\x68\x58\x10\x5c\xfb\xa5\xee\x68\xbc\x21\xe2\xa2\x1b\x76\x10\xb8\x51\xb5\x1c\x50\x32\xe4\x89\x2c\x39\x73\x86\xcc\xc3\x6b\x23\x0e\x6f\x6d\xbd\x95\xe6\x10\x5d\xb7\x6f\xec\x56\x91\x2a\x67\xaf\x88\x0e\x42\x08\xee\xe4\x39\x6a\xad\x08\x45\x08\x8a\x07\x84\xd5\xc2\x01\x6d\xc5\x11\xc5\x17\x73\x91\xc5\x39\x0f\xc3\xc4\x33\xe3\x17\xc8\x05\x33\x7f\x0c\xd1\xf6\x72\x05\x8e\x7c\xe1\x7f\x4c\xdd\xf5\x2a\x15\xbb\xea\xd5\x93\x71\x31\x72\xb8\x0b\xff\x62\x9a\xdc\xa0\xb3\x47\x9a\x81\x34\x33\xec\x1b\xea\xad\x38\x71\x14\x77\x93\x76\x7e\x89\x18\x57\x7f\x4d\xef\x73\xe2\xda\x87\x97\x15\x8b\x3e\xe5\x9e\x7c\x57\xc8\xa0\x8a\x38\x0e\x60\xbe\x82\xaf\xd3\xed\x7a\xdb\x0e\x8d\x5f\x14\xed\x2e\x4a\x23\x47\xaa\x78\xd5\x89\xce\xae\x41\xe7\x01\x81\x92\xd1\xde\x77\x30\xad\xea\x9d\x47\xd3\x7e\x99\x91\x79\xbd\xdd\xf5\x78\x53\xc2\xe8\xbd\x5c\xc7\xd7\xf3\xe4\x1a\xc3\xb4\xa4\x3c\x50\xfc\x87\x9c\xf0\xa3\x28\x13\x39\x01\xf6\x02\xc8\xa2\xad\x7a\xb9\x06\xc6\xbe\xc9\xe3\xfb\x07\x61\xd4\x1a\x66\xce\xb3\x06\x14\x47\x1c\xa7\x4e\x8f\x35\xce\x29\x9d\x78\xb2\xe9\xa7\x6d\x4b\x01\xc6\x63\x4e\x67\x65\x8b\xb2\xff\x25\xfe\x5a\x2c\x16\x33\xab\x66\xfa\x7a\xfa\xae\x57\x4f\xc6\x73\x9d\xc1\xc7\x01\xf8\xb3\x7a\xdc\x75\x62\x67\xb5\xf1\x02\x9d\xd2\xa4\x2f\x56\x0a\x5f\x14\xd1\xd4\x6a\x6b\x9e\xc0\x79\x99\x9a\x31\x76\xc5\x8c\xd5\xd1\x42\x49\x4b\x66\xbc\xaa\xc1\xc9\x8d\x77\x04\x78\xb9\x95\xdb\x02\x56\x4f\xda\x18\xe0\x6e\x3a\xd9\x50\xc8\xef\x27\xa8\xd2\x2c\x60\x06\x18\xcf\x5e\x96\xb7\xe2\xc5\xe2\x18\x66\xfe\xb8\xe5\x7a\xc6\x6e\x6d\x8d\xed\x51\xdf\x1d\x6f\xd9\xbd\x5c\xdf\xfb\x50\xdc\xa8\xb6\xfc\xc2\x1a\xab\x78\xe0\x34\x1d\xef\x81\xd2\x49\x2e\xc3\x43\x3c\x4f\xa0\x94\xb4\x47\x26\x3c\xcf\x04\x17\x39\x15\x67\xfb\xaa\x78\xf8\x37\x95\xe0\x98\x36\xc0\x09\xf0\xef\xaa\xfa\x64\xfb\xf5\xe7\x0a\x6e\x25\x21\x0c\x7a\x8c\x5f\x9a\x5f\x41\x82\x9a\x39\xc0\x84\x1e\xdd\x07\xf8\x72\xe8\xba\x04\x5d\xbe\xd3\xf6\x2a\x6c\xd3\xd2\xa8\x27\x00\xa0\x92\x1f\x9e\x65\x23\x9f\x0e\x7a\x99\x6d\xc1\x4f\x7a\xd8\x7e\x9d\xbc\x38\xf3\xea\xf0\x81\xa2\xe4\x1b\x48\xaf\x16\x54\xe4\x6b\x71\x26\xae\xe0\x47\xa5\xcd\x9d\xf6\x81\x7f\xd8\x2a\xb4\x0a\x7c\x03\x09\x70\xde\x58\xa3\xaa\xc2\x1b\xa1\x82\x60\xeb\x35\x7b\x22\x9c\xb1\x4f\x02\xa5\x17\x76\x90\x67\x85\x59\x64\xfe\x04\x49\x40\x59\xba\x9e\x06\xe4\x30\x2a\x33\x4e\xe9\x01\x3a\x92\xc7\x50\x12\x86\x10\x52\xef\x83\x2e\x9e\x3d\x0b\xd4\x61\xe0\x80\x97\x80\x0b\x6c\x24\x0d\x4a\x7e\xb0\xa8\x02\x66\x6d\x8a\x48\x5c\x6e\x91\xaa\xc9\x68\xcd\x06\x3d\xd6\x53\xb1\xc0\xa5\x82\x41\xff\x1f\x11\xbe\x78\x77\x87\xd4\xae\x12\x9f\x2d\xc4\x64\x7a\xcc\x36\xd7\xc3\x02\xa2\x20\x92\xfc\xb1\x9a\x7f\xca\xe9\xfd\x78\x6d\xfc\x13\x8f\x39\x4d\x71\xdc\xfb\x9c\x13\xa0\x4b\x03\x9a\x35\x06\xe6\xe1\x48\x23\x22\x2b\xfb\xad\x4e\xa7\x71\xff\x04\x86\x29\xee\x95\xfc\x96\x8c\x9c\x23\xfe\x8c\xbf\x52\x56\x67\x1b\xf6\x54\xbd\xa4\x9f\x47\x6d\x6a\xee\xf3\x99\x28\x41\x33\x62\x56\x0c\x5c\xc4\xf4\xb5\x06\x38\xe4\x8a\x61\xfb\xf5\xbf\xe6\x89\x51\x3c\x2d\x3a\x69\xb5\xbc\x93\x5e\xf6\xc7\x1a\x8d\xb9\xdc\xf6\xaf\x6e\xfa\xd8\x4c\xad\xa0\x30\x63\x6d\xd5\xe4\xb1\x4f\xe8\xe0\xbd\x45\xca\xa7\x3f\xf3\x06\xc7\x7b\xc2\xcc\x4c\x8c\x6c\x4c\xf0\xd1\x4f\xb4\x75\x78\xf8\xe5\xcf\x23\x86\x46\xf7\x3d\x01\x3a\x6e\x65\xa0\x4c\x31\xac\x65\xde\xc8\x7b\x4b\xe4\xdc\x8c\x1d\x19\xad\xfc\xf3\xcf\x82\xce\x1b\xa8\x9c\xb7\x2d\xab\x2d\xe9\x15\x40\x1e\xbf\xa4\x1a\x5d\x65\x31\xe5\xc7\x6f\xda\xa6\x91\x03\xbe\x95\x1c\x16\x8b\xf5\x56\x11\xad\x5f\xd0\xff\x8d\xde\xd5\xc5\x53\xa0\x6f\x63\x7a\xf6\x2a\xe8\xcf\xb1\x18\xa9\x9c\x88\x8f\x6a\x46\xe9\x89\xbe\x42\x40\x04\x76\xff\x88\x40\xf8\x0d\xbc\xe5\x6c\xce\xb8\x7c\x59\x07\xfe\xaf\x7b\xdb\xa9\xd8\x50\x71\x6d\x3b\x95\x9a\x57\x06\x75\x2c\x0b\xc6\x32\x31\x9d\xf4\x13\xfc\x2e\x63\x4c\x2f\xdf\xf3\xe5\x54\x3a\x63\xf3\x97\x3e\x80\x1f\x27\xec\x20\xde\xfc\x3c\x86\x36\x10\x52\x9f\x4e\xe3\x77\x76\x5f\xe1\x51\xbc\x80\xa8\x91\x67\xe2\x3f\xac\x36\x94\x52\x56\x8a\x69\x81\x33\x4a\x6f\xd0\x5c\x07\x19\x0b\x1f\xa9\x9e\xe6\x8f\xde\xda\x83\x93\x28\xbe\xb2\x47\x6f\x65\x03\x63\x4f\xb1\x49\x0d\x5a\xf1\x94\xaf\xc4\x21\xd6\xd1\xd3\x37\x18\x2e\xa2\xa8\x37\x87\xf8\x9a\x8a\x21\x14\xc0\xb8\xba\x53\xd6\xe5\x83\x02\x30\xba\x40\xaa\x2d\xb7\x03\xec\xb9\x53\x3b\x20\x22\x41\xd9\x8e\x1c\xe2\x6b\xda\x11\x6a\x81\xc0\x74\xec\xe7\x70\xb4\x3d\xb2\x6d\x05\x9a\xa0\xe7\xc6\x67\x6e\xdc\xc4\xf4\xda\xdb\x87\xec\xfc\x07\xd3\xdd\x76\xc4\xcf\xb8\xc5\xdc\x91\x8a\x39\x68\x73\x39\xc3\x72\xa0\x19\xfd\xec\xeb\xed\x0f\x13\x01\x08\x38\x18\x4a\x46\xd0\xcc\x40\xbe\x78\x7d\x62\x7a\x2e\x61\xbb\x12\x8b\x08\xbc\x02\xd1\x06\xca\x7c\xf8\x48\x46\x38\x7e\x7e\x09\xf9\xc5\xfc\x50\x01\x86\x91\x67\xb2\x05\x88\x3a\xee\xd5\xb0\xc1\xb2\x5a\xa7\xc8\x22\x31\x07\xa8\x48\xc4\xa7\x70\xbc\x63\x73\x6e\x2f\xbb\x58\x52\x70\x7d\x56\xf8\xe5\x32\xd4\x56\x1e\xc6\xaf\x71\x43\xa8\x88\x62\xd7\x1c\x17\xac\xa6\x4d\x49\xe7\xfa\x2b\x7d\xa7\x4c\x5a\x30\x47\x85\xab\x45\xbe\xd5\xa7\x0b\x24\x23\xd7\x3a\x67\x82\xd7\x3d\x84\x4a\xe4\x99\x0f\xa4\x23\x5b\x18\x80\xfe\xe7\xd8\xe7\x46\x9a\x31\x6d\x00\x73\x45\x25\xb7\x8f\xef\x23\x11\xff\x74\x73\x80\xa4\xdc\xdf\x1e\x20\x19\x18\x19\xd8\xb4\x39\x79\xb8\xaf\x59\x48\x0f\xfe\xe9\x66\x01\x85\xf9\xca\x66\x9d\x72\x9b\x90\x8f\x09\xf4\x62\x8e\x52\xdc\xd7\xda\x91\xa0\x05\xcb\xf8\x3a\x97\xb6\x98\x6c\x80\x05\x2e\x48\x82\xb3\x16\xb8\x99\x82\x7a\xb1\x18\xef\xa7\xcc\x84\x38\xdb\x53\x99\x8f\x02\xb7\x05\x8c\x85\xc9\x97\x8b\xce\xc3\x84\xca\x58\x03\xf2\x39\x5e\x16\x47\x7f\xaf\x0c\x39\x5d\x57\xf9\xfe\x40\x3c\x11\x3c\x32\x56\xbc\x20\x1a\xef\xa8\x48\x9d\xa5\x63\xac\x95\xea\x13\xcc\xdc\xe7\xaa\x95\x6e\xb3\xb4\xb2\x87\xab\x12\xfe\x5d\x15\x7e\xfc\x55\x4e\xa8\xc6\x1c\x32\xbe\x12\x9c\x0d\x6a\x31\x9e\x72\xf0\x9b\x20\x2e\x46\x39\xe3\xbc\x48\x70\xf8\xbe\xfc\x9a\x99\xc9\xf5\x40\xa1\x72\xc8\xc9\x00\x7c\xca\x9d\x57\x5b\xf1\x0e\x13\xaa\xad\x35\x1a\xed\x99\xdf\xe2\x2f\x6d\xd6\x55\x11\xef\xe9\x65\xf8\xa8\x20\xc2\x0f\xa5\x5c\x4a\xe7\x2b\x6f\x3d\x3c\x13\xfb\x21\xfc\xff\x59\x9c\xb4\x55\xea\xfa\x62\x39\xe8\xae\xe5\x70\x4a\xbf\x84\x0f\xf1\x26\x99\x65\x65\x80\x72\xb7\xab\xef\x90\x58\xee\x76\x1d\x77\x8b\xdd\xbe\x12\xdc\x5a\xfb\x9a\xe3\xb4\x9c\xe5\x51\x5b\x72\x18\x9b\x83\xd8\x19\x08\x6c\x96\xd7\x20\xda\x61\xb3\xc2\xc7\x04\x22\xde\x49\x20\x0c\xdf\x4c\x44\x28\xe7\xa5\xd7\xce\x03\x17\x79\xc3\xbf\x5d\x06\x90\xac\x15\x31\x1a\x1f\x7d\xe4\x28\x60\x1a\x6a\x32\x0e\x8d\xd3\x42\x93\x00\x58\x07\x37\x57\x25\x8f\x2a\x98\xf9\xb5\xd2\xcb\x25\x6b\xb7\x9e\x2d\x41\x69\xbd\x7c\x8e\x9a\xdf\xd3\x2c\xa1\x58\x70\x79\x46\x71\xff\x9a\x92\x4b\xa6\x22\xa5\xe3\xd3\xd7\x45\x92\xf3\xb2\xac\x4b\x36\x93\x5a\xf8\xca\x2c\x4f\x63\x87\x99\x94\xc2\xae\x33\x05\x76\x0b\xd1\x07\x48\x46\x2a\xb2\xd0\x3f\xac\x48\x42\x5f\xc4\x51\x4f\x50\xaf\x9e\xa7\x75\x76\xad\x8d\x40\x5d\x7d\xd9\x3d\x92\x5c\x4a\x9c\x1c\xec\xad\x40\x01\x41\xc8\xf3\x94\x0d\x1b\x11\x17\xa9\x40\x7f\xf2\x04\xb2\x0e\x9e\x00\xa6\x68\xd7\x6e\x31\xb7\x90\x58\x21\x11\x17\x13\x6a\x25\xe6\x20\xdd\x5e\xe3\xbb\xbf\x37\xf0\x63\x16\xa6\x1f\x40\x6b\x3b\xe4\xbb\xa3\xe9\x94\x34\xf5\x60\x96\xda\xb4\xb5\xa5\xd7\xb3\x2f\x42\xa2\x18\xcc\x12\x4c\x28\xdf\x03\xb9\x71\xf7\x16\xca\x38\x84\xf3\xae\x13\x98\xc5\x25\x33\xbf\xb4\x79\x56\x21\x61\x26\xa6\x83\x0c\x78\x65\x92\x94\x5d\xe2\xc1\x24\x84\xbe\x25\x03\x1e\xce\xfe\x2a\x1c\xa3\x56\x26\x88\x88\xe6\xdb\x9b\x0a\xe7\x5b\x38\xcf\xf4\x9d\x1a\x35\xb2\xf4\xcc\x26\x90\x07\x30\x8c\x9a\x38\x8b\xe2\xdb\x1b\x09\x7c\x85\x59\xe3\xa9\x7a\xa4\x91\x07\xd1\xab\xc6\xf6\x2d\x89\xf0\x9d\x75\x1e\x68\x2e\xbe\xb3\x7a\x3f\xca\x63\xad\xbe\x17\xe7\x37\x74\x23\x9c\x04\xeb\x26\x35\xdf\x8a\xb5\xec\x97\x72\x8d\x7e\x48\x14\x60\xca\x96\xbe\xf0\x47\x8a\xdf\x37\xc0\xd0\xa0\x36\xf0\x91\x33\xe8\x8f\xb5\xad\x57\x10\x98\x45\x76\x5d\xed\xdc\x86\x6c\x3c\xae\x15\x5e\x53\x3d\x5e\x38\xb7\x79\x2a\xe9\x21\x7a\x05\xd6\x10\xee\x31\xbe\x51\xf4\x7d\x23\xc1\x95\xff\x67\x08\xa3\x04\xa4\x1d\x4a\x33\x8f\x1f\x46\xeb\x87\x7b\x2b\x1a\xf5\x25\xa3\xeb\xd9\xd8\xf6\xd0\x14\xaf\xbe\xaa\x07\x1c\xf9\xe6\x1a\x92\xe8\x0a\xac\x51\x60\x4b\x4f\x54\x0c\xf8\x5a\xeb\x3c\x67\x90\x3d\xbf\x5d\x4d\xd6\xfc\x3d\x55\xdc\x33\x0b\x8f\xbf\xa5\xd6\xbc\x9b\xa1\x86\x7b\xd6\x50\xaf\xb4\xd1\x7e\xb2\x15\xae\x21\x59\xcb\x4e\xff\xfe\x4f\x6e\x88\x39\xc4\xff\xea\x86\xe8\xb3\x56\x8d\xbb\x94\x33\x08\x10\xba\xae\x1e\x76\xc4\xde\xdc\xe0\x4b\xfc\x1f\x77\x23\x0e\x07\xac\xf5\x8d\xaf\xd7\xb6\xb7\x83\xd7\xf8\x66\x1b\xa6\x89\x57\x9c\xe6\x66\x0a\xc0\x9d\xcf\xa1\x1e\x28\x04\x27\x97\x79\x0b\xc9\xe2\x23\x3c\xba\x97\x4a\x01\x7b\xc8\x65\x64\x07\x9a\x71\x54\xd9\x03\xdf\x48\xa5\xce\x39\x23\x2b\x49\x65\xec\xd2\x4b\x8a\xab\x48\xc0\xef\x29\x25\x83\x85\x9b\x56\xd5\xd7\x9d\xb5\xb7\xc3\x0e\x38\x3b\x88\x0c\x85\xc9\xe2\x12\x92\xc5\x87\x90\x3c\xad\x81\x5b\x15\x8b\x8d\x1a\x75\xac\xdc\xaa\x57\x93\x32\x2f\x7b\x35\x85\xe7\x91\xdb\x28\xb9\x9b\x8c\xdb\x6b\x25\x77\x93\x51\x03\xc8\xe9\x00\x00\xec\xf1\x51\xc8\x4b\xe9\x16\x14\x0a\x79\x89\x37\x6d\x77\xac\x0e\x0d\x06\x61\x63\x78\x13\xc4\x94\x23\x25\x88\x9f\x1a\xb7\x8a\x6e\x47\x27\xad\xb2\xcb\xbf\xaa\xc6\x3b\x86\x7e\x8f\x9f\x39\xc3\x6d\xad\x77\xbe\x97\xbb\xc0\x0a\x83\x0b\x02\x0e\xd3\x2f\x9c\x1e\x58\xe1\xe6\x76\x32\x52\x08\x3d\x1d\x2a\x84\x3e\x3e\x56\x5b\xb7\x93\xa6\x76\xbe\x1f\x1a\x3f\xf4\xca\xc5\x0a\xdf\xde\xec\xa4\x11\x37\x31\x63\x52\xe3\xa4\x64\xbe\x42\xc7\x85\xe7\x6a\x6e\x64\xb3\x51\xb3\x55\x5f\x84\x9c\x7b\xeb\x9e\x94\xcd\x2b\x9f\x14\x9f\xdb\x29\xbd\x5d\xe9\x2e\x10\xa5\xe5\xd0\xdc\x2a\x5f\x6f\xa4\xdb\xd4\x1e\x5e\x11\xcd\x70\x5d\x31\x98\xf8\x05\xc0\xc4\x6b\xe9\x36\xe2\x03\x68\x1f\x67\xb0\xae\x9b\x7a\xab\xbc\x04\x73\xad\x0c\xcb\xab\x0b\xf1\x96\x92\xe7\x4a\x81\x56\xb2\x26\x09\x88\x76\x61\x60\x4a\x33\x0c\xef\x41\x71\x49\x42\xd1\x79\x04\x99\xc3\x66\xd4\x17\x3a\xd2\x9b\x43\x43\xef\xd6\x7f\xf1\xa1\x0d\xd7\x98\x92\xc1\x82\x14\xbb\x6e\x58\x04\xbc\x01\x4b\x1e\x88\x56\xfb\xea\x02\xb6\xef\x84\x82\x25\x60\x24\x5c\xaf\x2e\xc4\x95\x1c\xdc\x2c\xe0\x4e\xe2\x66\x3a\x0a\xc9\xd5\x33\x20\xd7\x3c\x86\xa3\x4a\x1d\x0e\x25\x92\x15\x54\x21\x2c\xc0\x8b\x19\xa3\xc3\xd6\x3b\x89\x96\xbc\x1f\x9d\xea\xc5\x5b\x8c\x18\x7b\x15\xd2\x08\xd6\xa8\x7d\x7e\xbb\x94\xae\xb9\xcf\x31\x91\xc1\x50\xb2\x00\x79\x02\x53\x98\x17\x6e\xd9\x28\x1e\x48\x34\xe5\x15\xd1\x75\x31\x2d\x1d\xa0\x3b\xeb\x28\x8d\xa3\x9e\xc7\xc7\xf9\x28\x1d\xfc\x70\x7a\xb5\xd6\xce\x53\xe0\x11\x88\x2e\x0e\xce\xaa\xd7\x90\xcc\xf2\x4d\xee\x7e\xfc\xc1\x42\x2f\xb3\x8e\x95\x76\xa4\xdc\xcd\x87\x23\xaf\x2f\x08\x47\xfe\x10\x14\xf5\x0c\x84\x17\xb6\x5f\x2c\x15\x2b\x6c\xc7\x88\x90\x61\x39\x76\x74\xc9\xdb\xe5\xa5\x41\xb2\x64\x51\x6d\x84\xe1\x12\xa4\xce\x6c\x94\x77\xd2\xb9\x3d\xd8\xa1\xb3\xda\x1f\x2e\x4e\x84\xf6\xe4\x73\x08\xd7\x0e\x60\xcd\x3d\x18\xb2\xa2\xe3\xd6\xa7\xd8\x88\x64\xe4\x17\x59\x0c\x1a\x08\xca\x79\xe8\x82\x35\x8d\x45\xb6\x52\xc0\x32\xa8\x5c\x23\x5b\xf9\x05\x85\x13\x18\x52\x0a\xcc\x4e\x96\xa4\x99\x63\xd0\x05\xe7\x5e\xea\xad\x3e\x5a\x96\x75\x9a\xdf\xdf\x28\x2f\x9e\xfc\x08\x4e\xb3\x4e\x89\x75\x67\x97\x10\x8d\x16\x43\xea\x76\x01\xc5\x0f\x84\x43\xbb\x3a\x5f\x94\xa0\x7b\xe7\x06\xc3\xcf\x72\x91\xee\x7a\xbb\xd1\x4b\xed\x71\x42\x66\x0a\x30\x00\xbf\x1d\xba\x8e\x6b\x39\xd4\x44\x4b\xbc\x28\x04\x61\xa0\x42\x06\xae\x50\xdb\x67\x76\x14\xbc\xe6\x31\x2c\x56\x10\x31\xc8\x5b\x62\x82\x21\x2b\x93\x3d\xbb\x1a\xd8\x3e\x0c\x3d\x99\xe3\xd1\xdb\x9d\xed\x43\x17\x70\xb1\x3d\x84\x0b\xc1\x05\x82\x17\xbc\xf7\xdc\x92\x49\x77\x1d\xbc\x62\x90\xf4\xf3\xe2\xbc\xf7\x2a\xbd\x5c\x1b\xf0\x02\x4d\x6d\xf7\x26\xe9\x55\xb3\x96\xe2\xfb\x34\xa1\xbd\x29\x2c\x87\x0d\x9c\x69\xe0\x79\xe1\x5d\xc9\x20\x64\xe5\xe1\x55\x62\x34\xa4\xf4\x10\xa2\xed\x63\x04\x0f\x74\x0d\x20\xad\x6b\xde\x80\x8d\x74\x64\x85\x74\xa4\xfe\x6d\xa1\x42\x2f\xaa\xcf\xf5\x63\x65\x03\xf0\x4e\x33\x7a\x26\x4d\xee\x99\x5c\xd9\x94\x19\x03\xb4\xf3\x6c\xca\xee\x7b\x0d\xc0\xf6\x14\x79\x62\x44\xdd\x8b\x8b\xfe\x82\xca\x43\x89\x9c\x7a\x43\x42\x69\x28\x05\x49\xe9\x12\x8c\xef\xbf\x50\xc9\x0c\x84\x7b\x5c\x5f\xb6\x9d\x8b\xda\xb0\x44\x79\x3d\x8d\x69\x79\x13\x30\x65\x7a\x4d\x8e\xe9\xa4\x3f\x14\x67\xe2\xcf\xf8\x8b\xd2\x41\x89\x88\xdc\x5b\xcf\x69\x63\xff\x3f\x82\x0c\xb2\x59\x38\xb9\x7f\x57\x15\x68\xc3\x0b\xba\xed\x8e\x11\x6e\x47\xb0\xf8\x82\x0b\x07\x6b\x21\xa2\x4e\x59\x59\x2f\x30\x25\x7f\xe5\x16\x53\x14\x44\xe5\x6b\x63\x7c\xbe\x96\xd2\x99\x66\xc5\x80\xe0\x94\x3e\x35\x7b\xcb\x9a\x4c\xe8\x47\xed\xcd\x6a\x03\xa8\xf9\xc3\x24\x6b\xa5\x53\xcd\xd0\x6b\x7f\x80\x40\xb9\xb6\xb1\x1d\xba\x0e\x43\x1a\xc4\xc8\x0d\x69\xdc\xce\x91\x73\x10\xa6\x42\x34\x8f\x33\xf1\xda\x3a\x6e\xf7\x0e\xdf\xbf\xbd\xb2\x3d\xa7\x80\x7e\xaf\x05\xcb\x73\x6d\x5a\xf1\xe2\x5d\x99\x5e\x58\xb9\xc5\xc8\x89\xf8\x96\xbf\x2b\x22\x28\x72\x78\x44\x8c\x8e\xa8\x16\xeb\x85\x78\xf1\xfe\xed\xff\x75\xe2\x72\x84\x7c\x34\x72\x75\x57\xf4\x3d\x07\x93\x59\xc4\xc9\xde\x68\xb3\xfe\x99\x9e\x9c\x62\x1c\xf0\x48\x96\xed\xd1\x04\x7d\xd7\x85\x01\xf0\xea\x8b\x87\x5b\x4f\x63\x3d\xbd\x76\xbd\xd1\xeb\x0d\x98\x7b\xe8\x4e\xad\xd1\xcd\x23\x6c\xdb\x05\xcf\x64\xe0\xbb\xe8\x3d\x3b\xe0\xb7\xe8\xe6\xea\x17\xe9\x54\x0e\x02\x43\x04\x00\x71\x88\xa4\xc7\x50\x8d\x6a\xce\xbf\x5a\x9c\x73\xee\x51\xe8\xf1\x33\xe4\x40\x91\x22\x87\x10\x5a\xef\xf4\xda\x3c\xd1\xf0\xfa\x4b\x20\x8d\xaa\x6b\x29\x5e\x41\x11\x8b\x72\x31\xa9\x81\x8d\xdc\xe0\x19\x8f\x77\xf7\xb7\xc6\x0d\xdc\xf4\x9b\xe1\xa1\x96\x6f\xa5\x86\x90\xa6\xf0\x7f\x0c\x76\xa7\x7a\xbd\x3a\xd4\xeb\xde\x0e\xbb\x3a\xa3\xc9\x67\xe2\x4f\x90\x23\x20\x27\xa3\xd6\x54\x0e\x0b\xd0\x55\x22\x04\x9e\x84\xb1\x7e\x05\xd0\xd9\x6c\xa4\x81\xc7\x12\xf8\x06\x49\x84\xc4\x47\x48\x0a\x88\xd4\xf0\xc6\x9a\x20\x5f\x60\xac\xa0\x0e\x0d\x7f\xb1\x58\xec\x05\x18\xa1\x4b\x0d\x0f\x47\x5f\x52\x5c\x70\xbc\xd5\xcb\x56\x41\xc2\x18\x90\xa8\x36\x08\xda\xd8\x2d\x5a\x1c\x09\xdd\x25\x00\x40\x20\x9e\x00\x30\x1e\x4b\x17\x8a\x82\x06\xfd\x4c\xbc\x54\xbe\xd9\x88\x94\x15\x0a\xd1\x6e\x44\x2f\xae\x2f\xbc\x5b\x63\x9f\xa1\xb2\xa2\xcb\x78\xc1\x1c\x01\xd0\x24\xa5\x80\xd8\x06\x0e\xa8\x76\x32\x1c\x17\x4e\x9c\xb7\xe2\xe6\x9c\x49\xcd\xd6\xef\x6a\xba\x18\xb8\x79\xfb\xe1\xea\x1e\xda\x15\x40\x89\xae\x00\x64\x46\x5c\x42\x16\x11\x18\xc8\xca\xa8\x0c\x07\x5c\x42\x3a\xe5\x38\xa8\xa8\x6a\x89\x60\xb9\x79\xb8\xfb\x38\xe8\xb0\xc3\x7b\xe5\x7c\xaf\x1b\x7c\x27\x9f\xca\x2c\xc4\xdb\xa1\xf3\x7a\xd7\x29\x4e\x61\x3b\x58\x88\xb5\xb0\x93\x3d\xbf\x28\xde\xd8\xed\x56\x8a\xc7\xa7\x8f\x17\xc5\x29\x50\xfb\xce\xa5\x40\xad\x1f\x2e\x6f\xc4\xaf\xa6\xe9\x0f\x68\x2e\x43\x3d\xbd\xd5\xbb\x00\x56\xe3\x9a\x0f\x1d\xbe\xd5\x3b\x80\xc5\xb5\xce\xe4\x56\x6e\x6b\xa7\xfa\x3b\xdd\xc4\x3d\x79\x75\xfe\x16\x54\x78\xba\x51\x39\xb1\xa7\xaa\xe1\xe5\x3b\x16\xa2\x52\x23\xce\x07\x6f\x0b\x21\x8a\x4b\x65\x0f\x4c\x8d\x8f\x47\xb4\x74\xe1\x71\x9d\xf0\xd8\x25\x74\xc1\x6a\x17\x47\x1f\x2f\x8b\x63\xc5\x22\x57\x9f\xdd\xbd\xa5\x33\x79\x2c\xcd\x95\xc5\x1f\xf2\x0c\x5c\x14\xa7\x6d\xce\x7a\x95\x78\xbe\xd2\xe8\x34\x47\x96\xb1\xc9\xf7\x8d\xdb\x6c\x14\xc5\xb2\x44\x01\x59\x23\x03\x40\xd6\x3f\x23\xd4\xd1\x0e\x68\x5a\x22\xb7\xd4\x9a\x8e\xf1\x8c\x31\xe7\x3d\x06\x9c\xb4\x44\x81\x77\xd6\xd1\x31\xf4\x08\x6a\xe4\xa2\x01\x66\x79\x40\x0b\x22\xba\x64\x26\x83\x88\xc4\xa8\xa7\x40\xb1\xca\x11\x54\x1e\x0f\x15\x17\x00\xf0\x3e\xc4\x39\x67\xdd\x1c\x71\xce\x65\x33\x1e\x60\xa0\x11\x0d\x4a\xe0\xe4\x87\xc5\xbe\x1b\x97\xd9\xa2\x23\xa6\x64\xe4\xb2\x41\xc7\x81\xf6\x9b\x61\x59\xcb\x9d\xae\x95\x69\xd1\x8d\xe7\x4c\x9c\x5f\xbd\x11\xbf\xd2\x67\x45\x06\x16\x0b\x63\x7d\xed\xc0\x21\xea\x7b\xf0\x80\x53\xfe\x07\xce\x22\x4d\x7c\xb4\xc4\x20\x4d\x7c\x69\x90\x41\xb0\x72\xb7\x8b\x1c\x5e\x66\x00\x01\x3b\x3e\x03\xc1\x80\x2b\x39\xc4\xc7\xeb\x4b\x06\x18\x33\x75\x94\x6c\x57\xab\x4e\x1b\x55\x6f\xd1\x19\xed\x3d\x7e\x8a\xb7\xb6\x8d\xa8\x29\x92\x51\xdd\xdb\x01\xb5\xe8\xeb\xec\x6d\x93\x6b\x48\x0c\x63\xc7\xe0\xfd\x80\x27\x23\xde\x1c\xa3\x42\x26\xcb\xa2\x8a\x42\x56\x5e\x09\x58\x2e\x34\xe0\x3f\x58\xf7\xd6\xfa\x7a\x27\xf1\x00\x81\x74\x74\x49\xbc\xb6\xd6\x8b\x2b\xe9\x37\x5c\xa8\xb3\xeb\x69\x89\x4b\xbb\x3e\x02\x4e\x91\x8d\x71\x93\x70\x13\x31\x6d\xbc\x8a\xa0\xd5\xb1\x6d\x6e\x93\xcd\xd3\xcd\xeb\xf9\x49\x0a\x50\x53\xce\x3f\xcb\x0c\xe2\x8b\xaf\x29\x42\x7d\x8d\xf3\x4f\xd2\x8c\x07\x1b\x12\xaf\x0d\x2d\x83\xbc\xd8\x91\x89\x0b\x59\x39\x03\x9e\x25\x03\x37\x61\x38\x17\x58\x07\x33\x01\xca\x87\x6c\x32\x52\x00\xa0\xc8\xfa\xb5\xbc\x8b\xac\xa5\xc7\x9e\x64\x97\x96\x23\x10\x71\xee\xb1\x57\x39\xba\x5b\x75\xa8\x21\x38\x1c\xd5\xf9\x9f\xea\x80\x41\xe1\xc6\xf5\xde\xaa\xc3\x3a\xb4\x3e\x82\xad\x95\x11\xdf\x3f\x76\x6e\xf3\x04\xb3\x1e\xff\x30\x29\xb3\xd5\x46\x6f\x87\x2d\xba\x8e\xeb\xdf\x15\xbe\x89\x0b\xef\x5d\x40\x06\xd4\x16\xa4\x41\x71\x11\x32\xee\x2b\xea\x66\x4a\xb9\x2a\x2d\xa1\x9d\x4d\x6b\x21\xd7\x69\xcd\x2d\x09\x80\x2e\x06\x3a\x15\x98\x8e\x39\x58\xd1\xb2\xbc\x77\x03\x5f\xc8\x2b\xe5\xd8\xe0\x2d\xa1\x3a\x49\xce\x2f\xe1\x6d\x21\x96\x9f\x09\x72\x2b\xbf\x24\x35\x1a\x68\xc8\x50\x11\x37\xd6\xbc\x11\xf8\xae\x57\x18\xf4\xb4\xee\x74\xa3\x8c\xa3\x47\xa5\x28\x51\x5c\x52\xe2\x98\x1e\x6c\xbc\xdf\xd5\x6b\xc0\xcd\xd4\x00\x82\x4b\xbe\x4a\x98\x89\x11\x01\x6d\x13\x8c\x41\xbd\xd5\xeb\xf8\x4e\x1b\xf1\x23\xa0\x1f\x85\xa1\x10\x6f\x39\x97\x11\x90\x4f\x6d\xbd\x0a\x4c\x6d\x18\x78\xbc\x2d\x6b\x0e\xe9\xe1\x68\x62\x78\x2f\x52\x5e\x9c\x2d\x68\x61\x9c\x2d\x68\xdc\xec\x3c\x01\x1c\x59\x57\x43\xcc\x7c\xdb\xa1\x1f\x52\x8d\xf1\xe1\x51\x3f\x13\x8e\x9b\x0b\xcc\xa5\x28\xf6\xef\x21\x37\x56\xd7\x2e\x53\x65\x2f\xd8\xe6\x6a\xb6\xc2\x76\x59\xe7\x6a\x83\x94\x9a\x0b\xd9\x29\x35\x57\x3a\xa4\x54\xa2\x60\x39\x81\x6d\x97\xb5\x73\x1d\xd3\xd8\x9b\x9b\xcb\x92\x90\xa7\xdc\xc4\x0b\x7f\x1f\xa4\xbf\x47\x3b\xeb\xfc\xba\x57\xee\x91\xb0\xa6\x3b\xfc\x90\x95\xa0\x95\x9b\xaf\x54\x4a\x1d\xe3\x70\x7f\xeb\xb4\x57\x7f\x78\x04\x57\xef\x8f\xbc\x6e\x97\x8f\x7e\xa8\xf2\xe3\x4e\x83\xd3\x73\x76\xde\xe9\xe6\xc8\xf8\x44\xcd\xbf\x0a\xc2\x61\x16\xf5\x9d\x9f\xbe\x42\xa1\x91\x5c\x61\xca\xa1\xe5\xd3\x2a\xf1\xbd\xf1\xac\xca\x79\x5e\x6e\xd7\x06\x9e\x28\x48\x19\xe9\xc9\x45\x88\x0c\x70\xcd\x68\x7e\x81\xe4\xd4\x40\x7c\x45\x2b\xc8\xd4\x81\x2f\x22\x57\x62\x6e\xde\x8d\x5e\x1b\xf1\xc6\x60\x24\x80\xb8\x29\x75\x97\x6e\x32\xde\x86\xf6\xe7\x97\x17\xe3\xf6\x4f\x48\x19\xf7\xe2\x7e\x92\x46\x3b\xae\x91\x3b\xdf\x6c\x64\xda\x64\x17\x98\x10\xd9\x05\x0c\x5a\xd4\x84\xa5\xd0\x91\x21\x12\x06\x36\x02\x47\x74\x71\x09\x96\x47\xb1\xb3\x4e\xf9\xa4\x49\x29\x0a\x5d\x87\xbc\xa8\x79\xc9\x0b\x73\x69\x0e\x3c\x18\x67\x9e\x03\x0a\xcd\xce\x3c\x44\xce\x4c\xa1\x24\xfe\x2b\x7c\x8a\x4b\xf8\x8c\x23\x84\x91\x82\xe0\xf2\xcb\x0e\xa4\x75\x0e\x29\x70\x07\x66\x87\x74\xec\x3c\x28\x58\xe5\x73\x93\x33\x63\x6f\xe1\x7b\xbe\x85\x04\x7b\xf4\xa8\xa7\xfc\x48\x25\x55\x67\x73\x0a\xf9\xeb\xe5\xfb\x11\xa4\x1b\xe0\xbe\xbb\x0e\x64\x58\x7f\x01\xd5\x09\x24\x00\x09\xd6\x5f\x46\xd0\x33\x14\x82\x72\x66\xe8\x01\x5c\xa3\xc1\xa9\x4b\xca\x16\xb8\x40\x83\x63\x17\x76\x10\xc3\x45\x90\x7a\x85\x91\x02\xce\xc4\x4b\xfc\xe1\x2d\x06\x88\x84\x18\xb0\xb0\x1b\x43\x52\xe0\x8e\x7f\x16\x27\x77\xd3\xf2\x0e\x7d\xf0\x3f\x24\xf0\xf4\x98\x2f\x45\xcb\x0c\x85\x17\x71\xe8\xd1\x1a\x30\x8e\x3c\x58\x00\xce\x0f\x3c\x42\x4e\xc7\x3d\x9e\x15\x70\xfb\x9d\x4c\x9b\xe1\xbe\x7b\x16\x13\x42\xca\x56\xee\x90\x40\x20\xe8\x39\x7e\x97\x40\x60\x22\x72\x27\xbb\x08\xf5\x86\x12\x26\xb5\x9a\xbc\x4e\x43\xef\x15\xa6\x89\x40\x3b\xfd\x8c\xfc\xa1\x6f\xed\x3c\x2b\x49\xd0\xbb\xde\xde\x69\x36\x81\x47\xf8\x2b\x4a\x4a\x67\x37\x7e\x27\xcc\x0c\x41\xa8\xd3\x49\x6a\x6f\x75\x54\x1c\x5c\xc0\x57\x71\xa2\x10\xe5\x08\x5b\x1d\x61\x13\xf1\xb8\x51\x9e\x4a\x30\xf0\xba\x89\x23\xc3\x37\xdf\xaf\x2e\xe2\xd8\xe0\x25\xf9\xa8\x33\x9d\x5e\xa9\x78\xa5\x4e\xbd\xb9\xd4\x2b\x55\x00\x87\x93\xd8\x71\xf0\xc6\x70\x60\xdf\x88\xf7\xa6\x3b\x8c\x3a\x91\xa3\xa2\x9e\x24\x4c\x71\x64\x34\xd8\x39\x64\x03\x83\x09\xf3\x43\xce\xd0\x74\x4e\x65\xe0\x74\x50\x8d\xe9\xf3\xba\x27\x27\xd5\xb4\xb7\x5f\x51\xd2\x68\x44\x57\xaa\x85\x48\x1d\x6d\x1d\x4b\xd0\xb8\xbe\xe4\x1c\x71\x0e\x39\x89\x68\xae\xb5\x4f\x0d\x7f\xa5\xfd\x7c\xa3\x03\x14\xb7\x07\x82\xda\x6c\xf4\x7a\x03\x4f\x5f\x65\xad\xc2\xd8\x36\x07\xe3\xe5\x17\xf1\x9a\xf3\x73\x0c\x81\x5b\x84\xd2\x41\xf2\x73\xc4\x29\x42\xa9\x4b\x48\x80\xd3\x5d\x0a\xa7\xcd\xba\xc3\xa0\x2e\x3f\x1c\x2d\x5e\x67\xc1\x82\x32\x44\x17\x29\xb5\xc4\x16\xca\xcc\x63\xe3\x48\x32\x11\xc7\x4b\x48\xf8\x1e\x15\x17\x10\x4b\xa6\x28\xb8\x6e\x6a\xd9\xaf\xc9\x18\xe2\xbc\x5f\xc3\x4b\xd6\xae\x40\x0d\xcc\xa5\xca\xce\x8d\xc8\x6e\x8e\x4f\x0e\x04\x87\x47\xf4\x72\x68\x78\xc3\x86\x34\x3d\x33\x25\xc0\xa3\x28\x2b\x70\x01\x1e\x46\xc9\x16\x7b\xa6\x08\x84\x77\x4c\x25\x20\xb2\xe3\xbd\x05\xc8\xe8\x03\xc1\x5f\x5d\xcc\x00\xe7\xc2\x71\x5c\x42\x41\x28\x9e\x5d\x42\x01\x8a\xd8\xc5\x9c\x55\x0c\xc9\x53\xe7\x77\xf6\x03\x59\x34\x3d\xbe\x16\x10\xfe\x7d\x90\xee\x36\x7a\x88\x14\xf7\x63\x9c\xe6\x9a\x8d\x6a\x87\x0e\xc5\x1a\xfc\x99\xe0\xd5\x17\xcf\xc6\x38\xb0\x7d\x39\x03\xe2\xb3\xd8\xc1\x71\x80\x96\xf0\xb3\x00\x50\x5f\x54\x33\x64\x76\x79\xbf\xe2\x37\x19\xc2\x24\x34\x96\xbd\x4a\x07\x03\xea\xf8\x2b\x4c\xc9\x60\x66\x02\x33\xc4\xa6\x93\xa4\x8b\x42\xfa\xd1\xfa\x63\xf5\x3c\x11\x15\xfb\xd2\xb0\x0b\x07\x3d\xd1\x4d\xb7\x05\x23\xf7\x1a\x86\x85\x28\x4d\x18\x4b\xb9\x8e\xd1\x7b\x20\x5c\x13\x42\x52\x24\x9f\x08\x4f\x4e\x14\xc4\xbb\x85\x19\x8a\xb5\xaa\x2e\xb0\x14\xb2\xc3\x43\x3f\x7c\x04\x99\x25\xe6\xb7\xaa\x80\x78\x41\x9f\x05\x8c\x36\xa8\x2e\xc1\x2c\x14\xd9\xde\x60\x1a\xa1\xcc\x7c\x86\x58\x01\x89\xc0\x14\x02\x0e\x94\x7d\x37\x94\x32\x86\xe4\x9a\x01\xe8\xbc\xeb\x26\xa3\x91\x4b\x48\x79\x1a\x3c\x7f\x92\x39\x76\x65\x7d\x1a\x4f\x23\x67\xd9\x1d\xac\xe2\xc5\xa4\xb5\x51\x8b\x48\x33\xc2\x1e\x50\x0f\x59\x9a\x57\x9f\x70\xec\x3f\x73\xa4\x10\x32\x6a\x60\x5b\xa2\xcc\x7e\xb7\x08\xe8\x78\x02\x71\x08\xab\x5e\x99\xec\x45\x31\xfc\x2a\x0a\x81\x43\x20\xc6\x2c\x3e\xf9\xf4\xe3\x67\xc7\x41\x8b\xbd\xcd\xf0\x7d\xfa\xe9\x73\x40\xf9\xe9\x0f\x9f\x11\x2b\xbd\x4f\x4f\x58\xd3\xe3\xbb\x59\x89\x1f\x3f\xbb\xa7\xae\x6f\x9e\x8e\xcb\x0a\xe9\x47\x60\x21\xf3\x7f\x24\xc4\x3b\xd9\xab\x9a\x23\x5c\xd1\xa2\xc4\x64\xed\xac\xa1\x28\x77\xca\x29\x08\x6e\x46\x0f\xb9\xc5\xf7\x57\xa8\x45\xfc\x3d\x1a\x1f\xec\xe5\x7c\x17\xd3\x90\xd1\x38\xe3\xa3\x78\x67\xe2\x37\x8c\x72\x4b\x8f\xe4\x65\x05\x9e\xa2\x45\xc0\x53\x2c\xfa\x6f\xd0\xd1\x80\xe0\xb7\x0a\x22\xe4\x26\x04\x18\x30\xf7\x5b\x10\x60\x68\xdd\x84\x81\x43\xed\x7e\x53\x23\x28\xd6\x6d\x6a\x06\x26\xa8\x56\x80\x0e\xfd\xeb\x11\xe1\x78\x8c\x42\x09\xff\xc6\x0b\xb0\x78\x41\x38\x47\x08\x4f\xf3\x1d\x1d\x9d\x09\x3a\x1c\xa4\x6f\xc6\x46\x43\x35\x46\x17\x47\xec\x9b\x11\xc2\x13\x81\x13\x7c\xf4\x6a\xf4\xb7\x77\x16\x07\x2f\xbe\xf0\xcd\xa3\x66\xd4\x3e\x3e\x0f\xfe\xaf\x6e\x1a\x22\x31\xb1\x0e\x26\x24\x8c\x9f\x36\xf7\x4f\x69\x73\xcf\xa2\xe3\xcd\x0d\xc1\xb1\xbd\x5c\x67\x3b\x5b\xae\x8b\xce\x42\x13\xa1\x0c\xf5\x73\xba\xf7\x73\x84\xec\xae\x0d\x28\xb9\x71\x80\xf3\x1b\x5b\x06\xe1\xbf\x69\x8b\x63\xcc\xef\xc9\x53\x8b\x73\x1b\x3a\x7f\xa4\x98\x82\x82\x93\x43\x46\x16\x48\xef\x5f\x9d\x05\x24\xa4\x58\x55\x51\x63\x0c\xb9\x4e\x75\x86\x99\x07\x8d\xa7\x32\x8d\xfa\x17\x86\xf5\x68\x85\xf1\xf2\x8f\x2a\x84\xc7\xdc\x68\xd4\xb3\x8a\xbf\x6d\xec\x8b\xda\xaa\x4f\xde\xda\xee\x73\x25\xd7\x61\x26\xe4\xda\x56\x21\x97\x22\x73\x00\xa0\xb1\xfb\x0a\x3f\xc3\xaf\x1f\x03\x21\xff\x91\x1e\x25\x11\x27\xae\xfa\x71\x0b\x09\xf8\xca\x33\x24\x6c\x20\x61\x63\x07\x78\x63\xee\xc7\x16\x3e\x5b\x79\x80\xaf\x3d\x7c\xed\x95\xba\xc5\xc2\xc0\x20\xfc\x28\xb6\xd6\xf8\x0d\xa4\x1c\xe0\xfb\xa0\x24\xbd\x50\x87\x8f\x9f\x9c\x85\x23\x82\x3f\x4e\x5c\x85\xd5\x51\x3a\x7f\x9c\xb8\x2a\xd4\x4a\xa9\xf8\xf3\xc4\x55\xad\x3c\x50\x12\xfc\x3a\x71\x55\xa8\x9e\x92\xf0\xe7\x09\xf0\x75\x7e\xc3\x08\xf1\xf7\x89\xab\x42\x3b\x28\x11\x7f\x9e\xb8\xaa\x97\xfb\x3a\xb5\x8b\x7e\x41\x6a\x6a\x15\xfd\xaa\xaa\x4f\x6d\x6f\x77\xbf\x5b\xa3\x3e\x57\x7c\x9d\xbd\x55\x8e\xac\xf3\x5f\xf4\x76\xc7\x4e\x39\xaa\xc7\x2b\x4e\x78\x3e\x17\xde\x7a\xe9\xac\x6c\x17\x15\x05\x78\xab\xb5\xd9\x0d\x51\xd1\x4f\x96\x50\x8f\x3d\x81\xa5\x07\x50\xd0\x7d\xff\xb0\x53\x8b\x0a\x2e\xb9\xbc\xb5\xf5\x12\xb8\x79\xb8\xde\x02\x1b\xb7\xef\xff\xfe\x77\x80\xd7\xbf\xab\x7f\xfc\x43\xbc\xfd\xe5\x07\xa1\xbe\x34\x4a\xb5\x4e\x6c\xc9\xee\x96\xc1\xb6\xf2\xcb\xcb\x02\x72\x51\x91\x2f\x3c\x19\x7a\xa2\x2f\x3c\x54\x5f\xfd\x7f\x01\x00\x00\xff\xff\x9d\x0c\x47\x5e\x9c\x02\x01\x00" func confLocaleLocale_enUsIniBytes() ([]byte, error) { return bindataRead( @@ -4584,8 +4584,8 @@ func confLocaleLocale_enUsIni() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 66198, mode: os.FileMode(0644), modTime: time.Unix(1582104596, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2a, 0x1d, 0x92, 0xf3, 0x5c, 0xf0, 0xdd, 0xe9, 0xbd, 0x1, 0xd5, 0xbd, 0x44, 0xd, 0x2f, 0x77, 0x9f, 0x5d, 0xf, 0xd, 0x7d, 0x5e, 0xea, 0x13, 0x54, 0x58, 0xc, 0xf1, 0x79, 0x67, 0xd0, 0xb}} + info := bindataFileInfo{name: "conf/locale/locale_en-US.ini", size: 66204, mode: os.FileMode(0644), modTime: time.Unix(1582135285, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x76, 0xb3, 0x28, 0x43, 0x94, 0xed, 0xe1, 0xe5, 0xc2, 0x56, 0x9, 0xb2, 0xf6, 0x3d, 0xcf, 0x66, 0xb0, 0xc7, 0x24, 0x81, 0xf, 0x4a, 0x69, 0xf, 0x50, 0xf4, 0xe8, 0xe4, 0x7a, 0x44, 0xd5, 0x31}} return a, nil } diff --git a/internal/assets/templates/templates_gen.go b/internal/assets/templates/templates_gen.go index 54139f37..0e8b9086 100644 --- a/internal/assets/templates/templates_gen.go +++ b/internal/assets/templates/templates_gen.go @@ -2432,7 +2432,7 @@ func repoView_fileTmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "repo/view_file.tmpl", size: 4983, mode: os.FileMode(0644), modTime: time.Unix(1571173927, 0)} + info := bindataFileInfo{name: "repo/view_file.tmpl", size: 4983, mode: os.FileMode(0644), modTime: time.Unix(1582133193, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa2, 0x6f, 0xd7, 0xaa, 0xde, 0x42, 0x19, 0xb3, 0x6e, 0xe6, 0x56, 0xa5, 0x78, 0x70, 0xda, 0x65, 0x6, 0xf7, 0x52, 0xa7, 0x53, 0x56, 0xec, 0xcb, 0x8e, 0x59, 0x94, 0x0, 0x44, 0x4b, 0xb5, 0x23}} return a, nil } diff --git a/internal/auth/auth.go b/internal/auth/auth.go index 89fb1c46..41aba23d 100644 --- a/internal/auth/auth.go +++ b/internal/auth/auth.go @@ -10,8 +10,8 @@ import ( "github.com/go-macaron/session" gouuid "github.com/satori/go.uuid" - log "gopkg.in/clog.v1" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/db/errors" @@ -52,13 +52,13 @@ func SignedInID(c *macaron.Context, sess session.Store) (_ int64, isTokenAuth bo t, err := db.GetAccessTokenBySHA(tokenSHA) if err != nil { if !db.IsErrAccessTokenNotExist(err) && !db.IsErrAccessTokenEmpty(err) { - log.Error(2, "GetAccessTokenBySHA: %v", err) + log.Error("GetAccessTokenBySHA: %v", err) } return 0, false } t.Updated = time.Now() if err = db.UpdateAccessToken(t); err != nil { - log.Error(2, "UpdateAccessToken: %v", err) + log.Error("UpdateAccessToken: %v", err) } return t.UID, true } @@ -71,7 +71,7 @@ func SignedInID(c *macaron.Context, sess session.Store) (_ int64, isTokenAuth bo if id, ok := uid.(int64); ok { if _, err := db.GetUserByID(id); err != nil { if !errors.IsUserNotExist(err) { - log.Error(2, "GetUserByID: %v", err) + log.Error("GetUserByID: %v", err) } return 0, false } @@ -96,7 +96,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic u, err := db.GetUserByName(webAuthUser) if err != nil { if !errors.IsUserNotExist(err) { - log.Error(2, "GetUserByName: %v", err) + log.Error("GetUserByName: %v", err) return nil, false, false } @@ -110,7 +110,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic } if err = db.CreateUser(u); err != nil { // FIXME: should I create a system notice? - log.Error(2, "CreateUser: %v", err) + log.Error("CreateUser: %v", err) return nil, false, false } else { return u, false, false @@ -131,7 +131,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic u, err := db.UserLogin(uname, passwd, -1) if err != nil { if !errors.IsUserNotExist(err) { - log.Error(2, "UserLogin: %v", err) + log.Error("UserLogin: %v", err) } return nil, false, false } @@ -144,7 +144,7 @@ func SignedInUser(ctx *macaron.Context, sess session.Store) (_ *db.User, isBasic u, err := db.GetUserByID(uid) if err != nil { - log.Error(2, "GetUserByID: %v", err) + log.Error("GetUserByID: %v", err) return nil, false, false } return u, false, isTokenAuth diff --git a/internal/auth/ldap/ldap.go b/internal/auth/ldap/ldap.go index e88cef77..29d95560 100644 --- a/internal/auth/ldap/ldap.go +++ b/internal/auth/ldap/ldap.go @@ -11,8 +11,8 @@ import ( "fmt" "strings" - log "gopkg.in/clog.v1" "gopkg.in/ldap.v2" + log "unknwon.dev/clog/v2" ) type SecurityProtocol int @@ -130,7 +130,7 @@ func (ls *Source) findUserDN(l *ldap.Conn, name string) (string, bool) { userDN := sr.Entries[0].DN if userDN == "" { - log.Error(2, "LDAP: Search was successful, but found no DN!") + log.Error("LDAP: Search was successful, but found no DN!") return "", false } @@ -183,7 +183,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str } l, err := dial(ls) if err != nil { - log.Error(2, "LDAP connect failed for '%s': %v", ls.Host, err) + log.Error("LDAP connect failed for '%s': %v", ls.Host, err) return "", "", "", "", false, false } defer l.Close() @@ -229,7 +229,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str sr, err := l.Search(search) if err != nil { - log.Error(2, "LDAP: User search failed: %v", err) + log.Error("LDAP: User search failed: %v", err) return "", "", "", "", false, false } else if len(sr.Entries) < 1 { if directBind { @@ -266,7 +266,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str srg, err := l.Search(groupSearch) if err != nil { - log.Error(2, "LDAP: Group search failed: %v", err) + log.Error("LDAP: Group search failed: %v", err) return "", "", "", "", false, false } else if len(srg.Entries) < 1 { log.Trace("LDAP: Group search returned no entries") @@ -308,7 +308,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str sr, err = l.Search(search) if err != nil { - log.Error(2, "LDAP: Admin search failed: %v", err) + log.Error("LDAP: Admin search failed: %v", err) } else if len(sr.Entries) < 1 { log.Trace("LDAP: Admin search returned no entries") } else { diff --git a/internal/cmd/admin.go b/internal/cmd/admin.go index de8b6ba6..3ba654ee 100644 --- a/internal/cmd/admin.go +++ b/internal/cmd/admin.go @@ -144,7 +144,7 @@ func runCreateUser(c *cli.Context) error { setting.CustomConf = c.String("config") } - setting.NewContext() + setting.Init() db.LoadConfigs() db.SetEngine() @@ -168,7 +168,7 @@ func adminDashboardOperation(operation func() error, successMessage string) func setting.CustomConf = c.String("config") } - setting.NewContext() + setting.Init() db.LoadConfigs() db.SetEngine() diff --git a/internal/cmd/backup.go b/internal/cmd/backup.go index 622f7ffe..6e9b24b0 100644 --- a/internal/cmd/backup.go +++ b/internal/cmd/backup.go @@ -14,8 +14,8 @@ import ( "github.com/unknwon/cae/zip" "github.com/unknwon/com" "github.com/urfave/cli" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/setting" @@ -47,17 +47,17 @@ func runBackup(c *cli.Context) error { if c.IsSet("config") { setting.CustomConf = c.String("config") } - setting.NewContext() + setting.Init() db.LoadConfigs() db.SetEngine() tmpDir := c.String("tempdir") if !com.IsExist(tmpDir) { - log.Fatal(0, "'--tempdir' does not exist: %s", tmpDir) + log.Fatal("'--tempdir' does not exist: %s", tmpDir) } rootDir, err := ioutil.TempDir(tmpDir, "gogs-backup-") if err != nil { - log.Fatal(0, "Fail to create backup root directory '%s': %v", rootDir, err) + log.Fatal("Failed to create backup root directory '%s': %v", rootDir, err) } log.Info("Backup root directory: %s", rootDir) @@ -68,7 +68,7 @@ func runBackup(c *cli.Context) error { metadata.Section("").Key("DATE_TIME").SetValue(time.Now().String()) metadata.Section("").Key("GOGS_VERSION").SetValue(setting.AppVersion) if err = metadata.SaveTo(metaFile); err != nil { - log.Fatal(0, "Fail to save metadata '%s': %v", metaFile, err) + log.Fatal("Failed to save metadata '%s': %v", metaFile, err) } archiveName := path.Join(c.String("target"), c.String("archive-name")) @@ -76,25 +76,25 @@ func runBackup(c *cli.Context) error { z, err := zip.Create(archiveName) if err != nil { - log.Fatal(0, "Fail to create backup archive '%s': %v", archiveName, err) + log.Fatal("Failed to create backup archive '%s': %v", archiveName, err) } if err = z.AddFile(_ARCHIVE_ROOT_DIR+"/metadata.ini", metaFile); err != nil { - log.Fatal(0, "Fail to include 'metadata.ini': %v", err) + log.Fatal("Failed to include 'metadata.ini': %v", err) } // Database dbDir := path.Join(rootDir, "db") if err = db.DumpDatabase(dbDir); err != nil { - log.Fatal(0, "Fail to dump database: %v", err) + log.Fatal("Failed to dump database: %v", err) } if err = z.AddDir(_ARCHIVE_ROOT_DIR+"/db", dbDir); err != nil { - log.Fatal(0, "Fail to include 'db': %v", err) + log.Fatal("Failed to include 'db': %v", err) } // Custom files if !c.Bool("database-only") { if err = z.AddDir(_ARCHIVE_ROOT_DIR+"/custom", setting.CustomPath); err != nil { - log.Fatal(0, "Fail to include 'custom': %v", err) + log.Fatal("Failed to include 'custom': %v", err) } } @@ -107,7 +107,7 @@ func runBackup(c *cli.Context) error { } if err = z.AddDir(path.Join(_ARCHIVE_ROOT_DIR+"/data", dir), dirPath); err != nil { - log.Fatal(0, "Fail to include 'data': %v", err) + log.Fatal("Failed to include 'data': %v", err) } } } @@ -117,21 +117,21 @@ func runBackup(c *cli.Context) error { reposDump := path.Join(rootDir, "repositories.zip") log.Info("Dumping repositories in '%s'", setting.RepoRootPath) if err = zip.PackTo(setting.RepoRootPath, reposDump, true); err != nil { - log.Fatal(0, "Fail to dump repositories: %v", err) + log.Fatal("Failed to dump repositories: %v", err) } log.Info("Repositories dumped to: %s", reposDump) if err = z.AddFile(_ARCHIVE_ROOT_DIR+"/repositories.zip", reposDump); err != nil { - log.Fatal(0, "Fail to include 'repositories.zip': %v", err) + log.Fatal("Failed to include 'repositories.zip': %v", err) } } if err = z.Close(); err != nil { - log.Fatal(0, "Fail to save backup archive '%s': %v", archiveName, err) + log.Fatal("Failed to save backup archive '%s': %v", archiveName, err) } os.RemoveAll(rootDir) log.Info("Backup succeed! Archive is located at: %s", archiveName) - log.Shutdown() + log.Stop() return nil } diff --git a/internal/cmd/hook.go b/internal/cmd/hook.go index 1e4c8899..41cf88f2 100644 --- a/internal/cmd/hook.go +++ b/internal/cmd/hook.go @@ -16,7 +16,7 @@ import ( "github.com/unknwon/com" "github.com/urfave/cli" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/git-module" @@ -129,7 +129,7 @@ func runHookPreReceive(c *cli.Context) error { output, err := git.NewCommand("rev-list", "--max-count=1", oldCommitID, "^"+newCommitID). RunInDir(db.RepoPath(os.Getenv(db.ENV_REPO_OWNER_NAME), os.Getenv(db.ENV_REPO_NAME))) if err != nil { - fail("Internal error", "Fail to detect force push: %v", err) + fail("Internal error", "Failed to detect force push: %v", err) } else if len(output) > 0 { fail(fmt.Sprintf("Branch '%s' is protected from force push", branchName), "") } @@ -151,7 +151,7 @@ func runHookPreReceive(c *cli.Context) error { hookCmd.Stdin = buf hookCmd.Stderr = os.Stderr if err := hookCmd.Run(); err != nil { - fail("Internal error", "Fail to execute custom pre-receive hook: %v", err) + fail("Internal error", "Failed to execute custom pre-receive hook: %v", err) } return nil } @@ -185,7 +185,7 @@ func runHookUpdate(c *cli.Context) error { hookCmd.Stdin = os.Stdin hookCmd.Stderr = os.Stderr if err := hookCmd.Run(); err != nil { - fail("Internal error", "Fail to execute custom pre-receive hook: %v", err) + fail("Internal error", "Failed to execute custom pre-receive hook: %v", err) } return nil } @@ -229,7 +229,7 @@ func runHookPostReceive(c *cli.Context) error { RepoName: os.Getenv(db.ENV_REPO_NAME), } if err := db.PushUpdate(options); err != nil { - log.Error(2, "PushUpdate: %v", err) + log.Error("PushUpdate: %v", err) } // Ask for running deliver hook and test pull request tasks @@ -245,10 +245,10 @@ func runHookPostReceive(c *cli.Context) error { if err == nil { resp.Body.Close() if resp.StatusCode/100 != 2 { - log.Error(2, "Fail to trigger task: not 2xx response code") + log.Error("Failed to trigger task: not 2xx response code") } } else { - log.Error(2, "Fail to trigger task: %v", err) + log.Error("Failed to trigger task: %v", err) } } @@ -268,7 +268,7 @@ func runHookPostReceive(c *cli.Context) error { hookCmd.Stdin = buf hookCmd.Stderr = os.Stderr if err := hookCmd.Run(); err != nil { - fail("Internal error", "Fail to execute custom post-receive hook: %v", err) + fail("Internal error", "Failed to execute custom post-receive hook: %v", err) } return nil } diff --git a/internal/cmd/import.go b/internal/cmd/import.go index b274d1dd..0f3a2d44 100644 --- a/internal/cmd/import.go +++ b/internal/cmd/import.go @@ -58,7 +58,7 @@ func runImportLocale(c *cli.Context) error { setting.CustomConf = c.String("config") } - setting.NewContext() + setting.Init() now := time.Now() diff --git a/internal/cmd/restore.go b/internal/cmd/restore.go index 74f9c759..2dba08d5 100644 --- a/internal/cmd/restore.go +++ b/internal/cmd/restore.go @@ -12,8 +12,8 @@ import ( "github.com/unknwon/cae/zip" "github.com/unknwon/com" "github.com/urfave/cli" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/setting" @@ -48,12 +48,12 @@ func runRestore(c *cli.Context) error { tmpDir := c.String("tempdir") if !com.IsExist(tmpDir) { - log.Fatal(0, "'--tempdir' does not exist: %s", tmpDir) + log.Fatal("'--tempdir' does not exist: %s", tmpDir) } log.Info("Restore backup from: %s", c.String("from")) if err := zip.ExtractTo(c.String("from"), tmpDir); err != nil { - log.Fatal(0, "Failed to extract backup archive: %v", err) + log.Fatal("Failed to extract backup archive: %v", err) } archivePath := path.Join(tmpDir, _ARCHIVE_ROOT_DIR) defer os.RemoveAll(archivePath) @@ -61,22 +61,22 @@ func runRestore(c *cli.Context) error { // Check backup version metaFile := path.Join(archivePath, "metadata.ini") if !com.IsExist(metaFile) { - log.Fatal(0, "File 'metadata.ini' is missing") + log.Fatal("File 'metadata.ini' is missing") } metadata, err := ini.Load(metaFile) if err != nil { - log.Fatal(0, "Failed to load metadata '%s': %v", metaFile, err) + log.Fatal("Failed to load metadata '%s': %v", metaFile, err) } backupVersion := metadata.Section("").Key("GOGS_VERSION").MustString("999.0") if version.Compare(setting.AppVersion, backupVersion, "<") { - log.Fatal(0, "Current Gogs version is lower than backup version: %s < %s", setting.AppVersion, backupVersion) + log.Fatal("Current Gogs version is lower than backup version: %s < %s", setting.AppVersion, backupVersion) } formatVersion := metadata.Section("").Key("VERSION").MustInt() if formatVersion == 0 { - log.Fatal(0, "Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented") + log.Fatal("Failed to determine the backup format version from metadata '%s': %s", metaFile, "VERSION is not presented") } if formatVersion != _CURRENT_BACKUP_FORMAT_VERSION { - log.Fatal(0, "Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s", + log.Fatal("Backup format version found is %d but this binary only supports %d\nThe last known version that is able to import your backup is %s", formatVersion, _CURRENT_BACKUP_FORMAT_VERSION, lastSupportedVersionOfFormat[formatVersion]) } @@ -86,29 +86,29 @@ func runRestore(c *cli.Context) error { if c.IsSet("config") { setting.CustomConf = c.String("config") } else if !com.IsExist(configFile) { - log.Fatal(0, "'--config' is not specified and custom config file is not found in backup") + log.Fatal("'--config' is not specified and custom config file is not found in backup") } else { setting.CustomConf = configFile } - setting.NewContext() + setting.Init() db.LoadConfigs() db.SetEngine() // Database dbDir := path.Join(archivePath, "db") if err = db.ImportDatabase(dbDir, c.Bool("verbose")); err != nil { - log.Fatal(0, "Failed to import database: %v", err) + log.Fatal("Failed to import database: %v", err) } // Custom files if !c.Bool("database-only") { if com.IsExist(setting.CustomPath) { if err = os.Rename(setting.CustomPath, setting.CustomPath+".bak"); err != nil { - log.Fatal(0, "Failed to backup current 'custom': %v", err) + log.Fatal("Failed to backup current 'custom': %v", err) } } if err = os.Rename(path.Join(archivePath, "custom"), setting.CustomPath); err != nil { - log.Fatal(0, "Failed to import 'custom': %v", err) + log.Fatal("Failed to import 'custom': %v", err) } } @@ -125,11 +125,11 @@ func runRestore(c *cli.Context) error { dirPath := path.Join(setting.AppDataPath, dir) if com.IsExist(dirPath) { if err = os.Rename(dirPath, dirPath+".bak"); err != nil { - log.Fatal(0, "Failed to backup current 'data': %v", err) + log.Fatal("Failed to backup current 'data': %v", err) } } if err = os.Rename(srcPath, dirPath); err != nil { - log.Fatal(0, "Failed to import 'data': %v", err) + log.Fatal("Failed to import 'data': %v", err) } } } @@ -138,11 +138,11 @@ func runRestore(c *cli.Context) error { reposPath := path.Join(archivePath, "repositories.zip") if !c.Bool("exclude-repos") && !c.Bool("database-only") && com.IsExist(reposPath) { if err := zip.ExtractTo(reposPath, path.Dir(setting.RepoRootPath)); err != nil { - log.Fatal(0, "Failed to extract 'repositories.zip': %v", err) + log.Fatal("Failed to extract 'repositories.zip': %v", err) } } log.Info("Restore succeed!") - log.Shutdown() + log.Stop() return nil } diff --git a/internal/cmd/serv.go b/internal/cmd/serv.go index 870cf62e..2bcb85ac 100644 --- a/internal/cmd/serv.go +++ b/internal/cmd/serv.go @@ -14,7 +14,7 @@ import ( "github.com/unknwon/com" "github.com/urfave/cli" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/db/errors" @@ -42,7 +42,7 @@ func fail(userMessage, logMessage string, args ...interface{}) { if !setting.ProdMode { fmt.Fprintf(os.Stderr, logMessage+"\n", args...) } - log.Fatal(3, logMessage, args...) + log.Fatal(logMessage, args...) } os.Exit(1) @@ -55,13 +55,14 @@ func setup(c *cli.Context, logPath string, connectDB bool) { setting.CustomConf = c.GlobalString("config") } - setting.NewContext() + setting.Init() - level := log.TRACE + level := log.LevelTrace if setting.ProdMode { - level = log.ERROR + level = log.LevelError } - log.New(log.FILE, log.FileConfig{ + + err := log.NewFile(log.FileConfig{ Level: level, Filename: filepath.Join(setting.LogRootPath, logPath), FileRotationConfig: log.FileRotationConfig{ @@ -70,7 +71,11 @@ func setup(c *cli.Context, logPath string, connectDB bool) { MaxDays: 3, }, }) - log.Delete(log.CONSOLE) // Remove primary logger + if err != nil { + log.Fatal("Failed to init file logger: %v", err) + return + } + log.Remove(log.DefaultConsoleName) // Remove the primary logger if !connectDB { return @@ -156,7 +161,7 @@ func runServ(c *cli.Context) error { if errors.IsUserNotExist(err) { fail("Repository owner does not exist", "Unregistered owner: %s", ownerName) } - fail("Internal error", "Fail to get repository owner '%s': %v", ownerName, err) + fail("Internal error", "Failed to get repository owner '%s': %v", ownerName, err) } repo, err := db.GetRepositoryByName(owner.ID, repoName) @@ -164,7 +169,7 @@ func runServ(c *cli.Context) error { if errors.IsRepoNotExist(err) { fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", owner.Name, repoName) } - fail("Internal error", "Fail to get repository: %v", err) + fail("Internal error", "Failed to get repository: %v", err) } repo.Owner = owner @@ -196,12 +201,12 @@ func runServ(c *cli.Context) error { } else { user, err = db.GetUserByKeyID(key.ID) if err != nil { - fail("Internal error", "Fail to get user by key ID '%d': %v", key.ID, err) + fail("Internal error", "Failed to get user by key ID '%d': %v", key.ID, err) } mode, err := db.UserAccessMode(user.ID, repo) if err != nil { - fail("Internal error", "Fail to check access: %v", err) + fail("Internal error", "Failed to check access: %v", err) } if mode < requestMode { @@ -265,7 +270,7 @@ func runServ(c *cli.Context) error { gitCmd.Stdin = os.Stdin gitCmd.Stderr = os.Stderr if err = gitCmd.Run(); err != nil { - fail("Internal error", "Fail to execute git command: %v", err) + fail("Internal error", "Failed to execute git command: %v", err) } return nil diff --git a/internal/cmd/web.go b/internal/cmd/web.go index ce82391e..20f20af8 100644 --- a/internal/cmd/web.go +++ b/internal/cmd/web.go @@ -26,8 +26,8 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/unknwon/com" "github.com/urfave/cli" - log "gopkg.in/clog.v1" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/assets/conf" "gogs.io/gogs/internal/assets/public" @@ -119,7 +119,7 @@ func newMacaron() *macaron.Macaron { localeNames, err := conf.AssetDir("conf/locale") if err != nil { - log.Fatal(4, "Fail to list locale files: %v", err) + log.Fatal("Failed to list locale files: %v", err) } localFiles := make(map[string][]byte) for _, name := range localeNames { @@ -741,15 +741,15 @@ func runWeb(c *cli.Context) error { // FIXME: add proper implementation of signal capture on all protocols // execute this on SIGTERM or SIGINT: listener.Close() if err = os.Chmod(listenAddr, os.FileMode(setting.UnixSocketPermission)); err != nil { - log.Fatal(4, "Failed to set permission of unix socket: %v", err) + log.Fatal("Failed to set permission of unix socket: %v", err) } err = http.Serve(listener, m) default: - log.Fatal(4, "Invalid protocol: %s", setting.Protocol) + log.Fatal("Invalid protocol: %s", setting.Protocol) } if err != nil { - log.Fatal(4, "Failed to start server: %v", err) + log.Fatal("Failed to start server: %v", err) } return nil diff --git a/internal/context/api.go b/internal/context/api.go index 220ab340..153997d3 100644 --- a/internal/context/api.go +++ b/internal/context/api.go @@ -10,8 +10,8 @@ import ( "strings" "github.com/unknwon/paginater" - log "gopkg.in/clog.v1" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/setting" ) @@ -39,7 +39,7 @@ func (c *APIContext) Error(status int, title string, obj interface{}) { } if status == http.StatusInternalServerError { - log.Error(3, "%s: %s", title, message) + log.Error("%s: %s", title, message) } c.JSON(status, map[string]string{ diff --git a/internal/context/context.go b/internal/context/context.go index 95c3ce10..de70e75c 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -17,8 +17,8 @@ import ( "github.com/go-macaron/i18n" "github.com/go-macaron/session" "github.com/unknwon/com" - log "gopkg.in/clog.v1" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/auth" "gogs.io/gogs/internal/db" @@ -173,7 +173,7 @@ func (c *Context) Handle(status int, msg string, err error) { c.Data["Title"] = "Page Not Found" case http.StatusInternalServerError: c.Data["Title"] = "Internal Server Error" - log.Error(3, "%s: %v", msg, err) + log.Error("%s: %v", msg, err) if !setting.ProdMode || (c.IsLogged && c.User.IsAdmin) { c.Data["ErrorMsg"] = err } diff --git a/internal/context/notice.go b/internal/context/notice.go index 16b9440f..dea72043 100644 --- a/internal/context/notice.go +++ b/internal/context/notice.go @@ -9,7 +9,7 @@ import ( "path" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/markup" "gogs.io/gogs/internal/setting" @@ -26,14 +26,14 @@ func (c *Context) renderNoticeBanner() { f, err := os.Open(fpath) if err != nil { - log.Error(2, "Failed to open file %q: %v", fpath, err) + log.Error("Failed to open file %q: %v", fpath, err) return } defer f.Close() fi, err := f.Stat() if err != nil { - log.Error(2, "Failed to stat file %q: %v", fpath, err) + log.Error("Failed to stat file %q: %v", fpath, err) return } @@ -48,7 +48,7 @@ func (c *Context) renderNoticeBanner() { buf := make([]byte, maxSize) n, err := f.Read(buf) if err != nil { - log.Error(2, "Failed to read file %q: %v", fpath, err) + log.Error("Failed to read file %q: %v", fpath, err) return } buf = buf[:n] diff --git a/internal/cron/cron.go b/internal/cron/cron.go index 9646c702..f056ca70 100644 --- a/internal/cron/cron.go +++ b/internal/cron/cron.go @@ -7,7 +7,7 @@ package cron import ( "time" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/cron" @@ -25,7 +25,7 @@ func NewContext() { if setting.Cron.UpdateMirror.Enabled { entry, err = c.AddFunc("Update mirrors", setting.Cron.UpdateMirror.Schedule, db.MirrorUpdate) if err != nil { - log.Fatal(2, "Cron.(update mirrors): %v", err) + log.Fatal("Cron.(update mirrors): %v", err) } if setting.Cron.UpdateMirror.RunAtStart { entry.Prev = time.Now() @@ -36,7 +36,7 @@ func NewContext() { if setting.Cron.RepoHealthCheck.Enabled { entry, err = c.AddFunc("Repository health check", setting.Cron.RepoHealthCheck.Schedule, db.GitFsck) if err != nil { - log.Fatal(2, "Cron.(repository health check): %v", err) + log.Fatal("Cron.(repository health check): %v", err) } if setting.Cron.RepoHealthCheck.RunAtStart { entry.Prev = time.Now() @@ -47,7 +47,7 @@ func NewContext() { if setting.Cron.CheckRepoStats.Enabled { entry, err = c.AddFunc("Check repository statistics", setting.Cron.CheckRepoStats.Schedule, db.CheckRepoStats) if err != nil { - log.Fatal(2, "Cron.(check repository statistics): %v", err) + log.Fatal("Cron.(check repository statistics): %v", err) } if setting.Cron.CheckRepoStats.RunAtStart { entry.Prev = time.Now() @@ -58,7 +58,7 @@ func NewContext() { if setting.Cron.RepoArchiveCleanup.Enabled { entry, err = c.AddFunc("Repository archive cleanup", setting.Cron.RepoArchiveCleanup.Schedule, db.DeleteOldRepositoryArchives) if err != nil { - log.Fatal(2, "Cron.(repository archive cleanup): %v", err) + log.Fatal("Cron.(repository archive cleanup): %v", err) } if setting.Cron.RepoArchiveCleanup.RunAtStart { entry.Prev = time.Now() diff --git a/internal/db/access.go b/internal/db/access.go index e9c8b5b7..b5c6cd28 100644 --- a/internal/db/access.go +++ b/internal/db/access.go @@ -7,7 +7,7 @@ package db import ( "fmt" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db/errors" ) @@ -111,7 +111,7 @@ func (u *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) { repo, err := GetRepositoryByID(access.RepoID) if err != nil { if errors.IsRepoNotExist(err) { - log.Error(2, "GetRepositoryByID: %v", err) + log.Error("GetRepositoryByID: %v", err) continue } return nil, err diff --git a/internal/db/action.go b/internal/db/action.go index e3296c70..e177f250 100644 --- a/internal/db/action.go +++ b/internal/db/action.go @@ -13,7 +13,7 @@ import ( "github.com/json-iterator/go" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -160,7 +160,7 @@ func (a *Action) GetIssueTitle() string { index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() issue, err := GetIssueByIndex(a.RepoID, index) if err != nil { - log.Error(4, "GetIssueByIndex: %v", err) + log.Error("GetIssueByIndex: %v", err) return "500 when get issue" } return issue.Title @@ -170,7 +170,7 @@ func (a *Action) GetIssueContent() string { index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() issue, err := GetIssueByIndex(a.RepoID, index) if err != nil { - log.Error(4, "GetIssueByIndex: %v", err) + log.Error("GetIssueByIndex: %v", err) return "500 when get issue" } return issue.Content @@ -305,7 +305,7 @@ func (push *PushCommits) AvatarLink(email string) string { if err != nil { push.avatars[email] = tool.AvatarLink(email) if !errors.IsUserNotExist(err) { - log.Error(4, "GetUserByEmail: %v", err) + log.Error("GetUserByEmail: %v", err) } } else { push.avatars[email] = u.RelAvatarLink() @@ -490,7 +490,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { // Only update issues via commits when internal issue tracker is enabled if repo.EnableIssues && !repo.EnableExternalTracker { if err = UpdateIssuesCommit(pusher, repo, opts.Commits.Commits); err != nil { - log.Error(2, "UpdateIssuesCommit: %v", err) + log.Error("UpdateIssuesCommit: %v", err) } } } diff --git a/internal/db/admin.go b/internal/db/admin.go index 1fe13002..22f9e1e6 100644 --- a/internal/db/admin.go +++ b/internal/db/admin.go @@ -11,7 +11,7 @@ import ( "time" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "gogs.io/gogs/internal/tool" @@ -75,7 +75,7 @@ func RemoveAllWithNotice(title, path string) { desc := fmt.Sprintf("%s [%s]: %v", title, path, err) log.Warn(desc) if err = CreateRepositoryNotice(desc); err != nil { - log.Error(2, "CreateRepositoryNotice: %v", err) + log.Error("CreateRepositoryNotice: %v", err) } } } diff --git a/internal/db/comment.go b/internal/db/comment.go index b2f19508..d0270302 100644 --- a/internal/db/comment.go +++ b/internal/db/comment.go @@ -10,7 +10,7 @@ import ( "time" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" api "github.com/gogs/go-gogs-client" @@ -180,7 +180,7 @@ func (cmt *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) issue.Content = fmt.Sprintf("Reopened #%d", issue.Index) } if err = mailIssueCommentToParticipants(issue, cmt.Poster, mentions); err != nil { - log.Error(2, "mailIssueCommentToParticipants: %v", err) + log.Error("mailIssueCommentToParticipants: %v", err) } return nil @@ -282,10 +282,10 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err // Notify watchers for whatever action comes in, ignore if no action type. if act.OpType > 0 { if err = notifyWatchers(e, act); err != nil { - log.Error(2, "notifyWatchers: %v", err) + log.Error("notifyWatchers: %v", err) } if err = comment.mailParticipants(e, act.OpType, opts.Issue); err != nil { - log.Error(2, "MailParticipants: %v", err) + log.Error("MailParticipants: %v", err) } } @@ -356,7 +356,7 @@ func CreateIssueComment(doer *User, repo *Repository, issue *Issue, content stri Repository: repo.APIFormat(nil), Sender: doer.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) + log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) } return comment, nil @@ -465,7 +465,7 @@ func UpdateComment(doer *User, c *Comment, oldContent string) (err error) { } if err = c.Issue.LoadAttributes(); err != nil { - log.Error(2, "Issue.LoadAttributes [issue_id: %d]: %v", c.IssueID, err) + log.Error("Issue.LoadAttributes [issue_id: %d]: %v", c.IssueID, err) } else if err = PrepareWebhooks(c.Issue.Repo, HOOK_EVENT_ISSUE_COMMENT, &api.IssueCommentPayload{ Action: api.HOOK_ISSUE_COMMENT_EDITED, Issue: c.Issue.APIFormat(), @@ -478,7 +478,7 @@ func UpdateComment(doer *User, c *Comment, oldContent string) (err error) { Repository: c.Issue.Repo.APIFormat(nil), Sender: doer.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks [comment_id: %d]: %v", c.ID, err) + log.Error("PrepareWebhooks [comment_id: %d]: %v", c.ID, err) } return nil @@ -516,11 +516,11 @@ func DeleteCommentByID(doer *User, id int64) error { _, err = DeleteAttachmentsByComment(comment.ID, true) if err != nil { - log.Error(2, "Failed to delete attachments by comment[%d]: %v", comment.ID, err) + log.Error("Failed to delete attachments by comment[%d]: %v", comment.ID, err) } if err = comment.Issue.LoadAttributes(); err != nil { - log.Error(2, "Issue.LoadAttributes [issue_id: %d]: %v", comment.IssueID, err) + log.Error("Issue.LoadAttributes [issue_id: %d]: %v", comment.IssueID, err) } else if err = PrepareWebhooks(comment.Issue.Repo, HOOK_EVENT_ISSUE_COMMENT, &api.IssueCommentPayload{ Action: api.HOOK_ISSUE_COMMENT_DELETED, Issue: comment.Issue.APIFormat(), @@ -528,7 +528,7 @@ func DeleteCommentByID(doer *User, id int64) error { Repository: comment.Issue.Repo.APIFormat(nil), Sender: doer.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) + log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) } return nil } diff --git a/internal/db/issue.go b/internal/db/issue.go index f176f876..a35e2d89 100644 --- a/internal/db/issue.go +++ b/internal/db/issue.go @@ -10,7 +10,7 @@ import ( "time" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" api "github.com/gogs/go-gogs-client" @@ -231,7 +231,7 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) { if issue.IsPull { err = issue.PullRequest.LoadIssue() if err != nil { - log.Error(2, "LoadIssue: %v", err) + log.Error("LoadIssue: %v", err) return } err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ @@ -251,7 +251,7 @@ func (issue *Issue) sendLabelUpdatedWebhook(doer *User) { }) } if err != nil { - log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) } } @@ -346,7 +346,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) { if issue.IsPull { err = issue.PullRequest.LoadIssue() if err != nil { - log.Error(2, "LoadIssue: %v", err) + log.Error("LoadIssue: %v", err) return } err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ @@ -366,7 +366,7 @@ func (issue *Issue) ClearLabels(doer *User) (err error) { }) } if err != nil { - log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) } return nil @@ -503,7 +503,7 @@ func (issue *Issue) ChangeStatus(doer *User, repo *Repository, isClosed bool) (e err = PrepareWebhooks(repo, HOOK_EVENT_ISSUES, apiIssues) } if err != nil { - log.Error(2, "PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err) + log.Error("PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err) } return nil @@ -545,7 +545,7 @@ func (issue *Issue) ChangeTitle(doer *User, title string) (err error) { }) } if err != nil { - log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) } return nil @@ -587,7 +587,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) { }) } if err != nil { - log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) } return nil @@ -601,7 +601,7 @@ func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { issue.Assignee, err = GetUserByID(issue.AssigneeID) if err != nil && !errors.IsUserNotExist(err) { - log.Error(4, "GetUserByID [assignee_id: %v]: %v", issue.AssigneeID, err) + log.Error("GetUserByID [assignee_id: %v]: %v", issue.AssigneeID, err) return nil } @@ -636,7 +636,7 @@ func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { err = PrepareWebhooks(issue.Repo, HOOK_EVENT_ISSUES, apiIssues) } if err != nil { - log.Error(4, "PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, isRemoveAssignee, err) + log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, isRemoveAssignee, err) } return nil @@ -777,10 +777,10 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string) RepoName: repo.Name, IsPrivate: repo.IsPrivate, }); err != nil { - log.Error(2, "NotifyWatchers: %v", err) + log.Error("NotifyWatchers: %v", err) } if err = issue.MailParticipants(); err != nil { - log.Error(2, "MailParticipants: %v", err) + log.Error("MailParticipants: %v", err) } if err = PrepareWebhooks(repo, HOOK_EVENT_ISSUES, &api.IssuesPayload{ @@ -790,7 +790,7 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string) Repository: repo.APIFormat(nil), Sender: issue.Poster.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks: %v", err) + log.Error("PrepareWebhooks: %v", err) } return nil diff --git a/internal/db/issue_mail.go b/internal/db/issue_mail.go index b1f81cc8..31643f3a 100644 --- a/internal/db/issue_mail.go +++ b/internal/db/issue_mail.go @@ -8,7 +8,7 @@ import ( "fmt" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/mailer" "gogs.io/gogs/internal/markup" @@ -173,7 +173,7 @@ func (issue *Issue) MailParticipants() (err error) { } if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil { - log.Error(2, "mailIssueCommentToParticipants: %v", err) + log.Error("mailIssueCommentToParticipants: %v", err) } return nil diff --git a/internal/db/login_source.go b/internal/db/login_source.go index c9e5dcc9..383e8b46 100644 --- a/internal/db/login_source.go +++ b/internal/db/login_source.go @@ -19,8 +19,8 @@ import ( "github.com/go-macaron/binding" "github.com/json-iterator/go" "github.com/unknwon/com" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" "xorm.io/core" "xorm.io/xorm" @@ -469,7 +469,7 @@ func LoadAuthSources() { paths, err := com.GetFileListBySuffix(authdPath, ".conf") if err != nil { - log.Fatal(2, "Failed to list authentication sources: %v", err) + log.Fatal("Failed to list authentication sources: %v", err) } localLoginSources.sources = make([]*LoginSource, 0, len(paths)) @@ -477,7 +477,7 @@ func LoadAuthSources() { for _, fpath := range paths { authSource, err := ini.Load(fpath) if err != nil { - log.Fatal(2, "Failed to load authentication source: %v", err) + log.Fatal("Failed to load authentication source: %v", err) } authSource.NameMapper = ini.TitleUnderscore @@ -496,7 +496,7 @@ func LoadAuthSources() { fi, err := os.Stat(fpath) if err != nil { - log.Fatal(2, "Failed to load authentication source: %v", err) + log.Fatal("Failed to load authentication source: %v", err) } loginSource.Updated = fi.ModTime() @@ -519,11 +519,11 @@ func LoadAuthSources() { loginSource.Type = LOGIN_GITHUB loginSource.Cfg = &GitHubConfig{} default: - log.Fatal(2, "Failed to load authentication source: unknown type '%s'", authType) + log.Fatal("Failed to load authentication source: unknown type '%s'", authType) } if err = authSource.Section("config").MapTo(loginSource.Cfg); err != nil { - log.Fatal(2, "Failed to parse authentication source 'config': %v", err) + log.Fatal("Failed to parse authentication source 'config': %v", err) } localLoginSources.sources = append(localLoginSources.sources, loginSource) diff --git a/internal/db/migrations/migrations.go b/internal/db/migrations/migrations.go index 79534484..a4f47441 100644 --- a/internal/db/migrations/migrations.go +++ b/internal/db/migrations/migrations.go @@ -10,7 +10,7 @@ import ( "time" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "gogs.io/gogs/internal/tool" @@ -93,7 +93,7 @@ func Migrate(x *xorm.Engine) error { v := currentVersion.Version if _MIN_DB_VER > v { - log.Fatal(0, ` + log.Fatal(` Hi there, thank you for using Gogs for so long! However, Gogs has stopped supporting auto-migration from your previously installed version. But the good news is, it's very easy to fix this problem! diff --git a/internal/db/migrations/v15.go b/internal/db/migrations/v15.go index d9c913df..0ef77555 100644 --- a/internal/db/migrations/v15.go +++ b/internal/db/migrations/v15.go @@ -12,7 +12,7 @@ import ( "strings" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "gogs.io/gogs/internal/osutil" diff --git a/internal/db/migrations/v16.go b/internal/db/migrations/v16.go index b374be39..b2eb813b 100644 --- a/internal/db/migrations/v16.go +++ b/internal/db/migrations/v16.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" + log "unknwon.dev/clog/v2" "xorm.io/xorm" - log "gopkg.in/clog.v1" "github.com/gogs/git-module" diff --git a/internal/db/milestone.go b/internal/db/milestone.go index 10c5c556..507c0e89 100644 --- a/internal/db/milestone.go +++ b/internal/db/milestone.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" api "github.com/gogs/go-gogs-client" @@ -336,7 +336,7 @@ func ChangeMilestoneAssign(doer *User, issue *Issue, oldMilestoneID int64) (err if issue.IsPull { err = issue.PullRequest.LoadIssue() if err != nil { - log.Error(2, "LoadIssue: %v", err) + log.Error("LoadIssue: %v", err) return } err = PrepareWebhooks(issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ @@ -356,7 +356,7 @@ func ChangeMilestoneAssign(doer *User, issue *Issue, oldMilestoneID int64) (err }) } if err != nil { - log.Error(2, "PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) } return nil diff --git a/internal/db/mirror.go b/internal/db/mirror.go index 0481e1d0..33c837fb 100644 --- a/internal/db/mirror.go +++ b/internal/db/mirror.go @@ -12,8 +12,8 @@ import ( "time" "github.com/unknwon/com" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -58,7 +58,7 @@ func (m *Mirror) AfterSet(colName string, _ xorm.Cell) { case "repo_id": m.Repo, err = GetRepositoryByID(m.RepoID) if err != nil { - log.Error(3, "GetRepositoryByID [%d]: %v", m.ID, err) + log.Error("GetRepositoryByID [%d]: %v", m.ID, err) } case "updated_unix": m.LastSync = time.Unix(m.LastSyncUnix, 0).Local() @@ -119,7 +119,7 @@ func (m *Mirror) readAddress() { cfg, err := ini.Load(m.Repo.GitConfigPath()) if err != nil { - log.Error(2, "Load: %v", err) + log.Error("Load: %v", err) return } m.address = cfg.Section("remote \"origin\"").Key("url").Value() @@ -233,12 +233,12 @@ func parseRemoteUpdateOutput(output string) []*mirrorSyncResult { case strings.HasPrefix(lines[i], " "): // New commits of a reference delimIdx := strings.Index(lines[i][3:], " ") if delimIdx == -1 { - log.Error(2, "SHA delimiter not found: %q", lines[i]) + log.Error("SHA delimiter not found: %q", lines[i]) continue } shas := strings.Split(lines[i][3:delimIdx+3], "..") if len(shas) != 2 { - log.Error(2, "Expect two SHAs but not what found: %q", lines[i]) + log.Error("Expect two SHAs but not what found: %q", lines[i]) continue } results = append(results, &mirrorSyncResult{ @@ -268,7 +268,7 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) { }) { desc := fmt.Sprintf("Source URL of mirror repository '%s' is not accessible: %s", m.Repo.FullName(), m.MosaicsAddress()) if err := CreateRepositoryNotice(desc); err != nil { - log.Error(2, "CreateRepositoryNotice: %v", err) + log.Error("CreateRepositoryNotice: %v", err) } return nil, false } @@ -281,17 +281,17 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) { timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath), "git", gitArgs...) if err != nil { - desc := fmt.Sprintf("Fail to update mirror repository '%s': %s", repoPath, stderr) - log.Error(2, desc) + desc := fmt.Sprintf("Failed to update mirror repository '%s': %s", repoPath, stderr) + log.Error(desc) if err = CreateRepositoryNotice(desc); err != nil { - log.Error(2, "CreateRepositoryNotice: %v", err) + log.Error("CreateRepositoryNotice: %v", err) } return nil, false } output := stderr if err := m.Repo.UpdateSize(); err != nil { - log.Error(2, "UpdateSize [repo_id: %d]: %v", m.Repo.ID, err) + log.Error("UpdateSize [repo_id: %d]: %v", m.Repo.ID, err) } if m.Repo.HasWiki() { @@ -299,10 +299,10 @@ func (m *Mirror) runSync() ([]*mirrorSyncResult, bool) { if _, stderr, err := process.ExecDir( timeout, wikiPath, fmt.Sprintf("Mirror.runSync: %s", wikiPath), "git", "remote", "update", "--prune"); err != nil { - desc := fmt.Sprintf("Fail to update mirror wiki repository '%s': %s", wikiPath, stderr) - log.Error(2, desc) + desc := fmt.Sprintf("Failed to update mirror wiki repository '%s': %s", wikiPath, stderr) + log.Error(desc) if err = CreateRepositoryNotice(desc); err != nil { - log.Error(2, "CreateRepositoryNotice: %v", err) + log.Error("CreateRepositoryNotice: %v", err) } } } @@ -353,14 +353,14 @@ func MirrorUpdate() { if err := x.Where("next_update_unix<=?", time.Now().Unix()).Iterate(new(Mirror), func(idx int, bean interface{}) error { m := bean.(*Mirror) if m.Repo == nil { - log.Error(2, "Disconnected mirror repository found: %d", m.ID) + log.Error("Disconnected mirror repository found: %d", m.ID) return nil } MirrorQueue.Add(m.RepoID) return nil }); err != nil { - log.Error(2, "MirrorUpdate: %v", err) + log.Error("MirrorUpdate: %v", err) } } @@ -374,7 +374,7 @@ func SyncMirrors() { m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64()) if err != nil { - log.Error(2, "GetMirrorByRepoID [%d]: %v", m.RepoID, err) + log.Error("GetMirrorByRepoID [%d]: %v", m.RepoID, err) continue } @@ -385,7 +385,7 @@ func SyncMirrors() { m.ScheduleNextSync() if err = UpdateMirror(m); err != nil { - log.Error(2, "UpdateMirror [%d]: %v", m.RepoID, err) + log.Error("UpdateMirror [%d]: %v", m.RepoID, err) continue } @@ -399,7 +399,7 @@ func SyncMirrors() { } else { gitRepo, err = git.OpenRepository(m.Repo.RepoPath()) if err != nil { - log.Error(2, "OpenRepository [%d]: %v", m.RepoID, err) + log.Error("OpenRepository [%d]: %v", m.RepoID, err) continue } } @@ -413,7 +413,7 @@ func SyncMirrors() { // Delete reference if result.newCommitID == GIT_SHORT_EMPTY_SHA { if err = MirrorSyncDeleteAction(m.Repo, result.refName); err != nil { - log.Error(2, "MirrorSyncDeleteAction [repo_id: %d]: %v", m.RepoID, err) + log.Error("MirrorSyncDeleteAction [repo_id: %d]: %v", m.RepoID, err) } continue } @@ -422,7 +422,7 @@ func SyncMirrors() { isNewRef := false if result.oldCommitID == GIT_SHORT_EMPTY_SHA { if err = MirrorSyncCreateAction(m.Repo, result.refName); err != nil { - log.Error(2, "MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err) + log.Error("MirrorSyncCreateAction [repo_id: %d]: %v", m.RepoID, err) continue } isNewRef = true @@ -435,33 +435,33 @@ func SyncMirrors() { if !isNewRef { oldCommitID, err = git.GetFullCommitID(gitRepo.Path, result.oldCommitID) if err != nil { - log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err) + log.Error("GetFullCommitID [%d]: %v", m.RepoID, err) continue } newCommitID, err = git.GetFullCommitID(gitRepo.Path, result.newCommitID) if err != nil { - log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err) + log.Error("GetFullCommitID [%d]: %v", m.RepoID, err) continue } commits, err = gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID) if err != nil { - log.Error(2, "CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err) + log.Error("CommitsBetweenIDs [repo_id: %d, new_commit_id: %s, old_commit_id: %s]: %v", m.RepoID, newCommitID, oldCommitID, err) continue } } else { refNewCommitID, err := gitRepo.GetBranchCommitID(result.refName) if err != nil { - log.Error(2, "GetFullCommitID [%d]: %v", m.RepoID, err) + log.Error("GetFullCommitID [%d]: %v", m.RepoID, err) continue } if newCommit, err := gitRepo.GetCommit(refNewCommitID); err != nil { - log.Error(2, "GetCommit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err) + log.Error("GetCommit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err) continue } else { // TODO: Get the commits for the new ref until the closest ancestor branch like Github does commits, err = newCommit.CommitsBeforeLimit(10) if err != nil { - log.Error(2, "CommitsBeforeLimit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err) + log.Error("CommitsBeforeLimit [repo_id: %d, commit_id: %s]: %v", m.RepoID, refNewCommitID, err) } oldCommitID = git.EMPTY_SHA newCommitID = refNewCommitID @@ -473,13 +473,13 @@ func SyncMirrors() { NewCommitID: newCommitID, Commits: ListToPushCommits(commits), }); err != nil { - log.Error(2, "MirrorSyncPushAction [repo_id: %d]: %v", m.RepoID, err) + log.Error("MirrorSyncPushAction [repo_id: %d]: %v", m.RepoID, err) continue } } if _, err = x.Exec("UPDATE mirror SET updated_unix = ? WHERE repo_id = ?", time.Now().Unix(), m.RepoID); err != nil { - log.Error(2, "Update 'mirror.updated_unix' [%d]: %v", m.RepoID, err) + log.Error("Update 'mirror.updated_unix' [%d]: %v", m.RepoID, err) continue } @@ -487,14 +487,14 @@ func SyncMirrors() { // update if latest commit date is newer. commitDate, err := git.GetLatestCommitDate(m.Repo.RepoPath(), "") if err != nil { - log.Error(2, "GetLatestCommitDate [%d]: %v", m.RepoID, err) + log.Error("GetLatestCommitDate [%d]: %v", m.RepoID, err) continue } else if commitDate.Before(m.Repo.Updated) { continue } if _, err = x.Exec("UPDATE repository SET updated_unix = ? WHERE id = ?", commitDate.Unix(), m.RepoID); err != nil { - log.Error(2, "Update 'repository.updated_unix' [%d]: %v", m.RepoID, err) + log.Error("Update 'repository.updated_unix' [%d]: %v", m.RepoID, err) continue } } diff --git a/internal/db/models.go b/internal/db/models.go index 75aeaf3a..403c04ff 100644 --- a/internal/db/models.go +++ b/internal/db/models.go @@ -20,7 +20,7 @@ import ( "github.com/json-iterator/go" _ "github.com/lib/pq" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/core" "xorm.io/xorm" @@ -370,20 +370,20 @@ func ImportDatabase(dirPath string, verbose bool) (err error) { meta := make(map[string]interface{}) if err = jsoniter.Unmarshal(scanner.Bytes(), &meta); err != nil { - log.Error(2, "Failed to unmarshal to map: %v", err) + log.Error("Failed to unmarshal to map: %v", err) } // Reset created_unix back to the date save in archive because Insert method updates its value if isInsertProcessor && !skipInsertProcessors[rawTableName] { if _, err = x.Exec("UPDATE "+rawTableName+" SET created_unix=? WHERE id=?", meta["CreatedUnix"], meta["ID"]); err != nil { - log.Error(2, "Failed to reset 'created_unix': %v", err) + log.Error("Failed to reset 'created_unix': %v", err) } } switch rawTableName { case "milestone": if _, err = x.Exec("UPDATE "+rawTableName+" SET deadline_unix=?, closed_date_unix=? WHERE id=?", meta["DeadlineUnix"], meta["ClosedDateUnix"], meta["ID"]); err != nil { - log.Error(2, "Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err) + log.Error("Failed to reset 'milestone.deadline_unix', 'milestone.closed_date_unix': %v", err) } } } diff --git a/internal/db/pull.go b/internal/db/pull.go index ccc46231..268927eb 100644 --- a/internal/db/pull.go +++ b/internal/db/pull.go @@ -12,7 +12,7 @@ import ( "time" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -331,12 +331,12 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle } if err = MergePullRequestAction(doer, pr.Issue.Repo, pr.Issue); err != nil { - log.Error(2, "MergePullRequestAction [%d]: %v", pr.ID, err) + log.Error("MergePullRequestAction [%d]: %v", pr.ID, err) } // Reload pull request information. if err = pr.LoadAttributes(); err != nil { - log.Error(2, "LoadAttributes: %v", err) + log.Error("LoadAttributes: %v", err) return nil } if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ @@ -346,13 +346,13 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle Repository: pr.Issue.Repo.APIFormat(nil), Sender: doer.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks: %v", err) + log.Error("PrepareWebhooks: %v", err) return nil } l, err := headGitRepo.CommitsBetweenIDs(pr.MergedCommitID, pr.MergeBase) if err != nil { - log.Error(2, "CommitsBetweenIDs: %v", err) + log.Error("CommitsBetweenIDs: %v", err) return nil } @@ -361,7 +361,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle // to avoid strange diff commits produced. mergeCommit, err := baseGitRepo.GetBranchCommit(pr.BaseBranch) if err != nil { - log.Error(2, "GetBranchCommit: %v", err) + log.Error("GetBranchCommit: %v", err) return nil } if mergeStyle == MERGE_STYLE_REGULAR { @@ -370,7 +370,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle commits, err := ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.RepoPath(), pr.BaseRepo.HTMLURL()) if err != nil { - log.Error(2, "ToApiPayloadCommits: %v", err) + log.Error("ToApiPayloadCommits: %v", err) return nil } @@ -385,7 +385,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle Sender: doer.APIFormat(), } if err = PrepareWebhooks(pr.BaseRepo, HOOK_EVENT_PUSH, p); err != nil { - log.Error(2, "PrepareWebhooks: %v", err) + log.Error("PrepareWebhooks: %v", err) return nil } return nil @@ -490,10 +490,10 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str RepoName: repo.Name, IsPrivate: repo.IsPrivate, }); err != nil { - log.Error(2, "NotifyWatchers: %v", err) + log.Error("NotifyWatchers: %v", err) } if err = pull.MailParticipants(); err != nil { - log.Error(2, "MailParticipants: %v", err) + log.Error("MailParticipants: %v", err) } pr.Issue = pull @@ -505,7 +505,7 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str Repository: repo.APIFormat(nil), Sender: pull.Poster.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks: %v", err) + log.Error("PrepareWebhooks: %v", err) } return nil @@ -667,7 +667,7 @@ func (pr *PullRequest) AddToTaskQueue() { go PullRequestQueue.AddFunc(pr.ID, func() { pr.Status = PULL_REQUEST_STATUS_CHECKING if err := pr.UpdateCols("status"); err != nil { - log.Error(3, "AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err) + log.Error("AddToTaskQueue.UpdateCols[%d].(add to queue): %v", pr.ID, err) } }) } @@ -717,10 +717,10 @@ func addHeadRepoTasks(prs []*PullRequest) { for _, pr := range prs { log.Trace("addHeadRepoTasks[%d]: composing new test task", pr.ID) if err := pr.UpdatePatch(); err != nil { - log.Error(4, "UpdatePatch: %v", err) + log.Error("UpdatePatch: %v", err) continue } else if err := pr.PushToBaseRepo(); err != nil { - log.Error(4, "PushToBaseRepo: %v", err) + log.Error("PushToBaseRepo: %v", err) continue } @@ -734,20 +734,20 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: finding pull requests", repoID, branch) prs, err := GetUnmergedPullRequestsByHeadInfo(repoID, branch) if err != nil { - log.Error(2, "Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err) + log.Error("Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err) return } if isSync { if err = PullRequestList(prs).LoadAttributes(); err != nil { - log.Error(2, "PullRequestList.LoadAttributes: %v", err) + log.Error("PullRequestList.LoadAttributes: %v", err) } if err == nil { for _, pr := range prs { pr.Issue.PullRequest = pr if err = pr.Issue.LoadAttributes(); err != nil { - log.Error(2, "LoadAttributes: %v", err) + log.Error("LoadAttributes: %v", err) continue } if err = PrepareWebhooks(pr.Issue.Repo, HOOK_EVENT_PULL_REQUEST, &api.PullRequestPayload{ @@ -757,7 +757,7 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool Repository: pr.Issue.Repo.APIFormat(nil), Sender: doer.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks [pull_id: %v]: %v", pr.ID, err) + log.Error("PrepareWebhooks [pull_id: %v]: %v", pr.ID, err) continue } } @@ -769,7 +769,7 @@ func AddTestPullRequestTask(doer *User, repoID int64, branch string, isSync bool log.Trace("AddTestPullRequestTask [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch) prs, err = GetUnmergedPullRequestsByBaseInfo(repoID, branch) if err != nil { - log.Error(2, "Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err) + log.Error("Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err) return } for _, pr := range prs { @@ -796,7 +796,7 @@ func (pr *PullRequest) checkAndUpdateStatus() { // Make sure there is no waiting test to process before levaing the checking status. if !PullRequestQueue.Exist(pr.ID) { if err := pr.UpdateCols("status"); err != nil { - log.Error(4, "Update[%d]: %v", pr.ID, err) + log.Error("Update[%d]: %v", pr.ID, err) } } } @@ -812,12 +812,12 @@ func TestPullRequests() { pr := bean.(*PullRequest) if err := pr.LoadAttributes(); err != nil { - log.Error(3, "LoadAttributes: %v", err) + log.Error("LoadAttributes: %v", err) return nil } if err := pr.testPatch(); err != nil { - log.Error(3, "testPatch: %v", err) + log.Error("testPatch: %v", err) return nil } prs = append(prs, pr) @@ -836,10 +836,10 @@ func TestPullRequests() { pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64()) if err != nil { - log.Error(4, "GetPullRequestByID[%s]: %v", prID, err) + log.Error("GetPullRequestByID[%s]: %v", prID, err) continue } else if err = pr.testPatch(); err != nil { - log.Error(4, "testPatch[%d]: %v", pr.ID, err) + log.Error("testPatch[%d]: %v", pr.ID, err) continue } diff --git a/internal/db/release.go b/internal/db/release.go index 7712a0af..d0c4fbe6 100644 --- a/internal/db/release.go +++ b/internal/db/release.go @@ -10,7 +10,7 @@ import ( "strings" "time" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -156,7 +156,7 @@ func (r *Release) preparePublishWebhooks() { Repository: r.Repo.APIFormat(nil), Sender: r.Publisher.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks: %v", err) + log.Error("PrepareWebhooks: %v", err) } } diff --git a/internal/db/repo.go b/internal/db/repo.go index b73e302a..7c6d9e36 100644 --- a/internal/db/repo.go +++ b/internal/db/repo.go @@ -23,8 +23,8 @@ import ( "github.com/nfnt/resize" "github.com/unknwon/cae/zip" "github.com/unknwon/com" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -59,13 +59,13 @@ func LoadRepoConfig() { for i, t := range types { files, err := conf.AssetDir("conf/" + t) if err != nil { - log.Fatal(4, "Fail to get %s files: %v", t, err) + log.Fatal("Failed to get %s files: %v", t, err) } customPath := path.Join(setting.CustomPath, "conf", t) if com.IsDir(customPath) { customFiles, err := com.StatDir(customPath) if err != nil { - log.Fatal(4, "Fail to get custom %s files: %v", t, err) + log.Fatal("Failed to get custom %s files: %v", t, err) } for _, f := range customFiles { @@ -106,19 +106,19 @@ func NewRepoContext() { // Check Git installation. if _, err := exec.LookPath("git"); err != nil { - log.Fatal(2, "Failed to test 'git' command: %v (forgotten install?)", err) + log.Fatal("Failed to test 'git' command: %v (forgotten install?)", err) } // Check Git version. var err error setting.Git.Version, err = git.BinVersion() if err != nil { - log.Fatal(2, "Failed to get Git version: %v", err) + log.Fatal("Failed to get Git version: %v", err) } log.Trace("Git version: %s", setting.Git.Version) if version.Compare("1.8.3", setting.Git.Version, ">") { - log.Fatal(2, "Gogs requires Git version greater or equal to 1.8.3") + log.Fatal("Gogs requires Git version greater or equal to 1.8.3") } git.HookDir = "custom_hooks" git.HookSampleDir = "hooks" @@ -130,11 +130,11 @@ func NewRepoContext() { // ExitError indicates this config is not set if _, ok := err.(*exec.ExitError); ok || strings.TrimSpace(stdout) == "" { if _, stderr, gerr := process.Exec("NewRepoContext(set "+configKey+")", "git", "config", "--global", configKey, defaultValue); gerr != nil { - log.Fatal(4, "Fail to set git %s(%s): %s", configKey, gerr, stderr) + log.Fatal("Failed to set git %s(%s): %s", configKey, gerr, stderr) } log.Info("Git config %s set to %s", configKey, defaultValue) } else { - log.Fatal(4, "Fail to get git %s(%s): %s", configKey, err, stderr) + log.Fatal("Failed to get git %s(%s): %s", configKey, err, stderr) } } } @@ -142,7 +142,7 @@ func NewRepoContext() { // Set git some configurations. if _, stderr, err := process.Exec("NewRepoContext(git config --global core.quotepath false)", "git", "config", "--global", "core.quotepath", "false"); err != nil { - log.Fatal(2, "Fail to execute 'git config --global core.quotepath false': %v - %s", err, stderr) + log.Fatal("Failed to execute 'git config --global core.quotepath false': %v - %s", err, stderr) } RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp")) @@ -783,7 +783,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository, Quiet: true, Timeout: migrateTimeout, }); err != nil { - log.Trace("Fail to clone wiki: %v", err) + log.Trace("Failed to clone wiki: %v", err) RemoveAllWithNotice("Delete repository wiki for initialization failure", wikiPath) } } @@ -813,7 +813,7 @@ func MigrateRepository(doer, owner *User, opts MigrateRepoOptions) (*Repository, } if err = repo.UpdateSize(); err != nil { - log.Error(2, "UpdateSize [repo_id: %d]: %v", repo.ID, err) + log.Error("UpdateSize [repo_id: %d]: %v", repo.ID, err) } } @@ -1163,7 +1163,7 @@ func countRepositories(userID int64, private bool) int64 { count, err := sess.Count(new(Repository)) if err != nil { - log.Error(4, "countRepositories: %v", err) + log.Error("countRepositories: %v", err) } return count } @@ -1436,11 +1436,11 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e daemonExportFile := path.Join(repo.RepoPath(), "git-daemon-export-ok") if repo.IsPrivate && com.IsExist(daemonExportFile) { if err = os.Remove(daemonExportFile); err != nil { - log.Error(4, "Failed to remove %s: %v", daemonExportFile, err) + log.Error("Failed to remove %s: %v", daemonExportFile, err) } } else if !repo.IsPrivate && !com.IsExist(daemonExportFile) { if f, err := os.Create(daemonExportFile); err != nil { - log.Error(4, "Failed to create %s: %v", daemonExportFile, err) + log.Error("Failed to create %s: %v", daemonExportFile, err) } else { f.Close() } @@ -1592,7 +1592,7 @@ func DeleteRepository(uid, repoID int64) error { if repo.NumForks > 0 { if _, err = x.Exec("UPDATE `repository` SET fork_id=0,is_fork=? WHERE fork_id=?", false, repo.ID); err != nil { - log.Error(4, "reset 'fork_id' and 'is_fork': %v", err) + log.Error("reset 'fork_id' and 'is_fork': %v", err) } } @@ -1781,14 +1781,14 @@ func DeleteOldRepositoryArchives() { dir, err := os.Open(dirPath) if err != nil { - log.Error(3, "Fail to open directory '%s': %v", dirPath, err) + log.Error("Failed to open directory '%s': %v", dirPath, err) continue } fis, err := dir.Readdir(0) dir.Close() if err != nil { - log.Error(3, "Fail to read directory '%s': %v", dirPath, err) + log.Error("Failed to read directory '%s': %v", dirPath, err) continue } @@ -1799,10 +1799,10 @@ func DeleteOldRepositoryArchives() { archivePath := filepath.Join(dirPath, fi.Name()) if err = os.Remove(archivePath); err != nil { - desc := fmt.Sprintf("Fail to health delete archive '%s': %v", archivePath, err) + desc := fmt.Sprintf("Failed to health delete archive '%s': %v", archivePath, err) log.Warn(desc) if err = CreateRepositoryNotice(desc); err != nil { - log.Error(3, "CreateRepositoryNotice: %v", err) + log.Error("CreateRepositoryNotice: %v", err) } } } @@ -1810,7 +1810,7 @@ func DeleteOldRepositoryArchives() { return nil }); err != nil { - log.Error(2, "DeleteOldRepositoryArchives: %v", err) + log.Error("DeleteOldRepositoryArchives: %v", err) } } @@ -1935,12 +1935,12 @@ func GitFsck() { desc := fmt.Sprintf("Failed to perform health check on repository '%s': %v", repoPath, err) log.Warn(desc) if err = CreateRepositoryNotice(desc); err != nil { - log.Error(3, "CreateRepositoryNotice: %v", err) + log.Error("CreateRepositoryNotice: %v", err) } } return nil }); err != nil { - log.Error(2, "GitFsck: %v", err) + log.Error("GitFsck: %v", err) } } @@ -1971,7 +1971,7 @@ type repoChecker struct { func repoStatsCheck(checker *repoChecker) { results, err := x.Query(checker.querySQL) if err != nil { - log.Error(2, "Select %s: %v", checker.desc, err) + log.Error("Select %s: %v", checker.desc, err) return } for _, result := range results { @@ -1979,7 +1979,7 @@ func repoStatsCheck(checker *repoChecker) { log.Trace("Updating %s: %d", checker.desc, id) _, err = x.Exec(checker.correctSQL, id, id) if err != nil { - log.Error(2, "Update %s[%d]: %v", checker.desc, id, err) + log.Error("Update %s[%d]: %v", checker.desc, id, err) } } } @@ -2033,14 +2033,14 @@ func CheckRepoStats() { desc := "repository count 'num_closed_issues'" results, err := x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_closed_issues!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", true, false) if err != nil { - log.Error(2, "Select %s: %v", desc, err) + log.Error("Select %s: %v", desc, err) } else { for _, result := range results { id := com.StrTo(result["id"]).MustInt64() log.Trace("Updating %s: %d", desc, id) _, err = x.Exec("UPDATE `repository` SET num_closed_issues=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, false, id) if err != nil { - log.Error(2, "Update %s[%d]: %v", desc, id, err) + log.Error("Update %s[%d]: %v", desc, id, err) } } } @@ -2050,7 +2050,7 @@ func CheckRepoStats() { // ***** START: Repository.NumForks ***** results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_forks!=(SELECT COUNT(*) FROM `repository` WHERE fork_id=repo.id)") if err != nil { - log.Error(2, "Select repository count 'num_forks': %v", err) + log.Error("Select repository count 'num_forks': %v", err) } else { for _, result := range results { id := com.StrTo(result["id"]).MustInt64() @@ -2058,19 +2058,19 @@ func CheckRepoStats() { repo, err := GetRepositoryByID(id) if err != nil { - log.Error(2, "GetRepositoryByID[%d]: %v", id, err) + log.Error("GetRepositoryByID[%d]: %v", id, err) continue } rawResult, err := x.Query("SELECT COUNT(*) FROM `repository` WHERE fork_id=?", repo.ID) if err != nil { - log.Error(2, "Select count of forks[%d]: %v", repo.ID, err) + log.Error("Select count of forks[%d]: %v", repo.ID, err) continue } repo.NumForks = int(parseCountResult(rawResult)) if err = UpdateRepository(repo, false); err != nil { - log.Error(2, "UpdateRepository[%d]: %v", id, err) + log.Error("UpdateRepository[%d]: %v", id, err) continue } } @@ -2410,14 +2410,14 @@ func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string) } if err = repo.UpdateSize(); err != nil { - log.Error(2, "UpdateSize [repo_id: %d]: %v", repo.ID, err) + log.Error("UpdateSize [repo_id: %d]: %v", repo.ID, err) } if err = PrepareWebhooks(baseRepo, HOOK_EVENT_FORK, &api.ForkPayload{ Forkee: repo.APIFormat(nil), Repo: baseRepo.APIFormat(nil), Sender: doer.APIFormat(), }); err != nil { - log.Error(2, "PrepareWebhooks [repo_id: %d]: %v", baseRepo.ID, err) + log.Error("PrepareWebhooks [repo_id: %d]: %v", baseRepo.ID, err) } return repo, nil } diff --git a/internal/db/repo_collaboration.go b/internal/db/repo_collaboration.go index 84059c0a..b3d046ec 100644 --- a/internal/db/repo_collaboration.go +++ b/internal/db/repo_collaboration.go @@ -7,7 +7,7 @@ package db import ( "fmt" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" api "github.com/gogs/go-gogs-client" ) @@ -41,7 +41,7 @@ func IsCollaborator(repoID, userID int64) bool { } has, err := x.Get(collaboration) if err != nil { - log.Error(2, "get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err) + log.Error("get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err) return false } return has diff --git a/internal/db/ssh_key.go b/internal/db/ssh_key.go index 317d90d3..d4189cff 100644 --- a/internal/db/ssh_key.go +++ b/internal/db/ssh_key.go @@ -20,7 +20,7 @@ import ( "github.com/unknwon/com" "golang.org/x/crypto/ssh" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "gogs.io/gogs/internal/process" @@ -341,7 +341,7 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error { // .ssh directory should have mode 700, and authorized_keys file should have mode 600. if fi.Mode().Perm() > 0600 { - log.Error(4, "authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) + log.Error("authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String()) if err = f.Chmod(0600); err != nil { return err } diff --git a/internal/db/ssh_key_test.go b/internal/db/ssh_key_test.go index d4c06488..616347fb 100644 --- a/internal/db/ssh_key_test.go +++ b/internal/db/ssh_key_test.go @@ -15,7 +15,7 @@ import ( ) func init() { - setting.NewContext() + setting.Init() } func Test_SSHParsePublicKey(t *testing.T) { diff --git a/internal/db/two_factor.go b/internal/db/two_factor.go index dcc1c16c..cb539ef6 100644 --- a/internal/db/two_factor.go +++ b/internal/db/two_factor.go @@ -12,7 +12,7 @@ import ( "github.com/pquerna/otp/totp" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "gogs.io/gogs/internal/db/errors" @@ -58,7 +58,7 @@ func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) { func IsUserEnabledTwoFactor(userID int64) bool { has, err := x.Where("user_id = ?", userID).Get(new(TwoFactor)) if err != nil { - log.Error(2, "IsUserEnabledTwoFactor [user_id: %d]: %v", userID, err) + log.Error("IsUserEnabledTwoFactor [user_id: %d]: %v", userID, err) } return has } diff --git a/internal/db/update.go b/internal/db/update.go index 6555a479..e8fc41ed 100644 --- a/internal/db/update.go +++ b/internal/db/update.go @@ -67,7 +67,7 @@ func PushUpdate(opts PushUpdateOptions) (err error) { gitUpdate := exec.Command("git", "update-server-info") gitUpdate.Dir = repoPath if err = gitUpdate.Run(); err != nil { - return fmt.Errorf("Fail to call 'git update-server-info': %v", err) + return fmt.Errorf("run 'git update-server-info': %v", err) } gitRepo, err := git.OpenRepository(repoPath) diff --git a/internal/db/user.go b/internal/db/user.go index 003e2efd..ad6448aa 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -23,7 +23,7 @@ import ( "github.com/nfnt/resize" "github.com/unknwon/com" "golang.org/x/crypto/pbkdf2" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -265,7 +265,7 @@ func (u *User) RelAvatarLink() string { case setting.DisableGravatar, setting.OfflineMode: if !com.IsExist(u.CustomAvatarPath()) { if err := u.GenerateRandomAvatar(); err != nil { - log.Error(3, "GenerateRandomAvatar: %v", err) + log.Error("GenerateRandomAvatar: %v", err) } } @@ -371,7 +371,7 @@ func (u *User) DeleteAvatar() error { func (u *User) IsAdminOfRepo(repo *Repository) bool { has, err := HasAccess(u.ID, repo, ACCESS_MODE_ADMIN) if err != nil { - log.Error(2, "HasAccess: %v", err) + log.Error("HasAccess: %v", err) } return has } @@ -380,7 +380,7 @@ func (u *User) IsAdminOfRepo(repo *Repository) bool { func (u *User) IsWriterOfRepo(repo *Repository) bool { has, err := HasAccess(u.ID, repo, ACCESS_MODE_WRITE) if err != nil { - log.Error(2, "HasAccess: %v", err) + log.Error("HasAccess: %v", err) } return has } @@ -608,7 +608,7 @@ func parseUserFromCode(code string) (user *User) { if user, err = GetUserByName(string(b)); user != nil { return user } else if !errors.IsUserNotExist(err) { - log.Error(2, "GetUserByName: %v", err) + log.Error("GetUserByName: %v", err) } } diff --git a/internal/db/webhook.go b/internal/db/webhook.go index 750cc613..7bbdac0e 100644 --- a/internal/db/webhook.go +++ b/internal/db/webhook.go @@ -16,7 +16,7 @@ import ( "github.com/json-iterator/go" gouuid "github.com/satori/go.uuid" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" api "github.com/gogs/go-gogs-client" @@ -127,7 +127,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) { case "events": w.HookEvent = &HookEvent{} if err = jsoniter.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { - log.Error(3, "Unmarshal [%d]: %v", w.ID, err) + log.Error("Unmarshal [%d]: %v", w.ID, err) } case "created_unix": w.Created = time.Unix(w.CreatedUnix, 0).Local() @@ -139,7 +139,7 @@ func (w *Webhook) AfterSet(colName string, _ xorm.Cell) { func (w *Webhook) GetSlackHook() *SlackMeta { s := &SlackMeta{} if err := jsoniter.Unmarshal([]byte(w.Meta), s); err != nil { - log.Error(2, "GetSlackHook [%d]: %v", w.ID, err) + log.Error("GetSlackHook [%d]: %v", w.ID, err) } return s } @@ -457,7 +457,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) { t.RequestInfo = &HookRequest{} if err = jsoniter.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil { - log.Error(3, "Unmarshal[%d]: %v", t.ID, err) + log.Error("Unmarshal[%d]: %v", t.ID, err) } case "response_content": @@ -467,7 +467,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) { t.ResponseInfo = &HookResponse{} if err = jsoniter.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil { - log.Error(3, "Unmarshal [%d]: %v", t.ID, err) + log.Error("Unmarshal [%d]: %v", t.ID, err) } } } @@ -475,7 +475,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) { func (t *HookTask) MarshalJSON(v interface{}) string { p, err := jsoniter.Marshal(v) if err != nil { - log.Error(3, "Marshal [%d]: %v", t.ID, err) + log.Error("Marshal [%d]: %v", t.ID, err) } return string(p) } @@ -588,7 +588,7 @@ func prepareHookTasks(e Engine, repo *Repository, event HookEventType, p api.Pay if len(w.Secret) > 0 { data, err := payloader.JSONPayload() if err != nil { - log.Error(2, "prepareWebhooks.JSONPayload: %v", err) + log.Error("prepareWebhooks.JSONPayload: %v", err) } sig := hmac.New(sha256.New, []byte(w.Secret)) sig.Write(data) @@ -691,7 +691,7 @@ func (t *HookTask) deliver() { // Update webhook last delivery status. w, err := GetWebhookByID(t.HookID) if err != nil { - log.Error(3, "GetWebhookByID: %v", err) + log.Error("GetWebhookByID: %v", err) return } if t.IsSucceed { @@ -700,7 +700,7 @@ func (t *HookTask) deliver() { w.LastStatus = HOOK_STATUS_FAILED } if err = UpdateWebhook(w); err != nil { - log.Error(3, "UpdateWebhook: %v", err) + log.Error("UpdateWebhook: %v", err) return } }() @@ -742,7 +742,7 @@ func DeliverHooks() { // Update hook task status. for _, t := range tasks { if err := UpdateHookTask(t); err != nil { - log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err) + log.Error("UpdateHookTask [%d]: %v", t.ID, err) } } @@ -753,13 +753,13 @@ func DeliverHooks() { tasks = make([]*HookTask, 0, 5) if err := x.Where("repo_id = ?", repoID).And("is_delivered = ?", false).Find(&tasks); err != nil { - log.Error(4, "Get repository [%s] hook tasks: %v", repoID, err) + log.Error("Get repository [%s] hook tasks: %v", repoID, err) continue } for _, t := range tasks { t.deliver() if err := UpdateHookTask(t); err != nil { - log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err) + log.Error("UpdateHookTask [%d]: %v", t.ID, err) continue } } diff --git a/internal/mailer/mail.go b/internal/mailer/mail.go index 1cb01a57..f4bf9414 100644 --- a/internal/mailer/mail.go +++ b/internal/mailer/mail.go @@ -11,9 +11,9 @@ import ( "sync" "time" - log "gopkg.in/clog.v1" "gopkg.in/gomail.v2" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/assets/templates" "gogs.io/gogs/internal/markup" @@ -111,7 +111,7 @@ func SendUserMail(c *macaron.Context, u User, tpl, code, subject, info string) { } body, err := render(tpl, data) if err != nil { - log.Error(2, "render: %v", err) + log.Error("render: %v", err) return } @@ -139,7 +139,7 @@ func SendActivateEmailMail(c *macaron.Context, u User, email string) { } body, err := render(MAIL_AUTH_ACTIVATE_EMAIL, data) if err != nil { - log.Error(3, "HTMLString: %v", err) + log.Error("HTMLString: %v", err) return } @@ -156,7 +156,7 @@ func SendRegisterNotifyMail(c *macaron.Context, u User) { } body, err := render(MAIL_AUTH_REGISTER_NOTIFY, data) if err != nil { - log.Error(3, "HTMLString: %v", err) + log.Error("HTMLString: %v", err) return } @@ -177,7 +177,7 @@ func SendCollaboratorMail(u, doer User, repo Repository) { } body, err := render(MAIL_NOTIFY_COLLABORATOR, data) if err != nil { - log.Error(3, "HTMLString: %v", err) + log.Error("HTMLString: %v", err) return } @@ -202,7 +202,7 @@ func composeIssueMessage(issue Issue, repo Repository, doer User, tplName string data["Doer"] = doer content, err := render(tplName, data) if err != nil { - log.Error(3, "HTMLString (%s): %v", tplName, err) + log.Error("HTMLString (%s): %v", tplName, err) } from := gomail.NewMessage().FormatAddress(setting.MailService.FromEmail, doer.DisplayName()) msg := NewMessageFrom(tos, from, subject, content) diff --git a/internal/mailer/mailer.go b/internal/mailer/mailer.go index 88315138..40b2b5a8 100644 --- a/internal/mailer/mailer.go +++ b/internal/mailer/mailer.go @@ -15,8 +15,8 @@ import ( "time" "github.com/jaytaylor/html2text" - log "gopkg.in/clog.v1" "gopkg.in/gomail.v2" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/setting" ) @@ -43,7 +43,7 @@ func NewMessageFrom(to []string, from, subject, htmlBody string) *Message { if setting.MailService.UsePlainText || setting.MailService.AddPlainTextAlt { plainBody, err := html2text.FromString(htmlBody) if err != nil { - log.Error(2, "html2text.FromString: %v", err) + log.Error("html2text.FromString: %v", err) } else { contentType = "text/plain" body = plainBody @@ -209,7 +209,7 @@ func processMailQueue() { case msg := <-mailQueue: log.Trace("New e-mail sending request %s: %s", msg.GetHeader("To"), msg.Info) if err := gomail.Send(sender, msg.Message); err != nil { - log.Error(3, "Fail to send emails %s: %s - %v", msg.GetHeader("To"), msg.Info, err) + log.Error("Failed to send emails %s: %s - %v", msg.GetHeader("To"), msg.Info, err) } else { log.Trace("E-mails sent %s: %s", msg.GetHeader("To"), msg.Info) } diff --git a/internal/process/manager.go b/internal/process/manager.go index babfceed..274e63df 100644 --- a/internal/process/manager.go +++ b/internal/process/manager.go @@ -12,11 +12,11 @@ import ( "sync" "time" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" ) var ( - ErrExecTimeout = errors.New("Process execution timeout") + ErrExecTimeout = errors.New("process execution timeout") ) const DEFAULT_TIMEOUT = 60 * time.Second @@ -101,7 +101,7 @@ func ExecDir(timeout time.Duration, dir, desc, cmdName string, args ...string) ( select { case <-time.After(timeout): if errKill := Kill(pid); errKill != nil { - log.Error(2, "Fail to kill timeout process [pid: %d, desc: %s]: %v", pid, desc, errKill) + log.Error("Failed to kill timeout process [pid: %d, desc: %s]: %v", pid, desc, errKill) } <-done return "", ErrExecTimeout.Error(), ErrExecTimeout diff --git a/internal/route/admin/auths.go b/internal/route/admin/auths.go index 67221542..378c4eee 100644 --- a/internal/route/admin/auths.go +++ b/internal/route/admin/auths.go @@ -10,7 +10,7 @@ import ( "strings" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "xorm.io/core" "gogs.io/gogs/internal/auth/ldap" diff --git a/internal/route/admin/notice.go b/internal/route/admin/notice.go index 9a2514ca..6c591fb0 100644 --- a/internal/route/admin/notice.go +++ b/internal/route/admin/notice.go @@ -7,7 +7,7 @@ package admin import ( "github.com/unknwon/com" "github.com/unknwon/paginater" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" diff --git a/internal/route/admin/repos.go b/internal/route/admin/repos.go index c5f3469d..97f4692b 100644 --- a/internal/route/admin/repos.go +++ b/internal/route/admin/repos.go @@ -6,7 +6,7 @@ package admin import ( "github.com/unknwon/paginater" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" diff --git a/internal/route/admin/users.go b/internal/route/admin/users.go index ff241463..4df40e7e 100644 --- a/internal/route/admin/users.go +++ b/internal/route/admin/users.go @@ -8,7 +8,7 @@ import ( "strings" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" diff --git a/internal/route/api/v1/admin/user.go b/internal/route/api/v1/admin/user.go index 5e291df2..d159e6d7 100644 --- a/internal/route/api/v1/admin/user.go +++ b/internal/route/api/v1/admin/user.go @@ -5,10 +5,9 @@ package admin import ( - user2 "gogs.io/gogs/internal/route/api/v1/user" "net/http" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" api "github.com/gogs/go-gogs-client" @@ -16,6 +15,7 @@ import ( "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/db/errors" "gogs.io/gogs/internal/mailer" + "gogs.io/gogs/internal/route/api/v1/user" "gogs.io/gogs/internal/setting" ) @@ -76,7 +76,7 @@ func CreateUser(c *context.APIContext, form api.CreateUserOption) { } func EditUser(c *context.APIContext, form api.EditUserOption) { - u := user2.GetUserByParams(c) + u := user.GetUserByParams(c) if c.Written() { return } @@ -131,7 +131,7 @@ func EditUser(c *context.APIContext, form api.EditUserOption) { } func DeleteUser(c *context.APIContext) { - u := user2.GetUserByParams(c) + u := user.GetUserByParams(c) if c.Written() { return } @@ -151,9 +151,9 @@ func DeleteUser(c *context.APIContext) { } func CreatePublicKey(c *context.APIContext, form api.CreateKeyOption) { - u := user2.GetUserByParams(c) + u := user.GetUserByParams(c) if c.Written() { return } - user2.CreateUserPublicKey(c, form, u.ID) + user.CreateUserPublicKey(c, form, u.ID) } diff --git a/internal/route/api/v1/repo/repo.go b/internal/route/api/v1/repo/repo.go index 096096fb..6950ce9b 100644 --- a/internal/route/api/v1/repo/repo.go +++ b/internal/route/api/v1/repo/repo.go @@ -6,11 +6,10 @@ package repo import ( "fmt" - convert2 "gogs.io/gogs/internal/route/api/v1/convert" "net/http" "path" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" api "github.com/gogs/go-gogs-client" @@ -18,6 +17,7 @@ import ( "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/db/errors" "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/route/api/v1/convert" "gogs.io/gogs/internal/setting" ) @@ -25,7 +25,7 @@ func Search(c *context.APIContext) { opts := &db.SearchRepoOptions{ Keyword: path.Base(c.Query("q")), OwnerID: c.QueryInt64("uid"), - PageSize: convert2.ToCorrectPageSize(c.QueryInt("limit")), + PageSize: convert.ToCorrectPageSize(c.QueryInt("limit")), Page: c.QueryInt("page"), } @@ -173,7 +173,7 @@ func CreateUserRepo(c *context.APIContext, owner *db.User, opt api.CreateRepoOpt } else { if repo != nil { if err = db.DeleteRepository(c.User.ID, repo.ID); err != nil { - log.Error(2, "DeleteRepository: %v", err) + log.Error("DeleteRepository: %v", err) } } c.ServerError("CreateRepository", err) @@ -270,7 +270,7 @@ func Migrate(c *context.APIContext, f form.MigrateRepo) { if err != nil { if repo != nil { if errDelete := db.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil { - log.Error(2, "DeleteRepository: %v", errDelete) + log.Error("DeleteRepository: %v", errDelete) } } diff --git a/internal/route/install.go b/internal/route/install.go index 4f66a227..bd51711e 100644 --- a/internal/route/install.go +++ b/internal/route/install.go @@ -12,9 +12,9 @@ import ( "strings" "github.com/unknwon/com" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "xorm.io/xorm" "github.com/gogs/git-module" @@ -46,24 +46,25 @@ func checkRunMode() { log.Info("Run mode: %s", strings.Title(macaron.Env)) } -func NewServices() { - setting.NewServices() - mailer.NewContext() -} - // GlobalInit is for global configuration reload-able. func GlobalInit() { - setting.NewContext() + setting.Init() + setting.InitLogging() + log.Info("%s %s", setting.AppName, setting.AppVersion) log.Trace("Custom path: %s", setting.CustomPath) log.Trace("Log path: %s", setting.LogRootPath) + log.Trace("Build time: %s", setting.BuildTime) + log.Trace("Build commit: %s", setting.BuildCommit) + db.LoadConfigs() - NewServices() + setting.NewServices() + mailer.NewContext() if setting.InstallLock { highlight.NewContext() markup.NewSanitizer() if err := db.NewEngine(); err != nil { - log.Fatal(2, "Fail to initialize ORM engine: %v", err) + log.Fatal("Failed to initialize ORM engine: %v", err) } db.HasEngine = true @@ -302,7 +303,7 @@ func InstallPost(c *context.Context, f form.Install) { if com.IsFile(setting.CustomConf) { // Keeps custom settings if there is already something. if err := cfg.Append(setting.CustomConf); err != nil { - log.Error(2, "Fail to load custom conf '%s': %v", setting.CustomConf, err) + log.Error("Failed to load custom conf '%s': %v", setting.CustomConf, err) } } cfg.Section("database").Key("DB_TYPE").SetValue(db.DbCfg.Type) diff --git a/internal/route/org/members.go b/internal/route/org/members.go index fa156b19..fc36bde1 100644 --- a/internal/route/org/members.go +++ b/internal/route/org/members.go @@ -6,7 +6,7 @@ package org import ( "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -76,7 +76,7 @@ func MembersAction(c *context.Context) { } if err != nil { - log.Error(4, "Action(%s): %v", c.Params(":action"), err) + log.Error("Action(%s): %v", c.Params(":action"), err) c.JSON(200, map[string]interface{}{ "ok": false, "err": err.Error(), diff --git a/internal/route/org/org.go b/internal/route/org/org.go index f3f70ac8..13ec7a51 100644 --- a/internal/route/org/org.go +++ b/internal/route/org/org.go @@ -5,7 +5,7 @@ package org import ( - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" diff --git a/internal/route/org/setting.go b/internal/route/org/setting.go index ab1dd7ff..366a0f6b 100644 --- a/internal/route/org/setting.go +++ b/internal/route/org/setting.go @@ -5,15 +5,15 @@ package org import ( - user2 "gogs.io/gogs/internal/route/user" "strings" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/db/errors" "gogs.io/gogs/internal/form" + "gogs.io/gogs/internal/route/user" "gogs.io/gogs/internal/setting" ) @@ -89,7 +89,7 @@ func SettingsPost(c *context.Context, f form.UpdateOrgSetting) { func SettingsAvatar(c *context.Context, f form.Avatar) { f.Source = form.AVATAR_LOCAL - if err := user2.UpdateAvatarSetting(c, f, c.Org.Organization); err != nil { + if err := user.UpdateAvatarSetting(c, f, c.Org.Organization); err != nil { c.Flash.Error(err.Error()) } else { c.Flash.Success(c.Tr("org.settings.update_avatar_success")) diff --git a/internal/route/org/teams.go b/internal/route/org/teams.go index 779ecb4c..a4072e97 100644 --- a/internal/route/org/teams.go +++ b/internal/route/org/teams.go @@ -8,7 +8,7 @@ import ( "path" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -90,7 +90,7 @@ func TeamsAction(c *context.Context) { if db.IsErrLastOrgOwner(err) { c.Flash.Error(c.Tr("form.last_org_owner")) } else { - log.Error(3, "Action(%s): %v", c.Params(":action"), err) + log.Error("Action(%s): %v", c.Params(":action"), err) c.JSON(200, map[string]interface{}{ "ok": false, "err": err.Error(), @@ -134,7 +134,7 @@ func TeamsRepoAction(c *context.Context) { } if err != nil { - log.Error(3, "Action(%s): '%s' %v", c.Params(":action"), c.Org.Team.Name, err) + log.Error("Action(%s): '%s' %v", c.Params(":action"), c.Org.Team.Name, err) c.Handle(500, "TeamsRepoAction", err) return } diff --git a/internal/route/repo/branch.go b/internal/route/repo/branch.go index a51c4246..c8d49bbb 100644 --- a/internal/route/repo/branch.go +++ b/internal/route/repo/branch.go @@ -7,7 +7,7 @@ package repo import ( "time" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/git-module" api "github.com/gogs/go-gogs-client" @@ -125,7 +125,7 @@ func DeleteBranchPost(c *context.Context) { if len(commitID) > 0 { branchCommitID, err := c.Repo.GitRepo.GetBranchCommitID(branchName) if err != nil { - log.Error(2, "Failed to get commit ID of branch %q: %v", branchName, err) + log.Error("Failed to get commit ID of branch %q: %v", branchName, err) return } @@ -138,7 +138,7 @@ func DeleteBranchPost(c *context.Context) { if err := c.Repo.GitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{ Force: true, }); err != nil { - log.Error(2, "Failed to delete branch %q: %v", branchName, err) + log.Error("Failed to delete branch %q: %v", branchName, err) return } @@ -149,7 +149,7 @@ func DeleteBranchPost(c *context.Context) { Repo: c.Repo.Repository.APIFormat(nil), Sender: c.User.APIFormat(), }); err != nil { - log.Error(2, "Failed to prepare webhooks for %q: %v", db.HOOK_EVENT_DELETE, err) + log.Error("Failed to prepare webhooks for %q: %v", db.HOOK_EVENT_DELETE, err) return } } diff --git a/internal/route/repo/editor.go b/internal/route/repo/editor.go index 54f6c20b..75254a2e 100644 --- a/internal/route/repo/editor.go +++ b/internal/route/repo/editor.go @@ -11,7 +11,7 @@ import ( "path" "strings" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/git-module" "gogs.io/gogs/internal/context" @@ -91,7 +91,7 @@ func editFile(c *context.Context, isNewFile bool) { buf = append(buf, d...) if err, content := template.ToUTF8WithErr(buf); err != nil { if err != nil { - log.Error(2, "Failed to convert encoding to UTF-8: %v", err) + log.Error("Failed to convert encoding to UTF-8: %v", err) } c.Data["FileContent"] = string(buf) } else { @@ -278,7 +278,7 @@ func editFilePost(c *context.Context, f form.EditRepoFile, isNewFile bool) { Content: strings.Replace(f.Content, "\r", "", -1), IsNewFile: isNewFile, }); err != nil { - log.Error(2, "Failed to update repo file: %v", err) + log.Error("Failed to update repo file: %v", err) c.FormErr("TreePath") c.RenderWithErr(c.Tr("repo.editor.fail_to_update_file", f.TreePath, errors.InternalServerError), EDIT_FILE, &f) return @@ -385,7 +385,7 @@ func DeleteFilePost(c *context.Context, f form.DeleteRepoFile) { TreePath: c.Repo.TreePath, Message: message, }); err != nil { - log.Error(2, "Failed to delete repo file: %v", err) + log.Error("Failed to delete repo file: %v", err) c.RenderWithErr(c.Tr("repo.editor.fail_to_delete_file", c.Repo.TreePath, errors.InternalServerError), DELETE_FILE, &f) return } @@ -505,7 +505,7 @@ func UploadFilePost(c *context.Context, f form.UploadRepoFile) { Message: message, Files: f.Files, }); err != nil { - log.Error(2, "Failed to upload files: %v", err) + log.Error("Failed to upload files: %v", err) c.FormErr("TreePath") c.RenderWithErr(c.Tr("repo.editor.unable_to_upload_files", f.TreePath, errors.InternalServerError), UPLOAD_FILE, &f) return diff --git a/internal/route/repo/http.go b/internal/route/repo/http.go index 10438636..be80d379 100644 --- a/internal/route/repo/http.go +++ b/internal/route/repo/http.go @@ -16,8 +16,8 @@ import ( "strings" "time" - log "gopkg.in/clog.v1" "gopkg.in/macaron.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -235,7 +235,7 @@ func serviceRPC(h serviceHandler, service string) { if h.r.Header.Get("Content-Encoding") == "gzip" { reqBody, err = gzip.NewReader(reqBody) if err != nil { - log.Error(2, "HTTP.Get: fail to create gzip reader: %v", err) + log.Error("HTTP.Get: fail to create gzip reader: %v", err) h.w.WriteHeader(http.StatusInternalServerError) return } @@ -258,7 +258,7 @@ func serviceRPC(h serviceHandler, service string) { cmd.Stderr = &stderr cmd.Stdin = reqBody if err = cmd.Run(); err != nil { - log.Error(2, "HTTP.serviceRPC: fail to serve RPC '%s': %v - %s", service, err, stderr.String()) + log.Error("HTTP.serviceRPC: fail to serve RPC '%s': %v - %s", service, err, stderr.String()) h.w.WriteHeader(http.StatusInternalServerError) return } @@ -286,7 +286,7 @@ func gitCommand(dir string, args ...string) []byte { cmd.Dir = dir out, err := cmd.Output() if err != nil { - log.Error(2, fmt.Sprintf("Git: %v - %s", err, out)) + log.Error(fmt.Sprintf("Git: %v - %s", err, out)) } return out } diff --git a/internal/route/repo/issue.go b/internal/route/repo/issue.go index 6b7ef1fb..76c63363 100644 --- a/internal/route/repo/issue.go +++ b/internal/route/repo/issue.go @@ -15,7 +15,7 @@ import ( "github.com/unknwon/com" "github.com/unknwon/paginater" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -891,7 +891,7 @@ func NewComment(c *context.Context, f form.CreateComment) { c.Flash.Info(c.Tr("repo.pulls.open_unmerged_pull_exists", pr.Index)) } else { if err = issue.ChangeStatus(c.User, c.Repo.Repository, f.Status == "close"); err != nil { - log.Error(2, "ChangeStatus: %v", err) + log.Error("ChangeStatus: %v", err) } else { log.Trace("Issue [%d] status changed to closed: %v", issue.ID, issue.IsClosed) } diff --git a/internal/route/repo/pull.go b/internal/route/repo/pull.go index 38c04c7c..d2cb52cb 100644 --- a/internal/route/repo/pull.go +++ b/internal/route/repo/pull.go @@ -10,7 +10,7 @@ import ( "strings" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/git-module" @@ -28,7 +28,7 @@ const ( PULL_COMMITS = "repo/pulls/commits" PULL_FILES = "repo/pulls/files" - PULL_REQUEST_TEMPLATE_KEY = "PullRequestTemplate" + PULL_REQUEST_TEMPLATE_KEY = "PullRequestTemplate" PULL_REQUEST_TITLE_TEMPLATE_KEY = "PullRequestTitleTemplate" ) @@ -648,7 +648,7 @@ func CompareAndPullRequest(c *context.Context) { if c.Data[PULL_REQUEST_TITLE_TEMPLATE_KEY] != nil { customTitle := c.Data[PULL_REQUEST_TITLE_TEMPLATE_KEY].(string) - r := strings.NewReplacer("{{headBranch}}", headBranch,"{{baseBranch}}", baseBranch) + r := strings.NewReplacer("{{headBranch}}", headBranch, "{{baseBranch}}", baseBranch) c.Data["title"] = r.Replace(customTitle) } diff --git a/internal/route/repo/release.go b/internal/route/repo/release.go index 0ec048e2..d7c5aec3 100644 --- a/internal/route/repo/release.go +++ b/internal/route/repo/release.go @@ -8,7 +8,7 @@ import ( "fmt" "strings" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" diff --git a/internal/route/repo/repo.go b/internal/route/repo/repo.go index c6582815..7d906242 100644 --- a/internal/route/repo/repo.go +++ b/internal/route/repo/repo.go @@ -11,7 +11,7 @@ import ( "strings" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/git-module" @@ -139,7 +139,7 @@ func CreatePost(c *context.Context, f form.CreateRepo) { if repo != nil { if errDelete := db.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil { - log.Error(4, "DeleteRepository: %v", errDelete) + log.Error("DeleteRepository: %v", errDelete) } } @@ -211,7 +211,7 @@ func MigratePost(c *context.Context, f form.MigrateRepo) { if repo != nil { if errDelete := db.DeleteRepository(ctxUser.ID, repo.ID); errDelete != nil { - log.Error(4, "DeleteRepository: %v", errDelete) + log.Error("DeleteRepository: %v", errDelete) } } diff --git a/internal/route/repo/setting.go b/internal/route/repo/setting.go index e0305702..f3f2432b 100644 --- a/internal/route/repo/setting.go +++ b/internal/route/repo/setting.go @@ -12,7 +12,7 @@ import ( "github.com/gogs/git-module" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -100,7 +100,7 @@ func SettingsPost(c *context.Context, f form.RepoSetting) { if isNameChanged { if err := db.RenameRepoAction(c.User, oldRepoName, repo); err != nil { - log.Error(2, "RenameRepoAction: %v", err) + log.Error("RenameRepoAction: %v", err) } } @@ -410,7 +410,7 @@ func ChangeCollaborationAccessMode(c *context.Context) { if err := c.Repo.Repository.ChangeCollaborationAccessMode( c.QueryInt64("uid"), db.AccessMode(c.QueryInt("mode"))); err != nil { - log.Error(2, "ChangeCollaborationAccessMode: %v", err) + log.Error("ChangeCollaborationAccessMode: %v", err) return } diff --git a/internal/route/repo/view.go b/internal/route/repo/view.go index 8b7defed..b03a2cc3 100644 --- a/internal/route/repo/view.go +++ b/internal/route/repo/view.go @@ -13,7 +13,7 @@ import ( "strings" "github.com/unknwon/paginater" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/git-module" @@ -176,7 +176,7 @@ func renderFile(c *context.Context, entry *git.TreeEntry, treeLink, rawLink stri var fileContent string if err, content := template.ToUTF8WithErr(buf); err != nil { if err != nil { - log.Error(4, "ToUTF8WithErr: %s", err) + log.Error("ToUTF8WithErr: %s", err) } fileContent = string(buf) } else { @@ -186,7 +186,7 @@ func renderFile(c *context.Context, entry *git.TreeEntry, treeLink, rawLink stri var output bytes.Buffer lines := strings.Split(fileContent, "\n") // Remove blank line at the end of file - if len(lines) > 0 && len(lines[len(lines)-1])==0 { + if len(lines) > 0 && len(lines[len(lines)-1]) == 0 { lines = lines[:len(lines)-1] } for index, line := range lines { diff --git a/internal/route/user/auth.go b/internal/route/user/auth.go index 3613297b..d2fcee83 100644 --- a/internal/route/user/auth.go +++ b/internal/route/user/auth.go @@ -9,7 +9,7 @@ import ( "net/url" "github.com/go-macaron/captcha" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -239,7 +239,7 @@ func LoginTwoFactorPost(c *context.Context) { return } if err = c.Cache.Put(u.TwoFactorCacheKey(passcode), 1, 60); err != nil { - log.Error(2, "Failed to put cache 'two factor passcode': %v", err) + log.Error("Failed to put cache 'two factor passcode': %v", err) } afterLogin(c, u, c.Session.Get("twoFactorRemember").(bool)) @@ -376,7 +376,7 @@ func SignUpPost(c *context.Context, cpt *captcha.Captcha, f form.Register) { c.Success(ACTIVATE) if err := c.Cache.Put(u.MailResendCacheKey(), 1, 180); err != nil { - log.Error(2, "Failed to put cache key 'mail resend': %v", err) + log.Error("Failed to put cache key 'mail resend': %v", err) } return } @@ -401,7 +401,7 @@ func Activate(c *context.Context) { mailer.SendActivateAccountMail(c.Context, db.NewMailerUser(c.User)) if err := c.Cache.Put(c.User.MailResendCacheKey(), 1, 180); err != nil { - log.Error(2, "Failed to put cache key 'mail resend': %v", err) + log.Error("Failed to put cache key 'mail resend': %v", err) } } } else { @@ -506,7 +506,7 @@ func ForgotPasswdPost(c *context.Context) { mailer.SendResetPasswordMail(c.Context, db.NewMailerUser(u)) if err = c.Cache.Put(u.MailResendCacheKey(), 1, 180); err != nil { - log.Error(2, "Failed to put cache key 'mail resend': %v", err) + log.Error("Failed to put cache key 'mail resend': %v", err) } c.Data["Hours"] = setting.Service.ActiveCodeLives / 60 diff --git a/internal/route/user/setting.go b/internal/route/user/setting.go index 7c1c4696..ef0bf5cc 100644 --- a/internal/route/user/setting.go +++ b/internal/route/user/setting.go @@ -16,7 +16,7 @@ import ( "github.com/pquerna/otp" "github.com/pquerna/otp/totp" "github.com/unknwon/com" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/context" "gogs.io/gogs/internal/db" @@ -144,7 +144,7 @@ func UpdateAvatarSetting(c *context.Context, f form.Avatar, ctxUser *db.User) er // generate a random one when needed. if ctxUser.UseCustomAvatar && !com.IsFile(ctxUser.CustomAvatarPath()) { if err := ctxUser.GenerateRandomAvatar(); err != nil { - log.Error(2, "generate random avatar [%d]: %v", ctxUser.ID, err) + log.Error("generate random avatar [%d]: %v", ctxUser.ID, err) } } } @@ -278,7 +278,7 @@ func SettingsEmailPost(c *context.Context, f form.AddEmail) { mailer.SendActivateEmailMail(c.Context, db.NewMailerUser(c.User), email.Email) if err := c.Cache.Put("MailResendLimit_"+c.User.LowerName, c.User.LowerName, 180); err != nil { - log.Error(2, "Set cache 'MailResendLimit' failed: %v", err) + log.Error("Set cache 'MailResendLimit' failed: %v", err) } c.Flash.Info(c.Tr("settings.add_email_confirmation_sent", email.Email, setting.Service.ActiveCodeLives/60)) } else { diff --git a/internal/setting/setting.go b/internal/setting/setting.go index 0306b1ea..fd8d14c0 100644 --- a/internal/setting/setting.go +++ b/internal/setting/setting.go @@ -22,8 +22,8 @@ import ( _ "github.com/go-macaron/session/redis" "github.com/mcuadros/go-version" "github.com/unknwon/com" - log "gopkg.in/clog.v1" "gopkg.in/ini.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/go-libravatar" @@ -346,15 +346,19 @@ func execPath() (string, error) { func init() { IsWindows = runtime.GOOS == "windows" - log.New(log.CONSOLE, log.ConsoleConfig{}) - var err error - if AppPath, err = execPath(); err != nil { - log.Fatal(2, "Fail to get app path: %v\n", err) + err := log.NewConsole() + if err != nil { + panic("init console logger: " + err.Error()) + } + + AppPath, err = execPath() + if err != nil { + log.Fatal("Failed to get executable path: %v", err) } - // Note: we don't use path.Dir here because it does not handle case - // which path starts with two "/" in Windows: "//psf/Home/..." + // NOTE: we don't use path.Dir here because it does not handle case + // which path starts with two "/" in Windows: "//psf/Home/..." AppPath = strings.Replace(AppPath, "\\", "/", -1) } @@ -374,7 +378,7 @@ func WorkDir() (string, error) { func forcePathSeparator(path string) { if strings.Contains(path, "\\") { - log.Fatal(2, "Do not use '\\' or '\\\\' in paths, instead, please use '/' in all places") + log.Fatal("Do not use '\\' or '\\\\' in paths, please use '/' in all places") } } @@ -394,31 +398,33 @@ func IsRunUserMatchCurrentUser(runUser string) (string, bool) { // getOpenSSHVersion parses and returns string representation of OpenSSH version // returned by command "ssh -V". func getOpenSSHVersion() string { - // Note: somehow version is printed to stderr - _, stderr, err := process.Exec("getOpenSSHVersion", "ssh", "-V") + // NOTE: Somehow the version is printed to stderr. + _, stderr, err := process.Exec("setting.getOpenSSHVersion", "ssh", "-V") if err != nil { - log.Fatal(2, "Fail to get OpenSSH version: %v - %s", err, stderr) + log.Fatal("Failed to get OpenSSH version: %v - %s", err, stderr) } - // Trim unused information: https://gogs.io/gogs/issues/4507#issuecomment-305150441 + // Trim unused information: https://github.com/gogs/gogs/issues/4507#issuecomment-305150441 version := strings.TrimRight(strings.Fields(stderr)[0], ",1234567890") version = strings.TrimSuffix(strings.TrimPrefix(version, "OpenSSH_"), "p") return version } -// NewContext initializes configuration context. -// NOTE: do not print any log except error. -func NewContext() { +// Init initializes configuration by loading from sources. +// ⚠️ WARNING: Do not print anything in this function other than wanrings or errors. +func Init() { workDir, err := WorkDir() if err != nil { - log.Fatal(2, "Fail to get work directory: %v", err) + log.Fatal("Failed to get work directory: %v", err) + return } Cfg, err = ini.LoadSources(ini.LoadOptions{ IgnoreInlineComment: true, }, conf.MustAsset("conf/app.ini")) if err != nil { - log.Fatal(2, "Fail to parse 'conf/app.ini': %v", err) + log.Fatal("Failed to parse 'conf/app.ini': %v", err) + return } CustomPath = os.Getenv("GOGS_CUSTOM") @@ -432,16 +438,18 @@ func NewContext() { if com.IsFile(CustomConf) { if err = Cfg.Append(CustomConf); err != nil { - log.Fatal(2, "Fail to load custom conf '%s': %v", CustomConf, err) + log.Fatal("Failed to load custom conf %q: %v", CustomConf, err) + return } } else { - log.Warn("Custom config '%s' not found, ignore this if you're running first time", CustomConf) + log.Warn("Custom config '%s' not found, ignore this warning if you're running the first time", CustomConf) } - Cfg.NameMapper = ini.AllCapsUnderscore + Cfg.NameMapper = ini.SnackCase homeDir, err := com.HomeDir() if err != nil { - log.Fatal(2, "Fail to get home directory: %v", err) + log.Fatal("Failed to get home directory: %v", err) + return } homeDir = strings.Replace(homeDir, "\\", "/", -1) @@ -458,7 +466,8 @@ func NewContext() { // Check if has app suburl. url, err := url.Parse(AppURL) if err != nil { - log.Fatal(2, "Invalid ROOT_URL '%s': %s", AppURL, err) + log.Fatal("Failed to parse ROOT_URL %q: %s", AppURL, err) + return } // Suburl should start with '/' and end without '/', such as '/{subpath}'. // This value is empty if site does not have sub-url. @@ -479,7 +488,8 @@ func NewContext() { UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666") UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32) if err != nil || UnixSocketPermissionParsed > 0777 { - log.Fatal(2, "Fail to parse unixSocketPermission: %s", UnixSocketPermissionRaw) + log.Fatal("Failed to parse unixSocketPermission %q: %v", UnixSocketPermissionRaw, err) + return } UnixSocketPermission = uint32(UnixSocketPermissionParsed) } @@ -506,7 +516,8 @@ func NewContext() { SSH.ServerCiphers = sec.Key("SSH_SERVER_CIPHERS").Strings(",") SSH.KeyTestPath = os.TempDir() if err = Cfg.Section("server").MapTo(&SSH); err != nil { - log.Fatal(2, "Fail to map SSH settings: %v", err) + log.Fatal("Failed to map SSH settings: %v", err) + return } if SSH.Disabled { SSH.StartBuiltinServer = false @@ -515,9 +526,11 @@ func NewContext() { if !SSH.Disabled && !SSH.StartBuiltinServer { if err := os.MkdirAll(SSH.RootPath, 0700); err != nil { - log.Fatal(2, "Fail to create '%s': %v", SSH.RootPath, err) + log.Fatal("Failed to create '%s': %v", SSH.RootPath, err) + return } else if err = os.MkdirAll(SSH.KeyTestPath, 0644); err != nil { - log.Fatal(2, "Fail to create '%s': %v", SSH.KeyTestPath, err) + log.Fatal("Failed to create '%s': %v", SSH.KeyTestPath, err) + return } } @@ -589,7 +602,8 @@ func NewContext() { if InstallLock { currentUser, match := IsRunUserMatchCurrentUser(RunUser) if !match { - log.Fatal(2, "Expect user '%s' but current user is: %s", RunUser, currentUser) + log.Fatal("The user configured to run Gogs is %q, but the current user is %q", RunUser, currentUser) + return } } @@ -606,11 +620,14 @@ func NewContext() { } ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash") if err = Cfg.Section("repository").MapTo(&Repository); err != nil { - log.Fatal(2, "Fail to map Repository settings: %v", err) + log.Fatal("Failed to map Repository settings: %v", err) + return } else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil { - log.Fatal(2, "Fail to map Repository.Editor settings: %v", err) + log.Fatal("Failed to map Repository.Editor settings: %v", err) + return } else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil { - log.Fatal(2, "Fail to map Repository.Upload settings: %v", err) + log.Fatal("Failed to map Repository.Upload settings: %v", err) + return } if !filepath.IsAbs(Repository.Upload.TempPath) { @@ -663,29 +680,41 @@ func NewContext() { } if err = Cfg.Section("http").MapTo(&HTTP); err != nil { - log.Fatal(2, "Failed to map HTTP settings: %v", err) + log.Fatal("Failed to map HTTP settings: %v", err) + return } else if err = Cfg.Section("webhook").MapTo(&Webhook); err != nil { - log.Fatal(2, "Failed to map Webhook settings: %v", err) + log.Fatal("Failed to map Webhook settings: %v", err) + return } else if err = Cfg.Section("release.attachment").MapTo(&Release.Attachment); err != nil { - log.Fatal(2, "Failed to map Release.Attachment settings: %v", err) + log.Fatal("Failed to map Release.Attachment settings: %v", err) + return } else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil { - log.Fatal(2, "Failed to map Markdown settings: %v", err) + log.Fatal("Failed to map Markdown settings: %v", err) + return } else if err = Cfg.Section("smartypants").MapTo(&Smartypants); err != nil { - log.Fatal(2, "Failed to map Smartypants settings: %v", err) + log.Fatal("Failed to map Smartypants settings: %v", err) + return } else if err = Cfg.Section("admin").MapTo(&Admin); err != nil { - log.Fatal(2, "Failed to map Admin settings: %v", err) + log.Fatal("Failed to map Admin settings: %v", err) + return } else if err = Cfg.Section("cron").MapTo(&Cron); err != nil { - log.Fatal(2, "Failed to map Cron settings: %v", err) + log.Fatal("Failed to map Cron settings: %v", err) + return } else if err = Cfg.Section("git").MapTo(&Git); err != nil { - log.Fatal(2, "Failed to map Git settings: %v", err) + log.Fatal("Failed to map Git settings: %v", err) + return } else if err = Cfg.Section("mirror").MapTo(&Mirror); err != nil { - log.Fatal(2, "Failed to map Mirror settings: %v", err) + log.Fatal("Failed to map Mirror settings: %v", err) + return } else if err = Cfg.Section("api").MapTo(&API); err != nil { - log.Fatal(2, "Failed to map API settings: %v", err) + log.Fatal("Failed to map API settings: %v", err) + return } else if err = Cfg.Section("ui").MapTo(&UI); err != nil { - log.Fatal(2, "Failed to map UI settings: %v", err) + log.Fatal("Failed to map UI settings: %v", err) + return } else if err = Cfg.Section("prometheus").MapTo(&Prometheus); err != nil { - log.Fatal(2, "Failed to map Prometheus settings: %v", err) + log.Fatal("Failed to map Prometheus settings: %v", err) + return } if Mirror.DefaultInterval <= 0 { @@ -702,123 +731,139 @@ func NewContext() { HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) } -var Service struct { - ActiveCodeLives int - ResetPwdCodeLives int - RegisterEmailConfirm bool - DisableRegistration bool - ShowRegistrationButton bool - RequireSignInView bool - EnableNotifyMail bool - EnableReverseProxyAuth bool - EnableReverseProxyAutoRegister bool - EnableCaptcha bool -} - -func newService() { - sec := Cfg.Section("service") - Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) - Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180) - Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool() - Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!Service.DisableRegistration) - Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() - Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() - Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() - Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool() -} - -func newLogService() { - if len(BuildTime) > 0 { - log.Trace("Build time: %s", BuildTime) - log.Trace("Build commit: %s", BuildCommit) - } - - // Because we always create a console logger as primary logger before all settings are loaded, - // thus if user doesn't set console logger, we should remove it after other loggers are created. +// InitLogging initializes the logging infrastructure of the application. +func InitLogging() { + // Because we always create a console logger as the primary logger at init time, + // we need to remove it in case the user doesn't configure to use it after the + // logging infrastructure is initalized. hasConsole := false - // Get and check log modes. + // Iterate over [log.*] sections to initialize individual logger. LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") LogConfigs = make([]interface{}, len(LogModes)) - levelNames := map[string]log.LEVEL{ - "trace": log.TRACE, - "info": log.INFO, - "warn": log.WARN, - "error": log.ERROR, - "fatal": log.FATAL, + levelMappings := map[string]log.Level{ + "trace": log.LevelTrace, + "info": log.LevelInfo, + "warn": log.LevelWarn, + "error": log.LevelError, + "fatal": log.LevelFatal, + } + + type config struct { + Buffer int64 + Config interface{} } for i, mode := range LogModes { mode = strings.ToLower(strings.TrimSpace(mode)) - sec, err := Cfg.GetSection("log." + mode) + secName := "log." + mode + sec, err := Cfg.GetSection(secName) if err != nil { - log.Fatal(2, "Unknown logger mode: %s", mode) + log.Fatal("Missing configuration section [%s] for %q logger", secName, mode) + return } - validLevels := []string{"trace", "info", "warn", "error", "fatal"} - name := Cfg.Section("log." + mode).Key("LEVEL").Validate(func(v string) string { - v = strings.ToLower(v) - if com.IsSliceContainsStr(validLevels, v) { - return v - } - return "trace" - }) - level := levelNames[name] - - // Generate log configuration. - switch log.MODE(mode) { - case log.CONSOLE: + level := levelMappings[sec.Key("LEVEL").MustString("trace")] + buffer := sec.Key("BUFFER_LEN").MustInt64(100) + c := new(config) + switch mode { + case log.DefaultConsoleName: hasConsole = true - LogConfigs[i] = log.ConsoleConfig{ - Level: level, - BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100), + c = &config{ + Buffer: buffer, + Config: log.ConsoleConfig{ + Level: level, + }, } - - case log.FILE: - logPath := path.Join(LogRootPath, "gogs.log") - if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { - log.Fatal(2, "Fail to create log directory '%s': %v", path.Dir(logPath), err) + err = log.NewConsole(c.Buffer, c.Config) + + case log.DefaultFileName: + logPath := filepath.Join(LogRootPath, "gogs.log") + logDir := filepath.Dir(logPath) + err = os.MkdirAll(logDir, os.ModePerm) + if err != nil { + log.Fatal("Failed to create log directory %q: %v", logDir, err) + return } - LogConfigs[i] = log.FileConfig{ - Level: level, - BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100), - Filename: logPath, - FileRotationConfig: log.FileRotationConfig{ - Rotate: sec.Key("LOG_ROTATE").MustBool(true), - Daily: sec.Key("DAILY_ROTATE").MustBool(true), - MaxSize: 1 << uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), - MaxLines: sec.Key("MAX_LINES").MustInt64(1000000), - MaxDays: sec.Key("MAX_DAYS").MustInt64(7), + c = &config{ + Buffer: buffer, + Config: log.FileConfig{ + Level: level, + Filename: logPath, + FileRotationConfig: log.FileRotationConfig{ + Rotate: sec.Key("LOG_ROTATE").MustBool(true), + Daily: sec.Key("DAILY_ROTATE").MustBool(true), + MaxSize: 1 << uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), + MaxLines: sec.Key("MAX_LINES").MustInt64(1000000), + MaxDays: sec.Key("MAX_DAYS").MustInt64(7), + }, }, } - - case log.SLACK: - LogConfigs[i] = log.SlackConfig{ - Level: level, - BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100), - URL: sec.Key("URL").String(), + err = log.NewFile(c.Buffer, c.Config) + + case log.DefaultSlackName: + c = &config{ + Buffer: buffer, + Config: log.SlackConfig{ + Level: level, + URL: sec.Key("URL").String(), + }, } - - case log.DISCORD: - LogConfigs[i] = log.DiscordConfig{ - Level: level, - BufferSize: Cfg.Section("log").Key("BUFFER_LEN").MustInt64(100), - URL: sec.Key("URL").String(), - Username: sec.Key("USERNAME").String(), + err = log.NewSlack(c.Buffer, c.Config) + + case log.DefaultDiscordName: + c = &config{ + Buffer: buffer, + Config: log.DiscordConfig{ + Level: level, + URL: sec.Key("URL").String(), + Username: sec.Key("USERNAME").String(), + }, } + + default: + continue } - log.New(log.MODE(mode), LogConfigs[i]) - log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(name)) + if err != nil { + log.Fatal("Failed to init %s logger: %v", mode, err) + return + } + LogConfigs[i] = c + + log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String()))) } - // Make sure everyone gets version info printed. - log.Info("%s %s", AppName, AppVersion) if !hasConsole { - log.Delete(log.CONSOLE) + log.Remove(log.DefaultConsoleName) } } +var Service struct { + ActiveCodeLives int + ResetPwdCodeLives int + RegisterEmailConfirm bool + DisableRegistration bool + ShowRegistrationButton bool + RequireSignInView bool + EnableNotifyMail bool + EnableReverseProxyAuth bool + EnableReverseProxyAutoRegister bool + EnableCaptcha bool +} + +func newService() { + sec := Cfg.Section("service") + Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) + Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180) + Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool() + Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!Service.DisableRegistration) + Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() + Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() + Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() + Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool() +} + func newCacheService() { CacheAdapter = Cfg.Section("cache").Key("ADAPTER").In("memory", []string{"memory", "redis", "memcache"}) switch CacheAdapter { @@ -827,7 +872,8 @@ func newCacheService() { case "redis", "memcache": CacheConn = strings.Trim(Cfg.Section("cache").Key("HOST").String(), "\" ") default: - log.Fatal(2, "Unknown cache adapter: %s", CacheAdapter) + log.Fatal("Unrecognized cache adapter %q", CacheAdapter) + return } log.Trace("Cache service is enabled") @@ -896,7 +942,8 @@ func newMailService() { if len(MailService.From) > 0 { parsed, err := mail.ParseAddress(MailService.From) if err != nil { - log.Fatal(2, "Invalid mailer.FROM (%s): %v", MailService.From, err) + log.Fatal("Failed to parse value %q for '[mailer] FROM': %v", MailService.From, err) + return } MailService.FromEmail = parsed.Address } @@ -941,7 +988,6 @@ func NewService() { func NewServices() { newService() - newLogService() newCacheService() newSessionService() newMailService() diff --git a/internal/ssh/ssh.go b/internal/ssh/ssh.go index c7368383..d5fd0173 100644 --- a/internal/ssh/ssh.go +++ b/internal/ssh/ssh.go @@ -16,7 +16,7 @@ import ( "github.com/unknwon/com" "golang.org/x/crypto/ssh" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/setting" @@ -39,7 +39,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { ch, reqs, err := newChan.Accept() if err != nil { - log.Error(3, "Error accepting channel: %v", err) + log.Error("Error accepting channel: %v", err) continue } @@ -57,7 +57,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { args[0] = strings.TrimLeft(args[0], "\x04") _, _, err := com.ExecCmdBytes("env", args[0]+"="+args[1]) if err != nil { - log.Error(3, "env: %v", err) + log.Error("env: %v", err) return } case "exec": @@ -71,23 +71,23 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { stdout, err := cmd.StdoutPipe() if err != nil { - log.Error(3, "SSH: StdoutPipe: %v", err) + log.Error("SSH: StdoutPipe: %v", err) return } stderr, err := cmd.StderrPipe() if err != nil { - log.Error(3, "SSH: StderrPipe: %v", err) + log.Error("SSH: StderrPipe: %v", err) return } input, err := cmd.StdinPipe() if err != nil { - log.Error(3, "SSH: StdinPipe: %v", err) + log.Error("SSH: StdinPipe: %v", err) return } // FIXME: check timeout if err = cmd.Start(); err != nil { - log.Error(3, "SSH: Start: %v", err) + log.Error("SSH: Start: %v", err) return } @@ -97,7 +97,7 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { io.Copy(ch.Stderr(), stderr) if err = cmd.Wait(); err != nil { - log.Error(3, "SSH: Wait: %v", err) + log.Error("SSH: Wait: %v", err) return } @@ -113,13 +113,13 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) { func listen(config *ssh.ServerConfig, host string, port int) { listener, err := net.Listen("tcp", host+":"+com.ToStr(port)) if err != nil { - log.Fatal(4, "Fail to start SSH server: %v", err) + log.Fatal("Failed to start SSH server: %v", err) } for { // Once a ServerConfig has been configured, connections can be accepted. conn, err := listener.Accept() if err != nil { - log.Error(3, "SSH: Error accepting incoming connection: %v", err) + log.Error("SSH: Error accepting incoming connection: %v", err) continue } @@ -134,7 +134,7 @@ func listen(config *ssh.ServerConfig, host string, port int) { if err == io.EOF { log.Warn("SSH: Handshaking was terminated: %v", err) } else { - log.Error(3, "SSH: Error on handshaking: %v", err) + log.Error("SSH: Error on handshaking: %v", err) } return } @@ -156,7 +156,7 @@ func Listen(host string, port int, ciphers []string) { PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { pkey, err := db.SearchPublicKeyByContent(strings.TrimSpace(string(ssh.MarshalAuthorizedKey(key)))) if err != nil { - log.Error(3, "SearchPublicKeyByContent: %v", err) + log.Error("SearchPublicKeyByContent: %v", err) return nil, err } return &ssh.Permissions{Extensions: map[string]string{"key-id": com.ToStr(pkey.ID)}}, nil @@ -168,18 +168,18 @@ func Listen(host string, port int, ciphers []string) { os.MkdirAll(filepath.Dir(keyPath), os.ModePerm) _, stderr, err := com.ExecCmd(setting.SSH.KeygenPath, "-f", keyPath, "-t", "rsa", "-m", "PEM", "-N", "") if err != nil { - panic(fmt.Sprintf("Fail to generate private key: %v - %s", err, stderr)) + panic(fmt.Sprintf("Failed to generate private key: %v - %s", err, stderr)) } log.Trace("SSH: New private key is generateed: %s", keyPath) } privateBytes, err := ioutil.ReadFile(keyPath) if err != nil { - panic("SSH: Fail to load private key: " + err.Error()) + panic("SSH: Failed to load private key: " + err.Error()) } private, err := ssh.ParsePrivateKey(privateBytes) if err != nil { - panic("SSH: Fail to parse private key: " + err.Error()) + panic("SSH: Failed to parse private key: " + err.Error()) } config.AddHostKey(private) diff --git a/internal/template/template.go b/internal/template/template.go index 808f4a9a..2c169a4a 100644 --- a/internal/template/template.go +++ b/internal/template/template.go @@ -19,7 +19,7 @@ import ( "github.com/microcosm-cc/bluemonday" "golang.org/x/net/html/charset" "golang.org/x/text/transform" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "gogs.io/gogs/internal/db" "gogs.io/gogs/internal/markup" @@ -292,7 +292,7 @@ func ActionIcon(opType int) string { func ActionContent2Commits(act Actioner) *db.PushCommits { push := db.NewPushCommits() if err := jsoniter.Unmarshal([]byte(act.GetContent()), push); err != nil { - log.Error(4, "Unmarshal:\n%s\nERROR: %v", act.GetContent(), err) + log.Error("Unmarshal:\n%s\nERROR: %v", act.GetContent(), err) } return push } diff --git a/internal/tool/tool.go b/internal/tool/tool.go index d177af0b..5f01cbb2 100644 --- a/internal/tool/tool.go +++ b/internal/tool/tool.go @@ -20,7 +20,7 @@ import ( "github.com/unknwon/com" "github.com/unknwon/i18n" - log "gopkg.in/clog.v1" + log "unknwon.dev/clog/v2" "github.com/gogs/chardet" |