diff --git a/ebitenutil/debugprint.go b/ebitenutil/debugprint.go index 71005c5da..5960a4221 100644 --- a/ebitenutil/debugprint.go +++ b/ebitenutil/debugprint.go @@ -12,20 +12,32 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:generate go run gen.go +//go:generate go run github.com/hajimehoshi/file2byteslice/cmd/file2byteslice -input text.png -output text.png.go -package ebitenutil -var textPng + package ebitenutil import ( + "bytes" "image" + _ "image/png" "github.com/hajimehoshi/ebiten/v2" - "github.com/hajimehoshi/ebiten/v2/ebitenutil/internal/assets" ) var ( - debugPrintTextImage = ebiten.NewImageFromImage(assets.CreateTextImage()) + debugPrintTextImage *ebiten.Image debugPrintTextSubImages = map[rune]*ebiten.Image{} ) +func init() { + img, _, err := image.Decode(bytes.NewReader(textPng)) + if err != nil { + panic(err) + } + debugPrintTextImage = ebiten.NewImageFromImage(img) +} + // DebugPrint draws the string str on the image on left top corner. // // The available runes are in U+0000 to U+00FF, which is C0 Controls and Basic Latin and C1 Controls and Latin-1 Supplement. @@ -51,8 +63,8 @@ func drawDebugText(rt *ebiten.Image, str string, ox, oy int, shadow bool) { w, _ := debugPrintTextImage.Size() for _, c := range str { const ( - cw = assets.CharWidth - ch = assets.CharHeight + cw = 6 + ch = 16 ) if c == '\n' { x = 0 diff --git a/ebitenutil/gen.go b/ebitenutil/gen.go new file mode 100644 index 000000000..6b02de8d1 --- /dev/null +++ b/ebitenutil/gen.go @@ -0,0 +1,80 @@ +// Copyright 2022 The Ebitengine Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build ignore +// +build ignore + +package main + +import ( + "fmt" + "image" + "image/color" + "image/png" + "os" + + "github.com/hajimehoshi/bitmapfont/v2" + "golang.org/x/image/font" + "golang.org/x/image/math/fixed" +) + +func main() { + if err := run(); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + } +} + +func run() error { + // These values are copied from an example in github.com/hajimehoshi/bitmapfont. + const ( + charWidth = 6 + lineHeight = 16 + + dotX = 4 + dotY = 12 + ) + + var lines []string + for j := 0; j < 8; j++ { + var line string + for i := 0; i < 32; i++ { + line += string(rune(i + j*32)) + } + lines = append(lines, line) + } + + d := font.Drawer{ + Dst: image.NewRGBA(image.Rect(0, 0, charWidth*32, lineHeight*8)), + Src: image.NewUniform(color.White), + Face: bitmapfont.Face, + Dot: fixed.P(dotX, dotY), + } + for _, line := range lines { + d.Dot.X = fixed.I(dotX) + d.DrawString(line) + d.Dot.Y += fixed.I(lineHeight) + } + + f, err := os.Create("text.png") + if err != nil { + return err + } + defer f.Close() + + if err := png.Encode(f, d.Dst); err != nil { + return err + } + + return nil +} diff --git a/ebitenutil/internal/assets/assets.go b/ebitenutil/internal/assets/assets.go deleted file mode 100644 index 714aa6fd6..000000000 --- a/ebitenutil/internal/assets/assets.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2014 Hajime Hoshi -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//go:generate png2compressedrgba -input text.png -output /tmp/compressedTextRGBA -//go:generate go run github.com/hajimehoshi/file2byteslice/cmd/file2byteslice -input /tmp/compressedTextRGBA -output textrgba.go -package assets -var compressedTextRGBA -//go:generate gofmt -s -w . - -package assets - -import ( - "bytes" - "compress/gzip" - "fmt" - "image" - "io/ioutil" -) - -const ( - imgWidth = 192 - imgHeight = 128 - - CharWidth = 6 - CharHeight = 16 -) - -func CreateTextImage() *image.RGBA { - s, err := gzip.NewReader(bytes.NewReader(compressedTextRGBA)) - if err != nil { - panic(fmt.Sprintf("assets: gzip.NewReader failed: %v", err)) - } - defer s.Close() - - pix, err := ioutil.ReadAll(s) - if err != nil { - panic(fmt.Sprintf("assets: ioutil.ReadAll failed: %v", err)) - } - return &image.RGBA{ - Pix: pix, - Stride: 4 * imgWidth, - Rect: image.Rect(0, 0, imgWidth, imgHeight), - } -} diff --git a/ebitenutil/internal/assets/license.md b/ebitenutil/internal/assets/license.md deleted file mode 100644 index 74d967ac0..000000000 --- a/ebitenutil/internal/assets/license.md +++ /dev/null @@ -1,19 +0,0 @@ -# License - -## text.png - -``` -- -M+ BITMAP FONTS Copyright 2002-2005 COZ -- - -LICENSE - - - - -These fonts are free softwares. -Unlimited permission is granted to use, copy, and distribute it, with -or without modification, either commercially and noncommercially. -THESE FONTS ARE PROVIDED "AS IS" WITHOUT WARRANTY. -``` diff --git a/ebitenutil/internal/assets/text.png b/ebitenutil/internal/assets/text.png deleted file mode 100644 index da8909a0c..000000000 Binary files a/ebitenutil/internal/assets/text.png and /dev/null differ diff --git a/ebitenutil/internal/assets/textrgba.go b/ebitenutil/internal/assets/textrgba.go deleted file mode 100644 index 12dd74450..000000000 --- a/ebitenutil/internal/assets/textrgba.go +++ /dev/null @@ -1,5 +0,0 @@ -// Code generated by file2byteslice. DO NOT EDIT. - -package assets - -var compressedTextRGBA = []byte("\x1f\x8b\b\x00\x00\x00\x00\x00\x02\xff\xec]\xed\x92$!\b\xf3\xfd_z\xee\xef\xd5\xd6LKBP\xb4\x93?W\xe7\xee\xda~DD\x04\x1c\x86a\x18\x86a\x8c\xcf\xe7\xf3\xa9\xacGU\u007fu\u007fU\xed\xef\xd6\xdf_m\xfc\x1f\xd1>\xfd\xff\xef߿\xfb\xfb\xb3\xbf\xf5?\x95\xcf\xdaɌ\xfb\xaf\xfag\xff7\xff\xcd\xff\x19\xf7\x11\xbe\xa1\xfc\xfc\xf6\xfb\xd15\xfa\xedo\xcc\xff>\xfc\xaf\x1a{FV*\xe4\xbfBγ\xfc\x9f\xad\xa7\xae\xfc\u007f\x1a\xbb\x9b\xf9\xaf\x94\x0fOs\x88\xc8\xca'=f\xb7\xfc\x9f\xad\xe9\xd9\x18|\xab?\xb2\x8e,\xff\xf5\xfc\x8f\xea\x18\n\xfeg\xe4\xfflMD\xf5\xff\xc87g\xfbE\xb4\xed\x91\xf5\x88\xac\xa3]\xfc_\xb5/\xac\xe6?z~cx\x82\xe8\\\xbf\xf8?\xe3UD^\xdfd\xb7\xb1\xfc\xdf'\xff\x9f\xb86\xd3'\u007f\xfd\xacB\xfe\xa3\xebH!\xffQ9\x13\xf9nd̐\xb1{B\xd6V\x91\xdd\x17\xa2m\xfb\x80P\xae\xaf_\xbak\xa5\xfcG\xf5\u007f\x86\x87\xa8\xfe\xaf\x94\xe3\xd5\xe7\xb8S쁻ι\fWXn\xad\xb0\xff \xf6\x8d\n\xf9\xffv\xfe\xb3\xfb\xc2N\xfe\xa3\xf5\xa2{\xfcJ\xfb\u007fF\xfe\xa3\xf6*\xe6\xfck\xf9߃\xff\x19;9\xba\x9e\x11\x19P)\xffw\xe9?\x88^w+\xff\xd5\xfa\xf9\xe9\xe7}\x95\xbc\xe8f\xff9]N\xbeQ\xff7\f\xc30\f\xc30\f\xc38\xed\f\xdc\xe1\xbc6\x8a\xfdi\x8dws=\xc2\u007f\xc4Oc\x90\xf7\x17+\xfciW\x8f\xeb\x93\xedyv_\xff\xad\xec\xc9\u007f\xa1\xe2\xf7Y\xdf\x11\xb5\xfc\x1bA\xffa\xf4n,\xcb\xff\x88\x1f\xdd/^T\xf1\u007f\xf7\xba\x88\xf6_\xe9_\x92\xf1\x91Qp\xa0\x9a\xfb\bo\x14uE\xe4CtO\xc8\xf8\xe7#2\x01\xbd\xbf^!\xfb\x9fƖ\xe1\u007f\x84\x93\x19\xb9\x80\xb4?\xbbn\xd9yQ\xc591{E$\xee\x10\x91U\xea=\x11\xd57V\U0005fe67F\xd6Ó\xbc\x9a\x95g\xd7WF_\x8a\xf8l\xa2s\xb9\x8a\xff\xac~\xcbʣ\xcc~\xa8\x88\xbba\xe5\x12\xb3\x1fE\xc6\x19\xd5y\xd4\xfe\xbc\xeaz\x94\xe7\xd7U\xfcg\xf4\x1b\xc4\xc6t\x92\xfcG\xf5rV\x1f@\xfd\xc7\x14\xfa\x16\x12\x8b\xa2\xe00#\xffW\xfa\xdfFy\x9d\xf5\x05]\xa1\xffW\xc5=)\xf4\xfb\x19\x9f\xd1\xf8Ќ=\"+\xd7O\xf6GB\xf4Lt]\xa8\xfb\xcb\xfa\x87g~_\xc1\xff\f\xbf\xb2\xe7V\x96\xffL\x1c\xe2*\x9d}\xb5\xfe\x83\xea\x04\xd9>\xef\x8a\vF\xf5\xf8\xe8\x1e\xce\xd8\xe1U<\x8cĀF\xed\x18Y\xbd\xae\xea\xe7'cu.\x9f\xd5u\xdc\x0e\x8f\x91a\x18\x86a\x18\x86a\x18\x86a\x18\xc6\xddPݳ\f\xe1\xfdN6\xbf\"\x92Oo\x10\xf6m\xc6\xcf\xea\xdb\xefW寎\xb4\x9f\x1dO\xe6\xf7\xd9\xfb\xdfl\xdeo6o-\xe3\xff\x92\xf1\x9da\xff\x8f\xfa\x04f\xefET\xf9\xfc3\xed\xfc\x96\xff\x1a}w\xa3\xba\\=\x8fY\xfe?ͫ\x82\xff\x99\xf9\x8f\xcc\xdd\xcaw^2\xeb\x82\xe5?\x9b\x93\xb2BN*\xf6\xa9j\xfeW\xec\xa1\xe8\x1aP\xf8\xd6E\xfbu3\xff3\xf1fO\xbeO\xe6\xff]\xfc\xcf\xe4\xd1\xfb\xa5\aF\xebG\xf3\xe5\xee\xe4?\xa3\x0f\xb3\xe3Ɯ\xe3f:D\xa5߬2^\xa5\x82\xff\xd9sS\xb5\xfc\xaf\xd2{\xd5\xf9K\xab\xc6M%\xef\x15\xfcW\xe6=\xd8\xc9\u007f\xe5~}*\xff\xd9s\xfa\x8eq\xcb\xe4\x82A\xf9?\x16\xe5\xfd`\xf4\x1culM\xd5\xfcv\xb0\xff\xac^\u05fb\xebW\xfd\u007f\x90\xf9\xbe3\xf1\x9c+\xf8\x8f\xda\xd5W\xd8\xff#\xedd\xed\xed\xd9\xfef\xe3\xa7\xd0<$\xaa\xfb\x8eh\x1e\xa1\x15\xfcg\xde-\xca\xdaH\x8d\xb3\xefE\xdf\xd2\xcf\xe8}\xe5\x00\xef\x8bw\xbe\xb1l\xe8\xb8\xe1\x910\f\xc30\f\xc30\f\xc3ȝ\xad\xde\xd87\x9f'\xcf9\xebgsĪ\xf8_\x91\x8f\x11\x19\x87*\x0eG\xec\xf0\x96o\xfbڊ\xfa\x11\xa9\xf2G\xed\xe2\xff\xea\\_7\xe7Mz\x13\xffg\xfe\x8c\xe6\xbf\xf9\u007f\xbb\xfcW\xeba\x99\xf8\xbb\x11\xf4uF\xf6\xb5_\xefk\xa0\xf9\xf7\x10\xdf$\xa4O\xb3\xf60\xe3\x89\xf4\x97\xf1W\xef\x10\xff8\x1a\xbf\xe3\xb32\x8e\x03\xf5\xb7a\xe3ߐw:\x10^T\xc7?\"\xf5\x8f\xc4\x1b1#\x11\xff\xc2\xe4\xe3\xcd\xf8?W\xac\x83j\xff\u007fD\x0eT\xc4\xfffƿc\x9c\xa3*\xef\xb4\"\xfee\xd5\xfbG\x95\xf9\xfc\x15\xf3\xb2+^o\xa7\xfc\xdf\xc5\u007f\x85\xfc_\xc1\u007fFΟ\xc6\u007f\xb5\xbf\xfa \xfc\x9f\x19\xfe\xb3\xfa\x82:\xfe1\xda_\x94o\xb38\xe5\xc8\x18(\xde\xfd<\xed\xfc\x9b\x89?U\x9d\u007f\xd1u\x84\xe4\xc3G\xef[P\xfe\x0f\xc2\xff_\xa5\xffD\xec\x03U\xf1/\xb7\x9c\u007f\xbb\xd9\xc5n\xc9ɿ\xe3M\x93\xee\xf3\xb5\xfa\xfe\xf7\xa41U\xbc\xa5\xd6i\xecn\xe5\u007fDZ6\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc30\f\xc3`\x10\xcd\xe1qK_\x15\xf9\x11\x90|/\x9eG\xbe\xfd\xb3r\xe6\x1dW6\u007fط\xdcD#\xf0\xcel&\xdfd\x84\x9bѼI\x99\xf7oќ\xf8l\x1f\x94\xeb\x9a\xe9;\x93\xfb\xbfZ\x06D\xf2\x99V\xf1\x9fi_\x15W\xd8\xefF\xc7\f\xcdI\xaa~\v=#\a\x06\x98\a\x11\xd9+\xaa\xe4\x173F\xc8\xfcEsn*x\x89\xe6\xa3\x1bD\x9eM仌\xfe\xc3\xc81e\xdb\xd5\xef= y\x193:\x88jl\xa2y/#:\x11\xc25\x05/\x95\xebQ!\xfb\x14z\x94b\xef\x1d\xc1|\xa4\x15\xfb\xf0L\xa6\x0fA\xae\xe8!̗\x98\xc9u\xfa\xf47\xe8{\xf4\x99\x9c\x99\x11\xfd6\xda/$\x0fj\x85\x9e\xa9\xfa.\xc3\u007f\xe6L\xc0\xf2\x8d}CA\xb9vQ9\x1c\xc9}\x9a=ی\u009c\x81\xd1\x1c\xb3+\xe4\u007f\xb5\x1e\x1b\xc9\xd3;\n\U000aecba'\xb3g02\xb3\x8a\xff\xb3wy\x14{\x9e\xf2\xbb\x99\xef+\xf9\xbfʮWq\x0eR\xc9\x1eT.e\xf2T\xa36&4\x8f|\xa5n\xa7\xb2\x1f\xad\xb4\xfft\xe0\u007f\x95\x1d@ikGr\xe53\xefDd\xcf\x11\xc8[B\x8a\xfa3\xe7\xc7\xca5\x90\xfd\xae\xba\x1e\xd6Σ\xb27(\xff\x16\xb5\xf7Gߧ8a\u007f\x1e/\xcd\xf9\xbeZ\xd6v;\xa7\x18Fw\xfe\x9b\xfb\x86a\x18\x86a\x18\x86a\xdcr\x1eʾ\xa7\xc9\xdc\xeb\xedj\xff\x10\xf8a\x0e\x91M\x9d\xb5_W\xce\x17:\x0f+\xc6Mq\xcf;H?\xcco\xfe3̛\xd7\n\xbf\xfdL\xfb\ay\xf7\x9b\xad\u007f\xe6\xe3V\xd5_f\xbef\xebtǼ\x9cr\xdf\x18]\xb7\x8aw\xddO\xde{O~\xe7\xb7\xc3\xfd\f\xf3>\xfb\x10\xfaXg\xe3\xc5\x18\x1f؈\u007f&[>\x82q\x04\xd9rt\xaf\xacn\xcf\xcc\u007fl\xf6\xfe=\xaa\x03\xec*\xef\xc0\u007f\xa6\xbd\xab\xcaW|'\xa2\xf7t\xe0I\xe4\xacp\"\xff;\xb5\xedI>\xdf\xc8\xffY\x1cB\x17^\xb1\xfb\xc0\xae\xf58;Wv]\x9bY\xfdG]\xbeS\xfe#v\xa0\xb7\xc9\u007f֞\x10\xb5\xb7\xec,\xb7\xfes\x8e\xfe\xb0\x93\xff\x19\x9e\x9c2\x9eh\xfb\xcd\xffZ\xbee\xed\x17\xe6\u007f\x9c\xff\x11;\xcc\xe9\xf6\x1ft\xbf\xdee\xffa\xec\xff+ړՓO\xb6\x95\x1b\x9e\x8f7\xf1\xc6\xdc7\xcc\x1d\xc30\f\xc30\f\xc30*\xcf\a\xf6\xff\xaf\xad?\xe2\x1bx\x8a\xff\xff\xeay\x19D.\x9f.\xfe\xe4j\xbf\xdf\x13\xfd\xff\xff\xce{d\x04Nn\x19z\xe7s\xe7\x89\x14.;\xf7ތ\x1c\x8c\xd0\xc1\xf2{w>\xfaW\x82\xeb\xfc\x96\xf3P9\x97\a\xe2\x04\x1a\x9c#\xa2\x0e\xba\x12\xa9\xcev\xb69\x82\xc8\xf6\xa2\xd7ԟM}\x96\x17ZK\tki\x81:E\xef\x12H\xb3[Zbq\xbar\x0f\xd0&\xf7\xe8GV\x19=yx\xae\xffr^H\x15\xd5^\xa4\xcd\x00^\xbc3\x06\xe7\xc9\\\x87\x96F\x16+\xddN\xbcuf@\x97\xccZ\xdf\xe2\xe4\xe8\xcc\xf1O:m$\xd66\xa9\xe8\x9ea\x16\xa3G\xee(=\xbb\xd4\xd7\xcd\x13f\x00\xad\xafqii\x9f徻e\xe2\f@\xbd\xace\x06\xf0x\xb0%\xe7\xf4kH#\x82'_\x9a\x1e\xd1\xc7͠^\x9d\x1a#f\x06\xa4S[KG\x8f=\xdaZ\xdf3\x92\xd3\xff\xeb\x9b$\xd2>\x13\x9e\x01\xacϒW\xa2\xeb1\x8f\x97\xb70z\x9d\x19\xadg\x15\xa3˥\xe9\xf1\xf6\x95־\xa5\xa1\xee\x01\xa4\xcf\xdc\f\xa0y\xad4Jz\xf7\x00\x89\xcc\x13\xf7\fV_\xbb\x1c3B\xebuߖ\xce\xdc\xf2\x1c@\x93S\x1d\x9e\x02G-\x99\x9e\xceS\xca\x1c\xb9\xf4\xb5\x1c\xa6\x007;\u009e\x03\xf44@\x8f\x8e\x96\x99\xe7$v\x9b\x19\xac\xc1P\x93#6\xb7\x0e\xa40\xbb\xde\x05\x1aM\xee\x01\xe6\xe8I\x92d\"\x19\r\x9a\x1cM:@r4\xe9\x00\xc9Ѽ\xca\x01\xd0\a%I\x02\xa3\xc5_x:\x98\x15ǁꊊ]Y\xed\x1c=O5\xb9\x98\x96\u00a0\xe9\xd2\xd2{\xf5Kyj\xb6\xb4b\xe9Ҿo\xb2\xc7\xe3\x00\x9a\x9cf.\xfdE\n\xd1#\xd7\xf2\x9d\tW^\xa9ޤ\xeb\xb8Ϛ\x1c\xa9c\xaf~O\x1f\xe0\xf4x@uXe\xaf?\x0f_\x02\x15\x12J\xad\x05\xd5]\xe4IsK\x1e\x14.\xa8\xafn$z\xdd\f\x87\xe0ʋ\xd8֢\xbf\x96\xb5\xe8\x8a\fO@\xec\xd1\xe4h\x9e\x9e\xfe\xd3\xe4\x00\xdcS㖑5\xfa\xc9/\x82\xd4\xe1v\xc3\xfb\xc4\xf4F\xea\xfc\xd2u\xd1K\x14\x84\x96ك+\x13\xb7\xb2\xb8\x91\xa2\x99\x9b\x8d\xf5\xa4Ֆ@\x88~o\x83X\xe9\xd1)Q\xabP\xeezOz-_\xcfg\xb4\f\\\xba¬۹4-\xed%\xe5kل\x94I*?Bw\xff\xf24,R`\xaeҭt\xbd6F\xea\xea\x01uD\xc4\x1e\xb4\xccV}k\xe9#>\xa3\xf6j\xb4^\x8b\xd4w\xd8\x1e\xc0\x1bT\xa7\x19uUS\xd8\xc8\x0e\xf9T\x8as\r^\xd7coG\\\x11D'\xbd\x02i\r\xb8\xd3mզZj$M\xeb\x1d\xb1\xa4\xbcQ\xb9\x17\xaf3z\xa6r\xadsF.\x1d\xb4\xbaEf\x00\x8f}=3Eo[\x86\x0e\x9a\x91\x1dH\xfa,y\xb7'\xff\x19\x0e\xe0I+9<\xaa_\x1aᴑO\x1a\r\x91b)\x12Q\x9fQl\xb5\xb4IdVm\xd0g\x12q3\x00I\xeb\xc9#I^M\x06\xc3%G\x93\x0e\x90\x1cM:@r4\xe9\x00\xc9\xd1\xfc:\xc0\xae\xf7\xed\x93\xf3\xa0\x11\xb5\xadi\x9a2\x8eH\x13q=Z\xc0\xc88\xa0^[\x92~\x90\xb0iKn\x85X\xd7\xfc\xb5\x04\xda\xe5\xbe\xe8}\xcf;\xe2ɟձ\x11\x1d\xbb\xd4K+'9\xaf7\xa8s\xfb=@o糞.\xf7\xe8N\xf6\x05}b\rG\x83\"\xe1ʈ\x1c\xd1\xef\xb5\xe72B-\xa4p\\\xed;ODjQ~\xe0ê\x1f-,\x80\xfb\xaeU?MO\xcb(\x859\x8c\x90Ӻ\x8c\x1c\x88h0g\x94ީ\xaf\xf6\xd5\xd0\xef\xa5\xf4V:\xadL\x9a]H\xfe\x88=\xd1\xf5\x83\xa6\x97\xca\x14e\x8f\x94\x06i\a\x9a\xbeu\xb9ڳGk~\x1f\xc0\xc2;\xa2\xd7\xd7!#\xb07/\x04o\xbe\xa3\xedA\xf4KA~\xa3l\xe0ꨥ\xcdhzifj\xb1ǃ\xe8\x00\xdc\x14֚\x89\xc4nk\xf0Q/]̢\xb5\x13Q\x1d\xd22\xa6\x15n6إ\x8e\xa1MpK\xe7\xf7^c\xa5\xffT?\x981\xc2\x19i>\xa3\xf4s\xd4\xe5\xa2#:Z\xdeB\xd6\xff\xe8RN\x92y\xed\xe7«i\x99\xae\xcd:\xff\xa5\xcd\x00tJ\x95\xd6w\xd6\xfb\x00\xdaƇK\xafᝑ\n\x13O\x8f4\x00\xb7\xb1\x95\xaeE\x1bS+\xaf\xa4\xc3S^K\u007f!\x9b`\xad}\xb9\xd1_\x9a\x198\xa7\xfd0\xaf\xaa\xd6в\xec\xe4\x10ۂl\xaa\xbczf\x8f\xf4\x1c\xa8\r;\xd8ꡧ\xbd\x90Yo\xf4J`K\xa2\x96@;U\xde[\x1d\xe0\nl\xaf$I\x06\xb1\xfd\x93\xe0$\x19I:@r4\xe9\x00\xc9Ѥ\x03$G\x93\x0e\x90\x1cM:@r4\xe9\x00\xc9Ѥ\x03$G\x93\x0e\x90\x1cM:@r4\xe9\x00\xc9Ѥ\x03$G\x93\x0e\x90\x1cM:@r4\xe9\x00\xc9Ѥ\x03$G\x93\x0e\x90\x1cM:@r4\xe9\x00\xc9\xd1<\xce\x01\xb8\x97\xac\x8br|ߊ\x97\xb2G\xe7\xeb9\xf3\xc7\xf3}4Q\xf9y\xcb\x1bZΖ̽\a9!\x9f\xa9\x8c\xfb_;\xf2\x84~7\xaa\x83j\xceI\xa1\xe9<\xf5\x86\x0e\x02\x92]V\x1e\xbdu\xa4]\xeb\xd1-\xa5\xd3\xe4\xd7h\xe7\xd0\x1a\x11ͨ\xd7\x01\x10\x1b\xb9\xbf=:\xd1|\xeb\xba\xf1\x0e\x06H=H\U00088cb4د\xe9\xb2d\xde\xfa\xe9\x91s\x98K \xce`\xebԷK9\xfe\xbb0\xa7\x91\x15\xf0\xb8\xbc\xfa\xb8=\xbbh\xfc\x91}\x971\x02E4\xfc5\xf8\x88E\xa9\xbeV\x1c\xeb\x18ET\xbd_Σ!\xbb\xf7\x00\xe81\x837=\xc7\xe0\x95\xc6_\x8e\xe1Φ\xe4NP.\xc1\x87\xc2z\xec\xa3\xf5CGakF\xf3\xd6o\xcbH\xec\xc1ۡ\xb9\xdf>\xd0\xf4Xr\x14\xf5xt\x0f\xd6hn\x15\x8c^\x17\xd9\x01\vs\xee%\x97F\xfaa\a\xae,\x9c^I\x1fb\xa3t\xe6(Z/\xb3\x1c\xb6\x903F%4;\xa5z\xe3\xce\x1f\x95\xeaU:pW;\xbb\x94\xeb\x9b\xdd\x0e@Ge\xcfa\xb1\x92Q\x92\x9c;\xe4\xd5ʃ눞\xce\xc25\x00\xa2\xe7\xa9\xcb\x11\xcb\xee\bGkՁ\x0e\\\xdc\x00%\xf53\xb7\x03\xb4\xac\xdd9\xe3\xb9\xd9\xc0sB\xb4gߠ\xd9qU?(\x11\xb5\x04B\xf6H^]3\x19\xbd\u007f\xe1\xf2\xbb\x8c%\xa84\xa3j'P[{\x81?\xdf7\xcd\x00H'і\x14\xf5\x14\xe6u\"\xcf\fÍ\xd6Ȩ\xad\x95\x0f\xdd\xf3\xa0\xe9%\xb4\x8e\x12\xcd̙\n\xe9\xb0Z\x1a\xedZ4\xbd\vT\t\xb7a\xebѯɟ\xb8\xb4؍Rq5\xc0nx\xdae\x16^\xa7\xab\xd3\xff \x8aV\xc9w\xb5)\xf9\x1b\xcb)F\xb4ɇ\xf9]5\xedz-\xbd\xb8v[)\xe7\nR*\xde.\xe7Ҭ\xb6S\xc2\xd2#\xd9\xdf+\xe7\xea\xa7\b{\x01)\xfd\xe3x\xac\xe1/eU{H\x03\x84\xe5 \xd2\xe7G\xf0H\xa3\x93a 3\xa7\x95>I\x8efy0\\\x92\xac\xe4\xbf\x00\x00\x00\xff\xffҶ\r\xecA\xd24'\x00\x00\x00\x00IEND\xaeB`\x82")