From d9d8b0bc75d6f5afba00d9231de87ae772667c6d Mon Sep 17 00:00:00 2001 From: Akmal Fairuz <35138228+AkmalFairuz@users.noreply.github.com> Date: Wed, 13 Aug 2025 21:37:46 +0700 Subject: [PATCH] Add support for protocol version 1.21.100 (#12) --- README.md | 33 +- cmd/dfmapping/main.go | 5 +- example-proxy.go | 9 +- go.mod | 16 +- go.sum | 30 + internal/block_states.go | 3 +- internal/chunk/chunk.go | 3 +- internal/chunk/decode.go | 1 + internal/chunk/encode.go | 3 +- internal/chunk/encoding.go | 3 +- internal/item/registry.go | 7 +- internal/pool.go | 13 + legacyver/all.go | 1 + legacyver/block_translator.go | 121 +- legacyver/data/block_states_827.nbt | Bin 0 -> 2091687 bytes legacyver/data/required_item_list_827.json | 9256 +++++++++++++++++ legacyver/item_translator.go | 1 + .../legacypacket/biome_definition_list.go | 3 +- legacyver/legacypacket/camera_aim_assist.go | 5 + legacyver/legacypacket/camera_instruction.go | 5 + .../correct_player_move_prediction.go | 6 +- legacyver/legacypacket/start_game.go | 5 + legacyver/proto/biome.go | 104 + legacyver/proto/id.go | 1 + legacyver/proto/io.go | 1 + legacyver/proto/player.go | 3 +- legacyver/protocol.go | 41 +- legacyver/v649.go | 1 + legacyver/v662.go | 1 + legacyver/v671.go | 1 + legacyver/v685.go | 1 + legacyver/v686.go | 1 + legacyver/v712.go | 1 + legacyver/v729.go | 1 + legacyver/v748.go | 1 + legacyver/v766.go | 1 + legacyver/v776.go | 1 + legacyver/v786.go | 1 + legacyver/v800.go | 1 + legacyver/v818.go | 1 + legacyver/v819.go | 23 +- legacyver/v827.go | 34 + mapping/block.go | 29 +- mapping/custom_blocks.go | 2 +- mapping/item.go | 3 +- packbuilder/builder.go | 3 +- packbuilder/components.go | 3 +- packbuilder/items.go | 5 +- packbuilder/manifest.go | 5 +- packbuilder/resource_pack.go | 3 +- 50 files changed, 9667 insertions(+), 135 deletions(-) create mode 100644 internal/pool.go create mode 100644 legacyver/data/block_states_827.nbt create mode 100644 legacyver/data/required_item_list_827.json create mode 100644 legacyver/proto/biome.go create mode 100644 legacyver/v827.go diff --git a/README.md b/README.md index 67d29dc..1e8a94f 100644 --- a/README.md +++ b/README.md @@ -3,22 +3,23 @@ A gophertunnel protocol interface implementation to support older Minecraft Bedrock versions. ## Supported Versions -| Protocol ID | Version | Support | -|-------------|---------|---------| -| 819 | 1.21.93 | ✅ | -| 818 | 1.21.90 | ✅ | -| 800 | 1.21.80 | ✅ | -| 786 | 1.21.70 | ✅ | -| 776 | 1.21.60 | ✅ | -| 766 | 1.21.50 | ✅ | -| 748 | 1.21.40 | ✅ | -| 729 | 1.21.30 | ✅ | -| 712 | 1.21.20 | ✅ | -| 686 | 1.21.2 | ✅ | -| 685 | 1.21.0 | ✅ | -| 671 | 1.20.80 | ✅ | -| 662 | 1.20.70 | ✅ | -| 649 | 1.20.60 | ✅ | +| Protocol ID | Version | Support | +|-------------|----------|---------| +| 827 | 1.21.100 | ✅ | +| 819 | 1.21.93 | ✅ | +| 818 | 1.21.90 | ✅ | +| 800 | 1.21.80 | ✅ | +| 786 | 1.21.70 | ✅ | +| 776 | 1.21.60 | ✅ | +| 766 | 1.21.50 | ✅ | +| 748 | 1.21.40 | ✅ | +| 729 | 1.21.30 | ✅ | +| 712 | 1.21.20 | ✅ | +| 686 | 1.21.2 | ✅ | +| 685 | 1.21.0 | ✅ | +| 671 | 1.20.80 | ✅ | +| 662 | 1.20.70 | ✅ | +| 649 | 1.20.60 | ✅ | <= 1.20.50 is not possible to support due to different compression logic and gophertunnel does not provide a way to support dynamic compression. diff --git a/cmd/dfmapping/main.go b/cmd/dfmapping/main.go index 49bcc7b..75c8dc4 100644 --- a/cmd/dfmapping/main.go +++ b/cmd/dfmapping/main.go @@ -4,11 +4,12 @@ import ( "encoding/base64" "encoding/json" "fmt" - "github.com/samber/lo" - "github.com/sandertv/gophertunnel/minecraft/nbt" "io" "net/http" "os" + + "github.com/samber/lo" + "github.com/sandertv/gophertunnel/minecraft/nbt" ) func main() { diff --git a/example-proxy.go b/example-proxy.go index fd60a0a..4f6678b 100644 --- a/example-proxy.go +++ b/example-proxy.go @@ -2,15 +2,16 @@ package main import ( "errors" + "log" + "os" + "sync" + "time" + "github.com/akmalfairuz/legacy-version/legacyver" "github.com/pelletier/go-toml" "github.com/sandertv/gophertunnel/minecraft" "github.com/sandertv/gophertunnel/minecraft/auth" "golang.org/x/oauth2" - "log" - "os" - "sync" - "time" ) // The following program implements a proxy that forwards players from one local address to a remote address. diff --git a/go.mod b/go.mod index 2014bf3..2fe76fb 100644 --- a/go.mod +++ b/go.mod @@ -5,16 +5,16 @@ go 1.24 toolchain go1.24.0 require ( - github.com/df-mc/dragonfly v0.10.3 + github.com/df-mc/dragonfly v0.10.5 github.com/df-mc/worldupgrader v1.0.19 github.com/go-gl/mathgl v1.2.0 github.com/google/uuid v1.6.0 github.com/pelletier/go-toml v1.9.5 github.com/rogpeppe/go-internal v1.14.1 github.com/samber/lo v1.49.1 - github.com/sandertv/gophertunnel v1.47.4 + github.com/sandertv/gophertunnel v1.49.0 github.com/segmentio/fasthash v1.0.3 - golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 + golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 golang.org/x/image v0.25.0 golang.org/x/oauth2 v0.30.0 ) @@ -22,13 +22,13 @@ require ( require ( github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 // indirect github.com/df-mc/goleveldb v1.1.9 // indirect - github.com/go-jose/go-jose/v4 v4.1.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.2 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/muhammadmuzzammil1998/jsonc v1.0.0 // indirect github.com/sandertv/go-raknet v1.14.3-0.20250305181847-6af3e95113d6 // indirect - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/text v0.26.0 // indirect + golang.org/x/crypto v0.41.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/text v0.28.0 // indirect ) diff --git a/go.sum b/go.sum index 3c03498..79970fc 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,19 @@ github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9 h1:/G0ghZwrhou0Wq21qc1vXXMm/t/aKWkALWwITptKbE0= github.com/brentp/intintmap v0.0.0-20190211203843-30dc0ade9af9/go.mod h1:TOk10ahXejq9wkEaym3KPRNeuR/h5Jx+s8QRWIa2oTM= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cooldogedev/gophertunnel v0.0.0-20250805131657-cc74f1797ff7 h1:IvKtI+ka2fAVh+QFEuLjLTQPyYARaem3q9pr+Y7wJCI= +github.com/cooldogedev/gophertunnel v0.0.0-20250805131657-cc74f1797ff7/go.mod h1:lmRarAmn25V/+QeiUbUDXeA26bEaNlX1wGEM/rj39ew= +github.com/cooldogedev/gophertunnel v0.0.0-20250806215416-758d5047d822 h1:cW4FrZUxjdJBoSD3Fpw7Z86LQJHtTK7o9lIgGXuaZ3Q= +github.com/cooldogedev/gophertunnel v0.0.0-20250806215416-758d5047d822/go.mod h1:lmRarAmn25V/+QeiUbUDXeA26bEaNlX1wGEM/rj39ew= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/df-mc/dragonfly v0.9.20-0.20241229163702-cc7e4ee0e3ce h1:mhBn/ezojzACPHeg+Y9NnU2bbYCozx27RgpfWUPw4i0= github.com/df-mc/dragonfly v0.9.20-0.20241229163702-cc7e4ee0e3ce/go.mod h1:hH1eU9lmucLNLehzxXzOUOmHJQLz3DLpQMUqIKcz8YI= github.com/df-mc/dragonfly v0.10.3 h1:t0mxRvjjgG8uBevqqzejJVL2M6obi6RYePMTPDlXo74= github.com/df-mc/dragonfly v0.10.3/go.mod h1:pO7nuyRKV50ZVZzB7AhTMU/0p4cvk1/yCu43vFqAzcI= +github.com/df-mc/dragonfly v0.10.5 h1:vn3Mwh7vWPDtIdss4QEOP8vSZGHRAjyLvrOEM5mEUI0= +github.com/df-mc/dragonfly v0.10.5/go.mod h1:/KjoqvIe5+ZxuFUPSRey9UzQS3GkTgAyTH0jTYFMs/g= github.com/df-mc/goleveldb v1.1.9 h1:ihdosZyy5jkQKrxucTQmN90jq/2lUwQnJZjIYIC/9YU= github.com/df-mc/goleveldb v1.1.9/go.mod h1:+NHCup03Sci5q84APIA21z3iPZCuk6m6ABtg4nANCSk= github.com/df-mc/worldupgrader v1.0.18 h1:Q34X9ID/hGuDyj9oiq+dpyjOaJdNxhVmVUepf/EPYDA= @@ -19,6 +27,8 @@ github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3 github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= +github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= +github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= @@ -62,6 +72,10 @@ github.com/sandertv/gophertunnel v1.47.3 h1:MsHv8QEx17+N/39BnAvHn/KU9zv8Rt9ZHTKa github.com/sandertv/gophertunnel v1.47.3/go.mod h1:lvzOdyb2fkoo3uySe++hy4UKq0I649oUFJKkro2ZHpY= github.com/sandertv/gophertunnel v1.47.4 h1:PmNbEUf9+7Fk8bP2875cvYTt22g0d4eeQhtd1dxjqqA= github.com/sandertv/gophertunnel v1.47.4/go.mod h1:lvzOdyb2fkoo3uySe++hy4UKq0I649oUFJKkro2ZHpY= +github.com/sandertv/gophertunnel v1.48.1 h1:+DleZznxkYugxEIEFAKN4JDfYSv/zm6//MfYFdIgyq8= +github.com/sandertv/gophertunnel v1.48.1/go.mod h1:lmRarAmn25V/+QeiUbUDXeA26bEaNlX1wGEM/rj39ew= +github.com/sandertv/gophertunnel v1.49.0 h1:9FIl4GGYMrFTmBPgkOTUskGWRQHIg4NMpY8JdM6SrCg= +github.com/sandertv/gophertunnel v1.49.0/go.mod h1:lmRarAmn25V/+QeiUbUDXeA26bEaNlX1wGEM/rj39ew= github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -72,10 +86,16 @@ golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= +golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= @@ -86,6 +106,8 @@ golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= @@ -93,6 +115,10 @@ golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= @@ -109,6 +135,10 @@ golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/internal/block_states.go b/internal/block_states.go index e35ba0d..c7c240a 100644 --- a/internal/block_states.go +++ b/internal/block_states.go @@ -2,10 +2,11 @@ package internal import ( "fmt" - "github.com/df-mc/worldupgrader/blockupgrader" "sort" "strings" "unsafe" + + "github.com/df-mc/worldupgrader/blockupgrader" ) // StateHash is a struct that may be used as a map key for block states. It contains the name of the block state diff --git a/internal/chunk/chunk.go b/internal/chunk/chunk.go index 1baf026..2ea4546 100644 --- a/internal/chunk/chunk.go +++ b/internal/chunk/chunk.go @@ -1,8 +1,9 @@ package chunk import ( - "github.com/df-mc/dragonfly/server/block/cube" "sync" + + "github.com/df-mc/dragonfly/server/block/cube" ) // Chunk is a segment in the world with a size of 16x16x256 blocks. A chunk contains multiple sub chunks diff --git a/internal/chunk/decode.go b/internal/chunk/decode.go index 29b73db..78d0ffa 100644 --- a/internal/chunk/decode.go +++ b/internal/chunk/decode.go @@ -3,6 +3,7 @@ package chunk import ( "bytes" "fmt" + "github.com/df-mc/dragonfly/server/block/cube" ) diff --git a/internal/chunk/encode.go b/internal/chunk/encode.go index c4e8392..77b3ae4 100644 --- a/internal/chunk/encode.go +++ b/internal/chunk/encode.go @@ -2,8 +2,9 @@ package chunk import ( "bytes" - "github.com/df-mc/dragonfly/server/block/cube" "sync" + + "github.com/df-mc/dragonfly/server/block/cube" ) // pool is used to pool byte buffers used for encoding chunks. diff --git a/internal/chunk/encoding.go b/internal/chunk/encoding.go index 5c5d7b6..e7e7333 100644 --- a/internal/chunk/encoding.go +++ b/internal/chunk/encoding.go @@ -4,9 +4,10 @@ import ( "bytes" "encoding/binary" "fmt" - "github.com/akmalfairuz/legacy-version/mapping" "strings" + "github.com/akmalfairuz/legacy-version/mapping" + "github.com/df-mc/dragonfly/server/block/cube" "github.com/df-mc/worldupgrader/blockupgrader" "github.com/sandertv/gophertunnel/minecraft/nbt" diff --git a/internal/item/registry.go b/internal/item/registry.go index da70586..7192578 100644 --- a/internal/item/registry.go +++ b/internal/item/registry.go @@ -4,12 +4,13 @@ import ( "bytes" "embed" "encoding/json" - "github.com/df-mc/worldupgrader/blockupgrader" - "github.com/sandertv/gophertunnel/minecraft/nbt" - "github.com/sandertv/gophertunnel/minecraft/protocol" "regexp" "sort" "strconv" + + "github.com/df-mc/worldupgrader/blockupgrader" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "github.com/sandertv/gophertunnel/minecraft/protocol" ) var ( diff --git a/internal/pool.go b/internal/pool.go new file mode 100644 index 0000000..b722387 --- /dev/null +++ b/internal/pool.go @@ -0,0 +1,13 @@ +package internal + +import ( + "bytes" + "sync" +) + +// BufferPool is a sync.Pool for buffers used to write compressed data to. +var BufferPool = sync.Pool{ + New: func() any { + return bytes.NewBuffer(make([]byte, 0, 256)) + }, +} diff --git a/legacyver/all.go b/legacyver/all.go index 9c31812..fbcc035 100644 --- a/legacyver/all.go +++ b/legacyver/all.go @@ -8,6 +8,7 @@ import ( // must be set to true if you're using Dragonfly. func All(dragonflyMapping bool) []minecraft.Protocol { return []minecraft.Protocol{ + New819(dragonflyMapping), New818(dragonflyMapping), New800(dragonflyMapping), New786(dragonflyMapping), diff --git a/legacyver/block_translator.go b/legacyver/block_translator.go index d983c67..95dd5c3 100644 --- a/legacyver/block_translator.go +++ b/legacyver/block_translator.go @@ -3,6 +3,8 @@ package legacyver import ( "bytes" _ "embed" + + "github.com/akmalfairuz/legacy-version/internal" "github.com/akmalfairuz/legacy-version/internal/chunk" "github.com/akmalfairuz/legacy-version/mapping" "github.com/df-mc/dragonfly/server/block/cube" @@ -43,62 +45,69 @@ func NewBlockTranslator(mapping mapping.Block, latestMapping mapping.Block, pse return &DefaultBlockTranslator{mapping: mapping, latest: latestMapping, pse: pse, pe: pe, oldFormat: oldFormat} } +func (t *DefaultBlockTranslator) downgradeLevelChunkPacket(pk *packet.LevelChunk) error { + count := int(pk.SubChunkCount) + if count == protocol.SubChunkRequestModeLimitless || count == protocol.SubChunkRequestModeLimited { + return nil + } + + buf := bytes.NewBuffer(pk.RawPayload) + writeBuf := internal.BufferPool.Get().(*bytes.Buffer) + defer func() { + writeBuf.Reset() + internal.BufferPool.Put(writeBuf) + }() + if !pk.CacheEnabled { + c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, world.Overworld.Range(), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding) + if err != nil { + return err + } + c = t.DowngradeChunk(c) + + payload, err := chunk.NetworkEncode(t.mapping.Air(), c, t.oldFormat, t.pe) + if err != nil { + return err + } + writeBuf.Write(payload) + pk.SubChunkCount = uint32(len(c.Sub())) + } + safeBytes := buf.Bytes() + + countBorder, err := buf.ReadByte() + if err != nil { + pk.RawPayload = append(writeBuf.Bytes(), safeBytes...) + return nil + } + borderBytes := make([]byte, countBorder) + if _, err = buf.Read(borderBytes); err != nil { + pk.RawPayload = append(writeBuf.Bytes(), safeBytes...) + return nil + } + writeBuf.WriteByte(countBorder) + writeBuf.Write(borderBytes) + + enc := nbt.NewEncoderWithEncoding(writeBuf, nbt.NetworkLittleEndian) + dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian) + for { + var decNbt map[string]any + if err = dec.Decode(&decNbt); err != nil { + break + } + t.mapping.DowngradeBlockActorData(decNbt) + + if err = enc.Encode(decNbt); err != nil { + break + } + } + pk.RawPayload = append(writeBuf.Bytes(), buf.Bytes()...) + return nil +} + func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn *minecraft.Conn) (result []packet.Packet) { for _, pk := range pks { switch pk := pk.(type) { case *packet.LevelChunk: - count := int(pk.SubChunkCount) - if count == protocol.SubChunkRequestModeLimitless || count == protocol.SubChunkRequestModeLimited { - break - } - - buf := bytes.NewBuffer(pk.RawPayload) - writeBuf := bytes.NewBuffer(nil) - if !pk.CacheEnabled { - c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, world.Overworld.Range(), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding) - if err != nil { - //fmt.Println(err) - break - } - c = t.DowngradeChunk(c) - - payload, err := chunk.NetworkEncode(t.mapping.Air(), c, t.oldFormat, t.pe) - if err != nil { - //fmt.Println(err) - break - } - writeBuf.Write(payload) - pk.SubChunkCount = uint32(len(c.Sub())) - } - safeBytes := buf.Bytes() - - countBorder, err := buf.ReadByte() - if err != nil { - pk.RawPayload = append(writeBuf.Bytes(), safeBytes...) - break - } - borderBytes := make([]byte, countBorder) - if _, err = buf.Read(borderBytes); err != nil { - pk.RawPayload = append(writeBuf.Bytes(), safeBytes...) - break - } - writeBuf.WriteByte(countBorder) - writeBuf.Write(borderBytes) - - enc := nbt.NewEncoderWithEncoding(writeBuf, nbt.NetworkLittleEndian) - dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian) - for { - var decNbt map[string]any - if err = dec.Decode(&decNbt); err != nil { - break - } - t.mapping.DowngradeBlockActorData(decNbt) - - if err = enc.Encode(decNbt); err != nil { - break - } - } - pk.RawPayload = append(writeBuf.Bytes(), buf.Bytes()...) + _ = t.downgradeLevelChunkPacket(pk) case *packet.SubChunk: r := world.Overworld.Range() if t.oldFormat { @@ -247,11 +256,11 @@ func (t *DefaultBlockTranslator) DowngradeBlockRuntimeID(input uint32) uint32 { } state, ok := t.latest.RuntimeIDToState(input) if !ok { - return t.mapping.Air() + return t.mapping.InfoUpdate() } runtimeID, ok := t.mapping.StateToRuntimeID(state) if !ok { - return t.mapping.Air() + return t.mapping.InfoUpdate() } return runtimeID } @@ -315,11 +324,11 @@ func (t *DefaultBlockTranslator) UpgradeBlockRuntimeID(input uint32) uint32 { } state, ok := t.mapping.RuntimeIDToState(input) if !ok { - return t.latest.Air() + return t.latest.InfoUpdate() } runtimeID, ok := t.latest.StateToRuntimeID(state) if !ok { - return t.latest.Air() + return t.latest.InfoUpdate() } return runtimeID } diff --git a/legacyver/data/block_states_827.nbt b/legacyver/data/block_states_827.nbt new file mode 100644 index 0000000000000000000000000000000000000000..46350120065d81d42ac20714e510defa4899411a GIT binary patch literal 2091687 zcmdqK4UgnTvK`tr-Rfz#bVs9EX(Y{RwR`t|?AkEw`|i8%K0m=Q48t%C!!QiPFbu;m z&8lKoahpw+N!Ikt!0`Xk-_S48Pk32mSCgu)6Uj
J^9NCE2`QLU|SbgnA8He}6+E(clPh^_!x--s^ySl@`Q^H|@A zF6~&~h_2>X--s^YSl@`Q*;wC*F4OcrD!Mc7%gs+yIek1bJP!T&$nZGy2PDJe(4UYD zk3)Y%GCU6b8OiWC^oJzF;t11wx>4Pk>%{Bme{JKk{^0Qw zbuTFh3cv5ppIN$E*SpQt?t|($&38MkEUq5!JAr*x?_PH?H}|2^`0>#Tc*h^?IipRS zKd$K@Oz#uJ?%Y5ADu8oXqRPDf2_6Y90aP?GK |9uQ;4d6h+|HNkD@+gM>>xLJ_lI^;vuA{5XCq|fmrx3>NEPR`p}Ud&tcVxkfK8N zk>JFLamd+vj){??M%JkinnXN=_!J^rYS>n8ViIXF($t9L-0T*D6N!nErb;}sfp0w` zB^Y*Wb!t04jVJ|z9Ck{C6cr+ya*CtQDiISSMU5!RK}y6!h*2TiNy7d~Yx6+z<2k&x z3ZBMCQ6KwEa3RFERiOH*Sy*`pDJo zy3s1U_CM1ffNFzPe@tlC7t zXS=pzKcZ{FM+qq^G+-nICJ_@OMUCuJAux$}2=OUIw$#9_+_WUpVx*}N$+_JvgeDRb zB~6uhX2Z0PtuAfHrxB$ MoPDQaY$3!zEG zLx@iyvZaP?>n0|V79&lKNX}DSjYz-)kFidDr>PRpY~b56*hS)D#HSI3H^^b9L`YE~ zvMHxH>Z}qmF;disq8y||JcJk(8h_YpBH+_&Q;~yDm-$vA>aaa VSbC41tO@&Cx?LJ{r9wPA$J+wM7($t7$EU3C@?8Ulc zJ0CuUsQQOE=5+Wd>O&5V2@W}{Ks x*U9x|Rh$1*XXnq~CS{ct z`A _9 zoZVc`i@GlE_!FJi#Rg>gro;BjV(ig__x-VZ-=@gYYP~B%l57m|I@uS*LlykxA&T(2 zBU9Byo<#Gl5hmZ4VD_s0bF?XwYS%9Fv_3n3c@r gVC4Fg7{?ymx?G$K^7~&2qNL z;`jT>1D3V#I==I?T&&HZFJJAB3{|@74i}%rbsaBu=O=KiIR9!@7TaCH%-edSZ1(&i z9$HrY l&<^0#m`OiT9XUhFAl^^xLRDRU|Qu$H;OXWxXFO?tl|Alh@ zOXWxXFO?tlzf^wI|5Eu;|4ZdZ{eP+4|5Eu;|4ZdZ{V$at^}kep)c;cXQU6~l_rFwr z)c;cXQU6QjNBu9AAN9Xfe$@Zh%Ka~uAN9Xfe$@X``BDE% @}vI$Qn~-7@}vHj%8&YA zDnIIfsr;z_rShZxf34jAQu$H;OXWxXFO?tlzf^wI|5Eu;|9_+0|5Eu;|4ZdZ{V$at z^}kep)c;cXQUAYD?tiKLsQ;z%qyCr5kNRIKKk9#}{HXuGQ|^DM{HXt>@}vHj%8&YA zDnIIfsr;z_zgO;msr;z_rShZxm&%X&Un)Q9f2sVa|IZ%#AN{16)ct?n{HXt>_@n-p z%8&YADnIIfsr;z_yZhI?{fB=3MJhk)f2sVa|E2Py{+G&+`d=zP>i_QkwNC#_ 3^yGsQ;z%qyCr5kNRIKKk9#}{HXuC``0@CFO?tl zzf^wI|5Eu;|4ZdZ{V$at^?!H&TBrY|@}vHj%8&YADnIIfsr;z_rShZx@9tmg^uJVo z)c;cXQU6QjNBu9AAN9Xfe$@Zn{cD~6m&%X&Un)Q9f2sVa|E2Py{+G&+`oFt>t<(Qf z`BDE% VK*HsQ;z%qyCr5kNRIKKkEPP{ @}vHj%8&YADnIIfsr;z_yZhHV z{V$at^}kep)c;cXQU6QjNBu9AAN7BC|5~U2rShZxm&%X&Un)Q9f2sVa|E2Py{_pNz z>-4`=e$@X``BDE% VK*HsQ;z%qyA^fZ@vWL z$=8a3-+$iSzxMe1|BvKH_n)QmqyCr5kNRIKKk9#}{HXt>@}v3R-M`l9f2sVa|E2Py z{+G&+`d=zP>VK*HsQ @}vIm?qBQlzf^wI|5Eu;|4ZdZ{V$at^}kep)c@W6Yn}d=%8&YA zDnIIfsr;z_rShZxm&%X&zq@~})BjTWQU6QjNBu9AAN9Xfe$@X``BDFO_pf#OUn)Q9 zf2sVa|E2Py{+G&+`d=zP>i_QkwNC#_ 3^yG zsQ;z%qyCr5kNRIKKk9#}{HXuC``0@CFO?tlzf^wI|5Eu;|4ZdZ{V$at^?!H&TBrY| z@}vHj%8&YADnIIfsr;z_rShZx@9tmg^uJVo)c;cXQU6QjNBu9AAN9Xfe$@Zn{cD~6 zm&%X&Un)Q9f2sVa|E2Py{+G&+`oFt>t<(Qf`BDE% VK*HsQ;z%qyCr5kNRIKKkEPP{ VK*HsQ @}vIm?qBQlzf^wI|5Eu;|4ZdZ{V$at^}kep)c@W6Yn}d=%8&YADnIIfsr;z_ zrShZxm&%X&zq@~})BjTWQU6QjNBu9AAN9Xfe$@X``BDFO_pf#OUn)Q9f2sVa|E2Py z{+G&+`d=zP>i_QkwNC#_ 3^yGsQ;z%qyCr5 zkNRIKKk9#}{HXuC``0@CFO?tlzf^wI|5Eu;|4ZdZ{V$at^?!H&TBrY|@}vHj%8&YA zDnIIfsr;z_rShZx@9tmg^uJVo)c;cXQU6QjNBu9AAN9Xfe$@Zn{cD~6m&%X&Un)Q9 zf2sVa|E2Py{+G&+`oFt>t<(Qf`BDE% w=#y9m3Rb8f= zO|p#sw9Qvp5@p5e`m(CyI;pNc-K1F-mr?vKt!D4f&Y! zld+6Wl@y-x6NMc{uHg#e3eA=v_8A~uIsBsTrSf*&Z1>n zCX3oQ @x&yD|<_x$P5v}ao8bePb?z@ ;a2$5X(^i!#$S+qJ zH5`W>q6XxkL-=sarm_#Q01?}VSa2M6$W!n7+L&2@9CU~p4*Lv|Du``{2;n&Fkf+`i z0&>tHYB&x% vUlr$E@S*=5k)tb#Vu9dQ5a)7aNe}w;i4K5#*|j-$!*)mhr-% zi}xhJ+h2BXukMQ5 ZFMCWm2VeVtL1x-8*i~)4^y_lyPQx&*$BHnufQ$yw_f)KZ<&7?3yoIt9bCp z= ze%FqBdUws%)+ZTNB_Nf+Dg5kdHUGC;CP1JUaR@{ z*`GBTHbrGVI>FDa1EhjhA6_b-RBQ7n9OxF9EIeFvbh)UF(LN4YSg5e5LN-ufLrjT_ zk}f3MX^k-wYSU!oE1bzFDZ}D^^vrA2T1l3@bw9^YX3>SJdSHW0hl-9WWD7bwpT#X! zS$MeU=t7YVOcoX@JgSU7Q9iWbM{%Td;-aIA-T6*rc*dBm$(YFKC}TB$K*I2FVbO)` zp<&yx=?J4mMoAfxZnO4>Bn=ZAC2e>{0LwZ<7Jk^_(y7l_l%eV#+Bj3 ^TlZAx}k1FF&luZPD3~O8T G7$!10%1~@4w#raYTlbH>+}|pDa4zG~rJ1Q?e%A7#3qOuSrW+X@W$gBMW5YAd zY< e(Xg%AgrrepqofVVcWS;N!8WZ%zG4I&C3TqQ0Lywq zmVVeK?IFa88ygmFsLBU7)U?RxC_^^lh#A1*8mly1Y;?4t=msYZ6B!<5Y^MS0s$-)} z%l5?C%;OmyE;_o{{U4ApOk{MFvD!Z%VR*Q(=tB0;u&vp2gwZ0Sqzp-SVyg^^b>Lys zsnL|Q;TZue8vwgBJY-mup`eB~&Xl<5=t6ek#D @HpK|zNcmu=(~ieFy4aoXM22P2x1RNx$ml3zHGe?D@Ni+#h3uhW z+p*~gqeVtZ8Io?Z_J<@56B{LMct!xrIztw|9Raq(rBk1=C_~jfv~i}yMMoF13nw >pYNkWMQF#RQc*I&67nL-_$>Bwx#)BRAuq}`m(Cy zI;pO{?*930Qr77r&Z2dk-CWL#x-Ra{&YzpVuF@j^>E|E6IJ-W(y2#_Z#4+f3U2N >H7|RRhQ{zlPsfZQ*IYYbYB$9{kyL|-K1F-mr?vKt!D3i27Bi- z*ar}-S8Y?2eATeC)#jgewb>L|TCGiO=2^VBt?D9AqIsDvZlh(foo9)Uj_{t2=#}4e z)D~rWR~5NOA|rznu)pbGmr1pW@AD|m7we+j_v!gpzx?}Xv5w1Cf`*i9yl0@zT;pAM zj(6!f-W7<~Q#wmm>pEJM@q06O@ _V}*z=k1@Xv)Or; z)=0vkQJ#5;a^WS)rI#peUC^R+T3yCQY3njJN?R8crMFbw$M4K6PTp;b%KUdxm}Tp6 z1b}Y)i>}+s-5O_ltsUe32Dq0L#Ps{JqcBg)#oA$oJ|P5Jmrn?RR^wM4k-Zj{S@Emx z9cwdT=2@}0-M{7hdYNp>WMMXA%d=q{m7(FD`3-mBH{7M)a0j(R`a9NcY`BBkjSY8D zyRqR8YKI!%v36s_9n@}YxP#iEaJ@bEpSJnRY?4nuQJfM3X?RKu#N~J0{At&o`y{T{ z$!>ZLT7CY|y+6%wlFE##$ebt_x4WgNJ55yknFbcIKXzeS7{$AEnSR&>+tv?Ad>lpm z i9dW=XG7Q>eU-=4SghyWVb=X2dst0Ojc|O(#Y~dybPL&b(v% zMMQ+L*Wc#wvpe@^+q=!alg_`r+h%nd-Nfcdzf8?KS(`@@yDC;_OYIyG9gCa;qH~dR zKy)y24v0=h&H=AMZ#xJ4%y+;Sz5~AW9q^U!fM5C!_}X{CZ+r)Q<2&GYz5{;mJK*np z2mHP7fPd*b;9vU=_($IX|B>&2|JZlHf8smf-}nyrx4r}Zo$r8u?>pc>^BwR9-vR%* z?|}cpcffz?JK(?a9q?cK4)||;2mH6b1O7YT0sp=4fd9dF!2jqw;D7QR@IU(w_+NYn z{I9+P{x{zN|GV#i|HF5{|LHs6+;_mG?|?VH1Fn4s{FCp1neTwP?|=g?fSmRqsPv7n z_8su8?|=gy7N1r_^yJw2xy}FfP5J+TfZuixm3#Mw%mc&x@fqT;nyW;+zv><#qNj(B z;n1_gHyyggdy~Jt6kz^y`*>4;{4{;&`_a?Y@4Ebtmw@W+%}sP~e)wfypsV9Q?~}w; zP5qS3z&otAU+%Q~_k$n9LE?nTMopUmw?9J?hlh@uI`&JTA&JAnhD#f=lfoNoN_6zp zAqls4!6)P$67A3*Hge#jrw_|8;Mx?} 4Pe4{*RK(NR-}Y)AKLz~vsRJWPDl^q~j` zC=U-EHg%do%X)XW?bl$ArVsWy@u;n)k9``r5n>x}wua*(q^6K{AOt256CW;p$bK5O zeVdj*YJ~I@A}Kd}gwQ17Vx*@L(^%kIhe!d29a7zTj!Pk`{vnPzEk0`ckR3U}A!ikc zi;$W^6yp#DV&cQ5kL~DS{}k17|F!MdV2-M-ejm?C)rk++27zj(W<9l!Hzz)N?iqWd zcVg~gp~IyP*-XQ>Z%*CD )YKvEH9hxO rlQB%i02prg`iNnH%OB>P{1Gj7w5=V)So;oDqc25wLJUo2#^kEqWT%(OFeme}T z58NEOjY}P>_Th~-9X4v(ki9s$!DbbQhmM*$6yNZ~VPV6jO*3JSKj9oU)gF5BV>yUA z(NR;!J_wxnaBT@Z97Ub@sOe*!1x|F- 4Pe4{*RK(NR-}Y)AKLz~vsRJWPDl^q~j`C=U-E zHg!gyOk2Jm%fZxzjhZ(0N#H_ e6jo>QJ>0Z?x&KQPYO(#mNmet2jJ#)YPH)h9?dS z8>G$GcWIt1%J`=KVIJSjiz2G(I4!H|OY`44sb-&VH&wb!qGfTPNAt8kJAZkfq~)@R zmT8$R>a@tw0^lR|v$ON(Z Vf*y10Gpb|Bj4U68sc7wf$_u3k5P zjBesZny)%TJm2QGx$%pqa2LC;xb+n)iM_@8q}jH30`^HWs67QcuZs-`^-ZVc-FDgP zAKk}U_9*J{M`F9WSwEnsUeGQ?wkvzPe;@c`3E?q8ix4Z50ehWLMB$;LqKbW!6N)G- zOgJ qo8vp9 z-R`vc_k(>4hbmOf!x~{aOjI->`_I|*98R%{!b3$x6^d(EqOdSw(WKcv@%}i$F2%th zW^sxR6%|$Nrhj zV68)QmUR8%2ba9U%`Dhm@A6 s^}&e3Lq*3a)@R@j{l&2dql_?Y3+B>Z9GZ~bGi(dyLWM&V zB`P|qkYw9u#}n}iiL~i3@)gcpbaZLWaQykQGZiJba7<$kRj8VWHNte5sA$4tdJd;p zMd6{Mq6)=zQsavP8rBZXzLz8pGp#1g3-I}|?av@Sk!*``A{7>=5JexlX$eM_0Rzm1 zi;6DPU aqoWK-w^{qA;~5g`z@w!b8y#(!MgYe; zW0!`B42Lol)X>J678ey=$S$1NFtZB7MMgy#ifw4ZFmYkgW%L=dCHqkvF`cNWsA9Li z6Bmw!-+Jtd *gAs*=35O u{?pGtesOkvc6E`*cS-M?g17lHDeui|%c#!l{rhI0Chs;`u}q?Q zS`R4VfGCK-w;h3HnQp4uuoy(*Mfb+HrUrZH=fB$hDO#pwvZxL59fJx{I3>n2P|Q *hz9 zETbyUm+kPWvUt9qCRbl~uQHRgP8V?&t>f(Ga$eMRamNz-ye>8%aBo^J)=62ukLohs zEQ_MtBR>BJkE8Ewc2#VWW&)ngKHqMt)C}}xao_%pj||V)GhDD|xMa^j>M&qkv@1>O z;3Wg8gO?1X4qh_!beOUGfhj{z2c`@?9hfqZI(SjK=ZB{pyksDC@REVlVL*m?7B6nS zt!TZ4=hVQ&a`viQT~|f6jEeGc9}kwN-*@kLpJZ8aAFZ JnGSHhP! z@gmJv-B|z~14ac!=Yml|(LrHUP;_z_6%-vMMg>J@i{5Fs>FmX}HoETx2QAZklR06U zR#~m%>hY+1)!PRy;&PehW{3B *~NWQ)k3*G zX&z4sCA&yW!G&@`#gI=q6ywMR72`;T6ywMR6+=UiLotqAP%(~VNHLCFP%*T^a45!+ z3o6Eu3@L_k^&Ums$K}Q>WScC`Z!634_p;kDZPMMUxqton;Qi4FA<%$0Aq48!6GEU8 zo)7} A@Db$FN07EA=;6aj zH5nPCt;xtBZB0;+-k5%P0(+C>i^oO*W4iaC +3Xsn^x(rtLMqG zJn8e?-A5TuAB6y{J%-D)DAPKL?&B=mZxF7IUku(I=BWF)124YVew)bd-w!VAqLnK& z9s@egw;ls-ii9Bu4-o}L?AJuX5QK$?e?7>)329_05z$bDq}pBzn}kP5oK0_$uW)9f zp$UuK{V(if!CSlAepa>J;~d`u?Vi*(|9-GT@vjI~?~ulp4i5!A$j)=Nx_^gQ1>qs0 zpa{h@BtcksFzC^&$-KYlXqVz(^fEX^hlqkAcB?Omu25|C&%04{CTR5m8WtY`!Ut zE~_L=OcXSss0Jko4-p1MMjx_TrjtLJP#>ALPa$l-!sy7MS3wWE*8>rRhlqkAR;vdh z2n!GYdXRlHY^ya5L6nGSC_++op1vCA5gsNQny}biLlPDu{uQBMhBUTxcqr(>V|D)y zu?oUNL_raX>4a7h3g)nfT5W{W&QuI~j6WMT5ipOoGXwY}(RLZ-C=mrk23S21Ntl=@ zXhMyHc4`G82@etfijb`{aH};9Nwk<~XhL$Gl21sWO?#2AaHpc73XkXgZ-U8^58QOQ zc;3GzRK -S7TgVwHr6iGn5+)u1HdA;O?YGd@}GownT>z;W@xMkgM8 z6*RH?-Hi&v=(4pJ7Zn9ntd !o@{H7bfHT zUsuSY4?8%zb(nuusG5g0!nBwuXhQbiqz0H(6fP V=qkVKaG0|{|_4g`R?m17!B`iezD?+x;ux*!9Z~1qL784Ck zNUrVk;c57U1RB=tvQue|aQqo^SfcPS@$VE0XHdgSiHL$Cq>ZNJ600OkOcXSss0Jko z4-p1M#-A3O2>6iIR3e1Kq5}^FJqCE)fr$T2u#cmn0}%y9>{fT+p&$qg5C3|Q1{k>2 znuH)qL^Kp3skZBSAd>Jf(a?m&?*7LXS@72G)(2b;z2#pKs@@@uEgc>TdXSwrp`m3J zgolWNA{5h*1YzO9phq(|k3U5mHnAQ$FZ{!y6A=YP>{fST;(uB9a6EKkqM(V@?M_4# zB;g_AUlGy-K@Bb~CK{TMT$|N>B0eF3Htj{e!kvnSDm v|}X@G#NPgvIXu*AcSd!;Xk9z2#pK zs@@@uEgc>TdXSwrp`m3JgolWNA{5h*1YzNU^!V*vnkS1gzNvp$Ch;=5Ny{W!6lI)6 z^Q>6hUSC#qTqo7p`SZ6)S*1n()6YMCadv%nb& H zzJK@ZJWK1d*{7T0J}J#h=H^cxBF?-={3S+Iv{P9B5+jQEx~t<|yh`#qj_!*h+t&}& z>Mx$YYn8=24eF#U<3&-|@jk@)%bR$S=BsFF6kgOuNTk5HsLxoiUa&;HWQlsk67?EH z{jTeQ|Fw WpWxBYH?&Ivy09VJKASLm`cU@nNxzW&mZhbrh`ZjH3p75EW z5hcoOz^24@0dV*41Aj!}BcL`3)$BW$P(@>5CZQQ=q=5&^iHfE~Z5pbP Ap(e2%@o?OBp*9KCTHwbYezngdEx!r5Dc-?z zgh`0T!c0Ol(n!O$kS^^gA(|4kX{bh$pS0IV K1W=rO+q#vY7(lEW*WGKoT_YE+@_%$$=-blknkG` zJ@h$gC&x2QrXd^;Hwnj4$O9jgO4KHy8fnLAk4dX+Oxz}+8$~{F*?6dlsAfCgP@ge2 zsy(#qM|tFS<2DK1?32WeoW!Pt>bZfNNjGwnP|i9`+_+6bI3{iqx{-z&ww;`=aBAeH zp&Utn;;S5qJ@{#9XU8;BB*vv0ISJQMx`aM1wYW_}H?nIdJ}j-magm#ZauoZ}g=69- zqTA>*cuW4HJc2t>n}lliQR2i+Vq@ar0Pe(X61ug>N8BuLg`eadld;z(k5ZFRjWpA+ z?W9vjO1Mpn+cb0|**CkAfQ4fsHx1>&9h9Uj?KBB?Qc|h}J}8x_Nx02QjcnOzk4Y_V zlhBPKAGmBh)I?Mpf8w@Wp=@e1$s+(kz3oQ_W|Potz=U+5CUF4paol#GHVM`2L&SmE zBt&CjCZQQ=q=8$=iHfE~Z5pbP 2yNJOeCSvFk# t zeTX=56Y-j@Bbm5OLO1Ii30F2AY7(lE4Hx*3)Z#V`-AMM$j%2caBcTsGXgiUchH^a9 zL}Goj3&+DvLN^L|;Db_$+9XsXTXx!G(kdGhw@K(mkq=xp9%>@0+0HlAXN>Jr65H=f z-u-)!2kutY(;g*ELNogmaiJ!$9ih5y;5O2Q+9Xu74iOh-lMs!CnS^Gfk%ny{rz)Bf zwP~nElArXdMj{V U~b|p ziHi6(x-W|5{{2^ @u-X;#7$O9OlT=VWg@N*_V?X zcvg{kD5 SUb{PLxz-;-SQ;5^0uUTfE81q{T^BCz5rug9uP4CQ`ae@k|NM!AHu_ zP6^vD;&f_0PMs(f0v&uxlvGtBTXULY&ngoWCsmy&(t*mvLy1+T(I?!N^J%9+&Xvh} za-v?)K3B2*K-G~WyQ)U^=@6VqJd{*bvJQvfL}FpYsS(*#!?t)+6G@4Zu1X|n=NZnq zDv^kr&Ldyp%t==#mI0wF6AL9yl_ @g}QCI+RpZ8ZaD!lZlCws!sO#5S&arlsHu)8*AVeZ)!4WanjX^ zWZmu{!V`*#l&(@dQ-X6FLCVlh3EL;O?UVBpw?>>gQ7QyF_>?HAszkQtG{>G*CMHg* zI#Hwpm5GNEt4hrdfb~vt+q*#>aUbk9rM1bXlYK(Ck>cD$P@kPQ3oaKaT}RnAMga YuI+rjTEP&)JW+nMbd8e5+O>(#Y$Hzrct5nDxR6nsT8F{sN+wIld4W! zV}jFBR-w2^sVYUWp6Dt?L2jo+fRoR5mZHuj?URXy^ohqqRzK-bVs(>^l6^$9%^Q+T zOq^78qDDxlZn6zMr_SS4iEON4+dU^voI_8GldeuA>uLIlgxoYA`3iSZx=MvN_(&Os zZTFm}1gB1v3V{wjB}%F)k*(=IAvo73t4vIsRCS_A2PzW}C03PeXD9m!w~2s{PEAdM z`b^h$-RKx2RgDHrhtNdgp`@ykeK>?B5(^_vjmWMVxW${8NJ^A+RU%2Zdxzj;;^CyL z6U%_$+=!DR3_R94bRMTllm=mrJRL@=8j*cD$$@7TiHDM^N)+cXMPgyZs!=n2S#K#f zH3{lK`(U-x&giNt*@uG@C(f+{^`N9#XPG#u>SUb{;mO29iBl!Av4(B&CMS~?CtaOL z*3AwgK%tmO=_ xS{ckzG|I`*a9SBpyntDp`j^a3ZlV;?#)j zs$pBasfnaSNmnJ3wDSz-T$M<~P3MuXaOR||6U%_mm5GHCr%DvyFh`yaBUO!fh6AUQ ztRnGHQdNoK>^#9$MPgxuH2T9`nkS1gzNvp$C-K|&(S4Gx)^)OsHf2&(+cJqZSzIUA zmsM^4Q=NZaCd;Ze-#i;t=_-#iRI1T|pPijQf18w5TI4_d{NopA*JoE3d3=|Q4t&8C z_>wE|6<6SEuE3vh1%AO5_$621S6qR= y!&6?c& z!QK$32Ss~^Q<2U%kp3blLi+p85A!Tu-2T!`(I(CxH#VSvZ@LJJVm{Bzm(=g}KKF5! z?M-!c{5gCQKYXA4)tI|%)}LhBeU@ 0FN?M-9sB^I$V@=A-mAo{ygi9RTv&J zO3F}dLlcID3zIJ6&zMaFe8z0MbRt`3f^FMmE@YIH8DM`GHcZ2esQl24nF|{wZR``k zg^ZFkJY;y3Ax$xGYc?HewAg5AL-KVW&^*2&!G<@}>~whMfR;EsY a4h9?da8zyZ=pF>-^AIUM)iHwpm_95WJhG#S2;SlP? zMoF6%>xf&nt+*4pGcfj=?NKs3%8;fQwoP;DGalDyvC-0o Zm21d;c< l(eDf1}6;<875`MpE@m9)S7BcWcy5zZM)2Y zi;^w_rkMj7p3Sq5Bc}ryC1vdPci^HV3=0$S5gewZ97& zC1F^&@aRGsV%XMfI>IQC(Ncz_JF!)U#2VZ*v$J6t0X*YOi42cxsJe$X&UCma=|Xnl z#D QJN%c?eis;*u)e~fP8MVhaoWm+bS zIxX_&+x#{!?(?(r=Wmm;GJo^a&p&=~c71krk;iw*o4Yhm7G-=>|8Q#Li`|!SGK5WH zj b($@cWK(5E|7c#Oi`!^fZ0A`LnZKGpHpbW8%S{K= z=_1aeb)4N?&WpM(?s$_BG`{O_Rhx3VNIaq+7ke1!d3-l7is-JW;&kDo v*wFmeD*lbL!>cWIQ|nYE>3y>NRicCg$1f`9nOkOZEidnKpn6Z2*_r z0IswFTx$bBE_kNx0x h5m2&o59o0sy%{3;=S07y#q~F#yN~VgS%u&|U3j zZbIY&F#yN~VgQf}!~h@{hyg$@5Cec*&|U3Ta)B5C gkR0LTSm0FVpB03a8L0YEMg1Atu6UF}wKffxYf0x MzdB^QVRKrRpifLtI30J%U60CIsC z0OW%1YPXUL!~h@{hyg$@5Cec*AO--rKnwtKL3g!V$pvBnkPE~BAQy-MKrRpifLtI3 z0J)&M+O6aQF#yN~VgQf}!~h@{hyg$@5Cec*&|U3Ta)B5C &vQ+ z>!iB+bdzRTTt@M`w3@v?JAeK*DXX-|fBN~yFV3#dt}gQUE;%*MJ5O;wfH=SEc-7mR zo9I5yvPVYW?*0@liri4I4U?#Tze%DbuIh`t$dju#NB=!9%6d(`penZe7aY%UpFCuk z{aKS?Q&e>{PiyoONI{W6V~&f&C)L^r0<;Q73LX~HT3pn|P@zk~Lc+5WWV-}2pp;mM zYeDjy%7`LCHZ4WI!kLD+8Z7?yymXVLZvD+MYCUT~RXUg EIeyLcFeGC z)D* N-Z5X9hN z;aLl^V+L-cCLo3u4RJL{qV4(}gd9vf#P#4Y`2-JqE?wnW4XW1Rj4CA-(poSX+_N*R zVldH=R)gX>nN@=V+4_6zrSn$JgA ;eG{d%3laND=hqxXj)9LtwgxNF}`HB%l#1&z3y65$SEcdX@ z)kBCAw 4BJvoK@2S#;%bmYC$nmhC Fd}}fO#MDH<=f0*4 z2Ond4UNNY%>A+FzKtfuH0p@mKAuR -&NPIrO;aKto&&7Jth-W9&t$V;d09T2Pe^W=QFfkXC|p|5QelRSF&!(ppe7gOP%T zgl{F9<%;#5XH$l$AM+k;bJ}55S_`|kooIMoxUFYyCK}ReSnVBz7(6UIYe9C*ux->7 z#L%K4t_Df8S--=OgNcW@9y})Zyl#-iZcT1G@HusrXEmr=hcl{_SV(I@_S|F!l~oKT z8q#V|Ji`%#hlOt~MxXmynx`F@Jg*qmlLqyI_A!F(m&)z_{ow2>t%Tj&AxOc)LRt%} zw?mMEg@k7%$aWdFjhcWIN-V^+AbC0uTF 5!0Cg2&sQU161ihlR8j6iw$bD=h^J38ciU?i<*Pd6ksrTjL+Ufc;JPZ#VHG%~#Pf zE!*#6zgQOc`Rvn8ai5gQlKOUZ#{|!|8_w{bG((g%L(^}Z87_8TRL`0qiJ22T=_1c< zde}vt!yoA)-x;2Ek>?CgyU2HfCtZXReACSvGgPX&$djlp%EkI|BE4?@7#&Wd=iB@? zHv{SH{JEK5Ra)df{ruw>XV+&}7kPY_ILB>j<2~rE9=?ONo#;Jk(|x|9p4Y_Qc5N z0acnAEu&Qye=rM7os?y~DC#=i_rm$h!!AJU^r)cEIFMd&1ij=4dc_g+8U*e6bXCTA zS|?Fe$7xyZHJ^RH-Bjr^iFWHov*|d0d7q@^vgmdus0+LVN8R8hIO+;7!BKad9(=}G z^CQ9i)%-|se>Fc69M$~mZpv-a{5Dz?`JznfWZ&k%9>4A0wv5Z$sEBW)b)2tu8}lk% z<@>kKK8wwqT&y4V kAV*y2J3 kAV*y4 zJ3 kAV*y3J3 kAV*y5J3 kAV++r?+8H%$Pt1NkRt>kAV&y7K#mZEfE@8c-w}ckkRt>k zAV&y7K#mZEfE*zR0XgEOz9R%7AV&y7K#mZEfE*zR0Xaet0&>JFeMbmFK#mZEfE*zR z0Xaet0&;{P1muV>^&KGy0Xaet0&;{P1mp-o2*?qF5RfBY>pMaa0&;{P1mp-o2*?qF z5RfATAs|P5qwfeo2*?qF5RfATAs|NxLO_lXgn%6JM&A*F5RfATAs|NxLO_lXgn%3& z2mv|bJAFq8LO_lXgn%3&2mv`l5CU?9AOz%y@AVxa2mv`l5CU?9AOz$HK?ukZf)J1+ z&K@0seu7c(=Ofr5AV&yR0Xaet0&;{P1mp-o2*?rLg>?3IL_aYk2mv`l5CU?9AOz$H zK?ukZf)J1+x(n%Qju3=^93cn+IYJNua)clR kAV&y7K#mZE zfE*zR0Xd?(kgnzkK?ukZf)J1+1R)?t2tq)P5QKmn(OpPabA%uS k zAV+XPFyCwO kAV&y7K#mZEfYylaLb{qG z1R)?t2tq)P5QKmnAqW9ELJ$ISM0X)w%@KkSkRt>kAV&y7K#mZEfE*zR0Xd?(kgnzk zK?ukZf)J1+1R)?t2tq)P5QKmn(OpPabA%uS kAV&y7K#u4xq^mhX z5CU?9AOz$HK?ukZf)J1+1R)?tbQjXq93cn+IYJNua)clR 1vJ; zgn%3&2mv`l5CU?9AOz$HK?ukZ-Gy{DM+ibdju3=^93cn+IYJNua)clR UcOhNP5rPnqBLpEJM+ibdju3=^93cn+IikCeuI30q z2*?qF5RfATAs|NxLO_lXgn%5;T}W4Rgdhau2tf$Q5rPnqBLpEJM+ibdj_59=t2sgt z0&;{P1mp-o2*?qF5RfATAs|O|7t+-nAqW9ELJ$ISgdhau2tf$Q5rPnqBf1OeYK{=6^G34~~5$q6 !k$!@2l9fp|Gta%u%Nr+>0|?M`cQWF{J#pfGFi5ry>Eh{# zo){uRK#CwjK#CwjK#CwjK#CwjK#FJ^($y3}gn$%5gn$%5gn$%5gn$%5gn$&$Hl(X5 zf(QXAf(QXAf(QXAf(QXAf(QXAqHRc5Qv?wLQUnnKQUnnKQUnnKQUnnKQbgO3uBHeg z1f&Qe1f&Qe1f&Qe1f&Qe1f+ zB8U)>B8U)>B8U)>B8U)>BHD&@HAN61AVm-%AVm-%AVm-%AVm-%AVstd>1v7~LO_Zj zLO_ZjLO_ZjLO_ZjLO_aW8`9MjL4<%5L4<%5L4<%5L4<%5L4<%5(Ke*3DS`+ADS`+A zDS`+ADS`+ADS`+ADWYviS5pKL0#XDK0#XDK0#XDK0#XDK0#ZcVkglc(A_SxeA_Sxe zA_SxeA_SxeA_Sy}wjo_j5kv?`5kv?`5kv?`5kv?`5kv?`5p6@dnj(l0kRpf>kRpf> zkRpf>kRsd=e*Tzd$-Ic~sz2VZ@~1Sr&u3-2NaO6~O %*GUmo zMZ8|*`Cf)sKWXK2d7H13ESjapUOlwW$(GwAd >X0{XG?6VQ*9pMZWk{9KasBkHHakEovxKcarD`~=K{j(!f~3FyblPe4CbevqHe z+*>4NYUYq4oj;iAWHVbOQMrm|yLHFy&)TWVtV64GZq|Cscy)I(Gs~0w5llP*99&iT z8d&eFn)CN&wY*(2H8bcAHn{N1HkjubH!l*$H63S*xOj;2_#s-a;_RVxT-aG^&(dPP zjMiqX%Z*tvo6D=c+pEuuWKmXmW(GdJ&*BxD%zf>lMV+rbw4n2~hZb|b_RvDk*B)BL z`PzF0lGE4T>%jKj1h)4!u)Qw>+xt4Oy>9~B`!=w>?*iNV9@zV;Ew<%6zPrm;3v<4) zE1Fk7G3Ohzbd^>g%zkG7-_d-T%pXt*9BlGMc$3%RP2Pkzc^ls3%kU;&g*W*+yvf77 zMC+*$c{$qTVP1|ld6<`@O&;duXp@I|Iojl5UXC_-n3u@px1D+!XS*d~6{p31rFpn< zy?XPMq{SkS+JhocjsuxTtI0s-(c&_Yd9>E_F>hWGBsum+%!eHNBj!Vn{SotM?0?bb z{e6*`BhI TM8hP`wSJ z9jdoMv_ vn^ jlleVZER!Ijk2nPml0& zWc7+P9M+2fFGpe#;N^%H#7k#={HINJZ&vyvZ;W^wM5FC(5Dl!i!Qf+v)}Y=9(Hhj- zAX TM9MLA?#4HK?~iv <_ zd{gZ@!UEijA8+5X`01=B=cX;-VV1|mVz(&lwy%M;-q7n&sUCVgs?0;LM}>Ik^{DO+ zy&jd>q1U6TI`n!}M2B9FYUa@EQHdOSJ*tR9uSW%N==G@H4ZR+fx1ragYBuzGRJ=M{ zs@ZCj9O+yJ!vASo_4eDPUEKhebk2F3Zs`#R#dZT|!`-<}5YOXz8aHk4+rFJ0_Ti1% zUdB)z^fHEuqL(pLA-#;Da_MCZ)y{uvQ*f2uFRRGh&N2UI&VWX4NJbk*ERQyf7$0pI zu|L`{%7oE|#j*lTwWATEIe4^TG&zqpjArf8hS79B+Ax~uM;k^9fYFB0%3!o%v}71< z7_B8br~8|1@nL%wzci=n=DC -JJ=y!M+SSzPhc;X z;lmu1O5>z@B+@}%1%e%tO5uYY;?)}L*KGy<^Cm8;A3pA38P=+El9BhINS -mdN0zOgi45A0i3XF&Mx!+Q 8tWsb z(OCccR^QE|u}?`{Et756+I*Ro$!hx_^;6Tkr58|EXH|J$#2-w5M{M4?u!zi~_NA-A zqjTKQv?d-tm=C;m8cP;QvNp%~<{b;oQ+5H4^v7Da9O!qR_j}qlYit{0LbV`=u#K`j zgl&}OA#9^OKiT#X4WXhE!gjFnK7u>gcptHi#=G0I^_Xt=TlbN95NWk C(IbWmkKKpZcC^2aW%!cFG723t~Sli z*zcaC7|?FnX=qp%sX4qU%=#!?0*^LtN#jnjFvGJj&yIB8o^$zn`=@AI;-8P?I)tFK z?!Crk`&OR%84%lRc7npFHK2~75sW&F>#e%fQ8Wdwg;BpaL_IT GaN8_nW2QDpBYLpdYPewqCcA)%0weGlu-0DLkUJNGn7#DGvhEpDW%I< zGbkwfnV~fpoOOnyjQ2C+FhMDt^fE&UML#o?U^r_AqNH gn}1h 9*gY`|>0(HFTZ>TBq4VG~hNz=N9h% z)wx4lbt-@JLf*S1Gll!Ub2ISrGxIX!`coEl3-4+73qXW{-S$>mXax}1Yky@$a@$); zk-Q$Psa2RAup|qT#`Uey_Be{ Lt&nCNUZphaaNA>+G{jPxbp^Za zSO_m3hu1!{B=z)|MP56b&;9)TWIhA6YoQtZ#`}{Ep}o+_hR`19WJ750bFv|{=Q-IB z+UuNb2<>rBHiY&zCmTY0nv)Hoz0Apm&>rSwLul`EvLUo*IoS}}tDI~I?NLrPg!U#K zL(h+jG_P^p)uUn0ikxNzJuGsX74)=7=lga|bA0lCotN8=`2Cw>cEN$A>+80?aTUL7 zKQs4gmHv5?E}})UHvMvAE=IL@kY`kX2VIP6?x2fNogH*Bs;z@AM)h>i#i)i3x){~X zK^LQ1Ip|_k9|v8GYT}@aQ5_s~F{*uoE=Kik(8Z|6b)J8IeyQFv&hEF(?cJA?T)v9U zHzmz|1@myUc|`e0*ZS30_eFikzrCz&`MtRO^w}P&34s8-&<21$s!JOI^hsSB0Q5m! z8UXY;T^a!NdFdD0Dxd*CDxd*CDxd*CDxd*CDxd*CD!A5G0Sy3B0Sy3B0Sy3B0Sy3B z0Sy3B!Hu>GXaJB3XaJB3XaJB3XaJB3XaJB3ZnafF1AtUO1AtUO1AtUO1AtUO1AtWU zQd 2WTLm-# zNCh+iNCh+iNCh+iNCh+iNCj`SRX_uPR6qlOR6qlOR6qlOR6qlORPa_?1vCIi1vCIi z1vCIi1vCIi1vCIi1z&2bfCd1mfCd1mfCd1mfCd1mfCd1m;A?Fa&;TG6&;TG6&;TG6 z&;TG6&;TG6e50)b8UUmM8UUmM8UUmM8UUmM8UUn%Z?#oG1AtUO1AtUO1AtUO1AtUO z1AtWUowf>S0FVl30FVl30FVl30FVl30FVm4*H!@y08#-B08#-B08#-B08#-B08&BQ z+KnD6r9EFD3;?NsHUdZmGyq5iGyq5iGyq5iZELr15~8PUXaJB3XaJB3XaJB3XaJB3 zXaJB3+SYC*70>`670>`670>`670>`670>`66|}A0N-CfMKq{aCKq{aCKq{aCKq{aC zKq_ckyOmTx1AtUO1AtUO1AtUO1AtUO1AtV}wstG2fCd1mfCd1mfCd1mfCd1mfCd1m zpl$6|QUMJBQUMJBQUMJBQUMJBQUMJBQbF6=t)v1P0HgvM0HgvM0HgvM0HgvM0HlJp zwOdIAGyq5iGyq5iGyq5iGyq5iGyq5iZELrZ3TOb33TOb33TOb33TOb33TOb33fk6g zB^A&BAQjL6AQjL6AQjL6AQjL6AQiN&-AXE;0YECC0YECC0YECC0YECC0YEBfTf3E1 zKm&kOKm&kOKm&kOKm&kOKm&kO(6)9fselFmselFmselFmselFmselFmsi1A`R#E{C z08#-B08#-B08#-B08#-B08&BQ+O4Dl8UUmM8UUmM8UUmM8UUmM8332s-!C`<0CiTk zz2zZ4pl}2LQUMJBQUMJBQUMJBQUMJBnhV<2Zs8 `670>`670>`670>`670>`66|}A0N-CfMKq{aCKq{aCKq{aCKq{aCKq_ckyOmTx z1AtUO1AtUO1AtUO1AtUO1AtV}wstG2fCd1mfCd1mfCd1mfCd1mfCd1mpl$6|QUMJB zQUMJBQUMJBQUMJBQUMJBQbF6=t)v1P0HgvM0HgvM0HgvM0HgvM0HlJpwOdIAGyq5i zGyq5iGyq5iGyq5iGyq5iZELrZ3TOb33TOb33TOb33TOb33TOb33fk80kWbkhY41m! z)ieM|1vCIi1vCIi1vCIi1vCIi1#N4$k_u=5kP2u3kP2u3kP2u3kP2u3kP6z?ZY34a z03a3603a3603a3603a3603a2#t=&p0paDQCpaDQCpaDQCpaDQCpaDQCXj{9LR6qlO zR6qlOR6qlOR6qlOR6qlORM56|E2)460I7fm0I7fm0I7fm0I7fm0I8sD?N(9&4FFOB z4FFOB4FFOB4FFOB4FFO>+uE(90vZ6M0vZ6M0vZ6M0vZ6M0vZ6Mg0{6=Nd+_jNCh+i zNCh+iNCh+iNCh+iNCj (j@-~RHmkG^>nwgu{A^xT z`5G8}-NIPq`Qr}W)lU{_k<2UOA3ek4zVd~)&ui~1Z@`s*-^RH};zd+#W=S;93p47o zRX%^%1r9F%X?uB+Euyl@v&3=9Kem^w^Ho|dldadgyJ(SbW~(GbHUx2DNsh1E5avbt zSmv1lpBKBpFJEu}6fM*2K8a>&b#eP$=YqIcq?sAseIk8Q=9_AHd7H13tp54s=bQC9 zDH;OmzX78k7RU8dQdasfKFRXpEQTYA&tf=w*>QOu*`WoapB-8_u0PHWEg0_FftG^g z+QEU*&yI@&v2bwovO^0-KRXVylr$V4&n#Ln`q`m{qn90GFfPwz-QmE&T6Z{L^t0no zv}nbDVkvdt=w*i%40r7y4Tr0CaA5Sa<50959KGz&g3-^8!z>Lnv$(|aadv3I=x2u( zj$U?X!RTklVV0_7hZc-}c4*<~Wyf$B|Ii*^JjU65k-tl#b&-_irZE4pGUs-?qmQf4 zi)2xs0!3wdZ;m-oRUBaw9iNRbiO$tVm_!F|BTU|cW1tZxUxqjND!j?p;Z42?Z}M$; zlV656`E_`c--I{$ZFrO4g*W* ev%6LO{H-I aBEkLIX>> zZ(0kFn?*D$()mM(Rt0~%mWAEh7VKSIJg(wwu?z3&?PH#n)uu>)Fy$tG%r{wu>c)v? zP-2~E24&2NW>6}eXa=pAPBeoSN++5@>!TCRpk+~~Z)UM=2AUOSEAZS6^c1gF(OsPF z6Y2A&OK9K5g0g6oQIu1ojG_!1WfbMxFIp{bCwFr^7L`ViLv~4>PBKHpYCrO?w|{a^ z`vWgWLp< fk}IUp`aThvY~uZE=|)N;B8{G$i$+<%XMXB_v4^NBoq-=tO+!+ zBBm6J5--+hR1Cq1H)e{e^chO3a9;Uu4?14tt}1iJ~mRi*3{=R>*Wh(P71!g5Js( zQHzrnnOJmqu?0IZT0}yTVP*7=@;L>66kAHKSaf)CE8i;^nKI@|GNE8}m~o1KLd3|# zBEpL`hlVZ3&W9MSV3e4#hFj15Q=F8YOOIN`S~bV;%Tmn@g`e6Jf?S?o%sgO0nqh zV$H%cD`rk&go4pw#un|=h>?j!h8NfJ-+kAzJ`?;=Y%v?&P76hc6}R+#ViB46Z3$G* zl`^sD@ZwbdbZ8L?MT8Y=0u5V^oeeEYu_*CkjkY;gK9||W3Uz9A%pHt~`bFj!rC3B1 zV;l8}6*8SrbXc*b;CYoXCoM9u= a6#a2D!XAx9hnE4$ zpAIoX!RRpK7XNgJk%>iw7i$g;T#lU$F X{lNzaLbhxpF zJ2`5Ef{|gywHvUtI@ZiI(VkeFWi+D`iw-Yt{ZEJ(p 2&UYGi^DVa5h^YUNBR79C!!S$Jl}%t?$; zFgncGqMaHsGO@_;GJaoHTflqFdN6u7X+>rj+irMZQT7N$hm`@+_lQM@7MWOdcyTL# zGPH< ~p<&Ch^C3nn7$s(`;ns8il&BGkMu{7l5+E|qSO>l- z0j|xZSDuM5V;lFWl{2MSba=65;h7aPCow|7=rCi8c51}P#3IAX=sji=>}lIFkr~Fh zld=7vImB?ivT*zFz1^}7D{kpehZdPwba-(pe>${?gd)O iz7hAC21zCp{ zkx&pTUq7Z W^iWXGt_G()mOA@}{ifDk(3nK7E%IWtwMy{o7x@xOjPSd!5CP z$* BwFN8Su{(li>o(JNm?xOXpt7lyfU`Y zI0ts~f)mX($IXp^n@bKiN8CtobHt4VH%HtcZhq71W*HZY=rO)evMP?YlF5=qbiazr zy>bA*KWl9)lFA4uFQOt&S3AjG{@wOZ(IPf>Yq`B{{_GOlSi6Y9v33z k4U`WDb_3 Y|lSonw5?K)qj<#Jojia1NFq&602MG)2tO3|=hP{M}wg3@<{mm?D! zTB(KgBEZX$SOj=E;sx>2S$NM * ?mB{w-+wr;vvf82eVh%nC(nd zuHxD5>f6q`z-)=CbRMswWxTq(nHeYfBcNog^{XmhyG^Iro!NYuird+T?SO-;ziq=_ zZ^vsMXA2YZJbu_$`pc^o&b6V}BfdHn!)!n24+i`qN!Dh_O^#Qo*-SbD=#1>ltZ*|E zdtoSfGWYGGyExljef4?s_s-3xuRT<(eC?sK bbw=~0sffEGaQj{R^SRl0r MeLx73Dx{<9CxeOL=ac#d0>ROB62pLg*$(-BUcF1Qc@o{562D{S@-tJp>zch? z*9_t5@-| } zoR%Gq`z)hfoJV3iJoi}UITqBiE9C7|D^f%pj{7Y0B-LXXIsR2UFCV#gH-5)E-o9ne z`;RU7S^PN5^T@;yr}Kb2_8=}SA#^s*o!xqfvxYI2Er7pi$9!I-k7b@k*@soSdEBkx zz(TWgU0D^Id9^8$=w0qSi|(G}Y>M^vP$JLfg}K+|aM)q4*%Ku1*Lm4)31*ws{y3*O z+qnE}oj)bp&7x&Fd9v9{8M7B3nMLv*i58jtU7G~^ c?$QiF!<}hTZt;aXKuvkwGFN8#(+>22Uz_7i$FDoE7O^RC_shy0Nj7)bcb8s$Zi>Zo zvZVLs6alTJyo{kkBQIm _D)-I~4W9_2y zI@T_#v}5g}qC3{^fck6pzp1$^wQczHzSG))d5Sr7%hl5yy7&4;yD&Gq^~EOL-+KeI z)9394 -WH`-or{6^dBjo)Z{z41eO@g2X>_Il$t+Foz`kiCxF?+Wt-$zHmLy%?8oP0#3K zRR7Er%yoSjartHEFW1Yw%57&9!@a$rdb_52yP %U0+a)z8#k?KONilCn zb5hLP(VP_Xb~Go&ydBNSi{m+oPGV*1 *Otw%fx_Pfy)G17 *|jwYj&REc4aEv@#FLh|Z%w`#Y5Gtmw2w zKey9_8^3Y3ErZrE+_ZTF?)VO1-`40Iz 5+t!1NJJ@EM z?HePWAKDp`;hheM_Hn0WS|+P)0T}-7iVlV>sg_%PZC`m2)xGHs{GC~+erT%NtkSjP znoh0WK3W#wnKB=X7Cm(y&e$I;uVcf_7VgQjs-HD9!TMQ4b8RPgKYrFM1S=zrTL|hr z`PDqC_uLK_ndUV!KREKQ^Mux()c{H8ZPpTKr}J--#OBeh&Fr~CIAZMdXFO~ADK5-& zvjdh=9iQtWEg$2;yon=3K8!GI8KTZ@n-1J?v-WuV7Vw?5u6aDGC_b3B-F% f zik7B5p=m%n@d<+Mn})Vee$}koPKSfS=s!-NgQDMcexU=S*MhEu;^3(RrNQVuf}n$< zpBa}rFnXDxgrc7rhY5;KrMNYNf})=pT7$8DhO~WBM+rqgGY%7!!bxv7Q9{wr3?&%O znh}N)*8^Sk)8V!RMU9fD)eHxWUS=H1go2`<8A>pEnW2QjT{9@0^fKd6tP~Xe%us^S z%M2wH{meK_P)h0QWrh-per71a=w*fyihgDsCa6YcD52 qei1i1qsNF;v_6v zPP#e|N$#GRUVd0F<2EY>y Gw2lkL^J64yz} $5y^0L#1Z1C`%1AS-rj;V6UVm4;Q2;&I3b1igjfpi3DFeZ zlMqiwG6IQdWK2gq3GsBqlMqiwJRzPs_eahBJM;R_g?ZY_yiWJ-;~Rj3ZYK@Bha~9} z?Er%KZ1#lIFps+wjq-VCK@Ai56pgdlx=_PB?h-}W*%Z{h3#WYP; NF}m_h`;G=7r7sr{6E%Hh+%H6NKgVZ9&^t0S$jeY#{TfUI#LdigY0J zs4@pKkDindWF9>*?_=IfTm6kbn)Cyi51Bbf(1*;NBj!V9&Jpt=Gv|nTlsTO~!FX=o zH65ScM|Xk=wCz8^1lsa|uCqV>^x zCBwDnhVWpyZP6Kl&Jz^@U#=U#fdzi&X@TbTjr9l62ESag(?xDRe6xM9tQmw={OEef zqZ3!1I<@0d_PU+dw$=vL&6{seG0|x^TBPx#c?-{g=K?#=jhUAD?JJ6kJg;2e-s!9p zcAu~u_>SIASA6|dh_;E{p{?$2$$Wh2;X`B|mh5cf{q|kMEDhOW4YM?4H#N-Ckd4zY zOGEZZ!z`igP$x5!Z2LrGsE@OZF>Jd>KE|%~PWBkX^}!q1M0FlMdQ2AP-Q1CR$4<5U zV4ftMZT2s|z3uD>o2MkqSw(Wa{W7zF-4`45<+3qot;0LYu7o9apIX8J5l}T2%&xu{V?fz|Kx@yV #0MMyi# z+`A$-FFRkyPy745V5QqBT+g>`x;HsAo=qMPqiMWoznAFq=;wG8&wUZvFnV3yhyDL3 zMMX2CJ|I5zsrB)k^fE&UML#o?VDvIW2}S?Oki!H; BN6~4XFCWb<{iVoDazlBs+}r7N3~Zm1D+k}n>fBq~zt{5lwR0!G)zZfn>QeHt zg<6(6hpM~hjDtSi5X%05bK6n)2OQmwvX4%0LyZr*uNKNay4B`o|41V|TDgR>A2ffC z;18NVN9+g9pCk5z=FbuPD1SP~_s@rt=EddN!wLOkcd7X*{5&trTkMCtuC>!>*Y7+V z_B!03wjHWzVLoNAa>^eNL~n<6xO7C)42Yq>R#E}sTthPk!h6>pkd0nO94;9d17Z4~ zt7ZF?iwcNdMyO!u@2L)@fp#-;8KHu~T_YF+@$qg-XCRz4f-w-jd+dN&+0TeWeKH2( z A00mGNmC+sJA8=w= H4c`IAzjeSqc-CHa&)5v_kipw%u$JzdyK!ELI{lc?! z`
Z9<=lMhK^*Qzl{e @2a9Rq~i*+iwJB z=4r;w_T+!J>+ODlBa|UD>z|AWO+qIdLN&3|K(k1ab-6OD{-{b ey%zPWYVrWr)ScxI!BU+u232G8$c^pVO?3d3hT HZ3~3I*cl;D=SxFU0Jz8t~yh#ndq|m7<3iSb_ &iU-Nmm!^- zr-7I8>h5Nin@=@9f~nZos^w)9o#XiCw6@x;QrE{nI_T?#^T1DGbaoZ9l{xc_nthx3 zzlZ%IWatjZZeRc{+auG*O}R8*|9ITd0*1YV`#xPQ%!Rf0`dcZEOZ#6r`H-y4jf;;L zP7V{DcgXJ^03W<;>bOtduk-E4K1Dve9oi3CjEDAv*6N}Cpr!mMKSx@4(Lyt{9}#|z z#3RDb5kH8Z&VFUz`W)^FgD}<+7h$X;2EtemIPOPSMQZTCe#CmfaX(@`;J6>Lj>f%n zS91S|&HiHq *#@(qv0NS zIU3D@m!rYz?0KHwsTcIUbAimGu?u7#jcp+F!ec+ESt==t59SkcW*5F!!{yuN&(Ye< zEZaTQ%-m%>Y?MXqR6c`aRBXOfmuC0w&&&ieA2M@}pbwcjN6d%JoFnE#X3i1wD04bn z|L22)Q%_8WTR=x9o!eIXEzn((&6DWf+;`ed7?+==S@Q|Htu}_-{dD&;hxgojcpt4B z!aHv6qpF1b@nibLko#|a0*iw1gWY49nArVy!0|% Yk-=1}E-`=x7QG69wRcvmxpyT$7tFO$?Vw0IKB$>-P=j4~4 zKHD3xK^_C(g*Jd|Z2&jg0B*GbywnDORPaJu1vCIi1vCIi1vCIi1vCIi1vCIi1=rdt zpaDQCpaDQCpaDQCpaDQCpaDQCxY1St4FFOB4FFOB4FFOB4FFOB4FFQXt+oni0FVl3 z0FVl30FVl30FVl30FVk^YO8<-0I7fm0I7fm0I7fm0I7fm0IA@WwhCwfkP2u3kP2u3 zkP2u3kP2u3kP2RFtAGXoselFmselFmselFmselFmso;&a3TOb33TOb33TOb33TOb3 z3TOb33f^j~fCd1mfCd1mfCd1mfCd1mfCd1m;7e^4&;TG6&;TG6&;TG6&;TG6&;TG6 ze66hl8UUmM8UUmM8UUmM8UUmM8UUn%Z?siF1AtUO1AtUO1AtUO1AtUO1AtWUt+oni z0FVl30FVl30FVl30FVl30FVm4(^dfu08#-B08#-B08#-B08#-B08+vC+A5#{Kq{aC zKq{aCKq{aCKq{aCKq|P{s{lO^9q0iE_wxn90FVl3BY;#u1AtUO1AtUO1AtV}wss3A zAyNSi08#-B08#-B08#-B08#-B08&BQ+O4Dl8UUmM8UUmM8UUmM8UUmM8UUn%wzXSH z1vCIi1vCIi1vCIi1vCIi1vCIi1#N4$k_u=5kP2u3kP2u3kP2u3kP2u3kP6z?ZY34a z03a3603a3603a3603a3603a2#t=&p0paDQCpaDQCpaDQCpaDQCpaDQCXj{9LR6qlO zR6qlOR6qlOR6qlOR6qlORM56|E2)460I7fm0I7fm0I7fm0I7fm0I8sD?N(9&4FFOB z4FFOB4FFOB4FFOB4FFO>+uE(90vZ6M0vZ6M0vZ6M0vZ6M0vZ6Mg0{6=Nd+_jNCh+i zNCh+iNCh+iNCh+iNCj `670>`670>`670>`66|}A0N-CfM zKq{aCKq{aCKq{aCKq{aCKq_ckyOmTx1AtUO1AtUO1AtUO1AtUO1AtV}wstG2fCd1m zfCd1mfCd1mfCd1mfCd1mpl$6|QUMJBQUMJBQUMJBQUMJBQUMJBQbF6=t)v1P0HgvM z0HgvM0HgvM0HgvM0HlJpwOdIAGyq5iGyq5iGyq5iGyq5iGyq5iZELrZ3TOb33TOb3 z3TOb33TOb33TOb33fk6gB^A&BAQjL6AQjL6AQjL6AQjL6AQiN&-AXE;0YECC0YECC z0YECC0YECC0YEBfTf3E1Km&kOKm&kOKm&kOKm&kOKm&kO(6)9fselFmselFmselFm zselFmselFmsi1A`R#E{C08#-B08#-B08#-B08#-B08&BQ+O4Dl8UUmM8UUmM8UUmM z8UUmM8UUn%wzXSH1vCIi1vCIi1vCIi1vCIi1vCIi1#N4$k_u=5kP2u3kP2u3kP2u3 zkP2u3kP6z??vPK}cs*Yr3;?NsHUdZmGyq5iGyq5iGyq5iZELr15~8PUXaJB3XaJB3 zXaJB3XaJB3XaJB3+SYC*70>`670>`670>`670>`670>`66|}A0N-CfMKq{aCKq{aC zKq{aCKq{aCKq_ckyOmTx1AtUO1AtUO1AtUO1AtUO1AtV}wstG2fCd1mfCd1mfCd1m zfCd1mfCd1mpl$6|QUMJBQUMJBQUMJBQUMJBQUMJBQbF6=t)v1P0HgvM0HgvM0HgvM z0HgvM0HlJpwOdIAGyq5iGyq5iGyq5iGyq5iGyq5iZELrZ3TOb33TOb33TOb33TOb3 z3TOb33fk6gB^A&BAQjL6AQjL6AQjL6AQjL6AQiN&-AXE;0YECC0YECC0YECC0YECC z0YEBfTf3E1Km&kOKm&kOKm&kOKm&kOKm&kO(6)9fselFmselFmselFmselFmselFm zsi1A`R#E{C08#-B08#-B08#-B08#-B08&BQ+O4Dl8UUmM8UUmM8UUmM8UUmMH-PUR z(=3@6@m=-DG`ma6Dp^E}Bw3fMxJq8$l$H6v^7gZJx?06W6u(c)%MTY klR4r}m}EHA2MNQj@9ArEWus>;^@;hUD}b-wr^U+q{1zyG@Z z{XAc zm+2yj7A6CuS!$Bz%~O&Vi@Z%x^vqgFA1?@TToZiUg!W+`ZxZL@h>zfW9PtsHk0U-1 zAD#JQUZjs@o<(;_Hcz7a&Qx^yS(-&p@oH5I C!FFbeo>cbyt9W}9-qUjh^8@7pV$;`e3;`IN-f zGBImovxeQw%nEnDsiNmaw%J+Ec1zvcpS4$-EoGI?&HTNLS9dqFysGj?nm^07;x{eC zb-qf=rHN{`isui_x_?%r=0A4<0l=M2=yp)%akg0Pw+mOFHh(TJF0ag%0ts)JjTZrI zTnDgm6Tn6@9w<#u8IN%`n(-KCqZy9@Hd>`Pa;hWKv@mOB_XhN M%cCG*%-6i;sYrAWqV$lykF<#_T;{46jC`i6@lYiqo4{Zf~G$s z9j+3naGYxvDjN6Ng$k#aIfsh}Dw=-gD8uPxjxw5l<{Zijtv5wf-pd?iH2us`hSSR& zWi cKXVQf znaWi!bCl8aGe;SYv*u8#>SxYjB8Q!=#?~AvnttYJ500zma0kbEFNq4rS#zjp`k8ZB zbEt5fH3y;jMSGr8Zpw8!PxDO~-52q@WPgr&^=4L>hF5dcvo7-cA}LK*=BLXzyEkod zsFsbj8y0W-9g(njTf1TLwqJY*i?_8K7H|7*{;+sky9n>k+x&fsi|s9ds)*O!v&gHT z>>pvhXq##3O8@Z_h2X^VBo8mdJzR@>xDoeY zvGR2gE8hgM@@)_+-vzPqJ+RVgU#XvZ8}z=6PNT%qJfR=muj116xZJ<*E_6SBp78kw zeCUPmD36^9XZTWkl*i5lMDo~~kVqao3xz|EXbK!Ps#YFFJX(1a@o42y#AAoY!{r!S zgoNUe <9<4lzc(n3}Ja(4Ff8NAJ^+UinNQJOHU{m0Y zd%#w~+xCDB#4y`O-g<;8-O1y9#CEXpK4LrAcptHi#=Em-oSVb>=$&~-;eO3{^~HVB zY;M=9IIAK{m-nf5&^VrI2aVaOc0!F0+R~ni2W@IkwS%^`r`kaq+f(hJt?j9H(B}43 zJ7{}*svWe!J=G4{;+|>;ZE{bwgSNS++CdxLQ| *xdNk8zR>k##F*A1%>*JVc9cTOJrhtu~wr4W+>t<$g z`^HjmN#|9mPs_AQB6Aj9#B=jzr+D`q4Y;y 6Xwdi9427>HX3?ShU)hS7dE(=~j+`=?v+1Jf0g9qB6bDc2{1$ip>De>(^A(?~d)i z+!(#F+}-F9!uyM>ugv;wlPzk{?aMkj-qE|tIo{EW$~oTATgo}!(JRV1-cioCO)Y4D zCYkdb? M>)^&j&h#k9p(H> z)tu*eM>)^&j&h#k9pya7JIZ;Eca-z5RCAu=9pya7JIZ;Eca-xS? uW%;>pY$$lG-ca-xS? )^&j&h#k9pya7JIZ;Eca-yOC$mP*bG)OR=Xggs&+(3O zp5q f;Bj-8ZQO M>)^&j&h#k9p!x6$*hs{9PcRSIo?subG)OR z=Xggs&+(3OzU^ez$a#);l=B?#DCareQO M>*eiGHc{K$2-b-j(3#v9PcRS zIo?subG)ORZ#$Vaa-QQI uW%o;h*@s4ty;~nKZ$2-b- zj(3#v9PcRS+fHVUoacB)InVKqa-QQI M>)^&j&i>3WY)-e zj(3#v9PcRSIo?subG)OR=Xggs-*z%< )^&j&h#k9pya7JIZ;Eca-yOCv&i8MvnB5qh4Z;ca-xS? )^&j&h#k9pya7JIZ;Eca-yO zC$mP*bG)OR=Xggs&+(3Op5q f;Bj-8ZQO M>)^&j&h#k9p!x6 z$*hs{9PcRSIo?subG)OR=Xggs&+(3OzU^ez$a#);l=B?#DCareQO M>*ei zGHc{K$2-b-j(3#v9PcRSIo?subG)ORZ#$Vaa-QQI uW z%o;h*@s4ty;~nKZ$2-b-j(3#v9PcRS+fHVUoacB)InVKqa-QQI DA~FB5&Yu=Z@$#mu z;wmXGu0DO26lI!cfBoBEzPNaKaeJM`kI9$q<&ViK&!VzQ9(UIqdsF?*eUU#^OY{(l zue}$6@m&YDcN5s&ZD4yZ1KWEQ*xu_f_Fi0t&A+|9K>4?~7bySs_5$VK-d>>m+uIA2 ze|vj@@^5c1Q2t#9&cD6AK>4?~7bySs_5$VK-d>>m+uIA2e|vj@@^5c1Q2yNn&cD6A zK>4?~7bySs_5$VK-d>>m+uIA2e|vj@@^5c1Q2yNp&cD6AK>4?~7bySs_5$VK-d>>m z+uIA2e|vj@@^5c1Q2xCPoPT?Jf%0!}FHrvN?FGuey}dyBx3?E4|MvC*<=@^O%D->g z{qMX;A4{_XUa#Wpq1^3(!M^2J?R8~Ur0aFEh!%125asbh^pxj|-SxMht<%*iE~5B- zT3&t#Ywmqmb3XucziESgir^pOUy*CWZO0`KB@_4kmopLBlUQHtKT =1_%r z+YY>6ZVonpvT?8hlz;!&hOpig>s4Y-sXECMt>Y}&B>_m`-?b*16wcqLi}Z(W2G`je zRYkmB -6G-$Ckv)7+L~)8AHp#H*J`IO7F|~X*Vp#?pNLxxw-#o*$kXu?Zs6{ zYu7=o-2}CE8`Rp%pw=#0YpA05aT>r{htmMoI-CZu*5NdOwGO8NtaUg=_1%xt0M WI1ON}!zr3={WuL^t;1;mYaLDlSnF^az*>h>WbNnee7Y{u@-Z&V z!CZa1wwqXQe_o%pnbsoHYqXtAqw2#tiITXiuCqK#ZofVH?^#|{OWP01e6#z(aSu<) zvxm#St39mqvZ~Kvz=Cvwp`aDIY$%_U<{-5KyiJT2nOJmqxvtEi_K$-Wkx)cfu_n;O zikMO?O1xO3J+Crmg<2<>^%vg3C@~|Vesn``)LdyD_D1~@MOlOw+o(^hkm-b?!-_Qp zy_GMb7AGw-vFPw(3wC0(h=d};%IF>Ca|-?_wv=A6= ?j!gcoZL4O@<#4>4N7C^2IVx1Rf_M2%21O5Dhl0FimdI`G3bmtJ`$!i;U)r&i9C zV$tEnnuTXp%$&ps1*5}^E!wFOBNK}ZFRtak`>thuCitV+Vm7>;7K#olZt45PA~NyY z5~!XlWn$6c#i{)1&>|9w2rJeE8nzre8(NfNQR2lKZF8=CF0+dj>eT9(I~Wo5i_9-d zv4|+fHtG{AWICbfuwqTY^D1LbT4Z9;;l&p0#Ap!-MTV8}JIdMu-i9?P`r~MXJsOJ+ zF9Vc69b$xn(P73d{^<}S6N?Bh)*KqR96K9gw1QD$#u{!j_fLo#p=gx2ktqRZySenq zGZAKN<36==rWA_~FGBJcQH+xqp h%jSKqhU+4GonT<8YOP5@t&J* ztYGU@v;Ja4I7;jY)d7+D#ya%F7HQ8WPF&cCaAOdZ?k%>iw7i$g; zTbi8@F =B9%D+8qO5sMBjGO_6J z;#U4-Xb}lTgcWN7$thn%ElRN{@nVg(nf1>_FIK2Sx0W8kC@~|Vel5j}Z8ST!gc0Gz zHtG{AWICbfuwtzZ=T*j>w8+Gw!;3B0iP0hwiVQ3DBq!P{TMx!Gwv^9uI&FKb!;4$_ zUcrb=`p&(+P%t{oIK@99Vq{_w;l-Lm! ^wJQ6m(M5;rm>KxCe= z4t!GrT$@X;JQHEYHttg^XG*c?@M6uvGb?6JVuXUxVa68i)QFLZMTVErd(0--)3#+I zGmLX5WBWmKh~au=;r8EqyJa0#+|r*8Ei$p_@ZwbdbZ8L?MT8Y=0u5V^oeeEYu_*Ck zjn=y)i_9)osCANAf8iaB5;G#|S0Y9v77<=-NGDdvbVAW#MMn7|YH`vc6N?TnwqU&r zvJNdGp&(YieoV7uUc`6RA7^>7NQ!8-%I6O+Z^|mJlJfTWW-p1$%C^NCSioGJJ==fp z?ZFTwQ;S1^j{$O@1|c$mC@|ty`ZNd;i6cB8*1VZg$x;eLgAr?}&BT5d8nNOWx@Yu= zM1vC%xrd+F-IRy~5}pwo%qf*Eoj4Tuux8#F6)h(rGJz;CVvBT2gowl;z(+lk$+oj@ zT})te_$;C0`{<|Sc^};iM1c{v)V(4JKdn2@9fTrL;KZr+sZb&lNO(r9sWWV;btaT( zMWVrpHP(7|pA0ENp=huoqxtajiFL>u&5!R^J+fE{&xvisCsn+Z0#RVZntbO}x}1~< zMWVooE!0U-A`^%JBcpeVO{AyovBJ+J&Yg+v2hAyjt1Fc=kGS}7YkeYw$ONLH5Z4lA zB7`_gmQNhv`LO2Au%(tyAmK}vQXm?PSVQ%$z8aLsM54ioh}< I__Jod+dak!WyYjrE*#Vg*{Km-QF^p=huo zqxtYtymiP2F1ma)AD$E2h)=3`DFvdyh&B2A^&Va&PD+F#QQ*WD>ZB-<2}FRAx_pZE zoi^Dyf$ie6j85G6DsbY~yI&{*rOTCGQlTiY;*|VkND+!8JSW!d8Mf>?7gE$h(O|_I zY(39UhZd<=G