├── 01_blinky
└── main.go
├── 02_gpio
└── main.go
├── 03_usbcdc
└── main.go
├── 04_systick
└── main.go
├── 05_buzzer
└── main.go
├── 06_light_sensor
└── main.go
├── 07_lis3dh
└── main.go
├── 08_spi_ili9341
├── graphics.go
├── main.go
└── tinygo-logo.png
├── 09_webclient
├── main.go
└── wioterminal.go
├── 10_webserver
├── main.go
└── wioterminal.go
├── 11_spi_ili9341
├── graphics.go
├── main.go
├── tinygo-logo-eye-closed.png
└── tinygo-logo-eye.png
├── LICENSE.txt
├── README.md
├── go.mod
├── go.sum
└── images
├── 01.png
├── 02.png
├── 03.png
├── 04.png
├── 05.png
├── 06.png
├── 07.png
├── 08.png
├── 09.png
├── 10.png
├── 11.png
├── 12.png
├── 13.png
├── 14.png
└── 15.png
/01_blinky/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "machine"
6 | "time"
7 |
8 | "tinygo.org/x/drivers/buzzer"
9 | )
10 |
11 | type note struct {
12 | tone float64
13 | duration float64
14 | }
15 |
16 | func main() {
17 | //led := machine.LED
18 | led := machine.LCD_BACKLIGHT
19 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
20 | cnt := 0
21 |
22 | bzrPin := machine.WIO_BUZZER
23 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
24 | bzr := buzzer.New(bzrPin)
25 |
26 | notes := []note{
27 | {buzzer.C3, buzzer.Quarter},
28 | {buzzer.D3, buzzer.Quarter},
29 | {buzzer.E3, buzzer.Quarter},
30 | }
31 |
32 | for {
33 | cnt++
34 | fmt.Printf("cnt %d\r\n", cnt)
35 | led.Low()
36 | time.Sleep(time.Millisecond * 500)
37 |
38 | led.High()
39 | time.Sleep(time.Millisecond * 500)
40 |
41 | for _, n := range notes {
42 | bzr.Tone(n.tone, n.duration)
43 | time.Sleep(10 * time.Millisecond)
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/02_gpio/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "machine"
6 | "time"
7 | )
8 |
9 | const (
10 | led = machine.LCD_BACKLIGHT
11 | )
12 |
13 | func main() {
14 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
15 |
16 | machine.WIO_KEY_A.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
17 | machine.WIO_KEY_B.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
18 | machine.WIO_KEY_C.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
19 |
20 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
21 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
22 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
23 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
24 | machine.WIO_5S_PRESS.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
25 |
26 | for {
27 | if !machine.WIO_KEY_A.Get() {
28 | led.Low()
29 | fmt.Printf("machine.WIO_KEY_A pressed\r\n")
30 | } else if !machine.WIO_KEY_B.Get() {
31 | led.Low()
32 | fmt.Printf("machine.WIO_KEY_B pressed\r\n")
33 | } else if !machine.WIO_KEY_C.Get() {
34 | led.Low()
35 | fmt.Printf("machine.WIO_KEY_C pressed\r\n")
36 | } else if !machine.WIO_5S_UP.Get() {
37 | led.Low()
38 | fmt.Printf("machine.WIO_5S_UP pressed\r\n")
39 | } else if !machine.WIO_5S_LEFT.Get() {
40 | led.Low()
41 | fmt.Printf("machine.WIO_5S_LEFT pressed\r\n")
42 | } else if !machine.WIO_5S_RIGHT.Get() {
43 | led.Low()
44 | fmt.Printf("machine.WIO_5S_RIGHT pressed\r\n")
45 | } else if !machine.WIO_5S_DOWN.Get() {
46 | led.Low()
47 | fmt.Printf("machine.WIO_5S_DOWN pressed\r\n")
48 | } else if !machine.WIO_5S_PRESS.Get() {
49 | led.Low()
50 | fmt.Printf("machine.WIO_5S_PRESS pressed\r\n")
51 | } else {
52 | led.High()
53 | }
54 |
55 | time.Sleep(time.Millisecond * 10)
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/03_usbcdc/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "machine"
5 | "time"
6 | )
7 |
8 | func main() {
9 | led := machine.LCD_BACKLIGHT
10 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
11 | led.High()
12 |
13 | usbcdc := machine.Serial
14 | usbcdc.Configure(machine.UARTConfig{})
15 |
16 | input := make([]byte, 64)
17 | i := 0
18 | for {
19 | if usbcdc.Buffered() > 0 {
20 | data, _ := usbcdc.ReadByte()
21 |
22 | switch data {
23 | case 13:
24 | // return key
25 | usbcdc.Write([]byte("\r\n"))
26 |
27 | switch string(input[:i]) {
28 | case "on":
29 | led.High()
30 | case "off":
31 | led.Low()
32 | case "toggle", "t":
33 | led.Toggle()
34 | }
35 | i = 0
36 | default:
37 | // just echo the character
38 | usbcdc.WriteByte(data)
39 | input[i] = data
40 | i++
41 | }
42 | }
43 | time.Sleep(10 * time.Millisecond)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/04_systick/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "device/arm"
5 | "machine"
6 | )
7 |
8 | var timerCh = make(chan struct{}, 1)
9 |
10 | func main() {
11 | //led := machine.LED
12 | led := machine.LCD_BACKLIGHT
13 |
14 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
15 |
16 | // timer fires 10 times per second
17 | arm.SetupSystemTimer(machine.CPUFrequency() / 10)
18 |
19 | for {
20 | led.Low()
21 | <-timerCh
22 | led.High()
23 | <-timerCh
24 | }
25 | }
26 |
27 | //export SysTick_Handler
28 | func timer_isr() {
29 | select {
30 | case timerCh <- struct{}{}:
31 | default:
32 | // The consumer is running behind.
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/05_buzzer/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "machine"
5 | "time"
6 |
7 | "tinygo.org/x/drivers/buzzer"
8 | )
9 |
10 | type note struct {
11 | tone float64
12 | duration float64
13 | }
14 |
15 | func main() {
16 | bzrPin := machine.WIO_BUZZER
17 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
18 | bzr := buzzer.New(bzrPin)
19 |
20 | notes := []note{
21 | {buzzer.C3, buzzer.Quarter},
22 | {buzzer.Rest, buzzer.Eighth},
23 | {buzzer.D3, buzzer.Eighth},
24 | {buzzer.E3, buzzer.Quarter},
25 | {buzzer.Rest, buzzer.Eighth},
26 | {buzzer.C3, buzzer.Eighth},
27 | {buzzer.E3, buzzer.Quarter},
28 | {buzzer.C3, buzzer.Quarter},
29 | {buzzer.E3, buzzer.Half},
30 | }
31 |
32 | for _, n := range notes {
33 | bzr.Tone(n.tone, n.duration)
34 | time.Sleep(10 * time.Millisecond)
35 | }
36 |
37 | for {
38 | time.Sleep(time.Hour)
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/06_light_sensor/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "machine"
6 | "time"
7 | )
8 |
9 | func main() {
10 | machine.InitADC()
11 |
12 | led := machine.LCD_BACKLIGHT
13 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
14 |
15 | sensor := machine.ADC{Pin: machine.WIO_LIGHT}
16 | sensor.Configure(machine.ADCConfig{})
17 |
18 | for {
19 | val := sensor.Get()
20 | fmt.Printf("%04X\r\n", val)
21 | if val < 0x8000 {
22 | led.Low()
23 | } else {
24 | led.High()
25 | }
26 | time.Sleep(time.Millisecond * 100)
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/07_lis3dh/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "machine"
5 | "time"
6 |
7 | "tinygo.org/x/drivers/lis3dh"
8 | )
9 |
10 | var i2c = machine.I2C1
11 |
12 | func main() {
13 | i2c.Configure(machine.I2CConfig{SCL: machine.SCL1_PIN, SDA: machine.SDA1_PIN})
14 |
15 | accel := lis3dh.New(i2c)
16 | accel.Address = lis3dh.Address0 // address on the Wio Terminal
17 | accel.Configure()
18 | accel.SetRange(lis3dh.RANGE_2_G)
19 |
20 | println(accel.Connected())
21 |
22 | for {
23 | x, y, z, _ := accel.ReadAcceleration()
24 | println("X:", x, "Y:", y, "Z:", z)
25 |
26 | //rx, ry, rz := accel.ReadRawAcceleration()
27 | //println("X (raw):", rx, "Y (raw):", ry, "Z (raw):", rz)
28 |
29 | time.Sleep(time.Millisecond * 100)
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/08_spi_ili9341/graphics.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | const tinygo_logo_s_png = "" +
4 | "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x96\x00\x00\x00\x80\x08\x02\x00\x00\x00\x66\xEC\x07" +
5 | "\x33\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x14\xEA\x00\x00\x14\xEA\x01\x71\x95\x86\x57\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9C" +
6 | "\xED\x7D\x67\x60\x1B\x55\xBA\xF6\x9C\x69\x1A\x55\x4B\xB2\x2D\xC9\xB6\x5C\x54\x5C\x52\x9D\xD8\x71\x48\x2F\x90\x04\x36\xA1\x87\x40" +
7 | "\x20\x4B\x08\xB0\x0B\xF7\x2E\xB0\x2C\xB0\x2C\x7B\x77\x3F\x60\xD9\xA5\x6D\xB8\x6C\x96\x5E\x42\x0D\x2D\x37\x6C\x42\x48\x61\x37\xBD" +
8 | "\xC7\x09\x24\x26\xD5\xBD\xC9\xB6\x5C\xE4\x22\x59\xD5\x23\xCD\xCC\xF9\x7E\x9C\x44\x08\xB9\xC9\x2A\x4E\xB6\x3C\x3F\x12\x4B\x33\x73" +
9 | "\xE6\x68\xDE\x39\xE7\xBC\xE5\x79\xDF\x03\xB0\xD8\x00\x00\x20\x49\x92\x20\x08\x00\x40\x8C\x4D\x8D\x14\x10\x42\xBF\xDF\x2F\x08\x42" +
10 | "\x8C\xED\x00\x00\x44\x22\xD1\x25\xE9\x3F\xCF\xF3\x1C\xC7\x41\x08\x63\x69\x87\x8C\xFA\x4A\x86\x61\xB4\x5A\xAD\x52\xA9\x24\xC9\xE8" +
11 | "\x1B\x89\x05\x10\xC2\x9A\x9A\x1A\x97\xCB\x15\x63\x3B\x32\x99\x2C\x37\x37\x77\xF4\x45\x88\xC0\x71\x5C\x6F\x6F\x6F\x47\x47\x87\xCF" +
12 | "\xE7\x8B\xAE\x05\x22\xBA\xCB\x94\x4A\xA5\xD9\x6C\x96\xC9\x64\x38\x8E\x47\xD7\x42\xEC\x00\x00\x08\x82\xD0\xDB\xDB\x1B\x63\x3B\x3A" +
13 | "\x9D\x4E\x2A\x95\xC6\xA5\x4B\x51\x00\xC7\x71\x89\x44\xA2\x56\xAB\x7D\x3E\x1F\xCB\xB2\xD1\xB4\x10\xC5\x35\x24\x49\x66\x65\x65\x11" +
14 | "\x44\x94\xE2\x8F\x23\x54\x2A\x55\x8C\x4F\x5F\x2A\x95\xAA\x54\xAA\x78\xF5\x27\x6A\x10\x04\x91\x93\x93\x13\xDD\x7C\x16\x8D\x08\xA5" +
15 | "\x52\xE9\xA5\x9A\x3C\xC3\x40\x92\x64\x76\x76\x36\x4D\xD3\xD1\x5D\x4E\xD3\x74\x56\x56\xD6\x65\xF2\x5B\x08\x82\x88\xEE\x75\x8C\x46" +
16 | "\x84\x97\x6A\xD9\x18\x10\x62\xB1\xD8\x6C\x36\x8B\xC5\xE2\x28\x2E\x34\x99\x4C\x12\x89\x24\x11\xBD\x8A\x0E\xD1\xAD\x4A\xC3\xBF\x80" +
17 | "\xA8\xDD\x50\xAD\xE9\xB2\x12\x21\x86\x61\x62\xB1\x38\x3F\x3F\xBF\xA3\xA3\xC3\x66\xB3\xF1\x3C\x3F\xEC\xF9\x04\x41\x68\x34\x1A\xAD" +
18 | "\x56\x7B\x39\xAC\x05\x61\x08\x7D\xB6\xE8\xEF\x61\x55\xEE\x81\x85\x41\x10\x84\x58\x2C\xCE\xCD\xCD\xCD\xCE\xCE\xCE\xC9\xC9\x31\x18" +
19 | "\x0C\x0C\xC3\xA0\x43\x95\x95\x95\x9F\x7E\xFA\x69\x66\x66\xE6\xE5\x26\x48\x0C\xC3\x78\x9E\xB7\xDB\xED\x76\xBB\xDD\xE3\xF1\x20\x59" +
20 | "\xA2\x4E\xA2\xF7\x0F\xCD\x54\x6A\xB5\x5A\xA9\x54\x5E\x86\xC2\x83\x10\x36\x37\x37\xAF\x58\xB1\x62\xCC\x98\x31\xE8\x9B\x40\x20\x60" +
21 | "\xB1\x58\xEA\xEA\xEA\x9A\x9B\x9B\xAB\xAB\xAB\xDD\x6E\xF7\x80\x2F\x28\x49\x10\x04\xFA\x3D\x00\x80\xCC\xCC\x4C\xB3\xD9\x9C\x9E\x9E" +
22 | "\x6E\x32\x99\x52\x52\x52\x62\xEC\x50\x2C\x97\x47\x07\x1C\xC7\x93\x93\x93\x93\x93\x93\x21\x84\x2C\xCB\x06\x02\x01\xF4\x9B\x09\x82" +
23 | "\xA0\x69\x9A\xA6\xE9\xE0\x6B\x77\x49\xBA\x37\xD2\x97\x9E\xA2\x28\xB3\xD9\x6C\x36\x9B\xD1\xC7\xDE\xDE\xDE\xBA\xBA\x3A\x8B\xC5\x52" +
24 | "\x5B\x5B\xDB\xDC\xDC\x8C\x5D\xB4\x2C\xC9\xCC\xCC\xCC\xBB\xEF\xBE\x1B\x00\xA0\x56\xAB\x29\x8A\x8A\xB1\x97\x2C\xCB\x7A\xBD\x5E\x86" +
25 | "\x61\xD2\xD3\xD3\xE5\x72\xF9\x65\xF8\xB2\x5F\x12\xF0\x3C\xEF\x72\xB9\x5A\x5B\x5B\xFB\xFA\xFA\x24\x12\x89\x48\x24\x8A\xA2\x91\xA4" +
26 | "\xA4\xA4\xA2\xA2\xA2\xA2\xA2\x22\x0C\xC3\x02\x81\x80\xCD\x66\x13\x04\xE1\xB3\xCF\x3E\x23\x69\x9A\xD6\xE9\x74\xB1\xF7\xB2\xAF\xAF" +
27 | "\x8F\xE3\xB8\x45\x8B\x16\x2D\x5C\xB8\x30\x2D\x2D\xED\x32\x9C\x66\x2F\x39\x20\x84\xED\xED\xED\xBB\x76\xED\xDA\xB1\x63\x07\x45\x51" +
28 | "\xD1\x09\x12\x81\xA2\xA8\x8C\x8C\x0C\x0C\xC3\x44\x22\x51\x7C\x0C\x73\x87\xC3\x61\x34\x1A\xDF\x7A\xEB\xAD\xBB\xEE\xBA\x2B\x3D\x3D" +
29 | "\xFD\x3F\xF2\x1B\x10\x00\x80\xB4\xB4\xB4\x95\x2B\x57\xBE\xF5\xD6\x5B\x06\x83\xC1\xE1\x70\xC4\xA5\xD9\x38\x88\xD0\xE3\xF1\x14\x14" +
30 | "\x14\xFC\xEE\x77\xBF\x53\x28\x14\xB1\xB7\xF6\xEF\x00\x85\x42\xF1\xFB\xDF\xFF\xBE\xA0\xA0\xC0\xE3\xF1\xC4\xDE\x1A\x8E\x9C\xC5\x7E" +
31 | "\xBF\x3F\xEA\x15\xDE\xE5\x72\x3D\xF0\xC0\x03\xB1\xAF\xA3\xFF\x56\x20\x49\xF2\xC1\x07\x1F\x74\x3A\x9D\xD1\x5D\x0E\x21\x0C\x04\x02" +
32 | "\xC8\xCB\x4F\xD6\xD6\xD6\x3E\xFC\xF0\xC3\x18\x86\x29\x14\x8A\xFC\xFC\x7C\xBD\x5E\x6F\x34\x1A\xB3\xB3\xB3\x23\x14\x09\xCF\xF3\x06" +
33 | "\x83\x41\xA9\x54\x46\xD7\x95\x7F\x67\x28\x95\x4A\xA3\xD1\xE8\x76\xBB\x23\x54\xFA\x78\x9E\x6F\x69\x69\xA9\xAD\xAD\x6D\x6A\x6A\xAA" +
34 | "\xAA\xAA\x42\xCE\x61\x08\x21\x09\x21\x44\xE3\xCF\xE1\x70\x1C\x3F\x7E\xFC\xF8\xF1\xE3\x38\x8E\x03\x00\x32\x32\x32\x72\x73\x73\x33" +
35 | "\x33\x33\x73\x73\x73\x87\x30\x30\x78\x9E\x17\x8B\xC5\x97\xD0\xD9\xFD\xCF\x0B\xE4\xE0\xEE\xED\xED\x1D\x42\x84\x0E\x87\xA3\xBE\xBE" +
36 | "\xBE\xB1\xB1\xB1\xB1\xB1\xB1\xBE\xBE\x9E\xE7\xF9\xFE\x96\xFE\x00\xDE\x19\x74\x52\x53\x53\x53\x53\x53\x13\xBA\x93\x48\x24\x0A\x0E" +
37 | "\x4A\x8E\xE3\x62\x51\xA5\xFE\x83\x21\xC0\x71\xDC\xBB\xEF\xBE\x1B\xF4\xD9\x72\x1C\xC7\xB2\xEC\xB0\xFE\xA6\xE1\x1D\x6C\x82\x20\xF8" +
38 | "\x7C\xBE\xD0\x68\x56\xD4\x6E\xE5\xFF\x60\x58\x78\xBD\xDE\x91\x5E\x32\x94\x08\x71\x1C\x27\x08\x42\xAD\x56\xE7\xE5\xE5\x05\x47\x9E" +
39 | "\xDD\x6E\x6F\x6C\x6C\x8C\xAE\x7F\xFF\xC1\xD0\xC0\x71\xBC\xB8\xB8\x38\x18\xFC\x62\x59\xB6\xA6\xA6\xA6\xA7\xA7\x87\xE3\xB8\x21\x3C" +
40 | "\xA5\xE1\x22\x44\x2C\x0A\x93\xC9\x64\x30\x18\xB2\xB3\xB3\x8D\x46\xA3\x5C\x2E\x0F\x3D\xA1\xB2\xB2\x12\x4D\xB0\x97\x09\xD0\x42\x0E" +
41 | "\x21\xE4\x38\xCE\xED\x76\xDB\x6C\xB6\xDE\xDE\x5E\x9F\xCF\xEB\xF3\xF9\x58\xB6\x2F\x10\xE0\x20\x84\x24\x49\x8A\xC5\x0C\xC3\x88\xA5" +
42 | "\x52\x99\x5C\x2E\x4B\x4A\x52\x2A\x95\x4A\x91\x48\x84\x96\xF0\xCB\xC7\x8A\xC5\x71\x7C\xF6\xEC\xD9\x41\x1F\x29\x82\xC7\xE3\xB1\x58" +
43 | "\x2C\x8D\x8D\x8D\x16\x8B\xA5\xAA\xAA\x2A\x10\x08\x70\x1C\x17\x7A\x02\x29\x12\x89\x90\xCF\x3E\x2B\x2B\x4B\xAF\xD7\x9B\xCD\xE6\xC4" +
44 | "\xF9\x56\x78\x9E\xB7\xD9\x6C\x76\xBB\x9D\x61\x44\x3A\x5D\x9A\x58\x2C\x8E\xE2\x46\xC8\x31\x68\xB3\x75\x34\x36\x36\xB6\xB6\xB6\xB6" +
45 | "\xB5\xB5\xD9\x6C\x1D\x5D\x5D\xDD\x0E\x87\xBD\xAF\xAF\x2F\xE4\x44\x80\x81\x1F\xBC\xF8\x48\xD0\xC1\x63\x04\x41\x24\x25\x25\x69\x34" +
46 | "\xDA\x8C\x8C\xF4\xAC\xAC\x6C\xA3\xD1\x94\x93\x93\x23\x95\x4A\x2F\x1F\x71\x06\x21\x95\x4A\xC7\x8E\x1D\x3B\x76\xEC\x58\x0C\xC3\x20" +
47 | "\x84\x6D\x6D\x6D\xB5\xB5\xB5\x56\xAB\xD5\x62\xB1\xA0\xE7\x49\x66\x67\x67\x3F\xF6\xD8\x63\x89\xEE\x87\x20\x08\xBB\x77\xEF\xDA\xBC" +
48 | "\xF9\xAB\xF6\xF6\x76\x34\x6E\x44\x22\x51\x71\xF1\x94\x5B\x6E\x59\x66\x30\x18\x22\x6C\xA1\xBD\xBD\xFD\xD4\xA9\xB2\x33\x67\xCE\x56" +
49 | "\x55\x55\x5E\x74\x6D\x5C\x78\xE6\x22\x46\xAC\x4C\xD1\xA9\x53\x75\xA9\xBA\x0C\xB9\x52\x25\x62\x24\x22\x11\x43\x50\x14\xD2\xAE\x05" +
50 | "\x9E\xE7\xB8\x00\xCB\xF6\xF5\x79\x3D\x1E\xB7\xD3\xE5\xB0\xF7\xF6\x74\x76\xDB\xDA\xAA\x6B\xAA\xAB\x2A\x2B\x90\x60\x51\xF4\x78\xDC" +
51 | "\xB8\xF1\x85\x85\x85\x63\xC6\x8C\x1D\x69\x00\xD2\xEF\xF7\xD7\xD7\xD7\x5B\xAD\x56\x9E\xE7\x34\x1A\x4D\x5E\x5E\x7E\x22\x22\x91\x00" +
52 | "\x80\xF4\xF4\xF4\xF4\xF4\xF4\xE0\x37\x6B\xD6\xAC\x19\xA5\x80\xF5\xFA\xF5\x9F\x6F\xDC\xB8\x91\xA2\x99\x09\x53\x66\xAA\x35\x69\x7D" +
53 | "\x3E\x6F\x63\xF5\xB9\xD2\xD2\xA3\x65\x65\x27\xEF\xBC\x73\xE5\xD5\x57\x5F\x33\x98\x62\x0D\x21\x6C\x6A\x6A\x3A\x7A\xF4\xC8\xF1\xE3" +
54 | "\xC7\x9B\x9B\x9B\xD0\x92\xA0\x54\xA7\x14\x4E\x9D\x93\x61\x30\x6B\x33\xB2\xD4\xA9\x5A\x55\x8A\x56\x22\x95\x0F\x78\xF9\x10\x00\x00" +
55 | "\xF8\x59\xB6\xB3\xAD\xA5\xB5\xA9\xBE\xA5\xA1\xC6\x52\x5B\x61\xB1\xD4\xD6\xD5\xD5\x6D\xD9\xF2\xB5\x54\x2A\x9D\x38\xB1\x70\xE6\xCC" +
56 | "\x59\x45\x45\x45\xC3\xCA\x92\x65\xD9\xBF\xFF\xFD\x9B\x6D\xDB\xB6\x76\x77\x77\x07\xBF\x54\x28\x14\xB7\xDC\xB2\x6C\xC9\x92\x6B\x47" +
57 | "\xC1\xDC\x1A\x0D\x11\x56\x54\x54\x6C\xDD\xBA\x4D\x97\x69\xB8\xF7\xB1\x67\x54\x29\xDA\x0B\xDF\x42\x78\xEE\x64\xE9\xA6\x8F\xDF\x78" +
58 | "\xFF\xFD\xF7\xFA\xFA\xFA\x6E\xBC\xF1\xA6\xB0\x5F\xEB\xF1\xB8\x0F\x1D\x3A\xB4\x7B\xF7\xEE\x86\x86\x7A\x41\x10\x28\x9A\xCE\x9F\x38" +
59 | "\x65\xEC\xE4\x69\xF9\x13\x8A\x52\xB4\xE9\x58\xCC\x33\x1E\x84\x90\xA2\xE9\xF4\x6C\x63\x7A\xB6\x71\xCA\xEC\x05\x18\x86\xF9\xD9\xBE" +
60 | "\x86\xEA\xF3\x55\xA7\x4F\x9C\x2F\x2B\x2D\x2D\x3D\x5A\x5A\x7A\x54\x2E\x97\xCF\x9C\x39\x6B\xD1\xA2\x45\x39\x39\x86\x01\xE7\xD8\xCE" +
61 | "\x4E\xDB\x5F\xFE\xF2\x97\xCA\xCA\x0A\x89\x4C\x3E\xFD\xCA\x25\x7A\x43\x2E\x41\x92\xED\xCD\x8D\x27\x8F\xEC\xF9\xE8\xA3\x0F\x7B\x7B" +
62 | "\x7B\x7F\xFA\xD3\x3B\x63\xEC\xE7\xB0\x18\x0D\x11\xEE\xDE\xBD\xCB\xEF\xF7\x2F\x5E\xB6\x4A\x95\xAC\xF9\xE1\x5B\x00\xC6\x4F\x99\x91" +
63 | "\x9E\x6D\xFA\xE0\xE5\xA7\xD6\xAF\xFF\x42\xA3\xD1\xCC\x9A\x35\x1B\xC3\x30\x08\x61\x57\x57\xE7\xF6\xED\xDB\xF7\xEE\xDD\xEB\x72\xBB" +
64 | "\x68\x11\x33\xBE\x78\xC6\xA4\xE9\xF3\x0A\x0A\xA7\x30\xE2\xC4\xF2\xCC\x68\x11\x93\x3F\xA1\x38\x7F\x42\xF1\x75\x2B\xEE\x6B\x6F\x6E" +
65 | "\x3C\x75\xFC\xE0\xF7\x47\xF7\xEE\xD8\xB1\x63\xE7\xCE\x1D\x63\xC7\x8E\xBD\xFE\xFA\x1B\x27\x4F\x9E\x1C\x4A\xB4\xE9\xE8\x68\x7F\xEE" +
66 | "\xB9\x67\x5B\x5B\x5B\x8B\x67\x5E\x75\xDD\x8A\xFB\x14\x4A\x75\xF0\xD0\xBC\x6B\x97\xBD\xFF\xBF\x4F\x6D\xDB\xB6\xB5\xB0\xB0\x70\xC2" +
67 | "\x84\x89\x09\xED\x36\xD9\xD3\xD3\xF3\xCD\x37\xDF\x20\x77\x8C\xC9\x64\x62\x18\x06\xAD\x1F\xF1\xBA\x01\xC7\x71\x15\x15\xE5\xDA\x8C" +
68 | "\x2C\x75\xAA\x0E\x42\x18\x16\x74\x55\xA7\x6A\x57\x3C\xF0\x3F\x6F\xBF\xF0\xC4\xC7\x1F\x7F\x64\x32\x99\x65\x32\xD9\xD6\xAD\x5B\xBF" +
69 | "\xF9\x66\xBB\xD7\xEB\x51\x26\x6B\x96\x2C\xBE\xA5\x64\xCE\x22\x85\x2A\x39\x5E\x9D\x89\x10\x00\x80\xB4\x2C\x43\x5A\x96\x61\xD1\x4D" +
70 | "\x2B\xAA\xCE\x9E\x3C\xBC\x6B\x4B\xC5\xD9\xB2\xF3\xE7\x9F\xCB\xCF\x2F\xB8\xF5\xD6\x5B\x0B\x0B\x27\xE1\x38\xEE\x76\xBB\x5F\x7B\xED" +
71 | "\x35\x6B\x6B\xDB\xAC\x85\x37\xCC\xF9\xC9\xCD\x0A\xA5\x1A\x42\xE8\x75\xBB\xA4\x72\x05\x86\x61\x0A\xA5\xFA\x96\x7B\x7E\xF9\xEA\x1F" +
72 | "\x1E\xDE\xB5\x6B\x57\x1C\x45\x08\x21\x14\x04\xA1\xAF\xAF\x0F\xAD\xBB\x10\xC2\xEE\xEE\x6E\xB2\xAB\xAB\xEB\xEB\xAF\xBF\x46\xFD\x06" +
73 | "\x00\xA4\xA6\xA6\xE6\xE5\xE5\x69\xB5\xDA\xBC\xBC\xBC\xF4\xF4\x74\x82\x20\x62\x9C\xCD\xBD\x5E\xAF\xCF\xE7\xD3\x66\xA5\x63\x38\xE0" +
74 | "\x79\x8E\xC4\x2F\xB8\x05\xAA\xCF\x96\xD5\x55\x9E\x59\x74\xD3\x8A\xB4\xCC\x9C\x05\x37\xDC\xB1\xE5\xD3\xB7\x5F\x7D\xF5\x15\xA7\xB3" +
75 | "\xB7\xB5\xB5\x4D\x9D\xA2\xB9\xE6\xD6\x7B\x4A\xE6\x2C\xA4\x45\x4C\x1C\x7E\x77\x0C\x20\x48\x72\xEC\xE4\x2B\xC6\x4C\x9A\xDA\xD2\x58" +
76 | "\xB3\x77\xCB\x86\x73\x27\x8F\x3C\xF7\xDC\xB3\x53\xA6\x94\xDC\x71\xC7\x1D\x7B\xF7\xEE\x2D\x2F\x3F\x3F\x69\xFA\xBC\xE9\x57\x2D\x61" +
77 | "\xC4\x12\x0C\xC3\x1C\xDD\xB6\xB7\x9E\x7F\xE2\xB1\xE7\xDE\x14\x89\x25\x18\x86\x69\x33\xB2\xB2\x8C\xF9\x95\x95\x15\x1C\xC7\xC5\x42" +
78 | "\x92\x13\x04\x01\x42\x68\xB3\xD9\xAA\xAB\xAB\x9B\x9B\x9B\x6B\x6B\x6B\x6D\x36\x1B\x92\x25\x3A\xE1\x87\xA6\x91\xB3\xB4\xA3\xA3\xA3" +
79 | "\xA3\xA3\x03\xC3\x30\x44\xC8\x30\x18\x0C\x39\x39\x39\x59\x59\x59\x41\xEE\x4C\x73\x73\xF3\x88\x62\x1A\x00\x60\x18\x06\xA0\x00\x31" +
80 | "\x01\xBA\x7A\x1D\x38\x41\x08\x82\x40\x10\x84\xD3\xD1\x5D\x5F\x71\xA6\x7B\xE6\x55\x72\xA5\xDA\x90\x3F\x4E\x99\x9C\x5A\x59\x59\x41" +
81 | "\x8B\x98\xAB\x6E\x58\x7E\xE5\x75\xB7\x89\x25\x97\x8C\x9B\xDB\x1F\x00\x80\x4C\x43\xDE\x5D\x0F\xFF\xDE\x52\x57\xF5\xCD\xFA\x0F\xBE" +
82 | "\xFD\xF6\x78\x59\xD9\x49\x08\x61\x5A\x96\x71\xDE\xE2\x5B\x00\x00\x00\x07\x18\x86\x55\x9F\x2D\x4B\xD1\xA6\x23\xF9\x61\x18\x46\x90" +
83 | "\x94\x5C\xA9\xEE\xE9\x68\xF1\xF9\x7C\x61\xB6\xF5\x60\x80\x10\x36\x34\x34\x04\x3D\x6A\x2C\xCB\x36\x37\x37\x5B\xAD\xD6\xEA\xEA\xEA" +
84 | "\x20\x89\xA4\x3F\x06\x7D\x3B\x78\x9E\xE7\x79\xBE\xAA\xAA\xAA\xAA\xAA\x2A\xEC\xD0\x88\xE2\x12\x12\x89\x54\x2A\x95\x38\x7B\x7B\x02" +
85 | "\x01\x3F\x4E\x10\xE5\x65\xC7\x77\x7D\xFD\xD9\xB8\xA2\xE9\xE6\xB1\x85\x1E\x97\xD3\xEB\x76\x7A\x5C\xBD\x5B\xBF\x78\xAF\xDB\xD6\xA6" +
86 | "\xCB\x34\x2C\xBF\xEF\xD1\x2C\x53\x41\xE4\x8D\x8F\x2E\x40\xB6\xA9\xE0\xBE\xDF\xBE\x70\xFA\xD8\x81\x6D\x5F\xAC\x75\xF4\x74\x11\x24" +
87 | "\xE9\xF3\xB8\x45\x8C\xD8\xE7\xF1\x08\xBC\x50\x76\x74\xDF\xA4\x2B\xE6\x04\xCF\x86\x02\xEF\x67\xFB\x70\x1C\x8F\xDC\x1F\xC9\xF3\x3C" +
88 | "\x9A\x11\x47\x84\x88\x06\x78\xD8\xEA\x38\xA2\x95\x92\x20\x08\xB3\xD9\x7C\xF8\xF0\x11\x8F\xAB\x57\xC4\x88\xC7\x16\x5D\xA1\xD5\x67" +
89 | "\x1D\xD9\xB5\xE5\xEB\x4F\xDF\xF1\xF7\xF9\x1A\xAA\xCB\xBF\x3B\xB8\xB3\xC3\x6A\x29\x99\xBD\xE8\xA6\x55\x0F\x30\xE2\xCB\x88\xD5\x39" +
90 | "\x20\x08\x82\x28\x9A\x79\x65\xEE\xB8\xC9\x9B\x3F\x79\xEB\xFB\x63\xFB\x3F\x7D\xFD\x85\xC5\xB7\xDD\x63\x2C\x18\x5F\x79\xFA\x44\xB7" +
91 | "\xAD\x5D\x6F\xCC\xED\x6A\x6F\x15\x4B\x65\x12\x99\xDC\xCF\xB2\x1D\x2D\x16\x8D\x46\x33\xA2\xA8\x40\xA8\x71\x15\x3A\x5B\x0E\x81\x41" +
92 | "\x45\x18\xC6\x43\x0C\xBE\x4A\x16\x8B\x65\xCF\x9E\x3D\x91\xF7\x09\xC3\xB0\x92\x92\xA9\x47\x8E\x1C\x39\x7B\xE2\xE8\xDC\x6B\x6E\xC2" +
93 | "\x00\x48\xD6\xA4\x5D\xBF\xE2\xFE\xBA\x8A\x33\xDF\xFC\xDF\x07\xDB\xD7\xBF\x8F\x61\x70\xE1\x8D\x2B\x16\xDE\xBC\x82\x24\xFF\x69\x82" +
94 | "\xC6\x72\xA5\x6A\xC5\x2F\x9E\x30\x8F\x2D\xDC\xF2\xD9\x3B\x9B\x3E\x7E\x7D\xDA\x95\x8B\x2B\x4F\x7F\xE7\x76\xD9\xDF\x7A\xEE\x71\x8E" +
95 | "\xE3\x48\x8A\x5E\x7C\xEB\xDD\x29\xBA\x0C\x7B\xB7\x6D\xC1\x95\xF3\x22\x6F\x96\x20\x88\xA5\x4B\x97\xE6\xE4\xE4\xA0\x8F\x7E\xBF\xBF" +
96 | "\xA9\xA9\xC9\x6A\xB5\x56\x55\x55\xB9\x5C\xAE\xE1\x27\x52\x1C\xC7\x71\x1C\x0F\xF2\x10\x73\x73\x73\x53\x53\x53\xFB\x5F\x10\x08\x04" +
97 | "\x46\xAA\xAF\x16\x15\x15\xA7\xA5\xA5\x9D\x3E\x7E\xB0\x70\xEA\x2C\xE5\x45\xBB\x22\xCB\x94\x9F\x9A\xA6\x6F\xAC\x29\x5F\x78\xD3\x4F" +
98 | "\x17\xDE\x78\x87\xC7\xE5\xEC\x6A\xB7\xF6\xDA\xBB\xFB\xBC\x6E\x8E\xE3\x48\x92\x92\xCA\x15\xAA\x14\xAD\x26\x5D\x9F\x68\x5B\x22\x42" +
99 | "\x08\x3C\xEF\x71\x3B\x3D\x2E\x27\x17\xF0\x13\x24\xC9\x88\xA5\x53\x66\x2F\xD0\xE9\xB3\x3F\x79\xFD\x85\xC3\x3B\x36\x8B\xA5\xB2\x45" +
100 | "\x37\xAD\xD0\xE9\x0D\x0A\xA5\x9A\x16\x31\x52\x45\xD2\x86\xB5\x6B\xC4\x62\xF1\x15\x57\x5C\x11\xF9\x2D\x90\xF3\xC5\x64\x32\x05\xBF" +
101 | "\x09\xFA\x4B\x1D\x0E\x47\x4D\x4D\x8D\xC5\x62\xA9\xAF\xAF\xB7\x58\x2C\xC8\xCB\x88\x0E\x91\x5A\xAD\x76\xC1\x82\x05\x38\x8E\xEB\xF5" +
102 | "\x7A\xBD\x5E\x9F\x88\x04\x03\xB1\x58\xBC\x6C\xD9\xAD\xAF\xBD\xF6\xEA\xAE\xCD\x9F\xDF\x70\xE7\x7F\xD1\x34\x03\x21\xDC\xBB\x6D\x83" +
103 | "\xA5\xB6\x42\xA6\x50\x36\xD6\x9C\xFF\xE3\x43\x77\xB8\x5D\xBD\xC8\x8F\x19\x66\x75\x10\x24\xA9\xD3\xE7\x14\x4C\x2C\x99\x3C\x63\x9E" +
104 | "\x4E\x9F\x8D\xE3\xA3\xCA\x6A\xF4\xB3\x6C\x63\xCD\xF9\xF3\x65\xC7\x1A\xAB\xCB\x6D\xAD\xCD\x6C\xDF\x8F\x22\x41\x04\x41\x28\x54\xC9" +
105 | "\x68\xF2\x67\x7D\x5E\x5B\x9B\x75\xDC\xE4\xE9\x8C\x44\x9A\xA4\x4E\xA9\x2D\x3F\x7D\xBE\xAC\x74\x6A\x49\x89\xD1\x68\x1A\xA4\xED\x91" +
106 | "\x41\xA9\x54\x96\x94\x94\x94\x94\x94\x60\x18\xC6\x71\x5C\x4B\x4B\x4B\x4B\x4B\x8B\x20\x08\x7B\xF6\xEC\x21\x93\x92\x92\xE6\xCC\x99" +
107 | "\x33\x6C\x13\x31\x62\xE6\xCC\x59\x65\x65\x27\x0F\x1C\x38\xB0\xFB\xAB\x2F\xAE\xBA\x61\x79\xC5\xA9\x6F\xCF\x7C\x7B\x18\x42\xE8\x76" +
108 | "\x3A\xEA\x2B\xCE\x28\x95\xCA\xB1\x25\x53\xB3\xB2\x32\x53\x53\x35\x72\xB9\x1C\xCD\xA8\x2C\xEB\xB3\x5A\x5B\xCF\x9D\x3B\x57\x5B\x5B" +
109 | "\xB3\xD7\x52\xB7\x6F\xFB\x86\xFC\xF1\x45\x57\xDD\x70\x7B\x4E\xDE\xB8\x51\xF0\x5A\x79\x3D\xAE\x6F\xF7\xEF\x38\xBA\x67\x5B\x57\xBB" +
110 | "\x15\x00\x40\x51\x94\x46\xA3\x49\x4F\x9F\xA0\x52\xA9\x68\x5A\x24\x08\xBC\xCF\xE7\xEB\xEA\xEA\x6A\x6A\xB2\x74\xB6\x75\xA3\x34\xB9" +
111 | "\x13\x87\x76\xF1\x01\xFF\x15\xF3\x17\xFB\x3C\xEE\x6D\x5F\xAC\x65\x44\xA2\x9B\x6F\xBE\x39\x11\x7E\x73\x92\x24\x73\x72\x72\xD0\x7C" +
112 | "\x7B\xF2\xE4\xC9\x51\xF2\x91\xE2\x38\x7E\xEF\xBD\x3F\xB7\xDB\x1D\xA7\xBF\x3B\x54\x5F\x75\xC6\xE3\x76\x01\x0C\xCB\xCD\xCD\xBD\xF2" +
113 | "\xCA\xAB\xAE\xB8\x62\x1A\xA2\xEA\x30\x0C\x23\x12\x89\x44\x22\x11\x4D\xD3\xA1\x93\x81\xCD\x66\xDB\xBD\x7B\xD7\xFA\xF5\x5F\x9C\x3D" +
114 | "\x5B\x56\x7D\xFE\xD4\xD4\x39\x8B\x7E\x72\xEB\x2A\x99\x22\x51\x6C\x1D\x9E\xE7\xCF\x7E\x77\x78\xFB\xFA\xF7\xBB\x6D\x6D\x12\x89\x64" +
115 | "\xFE\xFC\x2B\xE7\xCE\x9D\x57\x58\x58\xA8\x54\x2A\x69\x9A\x96\x48\x24\x88\xCB\x8B\x5E\x23\x8E\xE3\x2C\x16\xCB\x89\x13\xDF\xED\xDB" +
116 | "\xB7\xEF\xE0\xC1\x03\x65\x47\xF7\x9D\x3B\x59\xAA\x49\xCF\x6A\x69\xA8\x5E\xB2\xE4\xDA\xDC\xDC\xFC\x04\x75\x32\x14\xA3\x97\x97\x25" +
117 | "\x95\x4A\x8B\x8B\x8B\xCB\xCB\xCF\x7B\x5C\xCE\x09\x13\x26\xAC\x5C\xB9\x6A\xD2\xA4\x49\x24\x49\x4A\xA5\x52\xB9\x5C\x3E\x44\xE0\x49" +
118 | "\xA3\xD1\xDC\x71\xC7\x8A\xDB\x6E\x5B\xBE\x67\xCF\xEE\x97\x5E\x7A\xA9\x74\xEF\xF6\xC6\x9A\xF2\xDB\xFF\xEB\x37\x7A\x83\x39\xEE\x9D" +
119 | "\xEC\xF3\x7A\xB6\x7E\xB1\xF6\xF8\xBE\x7F\xD0\x34\x75\xF3\xCD\x4B\x6F\xBD\xF5\x36\xAD\x56\x8B\xE3\xB8\x54\x2A\x55\x28\x14\x41\xE3" +
120 | "\x38\x08\x92\x24\x4D\x26\x93\xC9\x64\xBA\xED\xB6\xE5\x5D\x5D\x5D\x1B\x36\xFC\xDF\x07\x1F\x7C\xD0\x5C\x5F\x25\x12\x89\x26\x4E\x4C" +
121 | "\xAC\x5F\x2D\x88\x0B\x59\x4B\x41\x12\x54\x82\xC0\xF3\xFC\xBA\x75\xEB\x3E\xFE\xF8\x23\x86\x61\x1E\x79\xE4\xB1\x97\x5F\x5E\x53\x5C" +
122 | "\x5C\x2C\x97\xCB\xF5\x7A\xBD\x56\xAB\x95\x48\x24\xC1\xFC\x95\xC1\xBA\x41\x10\xC4\xA2\x45\x57\x6F\xDA\xF4\xD5\xAA\x55\x77\x77\xB5" +
123 | "\xB7\xBC\xF7\xBF\xFF\xAF\xAE\xE2\x4C\x7C\x3B\xE9\xEA\xB5\x7F\xFC\xEA\xB3\xA5\x7B\xB6\x9B\xCD\xA6\x35\x6B\x5E\x79\xE8\xA1\x5F\xEA" +
124 | "\x74\x3A\x99\x4C\xA6\xD7\xEB\x35\x1A\x4D\x50\x7E\x48\xD7\xEF\xDF\xCF\x94\x94\x94\x5F\xFC\xE2\x81\x9D\x3B\x77\xAD\x5C\x79\x17\xCF" +
125 | "\xF3\x7F\xF9\xCB\xCB\xBB\x77\xEF\x4E\xD0\x53\x85\x21\x20\x1B\x1A\x1A\x9E\x7A\xEA\x29\x1C\xC7\xB3\xB3\xB3\xF5\x7A\xBD\xC9\x64\x42" +
126 | "\x59\x93\x71\x9C\xC4\x05\x41\xF8\xF8\xE3\x8F\xB6\x6F\xDF\xA6\xD7\xEB\x9F\x7C\xF2\x69\xB3\xD9\x0C\x00\x48\x4E\x4E\x56\x28\x14\xC1" +
127 | "\xBB\x58\x2C\x96\xAF\xBE\xDA\x54\x5E\x5E\x2E\x16\x8B\xAF\xB9\xE6\x27\x0B\x16\x2C\x18\x90\x05\x29\x97\xCB\xFF\xF0\x87\x67\x72\x72" +
128 | "\x0C\x7F\xFE\xF3\x0B\x9F\xBE\xF1\xC2\xBD\x8F\xFD\x51\x6F\xC8\x8D\x4B\x27\x3D\x6E\xE7\x67\x6F\xBE\x58\x73\xEE\xFB\x39\x73\xE6\xFE" +
129 | "\xFA\xD7\xBF\x96\xCB\x15\x04\x41\x24\x27\x27\x87\x3A\x56\x38\x8E\x3B\x7C\xF8\xD0\xC6\x8D\x1B\x1B\x1A\x1A\x52\x52\x52\x96\x2D\x5B" +
130 | "\xF6\x93\x9F\x2C\x0E\x5B\x98\xD5\x6A\xF5\x1F\xFF\xF8\xA7\x59\xB3\x66\x3D\xF1\xC4\x6F\xDE\x7D\xF7\x6D\x96\xF5\x2D\x59\x72\x5D\x5C" +
131 | "\x7A\x88\x98\x09\xC8\xC7\x66\xB5\x5A\x1B\x1B\x1B\x05\x41\x70\x38\x1C\x24\x4A\xB0\xC0\x30\xAC\xBD\xBD\x3D\xC8\x40\x44\xE1\x7B\x64" +
132 | "\x60\xA4\xA4\xA4\xC4\x28\xCE\x6D\xDB\xB6\x7C\xF3\xCD\xF6\x9C\x9C\x9C\xE7\x9E\x7B\x5E\xA7\x4B\x43\xE9\x7D\xC1\x88\x28\x84\xF0\xE3" +
133 | "\x8F\x3F\x5A\xBD\x7A\xB5\xDB\x7D\xA1\xF0\xC1\xE6\xCD\x5F\x3D\xF8\xE0\x43\x8F\x3E\xFA\x28\x41\x0C\x30\xCF\xE3\x38\x7E\xF7\xDD\x77" +
134 | "\x63\x18\x7C\xFE\xF9\xE7\xD6\xBF\xFB\xF2\x7D\xBF\x79\x2E\x76\x3F\x78\x20\xE0\xDF\xFA\xD9\xBB\xD5\x67\xCB\xE6\xCF\xBF\xF2\xF1\xC7" +
135 | "\x7F\x23\x16\x8B\x29\x8A\xD2\x6A\xB5\xA1\x56\xB9\xD3\xE9\x7C\x77\xED\xDA\xC2\x92\x69\xE9\x59\x86\x2D\x5B\xBE\x86\x10\x1E\x3C\x78" +
136 | "\xE0\x89\x27\x9E\xB8\xFF\xFE\xFF\xEE\xDF\xC3\x6B\xAE\xF9\x89\x46\xA3\xB9\xEF\xBE\x9F\xAF\x5B\xB7\x2E\x29\x49\x89\x82\x30\x51\x00" +
137 | "\x42\x18\xE4\x21\x22\x73\xA2\x3F\x0F\x31\xFC\x19\xA1\xC3\x16\x8B\xC5\x62\xB1\x60\x17\xB9\x8E\xB9\xB9\xB9\x41\xD3\xDE\xE9\x74\x8E" +
138 | "\xA8\x4E\xC8\xB9\x73\xE7\xD6\xAF\x5F\x9F\x9C\x9C\xFC\xF4\xD3\xCF\xE8\x74\x69\x38\x8E\x6B\xB5\xDA\xD0\x38\xEA\x97\x5F\x6E\x78\xFB" +
139 | "\x9D\xB7\x5F\x7B\xE7\x7D\x97\xCB\xF9\xFB\xC7\x1F\x71\xB9\x5C\x10\xC2\x0F\x3E\x78\x7F\xC9\x92\x25\x63\xC7\x8E\x1B\xB0\x4D\x00\xC0" +
140 | "\x5D\x77\xAD\xB2\x5A\xAD\xEF\xBD\xB7\xF6\x1F\x7F\x5B\xB7\xF4\x9E\x87\x06\x14\x76\xE4\x38\x71\x68\xF7\x89\x43\xBB\x0A\x0B\x0B\x1F" +
141 | "\x79\xE4\x11\xB1\x58\x4C\x92\x64\x98\xFC\x02\x81\xC0\x73\xCF\x3D\xCB\x72\xC2\x7D\xD3\x67\xA6\x67\xE8\x3F\xFE\xE0\x5D\xAF\xC7\xC3" +
142 | "\x71\xDC\xDA\xB5\xEF\x5D\x7F\xFD\x8D\x69\x69\x69\xFD\xDB\x2C\x2A\x2A\x7E\xF3\xCD\xB7\xEE\xB9\xE7\xEE\xB5\x6B\xDF\xD5\xEB\x33\x83" +
143 | "\x06\xFB\x10\x10\x04\x61\xC7\x8E\x1D\xA5\xA5\xA5\xE8\xA3\xDF\xEF\xAF\xAB\xAB\x0B\xE6\x4A\x0E\x86\x61\x7E\xB9\x20\x08\x6E\xB7\xFB" +
144 | "\xFB\xEF\xBF\x0F\xFD\x32\x72\x1F\xA9\xC7\xE3\x79\xFF\xFD\xB5\x82\x20\xFC\xE6\x37\x4F\x64\x65\x65\x61\x18\xA6\x56\xAB\x43\xE5\xE7" +
145 | "\x70\xD8\x5F\x7F\xFD\x35\xAD\x2E\x7D\xEC\xF8\x89\x10\x42\xA5\x4A\x8D\x8A\x90\x78\x3C\x9E\x6F\xBF\xFD\x6E\x30\x11\x62\x18\x46\x10" +
146 | "\xC4\xC3\x0F\xFF\xEA\xCC\x99\x33\x27\x0E\xEF\x1E\x57\x3C\x7D\x5C\xD1\xB4\x08\xBB\xD4\x1F\x1D\xAD\xCD\x3B\x37\xAE\x4B\x4E\x4E\x79" +
147 | "\xF4\xD1\x5F\xCB\xE5\x0A\x34\xC9\x87\x79\xC5\xAA\xAA\x2A\x37\x6D\xDA\x28\x96\x48\xB2\xDF\xCE\x39\x77\xF6\x8C\xF7\x62\x2E\x84\xC3" +
148 | "\xE1\xA8\xA8\xA8\x18\x50\x84\x18\x86\x95\x94\x4C\x7D\xF6\xD9\xE7\x1F\x79\xE4\xE1\x77\xDE\x79\xFB\x99\x67\xFE\x38\xAC\xB3\x54\x10" +
149 | "\x84\x8A\x8A\x8A\x91\xF6\x7F\x18\x11\xE2\x38\x4E\x92\xA4\x42\xA1\x08\xDE\x9E\x65\xD9\xC8\x47\xE1\x3F\xFE\xF1\xF7\xA6\xA6\xA6\x9B" +
150 | "\x6F\x5E\x3A\x69\xD2\x64\x0C\xC3\x24\x12\x49\x58\xEA\x4C\x4D\x4D\x6D\x67\x67\x67\x73\x4B\xCB\x8B\x7F\x7A\xD2\xEB\xF1\xB6\xB6\x5A" +
151 | "\x83\x87\x86\xAD\x46\xA2\x50\x28\x7E\xFD\xEB\x5F\xDF\x73\xCF\x3D\xFB\xB6\x6D\x30\x8D\x99\x10\x9D\x13\x47\x10\xF8\x03\xDF\xFC\xCD" +
152 | "\xED\x74\xFC\xF2\x97\x0F\xA3\x97\x4C\x26\x93\xC9\x64\xB2\xB0\xD3\xCA\xCB\xCB\x59\x96\x65\x59\x76\xCD\x4B\x2F\x86\x7E\x3F\xB4\x1B" +
153 | "\x13\x00\xB0\x64\xC9\x92\x03\x07\xF6\x6F\xDE\xFC\xD5\xEE\xDD\xBB\x16\x2F\x5E\x32\x74\x67\xC2\xDE\x1E\xBF\xDF\xEF\x74\x3A\x51\xBC" +
154 | "\x61\x88\xAB\x06\x10\x21\x45\x51\x41\x1E\x62\x56\x56\x56\x18\x0F\x11\x25\x6A\x0F\xDD\x15\x04\x87\xC3\xF1\x8F\x7F\xFC\x3D\x39\x39" +
155 | "\xF9\xB6\xDB\x6E\x43\x71\x47\xB5\x5A\x1D\xB6\xAC\x92\x24\x89\xE3\x38\xCF\x71\x5F\xFD\xED\xCB\xB0\xCB\x93\x93\x87\x5F\xE1\xA6\x4C" +
156 | "\x29\x59\xB8\x70\xE1\xE6\xAF\x37\xD7\x9C\x3F\x35\x61\xCA\xCC\x48\x7A\x15\x86\xF6\x96\xC6\x33\xDF\x1E\xCA\xCF\xCF\x5F\xB8\x70\x21" +
157 | "\xEA\xCF\x80\x35\x4C\xA4\xD2\x70\xA1\x5E\xFC\x5E\x9A\x95\x95\x39\x44\xFB\x14\x45\x3D\xF2\xC8\xA3\xFB\xF6\xED\xFD\xFA\xEB\xAF\xE7" +
158 | "\xCC\x99\xDB\xFF\xE5\x08\x05\x41\x10\xA1\x89\xDA\x18\x86\xF9\x7C\xBE\xC6\xC6\xC6\x86\x86\x06\x94\x47\x11\x08\x04\x02\x81\x40\xD8" +
159 | "\x55\x24\x76\x31\x10\xA1\xD5\x6A\xF3\xF3\xF3\x91\x8F\x2E\x2E\x39\x82\x47\x8F\x1E\xE9\xE9\xE9\xB9\xEB\xAE\x55\xC9\xC9\x29\x18\x86" +
160 | "\x49\xA5\xD2\xFE\x33\x49\x6E\x6E\xAE\x56\xAB\xED\x5F\xC1\x89\x61\x98\x49\x93\x26\x0D\x7B\x0B\x82\x20\x56\xAC\xF8\xE9\xCE\x9D\x3B" +
161 | "\xBE\x3B\xB0\x73\xEC\xA4\x2B\x88\x91\x7B\x07\x4F\x1E\xDE\xCB\xFA\xBC\x37\xDC\x70\xA3\x58\x2C\xC1\x30\x4C\x2E\x97\x0F\xA8\x09\x17" +
162 | "\x16\x16\x6A\xB5\x5A\x14\x49\x0D\x45\x71\x71\x91\xD9\x3C\x8C\x4A\xAC\xD7\xEB\x97\x2F\xBF\xFD\xED\xB7\xDF\x3A\x7A\xF4\xC8\xA2\x45" +
163 | "\x57\x8F\xA8\x7B\x62\xB1\x78\xCC\x98\x31\x48\xA8\x10\xC2\xAE\xAE\xAE\x9A\x9A\x1A\x24\xCE\x8E\x8E\x8E\x0B\x46\x45\x5E\x5E\x5E\x22" +
164 | "\x48\x88\x82\x20\xEC\xDF\xBF\x5F\x2C\x16\x2F\x5A\xB4\x08\xF1\x01\x92\x92\x92\xFA\xBF\x16\x32\x99\x6C\xD5\xAA\x7B\xFE\xF0\x87\xA7" +
165 | "\xC2\xE8\xAD\xB3\x66\xCD\x0E\xE6\x98\x0F\x8D\xC2\xC2\xC2\xF1\xE3\x27\x9C\xAF\x28\xEF\xB6\xB5\x6A\xD2\xB3\x46\xD4\x49\xB7\xD3\x51" +
166 | "\x71\xEA\xDB\xB4\xB4\xB4\x29\x53\x4A\x30\x0C\x23\x08\x62\xB0\x51\x92\x91\x91\xF1\xE8\xA3\x8F\x3D\xF5\xD4\x93\xA1\x05\x9A\xF4\xFA" +
167 | "\xCC\xFF\xF9\x9F\xDF\x0F\xEB\xED\xC3\x71\x7C\xF9\xF2\xDB\x3F\xFC\xF0\xC3\xBD\x7B\xF7\x2C\x58\xB0\x30\x6A\xEF\x20\xE2\x54\xA4\xA6" +
168 | "\xA6\xCE\x98\x31\x23\xF8\xE5\x9A\x35\x6B\x12\xE5\x6C\xB4\x58\x2C\x56\x6B\x4B\x51\x51\x71\x4A\x4A\x2A\x86\x61\x0C\xC3\x0C\xB6\x98" +
169 | "\xDF\x7E\xFB\xED\x2B\x57\xAE\x0C\xF5\xA8\x65\x64\x64\x3C\xF1\xC4\x6F\xFB\xBB\x42\x06\x04\x4D\xD3\x0B\x16\x2C\x70\xF5\x3A\x1A\x6B" +
170 | "\x46\xAC\x08\xB4\xB7\x58\x3A\xDB\x9A\x8B\x8A\x8A\xD5\x6A\x35\x86\x61\x62\xB1\x78\xB0\x4E\x02\x00\x96\x2F\xBF\xFD\x93\x4F\x3E\x5D" +
171 | "\xB2\x64\x89\xC1\x60\xC8\xCB\xCB\x5B\xB1\xE2\xA7\x5F\x7C\xB1\x3E\x2F\x2F\x2F\x92\x1B\x65\x64\xA4\xCF\x9E\x3D\xCB\x62\xB1\x24\x82" +
172 | "\x08\x9F\x28\x07\x5B\x65\x65\x85\xCF\xE7\x9B\x36\x6D\x1A\x92\x4D\xD0\xFF\xD2\x1F\x14\x45\x3D\xFD\xF4\x33\xF3\xE7\x5F\xB5\x79\xF3" +
173 | "\x57\x36\x5B\x47\x5E\x5E\xFE\xDD\x77\xDF\x83\x34\x8B\x08\x51\x52\x52\x22\x93\xC9\xEA\x2A\x4E\x4F\x9D\x3B\xB2\x69\xAA\xAE\xE2\x0C" +
174 | "\x84\xB0\xA4\x64\x2A\xFA\x38\x74\xF1\x25\x00\xC0\xB4\x69\xD3\xA7\x4D\x9B\x3E\xA2\x5B\x20\x50\x14\xBD\x70\xE1\xA2\x5D\xBB\x76\x9D" +
175 | "\x3B\x77\x36\x12\xEB\x62\x44\x48\x94\x08\x2B\x2A\x2A\x70\x1C\x2F\x2C\x2C\x44\x1F\x87\xA6\x36\x03\x00\xE6\xCE\x9D\x3B\x77\xEE\xDC" +
176 | "\xE8\xEE\x95\x99\x99\xA5\xD1\x68\xDA\xAD\x4D\x7D\x3E\x6F\xE4\x71\x7F\x81\xE7\x9B\xEB\xAB\x94\x4A\x25\xD2\x47\x48\x92\x4C\x68\xD2" +
177 | "\xDD\xF4\xE9\x33\x70\x1C\x2F\x2F\x2F\xBF\xF6\xDA\xF8\x38\x6B\x82\x20\xBD\x5E\x6F\x65\x65\x25\x8E\xE3\xE9\xE9\xE9\x28\xD9\x33\x76" +
178 | "\x45\x06\x42\xD8\xD0\x50\x9F\x96\x96\x96\x94\xA4\xC4\x2E\xAA\xB8\xF1\xE8\xED\xC0\x50\xAB\xD5\x3A\x9D\xAE\xA2\xBA\xD6\xE3\xEA\x8D" +
179 | "\x5C\x84\x5E\x8F\xDB\xDE\x65\x53\x2A\x55\xA9\xA9\x1A\x0C\xC3\x08\x82\x48\x68\x31\x36\xB5\x5A\x65\x30\x18\x10\xAD\x39\x96\x60\x19" +
180 | "\x32\x63\x7C\x3E\x5F\x5B\x5B\x1B\xCF\xF3\x1E\x8F\x87\xB4\x5A\xAD\xAF\xBC\xF2\x0A\x76\x71\xB5\x34\x9B\xCD\x3A\x9D\x2E\x46\x06\xA2" +
181 | "\xC7\xE3\x71\xB9\x5C\xB9\xB9\x79\x68\x69\x41\x96\x43\xD4\x9D\x1E\x16\x38\x8E\xEB\xF5\x99\x65\xDF\x9F\xEA\xF3\x8E\xA0\xFA\x80\xCF" +
182 | "\xE3\x72\xBB\x7A\x33\xF3\x2E\xD4\x6F\xA3\x28\x2A\xA1\x39\x31\x34\x2D\xCA\xCE\xCE\x3E\x76\xEC\x78\x6F\x6F\xEF\x48\x6B\x2F\x0A\x82" +
183 | "\x20\x08\x82\xCD\x66\x43\xEA\x68\x6D\x6D\x6D\x67\x67\x27\x76\xD1\xD9\xFD\x43\xA2\x36\x86\x61\xED\xED\xED\xED\xED\xED\xD8\x8F\x19" +
184 | "\x88\x06\x83\xC1\x68\x34\x86\xDA\x9B\xC3\xDE\xB2\xB7\xB7\x97\xE3\x38\x95\x4A\x85\xDE\xEB\x51\xA8\x19\x9C\x9C\x9C\x1C\xF0\xFB\xFD" +
185 | "\xFE\x11\xD4\xF3\xEC\xEB\xF3\xFA\xFB\x7C\x6A\xF5\x05\xEB\x33\xD1\xF5\x10\x29\x8A\xD2\x6A\x75\x3C\xCF\xD9\xED\xF6\xC1\x44\x88\x4A" +
186 | "\x57\x04\xF3\xB3\x58\x96\x6D\x68\x68\x68\x6C\x6C\x44\x3C\xC4\xC1\x4A\x20\x0F\xDC\xEF\x50\x06\x22\x00\x00\xC7\xF1\xD0\xA0\x49\x52" +
187 | "\x52\xD2\xD0\xDD\xF5\xF9\x7C\x82\x20\xC8\x64\x52\x34\xF8\x46\x21\xC8\x2E\x91\x48\x04\x81\x0F\x8C\x44\x84\x9C\xDF\xCF\x71\x5C\x70" +
188 | "\x91\x4E\x74\x27\x01\x00\x2A\x95\x5A\x10\x84\x21\x0A\x95\xF0\x3C\xFF\xF6\xDB\x6F\x87\x5E\x32\x60\x54\x2B\x0C\xC3\xBF\x7A\xA1\x4C" +
189 | "\x9B\xE0\x37\x43\x5F\xC2\xF3\x3C\x84\x90\xA2\x46\x2F\x9F\x1B\xFE\x98\x77\x13\x09\x04\x41\xC0\x42\x12\x04\x46\x21\xB3\x50\x2C\x66" +
190 | "\x20\x84\x1C\x17\xEE\x5E\x09\xEF\xD5\x08\x31\x94\x08\x49\x92\x64\x18\x26\x2F\x2F\x2F\x33\x33\x33\xE8\xB3\xB0\xD9\x6C\xE7\xCF\x9F" +
191 | "\x1F\xBA\x51\x1C\x07\x18\x86\xF1\xFC\x05\x6B\x7D\x14\x6A\xD6\x79\x3C\x6E\x9C\x20\x28\x7A\x64\x8C\x4D\x9C\x20\x82\xB3\xD6\x28\x74" +
192 | "\x72\xD8\x5B\xA0\x2C\x5F\xAD\xF6\x42\xF2\x17\xC7\x71\x6D\x6D\x6D\x55\x55\x55\xA8\x06\xE2\x60\x97\xFF\x48\x84\x88\x87\x98\x91\x91" +
193 | "\x81\xD4\x19\xB3\xD9\xAC\xD1\x68\xC2\x2E\xA8\xAC\xAC\x1C\xD6\x9B\x8E\xA8\x25\x5E\xAF\x17\xE5\xC1\xA0\xD9\x20\xA1\xAF\xB9\xCD\xD6" +
194 | "\x49\x8B\x18\x91\x68\x04\x79\x9D\x24\x2D\xA2\x45\x22\x87\xC3\x8E\x3E\x86\xB9\x87\x12\x01\x8F\xC7\x83\xAA\xF1\x0F\x76\x02\xCA\xB5" +
195 | "\x0F\x4B\xD4\xC6\x2E\x32\x10\x5B\x5A\x5A\x50\xE0\x30\x2C\xF5\x9E\x54\xAB\xD5\x85\x85\x85\xA8\x12\x62\x30\x64\x1F\x63\x5F\x51\xC8" +
196 | "\x1B\x29\x35\x14\x45\xA1\x3A\xFE\x89\x13\x21\xC7\x71\xCD\xCD\x4D\x12\xA9\x9C\x19\x49\x61\x64\x11\x23\x66\x24\xB2\xAE\xAE\xAE\x40" +
197 | "\x20\x40\x51\x54\x7F\xF7\x71\x7C\x21\x08\x42\x4F\x4F\x37\x8E\xE3\x43\x7B\xBA\x07\x44\x18\x03\xB1\xA9\xA9\xA9\xAE\xAE\xAE\xA7\xA7" +
198 | "\x07\x42\x78\xE6\xCC\x19\x32\x25\x25\x65\xF9\xF2\xE5\xF1\xED\x6E\x52\x52\x92\x58\x2C\xB6\xD9\x6C\x7E\xBF\x1F\x3D\x1D\x9E\xE7\x13" +
199 | "\xA7\x2F\xD8\x6C\x36\x9B\xCD\x96\xA4\x4A\x96\xC9\xC3\xF5\x2C\x28\x08\xF0\x62\xD2\x56\xD8\x21\x86\x11\xCB\x15\x4A\x87\xA3\xBB\xBB" +
200 | "\xBB\x5B\xA7\xD3\x71\x1C\xC7\xF3\x7C\xE2\xEC\xD7\x40\x20\x60\xB5\xB6\x52\x14\x85\x9C\x79\x51\x83\x24\x49\xA3\xD1\x68\x34\x1A\xD1" +
201 | "\xC7\xB6\xB6\xB6\x84\x68\xD2\xC8\x50\xAB\xA8\x28\xF7\xF9\x7C\x52\xA9\x54\x10\x04\x96\x65\x13\x57\xA4\xCD\x62\x69\xB4\xD9\x6C\x53" +
202 | "\x66\x4F\x0A\xAE\x85\x01\x3F\x5B\x5F\x79\xB6\xE6\xFC\xA9\xAE\x76\x6B\x20\xE0\x97\x29\x92\xD2\x32\x8D\xF9\x13\x8B\x75\x19\xD9\xE0" +
203 | "\xE2\x9B\x04\x70\x22\x35\x2D\xF3\xB4\xA5\xB6\xB5\xD5\x8A\x44\xE8\xF7\xFB\xA3\xA8\xF1\x1D\x21\x58\x96\xB5\x58\x1A\x55\x2A\xD5\x60" +
204 | "\x71\xAB\xA8\x91\x28\x63\xC8\x6C\xCE\x2D\x2B\x3B\x59\x5F\x5F\x8F\x8A\x7F\x79\x3C\x9E\xC4\xD5\x93\x38\x7A\xF4\x28\xCB\xB2\xE6\x71" +
205 | "\x93\x30\x0C\x83\x10\x96\x7F\x7F\x6C\xEB\x67\xEF\xDA\xDA\x5A\xD0\x51\x80\x61\x18\x00\x10\x42\xFC\x0B\x62\x5C\xF1\xF4\xA5\xAB\x1E" +
206 | "\x0C\x72\x6D\xB2\xCD\x05\x27\x0E\xED\x3C\x75\xEA\x54\x51\x51\x31\x84\xD0\xEB\xF5\x26\x4E\x84\x1D\x1D\x1D\x56\xAB\x75\xEE\xDC\x79" +
207 | "\x71\x7F\x08\x89\x9A\xDC\x0A\x0A\xF2\x29\x8A\xFA\xEE\xBB\x6F\x91\x1E\xE5\xF3\xF9\x22\x29\x7C\x1E\x05\xDC\x6E\xD7\xDE\xBD\x7B\x95" +
208 | "\xC9\x1A\xBD\x21\x0F\xC3\xB0\xAA\xB3\x27\x3F\x7D\xFD\x85\xAE\x8E\x56\x65\x92\x32\x3B\x2B\x6B\x52\x61\xE1\x15\x53\xA7\x4E\x1C\x3F" +
209 | "\x3E\x53\xAF\x97\xCB\x65\x67\xBF\x3B\xBC\x69\xDD\x9B\x48\x17\xC0\x71\x3C\x35\x4D\xAF\x50\xAA\x8F\x1F\x3F\x86\x6A\x2E\x79\xBD\xDE" +
210 | "\xD8\xB7\x0F\x1A\x0C\x47\x8F\x1E\x01\x00\xF4\x57\x55\x62\x07\xD9\xD9\xD9\xF9\xF9\xE7\x9F\x23\x75\x06\xB1\xD6\xE2\xE2\x6A\xCA\xCB" +
211 | "\xCB\x57\x28\x14\x27\x4E\x7C\xE7\xF1\x78\x64\x32\x19\xCF\xF3\x6E\xB7\x3B\x11\x05\x13\x8F\x1D\x3B\x5E\x55\x55\x59\x38\x7D\x9E\x2A" +
212 | "\x25\x15\x00\xF0\xDD\xC1\x9D\x01\x3F\x9B\x91\x9E\x21\x95\x48\x14\x0A\x05\x4D\x53\x18\x86\x89\x44\x22\x8F\xC7\x93\xA5\xD7\x37\x61" +
213 | "\x58\x6B\x63\xAD\xCB\xD1\x93\xA4\x4E\x21\x29\x5A\xA1\x4C\xCE\x34\xE6\xD7\x9C\x3B\x79\xEE\xDC\xB9\xA9\x53\xA7\x06\x02\x01\xAF\xD7" +
214 | "\x1B\x85\xBA\x31\x2C\xFC\x7E\xFF\xDE\xBD\x7B\x44\x22\xD1\x10\x6C\xA0\x48\x80\x6A\x58\xB6\xB4\xB4\xA0\xAA\x50\x28\xFB\x97\xB4\xDB" +
215 | "\xED\x07\x0E\x1C\x40\x67\x84\xD5\x40\x44\x0C\x44\x2C\x2A\xB3\x17\x71\xB7\x77\xEE\xDC\x59\x59\x59\x81\x02\xAA\xBD\xBD\xBD\x32\x99" +
216 | "\x2C\xBE\x7E\x2C\xBF\x9F\x5D\xB7\xEE\x63\x0C\x80\xA9\x73\xAE\x06\x00\x87\x18\x84\x82\x80\x5D\xAC\xFB\x0F\xE1\x85\x21\x45\xD3\x74" +
217 | "\xA6\x5E\xDF\x6D\xB7\xB3\x2C\xEB\xF1\xFA\x76\x7E\xF5\xE9\xD5\x4B\x57\x4A\xE5\x49\x24\x49\x4D\x28\x99\x55\x79\xFA\xBB\x6D\xDB\xB6" +
218 | "\x4C\x99\x32\x05\xC7\x71\x87\xC3\x21\x91\x48\xE2\xAE\x79\x59\xAD\xD6\xD2\xD2\x52\xA3\xD1\x88\xAA\x31\x47\x8E\x60\x91\x4A\x64\x4E" +
219 | "\x20\x7F\x5B\x18\x0F\xF1\x47\x0F\x34\xAC\x06\x22\x41\x10\x0C\xC3\xE4\xE6\xE6\x66\x65\x65\x85\x9A\xF6\x11\xCE\x36\xB3\x67\xCF\x3D" +
220 | "\x70\xE0\xC0\xD6\xAD\x5B\x0A\x0B\x27\x21\xD3\xA2\xA7\xA7\x27\x35\x35\x35\x8E\x8B\xC1\xDE\xBD\xFB\x4A\x4B\x8F\xE6\x8D\x2F\xCE\x32" +
221 | "\x17\x40\x28\xEC\xDF\xBE\xE9\x7C\xD9\x31\x41\x10\xDA\x3A\xDA\x33\xD2\xD2\x71\x1C\xC7\x71\x82\xA2\x2E\x04\x2C\xAD\xAD\xAD\x2C\xCB" +
222 | "\x4A\xC4\xE2\xD2\x3D\xDB\x6B\xCF\x9F\x59\xF5\xC8\x53\x52\x99\x22\x3D\xCB\x94\x69\xCA\x3F\x71\xE2\xC4\xF7\xDF\x97\x15\x17\x4F\x61" +
223 | "\x59\xD6\x6E\xB7\x47\x42\xDB\x89\x1C\x10\xC2\xBF\xFD\xED\x4B\xBF\xDF\x3F\x6F\xDE\xFC\xA1\x7F\xBB\x20\x08\x27\x4F\x9E\x44\xD5\xEF" +
224 | "\x31\x0C\xE3\x38\xAE\xB5\xB5\x15\x6D\x2D\x36\xC4\x32\x34\xD4\x98\x40\xB1\x8C\x53\xA7\x4E\x9D\x3A\x75\x2A\xF4\xFB\x08\xE7\xC3\xB1" +
225 | "\x63\xC7\x9A\x4C\xE6\xD2\xD2\xD2\x9A\x9A\x6A\x34\x81\xB8\x5C\x2E\x9A\xA6\x07\x64\x60\x44\x81\xAE\xAE\xCE\x35\x6B\x5E\x06\x04\x39" +
226 | "\xFF\xBA\x5B\x29\x8A\x3E\xB6\xFF\xEF\xDF\xFC\xDF\x07\x0A\x99\xD8\x38\xC6\x74\xEA\x7C\x55\x53\x73\x93\x4C\x26\x97\xC9\xA4\x0C\xC3" +
227 | "\xF0\x82\x60\xB3\xD9\x7C\x3E\xDF\xCC\xA9\x93\xEF\x5F\xB9\xEC\x1F\x7B\x8F\x7C\xB9\x65\xC7\x27\xAF\x3F\x7F\xF7\xAF\x9E\xA6\x45\xA2" +
228 | "\xA9\x73\xAF\xD9\xF8\xE1\x2B\x1F\x7E\xF8\x61\x41\xC1\x18\xA9\x54\xDA\xDB\xDB\x4B\xD3\x74\x84\xD9\xF1\x91\xA0\xB3\xB3\xF3\xCB\x2F" +
229 | "\x37\xA8\xD5\xEA\xE9\xD3\x67\x0C\x7D\xA6\x20\x08\x87\x0E\x1D\x1A\x69\xFB\xC3\x9B\x41\x04\x41\xA0\x80\x1F\x02\x2A\x4F\xAA\x52\xA9" +
230 | "\x90\x18\x78\x9E\x97\xC9\x64\x57\x5E\x79\x65\xFF\xC9\x07\x00\x40\x51\xE4\xB1\x63\xC7\x3A\x3A\x3A\x66\xCF\x9E\x83\xA6\x50\x9F\xCF" +
231 | "\x47\x10\x44\xEC\xFB\x05\xFA\xFD\xFE\xA7\x9F\x7E\xFA\xD0\xA1\x83\xF3\x96\xDC\x52\x32\x7B\x81\xAD\xB5\x79\xFD\xDB\x2F\x31\x14\xBE" +
232 | "\xEC\xFA\xAB\xC7\x17\xE4\x66\xE8\x34\x9D\xDD\x3D\xF6\xDE\x5E\xA7\xCB\x65\x77\x38\x9C\x4E\x27\x49\x10\x37\x5C\x33\x7F\xD5\xF2\x1B" +
233 | "\xA5\x12\xF1\xD8\x3C\xA3\x48\x44\x1F\x3D\x76\x9C\x65\xFB\xF2\xC6\x17\xC9\xE4\x49\x1E\x97\xF3\xEC\xF7\xDF\x72\x1C\x57\x5C\x5C\x0C" +
234 | "\x00\xF0\xF9\x7C\xF1\x8A\x00\xF3\x3C\xFF\xCA\x2B\xAF\x1C\x3A\x74\x70\xE9\xD2\xA5\x85\x85\x3F\x22\x74\x41\x08\xF7\xED\xDB\x17\x5A" +
235 | "\x15\xD8\xE1\x70\xF0\x3C\x8F\x2A\x19\x06\xF7\x0F\x89\xD2\xCD\x4D\xD3\x34\x8E\xE3\x66\xB3\x19\x05\x9B\x72\x72\x72\x82\xBF\xA7\xAA" +
236 | "\xAA\x6A\xFD\xFA\xF5\x91\xFF\x06\x08\xE1\x89\x13\x27\xF6\xEC\xD9\xB5\x78\xF1\xB5\x48\x6C\x5D\x5D\x5D\x82\x20\x28\x95\xCA\xA8\xA5" +
237 | "\xC8\xF3\xFC\x9B\x6F\xBE\xB1\x79\xF3\x57\xA6\x31\x13\xE7\x2D\xB9\x05\x00\xFC\xE8\xEE\xAD\x6E\xA7\xE3\xBA\x45\xF3\x92\x55\x4A\x0C" +
238 | "\xC3\x72\x32\x33\x56\xDE\x76\x63\x77\x8F\xA3\xD7\xE9\x02\x00\x68\x52\xD4\x13\xC7\xE6\x69\x52\x2E\xD8\xD4\x00\x80\xAB\xE7\xCF\x38" +
239 | "\x79\xA6\xBC\xBC\xEC\xD8\x8C\xAB\xAE\x15\x4B\x64\x33\x16\x5C\xD7\xD2\x58\xBB\x79\xF3\xE6\xCC\xCC\xAC\x25\x4B\x96\x08\x82\xD0\xD5" +
240 | "\xD5\x05\x21\x8C\xBD\x60\xFC\xD9\xB3\x67\x3F\xFD\x74\x5D\x7A\x7A\xC6\xA2\x45\xD7\x0C\x7B\x32\x49\x92\xF7\xDF\x7F\x7F\x41\xC1\x85" +
241 | "\x82\x11\x2C\xCB\x22\x5A\x7D\x73\x73\x73\x55\x55\x95\xDF\xEF\x1F\xD0\x85\x44\x22\xBF\x28\xFA\x61\x1A\x8D\x26\x3F\x3F\x3F\x2D\x2D" +
242 | "\x6D\x88\x7A\x88\x23\xD2\x47\x10\x7B\x1F\x00\xB0\x76\xED\xDA\xBC\xBC\x82\xDC\xDC\x0B\x7C\x3D\x54\x63\x33\x39\x39\x39\x0A\xC5\x81" +
243 | "\xE7\xF9\x77\xDF\x7D\xE7\x8D\x37\x5E\x57\xA5\xE8\x6E\xB9\xF7\x57\x12\xA9\xDC\xED\x74\x54\x9D\x39\xA9\x49\x51\x1B\xB3\xF5\x17\x3B" +
244 | "\x49\x64\xEB\xD3\xA7\x15\x4D\x18\xEC\x2D\x61\x44\xA2\xAB\x66\x5D\xF1\xD7\x77\x3F\x69\x6B\xAA\x1F\x57\x3C\x03\x42\x78\xCD\xD2\xBB" +
245 | "\x36\x7E\xF4\xEA\x5B\x6F\xBD\x21\x95\x4A\xE6\xCD\x9B\x8F\xA4\x88\xA2\x9E\x51\xBF\x6A\x0E\x87\xE3\xC9\x27\x7F\xCF\xB2\xFE\x5B\x6E" +
246 | "\x59\x16\xE1\xAE\x68\x24\x49\x06\xD5\x0E\x8A\xA2\xC6\x8D\x1B\x37\x6E\xDC\x38\xEC\x22\x03\x31\x58\x98\x1B\xA5\xC1\xA0\x08\x3E\xA9" +
247 | "\xD7\xEB\x6F\xBF\xFD\x76\xB4\x85\x42\x84\xA4\xB1\xC8\xE1\x74\x3A\x21\x84\xF3\xAF\x5D\x76\x68\xC7\xD7\x2F\xBE\xF8\xC2\x8B\x2F\xFE" +
248 | "\x39\x98\xBF\xEF\x74\x3A\x59\x96\x4D\x4D\x4D\x1D\xD1\x7C\xE5\xF5\x7A\x5F\x7E\xF9\x7F\x3F\xFA\xE8\x43\x99\x32\xF9\xA7\x0F\xFE\x8F" +
249 | "\x26\x4D\x8F\x61\x58\x4F\x67\x47\xAF\xBD\x6B\xE2\x18\x93\x48\x74\x21\xBC\x95\x99\xAE\x4B\x51\x0F\xB3\x60\x67\xE9\xD3\x28\x8A\xEC" +
250 | "\xEA\x68\x93\xCA\xE4\x5C\x20\x90\x9E\x6D\x5C\x7C\xEB\xDD\x5B\xBF\x58\xFB\xD2\x4B\xAB\xDD\x6E\x37\xAA\x80\x67\xB7\xDB\x51\x27\xA3" +
251 | "\x50\xA4\x59\x96\x7D\xF6\xD9\x3F\x9E\x3E\x7D\x9A\xA2\xA8\xD8\x57\xD6\x20\x03\x71\xFA\xF4\xE9\x18\x86\xF5\xF5\xF5\xB5\xB7\xB7\x0B" +
252 | "\x82\xB0\x7E\xFD\x7A\x9C\x61\x18\xA3\xD1\x18\xBA\xB1\x56\x1C\xE1\x74\x3A\x49\x92\x9A\x7D\xF5\x8D\x33\x17\x5C\xD7\xD0\xD8\xF0\xA7" +
253 | "\x3F\x3D\x63\xB7\xDB\x83\x47\x59\x96\xB5\x5A\xAD\x3D\x3D\x3D\x11\x5A\xFD\x95\x95\x95\xAB\x56\xAD\x5C\xFB\xDE\xDA\x64\x6D\xC6\xBD" +
254 | "\x8F\x3D\x93\x69\xBC\x40\x00\x64\xFB\xBC\x01\x3F\x9B\x74\xF1\x31\x21\x8F\xA8\x20\x08\x10\x62\x17\xEB\xCD\x0E\xB0\xA0\x78\xBC\x3E" +
255 | "\x8E\xE3\x45\x0C\x03\x70\x5C\xAE\x54\x91\x14\x6D\x1A\x53\x78\xDD\x1D\xF7\x01\x82\x7A\xF5\xD5\x57\xFE\xFA\xD7\x35\x68\x07\x02\xAF" +
256 | "\xD7\x6B\xB5\x5A\x51\xB2\x4E\xE4\x3F\x3C\x10\x08\xAC\x59\xF3\x97\x0D\x1B\x36\x50\xB4\x48\x10\x04\x9F\x6F\xC4\xE5\x9A\x87\x06\xC3" +
257 | "\x30\x39\x39\x39\x46\xA3\x51\x2C\x16\x27\x96\x6D\xE0\x72\xB9\x44\x8C\x98\xA4\xE8\x25\xCB\xEF\xF5\xB8\x9D\x27\x0F\xEF\xFE\xDD\xEF" +
258 | "\x7E\xFB\xE4\x93\x4F\x07\x2B\x6A\x42\x08\xED\x76\xBB\xD3\xE9\x4C\x4A\x4A\x92\xCB\xE5\x83\xBD\xEC\x36\x9B\xED\xBD\xF7\xD6\x7E\xF2" +
259 | "\xC9\x3A\xAF\xD7\x3B\x61\xCA\x8C\xA5\xAB\x1E\x0A\x4D\x48\x13\x31\x12\x8A\x16\x75\xDB\x1D\xC1\x36\xEB\x2D\x2D\x75\x8D\xCD\xDD\xF6" +
260 | "\xDE\x86\xA6\x96\xEE\x1E\x07\x84\x50\xA9\x90\xEB\x34\x29\x63\xF3\x4D\x79\xA6\x1C\x46\x44\xBB\x3D\xDE\x4D\xDB\x77\x93\x14\x6D\xC8" +
261 | "\x1B\x87\x61\x18\x41\x10\x4A\x75\x72\xAF\xBD\xDB\x54\x30\xF1\xB6\x9F\x3F\xBA\x6D\xFD\xFB\x5B\xB7\x6E\x29\x2B\x3B\x79\xCF\x31\xF9" +
262 | "\x0F\x70\x00\x00\x0F\x52\x49\x44\x41\x54\x3D\xF7\xCE\x99\x33\x17\x75\xC0\xE9\x74\xAA\x54\xAA\x48\xCA\xE0\xB2\x2C\xBB\x7A\xF5\x9F" +
263 | "\xDF\x7B\x6F\xAD\x36\x3D\x73\xD6\xD5\x37\x6D\xFA\xE8\x35\xAF\x37\xCA\x7D\x7A\x23\x41\x62\x45\xE8\x76\xBB\x18\x89\x14\x00\x9C\xA4" +
264 | "\xA8\x65\xF7\xFE\x8A\x20\x88\xEF\x0E\xEE\x7C\xE8\xA1\x07\x56\xAE\xBC\xEB\xEA\xAB\xAF\x09\x8E\x7B\x9E\xE7\x7B\x7A\x7A\xEC\x76\x3B" +
265 | "\xC3\x30\x88\x8F\x4B\x51\x14\x8E\xE3\x3C\xCF\x9F\x3D\x7B\x76\xD3\xA6\xBF\x6D\xD9\xB2\xC5\xE9\x74\x26\xA9\x52\x6E\x5B\xF1\x5F\xC5" +
266 | "\xB3\x16\x84\x11\xEF\x35\xE9\x99\x9A\xF4\xAC\xF3\x55\xB5\x29\x2A\xE5\x98\x7C\x93\xDF\x1F\xA8\xAE\x6B\x3C\x57\x59\x63\xEB\xEA\x41" +
267 | "\x27\x84\xC6\xF4\x49\x92\x4C\x56\x25\xB9\xDC\x1E\xAF\xAF\x6F\xF2\xF4\xF9\x39\xF9\xE3\xD1\x39\x38\x41\x28\xD5\x29\x2E\x67\xAF\x36" +
268 | "\x23\x7B\xC5\x2F\x7E\x7B\x78\xE7\xE6\x53\xA5\xFB\x9F\x7D\xF6\x4F\x66\xF3\x17\x37\xDD\x74\x33\x12\x64\x5B\x5B\x1B\x4D\xD3\x32\x99" +
269 | "\x4C\x2A\x95\xF6\xF7\x61\xA1\x14\xCE\xDA\xDA\xDA\x17\x5E\x78\x6E\xFF\xFE\xFD\xA9\x3A\xFD\xCA\x87\x9F\xEC\xF3\x79\x21\x8C\xFF\x28" +
270 | "\x0C\x45\xA2\x45\xE8\x61\xC4\x12\xA4\x1C\x53\x34\xBD\xEC\xDE\x5F\x69\xD2\xB3\x76\x7E\xF5\xE9\x5F\xFF\xBA\x66\xDD\xBA\x8F\x67\xCC" +
271 | "\x98\x39\x69\xD2\x64\x93\xC9\x98\x9A\xAA\x41\x66\x86\xC3\xE1\x68\x6A\x6A\x6A\x6F\x6F\x6B\x68\x68\x28\x2F\x2F\x3F\x75\xEA\x7B\x54" +
272 | "\x32\x4E\xA1\x54\x5F\x73\xCB\x5D\x33\x17\x5D\x2F\x95\x0D\xA0\x22\x32\x62\xC9\x4F\x6E\x5D\xF5\xD9\x1B\x2F\xEC\x3A\x58\xBA\xF3\xC0" +
273 | "\x51\x24\x2C\x9A\xA6\x27\x4D\x9A\x64\x30\x18\x4F\x9E\x3C\xB1\x72\xE5\x5D\xA9\xA9\xA9\x3D\x3D\xF6\xD7\x5E\x7B\xD5\xE9\x72\xBA\x7C" +
274 | "\x7E\x46\xA6\x2C\x9E\x33\xFD\xAA\xEB\x97\x87\x46\x97\x00\x8E\x2B\x94\x2A\x5A\x24\xC2\x09\x62\xC1\x0D\x77\x4C\x98\x32\xF3\xC8\xAE" +
275 | "\x2D\xB5\x15\xA7\x57\xAF\xFE\xF3\x1B\x6F\xBC\x5E\x5C\x5C\x5C\x5C\x3C\x65\xDC\xB8\xF1\x7A\xBD\x9E\x61\x18\x54\x06\x03\x5D\xCE\xF3" +
276 | "\x7C\x67\x67\x67\x59\x59\xD9\xBE\x7D\x7B\x4A\x4B\x4B\x39\x8E\x33\x16\x4C\x58\x76\xEF\x23\xDA\x8C\xCC\xF6\x96\x46\xE4\x40\x4F\xDC" +
277 | "\x43\x26\xAB\xAB\xAB\xEF\xBF\xFF\x7E\xA4\x8E\x22\x45\x34\x37\x37\x37\x3D\x3D\x1D\xE5\x6A\xC7\x62\xBD\xA1\x35\x80\x51\x24\xE3\x17" +
278 | "\x1F\x13\x4E\x10\xF3\xAF\x5D\x36\x71\xEA\xAC\x43\x3B\x36\x7F\x7F\x74\xDF\x37\xDF\x6C\xDF\xB6\x6D\x2B\x86\x61\x00\x00\xC4\x72\xFB" +
279 | "\xC1\x75\x04\x00\x0E\x70\xB1\x54\x56\x78\xC5\x9C\x49\x57\xCC\xCD\x9F\x34\x65\xE8\x88\x7C\xDE\xF8\xA2\x9F\x3D\xFE\x6C\xD9\xD1\x7D" +
280 | "\x36\x6B\x93\xD7\xE3\x6E\xAE\xAF\xBA\xF9\xE6\xA5\x0B\x16\x2C\x74\xBB\xDD\xE7\xCF\x9F\x4F\x4E\x4E\x59\xB2\xE4\x5A\x9B\xCD\xF6\xC1" +
281 | "\x07\xEF\xA9\xB5\x19\xB7\xFE\xFC\x51\x00\x80\x58\x2A\x13\x0F\x54\x4B\x98\x11\x4B\x68\x91\xC8\xEB\x76\xE9\x32\x0D\x37\xAF\x7A\xB0" +
282 | "\xDB\xD6\x7E\xEE\xC4\xD1\xCA\x33\xDF\x1E\x3E\x72\xE4\xE0\xC1\x83\x18\x86\x51\x14\xA5\x52\xA9\x92\x92\x94\x0C\x23\x82\x10\xF3\x7A" +
283 | "\x3D\xDD\xDD\xDD\x48\x71\xC3\x71\x22\x35\x2D\x63\xFA\x95\x4B\xA6\xCC\x59\x88\x0A\x15\x8B\x18\x31\x86\x81\xA8\x37\x3C\x0F\x7D\x98" +
284 | "\x88\x87\x58\x5D\x5D\x8D\x42\xBE\x28\x2D\x06\x0B\x8E\xC2\xB0\x1A\x88\x38\x8E\x1B\x8D\xC6\x9C\x9C\x1C\xB4\x5B\x4C\xA8\x42\x15\xB9" +
285 | "\x2F\x9F\xE3\x38\x96\xF5\x2B\x44\x0C\xF8\xB1\xE5\x90\xAC\x49\xBB\xF1\xCE\xFF\x5E\x7C\xEB\xDD\x96\x9A\x0A\x4B\x5D\xA5\xAD\xAD\xA5" +
286 | "\xB7\xA7\x8B\xF5\x79\x21\x84\x24\x4D\xCB\xE4\x0A\x55\xB2\x26\x35\x3D\x53\x9F\x6D\x4A\xCB\x32\xD1\x91\xE9\xAB\x38\x8E\xEB\x0D\x79" +
287 | "\xEA\x54\x1D\xEB\xF3\x35\xD6\x94\x7F\xF1\xF6\x6A\x0C\xC3\x00\x00\x93\x26\x15\x4A\xA5\x52\x9D\x4E\x4B\xD3\xB4\xDF\xEF\x67\x59\x56" +
288 | "\x91\x22\x61\x24\x52\xA9\x7C\x28\x0F\x11\x8E\x13\x32\x85\x52\x22\x95\xFB\xBC\x1E\x9C\x20\xE7\x2E\x5E\x3A\xFB\x9A\x9B\x3A\xDB\x5B" +
289 | "\x5A\x1A\xAA\xDB\x5B\x1A\xBB\xDA\xDB\x9C\x8E\x6E\xBB\xA3\xF1\x62\xC4\x83\x90\xC8\xE4\x86\xBC\xF1\xE9\xD9\x46\x43\xFE\x04\x43\xDE" +
290 | "\x58\x79\x92\x2A\x38\xD5\x93\x14\x4D\x84\x30\x74\x86\x85\x20\x08\xA1\xCA\x9D\xD7\xEB\x45\xDE\xD1\xE6\xE6\xE6\x9A\x9A\x9A\x01\x79" +
291 | "\x88\x03\x4C\xA4\x61\x0C\x44\x00\x80\x42\xA1\x08\x1A\x2B\x91\x17\xF0\xF2\xFB\xFD\x3C\xCF\x89\x18\x66\xC0\x92\x4D\xB4\x88\xC9\x1D" +
292 | "\x3F\x39\x77\xFC\xE4\x08\x7F\xDB\xB0\x20\x08\x42\x9E\xA4\x92\xCA\x93\x6C\xAD\x4D\x04\x49\xB9\x5C\x2E\x86\x61\xB4\x5A\x9D\x44\x22" +
293 | "\x41\xBA\xA5\xDB\xED\x72\x3A\x9D\xE6\x89\xA9\x12\xA9\x3C\x92\x9F\x80\x13\x84\x54\xAE\x90\xC8\xE4\x01\x3F\xCB\xF6\xF5\x51\xB4\x49" +
294 | "\x1B\x92\x39\xC5\x71\x1C\xCF\x05\x30\x0C\xA3\x28\x9A\x20\x09\x9C\x20\x45\x8C\x98\x11\x4B\xC8\x1F\x47\xB6\x71\x9C\x20\x29\x9A\x65" +
295 | "\x23\x12\x21\xAA\x0B\x12\xFA\xA8\xD1\xE0\x1E\x5A\x19\x1E\x66\x2D\x44\xD7\x87\xED\xB4\x17\xA1\x8F\x94\x65\xFB\x04\x41\xA0\x68\x66" +
296 | "\x34\x77\x74\xC2\x71\x3C\x25\x4D\x2F\x95\x29\x50\xAD\x00\x94\xA2\x8C\xF2\x17\xAB\xAA\xAA\x7C\x3E\x5F\xB6\xB9\x00\x1F\x09\xBB\x02" +
297 | "\x00\x40\x8B\x18\x54\xDC\x96\xE7\x79\x9E\x0B\xF0\x3C\x2F\xF0\x3C\x62\x03\x01\x1C\x27\x08\x92\xA2\x48\x7C\xF0\x64\x7F\x8A\x16\x45" +
298 | "\x38\x0A\xFB\x3F\xEA\x48\x30\x8C\x08\x49\x92\x44\xE5\x12\x82\x06\xB8\xD3\xE9\x6C\x6B\x6B\x8B\xA4\x69\x96\x65\x21\x84\x22\x86\x19" +
299 | "\x05\x8A\x66\x28\x52\x34\x69\x19\x39\xA6\x9A\xF2\x53\x07\x0F\x1E\x1C\x3F\x7E\x3C\xCF\xF3\x10\x62\x56\xAB\xF5\xF3\xCF\x3F\x93\x29" +
300 | "\x94\xB1\x14\x39\x09\xFA\x2D\x23\x07\x00\x80\xA2\x68\xBF\x3F\x22\x6E\x15\x8E\xE3\xE3\xC6\x8D\x0B\x32\xAD\x59\x96\xAD\xAD\xAD\x45" +
301 | "\xE5\x12\x86\x18\x88\xE1\x22\x44\x6A\x85\x5E\xAF\x47\x21\x43\xA3\xD1\x18\x56\x0F\x31\xF2\x44\x6D\xBF\x3F\x80\x46\x61\x24\x27\xC7" +
302 | "\x11\x38\x41\x2C\xB8\xF1\x0E\x4B\x6D\xE5\x3B\xEF\xBC\xB5\x71\xE3\x97\x1E\x8F\xE7\xE8\xD1\x23\x88\x36\x30\x73\xE1\xF5\x3A\x7D\xCE" +
303 | "\x68\x76\x06\x00\x40\x52\x54\x24\x59\x0C\x18\x86\xE1\x38\xBE\x70\xE1\xC2\xB0\xC8\xBE\xC3\xE1\x40\x61\x42\xB4\x17\x73\xFF\xD4\x7B" +
304 | "\x12\x71\xAA\xFA\x97\x0E\x8A\xBD\xF7\x68\xED\xA5\x47\x42\xCF\x8D\x17\x72\x72\xC7\xFE\xFC\x37\xCF\xEE\xDA\xFC\x79\x53\x5D\xA5\x00" +
305 | "\x31\x8A\xA4\x33\x72\x32\x26\x94\xCC\x9A\xBD\xE8\xC6\x51\x9E\x12\x00\x00\x04\x49\x06\x02\x11\x89\x70\x40\x28\x95\xCA\xC9\x93\x27" +
306 | "\x4F\x9E\x3C\x19\xBB\x40\xB7\x6C\xAE\xAB\xAB\x6B\x69\x69\x41\xA5\x83\xEC\x76\x3B\x69\x30\x18\x12\xB4\x5B\x0C\xDA\x99\x94\xBA\x44" +
307 | "\x3B\xE5\x65\x99\x0A\xEE\x79\xF4\x19\x2E\xE0\xE7\x79\x1E\x20\xCD\x30\xC1\x89\x2F\x03\x03\x00\x82\xA4\xE2\xC5\x33\x26\x49\xD2\x60" +
308 | "\x30\x84\xEE\xAF\x93\xD8\xDD\x62\x38\x2E\x00\x21\xBC\x24\xA3\x10\x01\x00\x40\xD1\xA2\x4B\x5B\x6A\x18\x99\xBC\x81\x40\x5F\xE2\xC8" +
309 | "\xD0\x09\xD4\x15\x03\x01\x4E\x10\x04\xF2\xDF\x7B\xB3\x43\x00\x00\x4E\x10\xC1\xF4\x92\x44\x20\x81\x22\x44\xA3\x70\x34\xF3\x9B\x2E" +
310 | "\x4F\xE0\x38\x91\x20\x02\x26\x02\x69\xB7\xDB\x77\xEF\xDE\x8D\xE3\x78\x56\x56\x56\xB0\x06\x62\x5C\x86\x3C\x4A\xA5\xF8\x27\x2A\x9A" +
311 | "\x9E\x08\xA0\xEC\xCC\x78\x25\x06\x21\x33\x1D\xA5\x55\x34\x35\x35\x09\x82\xD0\xD3\xD3\x43\x76\x76\x76\x7E\xF9\xE5\x97\xC1\x9B\xA1" +
312 | "\x72\x4F\x48\x35\x45\x6C\xB3\x58\xE8\x11\x10\xC2\x4B\xA3\x44\x5C\x4E\x40\x09\xB6\x51\x27\xBF\x05\xBD\x2B\xF5\xF5\xF5\xF5\xF5\xF5" +
313 | "\x0D\x0D\x0D\xA8\xBC\xFA\xC0\xBB\xC5\xF0\x3C\xDF\xD0\xD0\xD0\xD0\xD0\x80\x5D\x64\x20\x06\xE9\x33\x41\xA6\x7A\x70\x03\xC2\x61\xC1" +
314 | "\x71\x3C\x86\x61\xFF\xEE\x22\x04\x00\x5C\x10\xA1\x30\x2C\xD9\x0C\x42\xD8\xDE\xDE\x1E\x7C\xD4\x7D\x7D\x7D\x28\x4B\x3B\x98\x62\x38" +
315 | "\xE0\x55\x43\xED\x16\xE3\xF1\x78\x4E\x9F\x3E\x7D\xFA\xF4\xE9\xB0\xB1\x18\x21\x29\x48\x10\x78\x08\x61\x8C\x65\x26\xFF\xD9\x01\x7E" +
316 | "\x18\x85\xC3\x9F\xCC\xF3\xFC\x86\x0D\x1B\x82\x1F\x23\x1C\xBB\x11\x3D\xDF\xE8\xE6\x01\xF4\xD6\x8C\xC8\x21\xF9\xAF\x08\x00\x40\x70" +
317 | "\x14\x0E\x8F\x78\x26\x6A\xA3\x32\xF5\x26\x93\x29\x3B\x3B\x3B\x74\xDB\xAD\xA6\xA6\xA6\xFD\xFB\xF7\x47\xDE\x9B\xD1\x17\x21\xC0\x30" +
318 | "\x0C\x60\x24\x81\x13\x38\x8E\x5F\x98\x3C\xA0\x20\x40\x4E\x80\x3C\x2F\x24\x3C\x1D\x3B\xAC\x33\x00\x43\xEA\x8C\x10\xC1\x9D\xD1\x6E" +
319 | "\x31\xD9\xD9\xD9\xE8\x23\xCB\xB2\x2D\x2D\x2D\x68\x22\x65\x59\x76\x30\x2F\x1D\x19\x7A\x3D\x41\x10\xA9\xA9\xA9\x05\x05\x05\x3A\x9D" +
320 | "\xCE\x64\x32\xA5\xA5\xA5\xF5\x0F\x32\x44\xAE\x59\xA1\x51\x48\x8C\xD6\xE6\x20\x24\x81\x4B\x44\x24\x43\x91\x34\x45\xD0\xE4\x60\xDB" +
321 | "\xCA\x62\x2C\xC7\xB1\x7E\xDE\xEB\x0F\xF4\xF9\x87\xF2\x1D\xC7\x0D\x00\xE0\x38\x31\x74\xD9\xD2\x90\x73\x41\x66\x66\x66\x7E\xFE\x0F" +
322 | "\x5B\x23\xA0\x32\xFB\x41\x06\x62\x73\x73\x73\x75\x75\x75\x47\x47\x87\x20\x08\x41\x8F\x0F\x99\x9A\x9A\x3A\x7F\xFE\x7C\x44\x42\x8C" +
323 | "\x2F\x8F\x4D\x10\x04\x0C\x83\x20\xC1\x91\x26\x1C\x00\x29\x43\xC9\xC5\x34\x43\x0F\xBF\x28\x00\x80\x31\x14\xC9\x50\x64\x92\x54\xC4" +
324 | "\xF3\xD0\xE5\xF3\x3B\x7D\x2C\xC7\x27\x2A\x21\x0D\x43\xD3\x28\x49\x22\x4B\x20\x96\x46\xC2\x18\x88\x0D\x0D\x0D\x6D\x6D\x6D\x10\xC2" +
325 | "\xFD\xFB\xF7\x93\x2A\x95\xEA\xAA\xAB\xAE\x8A\x5F\x9F\x7F\x00\x5A\x40\x13\x17\x2C\x04\x00\x28\xC4\x74\x92\x54\x44\x12\xD1\xDC\x82" +
326 | "\x20\x80\x52\x26\x4A\x92\xD2\x4E\x2F\x6B\x77\xB3\x42\xA2\x46\x24\x20\x08\xA2\x7F\xE1\x97\x58\xC0\x30\x4C\xB0\x48\xE9\x99\x33\x67" +
327 | "\x12\xA8\x2E\x5E\xE4\x8D\x25\x44\x84\x62\x9A\x4C\x56\x48\x68\x32\xD6\xC6\x01\x00\x49\x52\x46\x22\xA2\x3B\x9D\xDE\x3E\x7F\xFC\xDD" +
328 | "\x60\x00\x00\xA4\x93\x27\xCE\x41\x93\xD0\x59\x6E\xC4\xE5\x7C\x22\x01\x00\x20\x59\x2E\xD6\xA9\x64\xB1\xCB\x2F\x08\x8A\xC4\x75\x2A" +
329 | "\xA9\x5C\x9C\x10\x5F\x20\x4E\x90\xF1\x1D\x85\x61\xF8\x27\x33\xDA\x08\x1C\xD7\x28\x25\xE2\x08\x96\xBD\x91\x02\x07\x20\x45\x21\x06" +
330 | "\x00\x38\xBD\x23\xA8\x02\x36\x2C\x50\xA4\x22\xB1\x22\x6C\x6A\x6A\x7A\xF1\xC5\x17\x51\xC5\x20\x14\xAC\x1F\x2C\x21\xE6\x92\x83\x22" +
331 | "\x71\xAD\x52\x3A\x98\xB6\x19\x3B\x00\x00\x6A\x39\xC3\xF1\x82\x97\x8D\x67\x0D\x9A\x20\xD7\x34\xF6\xA6\x20\x84\x6D\x6D\x6D\xB5\xB5" +
332 | "\xB5\xC1\xCD\xEF\xDA\xDB\xDB\x49\xA4\xDE\x60\x18\x56\x57\x57\x87\x85\x30\x10\x91\xD7\x3B\x37\x37\x57\xA1\x50\x84\xAA\x24\xA3\xA1" +
333 | "\x88\x0F\x04\x8A\xC0\x75\x4A\x19\x15\xBF\xC9\x73\x40\xA0\xB1\xD8\xDA\xC3\xC7\x51\x4D\x25\x08\x12\x42\x28\x08\x11\x89\x30\xCC\x8B" +
334 | "\x82\xCA\xEE\x21\xD7\x68\x4B\x4B\x4B\x6D\x6D\x6D\x7F\x1E\x62\xF8\x8C\x14\xB6\x0B\x33\x8E\xE3\x2A\x95\xCA\x6C\x36\x07\xE9\x4F\xBD" +
335 | "\xBD\xBD\x89\x2B\x0B\x31\x18\x08\x1C\xD7\x28\xA5\x89\x96\x1F\x02\x49\xE0\xC9\x72\xC6\xE6\xF0\xC6\xEB\x55\xC5\x09\x1C\x42\x8C\x8F" +
336 | "\xE0\x9D\x40\x35\xE9\x83\x1B\xBB\xF8\xFD\xFE\xDA\xDA\x5A\xBB\xDD\x3E\x74\x3D\xC4\xE1\x77\x8B\xE9\xEE\xEE\xEE\xEE\xEE\x0E\xFD\x32" +
337 | "\x11\x85\x2B\x86\x00\x00\x20\x45\x21\x16\x51\xA3\xE7\xE5\x91\x88\x28\x09\x43\x79\xFA\xE2\x33\x9D\xE2\x04\x89\x61\x11\xAD\x85\x82" +
338 | "\x20\x9C\x3E\x7D\x7A\xA4\xED\x0F\xAF\x17\xA0\x7A\x88\x41\x7E\x2A\xC7\x71\x11\xAF\x94\x17\xF6\xB3\x1B\x69\x9F\xC2\x90\x24\xA6\xA5" +
339 | "\xCC\xA8\x06\x1D\x01\x00\x2A\x19\xE3\xF3\x73\x91\x78\xC5\x86\x05\x8E\x13\x10\x46\xE4\xFC\x04\x00\xC8\x64\xB2\x50\x2A\x30\xCB\xB2" +
340 | "\x28\xEC\x3A\xC4\x55\x03\x88\x10\x2D\x87\xA8\x1E\xA2\x5E\xAF\x37\x1A\x8D\xA1\x9B\xA7\x45\x4E\x42\x04\x20\x0E\x22\x14\x91\x44\x92" +
341 | "\x6C\xB4\x69\x8C\x18\x86\xD1\x24\x21\x63\x28\xA7\x37\x7A\xE6\x59\x10\x38\x8E\x63\x58\x44\x0E\x36\x82\x20\x7E\xF6\xB3\x9F\x85\x92" +
342 | "\x10\x11\x03\xD1\x62\xB1\x20\x06\x22\x2A\x14\x17\x76\x15\x19\xAC\xA7\xAE\x50\x28\x0A\x0A\x0A\x32\x32\x32\x0C\x06\x03\xDA\x99\x35" +
343 | "\xF6\xDE\x03\x80\x45\xE8\xA1\x1F\xEC\x72\x95\x9C\x21\xF0\x4B\xA3\x1E\x2B\x24\x22\xB7\x2F\x10\xBB\xD7\x06\x29\x83\xD1\x3D\x87\x30" +
344 | "\x06\xA2\xD5\x6A\xAD\xAB\xAB\x6B\x6A\x6A\xAA\xAC\xAC\x44\x59\x06\x10\x42\xD2\x68\x34\x3E\xF0\xC0\x03\x38\x8E\xC7\x3D\xCB\x17\xC7" +
345 | "\x71\x0C\x03\x30\x06\xDD\x47\x4C\x53\x62\xFA\x92\xF1\x36\x28\x92\x90\x88\x28\x77\x5F\xAC\x03\x11\xC4\x16\xB5\x0F\x82\x24\xC9\xEC" +
346 | "\xEC\xEC\xD0\x38\x06\xCF\xF3\x6F\xBE\xF9\x26\x89\x76\x28\x8C\xB1\xF5\x01\x81\x6A\x03\x47\xAD\xBE\x02\x00\x94\x32\xE6\x12\x1A\xA8" +
347 | "\x00\xC3\x64\xE2\x78\x88\x10\x5C\xD8\x6D\x37\x1E\x9D\xFA\x01\xC8\x46\x20\x88\xA8\x1C\xC4\x11\x02\x25\x34\x09\xD1\x4E\xA4\x62\x9A" +
348 | "\x14\x25\xCC\x8A\x8F\x10\x22\x8A\xA0\x62\x7E\x44\xE8\x2D\x4C\x9C\x3D\x9D\x40\x11\x5E\x50\x67\xA2\x55\xEA\x14\x62\xFA\x92\xFB\x88" +
349 | "\x08\x1C\x8F\xDD\x98\x01\x17\xD6\xC2\x78\x74\x68\x20\x90\x28\x34\x0C\x00\x48\x49\x49\x41\xF9\xE3\xF1\xF2\xAE\xA1\x65\x3C\x42\xAF" +
350 | "\x44\x18\x68\x92\x10\x25\xC0\x11\x1A\x05\x44\x14\xE9\x8E\x93\x81\x18\x17\xA0\x65\x35\x10\x08\xA0\xE2\x46\x2C\xCB\x92\xCD\xCD\xCD" +
351 | "\xCF\x3F\xFF\x3C\x3A\x8C\xB8\x87\xE9\xE9\xE9\x79\x79\x79\x31\x32\x10\xB1\xD8\x44\xC8\xD0\xE4\xA5\x52\x44\xC3\x30\x9A\x2E\x85\xC1" +
352 | "\x10\xE4\x21\x56\x57\x57\x5B\x2C\x96\xFA\xFA\xFA\xE6\xE6\x66\x00\x00\xFA\x9E\x0C\x55\x37\x82\xBB\x30\x07\x19\x88\x88\x56\x9A\x93" +
353 | "\x93\x13\xD4\x57\x23\x57\x4F\x90\xB9\x12\x9D\x46\x3A\xCA\xB6\xFC\x10\x20\x08\x1C\xC7\x41\x2C\x36\xFE\x85\xFA\x9A\x91\xBD\x90\x28" +
354 | "\xA7\x1E\xFD\x1D\x08\x04\x50\x7E\x36\xDA\x2D\x66\x30\x1E\xE2\xA0\xBB\xC5\x04\x19\x88\xFD\x99\xAC\x11\x3A\xD8\x2E\x8E\xC2\x91\x53" +
355 | "\xB2\x08\x3C\x76\x25\x22\x5E\x20\x00\xA0\x08\x9C\x8D\x6A\x2E\x41\x08\x2D\x99\x32\x34\x38\x8E\x7B\xF5\xD5\x57\x83\x1F\x83\x35\x90" +
356 | "\x86\xBE\x6A\xF8\x27\x15\xC9\x9E\x33\x03\x37\x1D\xAD\x08\x69\x92\x20\x46\x31\xB7\x7B\x68\xE0\x38\x88\x31\xBC\x85\x14\xBA\x28\x96" +
357 | "\xA4\x08\x49\x53\x43\xA9\x0C\x88\xD3\x86\x78\x88\x41\x67\x4D\x57\x57\x57\x75\x75\x75\x24\x3D\x00\x00\x07\x00\x44\xB1\x16\xD2\x14" +
358 | "\x71\xC9\x75\xD1\x50\x30\x14\xE9\xF2\x45\x6F\x1D\x0A\x02\x87\x92\xF2\x87\x3D\x13\xC7\xF1\x69\xD3\xA6\x05\xD3\xAA\x51\x49\x59\xB4" +
359 | "\xE1\x56\xA4\x25\x65\x83\x3C\x44\x54\xA4\xDB\x64\x32\xE9\x74\xBA\x30\xFE\x52\x65\x65\x65\x6D\x6D\x6D\x24\x5D\xBF\x30\x0A\x47\x1E" +
360 | "\x78\xBB\xE4\xE6\x60\x18\x44\x34\x89\x74\x87\xE8\x2E\xE7\x79\x1E\xC3\x40\x24\x34\x30\x24\xC2\xB0\x44\xED\x20\x03\x11\xC5\x0B\x5B" +
361 | "\x5B\x5B\xC3\x72\xB5\x49\x95\x4A\x35\x6E\xDC\x38\x64\x54\xE4\xE4\xE4\x84\x6A\x2E\x31\x02\xC7\x41\x74\xEA\xCC\xE8\xC4\x05\x23\x07" +
362 | "\x81\x03\x8A\xC4\xFD\x81\x28\x97\x43\x8E\x0B\x00\x10\xFD\xE6\x7A\x41\x06\x22\xFA\x88\x12\x2D\x1A\x1B\x1B\xBB\xBB\xBB\x05\x41\x28" +
363 | "\x2F\x2F\x27\x53\x53\x53\xEF\xBC\xF3\xCE\xE8\x5A\x1F\x1A\xD1\x19\x15\x21\x14\xEC\xCB\x05\x04\x0E\x44\x24\x11\xB5\x08\xF9\x40\x00" +
364 | "\x15\x48\x8E\x4B\x67\x18\x86\x29\x28\x28\x08\x96\x9D\x8D\xC3\x8E\xDA\x43\xAC\xD2\x68\x2D\x1C\xE9\x28\x24\xF0\xB8\xF9\x16\xE2\x88" +
365 | "\x48\x78\xC6\x83\x21\xE0\xF7\x03\x00\x06\xCC\xB3\x8C\x4B\xD2\x61\xAC\x22\x24\x49\x12\x55\xCF\x1D\xA0\x69\xE4\xE6\x1E\xA1\x8F\x34" +
366 | "\x1E\x7B\x09\xC7\x1F\x51\x1B\xF8\x10\x42\xBF\x9F\xC5\x71\xBC\xFF\x76\xEB\x1C\xC7\x75\x75\x75\xC5\x5E\x5C\x24\x0E\xA3\xB0\xAD\xAD" +
367 | "\x6D\xC0\xED\xF0\xA2\xF3\x91\x02\x00\x00\x76\xD9\xC9\x10\x07\x20\x3A\xCE\x38\x14\x84\x80\x9F\x05\x00\x30\x4C\x78\xD9\x88\x8A\x8A" +
368 | "\x8A\xB6\xB6\xB6\xD8\x5F\x58\xB2\xBB\xBB\x7B\xE3\xC6\x8D\x18\x86\x25\x27\x27\x23\x06\xE2\x48\x29\xF4\x3A\x9D\xEE\xA5\x97\x5E\x5A" +
369 | "\xBD\x7A\xB5\x5E\xAF\xFF\xF1\x91\x0B\x59\x45\x23\x6A\x0D\x04\xAF\xBB\x9C\x80\x03\x80\xE3\x00\x1B\xF9\x6A\x28\x08\x3C\xDB\xE7\x25" +
370 | "\x49\x32\xAC\xF2\x87\xD5\x6A\x5D\xBD\x7A\xB5\x4E\xA7\x1B\x79\x83\x42\x5B\x5B\x5B\x4D\x4D\x0D\x22\x34\x75\x75\x75\x91\xDD\xDD\xDD" +
371 | "\x3B\x77\xEE\x44\x87\x11\xE5\xC2\x64\x32\x21\xD5\xD4\x6C\x36\x47\x52\x54\x1A\x79\xE3\x1E\x7F\xFC\xF1\x9F\xFD\xEC\x67\xF3\xE7\xCF" +
372 | "\x0F\xBE\x01\x48\x23\x1D\xA9\x6B\x0A\x42\x18\xE0\x2E\x3E\x2A\x18\xFC\x27\xE4\x78\xC8\xA1\x1F\x1D\x18\xFE\x94\xB0\x70\x41\xC8\x69" +
373 | "\xB0\xDF\xB7\x3F\xEE\x12\x84\x58\x74\x3E\x36\x41\x10\x7C\x1E\x8F\x58\x2C\x0E\x1A\xD6\x82\x20\xEC\xDB\xB7\x6F\xED\xDA\xB5\x12\x89" +
374 | "\x24\xC2\x72\x60\xA8\x1E\x62\x43\x43\x03\xAA\xAD\x1E\x08\x04\x06\xDD\x2D\x06\x19\x1C\xD5\xD5\xD5\x35\x35\x35\x28\x3F\x0D\x91\x83" +
375 | "\x43\xB7\x78\x19\xD0\xC6\xA4\x28\x8A\x65\xD9\xF5\xEB\xD7\xFB\xFD\xFE\x39\x73\xE6\x30\x0C\x13\xE4\x73\x88\x49\x4C\x4A\x8C\xE0\xED" +
376 | "\x25\x20\x64\xBD\x3F\x5A\x3E\xE1\x40\xFF\x0D\xF0\x21\xF8\xE5\x80\x82\x0A\xF9\x00\xFB\x1D\x19\xD0\xE4\x0B\x3B\x2C\xC2\xA0\x68\xE4" +
377 | "\x0B\x22\x01\x38\xC8\x07\x44\x17\xAB\xF0\xF5\xF5\xF5\x1D\x3C\x78\x70\xD3\xA6\x4D\x68\xF7\x8F\xFE\xE7\xF3\x3C\x1F\xAA\x58\x20\xD7" +
378 | "\x76\x73\x73\x33\x92\xDF\x80\xFE\x9A\xE1\xE7\x2C\x82\x20\xD0\xE6\x17\xC1\x7B\x48\x24\x12\x83\xC1\x30\xE0\x24\xEE\xF1\x78\x58\x96" +
379 | "\xCD\xCE\xCE\xD6\x6A\xB5\x81\x80\xFF\xF0\xE1\xC3\x53\xA6\x94\x8C\x74\x1B\xF7\x7F\x25\x08\x82\x70\xEA\xD4\xF7\x34\x4D\x17\x14\x8C" +
380 | "\xE9\xE8\xE8\xB0\x58\x2C\x22\x91\x68\xC0\x0D\x0F\x20\x84\x0D\x0D\x0D\x5E\xAF\x37\xF4\x51\x0F\xC8\x77\x0A\x43\x34\xCB\x8E\x52\xA9" +
381 | "\x34\x1A\x8D\x97\xA3\xE2\xF8\xCF\x0C\x24\xC2\xD0\x1D\x04\x22\x44\x54\x5A\xD6\x25\xE2\xE4\xFF\xCB\x23\x3A\x9E\x51\x34\x22\x4C\xE8" +
382 | "\x56\x8D\xFF\xB6\xE0\x79\x3E\xBA\x2A\xEC\xD1\x58\xAC\x82\x20\xF8\xFD\xFE\x78\x6D\x80\xF6\x1F\x60\x18\x06\x21\x6C\x6A\x6A\xF2\x78" +
383 | "\x3C\x51\x5C\x1B\xA5\xD3\xC1\xE7\xF3\xB9\x5C\x2E\x92\x24\x69\x9A\xFE\x8F\x20\x63\x81\x20\x08\x4E\xA7\xB3\xA1\xA1\x01\x51\x7B\xA3" +
384 | "\x40\xCC\x0E\x3A\x1C\x17\x89\x44\x89\xDB\x4B\xFC\x5F\x1B\x82\x20\xF4\xF5\xF5\xC5\xB8\x2A\xFD\x7F\x4C\x18\xE0\x52\x80\x11\xA5\x37" +
385 | "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"
386 |
--------------------------------------------------------------------------------
/08_spi_ili9341/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 | "image/png"
6 | "log"
7 | "machine"
8 | "strings"
9 | "time"
10 |
11 | "tinygo.org/x/drivers/ili9341"
12 | "tinygo.org/x/tinydraw"
13 | "tinygo.org/x/tinyfont"
14 | "tinygo.org/x/tinyfont/freemono"
15 | )
16 |
17 | var (
18 | white = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}
19 | red = color.RGBA{R: 0xFF, G: 0x00, B: 0x00, A: 0xFF}
20 | green = color.RGBA{R: 0x00, G: 0xFF, B: 0x00, A: 0xFF}
21 | blue = color.RGBA{R: 0x00, G: 0x00, B: 0xFF, A: 0xFF}
22 | black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF}
23 | )
24 |
25 | func main() {
26 | display := InitDisplay()
27 |
28 | // body
29 | display.FillRectangle(20, 20, 280, 200, white)
30 |
31 | // lcd
32 | display.FillRectangle(25, 25, 270, 160, black)
33 |
34 | // speaker
35 | for i := int16(0); i < 4; i++ {
36 | display.FillRectangle(40+i*15, 190, 5, 20, black)
37 | }
38 |
39 | // buttons
40 | for i := int16(0); i < 3; i++ {
41 | display.FillRectangle(40+i*60, 15, 40, 5, blue)
42 | }
43 |
44 | // 5-way key
45 | tinydraw.FilledCircle(display, 260, 180, 20, blue)
46 |
47 | // text
48 | tinyfont.WriteLine(display, &freemono.Regular9pt7b, 30, 40, "Booting Wio Terminal...", green)
49 |
50 | // tinygo logo
51 | {
52 | img, err := png.Decode(strings.NewReader(tinygo_logo_s_png))
53 | if err != nil {
54 | log.Fatal(err)
55 | }
56 |
57 | w := img.Bounds().Dx()
58 | h := img.Bounds().Dy()
59 | for y := 0; y < h; y++ {
60 | for x := 0; x < w; x++ {
61 | r, g, b, _ := img.At(x, y).RGBA()
62 | display.SetPixel((320-int16(w))/2+int16(x), (240-int16(h))/2+int16(y), color.RGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: 0xFF})
63 | }
64 | }
65 | }
66 |
67 | for {
68 | time.Sleep(time.Hour)
69 | }
70 | }
71 |
72 | func InitDisplay() *ili9341.Device {
73 | machine.SPI3.Configure(machine.SPIConfig{
74 | SCK: machine.LCD_SCK_PIN,
75 | SDO: machine.LCD_SDO_PIN,
76 | SDI: machine.LCD_SDI_PIN,
77 | Frequency: 48000000,
78 | })
79 |
80 | // configure backlight
81 | backlight := machine.LCD_BACKLIGHT
82 | backlight.Configure(machine.PinConfig{machine.PinOutput})
83 |
84 | display := ili9341.NewSPI(
85 | machine.SPI3,
86 | machine.LCD_DC,
87 | machine.LCD_SS_PIN,
88 | machine.LCD_RESET,
89 | )
90 |
91 | // configure display
92 | display.Configure(ili9341.Config{})
93 |
94 | backlight.High()
95 |
96 | display.SetRotation(ili9341.Rotation270)
97 | display.FillScreen(color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF})
98 |
99 | return display
100 | }
101 |
--------------------------------------------------------------------------------
/08_spi_ili9341/tinygo-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/08_spi_ili9341/tinygo-logo.png
--------------------------------------------------------------------------------
/09_webclient/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "strings"
7 | "time"
8 |
9 | "tinygo.org/x/drivers/net"
10 | "tinygo.org/x/drivers/net/http"
11 | )
12 |
13 | // You can override the setting with the init() in another source code.
14 | // func init() {
15 | // ssid = "your-ssid"
16 | // password = "your-password"
17 | // url = "http://tinygo.org/"
18 | // debug = true
19 | // }
20 |
21 | var (
22 | ssid string
23 | password string
24 | url = "http://tinygo.org/"
25 | debug = false
26 | )
27 |
28 | var buf [0x400]byte
29 |
30 | func main() {
31 | err := run()
32 | for err != nil {
33 | fmt.Printf("error: %s\r\n", err.Error())
34 | time.Sleep(5 * time.Second)
35 | }
36 | }
37 |
38 | func run() error {
39 | rtl, err := setupRTL8720DN()
40 | if err != nil {
41 | return err
42 | }
43 | net.UseDriver(rtl)
44 | http.SetBuf(buf[:])
45 |
46 | err = rtl.ConnectToAP(ssid, password)
47 | if err != nil {
48 | return err
49 | }
50 |
51 | ip, subnet, gateway, err := rtl.GetIP()
52 | if err != nil {
53 | return err
54 | }
55 | fmt.Printf("IP Address : %s\r\n", ip)
56 | fmt.Printf("Mask : %s\r\n", subnet)
57 | fmt.Printf("Gateway : %s\r\n", gateway)
58 |
59 | // You can send and receive cookies in the following way
60 | // import "tinygo.org/x/drivers/net/http/cookiejar"
61 | // jar, err := cookiejar.New(nil)
62 | // if err != nil {
63 | // return err
64 | // }
65 | // client := &http.Client{Jar: jar}
66 | // http.DefaultClient = client
67 |
68 | cnt := 0
69 | for {
70 | // Various examples are as follows
71 | //
72 | // -- Get
73 | // resp, err := http.Get(url)
74 | //
75 | // -- Post
76 | // body := `cnt=12`
77 | // resp, err = http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(body))
78 | //
79 | // -- Post with JSON
80 | // body := `{"msg": "hello"}`
81 | // resp, err := http.Post(url, "application/json", strings.NewReader(body))
82 |
83 | resp, err := http.Get(url)
84 | if err != nil {
85 | return err
86 | }
87 |
88 | fmt.Printf("%s %s\r\n", resp.Proto, resp.Status)
89 | for k, v := range resp.Header {
90 | fmt.Printf("%s: %s\r\n", k, strings.Join(v, " "))
91 | }
92 | fmt.Printf("\r\n")
93 |
94 | scanner := bufio.NewScanner(resp.Body)
95 | for scanner.Scan() {
96 | fmt.Printf("%s\r\n", scanner.Text())
97 | }
98 | resp.Body.Close()
99 |
100 | cnt++
101 | fmt.Printf("-------- %d --------\r\n", cnt)
102 | time.Sleep(10 * time.Second)
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/09_webclient/wioterminal.go:
--------------------------------------------------------------------------------
1 | //go:build wioterminal
2 | // +build wioterminal
3 |
4 | package main
5 |
6 | import (
7 | "device/sam"
8 | "machine"
9 | "runtime/interrupt"
10 | "time"
11 |
12 | "tinygo.org/x/drivers/rtl8720dn"
13 | )
14 |
15 | var (
16 | uart UARTx
17 | )
18 |
19 | func handleInterrupt(interrupt.Interrupt) {
20 | // should reset IRQ
21 | uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
22 | uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
23 | }
24 |
25 | func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
26 | machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
27 | machine.RTL8720D_CHIP_PU.Low()
28 | time.Sleep(100 * time.Millisecond)
29 | machine.RTL8720D_CHIP_PU.High()
30 | time.Sleep(1000 * time.Millisecond)
31 | waitSerial()
32 |
33 | uart = UARTx{
34 | UART: &machine.UART{
35 | Buffer: machine.NewRingBuffer(),
36 | Bus: sam.SERCOM0_USART_INT,
37 | SERCOM: 0,
38 | },
39 | }
40 |
41 | uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
42 | uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
43 |
44 | rtl := rtl8720dn.New(uart)
45 | rtl.Debug(debug)
46 |
47 | _, err := rtl.Rpc_tcpip_adapter_init()
48 | if err != nil {
49 | return nil, err
50 | }
51 |
52 | return rtl, nil
53 | }
54 |
55 | // Wait for user to open serial console
56 | func waitSerial() {
57 | for !machine.Serial.DTR() {
58 | time.Sleep(100 * time.Millisecond)
59 | }
60 | }
61 |
62 | type UARTx struct {
63 | *machine.UART
64 | }
65 |
66 | func (u UARTx) Read(p []byte) (n int, err error) {
67 | if u.Buffered() == 0 {
68 | time.Sleep(1 * time.Millisecond)
69 | return 0, nil
70 | }
71 | return u.UART.Read(p)
72 | }
73 |
--------------------------------------------------------------------------------
/10_webserver/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "machine"
6 | "strconv"
7 | "time"
8 |
9 | "tinygo.org/x/drivers/net/http"
10 | )
11 |
12 | // You can override the setting with the init() in another source code.
13 | // func init() {
14 | // ssid = "your-ssid"
15 | // password = "your-password"
16 | // debug = true
17 | // }
18 |
19 | var (
20 | ssid string
21 | password string
22 | debug = false
23 | )
24 |
25 | var led = machine.LED
26 | var backlight = machine.LCD_BACKLIGHT
27 |
28 | func main() {
29 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
30 | backlight.Configure(machine.PinConfig{Mode: machine.PinOutput})
31 |
32 | err := run()
33 | for err != nil {
34 | fmt.Printf("error: %s\r\n", err.Error())
35 | time.Sleep(5 * time.Second)
36 | }
37 | }
38 |
39 | func run() error {
40 | rtl, err := setupRTL8720DN()
41 | if err != nil {
42 | return err
43 | }
44 | http.UseDriver(rtl)
45 |
46 | err = rtl.ConnectToAP(ssid, password)
47 | if err != nil {
48 | return err
49 | }
50 |
51 | time.Sleep(5 * time.Second)
52 | ip, subnet, gateway, err := rtl.GetIP()
53 | if err != nil {
54 | return err
55 | }
56 | fmt.Printf("IP Address : %s\r\n", ip)
57 | fmt.Printf("Mask : %s\r\n", subnet)
58 | fmt.Printf("Gateway : %s\r\n", gateway)
59 |
60 | http.HandleFunc("/", root)
61 | http.HandleFunc("/hello", hello)
62 | http.HandleFunc("/cnt", cnt)
63 | http.HandleFunc("/6", sixlines)
64 | http.HandleFunc("/off", LED_OFF)
65 | http.HandleFunc("/on", LED_ON)
66 | if err := http.ListenAndServe(":80", nil); err != nil {
67 | message(err.Error())
68 | }
69 | return nil
70 | }
71 |
72 | func root(w http.ResponseWriter, r *http.Request) {
73 | access := 1
74 |
75 | cookie, err := r.Cookie("access")
76 | if err != nil {
77 | if err == http.ErrNoCookie {
78 | cookie = &http.Cookie{
79 | Name: "access",
80 | Value: "1",
81 | }
82 | } else {
83 | http.Error(w, fmt.Sprintf("%s", err.Error()), http.StatusBadRequest)
84 | return
85 | }
86 | } else {
87 | v, err := strconv.ParseInt(cookie.Value, 10, 0)
88 | if err != nil {
89 | http.Error(w, fmt.Sprintf("invalid cookie.Value : %s", cookie.Value), http.StatusBadRequest)
90 | return
91 | }
92 | cookie.Value = fmt.Sprintf("%d", v+1)
93 | access = int(v) + 1
94 | }
95 | http.SetCookie(w, cookie)
96 | w.WriteHeader(http.StatusOK)
97 |
98 | fmt.Fprintf(w, `
99 |
100 |
101 | TinyGo HTTP Server
102 |
115 |
116 |
117 | TinyGo HTTP Server
118 |
119 |
120 | access: %d
121 |
122 |
123 | /hello
124 | /6
125 |
126 |
127 | LED
128 | /on
129 | /off
130 |
131 |
132 |
133 |
134 | /cnt
135 | cnt:
136 | incrCnt()
137 |
141 |
142 |
143 |
144 | `, access)
145 | }
146 |
147 | func sixlines(w http.ResponseWriter, r *http.Request) {
148 | // https://fukuno.jig.jp/3267
149 | fmt.Fprint(w, ``)
154 | }
155 |
156 | func LED_ON(w http.ResponseWriter, r *http.Request) {
157 | led.High()
158 | backlight.High()
159 | w.Header().Set(`Content-Type`, `text/plain; charset=UTF-8`)
160 | fmt.Fprintf(w, "led.High()")
161 | }
162 |
163 | func LED_OFF(w http.ResponseWriter, r *http.Request) {
164 | led.Low()
165 | backlight.Low()
166 | w.Header().Set(`Content-Type`, `text/plain; charset=UTF-8`)
167 | fmt.Fprintf(w, "led.Low()")
168 | }
169 |
170 | func hello(w http.ResponseWriter, r *http.Request) {
171 | w.Header().Set(`Content-Type`, `text/plain; charset=UTF-8`)
172 | fmt.Fprintf(w, "hello")
173 | }
174 |
175 | var counter int
176 |
177 | func cnt(w http.ResponseWriter, r *http.Request) {
178 | r.ParseForm()
179 | if r.Method == "POST" {
180 | c := r.Form.Get("cnt")
181 | if c != "" {
182 | i64, _ := strconv.ParseInt(c, 0, 0)
183 | counter = int(i64)
184 | }
185 | }
186 |
187 | w.Header().Set(`Content-Type`, `application/json`)
188 | fmt.Fprintf(w, `{"cnt": %d}`, counter)
189 | }
190 |
191 | func message(msg string) {
192 | println(msg, "\r")
193 | }
194 |
--------------------------------------------------------------------------------
/10_webserver/wioterminal.go:
--------------------------------------------------------------------------------
1 | //go:build wioterminal
2 | // +build wioterminal
3 |
4 | package main
5 |
6 | import (
7 | "device/sam"
8 | "machine"
9 | "runtime/interrupt"
10 | "time"
11 |
12 | "tinygo.org/x/drivers/rtl8720dn"
13 | )
14 |
15 | var (
16 | uart UARTx
17 | )
18 |
19 | func handleInterrupt(interrupt.Interrupt) {
20 | // should reset IRQ
21 | uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
22 | uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
23 | }
24 |
25 | func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
26 | machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
27 | machine.RTL8720D_CHIP_PU.Low()
28 | time.Sleep(100 * time.Millisecond)
29 | machine.RTL8720D_CHIP_PU.High()
30 | time.Sleep(1000 * time.Millisecond)
31 | if debug {
32 | waitSerial()
33 | }
34 |
35 | uart = UARTx{
36 | UART: &machine.UART{
37 | Buffer: machine.NewRingBuffer(),
38 | Bus: sam.SERCOM0_USART_INT,
39 | SERCOM: 0,
40 | },
41 | }
42 |
43 | uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
44 | uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
45 |
46 | rtl := rtl8720dn.New(uart)
47 | rtl.Debug(debug)
48 |
49 | _, err := rtl.Rpc_tcpip_adapter_init()
50 | if err != nil {
51 | return nil, err
52 | }
53 |
54 | return rtl, nil
55 | }
56 |
57 | // Wait for user to open serial console
58 | func waitSerial() {
59 | for !machine.Serial.DTR() {
60 | time.Sleep(100 * time.Millisecond)
61 | }
62 | }
63 |
64 | type UARTx struct {
65 | *machine.UART
66 | }
67 |
68 | func (u UARTx) Read(p []byte) (n int, err error) {
69 | if u.Buffered() == 0 {
70 | time.Sleep(1 * time.Millisecond)
71 | return 0, nil
72 | }
73 | return u.UART.Read(p)
74 | }
75 |
--------------------------------------------------------------------------------
/11_spi_ili9341/graphics.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | const tinygo_logo_s_png = "" +
4 | "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x96\x00\x00\x00\x80\x08\x02\x00\x00\x00\x66\xEC\x07" +
5 | "\x33\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x14\xEA\x00\x00\x14\xEA\x01\x71\x95\x86\x57\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9C" +
6 | "\xED\x7D\x67\x60\x1B\x55\xBA\xF6\x9C\x69\x1A\x55\x4B\xB2\x2D\xC9\xB6\x5C\x54\x5C\x52\x9D\xD8\x71\x48\x2F\x90\x04\x36\xA1\x87\x40" +
7 | "\x20\x4B\x08\xB0\x0B\xF7\x2E\xB0\x2C\xB0\x2C\x7B\x77\x3F\x60\xD9\xA5\x6D\xB8\x6C\x96\x5E\x42\x0D\x2D\x37\x6C\x42\x48\x61\x37\xBD" +
8 | "\xC7\x09\x24\x26\xD5\xBD\xC9\xB6\x5C\xE4\x22\x59\xD5\x23\xCD\xCC\xF9\x7E\x9C\x44\x08\xB9\xC9\x2A\x4E\xB6\x3C\x3F\x12\x4B\x33\x73" +
9 | "\xE6\x68\xDE\x39\xE7\xBC\xE5\x79\xDF\x03\xB0\xD8\x00\x00\x20\x49\x92\x20\x08\x00\x40\x8C\x4D\x8D\x14\x10\x42\xBF\xDF\x2F\x08\x42" +
10 | "\x8C\xED\x00\x00\x44\x22\xD1\x25\xE9\x3F\xCF\xF3\x1C\xC7\x41\x08\x63\x69\x87\x8C\xFA\x4A\x86\x61\xB4\x5A\xAD\x52\xA9\x24\xC9\xE8" +
11 | "\x1B\x89\x05\x10\xC2\x9A\x9A\x1A\x97\xCB\x15\x63\x3B\x32\x99\x2C\x37\x37\x77\xF4\x45\x88\xC0\x71\x5C\x6F\x6F\x6F\x47\x47\x87\xCF" +
12 | "\xE7\x8B\xAE\x05\x22\xBA\xCB\x94\x4A\xA5\xD9\x6C\x96\xC9\x64\x38\x8E\x47\xD7\x42\xEC\x00\x00\x08\x82\xD0\xDB\xDB\x1B\x63\x3B\x3A" +
13 | "\x9D\x4E\x2A\x95\xC6\xA5\x4B\x51\x00\xC7\x71\x89\x44\xA2\x56\xAB\x7D\x3E\x1F\xCB\xB2\xD1\xB4\x10\xC5\x35\x24\x49\x66\x65\x65\x11" +
14 | "\x44\x94\xE2\x8F\x23\x54\x2A\x55\x8C\x4F\x5F\x2A\x95\xAA\x54\xAA\x78\xF5\x27\x6A\x10\x04\x91\x93\x93\x13\xDD\x7C\x16\x8D\x08\xA5" +
15 | "\x52\xE9\xA5\x9A\x3C\xC3\x40\x92\x64\x76\x76\x36\x4D\xD3\xD1\x5D\x4E\xD3\x74\x56\x56\xD6\x65\xF2\x5B\x08\x82\x88\xEE\x75\x8C\x46" +
16 | "\x84\x97\x6A\xD9\x18\x10\x62\xB1\xD8\x6C\x36\x8B\xC5\xE2\x28\x2E\x34\x99\x4C\x12\x89\x24\x11\xBD\x8A\x0E\xD1\xAD\x4A\xC3\xBF\x80" +
17 | "\xA8\xDD\x50\xAD\xE9\xB2\x12\x21\x86\x61\x62\xB1\x38\x3F\x3F\xBF\xA3\xA3\xC3\x66\xB3\xF1\x3C\x3F\xEC\xF9\x04\x41\x68\x34\x1A\xAD" +
18 | "\x56\x7B\x39\xAC\x05\x61\x08\x7D\xB6\xE8\xEF\x61\x55\xEE\x81\x85\x41\x10\x84\x58\x2C\xCE\xCD\xCD\xCD\xCE\xCE\xCE\xC9\xC9\x31\x18" +
19 | "\x0C\x0C\xC3\xA0\x43\x95\x95\x95\x9F\x7E\xFA\x69\x66\x66\xE6\xE5\x26\x48\x0C\xC3\x78\x9E\xB7\xDB\xED\x76\xBB\xDD\xE3\xF1\x20\x59" +
20 | "\xA2\x4E\xA2\xF7\x0F\xCD\x54\x6A\xB5\x5A\xA9\x54\x5E\x86\xC2\x83\x10\x36\x37\x37\xAF\x58\xB1\x62\xCC\x98\x31\xE8\x9B\x40\x20\x60" +
21 | "\xB1\x58\xEA\xEA\xEA\x9A\x9B\x9B\xAB\xAB\xAB\xDD\x6E\xF7\x80\x2F\x28\x49\x10\x04\xFA\x3D\x00\x80\xCC\xCC\x4C\xB3\xD9\x9C\x9E\x9E" +
22 | "\x6E\x32\x99\x52\x52\x52\x62\xEC\x50\x2C\x97\x47\x07\x1C\xC7\x93\x93\x93\x93\x93\x93\x21\x84\x2C\xCB\x06\x02\x01\xF4\x9B\x09\x82" +
23 | "\xA0\x69\x9A\xA6\xE9\xE0\x6B\x77\x49\xBA\x37\xD2\x97\x9E\xA2\x28\xB3\xD9\x6C\x36\x9B\xD1\xC7\xDE\xDE\xDE\xBA\xBA\x3A\x8B\xC5\x52" +
24 | "\x5B\x5B\xDB\xDC\xDC\x8C\x5D\xB4\x2C\xC9\xCC\xCC\xCC\xBB\xEF\xBE\x1B\x00\xA0\x56\xAB\x29\x8A\x8A\xB1\x97\x2C\xCB\x7A\xBD\x5E\x86" +
25 | "\x61\xD2\xD3\xD3\xE5\x72\xF9\x65\xF8\xB2\x5F\x12\xF0\x3C\xEF\x72\xB9\x5A\x5B\x5B\xFB\xFA\xFA\x24\x12\x89\x48\x24\x8A\xA2\x91\xA4" +
26 | "\xA4\xA4\xA2\xA2\xA2\xA2\xA2\x22\x0C\xC3\x02\x81\x80\xCD\x66\x13\x04\xE1\xB3\xCF\x3E\x23\x69\x9A\xD6\xE9\x74\xB1\xF7\xB2\xAF\xAF" +
27 | "\x8F\xE3\xB8\x45\x8B\x16\x2D\x5C\xB8\x30\x2D\x2D\xED\x32\x9C\x66\x2F\x39\x20\x84\xED\xED\xED\xBB\x76\xED\xDA\xB1\x63\x07\x45\x51" +
28 | "\xD1\x09\x12\x81\xA2\xA8\x8C\x8C\x0C\x0C\xC3\x44\x22\x51\x7C\x0C\x73\x87\xC3\x61\x34\x1A\xDF\x7A\xEB\xAD\xBB\xEE\xBA\x2B\x3D\x3D" +
29 | "\xFD\x3F\xF2\x1B\x10\x00\x80\xB4\xB4\xB4\x95\x2B\x57\xBE\xF5\xD6\x5B\x06\x83\xC1\xE1\x70\xC4\xA5\xD9\x38\x88\xD0\xE3\xF1\x14\x14" +
30 | "\x14\xFC\xEE\x77\xBF\x53\x28\x14\xB1\xB7\xF6\xEF\x00\x85\x42\xF1\xFB\xDF\xFF\xBE\xA0\xA0\xC0\xE3\xF1\xC4\xDE\x1A\x8E\x9C\xC5\x7E" +
31 | "\xBF\x3F\xEA\x15\xDE\xE5\x72\x3D\xF0\xC0\x03\xB1\xAF\xA3\xFF\x56\x20\x49\xF2\xC1\x07\x1F\x74\x3A\x9D\xD1\x5D\x0E\x21\x0C\x04\x02" +
32 | "\xC8\xCB\x4F\xD6\xD6\xD6\x3E\xFC\xF0\xC3\x18\x86\x29\x14\x8A\xFC\xFC\x7C\xBD\x5E\x6F\x34\x1A\xB3\xB3\xB3\x23\x14\x09\xCF\xF3\x06" +
33 | "\x83\x41\xA9\x54\x46\xD7\x95\x7F\x67\x28\x95\x4A\xA3\xD1\xE8\x76\xBB\x23\x54\xFA\x78\x9E\x6F\x69\x69\xA9\xAD\xAD\x6D\x6A\x6A\xAA" +
34 | "\xAA\xAA\x42\xCE\x61\x08\x21\x09\x21\x44\xE3\xCF\xE1\x70\x1C\x3F\x7E\xFC\xF8\xF1\xE3\x38\x8E\x03\x00\x32\x32\x32\x72\x73\x73\x33" +
35 | "\x33\x33\x73\x73\x73\x87\x30\x30\x78\x9E\x17\x8B\xC5\x97\xD0\xD9\xFD\xCF\x0B\xE4\xE0\xEE\xED\xED\x1D\x42\x84\x0E\x87\xA3\xBE\xBE" +
36 | "\xBE\xB1\xB1\xB1\xB1\xB1\xB1\xBE\xBE\x9E\xE7\xF9\xFE\x96\xFE\x00\xDE\x19\x74\x52\x53\x53\x53\x53\x53\x13\xBA\x93\x48\x24\x0A\x0E" +
37 | "\x4A\x8E\xE3\x62\x51\xA5\xFE\x83\x21\xC0\x71\xDC\xBB\xEF\xBE\x1B\xF4\xD9\x72\x1C\xC7\xB2\xEC\xB0\xFE\xA6\xE1\x1D\x6C\x82\x20\xF8" +
38 | "\x7C\xBE\xD0\x68\x56\xD4\x6E\xE5\xFF\x60\x58\x78\xBD\xDE\x91\x5E\x32\x94\x08\x71\x1C\x27\x08\x42\xAD\x56\xE7\xE5\xE5\x05\x47\x9E" +
39 | "\xDD\x6E\x6F\x6C\x6C\x8C\xAE\x7F\xFF\xC1\xD0\xC0\x71\xBC\xB8\xB8\x38\x18\xFC\x62\x59\xB6\xA6\xA6\xA6\xA7\xA7\x87\xE3\xB8\x21\x3C" +
40 | "\xA5\xE1\x22\x44\x2C\x0A\x93\xC9\x64\x30\x18\xB2\xB3\xB3\x8D\x46\xA3\x5C\x2E\x0F\x3D\xA1\xB2\xB2\x12\x4D\xB0\x97\x09\xD0\x42\x0E" +
41 | "\x21\xE4\x38\xCE\xED\x76\xDB\x6C\xB6\xDE\xDE\x5E\x9F\xCF\xEB\xF3\xF9\x58\xB6\x2F\x10\xE0\x20\x84\x24\x49\x8A\xC5\x0C\xC3\x88\xA5" +
42 | "\x52\x99\x5C\x2E\x4B\x4A\x52\x2A\x95\x4A\x91\x48\x84\x96\xF0\xCB\xC7\x8A\xC5\x71\x7C\xF6\xEC\xD9\x41\x1F\x29\x82\xC7\xE3\xB1\x58" +
43 | "\x2C\x8D\x8D\x8D\x16\x8B\xA5\xAA\xAA\x2A\x10\x08\x70\x1C\x17\x7A\x02\x29\x12\x89\x90\xCF\x3E\x2B\x2B\x4B\xAF\xD7\x9B\xCD\xE6\xC4" +
44 | "\xF9\x56\x78\x9E\xB7\xD9\x6C\x76\xBB\x9D\x61\x44\x3A\x5D\x9A\x58\x2C\x8E\xE2\x46\xC8\x31\x68\xB3\x75\x34\x36\x36\xB6\xB6\xB6\xB6" +
45 | "\xB5\xB5\xD9\x6C\x1D\x5D\x5D\xDD\x0E\x87\xBD\xAF\xAF\x2F\xE4\x44\x80\x81\x1F\xBC\xF8\x48\xD0\xC1\x63\x04\x41\x24\x25\x25\x69\x34" +
46 | "\xDA\x8C\x8C\xF4\xAC\xAC\x6C\xA3\xD1\x94\x93\x93\x23\x95\x4A\x2F\x1F\x71\x06\x21\x95\x4A\xC7\x8E\x1D\x3B\x76\xEC\x58\x0C\xC3\x20" +
47 | "\x84\x6D\x6D\x6D\xB5\xB5\xB5\x56\xAB\xD5\x62\xB1\xA0\xE7\x49\x66\x67\x67\x3F\xF6\xD8\x63\x89\xEE\x87\x20\x08\xBB\x77\xEF\xDA\xBC" +
48 | "\xF9\xAB\xF6\xF6\x76\x34\x6E\x44\x22\x51\x71\xF1\x94\x5B\x6E\x59\x66\x30\x18\x22\x6C\xA1\xBD\xBD\xFD\xD4\xA9\xB2\x33\x67\xCE\x56" +
49 | "\x55\x55\x5E\x74\x6D\x5C\x78\xE6\x22\x46\xAC\x4C\xD1\xA9\x53\x75\xA9\xBA\x0C\xB9\x52\x25\x62\x24\x22\x11\x43\x50\x14\xD2\xAE\x05" +
50 | "\x9E\xE7\xB8\x00\xCB\xF6\xF5\x79\x3D\x1E\xB7\xD3\xE5\xB0\xF7\xF6\x74\x76\xDB\xDA\xAA\x6B\xAA\xAB\x2A\x2B\x90\x60\x51\xF4\x78\xDC" +
51 | "\xB8\xF1\x85\x85\x85\x63\xC6\x8C\x1D\x69\x00\xD2\xEF\xF7\xD7\xD7\xD7\x5B\xAD\x56\x9E\xE7\x34\x1A\x4D\x5E\x5E\x7E\x22\x22\x91\x00" +
52 | "\x80\xF4\xF4\xF4\xF4\xF4\xF4\xE0\x37\x6B\xD6\xAC\x19\xA5\x80\xF5\xFA\xF5\x9F\x6F\xDC\xB8\x91\xA2\x99\x09\x53\x66\xAA\x35\x69\x7D" +
53 | "\x3E\x6F\x63\xF5\xB9\xD2\xD2\xA3\x65\x65\x27\xEF\xBC\x73\xE5\xD5\x57\x5F\x33\x98\x62\x0D\x21\x6C\x6A\x6A\x3A\x7A\xF4\xC8\xF1\xE3" +
54 | "\xC7\x9B\x9B\x9B\xD0\x92\xA0\x54\xA7\x14\x4E\x9D\x93\x61\x30\x6B\x33\xB2\xD4\xA9\x5A\x55\x8A\x56\x22\x95\x0F\x78\xF9\x10\x00\x00" +
55 | "\xF8\x59\xB6\xB3\xAD\xA5\xB5\xA9\xBE\xA5\xA1\xC6\x52\x5B\x61\xB1\xD4\xD6\xD5\xD5\x6D\xD9\xF2\xB5\x54\x2A\x9D\x38\xB1\x70\xE6\xCC" +
56 | "\x59\x45\x45\x45\xC3\xCA\x92\x65\xD9\xBF\xFF\xFD\x9B\x6D\xDB\xB6\x76\x77\x77\x07\xBF\x54\x28\x14\xB7\xDC\xB2\x6C\xC9\x92\x6B\x47" +
57 | "\xC1\xDC\x1A\x0D\x11\x56\x54\x54\x6C\xDD\xBA\x4D\x97\x69\xB8\xF7\xB1\x67\x54\x29\xDA\x0B\xDF\x42\x78\xEE\x64\xE9\xA6\x8F\xDF\x78" +
58 | "\xFF\xFD\xF7\xFA\xFA\xFA\x6E\xBC\xF1\xA6\xB0\x5F\xEB\xF1\xB8\x0F\x1D\x3A\xB4\x7B\xF7\xEE\x86\x86\x7A\x41\x10\x28\x9A\xCE\x9F\x38" +
59 | "\x65\xEC\xE4\x69\xF9\x13\x8A\x52\xB4\xE9\x58\xCC\x33\x1E\x84\x90\xA2\xE9\xF4\x6C\x63\x7A\xB6\x71\xCA\xEC\x05\x18\x86\xF9\xD9\xBE" +
60 | "\x86\xEA\xF3\x55\xA7\x4F\x9C\x2F\x2B\x2D\x2D\x3D\x5A\x5A\x7A\x54\x2E\x97\xCF\x9C\x39\x6B\xD1\xA2\x45\x39\x39\x86\x01\xE7\xD8\xCE" +
61 | "\x4E\xDB\x5F\xFE\xF2\x97\xCA\xCA\x0A\x89\x4C\x3E\xFD\xCA\x25\x7A\x43\x2E\x41\x92\xED\xCD\x8D\x27\x8F\xEC\xF9\xE8\xA3\x0F\x7B\x7B" +
62 | "\x7B\x7F\xFA\xD3\x3B\x63\xEC\xE7\xB0\x18\x0D\x11\xEE\xDE\xBD\xCB\xEF\xF7\x2F\x5E\xB6\x4A\x95\xAC\xF9\xE1\x5B\x00\xC6\x4F\x99\x91" +
63 | "\x9E\x6D\xFA\xE0\xE5\xA7\xD6\xAF\xFF\x42\xA3\xD1\xCC\x9A\x35\x1B\xC3\x30\x08\x61\x57\x57\xE7\xF6\xED\xDB\xF7\xEE\xDD\xEB\x72\xBB" +
64 | "\x68\x11\x33\xBE\x78\xC6\xA4\xE9\xF3\x0A\x0A\xA7\x30\xE2\xC4\xF2\xCC\x68\x11\x93\x3F\xA1\x38\x7F\x42\xF1\x75\x2B\xEE\x6B\x6F\x6E" +
65 | "\x3C\x75\xFC\xE0\xF7\x47\xF7\xEE\xD8\xB1\x63\xE7\xCE\x1D\x63\xC7\x8E\xBD\xFE\xFA\x1B\x27\x4F\x9E\x1C\x4A\xB4\xE9\xE8\x68\x7F\xEE" +
66 | "\xB9\x67\x5B\x5B\x5B\x8B\x67\x5E\x75\xDD\x8A\xFB\x14\x4A\x75\xF0\xD0\xBC\x6B\x97\xBD\xFF\xBF\x4F\x6D\xDB\xB6\xB5\xB0\xB0\x70\xC2" +
67 | "\x84\x89\x09\xED\x36\xD9\xD3\xD3\xF3\xCD\x37\xDF\x20\x77\x8C\xC9\x64\x62\x18\x06\xAD\x1F\xF1\xBA\x01\xC7\x71\x15\x15\xE5\xDA\x8C" +
68 | "\x2C\x75\xAA\x0E\x42\x18\x16\x74\x55\xA7\x6A\x57\x3C\xF0\x3F\x6F\xBF\xF0\xC4\xC7\x1F\x7F\x64\x32\x99\x65\x32\xD9\xD6\xAD\x5B\xBF" +
69 | "\xF9\x66\xBB\xD7\xEB\x51\x26\x6B\x96\x2C\xBE\xA5\x64\xCE\x22\x85\x2A\x39\x5E\x9D\x89\x10\x00\x80\xB4\x2C\x43\x5A\x96\x61\xD1\x4D" +
70 | "\x2B\xAA\xCE\x9E\x3C\xBC\x6B\x4B\xC5\xD9\xB2\xF3\xE7\x9F\xCB\xCF\x2F\xB8\xF5\xD6\x5B\x0B\x0B\x27\xE1\x38\xEE\x76\xBB\x5F\x7B\xED" +
71 | "\x35\x6B\x6B\xDB\xAC\x85\x37\xCC\xF9\xC9\xCD\x0A\xA5\x1A\x42\xE8\x75\xBB\xA4\x72\x05\x86\x61\x0A\xA5\xFA\x96\x7B\x7E\xF9\xEA\x1F" +
72 | "\x1E\xDE\xB5\x6B\x57\x1C\x45\x08\x21\x14\x04\xA1\xAF\xAF\x0F\xAD\xBB\x10\xC2\xEE\xEE\x6E\xB2\xAB\xAB\xEB\xEB\xAF\xBF\x46\xFD\x06" +
73 | "\x00\xA4\xA6\xA6\xE6\xE5\xE5\x69\xB5\xDA\xBC\xBC\xBC\xF4\xF4\x74\x82\x20\x62\x9C\xCD\xBD\x5E\xAF\xCF\xE7\xD3\x66\xA5\x63\x38\xE0" +
74 | "\x79\x8E\xC4\x2F\xB8\x05\xAA\xCF\x96\xD5\x55\x9E\x59\x74\xD3\x8A\xB4\xCC\x9C\x05\x37\xDC\xB1\xE5\xD3\xB7\x5F\x7D\xF5\x15\xA7\xB3" +
75 | "\xB7\xB5\xB5\x4D\x9D\xA2\xB9\xE6\xD6\x7B\x4A\xE6\x2C\xA4\x45\x4C\x1C\x7E\x77\x0C\x20\x48\x72\xEC\xE4\x2B\xC6\x4C\x9A\xDA\xD2\x58" +
76 | "\xB3\x77\xCB\x86\x73\x27\x8F\x3C\xF7\xDC\xB3\x53\xA6\x94\xDC\x71\xC7\x1D\x7B\xF7\xEE\x2D\x2F\x3F\x3F\x69\xFA\xBC\xE9\x57\x2D\x61" +
77 | "\xC4\x12\x0C\xC3\x1C\xDD\xB6\xB7\x9E\x7F\xE2\xB1\xE7\xDE\x14\x89\x25\x18\x86\x69\x33\xB2\xB2\x8C\xF9\x95\x95\x15\x1C\xC7\xC5\x42" +
78 | "\x92\x13\x04\x01\x42\x68\xB3\xD9\xAA\xAB\xAB\x9B\x9B\x9B\x6B\x6B\x6B\x6D\x36\x1B\x92\x25\x3A\xE1\x87\xA6\x91\xB3\xB4\xA3\xA3\xA3" +
79 | "\xA3\xA3\x03\xC3\x30\x44\xC8\x30\x18\x0C\x39\x39\x39\x59\x59\x59\x41\xEE\x4C\x73\x73\xF3\x88\x62\x1A\x00\x60\x18\x06\xA0\x00\x31" +
80 | "\x01\xBA\x7A\x1D\x38\x41\x08\x82\x40\x10\x84\xD3\xD1\x5D\x5F\x71\xA6\x7B\xE6\x55\x72\xA5\xDA\x90\x3F\x4E\x99\x9C\x5A\x59\x59\x41" +
81 | "\x8B\x98\xAB\x6E\x58\x7E\xE5\x75\xB7\x89\x25\x97\x8C\x9B\xDB\x1F\x00\x80\x4C\x43\xDE\x5D\x0F\xFF\xDE\x52\x57\xF5\xCD\xFA\x0F\xBE" +
82 | "\xFD\xF6\x78\x59\xD9\x49\x08\x61\x5A\x96\x71\xDE\xE2\x5B\x00\x00\x00\x07\x18\x86\x55\x9F\x2D\x4B\xD1\xA6\x23\xF9\x61\x18\x46\x90" +
83 | "\x94\x5C\xA9\xEE\xE9\x68\xF1\xF9\x7C\x61\xB6\xF5\x60\x80\x10\x36\x34\x34\x04\x3D\x6A\x2C\xCB\x36\x37\x37\x5B\xAD\xD6\xEA\xEA\xEA" +
84 | "\x20\x89\xA4\x3F\x06\x7D\x3B\x78\x9E\xE7\x79\xBE\xAA\xAA\xAA\xAA\xAA\x2A\xEC\xD0\x88\xE2\x12\x12\x89\x54\x2A\x95\x38\x7B\x7B\x02" +
85 | "\x01\x3F\x4E\x10\xE5\x65\xC7\x77\x7D\xFD\xD9\xB8\xA2\xE9\xE6\xB1\x85\x1E\x97\xD3\xEB\x76\x7A\x5C\xBD\x5B\xBF\x78\xAF\xDB\xD6\xA6" +
86 | "\xCB\x34\x2C\xBF\xEF\xD1\x2C\x53\x41\xE4\x8D\x8F\x2E\x40\xB6\xA9\xE0\xBE\xDF\xBE\x70\xFA\xD8\x81\x6D\x5F\xAC\x75\xF4\x74\x11\x24" +
87 | "\xE9\xF3\xB8\x45\x8C\xD8\xE7\xF1\x08\xBC\x50\x76\x74\xDF\xA4\x2B\xE6\x04\xCF\x86\x02\xEF\x67\xFB\x70\x1C\x8F\xDC\x1F\xC9\xF3\x3C" +
88 | "\x9A\x11\x47\x84\x88\x06\x78\xD8\xEA\x38\xA2\x95\x92\x20\x08\xB3\xD9\x7C\xF8\xF0\x11\x8F\xAB\x57\xC4\x88\xC7\x16\x5D\xA1\xD5\x67" +
89 | "\x1D\xD9\xB5\xE5\xEB\x4F\xDF\xF1\xF7\xF9\x1A\xAA\xCB\xBF\x3B\xB8\xB3\xC3\x6A\x29\x99\xBD\xE8\xA6\x55\x0F\x30\xE2\xCB\x88\xD5\x39" +
90 | "\x20\x08\x82\x28\x9A\x79\x65\xEE\xB8\xC9\x9B\x3F\x79\xEB\xFB\x63\xFB\x3F\x7D\xFD\x85\xC5\xB7\xDD\x63\x2C\x18\x5F\x79\xFA\x44\xB7" +
91 | "\xAD\x5D\x6F\xCC\xED\x6A\x6F\x15\x4B\x65\x12\x99\xDC\xCF\xB2\x1D\x2D\x16\x8D\x46\x33\xA2\xA8\x40\xA8\x71\x15\x3A\x5B\x0E\x81\x41" +
92 | "\x45\x18\xC6\x43\x0C\xBE\x4A\x16\x8B\x65\xCF\x9E\x3D\x91\xF7\x09\xC3\xB0\x92\x92\xA9\x47\x8E\x1C\x39\x7B\xE2\xE8\xDC\x6B\x6E\xC2" +
93 | "\x00\x48\xD6\xA4\x5D\xBF\xE2\xFE\xBA\x8A\x33\xDF\xFC\xDF\x07\xDB\xD7\xBF\x8F\x61\x70\xE1\x8D\x2B\x16\xDE\xBC\x82\x24\xFF\x69\x82" +
94 | "\xC6\x72\xA5\x6A\xC5\x2F\x9E\x30\x8F\x2D\xDC\xF2\xD9\x3B\x9B\x3E\x7E\x7D\xDA\x95\x8B\x2B\x4F\x7F\xE7\x76\xD9\xDF\x7A\xEE\x71\x8E" +
95 | "\xE3\x48\x8A\x5E\x7C\xEB\xDD\x29\xBA\x0C\x7B\xB7\x6D\xC1\x95\xF3\x22\x6F\x96\x20\x88\xA5\x4B\x97\xE6\xE4\xE4\xA0\x8F\x7E\xBF\xBF" +
96 | "\xA9\xA9\xC9\x6A\xB5\x56\x55\x55\xB9\x5C\xAE\xE1\x27\x52\x1C\xC7\x71\x1C\x0F\xF2\x10\x73\x73\x73\x53\x53\x53\xFB\x5F\x10\x08\x04" +
97 | "\x46\xAA\xAF\x16\x15\x15\xA7\xA5\xA5\x9D\x3E\x7E\xB0\x70\xEA\x2C\xE5\x45\xBB\x22\xCB\x94\x9F\x9A\xA6\x6F\xAC\x29\x5F\x78\xD3\x4F" +
98 | "\x17\xDE\x78\x87\xC7\xE5\xEC\x6A\xB7\xF6\xDA\xBB\xFB\xBC\x6E\x8E\xE3\x48\x92\x92\xCA\x15\xAA\x14\xAD\x26\x5D\x9F\x68\x5B\x22\x42" +
99 | "\x08\x3C\xEF\x71\x3B\x3D\x2E\x27\x17\xF0\x13\x24\xC9\x88\xA5\x53\x66\x2F\xD0\xE9\xB3\x3F\x79\xFD\x85\xC3\x3B\x36\x8B\xA5\xB2\x45" +
100 | "\x37\xAD\xD0\xE9\x0D\x0A\xA5\x9A\x16\x31\x52\x45\xD2\x86\xB5\x6B\xC4\x62\xF1\x15\x57\x5C\x11\xF9\x2D\x90\xF3\xC5\x64\x32\x05\xBF" +
101 | "\x09\xFA\x4B\x1D\x0E\x47\x4D\x4D\x8D\xC5\x62\xA9\xAF\xAF\xB7\x58\x2C\xC8\xCB\x88\x0E\x91\x5A\xAD\x76\xC1\x82\x05\x38\x8E\xEB\xF5" +
102 | "\x7A\xBD\x5E\x9F\x88\x04\x03\xB1\x58\xBC\x6C\xD9\xAD\xAF\xBD\xF6\xEA\xAE\xCD\x9F\xDF\x70\xE7\x7F\xD1\x34\x03\x21\xDC\xBB\x6D\x83" +
103 | "\xA5\xB6\x42\xA6\x50\x36\xD6\x9C\xFF\xE3\x43\x77\xB8\x5D\xBD\xC8\x8F\x19\x66\x75\x10\x24\xA9\xD3\xE7\x14\x4C\x2C\x99\x3C\x63\x9E" +
104 | "\x4E\x9F\x8D\xE3\xA3\xCA\x6A\xF4\xB3\x6C\x63\xCD\xF9\xF3\x65\xC7\x1A\xAB\xCB\x6D\xAD\xCD\x6C\xDF\x8F\x22\x41\x04\x41\x28\x54\xC9" +
105 | "\x68\xF2\x67\x7D\x5E\x5B\x9B\x75\xDC\xE4\xE9\x8C\x44\x9A\xA4\x4E\xA9\x2D\x3F\x7D\xBE\xAC\x74\x6A\x49\x89\xD1\x68\x1A\xA4\xED\x91" +
106 | "\x41\xA9\x54\x96\x94\x94\x94\x94\x94\x60\x18\xC6\x71\x5C\x4B\x4B\x4B\x4B\x4B\x8B\x20\x08\x7B\xF6\xEC\x21\x93\x92\x92\xE6\xCC\x99" +
107 | "\x33\x6C\x13\x31\x62\xE6\xCC\x59\x65\x65\x27\x0F\x1C\x38\xB0\xFB\xAB\x2F\xAE\xBA\x61\x79\xC5\xA9\x6F\xCF\x7C\x7B\x18\x42\xE8\x76" +
108 | "\x3A\xEA\x2B\xCE\x28\x95\xCA\xB1\x25\x53\xB3\xB2\x32\x53\x53\x35\x72\xB9\x1C\xCD\xA8\x2C\xEB\xB3\x5A\x5B\xCF\x9D\x3B\x57\x5B\x5B" +
109 | "\xB3\xD7\x52\xB7\x6F\xFB\x86\xFC\xF1\x45\x57\xDD\x70\x7B\x4E\xDE\xB8\x51\xF0\x5A\x79\x3D\xAE\x6F\xF7\xEF\x38\xBA\x67\x5B\x57\xBB" +
110 | "\x15\x00\x40\x51\x94\x46\xA3\x49\x4F\x9F\xA0\x52\xA9\x68\x5A\x24\x08\xBC\xCF\xE7\xEB\xEA\xEA\x6A\x6A\xB2\x74\xB6\x75\xA3\x34\xB9" +
111 | "\x13\x87\x76\xF1\x01\xFF\x15\xF3\x17\xFB\x3C\xEE\x6D\x5F\xAC\x65\x44\xA2\x9B\x6F\xBE\x39\x11\x7E\x73\x92\x24\x73\x72\x72\xD0\x7C" +
112 | "\x7B\xF2\xE4\xC9\x51\xF2\x91\xE2\x38\x7E\xEF\xBD\x3F\xB7\xDB\x1D\xA7\xBF\x3B\x54\x5F\x75\xC6\xE3\x76\x01\x0C\xCB\xCD\xCD\xBD\xF2" +
113 | "\xCA\xAB\xAE\xB8\x62\x1A\xA2\xEA\x30\x0C\x23\x12\x89\x44\x22\x11\x4D\xD3\xA1\x93\x81\xCD\x66\xDB\xBD\x7B\xD7\xFA\xF5\x5F\x9C\x3D" +
114 | "\x5B\x56\x7D\xFE\xD4\xD4\x39\x8B\x7E\x72\xEB\x2A\x99\x22\x51\x6C\x1D\x9E\xE7\xCF\x7E\x77\x78\xFB\xFA\xF7\xBB\x6D\x6D\x12\x89\x64" +
115 | "\xFE\xFC\x2B\xE7\xCE\x9D\x57\x58\x58\xA8\x54\x2A\x69\x9A\x96\x48\x24\x88\xCB\x8B\x5E\x23\x8E\xE3\x2C\x16\xCB\x89\x13\xDF\xED\xDB" +
116 | "\xB7\xEF\xE0\xC1\x03\x65\x47\xF7\x9D\x3B\x59\xAA\x49\xCF\x6A\x69\xA8\x5E\xB2\xE4\xDA\xDC\xDC\xFC\x04\x75\x32\x14\xA3\x97\x97\x25" +
117 | "\x95\x4A\x8B\x8B\x8B\xCB\xCB\xCF\x7B\x5C\xCE\x09\x13\x26\xAC\x5C\xB9\x6A\xD2\xA4\x49\x24\x49\x4A\xA5\x52\xB9\x5C\x3E\x44\xE0\x49" +
118 | "\xA3\xD1\xDC\x71\xC7\x8A\xDB\x6E\x5B\xBE\x67\xCF\xEE\x97\x5E\x7A\xA9\x74\xEF\xF6\xC6\x9A\xF2\xDB\xFF\xEB\x37\x7A\x83\x39\xEE\x9D" +
119 | "\xEC\xF3\x7A\xB6\x7E\xB1\xF6\xF8\xBE\x7F\xD0\x34\x75\xF3\xCD\x4B\x6F\xBD\xF5\x36\xAD\x56\x8B\xE3\xB8\x54\x2A\x55\x28\x14\x41\xE3" +
120 | "\x38\x08\x92\x24\x4D\x26\x93\xC9\x64\xBA\xED\xB6\xE5\x5D\x5D\x5D\x1B\x36\xFC\xDF\x07\x1F\x7C\xD0\x5C\x5F\x25\x12\x89\x26\x4E\x4C" +
121 | "\xAC\x5F\x2D\x88\x0B\x59\x4B\x41\x12\x54\x82\xC0\xF3\xFC\xBA\x75\xEB\x3E\xFE\xF8\x23\x86\x61\x1E\x79\xE4\xB1\x97\x5F\x5E\x53\x5C" +
122 | "\x5C\x2C\x97\xCB\xF5\x7A\xBD\x56\xAB\x95\x48\x24\xC1\xFC\x95\xC1\xBA\x41\x10\xC4\xA2\x45\x57\x6F\xDA\xF4\xD5\xAA\x55\x77\x77\xB5" +
123 | "\xB7\xBC\xF7\xBF\xFF\xAF\xAE\xE2\x4C\x7C\x3B\xE9\xEA\xB5\x7F\xFC\xEA\xB3\xA5\x7B\xB6\x9B\xCD\xA6\x35\x6B\x5E\x79\xE8\xA1\x5F\xEA" +
124 | "\x74\x3A\x99\x4C\xA6\xD7\xEB\x35\x1A\x4D\x50\x7E\x48\xD7\xEF\xDF\xCF\x94\x94\x94\x5F\xFC\xE2\x81\x9D\x3B\x77\xAD\x5C\x79\x17\xCF" +
125 | "\xF3\x7F\xF9\xCB\xCB\xBB\x77\xEF\x4E\xD0\x53\x85\x21\x20\x1B\x1A\x1A\x9E\x7A\xEA\x29\x1C\xC7\xB3\xB3\xB3\xF5\x7A\xBD\xC9\x64\x42" +
126 | "\x59\x93\x71\x9C\xC4\x05\x41\xF8\xF8\xE3\x8F\xB6\x6F\xDF\xA6\xD7\xEB\x9F\x7C\xF2\x69\xB3\xD9\x0C\x00\x48\x4E\x4E\x56\x28\x14\xC1" +
127 | "\xBB\x58\x2C\x96\xAF\xBE\xDA\x54\x5E\x5E\x2E\x16\x8B\xAF\xB9\xE6\x27\x0B\x16\x2C\x18\x90\x05\x29\x97\xCB\xFF\xF0\x87\x67\x72\x72" +
128 | "\x0C\x7F\xFE\xF3\x0B\x9F\xBE\xF1\xC2\xBD\x8F\xFD\x51\x6F\xC8\x8D\x4B\x27\x3D\x6E\xE7\x67\x6F\xBE\x58\x73\xEE\xFB\x39\x73\xE6\xFE" +
129 | "\xFA\xD7\xBF\x96\xCB\x15\x04\x41\x24\x27\x27\x87\x3A\x56\x38\x8E\x3B\x7C\xF8\xD0\xC6\x8D\x1B\x1B\x1A\x1A\x52\x52\x52\x96\x2D\x5B" +
130 | "\xF6\x93\x9F\x2C\x0E\x5B\x98\xD5\x6A\xF5\x1F\xFF\xF8\xA7\x59\xB3\x66\x3D\xF1\xC4\x6F\xDE\x7D\xF7\x6D\x96\xF5\x2D\x59\x72\x5D\x5C" +
131 | "\x7A\x88\x98\x09\xC8\xC7\x66\xB5\x5A\x1B\x1B\x1B\x05\x41\x70\x38\x1C\x24\x4A\xB0\xC0\x30\xAC\xBD\xBD\x3D\xC8\x40\x44\xE1\x7B\x64" +
132 | "\x60\xA4\xA4\xA4\xC4\x28\xCE\x6D\xDB\xB6\x7C\xF3\xCD\xF6\x9C\x9C\x9C\xE7\x9E\x7B\x5E\xA7\x4B\x43\xE9\x7D\xC1\x88\x28\x84\xF0\xE3" +
133 | "\x8F\x3F\x5A\xBD\x7A\xB5\xDB\x7D\xA1\xF0\xC1\xE6\xCD\x5F\x3D\xF8\xE0\x43\x8F\x3E\xFA\x28\x41\x0C\x30\xCF\xE3\x38\x7E\xF7\xDD\x77" +
134 | "\x63\x18\x7C\xFE\xF9\xE7\xD6\xBF\xFB\xF2\x7D\xBF\x79\x2E\x76\x3F\x78\x20\xE0\xDF\xFA\xD9\xBB\xD5\x67\xCB\xE6\xCF\xBF\xF2\xF1\xC7" +
135 | "\x7F\x23\x16\x8B\x29\x8A\xD2\x6A\xB5\xA1\x56\xB9\xD3\xE9\x7C\x77\xED\xDA\xC2\x92\x69\xE9\x59\x86\x2D\x5B\xBE\x86\x10\x1E\x3C\x78" +
136 | "\xE0\x89\x27\x9E\xB8\xFF\xFE\xFF\xEE\xDF\xC3\x6B\xAE\xF9\x89\x46\xA3\xB9\xEF\xBE\x9F\xAF\x5B\xB7\x2E\x29\x49\x89\x82\x30\x51\x00" +
137 | "\x42\x18\xE4\x21\x22\x73\xA2\x3F\x0F\x31\xFC\x19\xA1\xC3\x16\x8B\xC5\x62\xB1\x60\x17\xB9\x8E\xB9\xB9\xB9\x41\xD3\xDE\xE9\x74\x8E" +
138 | "\xA8\x4E\xC8\xB9\x73\xE7\xD6\xAF\x5F\x9F\x9C\x9C\xFC\xF4\xD3\xCF\xE8\x74\x69\x38\x8E\x6B\xB5\xDA\xD0\x38\xEA\x97\x5F\x6E\x78\xFB" +
139 | "\x9D\xB7\x5F\x7B\xE7\x7D\x97\xCB\xF9\xFB\xC7\x1F\x71\xB9\x5C\x10\xC2\x0F\x3E\x78\x7F\xC9\x92\x25\x63\xC7\x8E\x1B\xB0\x4D\x00\xC0" +
140 | "\x5D\x77\xAD\xB2\x5A\xAD\xEF\xBD\xB7\xF6\x1F\x7F\x5B\xB7\xF4\x9E\x87\x06\x14\x76\xE4\x38\x71\x68\xF7\x89\x43\xBB\x0A\x0B\x0B\x1F" +
141 | "\x79\xE4\x11\xB1\x58\x4C\x92\x64\x98\xFC\x02\x81\xC0\x73\xCF\x3D\xCB\x72\xC2\x7D\xD3\x67\xA6\x67\xE8\x3F\xFE\xE0\x5D\xAF\xC7\xC3" +
142 | "\x71\xDC\xDA\xB5\xEF\x5D\x7F\xFD\x8D\x69\x69\x69\xFD\xDB\x2C\x2A\x2A\x7E\xF3\xCD\xB7\xEE\xB9\xE7\xEE\xB5\x6B\xDF\xD5\xEB\x33\x83" +
143 | "\x06\xFB\x10\x10\x04\x61\xC7\x8E\x1D\xA5\xA5\xA5\xE8\xA3\xDF\xEF\xAF\xAB\xAB\x0B\xE6\x4A\x0E\x86\x61\x7E\xB9\x20\x08\x6E\xB7\xFB" +
144 | "\xFB\xEF\xBF\x0F\xFD\x32\x72\x1F\xA9\xC7\xE3\x79\xFF\xFD\xB5\x82\x20\xFC\xE6\x37\x4F\x64\x65\x65\x61\x18\xA6\x56\xAB\x43\xE5\xE7" +
145 | "\x70\xD8\x5F\x7F\xFD\x35\xAD\x2E\x7D\xEC\xF8\x89\x10\x42\xA5\x4A\x8D\x8A\x90\x78\x3C\x9E\x6F\xBF\xFD\x6E\x30\x11\x62\x18\x46\x10" +
146 | "\xC4\xC3\x0F\xFF\xEA\xCC\x99\x33\x27\x0E\xEF\x1E\x57\x3C\x7D\x5C\xD1\xB4\x08\xBB\xD4\x1F\x1D\xAD\xCD\x3B\x37\xAE\x4B\x4E\x4E\x79" +
147 | "\xF4\xD1\x5F\xCB\xE5\x0A\x34\xC9\x87\x79\xC5\xAA\xAA\x2A\x37\x6D\xDA\x28\x96\x48\xB2\xDF\xCE\x39\x77\xF6\x8C\xF7\x62\x2E\x84\xC3" +
148 | "\xE1\xA8\xA8\xA8\x18\x50\x84\x18\x86\x95\x94\x4C\x7D\xF6\xD9\xE7\x1F\x79\xE4\xE1\x77\xDE\x79\xFB\x99\x67\xFE\x38\xAC\xB3\x54\x10" +
149 | "\x84\x8A\x8A\x8A\x91\xF6\x7F\x18\x11\xE2\x38\x4E\x92\xA4\x42\xA1\x08\xDE\x9E\x65\xD9\xC8\x47\xE1\x3F\xFE\xF1\xF7\xA6\xA6\xA6\x9B" +
150 | "\x6F\x5E\x3A\x69\xD2\x64\x0C\xC3\x24\x12\x49\x58\xEA\x4C\x4D\x4D\x6D\x67\x67\x67\x73\x4B\xCB\x8B\x7F\x7A\xD2\xEB\xF1\xB6\xB6\x5A" +
151 | "\x83\x87\x86\xAD\x46\xA2\x50\x28\x7E\xFD\xEB\x5F\xDF\x73\xCF\x3D\xFB\xB6\x6D\x30\x8D\x99\x10\x9D\x13\x47\x10\xF8\x03\xDF\xFC\xCD" +
152 | "\xED\x74\xFC\xF2\x97\x0F\xA3\x97\x4C\x26\x93\xC9\x64\xB2\xB0\xD3\xCA\xCB\xCB\x59\x96\x65\x59\x76\xCD\x4B\x2F\x86\x7E\x3F\xB4\x1B" +
153 | "\x13\x00\xB0\x64\xC9\x92\x03\x07\xF6\x6F\xDE\xFC\xD5\xEE\xDD\xBB\x16\x2F\x5E\x32\x74\x67\xC2\xDE\x1E\xBF\xDF\xEF\x74\x3A\x51\xBC" +
154 | "\x61\x88\xAB\x06\x10\x21\x45\x51\x41\x1E\x62\x56\x56\x56\x18\x0F\x11\x25\x6A\x0F\xDD\x15\x04\x87\xC3\xF1\x8F\x7F\xFC\x3D\x39\x39" +
155 | "\xF9\xB6\xDB\x6E\x43\x71\x47\xB5\x5A\x1D\xB6\xAC\x92\x24\x89\xE3\x38\xCF\x71\x5F\xFD\xED\xCB\xB0\xCB\x93\x93\x87\x5F\xE1\xA6\x4C" +
156 | "\x29\x59\xB8\x70\xE1\xE6\xAF\x37\xD7\x9C\x3F\x35\x61\xCA\xCC\x48\x7A\x15\x86\xF6\x96\xC6\x33\xDF\x1E\xCA\xCF\xCF\x5F\xB8\x70\x21" +
157 | "\xEA\xCF\x80\x35\x4C\xA4\xD2\x70\xA1\x5E\xFC\x5E\x9A\x95\x95\x39\x44\xFB\x14\x45\x3D\xF2\xC8\xA3\xFB\xF6\xED\xFD\xFA\xEB\xAF\xE7" +
158 | "\xCC\x99\xDB\xFF\xE5\x08\x05\x41\x10\xA1\x89\xDA\x18\x86\xF9\x7C\xBE\xC6\xC6\xC6\x86\x86\x06\x94\x47\x11\x08\x04\x02\x81\x40\xD8" +
159 | "\x55\x24\x76\x31\x10\xA1\xD5\x6A\xF3\xF3\xF3\x91\x8F\x2E\x2E\x39\x82\x47\x8F\x1E\xE9\xE9\xE9\xB9\xEB\xAE\x55\xC9\xC9\x29\x18\x86" +
160 | "\x49\xA5\xD2\xFE\x33\x49\x6E\x6E\xAE\x56\xAB\xED\x5F\xC1\x89\x61\x98\x49\x93\x26\x0D\x7B\x0B\x82\x20\x56\xAC\xF8\xE9\xCE\x9D\x3B" +
161 | "\xBE\x3B\xB0\x73\xEC\xA4\x2B\x88\x91\x7B\x07\x4F\x1E\xDE\xCB\xFA\xBC\x37\xDC\x70\xA3\x58\x2C\xC1\x30\x4C\x2E\x97\x0F\xA8\x09\x17" +
162 | "\x16\x16\x6A\xB5\x5A\x14\x49\x0D\x45\x71\x71\x91\xD9\x3C\x8C\x4A\xAC\xD7\xEB\x97\x2F\xBF\xFD\xED\xB7\xDF\x3A\x7A\xF4\xC8\xA2\x45" +
163 | "\x57\x8F\xA8\x7B\x62\xB1\x78\xCC\x98\x31\x48\xA8\x10\xC2\xAE\xAE\xAE\x9A\x9A\x1A\x24\xCE\x8E\x8E\x8E\x0B\x46\x45\x5E\x5E\x5E\x22" +
164 | "\x48\x88\x82\x20\xEC\xDF\xBF\x5F\x2C\x16\x2F\x5A\xB4\x08\xF1\x01\x92\x92\x92\xFA\xBF\x16\x32\x99\x6C\xD5\xAA\x7B\xFE\xF0\x87\xA7" +
165 | "\xC2\xE8\xAD\xB3\x66\xCD\x0E\xE6\x98\x0F\x8D\xC2\xC2\xC2\xF1\xE3\x27\x9C\xAF\x28\xEF\xB6\xB5\x6A\xD2\xB3\x46\xD4\x49\xB7\xD3\x51" +
166 | "\x71\xEA\xDB\xB4\xB4\xB4\x29\x53\x4A\x30\x0C\x23\x08\x62\xB0\x51\x92\x91\x91\xF1\xE8\xA3\x8F\x3D\xF5\xD4\x93\xA1\x05\x9A\xF4\xFA" +
167 | "\xCC\xFF\xF9\x9F\xDF\x0F\xEB\xED\xC3\x71\x7C\xF9\xF2\xDB\x3F\xFC\xF0\xC3\xBD\x7B\xF7\x2C\x58\xB0\x30\x6A\xEF\x20\xE2\x54\xA4\xA6" +
168 | "\xA6\xCE\x98\x31\x23\xF8\xE5\x9A\x35\x6B\x12\xE5\x6C\xB4\x58\x2C\x56\x6B\x4B\x51\x51\x71\x4A\x4A\x2A\x86\x61\x0C\xC3\x0C\xB6\x98" +
169 | "\xDF\x7E\xFB\xED\x2B\x57\xAE\x0C\xF5\xA8\x65\x64\x64\x3C\xF1\xC4\x6F\xFB\xBB\x42\x06\x04\x4D\xD3\x0B\x16\x2C\x70\xF5\x3A\x1A\x6B" +
170 | "\x46\xAC\x08\xB4\xB7\x58\x3A\xDB\x9A\x8B\x8A\x8A\xD5\x6A\x35\x86\x61\x62\xB1\x78\xB0\x4E\x02\x00\x96\x2F\xBF\xFD\x93\x4F\x3E\x5D" +
171 | "\xB2\x64\x89\xC1\x60\xC8\xCB\xCB\x5B\xB1\xE2\xA7\x5F\x7C\xB1\x3E\x2F\x2F\x2F\x92\x1B\x65\x64\xA4\xCF\x9E\x3D\xCB\x62\xB1\x24\x82" +
172 | "\x08\x9F\x28\x07\x5B\x65\x65\x85\xCF\xE7\x9B\x36\x6D\x1A\x92\x4D\xD0\xFF\xD2\x1F\x14\x45\x3D\xFD\xF4\x33\xF3\xE7\x5F\xB5\x79\xF3" +
173 | "\x57\x36\x5B\x47\x5E\x5E\xFE\xDD\x77\xDF\x83\x34\x8B\x08\x51\x52\x52\x22\x93\xC9\xEA\x2A\x4E\x4F\x9D\x3B\xB2\x69\xAA\xAE\xE2\x0C" +
174 | "\x84\xB0\xA4\x64\x2A\xFA\x38\x74\xF1\x25\x00\xC0\xB4\x69\xD3\xA7\x4D\x9B\x3E\xA2\x5B\x20\x50\x14\xBD\x70\xE1\xA2\x5D\xBB\x76\x9D" +
175 | "\x3B\x77\x36\x12\xEB\x62\x44\x48\x94\x08\x2B\x2A\x2A\x70\x1C\x2F\x2C\x2C\x44\x1F\x87\xA6\x36\x03\x00\xE6\xCE\x9D\x3B\x77\xEE\xDC" +
176 | "\xE8\xEE\x95\x99\x99\xA5\xD1\x68\xDA\xAD\x4D\x7D\x3E\x6F\xE4\x71\x7F\x81\xE7\x9B\xEB\xAB\x94\x4A\x25\xD2\x47\x48\x92\x4C\x68\xD2" +
177 | "\xDD\xF4\xE9\x33\x70\x1C\x2F\x2F\x2F\xBF\xF6\xDA\xF8\x38\x6B\x82\x20\xBD\x5E\x6F\x65\x65\x25\x8E\xE3\xE9\xE9\xE9\x28\xD9\x33\x76" +
178 | "\x45\x06\x42\xD8\xD0\x50\x9F\x96\x96\x96\x94\xA4\xC4\x2E\xAA\xB8\xF1\xE8\xED\xC0\x50\xAB\xD5\x3A\x9D\xAE\xA2\xBA\xD6\xE3\xEA\x8D" +
179 | "\x5C\x84\x5E\x8F\xDB\xDE\x65\x53\x2A\x55\xA9\xA9\x1A\x0C\xC3\x08\x82\x48\x68\x31\x36\xB5\x5A\x65\x30\x18\x10\xAD\x39\x96\x60\x19" +
180 | "\x32\x63\x7C\x3E\x5F\x5B\x5B\x1B\xCF\xF3\x1E\x8F\x87\xB4\x5A\xAD\xAF\xBC\xF2\x0A\x76\x71\xB5\x34\x9B\xCD\x3A\x9D\x2E\x46\x06\xA2" +
181 | "\xC7\xE3\x71\xB9\x5C\xB9\xB9\x79\x68\x69\x41\x96\x43\xD4\x9D\x1E\x16\x38\x8E\xEB\xF5\x99\x65\xDF\x9F\xEA\xF3\x8E\xA0\xFA\x80\xCF" +
182 | "\xE3\x72\xBB\x7A\x33\xF3\x2E\xD4\x6F\xA3\x28\x2A\xA1\x39\x31\x34\x2D\xCA\xCE\xCE\x3E\x76\xEC\x78\x6F\x6F\xEF\x48\x6B\x2F\x0A\x82" +
183 | "\x20\x08\x82\xCD\x66\x43\xEA\x68\x6D\x6D\x6D\x67\x67\x27\x76\xD1\xD9\xFD\x43\xA2\x36\x86\x61\xED\xED\xED\xED\xED\xED\xD8\x8F\x19" +
184 | "\x88\x06\x83\xC1\x68\x34\x86\xDA\x9B\xC3\xDE\xB2\xB7\xB7\x97\xE3\x38\x95\x4A\x85\xDE\xEB\x51\xA8\x19\x9C\x9C\x9C\x1C\xF0\xFB\xFD" +
185 | "\xFE\x11\xD4\xF3\xEC\xEB\xF3\xFA\xFB\x7C\x6A\xF5\x05\xEB\x33\xD1\xF5\x10\x29\x8A\xD2\x6A\x75\x3C\xCF\xD9\xED\xF6\xC1\x44\x88\x4A" +
186 | "\x57\x04\xF3\xB3\x58\x96\x6D\x68\x68\x68\x6C\x6C\x44\x3C\xC4\xC1\x4A\x20\x0F\xDC\xEF\x50\x06\x22\x00\x00\xC7\xF1\xD0\xA0\x49\x52" +
187 | "\x52\xD2\xD0\xDD\xF5\xF9\x7C\x82\x20\xC8\x64\x52\x34\xF8\x46\x21\xC8\x2E\x91\x48\x04\x81\x0F\x8C\x44\x84\x9C\xDF\xCF\x71\x5C\x70" +
188 | "\x91\x4E\x74\x27\x01\x00\x2A\x95\x5A\x10\x84\x21\x0A\x95\xF0\x3C\xFF\xF6\xDB\x6F\x87\x5E\x32\x60\x54\x2B\x0C\xC3\xBF\x7A\xA1\x4C" +
189 | "\x9B\xE0\x37\x43\x5F\xC2\xF3\x3C\x84\x90\xA2\x46\x2F\x9F\x1B\xFE\x98\x77\x13\x09\x04\x41\xC0\x42\x12\x04\x46\x21\xB3\x50\x2C\x66" +
190 | "\x20\x84\x1C\x17\xEE\x5E\x09\xEF\xD5\x08\x31\x94\x08\x49\x92\x64\x18\x26\x2F\x2F\x2F\x33\x33\x33\xE8\xB3\xB0\xD9\x6C\xE7\xCF\x9F" +
191 | "\x1F\xBA\x51\x1C\x07\x18\x86\xF1\xFC\x05\x6B\x7D\x14\x6A\xD6\x79\x3C\x6E\x9C\x20\x28\x7A\x64\x8C\x4D\x9C\x20\x82\xB3\xD6\x28\x74" +
192 | "\x72\xD8\x5B\xA0\x2C\x5F\xAD\xF6\x42\xF2\x17\xC7\x71\x6D\x6D\x6D\x55\x55\x55\xA8\x06\xE2\x60\x97\xFF\x48\x84\x88\x87\x98\x91\x91" +
193 | "\x81\xD4\x19\xB3\xD9\xAC\xD1\x68\xC2\x2E\xA8\xAC\xAC\x1C\xD6\x9B\x8E\xA8\x25\x5E\xAF\x17\xE5\xC1\xA0\xD9\x20\xA1\xAF\xB9\xCD\xD6" +
194 | "\x49\x8B\x18\x91\x68\x04\x79\x9D\x24\x2D\xA2\x45\x22\x87\xC3\x8E\x3E\x86\xB9\x87\x12\x01\x8F\xC7\x83\xAA\xF1\x0F\x76\x02\xCA\xB5" +
195 | "\x0F\x4B\xD4\xC6\x2E\x32\x10\x5B\x5A\x5A\x50\xE0\x30\x2C\xF5\x9E\x54\xAB\xD5\x85\x85\x85\xA8\x12\x62\x30\x64\x1F\x63\x5F\x51\xC8" +
196 | "\x1B\x29\x35\x14\x45\xA1\x3A\xFE\x89\x13\x21\xC7\x71\xCD\xCD\x4D\x12\xA9\x9C\x19\x49\x61\x64\x11\x23\x66\x24\xB2\xAE\xAE\xAE\x40" +
197 | "\x20\x40\x51\x54\x7F\xF7\x71\x7C\x21\x08\x42\x4F\x4F\x37\x8E\xE3\x43\x7B\xBA\x07\x44\x18\x03\xB1\xA9\xA9\xA9\xAE\xAE\xAE\xA7\xA7" +
198 | "\x07\x42\x78\xE6\xCC\x19\x32\x25\x25\x65\xF9\xF2\xE5\xF1\xED\x6E\x52\x52\x92\x58\x2C\xB6\xD9\x6C\x7E\xBF\x1F\x3D\x1D\x9E\xE7\x13" +
199 | "\xA7\x2F\xD8\x6C\x36\x9B\xCD\x96\xA4\x4A\x96\xC9\xC3\xF5\x2C\x28\x08\xF0\x62\xD2\x56\xD8\x21\x86\x11\xCB\x15\x4A\x87\xA3\xBB\xBB" +
200 | "\xBB\x5B\xA7\xD3\x71\x1C\xC7\xF3\x7C\xE2\xEC\xD7\x40\x20\x60\xB5\xB6\x52\x14\x85\x9C\x79\x51\x83\x24\x49\xA3\xD1\x68\x34\x1A\xD1" +
201 | "\xC7\xB6\xB6\xB6\x84\x68\xD2\xC8\x50\xAB\xA8\x28\xF7\xF9\x7C\x52\xA9\x54\x10\x04\x96\x65\x13\x57\xA4\xCD\x62\x69\xB4\xD9\x6C\x53" +
202 | "\x66\x4F\x0A\xAE\x85\x01\x3F\x5B\x5F\x79\xB6\xE6\xFC\xA9\xAE\x76\x6B\x20\xE0\x97\x29\x92\xD2\x32\x8D\xF9\x13\x8B\x75\x19\xD9\xE0" +
203 | "\xE2\x9B\x04\x70\x22\x35\x2D\xF3\xB4\xA5\xB6\xB5\xD5\x8A\x44\xE8\xF7\xFB\xA3\xA8\xF1\x1D\x21\x58\x96\xB5\x58\x1A\x55\x2A\xD5\x60" +
204 | "\x71\xAB\xA8\x91\x28\x63\xC8\x6C\xCE\x2D\x2B\x3B\x59\x5F\x5F\x8F\x8A\x7F\x79\x3C\x9E\xC4\xD5\x93\x38\x7A\xF4\x28\xCB\xB2\xE6\x71" +
205 | "\x93\x30\x0C\x83\x10\x96\x7F\x7F\x6C\xEB\x67\xEF\xDA\xDA\x5A\xD0\x51\x80\x61\x18\x00\x10\x42\xFC\x0B\x62\x5C\xF1\xF4\xA5\xAB\x1E" +
206 | "\x0C\x72\x6D\xB2\xCD\x05\x27\x0E\xED\x3C\x75\xEA\x54\x51\x51\x31\x84\xD0\xEB\xF5\x26\x4E\x84\x1D\x1D\x1D\x56\xAB\x75\xEE\xDC\x79" +
207 | "\x71\x7F\x08\x89\x9A\xDC\x0A\x0A\xF2\x29\x8A\xFA\xEE\xBB\x6F\x91\x1E\xE5\xF3\xF9\x22\x29\x7C\x1E\x05\xDC\x6E\xD7\xDE\xBD\x7B\x95" +
208 | "\xC9\x1A\xBD\x21\x0F\xC3\xB0\xAA\xB3\x27\x3F\x7D\xFD\x85\xAE\x8E\x56\x65\x92\x32\x3B\x2B\x6B\x52\x61\xE1\x15\x53\xA7\x4E\x1C\x3F" +
209 | "\x3E\x53\xAF\x97\xCB\x65\x67\xBF\x3B\xBC\x69\xDD\x9B\x48\x17\xC0\x71\x3C\x35\x4D\xAF\x50\xAA\x8F\x1F\x3F\x86\x6A\x2E\x79\xBD\xDE" +
210 | "\xD8\xB7\x0F\x1A\x0C\x47\x8F\x1E\x01\x00\xF4\x57\x55\x62\x07\xD9\xD9\xD9\xF9\xF9\xE7\x9F\x23\x75\x06\xB1\xD6\xE2\xE2\x6A\xCA\xCB" +
211 | "\xCB\x57\x28\x14\x27\x4E\x7C\xE7\xF1\x78\x64\x32\x19\xCF\xF3\x6E\xB7\x3B\x11\x05\x13\x8F\x1D\x3B\x5E\x55\x55\x59\x38\x7D\x9E\x2A" +
212 | "\x25\x15\x00\xF0\xDD\xC1\x9D\x01\x3F\x9B\x91\x9E\x21\x95\x48\x14\x0A\x05\x4D\x53\x18\x86\x89\x44\x22\x8F\xC7\x93\xA5\xD7\x37\x61" +
213 | "\x58\x6B\x63\xAD\xCB\xD1\x93\xA4\x4E\x21\x29\x5A\xA1\x4C\xCE\x34\xE6\xD7\x9C\x3B\x79\xEE\xDC\xB9\xA9\x53\xA7\x06\x02\x01\xAF\xD7" +
214 | "\x1B\x85\xBA\x31\x2C\xFC\x7E\xFF\xDE\xBD\x7B\x44\x22\xD1\x10\x6C\xA0\x48\x80\x6A\x58\xB6\xB4\xB4\xA0\xAA\x50\x28\xFB\x97\xB4\xDB" +
215 | "\xED\x07\x0E\x1C\x40\x67\x84\xD5\x40\x44\x0C\x44\x2C\x2A\xB3\x17\x71\xB7\x77\xEE\xDC\x59\x59\x59\x81\x02\xAA\xBD\xBD\xBD\x32\x99" +
216 | "\x2C\xBE\x7E\x2C\xBF\x9F\x5D\xB7\xEE\x63\x0C\x80\xA9\x73\xAE\x06\x00\x87\x18\x84\x82\x80\x5D\xAC\xFB\x0F\xE1\x85\x21\x45\xD3\x74" +
217 | "\xA6\x5E\xDF\x6D\xB7\xB3\x2C\xEB\xF1\xFA\x76\x7E\xF5\xE9\xD5\x4B\x57\x4A\xE5\x49\x24\x49\x4D\x28\x99\x55\x79\xFA\xBB\x6D\xDB\xB6" +
218 | "\x4C\x99\x32\x05\xC7\x71\x87\xC3\x21\x91\x48\xE2\xAE\x79\x59\xAD\xD6\xD2\xD2\x52\xA3\xD1\x88\xAA\x31\x47\x8E\x60\x91\x4A\x64\x4E" +
219 | "\x20\x7F\x5B\x18\x0F\xF1\x47\x0F\x34\xAC\x06\x22\x41\x10\x0C\xC3\xE4\xE6\xE6\x66\x65\x65\x85\x9A\xF6\x11\xCE\x36\xB3\x67\xCF\x3D" +
220 | "\x70\xE0\xC0\xD6\xAD\x5B\x0A\x0B\x27\x21\xD3\xA2\xA7\xA7\x27\x35\x35\x35\x8E\x8B\xC1\xDE\xBD\xFB\x4A\x4B\x8F\xE6\x8D\x2F\xCE\x32" +
221 | "\x17\x40\x28\xEC\xDF\xBE\xE9\x7C\xD9\x31\x41\x10\xDA\x3A\xDA\x33\xD2\xD2\x71\x1C\xC7\x71\x82\xA2\x2E\x04\x2C\xAD\xAD\xAD\x2C\xCB" +
222 | "\x4A\xC4\xE2\xD2\x3D\xDB\x6B\xCF\x9F\x59\xF5\xC8\x53\x52\x99\x22\x3D\xCB\x94\x69\xCA\x3F\x71\xE2\xC4\xF7\xDF\x97\x15\x17\x4F\x61" +
223 | "\x59\xD6\x6E\xB7\x47\x42\xDB\x89\x1C\x10\xC2\xBF\xFD\xED\x4B\xBF\xDF\x3F\x6F\xDE\xFC\xA1\x7F\xBB\x20\x08\x27\x4F\x9E\x44\xD5\xEF" +
224 | "\x31\x0C\xE3\x38\xAE\xB5\xB5\x15\x6D\x2D\x36\xC4\x32\x34\xD4\x98\x40\xB1\x8C\x53\xA7\x4E\x9D\x3A\x75\x2A\xF4\xFB\x08\xE7\xC3\xB1" +
225 | "\x63\xC7\x9A\x4C\xE6\xD2\xD2\xD2\x9A\x9A\x6A\x34\x81\xB8\x5C\x2E\x9A\xA6\x07\x64\x60\x44\x81\xAE\xAE\xCE\x35\x6B\x5E\x06\x04\x39" +
226 | "\xFF\xBA\x5B\x29\x8A\x3E\xB6\xFF\xEF\xDF\xFC\xDF\x07\x0A\x99\xD8\x38\xC6\x74\xEA\x7C\x55\x53\x73\x93\x4C\x26\x97\xC9\xA4\x0C\xC3" +
227 | "\xF0\x82\x60\xB3\xD9\x7C\x3E\xDF\xCC\xA9\x93\xEF\x5F\xB9\xEC\x1F\x7B\x8F\x7C\xB9\x65\xC7\x27\xAF\x3F\x7F\xF7\xAF\x9E\xA6\x45\xA2" +
228 | "\xA9\x73\xAF\xD9\xF8\xE1\x2B\x1F\x7E\xF8\x61\x41\xC1\x18\xA9\x54\xDA\xDB\xDB\x4B\xD3\x74\x84\xD9\xF1\x91\xA0\xB3\xB3\xF3\xCB\x2F" +
229 | "\x37\xA8\xD5\xEA\xE9\xD3\x67\x0C\x7D\xA6\x20\x08\x87\x0E\x1D\x1A\x69\xFB\xC3\x9B\x41\x04\x41\xA0\x80\x1F\x02\x2A\x4F\xAA\x52\xA9" +
230 | "\x90\x18\x78\x9E\x97\xC9\x64\x57\x5E\x79\x65\xFF\xC9\x07\x00\x40\x51\xE4\xB1\x63\xC7\x3A\x3A\x3A\x66\xCF\x9E\x83\xA6\x50\x9F\xCF" +
231 | "\x47\x10\x44\xEC\xFB\x05\xFA\xFD\xFE\xA7\x9F\x7E\xFA\xD0\xA1\x83\xF3\x96\xDC\x52\x32\x7B\x81\xAD\xB5\x79\xFD\xDB\x2F\x31\x14\xBE" +
232 | "\xEC\xFA\xAB\xC7\x17\xE4\x66\xE8\x34\x9D\xDD\x3D\xF6\xDE\x5E\xA7\xCB\x65\x77\x38\x9C\x4E\x27\x49\x10\x37\x5C\x33\x7F\xD5\xF2\x1B" +
233 | "\xA5\x12\xF1\xD8\x3C\xA3\x48\x44\x1F\x3D\x76\x9C\x65\xFB\xF2\xC6\x17\xC9\xE4\x49\x1E\x97\xF3\xEC\xF7\xDF\x72\x1C\x57\x5C\x5C\x0C" +
234 | "\x00\xF0\xF9\x7C\xF1\x8A\x00\xF3\x3C\xFF\xCA\x2B\xAF\x1C\x3A\x74\x70\xE9\xD2\xA5\x85\x85\x3F\x22\x74\x41\x08\xF7\xED\xDB\x17\x5A" +
235 | "\x15\xD8\xE1\x70\xF0\x3C\x8F\x2A\x19\x06\xF7\x0F\x89\xD2\xCD\x4D\xD3\x34\x8E\xE3\x66\xB3\x19\x05\x9B\x72\x72\x72\x82\xBF\xA7\xAA" +
236 | "\xAA\x6A\xFD\xFA\xF5\x91\xFF\x06\x08\xE1\x89\x13\x27\xF6\xEC\xD9\xB5\x78\xF1\xB5\x48\x6C\x5D\x5D\x5D\x82\x20\x28\x95\xCA\xA8\xA5" +
237 | "\xC8\xF3\xFC\x9B\x6F\xBE\xB1\x79\xF3\x57\xA6\x31\x13\xE7\x2D\xB9\x05\x00\xFC\xE8\xEE\xAD\x6E\xA7\xE3\xBA\x45\xF3\x92\x55\x4A\x0C" +
238 | "\xC3\x72\x32\x33\x56\xDE\x76\x63\x77\x8F\xA3\xD7\xE9\x02\x00\x68\x52\xD4\x13\xC7\xE6\x69\x52\x2E\xD8\xD4\x00\x80\xAB\xE7\xCF\x38" +
239 | "\x79\xA6\xBC\xBC\xEC\xD8\x8C\xAB\xAE\x15\x4B\x64\x33\x16\x5C\xD7\xD2\x58\xBB\x79\xF3\xE6\xCC\xCC\xAC\x25\x4B\x96\x08\x82\xD0\xD5" +
240 | "\xD5\x05\x21\x8C\xBD\x60\xFC\xD9\xB3\x67\x3F\xFD\x74\x5D\x7A\x7A\xC6\xA2\x45\xD7\x0C\x7B\x32\x49\x92\xF7\xDF\x7F\x7F\x41\xC1\x85" +
241 | "\x82\x11\x2C\xCB\x22\x5A\x7D\x73\x73\x73\x55\x55\x95\xDF\xEF\x1F\xD0\x85\x44\x22\xBF\x28\xFA\x61\x1A\x8D\x26\x3F\x3F\x3F\x2D\x2D" +
242 | "\x6D\x88\x7A\x88\x23\xD2\x47\x10\x7B\x1F\x00\xB0\x76\xED\xDA\xBC\xBC\x82\xDC\xDC\x0B\x7C\x3D\x54\x63\x33\x39\x39\x39\x0A\xC5\x81" +
243 | "\xE7\xF9\x77\xDF\x7D\xE7\x8D\x37\x5E\x57\xA5\xE8\x6E\xB9\xF7\x57\x12\xA9\xDC\xED\x74\x54\x9D\x39\xA9\x49\x51\x1B\xB3\xF5\x17\x3B" +
244 | "\x49\x64\xEB\xD3\xA7\x15\x4D\x18\xEC\x2D\x61\x44\xA2\xAB\x66\x5D\xF1\xD7\x77\x3F\x69\x6B\xAA\x1F\x57\x3C\x03\x42\x78\xCD\xD2\xBB" +
245 | "\x36\x7E\xF4\xEA\x5B\x6F\xBD\x21\x95\x4A\xE6\xCD\x9B\x8F\xA4\x88\xA2\x9E\x51\xBF\x6A\x0E\x87\xE3\xC9\x27\x7F\xCF\xB2\xFE\x5B\x6E" +
246 | "\x59\x16\xE1\xAE\x68\x24\x49\x06\xD5\x0E\x8A\xA2\xC6\x8D\x1B\x37\x6E\xDC\x38\xEC\x22\x03\x31\x58\x98\x1B\xA5\xC1\xA0\x08\x3E\xA9" +
247 | "\xD7\xEB\x6F\xBF\xFD\x76\xB4\x85\x42\x84\xA4\xB1\xC8\xE1\x74\x3A\x21\x84\xF3\xAF\x5D\x76\x68\xC7\xD7\x2F\xBE\xF8\xC2\x8B\x2F\xFE" +
248 | "\x39\x98\xBF\xEF\x74\x3A\x59\x96\x4D\x4D\x4D\x1D\xD1\x7C\xE5\xF5\x7A\x5F\x7E\xF9\x7F\x3F\xFA\xE8\x43\x99\x32\xF9\xA7\x0F\xFE\x8F" +
249 | "\x26\x4D\x8F\x61\x58\x4F\x67\x47\xAF\xBD\x6B\xE2\x18\x93\x48\x74\x21\xBC\x95\x99\xAE\x4B\x51\x0F\xB3\x60\x67\xE9\xD3\x28\x8A\xEC" +
250 | "\xEA\x68\x93\xCA\xE4\x5C\x20\x90\x9E\x6D\x5C\x7C\xEB\xDD\x5B\xBF\x58\xFB\xD2\x4B\xAB\xDD\x6E\x37\xAA\x80\x67\xB7\xDB\x51\x27\xA3" +
251 | "\x50\xA4\x59\x96\x7D\xF6\xD9\x3F\x9E\x3E\x7D\x9A\xA2\xA8\xD8\x57\xD6\x20\x03\x71\xFA\xF4\xE9\x18\x86\xF5\xF5\xF5\xB5\xB7\xB7\x0B" +
252 | "\x82\xB0\x7E\xFD\x7A\x9C\x61\x18\xA3\xD1\x18\xBA\xB1\x56\x1C\xE1\x74\x3A\x49\x92\x9A\x7D\xF5\x8D\x33\x17\x5C\xD7\xD0\xD8\xF0\xA7" +
253 | "\x3F\x3D\x63\xB7\xDB\x83\x47\x59\x96\xB5\x5A\xAD\x3D\x3D\x3D\x11\x5A\xFD\x95\x95\x95\xAB\x56\xAD\x5C\xFB\xDE\xDA\x64\x6D\xC6\xBD" +
254 | "\x8F\x3D\x93\x69\xBC\x40\x00\x64\xFB\xBC\x01\x3F\x9B\x74\xF1\x31\x21\x8F\xA8\x20\x08\x10\x62\x17\xEB\xCD\x0E\xB0\xA0\x78\xBC\x3E" +
255 | "\x8E\xE3\x45\x0C\x03\x70\x5C\xAE\x54\x91\x14\x6D\x1A\x53\x78\xDD\x1D\xF7\x01\x82\x7A\xF5\xD5\x57\xFE\xFA\xD7\x35\x68\x07\x02\xAF" +
256 | "\xD7\x6B\xB5\x5A\x51\xB2\x4E\xE4\x3F\x3C\x10\x08\xAC\x59\xF3\x97\x0D\x1B\x36\x50\xB4\x48\x10\x04\x9F\x6F\xC4\xE5\x9A\x87\x06\xC3" +
257 | "\x30\x39\x39\x39\x46\xA3\x51\x2C\x16\x27\x96\x6D\xE0\x72\xB9\x44\x8C\x98\xA4\xE8\x25\xCB\xEF\xF5\xB8\x9D\x27\x0F\xEF\xFE\xDD\xEF" +
258 | "\x7E\xFB\xE4\x93\x4F\x07\x2B\x6A\x42\x08\xED\x76\xBB\xD3\xE9\x4C\x4A\x4A\x92\xCB\xE5\x83\xBD\xEC\x36\x9B\xED\xBD\xF7\xD6\x7E\xF2" +
259 | "\xC9\x3A\xAF\xD7\x3B\x61\xCA\x8C\xA5\xAB\x1E\x0A\x4D\x48\x13\x31\x12\x8A\x16\x75\xDB\x1D\xC1\x36\xEB\x2D\x2D\x75\x8D\xCD\xDD\xF6" +
260 | "\xDE\x86\xA6\x96\xEE\x1E\x07\x84\x50\xA9\x90\xEB\x34\x29\x63\xF3\x4D\x79\xA6\x1C\x46\x44\xBB\x3D\xDE\x4D\xDB\x77\x93\x14\x6D\xC8" +
261 | "\x1B\x87\x61\x18\x41\x10\x4A\x75\x72\xAF\xBD\xDB\x54\x30\xF1\xB6\x9F\x3F\xBA\x6D\xFD\xFB\x5B\xB7\x6E\x29\x2B\x3B\x79\xCF\x31\xF9" +
262 | "\x0F\x70\x00\x00\x0F\x52\x49\x44\x41\x54\x3D\xF7\xCE\x99\x33\x17\x75\xC0\xE9\x74\xAA\x54\xAA\x48\xCA\xE0\xB2\x2C\xBB\x7A\xF5\x9F" +
263 | "\xDF\x7B\x6F\xAD\x36\x3D\x73\xD6\xD5\x37\x6D\xFA\xE8\x35\xAF\x37\xCA\x7D\x7A\x23\x41\x62\x45\xE8\x76\xBB\x18\x89\x14\x00\x9C\xA4" +
264 | "\xA8\x65\xF7\xFE\x8A\x20\x88\xEF\x0E\xEE\x7C\xE8\xA1\x07\x56\xAE\xBC\xEB\xEA\xAB\xAF\x09\x8E\x7B\x9E\xE7\x7B\x7A\x7A\xEC\x76\x3B" +
265 | "\xC3\x30\x88\x8F\x4B\x51\x14\x8E\xE3\x3C\xCF\x9F\x3D\x7B\x76\xD3\xA6\xBF\x6D\xD9\xB2\xC5\xE9\x74\x26\xA9\x52\x6E\x5B\xF1\x5F\xC5" +
266 | "\xB3\x16\x84\x11\xEF\x35\xE9\x99\x9A\xF4\xAC\xF3\x55\xB5\x29\x2A\xE5\x98\x7C\x93\xDF\x1F\xA8\xAE\x6B\x3C\x57\x59\x63\xEB\xEA\x41" +
267 | "\x27\x84\xC6\xF4\x49\x92\x4C\x56\x25\xB9\xDC\x1E\xAF\xAF\x6F\xF2\xF4\xF9\x39\xF9\xE3\xD1\x39\x38\x41\x28\xD5\x29\x2E\x67\xAF\x36" +
268 | "\x23\x7B\xC5\x2F\x7E\x7B\x78\xE7\xE6\x53\xA5\xFB\x9F\x7D\xF6\x4F\x66\xF3\x17\x37\xDD\x74\x33\x12\x64\x5B\x5B\x1B\x4D\xD3\x32\x99" +
269 | "\x4C\x2A\x95\xF6\xF7\x61\xA1\x14\xCE\xDA\xDA\xDA\x17\x5E\x78\x6E\xFF\xFE\xFD\xA9\x3A\xFD\xCA\x87\x9F\xEC\xF3\x79\x21\x8C\xFF\x28" +
270 | "\x0C\x45\xA2\x45\xE8\x61\xC4\x12\xA4\x1C\x53\x34\xBD\xEC\xDE\x5F\x69\xD2\xB3\x76\x7E\xF5\xE9\x5F\xFF\xBA\x66\xDD\xBA\x8F\x67\xCC" +
271 | "\x98\x39\x69\xD2\x64\x93\xC9\x98\x9A\xAA\x41\x66\x86\xC3\xE1\x68\x6A\x6A\x6A\x6F\x6F\x6B\x68\x68\x28\x2F\x2F\x3F\x75\xEA\x7B\x54" +
272 | "\x32\x4E\xA1\x54\x5F\x73\xCB\x5D\x33\x17\x5D\x2F\x95\x0D\xA0\x22\x32\x62\xC9\x4F\x6E\x5D\xF5\xD9\x1B\x2F\xEC\x3A\x58\xBA\xF3\xC0" +
273 | "\x51\x24\x2C\x9A\xA6\x27\x4D\x9A\x64\x30\x18\x4F\x9E\x3C\xB1\x72\xE5\x5D\xA9\xA9\xA9\x3D\x3D\xF6\xD7\x5E\x7B\xD5\xE9\x72\xBA\x7C" +
274 | "\x7E\x46\xA6\x2C\x9E\x33\xFD\xAA\xEB\x97\x87\x46\x97\x00\x8E\x2B\x94\x2A\x5A\x24\xC2\x09\x62\xC1\x0D\x77\x4C\x98\x32\xF3\xC8\xAE" +
275 | "\x2D\xB5\x15\xA7\x57\xAF\xFE\xF3\x1B\x6F\xBC\x5E\x5C\x5C\x5C\x5C\x3C\x65\xDC\xB8\xF1\x7A\xBD\x9E\x61\x18\x54\x06\x03\x5D\xCE\xF3" +
276 | "\x7C\x67\x67\x67\x59\x59\xD9\xBE\x7D\x7B\x4A\x4B\x4B\x39\x8E\x33\x16\x4C\x58\x76\xEF\x23\xDA\x8C\xCC\xF6\x96\x46\xE4\x40\x4F\xDC" +
277 | "\x43\x26\xAB\xAB\xAB\xEF\xBF\xFF\x7E\xA4\x8E\x22\x45\x34\x37\x37\x37\x3D\x3D\x1D\xE5\x6A\xC7\x62\xBD\xA1\x35\x80\x51\x24\xE3\x17" +
278 | "\x1F\x13\x4E\x10\xF3\xAF\x5D\x36\x71\xEA\xAC\x43\x3B\x36\x7F\x7F\x74\xDF\x37\xDF\x6C\xDF\xB6\x6D\x2B\x86\x61\x00\x00\xC4\x72\xFB" +
279 | "\xC1\x75\x04\x00\x0E\x70\xB1\x54\x56\x78\xC5\x9C\x49\x57\xCC\xCD\x9F\x34\x65\xE8\x88\x7C\xDE\xF8\xA2\x9F\x3D\xFE\x6C\xD9\xD1\x7D" +
280 | "\x36\x6B\x93\xD7\xE3\x6E\xAE\xAF\xBA\xF9\xE6\xA5\x0B\x16\x2C\x74\xBB\xDD\xE7\xCF\x9F\x4F\x4E\x4E\x59\xB2\xE4\x5A\x9B\xCD\xF6\xC1" +
281 | "\x07\xEF\xA9\xB5\x19\xB7\xFE\xFC\x51\x00\x80\x58\x2A\x13\x0F\x54\x4B\x98\x11\x4B\x68\x91\xC8\xEB\x76\xE9\x32\x0D\x37\xAF\x7A\xB0" +
282 | "\xDB\xD6\x7E\xEE\xC4\xD1\xCA\x33\xDF\x1E\x3E\x72\xE4\xE0\xC1\x83\x18\x86\x51\x14\xA5\x52\xA9\x92\x92\x94\x0C\x23\x82\x10\xF3\x7A" +
283 | "\x3D\xDD\xDD\xDD\x48\x71\xC3\x71\x22\x35\x2D\x63\xFA\x95\x4B\xA6\xCC\x59\x88\x0A\x15\x8B\x18\x31\x86\x81\xA8\x37\x3C\x0F\x7D\x98" +
284 | "\x88\x87\x58\x5D\x5D\x8D\x42\xBE\x28\x2D\x06\x0B\x8E\xC2\xB0\x1A\x88\x38\x8E\x1B\x8D\xC6\x9C\x9C\x1C\xB4\x5B\x4C\xA8\x42\x15\xB9" +
285 | "\x2F\x9F\xE3\x38\x96\xF5\x2B\x44\x0C\xF8\xB1\xE5\x90\xAC\x49\xBB\xF1\xCE\xFF\x5E\x7C\xEB\xDD\x96\x9A\x0A\x4B\x5D\xA5\xAD\xAD\xA5" +
286 | "\xB7\xA7\x8B\xF5\x79\x21\x84\x24\x4D\xCB\xE4\x0A\x55\xB2\x26\x35\x3D\x53\x9F\x6D\x4A\xCB\x32\xD1\x91\xE9\xAB\x38\x8E\xEB\x0D\x79" +
287 | "\xEA\x54\x1D\xEB\xF3\x35\xD6\x94\x7F\xF1\xF6\x6A\x0C\xC3\x00\x00\x93\x26\x15\x4A\xA5\x52\x9D\x4E\x4B\xD3\xB4\xDF\xEF\x67\x59\x56" +
288 | "\x91\x22\x61\x24\x52\xA9\x7C\x28\x0F\x11\x8E\x13\x32\x85\x52\x22\x95\xFB\xBC\x1E\x9C\x20\xE7\x2E\x5E\x3A\xFB\x9A\x9B\x3A\xDB\x5B" +
289 | "\x5A\x1A\xAA\xDB\x5B\x1A\xBB\xDA\xDB\x9C\x8E\x6E\xBB\xA3\xF1\x62\xC4\x83\x90\xC8\xE4\x86\xBC\xF1\xE9\xD9\x46\x43\xFE\x04\x43\xDE" +
290 | "\x58\x79\x92\x2A\x38\xD5\x93\x14\x4D\x84\x30\x74\x86\x85\x20\x08\xA1\xCA\x9D\xD7\xEB\x45\xDE\xD1\xE6\xE6\xE6\x9A\x9A\x9A\x01\x79" +
291 | "\x88\x03\x4C\xA4\x61\x0C\x44\x00\x80\x42\xA1\x08\x1A\x2B\x91\x17\xF0\xF2\xFB\xFD\x3C\xCF\x89\x18\x66\xC0\x92\x4D\xB4\x88\xC9\x1D" +
292 | "\x3F\x39\x77\xFC\xE4\x08\x7F\xDB\xB0\x20\x08\x42\x9E\xA4\x92\xCA\x93\x6C\xAD\x4D\x04\x49\xB9\x5C\x2E\x86\x61\xB4\x5A\x9D\x44\x22" +
293 | "\x41\xBA\xA5\xDB\xED\x72\x3A\x9D\xE6\x89\xA9\x12\xA9\x3C\x92\x9F\x80\x13\x84\x54\xAE\x90\xC8\xE4\x01\x3F\xCB\xF6\xF5\x51\xB4\x49" +
294 | "\x1B\x92\x39\xC5\x71\x1C\xCF\x05\x30\x0C\xA3\x28\x9A\x20\x09\x9C\x20\x45\x8C\x98\x11\x4B\xC8\x1F\x47\xB6\x71\x9C\x20\x29\x9A\x65" +
295 | "\x23\x12\x21\xAA\x0B\x12\xFA\xA8\xD1\xE0\x1E\x5A\x19\x1E\x66\x2D\x44\xD7\x87\xED\xB4\x17\xA1\x8F\x94\x65\xFB\x04\x41\xA0\x68\x66" +
296 | "\x34\x77\x74\xC2\x71\x3C\x25\x4D\x2F\x95\x29\x50\xAD\x00\x94\xA2\x8C\xF2\x17\xAB\xAA\xAA\x7C\x3E\x5F\xB6\xB9\x00\x1F\x09\xBB\x02" +
297 | "\x00\x40\x8B\x18\x54\xDC\x96\xE7\x79\x9E\x0B\xF0\x3C\x2F\xF0\x3C\x62\x03\x01\x1C\x27\x08\x92\xA2\x48\x7C\xF0\x64\x7F\x8A\x16\x45" +
298 | "\x38\x0A\xFB\x3F\xEA\x48\x30\x8C\x08\x49\x92\x44\xE5\x12\x82\x06\xB8\xD3\xE9\x6C\x6B\x6B\x8B\xA4\x69\x96\x65\x21\x84\x22\x86\x19" +
299 | "\x05\x8A\x66\x28\x52\x34\x69\x19\x39\xA6\x9A\xF2\x53\x07\x0F\x1E\x1C\x3F\x7E\x3C\xCF\xF3\x10\x62\x56\xAB\xF5\xF3\xCF\x3F\x93\x29" +
300 | "\x94\xB1\x14\x39\x09\xFA\x2D\x23\x07\x00\x80\xA2\x68\xBF\x3F\x22\x6E\x15\x8E\xE3\xE3\xC6\x8D\x0B\x32\xAD\x59\x96\xAD\xAD\xAD\x45" +
301 | "\xE5\x12\x86\x18\x88\xE1\x22\x44\x6A\x85\x5E\xAF\x47\x21\x43\xA3\xD1\x18\x56\x0F\x31\xF2\x44\x6D\xBF\x3F\x80\x46\x61\x24\x27\xC7" +
302 | "\x11\x38\x41\x2C\xB8\xF1\x0E\x4B\x6D\xE5\x3B\xEF\xBC\xB5\x71\xE3\x97\x1E\x8F\xE7\xE8\xD1\x23\x88\x36\x30\x73\xE1\xF5\x3A\x7D\xCE" +
303 | "\x68\x76\x06\x00\x40\x52\x54\x24\x59\x0C\x18\x86\xE1\x38\xBE\x70\xE1\xC2\xB0\xC8\xBE\xC3\xE1\x40\x61\x42\xB4\x17\x73\xFF\xD4\x7B" +
304 | "\x12\x71\xAA\xFA\x97\x0E\x8A\xBD\xF7\x68\xED\xA5\x47\x42\xCF\x8D\x17\x72\x72\xC7\xFE\xFC\x37\xCF\xEE\xDA\xFC\x79\x53\x5D\xA5\x00" +
305 | "\x31\x8A\xA4\x33\x72\x32\x26\x94\xCC\x9A\xBD\xE8\xC6\x51\x9E\x12\x00\x00\x04\x49\x06\x02\x11\x89\x70\x40\x28\x95\xCA\xC9\x93\x27" +
306 | "\x4F\x9E\x3C\x19\xBB\x40\xB7\x6C\xAE\xAB\xAB\x6B\x69\x69\x41\xA5\x83\xEC\x76\x3B\x69\x30\x18\x12\xB4\x5B\x0C\xDA\x99\x94\xBA\x44" +
307 | "\x3B\xE5\x65\x99\x0A\xEE\x79\xF4\x19\x2E\xE0\xE7\x79\x1E\x20\xCD\x30\xC1\x89\x2F\x03\x03\x00\x82\xA4\xE2\xC5\x33\x26\x49\xD2\x60" +
308 | "\x30\x84\xEE\xAF\x93\xD8\xDD\x62\x38\x2E\x00\x21\xBC\x24\xA3\x10\x01\x00\x40\xD1\xA2\x4B\x5B\x6A\x18\x99\xBC\x81\x40\x5F\xE2\xC8" +
309 | "\xD0\x09\xD4\x15\x03\x01\x4E\x10\x04\xF2\xDF\x7B\xB3\x43\x00\x00\x4E\x10\xC1\xF4\x92\x44\x20\x81\x22\x44\xA3\x70\x34\xF3\x9B\x2E" +
310 | "\x4F\xE0\x38\x91\x20\x02\x26\x02\x69\xB7\xDB\x77\xEF\xDE\x8D\xE3\x78\x56\x56\x56\xB0\x06\x62\x5C\x86\x3C\x4A\xA5\xF8\x27\x2A\x9A" +
311 | "\x9E\x08\xA0\xEC\xCC\x78\x25\x06\x21\x33\x1D\xA5\x55\x34\x35\x35\x09\x82\xD0\xD3\xD3\x43\x76\x76\x76\x7E\xF9\xE5\x97\xC1\x9B\xA1" +
312 | "\x72\x4F\x48\x35\x45\x6C\xB3\x58\xE8\x11\x10\xC2\x4B\xA3\x44\x5C\x4E\x40\x09\xB6\x51\x27\xBF\x05\xBD\x2B\xF5\xF5\xF5\xF5\xF5\xF5" +
313 | "\x0D\x0D\x0D\xA8\xBC\xFA\xC0\xBB\xC5\xF0\x3C\xDF\xD0\xD0\xD0\xD0\xD0\x80\x5D\x64\x20\x06\xE9\x33\x41\xA6\x7A\x70\x03\xC2\x61\xC1" +
314 | "\x71\x3C\x86\x61\xFF\xEE\x22\x04\x00\x5C\x10\xA1\x30\x2C\xD9\x0C\x42\xD8\xDE\xDE\x1E\x7C\xD4\x7D\x7D\x7D\x28\x4B\x3B\x98\x62\x38" +
315 | "\xE0\x55\x43\xED\x16\xE3\xF1\x78\x4E\x9F\x3E\x7D\xFA\xF4\xE9\xB0\xB1\x18\x21\x29\x48\x10\x78\x08\x61\x8C\x65\x26\xFF\xD9\x01\x7E" +
316 | "\x18\x85\xC3\x9F\xCC\xF3\xFC\x86\x0D\x1B\x82\x1F\x23\x1C\xBB\x11\x3D\xDF\xE8\xE6\x01\xF4\xD6\x8C\xC8\x21\xF9\xAF\x08\x00\x40\x70" +
317 | "\x14\x0E\x8F\x78\x26\x6A\xA3\x32\xF5\x26\x93\x29\x3B\x3B\x3B\x74\xDB\xAD\xA6\xA6\xA6\xFD\xFB\xF7\x47\xDE\x9B\xD1\x17\x21\xC0\x30" +
318 | "\x0C\x60\x24\x81\x13\x38\x8E\x5F\x98\x3C\xA0\x20\x40\x4E\x80\x3C\x2F\x24\x3C\x1D\x3B\xAC\x33\x00\x43\xEA\x8C\x10\xC1\x9D\xD1\x6E" +
319 | "\x31\xD9\xD9\xD9\xE8\x23\xCB\xB2\x2D\x2D\x2D\x68\x22\x65\x59\x76\x30\x2F\x1D\x19\x7A\x3D\x41\x10\xA9\xA9\xA9\x05\x05\x05\x3A\x9D" +
320 | "\xCE\x64\x32\xA5\xA5\xA5\xF5\x0F\x32\x44\xAE\x59\xA1\x51\x48\x8C\xD6\xE6\x20\x24\x81\x4B\x44\x24\x43\x91\x34\x45\xD0\xE4\x60\xDB" +
321 | "\xCA\x62\x2C\xC7\xB1\x7E\xDE\xEB\x0F\xF4\xF9\x87\xF2\x1D\xC7\x0D\x00\xE0\x38\x31\x74\xD9\xD2\x90\x73\x41\x66\x66\x66\x7E\xFE\x0F" +
322 | "\x5B\x23\xA0\x32\xFB\x41\x06\x62\x73\x73\x73\x75\x75\x75\x47\x47\x87\x20\x08\x41\x8F\x0F\x99\x9A\x9A\x3A\x7F\xFE\x7C\x44\x42\x8C" +
323 | "\x2F\x8F\x4D\x10\x04\x0C\x83\x20\xC1\x91\x26\x1C\x00\x29\x43\xC9\xC5\x34\x43\x0F\xBF\x28\x00\x80\x31\x14\xC9\x50\x64\x92\x54\xC4" +
324 | "\xF3\xD0\xE5\xF3\x3B\x7D\x2C\xC7\x27\x2A\x21\x0D\x43\xD3\x28\x49\x22\x4B\x20\x96\x46\xC2\x18\x88\x0D\x0D\x0D\x6D\x6D\x6D\x10\xC2" +
325 | "\xFD\xFB\xF7\x93\x2A\x95\xEA\xAA\xAB\xAE\x8A\x5F\x9F\x7F\x00\x5A\x40\x13\x17\x2C\x04\x00\x28\xC4\x74\x92\x54\x44\x12\xD1\xDC\x82" +
326 | "\x20\x80\x52\x26\x4A\x92\xD2\x4E\x2F\x6B\x77\xB3\x42\xA2\x46\x24\x20\x08\xA2\x7F\xE1\x97\x58\xC0\x30\x4C\xB0\x48\xE9\x99\x33\x67" +
327 | "\x12\xA8\x2E\x5E\xE4\x8D\x25\x44\x84\x62\x9A\x4C\x56\x48\x68\x32\xD6\xC6\x01\x00\x49\x52\x46\x22\xA2\x3B\x9D\xDE\x3E\x7F\xFC\xDD" +
328 | "\x60\x00\x00\xA4\x93\x27\xCE\x41\x93\xD0\x59\x6E\xC4\xE5\x7C\x22\x01\x00\x20\x59\x2E\xD6\xA9\x64\xB1\xCB\x2F\x08\x8A\xC4\x75\x2A" +
329 | "\xA9\x5C\x9C\x10\x5F\x20\x4E\x90\xF1\x1D\x85\x61\xF8\x27\x33\xDA\x08\x1C\xD7\x28\x25\xE2\x08\x96\xBD\x91\x02\x07\x20\x45\x21\x06" +
330 | "\x00\x38\xBD\x23\xA8\x02\x36\x2C\x50\xA4\x22\xB1\x22\x6C\x6A\x6A\x7A\xF1\xC5\x17\x51\xC5\x20\x14\xAC\x1F\x2C\x21\xE6\x92\x83\x22" +
331 | "\x71\xAD\x52\x3A\x98\xB6\x19\x3B\x00\x00\x6A\x39\xC3\xF1\x82\x97\x8D\x67\x0D\x9A\x20\xD7\x34\xF6\xA6\x20\x84\x6D\x6D\x6D\xB5\xB5" +
332 | "\xB5\xC1\xCD\xEF\xDA\xDB\xDB\x49\xA4\xDE\x60\x18\x56\x57\x57\x87\x85\x30\x10\x91\xD7\x3B\x37\x37\x57\xA1\x50\x84\xAA\x24\xA3\xA1" +
333 | "\x88\x0F\x04\x8A\xC0\x75\x4A\x19\x15\xBF\xC9\x73\x40\xA0\xB1\xD8\xDA\xC3\xC7\x51\x4D\x25\x08\x12\x42\x28\x08\x11\x89\x30\xCC\x8B" +
334 | "\x82\xCA\xEE\x21\xD7\x68\x4B\x4B\x4B\x6D\x6D\x6D\x7F\x1E\x62\xF8\x8C\x14\xB6\x0B\x33\x8E\xE3\x2A\x95\xCA\x6C\x36\x07\xE9\x4F\xBD" +
335 | "\xBD\xBD\x89\x2B\x0B\x31\x18\x08\x1C\xD7\x28\xA5\x89\x96\x1F\x02\x49\xE0\xC9\x72\xC6\xE6\xF0\xC6\xEB\x55\xC5\x09\x1C\x42\x8C\x8F" +
336 | "\xE0\x9D\x40\x35\xE9\x83\x1B\xBB\xF8\xFD\xFE\xDA\xDA\x5A\xBB\xDD\x3E\x74\x3D\xC4\xE1\x77\x8B\xE9\xEE\xEE\xEE\xEE\xEE\x0E\xFD\x32" +
337 | "\x11\x85\x2B\x86\x00\x00\x20\x45\x21\x16\x51\xA3\xE7\xE5\x91\x88\x28\x09\x43\x79\xFA\xE2\x33\x9D\xE2\x04\x89\x61\x11\xAD\x85\x82" +
338 | "\x20\x9C\x3E\x7D\x7A\xA4\xED\x0F\xAF\x17\xA0\x7A\x88\x41\x7E\x2A\xC7\x71\x11\xAF\x94\x17\xF6\xB3\x1B\x69\x9F\xC2\x90\x24\xA6\xA5" +
339 | "\xCC\xA8\x06\x1D\x01\x00\x2A\x19\xE3\xF3\x73\x91\x78\xC5\x86\x05\x8E\x13\x10\x46\xE4\xFC\x04\x00\xC8\x64\xB2\x50\x2A\x30\xCB\xB2" +
340 | "\x28\xEC\x3A\xC4\x55\x03\x88\x10\x2D\x87\xA8\x1E\xA2\x5E\xAF\x37\x1A\x8D\xA1\x9B\xA7\x45\x4E\x42\x04\x20\x0E\x22\x14\x91\x44\x92" +
341 | "\x6C\xB4\x69\x8C\x18\x86\xD1\x24\x21\x63\x28\xA7\x37\x7A\xE6\x59\x10\x38\x8E\x63\x58\x44\x0E\x36\x82\x20\x7E\xF6\xB3\x9F\x85\x92" +
342 | "\x10\x11\x03\xD1\x62\xB1\x20\x06\x22\x2A\x14\x17\x76\x15\x19\xAC\xA7\xAE\x50\x28\x0A\x0A\x0A\x32\x32\x32\x0C\x06\x03\xDA\x99\x35" +
343 | "\xF6\xDE\x03\x80\x45\xE8\xA1\x1F\xEC\x72\x95\x9C\x21\xF0\x4B\xA3\x1E\x2B\x24\x22\xB7\x2F\x10\xBB\xD7\x06\x29\x83\xD1\x3D\x87\x30" +
344 | "\x06\xA2\xD5\x6A\xAD\xAB\xAB\x6B\x6A\x6A\xAA\xAC\xAC\x44\x59\x06\x10\x42\xD2\x68\x34\x3E\xF0\xC0\x03\x38\x8E\xC7\x3D\xCB\x17\xC7" +
345 | "\x71\x0C\x03\x30\x06\xDD\x47\x4C\x53\x62\xFA\x92\xF1\x36\x28\x92\x90\x88\x28\x77\x5F\xAC\x03\x11\xC4\x16\xB5\x0F\x82\x24\xC9\xEC" +
346 | "\xEC\xEC\xD0\x38\x06\xCF\xF3\x6F\xBE\xF9\x26\x89\x76\x28\x8C\xB1\xF5\x01\x81\x6A\x03\x47\xAD\xBE\x02\x00\x94\x32\xE6\x12\x1A\xA8" +
347 | "\x00\xC3\x64\xE2\x78\x88\x10\x5C\xD8\x6D\x37\x1E\x9D\xFA\x01\xC8\x46\x20\x88\xA8\x1C\xC4\x11\x02\x25\x34\x09\xD1\x4E\xA4\x62\x9A" +
348 | "\x14\x25\xCC\x8A\x8F\x10\x22\x8A\xA0\x62\x7E\x44\xE8\x2D\x4C\x9C\x3D\x9D\x40\x11\x5E\x50\x67\xA2\x55\xEA\x14\x62\xFA\x92\xFB\x88" +
349 | "\x08\x1C\x8F\xDD\x98\x01\x17\xD6\xC2\x78\x74\x68\x20\x90\x28\x34\x0C\x00\x48\x49\x49\x41\xF9\xE3\xF1\xF2\xAE\xA1\x65\x3C\x42\xAF" +
350 | "\x44\x18\x68\x92\x10\x25\xC0\x11\x1A\x05\x44\x14\xE9\x8E\x93\x81\x18\x17\xA0\x65\x35\x10\x08\xA0\xE2\x46\x2C\xCB\x92\xCD\xCD\xCD" +
351 | "\xCF\x3F\xFF\x3C\x3A\x8C\xB8\x87\xE9\xE9\xE9\x79\x79\x79\x31\x32\x10\xB1\xD8\x44\xC8\xD0\xE4\xA5\x52\x44\xC3\x30\x9A\x2E\x85\xC1" +
352 | "\x10\xE4\x21\x56\x57\x57\x5B\x2C\x96\xFA\xFA\xFA\xE6\xE6\x66\x00\x00\xFA\x9E\x0C\x55\x37\x82\xBB\x30\x07\x19\x88\x88\x56\x9A\x93" +
353 | "\x93\x13\xD4\x57\x23\x57\x4F\x90\xB9\x12\x9D\x46\x3A\xCA\xB6\xFC\x10\x20\x08\x1C\xC7\x41\x2C\x36\xFE\x85\xFA\x9A\x91\xBD\x90\x28" +
354 | "\xA7\x1E\xFD\x1D\x08\x04\x50\x7E\x36\xDA\x2D\x66\x30\x1E\xE2\xA0\xBB\xC5\x04\x19\x88\xFD\x99\xAC\x11\x3A\xD8\x2E\x8E\xC2\x91\x53" +
355 | "\xB2\x08\x3C\x76\x25\x22\x5E\x20\x00\xA0\x08\x9C\x8D\x6A\x2E\x41\x08\x2D\x99\x32\x34\x38\x8E\x7B\xF5\xD5\x57\x83\x1F\x83\x35\x90" +
356 | "\x86\xBE\x6A\xF8\x27\x15\xC9\x9E\x33\x03\x37\x1D\xAD\x08\x69\x92\x20\x46\x31\xB7\x7B\x68\xE0\x38\x88\x31\xBC\x85\x14\xBA\x28\x96" +
357 | "\xA4\x08\x49\x53\x43\xA9\x0C\x88\xD3\x86\x78\x88\x41\x67\x4D\x57\x57\x57\x75\x75\x75\x24\x3D\x00\x00\x07\x00\x44\xB1\x16\xD2\x14" +
358 | "\x71\xC9\x75\xD1\x50\x30\x14\xE9\xF2\x45\x6F\x1D\x0A\x02\x87\x92\xF2\x87\x3D\x13\xC7\xF1\x69\xD3\xA6\x05\xD3\xAA\x51\x49\x59\xB4" +
359 | "\xE1\x56\xA4\x25\x65\x83\x3C\x44\x54\xA4\xDB\x64\x32\xE9\x74\xBA\x30\xFE\x52\x65\x65\x65\x6D\x6D\x6D\x24\x5D\xBF\x30\x0A\x47\x1E" +
360 | "\x78\xBB\xE4\xE6\x60\x18\x44\x34\x89\x74\x87\xE8\x2E\xE7\x79\x1E\xC3\x40\x24\x34\x30\x24\xC2\xB0\x44\xED\x20\x03\x11\xC5\x0B\x5B" +
361 | "\x5B\x5B\xC3\x72\xB5\x49\x95\x4A\x35\x6E\xDC\x38\x64\x54\xE4\xE4\xE4\x84\x6A\x2E\x31\x02\xC7\x41\x74\xEA\xCC\xE8\xC4\x05\x23\x07" +
362 | "\x81\x03\x8A\xC4\xFD\x81\x28\x97\x43\x8E\x0B\x00\x10\xFD\xE6\x7A\x41\x06\x22\xFA\x88\x12\x2D\x1A\x1B\x1B\xBB\xBB\xBB\x05\x41\x28" +
363 | "\x2F\x2F\x27\x53\x53\x53\xEF\xBC\xF3\xCE\xE8\x5A\x1F\x1A\xD1\x19\x15\x21\x14\xEC\xCB\x05\x04\x0E\x44\x24\x11\xB5\x08\xF9\x40\x00" +
364 | "\x15\x48\x8E\x4B\x67\x18\x86\x29\x28\x28\x08\x96\x9D\x8D\xC3\x8E\xDA\x43\xAC\xD2\x68\x2D\x1C\xE9\x28\x24\xF0\xB8\xF9\x16\xE2\x88" +
365 | "\x48\x78\xC6\x83\x21\xE0\xF7\x03\x00\x06\xCC\xB3\x8C\x4B\xD2\x61\xAC\x22\x24\x49\x12\x55\xCF\x1D\xA0\x69\xE4\xE6\x1E\xA1\x8F\x34" +
366 | "\x1E\x7B\x09\xC7\x1F\x51\x1B\xF8\x10\x42\xBF\x9F\xC5\x71\xBC\xFF\x76\xEB\x1C\xC7\x75\x75\x75\xC5\x5E\x5C\x24\x0E\xA3\xB0\xAD\xAD" +
367 | "\x6D\xC0\xED\xF0\xA2\xF3\x91\x02\x00\x00\x76\xD9\xC9\x10\x07\x20\x3A\xCE\x38\x14\x84\x80\x9F\x05\x00\x30\x4C\x78\xD9\x88\x8A\x8A" +
368 | "\x8A\xB6\xB6\xB6\xD8\x5F\x58\xB2\xBB\xBB\x7B\xE3\xC6\x8D\x18\x86\x25\x27\x27\x23\x06\xE2\x48\x29\xF4\x3A\x9D\xEE\xA5\x97\x5E\x5A" +
369 | "\xBD\x7A\xB5\x5E\xAF\xFF\xF1\x91\x0B\x59\x45\x23\x6A\x0D\x04\xAF\xBB\x9C\x80\x03\x80\xE3\x00\x1B\xF9\x6A\x28\x08\x3C\xDB\xE7\x25" +
370 | "\x49\x32\xAC\xF2\x87\xD5\x6A\x5D\xBD\x7A\xB5\x4E\xA7\x1B\x79\x83\x42\x5B\x5B\x5B\x4D\x4D\x0D\x22\x34\x75\x75\x75\x91\xDD\xDD\xDD" +
371 | "\x3B\x77\xEE\x44\x87\x11\xE5\xC2\x64\x32\x21\xD5\xD4\x6C\x36\x47\x52\x54\x1A\x79\xE3\x1E\x7F\xFC\xF1\x9F\xFD\xEC\x67\xF3\xE7\xCF" +
372 | "\x0F\xBE\x01\x48\x23\x1D\xA9\x6B\x0A\x42\x18\xE0\x2E\x3E\x2A\x18\xFC\x27\xE4\x78\xC8\xA1\x1F\x1D\x18\xFE\x94\xB0\x70\x41\xC8\x69" +
373 | "\xB0\xDF\xB7\x3F\xEE\x12\x84\x58\x74\x3E\x36\x41\x10\x7C\x1E\x8F\x58\x2C\x0E\x1A\xD6\x82\x20\xEC\xDB\xB7\x6F\xED\xDA\xB5\x12\x89" +
374 | "\x24\xC2\x72\x60\xA8\x1E\x62\x43\x43\x03\xAA\xAD\x1E\x08\x04\x06\xDD\x2D\x06\x19\x1C\xD5\xD5\xD5\x35\x35\x35\x28\x3F\x0D\x91\x83" +
375 | "\x43\xB7\x78\x19\xD0\xC6\xA4\x28\x8A\x65\xD9\xF5\xEB\xD7\xFB\xFD\xFE\x39\x73\xE6\x30\x0C\x13\xE4\x73\x88\x49\x4C\x4A\x8C\xE0\xED" +
376 | "\x25\x20\x64\xBD\x3F\x5A\x3E\xE1\x40\xFF\x0D\xF0\x21\xF8\xE5\x80\x82\x0A\xF9\x00\xFB\x1D\x19\xD0\xE4\x0B\x3B\x2C\xC2\xA0\x68\xE4" +
377 | "\x0B\x22\x01\x38\xC8\x07\x44\x17\xAB\xF0\xF5\xF5\xF5\x1D\x3C\x78\x70\xD3\xA6\x4D\x68\xF7\x8F\xFE\xE7\xF3\x3C\x1F\xAA\x58\x20\xD7" +
378 | "\x76\x73\x73\x33\x92\xDF\x80\xFE\x9A\xE1\xE7\x2C\x82\x20\xD0\xE6\x17\xC1\x7B\x48\x24\x12\x83\xC1\x30\xE0\x24\xEE\xF1\x78\x58\x96" +
379 | "\xCD\xCE\xCE\xD6\x6A\xB5\x81\x80\xFF\xF0\xE1\xC3\x53\xA6\x94\x8C\x74\x1B\xF7\x7F\x25\x08\x82\x70\xEA\xD4\xF7\x34\x4D\x17\x14\x8C" +
380 | "\xE9\xE8\xE8\xB0\x58\x2C\x22\x91\x68\xC0\x0D\x0F\x20\x84\x0D\x0D\x0D\x5E\xAF\x37\xF4\x51\x0F\xC8\x77\x0A\x43\x34\xCB\x8E\x52\xA9" +
381 | "\x34\x1A\x8D\x97\xA3\xE2\xF8\xCF\x0C\x24\xC2\xD0\x1D\x04\x22\x44\x54\x5A\xD6\x25\xE2\xE4\xFF\xCB\x23\x3A\x9E\x51\x34\x22\x4C\xE8" +
382 | "\x56\x8D\xFF\xB6\xE0\x79\x3E\xBA\x2A\xEC\xD1\x58\xAC\x82\x20\xF8\xFD\xFE\x78\x6D\x80\xF6\x1F\x60\x18\x06\x21\x6C\x6A\x6A\xF2\x78" +
383 | "\x3C\x51\x5C\x1B\xA5\xD3\xC1\xE7\xF3\xB9\x5C\x2E\x92\x24\x69\x9A\xFE\x8F\x20\x63\x81\x20\x08\x4E\xA7\xB3\xA1\xA1\x01\x51\x7B\xA3" +
384 | "\x40\xCC\x0E\x3A\x1C\x17\x89\x44\x89\xDB\x4B\xFC\x5F\x1B\x82\x20\xF4\xF5\xF5\xC5\xB8\x2A\xFD\x7F\x4C\x18\xE0\x52\x80\x11\xA5\x37" +
385 | "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"
386 |
387 | const eye_open_rgbbitmap = "" +
388 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
389 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE7\x1C\x8C\x71\x63\x2C\x6B\x6D\xB5\xB6\xFF\xDF\xFF\xFF\xFF\xFF" +
390 | "\xFF\xFF\xFF\xFF\xFF\xFF\x9C\xF3\x29\x45\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x8C\x51\xFF\xFF\xFF\xFF" +
391 | "\xFF\xFF\xFF\xFF\xAD\x55\x31\xC6\xBE\x18\xAD\xB6\x29\x45\x18\xE3\x18\xE3\x29\x44\xD6\xBA\xFF\xFF" +
392 | "\xFF\xFF\xEF\x7D\x39\xE7\x4A\x8A\xE7\x7E\xE7\x7E\x39\xC7\x18\xE3\x18\xE3\x18\xE3\x9C\xF3\xFF\xFF" +
393 | "\xFF\xFF\xCE\x59\x29\x44\x21\x03\x6B\x8E\x63\x2C\x21\x03\x18\xE3\x18\xE3\x18\xE3\x94\x92\xFF\xFF" +
394 | "\xFF\xFF\xCE\x79\x29\x45\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\xA5\x14\xFF\xFF" +
395 | "\xFF\xFF\xF7\x9E\x42\x07\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x21\x24\xD6\x9A\xFF\xFF" +
396 | "\xFF\xFF\xFF\xFF\xA5\x14\x21\x03\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x63\x0C\xF7\xBE\xFF\xFF" +
397 | "\xFF\xFF\xFF\xFF\xFF\xDF\x7B\xEF\x21\x03\x18\xE3\x18\xE3\x18\xE3\x39\xC6\xDE\xDB\xFF\xFF\xFF\xFF" +
398 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC6\x18\x73\x8D\x5A\xCB\x84\x0F\xE7\x1C\xFF\xFF\xFF\xFF\xFF\xFF" +
399 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
400 |
401 | const eye_close_rgbbitmap = "" +
402 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
403 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
404 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
405 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
406 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
407 | "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF" +
408 | "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF" +
409 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
410 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
411 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
412 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" +
413 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
414 |
--------------------------------------------------------------------------------
/11_spi_ili9341/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "image/color"
5 | "image/png"
6 | "log"
7 | "machine"
8 | "strings"
9 | "time"
10 |
11 | "tinygo.org/x/drivers/ili9341"
12 | "tinygo.org/x/tinydraw"
13 | "tinygo.org/x/tinyfont"
14 | "tinygo.org/x/tinyfont/freemono"
15 | )
16 |
17 | var (
18 | white = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}
19 | red = color.RGBA{R: 0xFF, G: 0x00, B: 0x00, A: 0xFF}
20 | green = color.RGBA{R: 0x00, G: 0xFF, B: 0x00, A: 0xFF}
21 | blue = color.RGBA{R: 0x00, G: 0x00, B: 0xFF, A: 0xFF}
22 | black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF}
23 | )
24 |
25 | func main() {
26 | display := InitDisplay()
27 |
28 | // body
29 | display.FillRectangle(20, 20, 280, 200, white)
30 |
31 | // lcd
32 | display.FillRectangle(25, 25, 270, 160, black)
33 |
34 | // speaker
35 | for i := int16(0); i < 4; i++ {
36 | display.FillRectangle(40+i*15, 190, 5, 20, black)
37 | }
38 |
39 | // buttons
40 | for i := int16(0); i < 3; i++ {
41 | display.FillRectangle(40+i*60, 15, 40, 5, blue)
42 | }
43 |
44 | // 5-way key
45 | tinydraw.FilledCircle(display, 260, 180, 20, blue)
46 |
47 | // text
48 | tinyfont.WriteLine(display, &freemono.Regular9pt7b, 30, 40, "Booting Wio Terminal...", green)
49 |
50 | // tinygo logo
51 | {
52 | img, err := png.Decode(strings.NewReader(tinygo_logo_s_png))
53 | if err != nil {
54 | log.Fatal(err)
55 | }
56 |
57 | w := img.Bounds().Dx()
58 | h := img.Bounds().Dy()
59 | for y := 0; y < h; y++ {
60 | for x := 0; x < w; x++ {
61 | r, g, b, _ := img.At(x, y).RGBA()
62 | display.SetPixel((320-int16(w))/2+int16(x), (240-int16(h))/2+int16(y), color.RGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: 0xFF})
63 | }
64 | }
65 | }
66 |
67 | initEyes()
68 |
69 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
70 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
71 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
72 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
73 |
74 | redraw := true
75 | xofs := int16(0)
76 | yofs := int16(0)
77 | eye := eyeClose
78 | eyeCh := make(chan struct{}, 1)
79 | go func() {
80 | for {
81 | eyeCh <- struct{}{}
82 | time.Sleep(1500 * time.Millisecond)
83 | eyeCh <- struct{}{}
84 | time.Sleep(300 * time.Millisecond)
85 | }
86 | }()
87 |
88 | for {
89 | if !machine.WIO_5S_UP.Get() {
90 | if 0 < yofs {
91 | yofs--
92 | redraw = true
93 | }
94 | } else if !machine.WIO_5S_LEFT.Get() {
95 | if -4 < xofs {
96 | xofs--
97 | redraw = true
98 | }
99 | } else if !machine.WIO_5S_RIGHT.Get() {
100 | if xofs < 7 {
101 | xofs++
102 | redraw = true
103 | }
104 | } else if !machine.WIO_5S_DOWN.Get() {
105 | if yofs < 20 {
106 | yofs++
107 | redraw = true
108 | }
109 | }
110 |
111 | select {
112 | case <-eyeCh:
113 | if eye == eyeOpen {
114 | eye = eyeClose
115 | } else {
116 | eye = eyeOpen
117 | }
118 | redraw = true
119 | default:
120 | }
121 |
122 | if redraw {
123 | drawEye(display, 127+xofs, 91+yofs, eye)
124 | drawEye(display, 181+xofs, 91+yofs, eye)
125 | redraw = false
126 | }
127 | time.Sleep(50 * time.Millisecond)
128 | }
129 | }
130 |
131 | const (
132 | eyeOpen = iota
133 | eyeClose
134 | eyeClear
135 | )
136 |
137 | func drawEye(display *ili9341.Device, x, y int16, mode int) {
138 | switch mode {
139 | case eyeOpen:
140 | display.DrawRGBBitmap(x, y, eyeOpenRGB[:], 12, 12)
141 | case eyeClose:
142 | display.DrawRGBBitmap(x, y, eyeCloseRGB[:], 12, 12)
143 | case eyeClear:
144 | display.FillRectangle(x, y, 12, 12, white)
145 | }
146 | }
147 |
148 | var (
149 | eyeOpenRGB [144]uint16
150 | eyeCloseRGB [144]uint16
151 | )
152 |
153 | func initEyes() {
154 | for i := 0; i < len(eye_open_rgbbitmap)/2; i++ {
155 | eyeOpenRGB[i] = uint16(eye_open_rgbbitmap[i*2])<<8 + uint16(eye_open_rgbbitmap[i*2+1])
156 | }
157 |
158 | for i := 0; i < len(eye_close_rgbbitmap)/2; i++ {
159 | eyeCloseRGB[i] = uint16(eye_close_rgbbitmap[i*2])<<8 + uint16(eye_close_rgbbitmap[i*2+1])
160 | }
161 | }
162 | func InitDisplay() *ili9341.Device {
163 | machine.SPI3.Configure(machine.SPIConfig{
164 | SCK: machine.LCD_SCK_PIN,
165 | SDO: machine.LCD_SDO_PIN,
166 | SDI: machine.LCD_SDI_PIN,
167 | Frequency: 48000000,
168 | })
169 |
170 | // configure backlight
171 | backlight := machine.LCD_BACKLIGHT
172 | backlight.Configure(machine.PinConfig{machine.PinOutput})
173 |
174 | display := ili9341.NewSPI(
175 | machine.SPI3,
176 | machine.LCD_DC,
177 | machine.LCD_SS_PIN,
178 | machine.LCD_RESET,
179 | )
180 |
181 | // configure display
182 | display.Configure(ili9341.Config{})
183 |
184 | backlight.High()
185 |
186 | display.SetRotation(ili9341.Rotation270)
187 | display.FillScreen(color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF})
188 |
189 | return display
190 | }
191 |
--------------------------------------------------------------------------------
/11_spi_ili9341/tinygo-logo-eye-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/11_spi_ili9341/tinygo-logo-eye-closed.png
--------------------------------------------------------------------------------
/11_spi_ili9341/tinygo-logo-eye.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/11_spi_ili9341/tinygo-logo-eye.png
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright 2021 sago35
2 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
4 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # お知らせ
2 |
3 | TinyGo 0.26 + Wio Terminal という組み合わせで技術書「基礎から学ぶ TinyGoの組込み開発」 (2022/11/12 発売) を執筆しました。本ページと合わせて確認してみてください。
4 |
5 | * https://sago35.hatenablog.com/entry/2022/11/04/230919
6 |
7 | ----
8 |
9 | 
10 | https://gocon.connpass.com/event/226098/
11 |
12 | このページは 2021/11/13 に開催される Go Conference 2021 Autumn 内の Wio Terminal を使った TinyGo ハンズオン用の記事です。不明点は、このページのコメントや [twitter:sago35tk](https://twitter.com/sago35tk) で質問いただければサポートします。
13 | Twitter のハッシュタグは [#gocon](https://twitter.com/hashtag/gocon) および [#goconT](https://twitter.com/hashtag/goconT) です。
14 |
15 | 
16 |
17 | # ダウンロード
18 |
19 | ダウンロードに時間がかかる可能性があるので、最初にダウンロードリンクを記載します。すぐにダウンロードを開始してください。明確にインストール済みである場合でも (実際には使用しないかもしれませんが) ダウンロードするようにしてください。
20 | Go は Go 1.16 以降が入っていれば問題ありませんし、 Git はインストールされていればかなり古い Version でもおそらく問題ありません。しかし、もしものために説明を聞きつつダウンロードは進めてください。
21 |
22 | ## Windows 環境
23 |
24 | 以下の 3 ファイルをダウンロードしてください。
25 |
26 | * [Git](https://gitforwindows.org/)
27 | * https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/Git-2.33.1-64-bit.exe
28 | * Download をクリックして Git-2.33.1-64-bit.exe のようなファイルをダウンロード
29 | * [Go](https://golang.org/dl/)
30 | * https://golang.org/dl/go1.17.3.windows-amd64.msi
31 | * 他 version の Go が入っている場合などは [zip 版](https://golang.org/dl/go1.17.3.windows-amd64.zip) を使っても良いですが、原則 msi 版を使ってください
32 | * [TinyGo](https://tinygo.org/getting-started/install/windows/)
33 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.windows-amd64.zip
34 |
35 | ハンズオンでは (WSL2 ではなく) Windows Native 版の Go および TinyGo を使用します。 Windows Native 環境に Git / Go などがインストールされていない場合はインストールが必要です。
36 |
37 | ## macOS 環境
38 |
39 | 以下の 2 ファイルをダウンロードしてください。
40 |
41 | * [Go](https://golang.org/dl/)
42 | * https://golang.org/dl/go1.17.3.darwin-amd64.pkg
43 | * apple M1 chip の mac についても darwin/amd64 をインストールしてください
44 | * [TinyGo](https://tinygo.org/getting-started/install/macos/)
45 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.darwin-amd64.tar.gz
46 |
47 | ## Linux 環境
48 |
49 | 以下の 2 ファイルをインストールしてください。
50 | また Git がインストールされていない場合、後述の `apt install git` を実行してください。
51 |
52 | * [Go](https://golang.org/dl/)
53 | * https://golang.org/dl/go1.17.3.linux-amd64.tar.gz
54 | * [TinyGo](https://tinygo.org/getting-started/install/linux/)
55 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo_0.21.0_amd64.deb
56 |
57 | Git がインストールされていない場合、以下を実行してください。
58 |
59 | * Git
60 | * `sudo apt install git`
61 |
62 | # はじめに
63 |
64 | 2021/11/13 の Go Conference 2021 Autumn Online 当日に TinyGo ハンズオンを行います。ハンズオンでは、組込ソフトとしての側面にフォーカスし、 L チカ (LED を光らせる) などを行います。
65 |
66 | 今回ハンズオンを実施するにあたり、 Seeed株式会社様より Wio Terminal ボードをスポンサー していただきました。この connpass イベントに参加申し込みをし、当選した人には TinyGo ハンズオンで使用する Wio Terminal ボードを事前に送付 いたします。
67 | https://www.seeed.co.jp/
68 |
69 | このイベントは日本語で開催されます。
70 | This event will be held in Japanese.
71 |
72 | # 対象としている読者
73 |
74 | 以下を対象としています。
75 | もちろん、すでに TinyGo + Wio Terminal で遊び倒している人でも問題ありません。
76 |
77 | * Go を少し触ったことがある
78 | * 組込マイコンで遊んだことがない
79 | * TinyGo を使ったことがない
80 | * Wio Terminal は今回が初めて
81 |
82 | # TinyGo とは
83 |
84 | マイコンや WASM などの Small Places 向けの Go Compiler です。
85 | 大雑把な理解としては Go の文法でマイコン開発や WASM 開発ができるもの、という程度の認識でよいです。
86 |
87 | * [TinyGo - Go on Microcontrollers and WASM](https://tinygo.org/)
88 |
89 |
90 | # Go と TinyGo の違い
91 |
92 | 基本的な構文は Go と同じですが、パソコンを前提として作られている Go とは異なり、より小さいリソースで動作するような割り切りがあります。
93 | また、マイコンで使うためのいくつかのディレクティブが追加されています。
94 |
95 | * 0.21.0 時点で goroutine は GOMAXPROCS = 1 時のときの動作に近い
96 | * 例えば `time.Sleep()` 等のブロックする命令が呼ばれない限り goroutine は切り替わらない
97 | * runtime package などいくつかの標準 package は TinyGo 側のものが使われる
98 | * 一方で fmt や encoding などは Go のものが使われる
99 | * マイコンやターゲットボード向けの標準 package が追加されている
100 | * マイコンやボード毎の差異を吸収するための machine package や runtime package など
101 | * volatile アクセスのための runtime/volatile package
102 | * reflect package が完全ではない
103 | * これにより、よく話題にあがる encoding/json が動かない、などが発生している
104 | * 未使用変数や未使用関数等は最適化により削除される
105 |
106 | # 必要な環境
107 |
108 | このハンズオンでは PC と Wio Terminal 以外の外付けの部品は使用しません。
109 | 必要なのは TinyGo が動く PC と Wio Terminal のみです。
110 |
111 | * 機材
112 | * PC (Windows / macOS / Linux のいずれか)
113 | * 詳しくはオフィシャルページの [Getting Started / Quick install](https://tinygo.org/getting-started/install/) を参照
114 | * 手元で Windows 10 および Ubuntu 20.04 の環境は試しています
115 | * Wio Terminal
116 | * 公式: https://www.seeedstudio.com/Wio-Terminal-p-4509.html
117 | * 例えば以下から購入できます
118 | * https://akizukidenshi.com/catalog/g/gM-15275/
119 | * https://www.switch-science.com/catalog/6360/
120 | * https://www.marutsu.co.jp/pc/i/1633550/
121 | * https://www.amazon.co.jp/studio-MicroPython-Raspberry-ATSAMD51%E3%83%99%E3%83%BC%E3%82%B9-%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%90%E3%83%B3%E3%83%89WiFi/dp/B08CHBV88D
122 | * ソフトウェア
123 | * [Getting Started / Quick install](https://tinygo.org/getting-started/install/) に従い以下をインストールする
124 | * Go 1.17
125 | * goenv 等は使用しないほうが環境立ち上げで失敗しにくい
126 | * TinyGo 0.21.0
127 | * 上記以外
128 | * Git
129 | * シリアル通信ソフト
130 | * このハンズオンでは、このハンズオン用に作成した `github.com/sago35/yterm` を使います
131 | * 例) Windows : [Tera Term](https://ttssh2.osdn.jp/) など
132 | * 例) macOS / Linux : [Minicom](https://salsa.debian.org/minicom-team/minicom) や [GNU Screen](https://www.gnu.org/software/screen/) など
133 |
134 |
135 | # Wio Terminal とは
136 |
137 | Wio Terminal は Seeed 社のディスプレイ付きの開発ボードです。320 x 240 のディスプレイ、 WiFi / BLE 搭載、ボタンに加速度センサに MicroSD カードスロットに、と非常に多機能です。
138 |
139 | マイコンは Microchip 社の ATSAMD51P19 (Arm Cortex-M4 120MHz) が搭載されています。
140 |
141 | 公式 : https://www.seeedstudio.com/Wio-Terminal-p-4509.html
142 | 日本語 wiki : https://wiki.seeedstudio.com/jp/Wio-Terminal-Getting-Started/
143 | 英語 wiki : https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/
144 |
145 | 
146 |
147 | 
148 |
149 | ※画像は [公式サイト](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) より
150 |
151 | # 環境設定/インストール
152 |
153 | `tinygo version` で version が表示できるところまで環境設定を行います。
154 | 初回実行時は (特に Windows で) 少し時間がかかりますが、これは cached GOROOT を作るのに時間がかかるから、です。
155 | 二回目以降の tinygo コマンド実行時は cache されているので時間はかかりません。
156 | cached GOROOT は、 Go と TinyGo それぞれの標準パッケージをマージした GOROOT を作成しています。
157 | cached GOROOT の場所は以下のコマンドで確認できます。
158 |
159 | ```
160 | $ tinygo info wioterminal
161 | LLVM triple: thumbv7em-unknown-unknown-eabi
162 | GOOS: linux
163 | GOARCH: arm
164 | GOARM: 7
165 | build tags: cortexm baremetal linux arm atsamd51p19a atsamd51p19 atsamd51 sam wioterminal tinygo math_big_pure_go gc.conservative scheduler.tasks serial.usb
166 | garbage collector: conservative
167 | scheduler: tasks
168 | cached GOROOT: %LOCALAPPDATA%\tinygo\goroot-go1.17.3-e453cdef992707f5207f1d88a470047697dbe3a2e9e9d25eeaf1604099de8d75-syscall
169 | ```
170 |
171 | ## Windows
172 |
173 | ### Git
174 |
175 | 以下からダウンロードしてインストールしてください。
176 |
177 | * https://gitforwindows.org/
178 | * https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/Git-2.33.1-64-bit.exe
179 |
180 |
181 | インストールしたら、以下を実行してインストールできていることを確認してください。
182 |
183 | ```
184 | $ git version
185 | git version 2.33.1.windows.1
186 | ```
187 |
188 | ### Go
189 |
190 | 以下からダウンロードしてインストールしてください。
191 |
192 | * https://golang.org/dl/
193 | * https://golang.org/dl/go1.17.3.windows-amd64.msi
194 |
195 |
196 | インストールしたら、以下を実行してインストールできていることを確認してください。
197 |
198 | ```
199 | $ go version
200 | go version go1.17.3 windows/amd64
201 | ```
202 |
203 | ### TinyGo
204 |
205 | 以下をダウンロードして生成される `tinygo` フォルダを `C:\tinygo` となるように解凍/コピーしてください。最終的に `C:\tinygo\bin\tinygo.exe` に `tinygo.exe` が存在すればよいです。
206 |
207 | * https://tinygo.org/getting-started/install/windows/
208 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.windows-amd64.zip
209 |
210 | 環境変数 PATH を通しておきます。このハンズオンでは cmd.exe もしくは Git に含まれる bash.exe を使用してください。
211 |
212 | ```
213 | # cmd.exe を使う場合
214 | $ set PATH=C:\tinygo\bin;%PATH
215 |
216 | # Git に含まれる bash.exe を使う場合
217 | $ export PATH=/C/tinygo/bin:$PATH
218 | ```
219 |
220 | インストールしたら、以下を実行してインストールできていることを確認してください。
221 |
222 | ```
223 | $ tinygo version
224 | tinygo version 0.21.0 windows/amd64 (using go version go1.17 and LLVM version 11.0.0)
225 | ```
226 |
227 |
228 | ### yterm
229 |
230 | 以下を実行してください。
231 | Windows / macOS / Linux のそれぞれで実行可能です。
232 |
233 | ```
234 | $ go install github.com/sago35/yterm@latest
235 | ```
236 |
237 | インストールしたら、以下を実行してインストールできていることを確認してください。
238 |
239 | ```
240 | $ yterm --help
241 | (略)
242 | ```
243 |
244 | コマンドが実行できない場合は `%GOPATH%\bin` を PATH を通してから再度実施してください。
245 |
246 | ```
247 | # GOPATH を確認する
248 | $ go env GOPATH
249 | C:\Users\tinygo\dev
250 |
251 | $ set PATH=%PATH%;C:\Users\tinygo\dev
252 | ```
253 |
254 | ## macOS
255 |
256 | ### Git
257 |
258 | macOS の人はもしインストールされていない場合は以下でインストールしてください。
259 |
260 | * `brew install git`
261 | * https://qiita.com/suke_masa/items/4bed855628f7414293f8
262 |
263 | ```
264 | $ git version
265 | git version 2.33.1
266 | ```
267 |
268 | ### Go
269 |
270 | 以下からダウンロードしてインストールしてください。
271 |
272 | * https://golang.org/dl/
273 | * intel chip : https://golang.org/dl/go1.17.3.darwin-amd64.pkg
274 | * apple m1 chip : https://golang.org/dl/go1.17.3.darwin-arm64.pkg
275 |
276 | ```
277 | $ go version
278 | go version go1.17.3
279 | ```
280 |
281 | ### TinyGo
282 |
283 | 以下をダウンロードして生成される `tinygo` フォルダを `~/tinygo` に解凍/コピーしてください。最終的に `~/tinygo/bin/tinygo` に `tinygo` の実行体が存在すればよいです。
284 |
285 | * https://tinygo.org/getting-started/install/macos/
286 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.darwin-amd64.tar.gz
287 |
288 | 環境変数 PATH を通しておきます。
289 |
290 | ```
291 | $ export PATH=~/tinygo/bin:$PATH
292 | ```
293 |
294 | インストールしたら、以下を実行してインストールできていることを確認してください。
295 |
296 | ```
297 | $ tinygo version
298 | tinygo version 0.21.0 darwin/amd64 (using go version go1.17 and LLVM version 11.0.0)
299 | ```
300 |
301 | ### yterm
302 |
303 | 以下を実行してください。
304 | Windows / macOS / Linux のそれぞれで実行可能です。
305 |
306 | ```
307 | $ go install github.com/sago35/yterm@latest
308 | ```
309 |
310 | インストールしたら、以下を実行してインストールできていることを確認してください。
311 |
312 | ```
313 | $ yterm --help
314 | (略)
315 | ```
316 |
317 | コマンドが実行できない場合は `%GOPATH%\bin` を PATH を通してから再度実施してください。
318 |
319 | ```
320 | $ export PATH=$PATH:`go env GOPATH`/bin
321 | ```
322 |
323 | ## Linux
324 |
325 | ### Git
326 |
327 | 以下でインストールしてください。
328 |
329 | * `sudo apt install git`
330 |
331 | Git をインストールしたら、以下を実行してインストールできていることを確認してください。
332 |
333 | ```
334 | $ git version
335 | git version 2.33.1
336 | ```
337 |
338 | ### Go
339 |
340 | 以下からダウンロードしてインストールしてください。
341 |
342 | * https://golang.org/dl/
343 | * https://golang.org/dl/go1.17.3.linux-amd64.tar.gz
344 |
345 | インストール方法は以下に記載されています。
346 |
347 | * https://golang.org/doc/install
348 |
349 | Go をインストールしたら、以下を実行してインストールできていることを確認してください。
350 |
351 | ```
352 | $ go version
353 | go version go1.17.3
354 | ```
355 |
356 | ### TinyGo
357 |
358 | 以下をダウンロードして、後述の dpkg でインストールしてください。
359 |
360 | * https://tinygo.org/getting-started/install/linux/
361 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo_0.21.0_amd64.deb
362 |
363 | ```
364 | $ sudo dpkg -i tinygo_0.21.0_amd64.deb
365 | ```
366 |
367 | 環境変数 PATH を通しておきます。
368 |
369 | ```
370 | $ export PATH=$PATH:/usr/local/tinygo/bin
371 | ```
372 |
373 | インストールしたら、以下を実行してインストールできていることを確認してください。
374 |
375 | ```
376 | $ tinygo version
377 | tinygo version 0.21.0 linux/amd64 (using go version go1.17 and LLVM version 11.0.0)
378 | ```
379 |
380 | ### yterm
381 |
382 | 以下を実行してください。
383 | Windows / macOS / Linux のそれぞれで実行可能です。
384 |
385 | ```
386 | $ go install github.com/sago35/yterm@latest
387 | ```
388 |
389 | インストールしたら、以下を実行してインストールできていることを確認してください。
390 |
391 | ```
392 | $ yterm --help
393 | (略)
394 | ```
395 |
396 | コマンドが実行できない場合は `%GOPATH%\bin` を PATH を通してから再度実施してください。
397 |
398 | ```
399 | $ export PATH=$PATH:`go env GOPATH`/bin
400 | ```
401 |
402 | ## TinyGo のインストール確認1 (build)
403 |
404 | 以下のコマンドで、正常にビルドが出来ることを確認してください。以下のように何らかの情報が表示されれば、 TinyGo のインストールは正常にできていて、少なくとも Wio Terminal の開発は可能となります。他のボード/マイコンについては別途追加インストールが必要になる場合があります。
405 |
406 | ```
407 | $ tinygo build -o blinky.uf2 --target wioterminal --size short examples/blinky1
408 | code data bss | flash ram
409 | 7556 36 6336 | 7592 6372
410 | ```
411 |
412 | ## TinyGo のインストール確認2 (手動でのマイコン書き換え)
413 |
414 | 上記で `blinky.uf2` を作った場合は以下の方法で書き込むことができます。
415 | docker を使っている場合は、このやり方がシンプルな書き込み方法になります。
416 |
417 | * ブートローダーに遷移させる
418 | * 素早くリセットを 2 回実行します (参考: [Wio TerminalのUSB書き込みエラーの回復方法](https://qiita.com/carcon999/items/ec8045adc1309b2e5361))
419 | * うまく遷移出来た場合、下記画像の青色 LED がやさしく光ります
420 | * また、この時 OS からはマスストレージデバイスとして認識されます
421 | * マスストレージデバイスとして OS から認識されるので、 uf2 をルートドライブにコピーする
422 | * Windows の場合は例えば `cmd.exe` から `copy blinky.uf2 D:` 等で書き込みできます
423 |
424 | 書き込みが完了したら、 USB 端子付近の青色 LED が 1 秒周期で点滅します。この時マスストレージデバイスのマウントが解除されますが、正常な動作です。
425 |
426 | 
427 |
428 | > tips: マスストレージデバイスとして認識されない場合
429 | > セキュリティソフト/ポリシーなどによりマスストレージデバイス (※) のマウントを禁止している場合があります。この場合はハンズオンを継続することができません。
430 | > ※ USB フラッシュメモリ等
431 |
432 | ## TinyGo のインストール確認3 (tinygo flash による書き換え)
433 |
434 | 以下のコマンドを実行することで、ビルドしつつ書き換えすることができます。基本的にはこのやり方を使って開発のサイクルを回していきます。書き換えに成功したことが分かるように、先ほどとは違うものを書き込んでみましょう。
435 |
436 | ```
437 | $ tinygo flash --target wioterminal --size short examples/button
438 | code data bss | flash ram
439 | 7584 36 6336 | 7620 6372
440 | ```
441 |
442 | `examples/button` は、 `machine.BUTTON` (別名: `machine.WIO_KEY_A`) が押された時だけ LED を点灯します。
443 | `WIO_KEY_A` は Wio Terminal の上部に 3 つあるボタンの一番右 (内側) のボタンです。
444 |
445 | > tips: examples の場所
446 | > TinyGo をインストールした場所の `src/examples` 以下に色々な例があります。> もしくは、 [github.com/tinygo-org/tinygo/tree/release/src/examples](https://github.com/tinygo-org/tinygo/tree/release/src/examples) からもダウンロードできます。 すべてが Wio Terminal で実行できるわけではないことに注意が必要です。 Wio Terminal で動く形でまとめたものは以下にありますので適宜参照してください
447 | >
448 | > * [Wio Terminal の周辺デバイスを使用する](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#wio-terminal-%E3%81%AE%E5%91%A8%E8%BE%BA%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)
449 |
450 | ### tinygo flash が失敗する場合
451 |
452 | panic してしまうような実行体をマイコンに書き込んだ場合などは、 tinygo flash が失敗します。
453 | この場合は、手動でブートローダーモードに入れてから `tinygo flash` を使ってください。
454 |
455 | 参考: [COM ポートが見つからない場合](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#com-%E3%83%9D%E3%83%BC%E3%83%88%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88)
456 |
457 |
458 | # L チカから始める開発の進め方
459 |
460 | `hello world` の組込み版といえば `L チカ` といって LED を点滅させるプログラムになります。
461 | ここでは、 `L チカ` を動作させてから、少しずつコードを改造していきます。
462 |
463 | > Tips:
464 | > TinyGo ではターゲットボード (`-target` オプションで指定するもの) 毎の差異を `machine` パッケージである程度吸収しています。ボード上に LED が存在する場合は、ほとんどの場合 `machine.LED` という名前で定義されています。
465 | > 例えば wioterminal の定義は以下にあります。
466 | >
467 | > * https://github.com/tinygo-org/tinygo/blob/release/src/machine/board_wioterminal.go
468 |
469 | ## プロジェクトを開始する
470 |
471 | 新しい場所に workshop という名前のフォルダを作成してください。
472 | その後 `go mod init` を実行してください。
473 |
474 | ```
475 | $ cd (任意の場所)
476 |
477 | $ mkdir workshop
478 |
479 | $ cd workshop
480 |
481 | $ go mod init workshop
482 | ```
483 |
484 | その後、 `./01_blinky` というフォルダを作り `./01_blinky/main.go` というファイルを以下の内容で作成してください。
485 |
486 | [./01_blinky/main.go](https://github.com/sago35/tinygo-workshop/blob/29c966607ddade5711ad5813595e0e57f68d679f/01_blinky/main.go)
487 | ```go:./01_blinky/main.go
488 | package main
489 |
490 | import (
491 | "machine"
492 | "time"
493 | )
494 |
495 | func main() {
496 | //led := machine.LED
497 | led := machine.LCD_BACKLIGHT
498 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
499 | for {
500 | led.Low()
501 | time.Sleep(time.Millisecond * 500)
502 |
503 | led.High()
504 | time.Sleep(time.Millisecond * 500)
505 | }
506 | }
507 | ```
508 |
509 | 以下で書き込むことができます。
510 | `examples/blinky1` とは異なり液晶全体を LED として点滅させるコードになっています。
511 |
512 | ```
513 | $ tinygo flash --target wioterminal --size short ./01_blinky/
514 | code data bss | flash ram
515 | 7556 36 6336 | 7592 6372
516 |
517 | ```
518 |
519 | うまく書き込みが出来たら、上記ソース内の `led` の定義を `machine.LCD_BACKLIGHT` から `machine.LED` に切り替えてみたり、 `time.Sleep` の待ち時間を変更して周期を変えてみましょう。
520 | ソース変更 → `tinygo flash` → 確認というのが、基本的な開発サイクルになります。
521 |
522 | > tips: tinygo flash や tinygo build 時の package 指定方法
523 | > go build と同じで、現在フォルダの package を build / flash する場合は省略もしくは `.` で指定できます。例えば一つフォルダが深い場合は `./01_blinky` のような指定が必要ですが、同じ階層であれば `.` と書くか省略することができます。単一ファイルから構成されるソースをビルドする場合は、 `./01_blinky/main.go` のような指定もできます
524 |
525 | ## LSP / gopls 対応
526 |
527 | TinyGo は、 machine package などを GOROOT に配置しているため設定を行うまでは gopls 等でエラーが表示され machine.LED の定義元へのジャンプ等が出来ません。 TinyGo は machine package など (Go を良く知っていても) 慣れていない package 構成であったり、 build-tag による分岐などが多いため LSP の設定をしておいた方が無難です。
528 |
529 | 
530 |
531 | 公式ドキュメントは以下にあります。
532 |
533 | * https://tinygo.org/docs/guides/ide-integration/
534 |
535 | VSCode の場合は `TinyGo` という拡張をインストールすると良いです。
536 | Vim (+ vim-lsp) の場合は github.com/sago35/tinygo.vim を使ってみてください。
537 |
538 | 日本語の情報としては以下に記載しています。
539 |
540 | * [TinyGo + 'VSCode or Vim (もしくはそれ以外の LSP 対応エディタ)' で gopls 連携する方法](https://qiita.com/sago35/items/c30cbce4a0a3e12d899c)
541 | * [TinyGo + Vim で gopls するための設定](https://qiita.com/sago35/items/f0b058ed5c32b6446834)
542 |
543 | ## 基本的な printf debug の方法
544 |
545 | デバッグ方法が分からないと次のステップに進みにくいです。
546 | 組込み環境のデバッグ方法にもいろいろありますが、ここでは `printf debug` を用いた方法を学びます。
547 |
548 | > tips: メリットデメリット
549 | > このやり方は外部にデバッグ用のハードが不要なのが良いところです。一方で、 panic してしまうようなソースコードに対しては確認が困難です。そのような場合は Wio Terminal の外側に専用のデバッガを追加する形で対応しますが、ここでは扱いません。
550 |
551 | ### println と fmt.Print
552 |
553 | TinyGo では `println` や `fmt.Print` 等で出力される先は USB-CDC or UART となっていて、 Wio Terminal は USB-CDC を使うように初期設定されています。シリアル通信ソフトを用いてマイコンからの出力を PC で受け取ったり、 PC からの出力をマイコンで受け取ったりすることができます。
554 | ここでは、 `printf debug` に必要なマイコン側から PC に出力するためのソースコードを紹介します。
555 | 先ほどのコードに `cnt` 変数を追加しつつ `fmt.Printf()` で値を確認してみましょう。
556 | ※追加した行には、 `// ← 追加` というコメントを記載しています
557 |
558 | [./01_blinky/main.go](https://github.com/sago35/tinygo-workshop/blob/00ee52475c538857d48e0d6e918265585032946d/01_blinky/main.go)
559 | ```go:./01_blinky/main.go
560 | package main
561 |
562 | import (
563 | "fmt" // ← 追加
564 | "machine"
565 | "time"
566 | )
567 |
568 | func main() {
569 | //led := machine.LED
570 | led := machine.LCD_BACKLIGHT
571 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
572 | cnt := 0 // ← 追加
573 | for {
574 | cnt++ // ← 追加
575 | fmt.Printf("cnt %d\r\n", cnt) // ← 追加
576 | led.Low()
577 | time.Sleep(time.Millisecond * 500)
578 |
579 | led.High()
580 | time.Sleep(time.Millisecond * 500)
581 | }
582 | }
583 | ```
584 |
585 | > tips: シリアル通信の改行コード
586 | > シリアル通信は基本的には LF でもよいですが CRLF にしたほうが無難です。 `println()` で CRLF にする場合は面倒ですが `println("hello", "\r")` のようにすることができます。
587 |
588 | シリアルポートを開くと以下のように 1 秒毎に 1 行表示されると思います。例えば wioterminal に接続する場合は以下のように実行します。もし、うまく接続できない場合は後述のポート名を指定するやり方を試してください。シリアルポートのモニターが不要となった時は、 Ctrl-C で閉じてください。
589 |
590 | ```
591 | $ yterm --target wioterminal
592 | ...
593 | cnt : 6
594 | cnt : 7
595 | cnt : 8
596 | cnt : 9
597 | cnt : 10
598 | ...
599 | ```
600 |
601 | うまくいかない場合は、シリアルポートとして認識されているか、マイコンは動いているか、を確認してください。マイコンが動いているかどうかは、例えば LED 点灯状態により確認できます。上記のソースコードのように `L チカ` のようなコードを埋め込むと良いです。
602 |
603 |
604 | > tips: TinyGo の main() 関数は終了しないようにする
605 | > main() 関数を抜けた場合、プログラムは完全に停止します。この状態では `tinygo flash` に失敗するなどあまり良くない状態となります。なので、基本的には `for { time.Sleep(time.Hour) }` などで `main()` 関数を抜けないようにするのが TinyGo 流となります。
606 |
607 | ### ポートを指定して yterm で接続する
608 |
609 | Wio Terminal が複数接続されている場合等はポートを指定して yterm に接続する必要があるかもしれません。まずはポート名を調べるために、 `yterm list` を実行します。
610 |
611 | ```
612 | $ yterm list
613 | COM8 2886 002D wioterminal
614 | ```
615 |
616 | 上記の場合は COM8 に wioterminal が存在するため以下を実行します。
617 |
618 | ```
619 | $ yterm --port COM8
620 | ```
621 |
622 | Windows の場合は `COM8` のような名前ですが他の OS では `/dev/cu.usb1` や `/dev/ttyACM1` のような名前でポートを指定できます。
623 |
624 | > tips: なぜ yterm を使うか
625 | > Windows だと、ポートを開放しないとマイコン書き換え (`tinygo flash`) に失敗するため、説明することが増えるし、 OS 毎の説明を書くと複雑になるため。慣れている人は好きなソフトを使ってください。
626 |
627 | ### Windows OS での注意点
628 |
629 | Windows では何らかのソフトがシリアルポートを開いている時は、他のソフトはアクセスできません。
630 | yterm や Tera Term 等で接続しているときに `tinygo flash` しようとすると以下のようなエラーとなります。
631 | 通信ソフトを閉じるか、ブートローダーに遷移させてください。
632 |
633 | ```
634 | $ tinygo flash --target wioterminal --size short ./01_blinky/
635 | code data bss | flash ram
636 | 46096 1384 6336 | 47480 7720
637 | error: failed to reset port %TEMP%\tinygo914402091\main.uf2: opening port: Serial port busy
638 | ```
639 |
640 | ## 外部 package を使用する1 (例を実行する)
641 |
642 | Go と基本的には同じで `import` に外部 package を追加した上で `go get` が必要になります。ここでは `tinygo.org/x/drivers/examples/ili9341/pyportal_boing` を動かす過程で `go get` を使います。以下を実行すると `go get` を促されます。
643 |
644 | ```
645 | $ tinygo flash --target wioterminal --size short tinygo.org/x/drivers/examples/ili9341/pyportal_boing
646 | no required module provides package tinygo.org/x/drivers/examples/ili9341/pyportal_boing; to add it:
647 | go get tinygo.org/x/drivers/examples/ili9341/pyportal_boing
648 | ```
649 |
650 | しかし、指示通りに `go get` してもうまく行く場合もありますが、失敗する場合もあります。
651 | 失敗時はエラーメッセージが表示の通り TinyGo のみに存在する標準 package を見つけることができずエラーになります。
652 |
653 | ```
654 | $ go get tinygo.org/x/drivers/examples/ili9341/pyportal_boing
655 | go: downloading tinygo.org/x/drivers v0.18.0
656 | tinygo.org/x/drivers/examples/ili9341/pyportal_boing imports
657 | tinygo.org/x/drivers/ili9341 imports
658 | machine: package machine is not in GOROOT (c:\go\src\machine)
659 | ```
660 |
661 | この場合は以下のように実施してください。
662 |
663 | ```
664 | $ go get tinygo.org/x/drivers
665 | go get: added tinygo.org/x/drivers v0.18.0
666 | ```
667 |
668 | これで実行できるようになりました。
669 |
670 | ```
671 | $ tinygo flash --target wioterminal --size short tinygo.org/x/drivers/examples/ili9341/pyportal_boing
672 | code data bss | flash ram
673 | 29964 36 37504 | 30000 37540
674 | ```
675 |
676 | この状態で `tinygo.org/x/drivers` への依存が `go.mod` に書き込まれているため、 `tinygo.org/x/drivers` 以下の package を使用することが出来るようになります。
677 |
678 | ```:go.mod
679 | module workshop
680 |
681 | go 1.17
682 |
683 | require tinygo.org/x/drivers v0.18.0 // indirect
684 | ```
685 |
686 | pyportal_boing のソースコードは以下にあります。
687 |
688 | * https://github.com/tinygo-org/drivers/tree/release/examples/ili9341/pyportal_boing
689 |
690 | ## 外部パッケージを使用する2 (ブザーを鳴らす)
691 |
692 | Wio Terminal にはブザーが搭載されています。
693 | 搭載されているブザーは High / Low の周期で音を制御することができます。
694 | 例えば周期として 440Hz で High / Low を変化させることで[ラの音 (A4)](https://ja.wikipedia.org/wiki/A440) を鳴らすことができます。
695 |
696 | 
697 |
698 | > tips: 回路図を確認する
699 | > 組込みにおいて各種センサー等がどこにどのように繋がっているかを確認しておく必要があります。 Wio Terminal の場合は以下にまとまっているので確認しておくと良いです。上記の図は、下記 pdf からの抜粋になります。
700 | > https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/
701 | > https://files.seeedstudio.com/wiki/Wio-Terminal/res/Wio-Terminal-SCH-v1.2.pdf
702 |
703 | ブザーは tinygo.org/x/drivers/buzzer を使って動作させることができます。
704 | 上記で `go get tinygo.org/x/drivers` を実行している場合はそのまま動きます。
705 | `tinygo.org/x/drivers/buzzer` は現状 time.Sleep() を用いた周波数制御であまり精度が良くないため綺麗な音は鳴らないのですが、 main.go を以下のように書き換えることで最低限の動作をさせることができます。
706 | 変更箇所は `// ↓ 追加` と `// ↑ 追加` の間、もしくは `// ← 追加` が書かれた行となります。
707 |
708 | [./01_blinky/main.go](./01_blinky/main.go)
709 | ```go:./01_blinky/main.go
710 | package main
711 |
712 | import (
713 | "fmt"
714 | "machine"
715 | "time"
716 |
717 | "tinygo.org/x/drivers/buzzer" // ← 追加
718 | )
719 |
720 | // ↓ 追加
721 | type note struct {
722 | tone float64
723 | duration float64
724 | }
725 | // ↑ 追加
726 |
727 | func main() {
728 | //led := machine.LED
729 | led := machine.LCD_BACKLIGHT
730 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
731 | cnt := 0
732 |
733 | // ↓ 追加
734 | bzrPin := machine.WIO_BUZZER
735 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
736 | bzr := buzzer.New(bzrPin)
737 |
738 | notes := []note{
739 | {buzzer.C3, buzzer.Quarter},
740 | {buzzer.D3, buzzer.Quarter},
741 | {buzzer.E3, buzzer.Quarter},
742 | }
743 | // ↑ 追加
744 |
745 | for {
746 | cnt++
747 | fmt.Printf("cnt %d\r\n", cnt)
748 | led.Low()
749 | time.Sleep(time.Millisecond * 500)
750 |
751 | led.High()
752 | time.Sleep(time.Millisecond * 500)
753 |
754 | // ↓ 追加
755 | for _, n := range notes {
756 | bzr.Tone(n.tone, n.duration)
757 | time.Sleep(10 * time.Millisecond)
758 | }
759 | // ↑ 追加
760 | }
761 | }
762 | ```
763 |
764 | ## 外部パッケージを使用する3 (ブザーを PWM で鳴らす)
765 |
766 | (2022/05/23 追記しました)
767 |
768 | tinygo.org/x/drivers/tone を使うと PWM でブザーを鳴らすことができます。
769 | Wio Terminal は `machine.WIO_BUZZER` ピンを `machine.TCC0` として使う事で音を鳴らすことができます。
770 |
771 | ```go
772 | bzrPin := machine.WIO_BUZZER
773 | pwm := machine.TCC0
774 | speaker, err := tone.New(pwm, bzrPin)
775 | speaker.SetNote(tone.C6)
776 | ```
777 |
778 | コードは以下にあります。
779 |
780 | https://github.com/sago35/tinygo-examples/blob/main/wioterminal/buzzer/main.go
781 |
782 | # ハンズオン
783 |
784 | 残りの時間で以下を実行してみましょう。すべてを実行するには時間が足りないと思うので、好きなものからチャレンジしてみてください。
785 |
786 | `USB-CDC 送受信` と `SPI / ILI9341 ディスプレイ` と `SPI / ILI9341 ディスプレイ 2` あたりを実行すると楽しみやすいと思います。
787 |
788 | 困った時は以下の記事も参考になると思います。
789 |
790 | * [Wio Terminal の周辺デバイスを使用する](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#wio-terminal-%E3%81%AE%E5%91%A8%E8%BE%BA%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)
791 |
792 | ## GPIO
793 |
794 | 
795 |
796 |
797 | GPIO は machine.Pin を入力 (machine.PinInput 等) に設定することで入力端子として使用することができます。あるいは既に登場している LED のように machine.PinOutput に設定することで出力端子として使用することができます。実際には以下のようなコードになります。
798 |
799 | ```go
800 | // ボタン A (WIO_KEY_A) を入力モードで初期化
801 | machine.WIO_KEY_A.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
802 |
803 | // 現在の状態 (High / Low) を取得
804 | status := machine.WIO_KEY_A.Get()
805 | ```
806 |
807 | ```go
808 | // 液晶 (LCD_BACKLIGHT) を出力モードで初期化
809 | machine.LCD_BACKLIGHT.Configure(machine.PinConfig{Mode: machine.PinOutput})
810 |
811 | // 出力を変化させる
812 | machine.LCD_BACKLIGHT.High()
813 | machine.LCD_BACKLIGHT.Low()
814 | machine.LCD_BACKLIGHT.Toggle()
815 | ```
816 |
817 | * https://tinygo.org/docs/reference/microcontrollers/machine/wioterminal/#type-pin
818 | * https://github.com/tinygo-org/tinygo/blob/v0.21.0/src/machine/machine_atsamd51.go#L23-L48
819 |
820 | ここでは、 Wio Terminal に存在する以下のボタン/キーに対応するアプリケーションを作成します。
821 |
822 | * `WIO_KEY_A` ~ `WIO_KEY_B` が押されたら液晶を On にしつつシリアルにボタン名を出力
823 | * 十字キーの上下左右 (`WIO_5S_*`) が押されたら液晶を On にしつつシリアルにキー名を出力
824 | * 十字キー自身が押された (`WIO_5S_PRESS`) ら液晶を On にしつつシリアルにキー名を出力
825 |
826 | [./02_gpio/main.go](./02_gpio/main.go)
827 | ```go:./02_gpio/main.go
828 | package main
829 |
830 | import (
831 | "fmt"
832 | "machine"
833 | "time"
834 | )
835 |
836 | const (
837 | led = machine.LCD_BACKLIGHT
838 | )
839 |
840 | func main() {
841 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
842 |
843 | machine.WIO_KEY_A.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
844 | machine.WIO_KEY_B.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
845 | machine.WIO_KEY_C.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
846 |
847 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
848 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
849 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
850 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
851 | machine.WIO_5S_PRESS.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
852 |
853 | for {
854 | if !machine.WIO_KEY_A.Get() {
855 | led.Low()
856 | fmt.Printf("machine.WIO_KEY_A pressed\r\n")
857 | } else if !machine.WIO_KEY_B.Get() {
858 | led.Low()
859 | fmt.Printf("machine.WIO_KEY_B pressed\r\n")
860 | } else if !machine.WIO_KEY_C.Get() {
861 | led.Low()
862 | fmt.Printf("machine.WIO_KEY_C pressed\r\n")
863 | } else if !machine.WIO_5S_UP.Get() {
864 | led.Low()
865 | fmt.Printf("machine.WIO_5S_UP pressed\r\n")
866 | } else if !machine.WIO_5S_LEFT.Get() {
867 | led.Low()
868 | fmt.Printf("machine.WIO_5S_LEFT pressed\r\n")
869 | } else if !machine.WIO_5S_RIGHT.Get() {
870 | led.Low()
871 | fmt.Printf("machine.WIO_5S_RIGHT pressed\r\n")
872 | } else if !machine.WIO_5S_DOWN.Get() {
873 | led.Low()
874 | fmt.Printf("machine.WIO_5S_DOWN pressed\r\n")
875 | } else if !machine.WIO_5S_PRESS.Get() {
876 | led.Low()
877 | fmt.Printf("machine.WIO_5S_PRESS pressed\r\n")
878 | } else {
879 | led.High()
880 | }
881 |
882 | time.Sleep(time.Millisecond * 10)
883 | }
884 | }
885 | ```
886 |
887 | > tips: ボタンが押されている時の電圧は回路によって決まる
888 | > ボタンを押している時に High で離した時に Low になる場合と、その逆になる場合の両方のパターンがあります。これは回路によって決まります。 Wio Terminal はすべてのボタンが Pull-Up されていて離している時は High になっています。
889 |
890 | ## USB-CDC 送受信
891 |
892 | 上記の printf debug にて USB-CDC 経由で Wio Terminal からのデータを PC で受け取ることが出来ました。ここでは PC から Wio Terminal にデータを送って操作してみましょう。
893 |
894 | 題材は以下とします。
895 |
896 | * 仕様
897 | * シリアルから `on\n` と入力すると液晶を ON にする
898 | * シリアルから `off\n` と入力すると液晶を OFF にする
899 | * シリアルから `toggle\n` もしくは `t\n` と入力すると液晶の ON と OFF を切り返る
900 |
901 | `println` や `fmt.Printf` を実行した場合、 Go だと `os.Stdout` に出力されますが、 TinyGo の場合は `machine.Serial` に出力されます。Wio Terminal の `machine.Serial` のデフォルト値は `*machine.USBCDC` 型なので USBCDC への出力となります。
902 | では入力はどうすればよいか。 `*machine.USBCDC` が `io.Reader` インターフェースを持つため普通に読み書きそうなのですが goroutine スイッチの兼ね合いにより TinyGo 0.21.0 時点では bufio.Scanner 等ではうまく動かないので以下のように書く必要があります。
903 |
904 | 下記は `usbcdc.Buffered()` で Wio Terminal が受信したデータがあるかどうかを調べ、データがある場合のみ `usbcdc.ReadByte()` しています。このように書くことで、単に echo するだけのサーバーが出来上がります。
905 |
906 | [./03_usbcdc/main.go](https://github.com/sago35/tinygo-workshop/blob/efb627c1b927d6d81948347bb239e3a806510015/03_usbcdc/main.go)
907 | ```go:./03_usbcdc/main.go
908 | package main
909 |
910 | import (
911 | "machine"
912 | )
913 |
914 | func main() {
915 | usbcdc := machine.Serial
916 |
917 | for {
918 | if usbcdc.Buffered() > 0 {
919 | data, _ := usbcdc.ReadByte()
920 |
921 | // just echo the character
922 | usbcdc.WriteByte(data)
923 | }
924 | }
925 | }
926 | ```
927 |
928 | あとは USBCDC 経由で `on\r\n` もしくは `on\n` と入力された場合等に所定のコマンド等を実行するようにします。改行文字が入力されるまでは buffer していくようにするとうまく処理できます。
929 |
930 | 完成形は以下になります。
931 |
932 | [./03_usbcdc/main.go](./03_usbcdc/main.go)
933 | ```go:./03_usbcdc/main.go
934 | package main
935 |
936 | import (
937 | "machine"
938 | "time"
939 | )
940 |
941 | func main() {
942 | led := machine.LCD_BACKLIGHT
943 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
944 | led.High()
945 |
946 | usbcdc := machine.Serial
947 | usbcdc.Configure(machine.UARTConfig{})
948 |
949 | input := make([]byte, 64)
950 | i := 0
951 | for {
952 | if usbcdc.Buffered() > 0 {
953 | data, _ := usbcdc.ReadByte()
954 |
955 | switch data {
956 | case 13:
957 | // return key
958 | usbcdc.Write([]byte("\r\n"))
959 |
960 | switch string(input[:i]) {
961 | case "on":
962 | led.High()
963 | case "off":
964 | led.Low()
965 | case "toggle", "t":
966 | led.Toggle()
967 | }
968 | i = 0
969 | default:
970 | // just echo the character
971 | usbcdc.WriteByte(data)
972 | input[i] = data
973 | i++
974 | }
975 | }
976 | time.Sleep(10 * time.Millisecond)
977 | }
978 | }
979 | ```
980 |
981 | ## タイマー割込み
982 |
983 | TinyGo では `time.Sleep()` や `time.Tick()` を用いてある程度の精度での周期処理等を実現できます。が、正確に刻みたい場合は systick を使うと良いです。以下は examples/systick と同じです。使うときは channel と組み合わせると良いです。
984 |
985 | * https://github.com/tinygo-org/tinygo/blob/release/src/examples/systick/systick.go
986 |
987 | [./04_systick/main.go](./04_systick/main.go)
988 | ```go:./04_systick/main.go
989 | package main
990 |
991 | import (
992 | "device/arm"
993 | "machine"
994 | )
995 |
996 | var timerCh = make(chan struct{}, 1)
997 |
998 | func main() {
999 | //led := machine.LED
1000 | led := machine.LCD_BACKLIGHT
1001 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
1002 |
1003 | // timer fires 10 times per second
1004 | arm.SetupSystemTimer(machine.CPUFrequency() / 10)
1005 |
1006 | for {
1007 | led.Low()
1008 | <-timerCh
1009 | led.High()
1010 | <-timerCh
1011 | }
1012 | }
1013 |
1014 | //export SysTick_Handler
1015 | func timer_isr() {
1016 | select {
1017 | case timerCh <- struct{}{}:
1018 | default:
1019 | // The consumer is running behind.
1020 | }
1021 | }
1022 | ```
1023 |
1024 | ## PWM / ブザー
1025 |
1026 | 
1027 |
1028 | ここでは、 buzzer package を使ってドレミの歌を作ってみましょう。以下の buzzer package を使って音の高さと長さを処理することができます。
1029 |
1030 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/buzzer
1031 |
1032 | 完成版 (と言っても最初のフレーズのみですが) は以下。
1033 |
1034 | [./05_buzzer/main.go](./05_buzzer/main.go)
1035 | ```go:./05_buzzer/main.go
1036 | package main
1037 |
1038 | import (
1039 | "machine"
1040 | "time"
1041 |
1042 | "tinygo.org/x/drivers/buzzer"
1043 | )
1044 |
1045 | type note struct {
1046 | tone float64
1047 | duration float64
1048 | }
1049 |
1050 | func main() {
1051 | bzrPin := machine.WIO_BUZZER
1052 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
1053 | bzr := buzzer.New(bzrPin)
1054 |
1055 | notes := []note{
1056 | {buzzer.C3, buzzer.Quarter},
1057 | {buzzer.Rest, buzzer.Eighth},
1058 | {buzzer.D3, buzzer.Eighth},
1059 | {buzzer.E3, buzzer.Quarter},
1060 | {buzzer.Rest, buzzer.Eighth},
1061 | {buzzer.C3, buzzer.Eighth},
1062 | {buzzer.E3, buzzer.Quarter},
1063 | {buzzer.C3, buzzer.Quarter},
1064 | {buzzer.E3, buzzer.Half},
1065 | }
1066 |
1067 | for _, n := range notes {
1068 | bzr.Tone(n.tone, n.duration)
1069 | time.Sleep(10 * time.Millisecond)
1070 | }
1071 |
1072 | for {
1073 | time.Sleep(time.Hour)
1074 | }
1075 | }
1076 | ```
1077 |
1078 | > tips: buzzer の音が綺麗に鳴らない
1079 | > 綺麗な音を鳴らすには buzzer に対してある程度正確に ON / OFF 信号を与える必要があります。現時点の buzzer package はソフトウェアで時間を計算しているためあまり正確ではありません。いずれこの部分はハードウェア PWM 機能を使うことで改善していくはずです。
1080 |
1081 | 追記) tinygo.org/x/drivers/tone を使うことで PWM 制御となり綺麗な音が鳴るようになります
1082 |
1083 | ## ADC / 光センサー
1084 |
1085 | 
1086 |
1087 | Wio Terminal には本体背面の透明窓の中に光センサーが搭載されています。この光センサーは光の強さを電圧に変換する動きであるため、 Wio Terminal からは電圧を読むと光の強さを知ることができます。光が強い時は 0xFFFF に近い値となり、光が弱いときは 0x0000 に近い値となります。光センサーは `machine.WIO_LIGHT` という名前でアクセスできます。
1088 |
1089 | AD 値の読み取りを行う場合は、以下のように設定した上で使う必要があります。 TinyGo の ADC 初期設定は 12bit ADC で、左寄せとなっているため 0x0000 ~ 0xFFF0 の値を取ります。
1090 |
1091 | ```go
1092 | // machine.ADC 型の変数を作り、 Configure() をコールする
1093 | sensor := machine.ADC{Pin: machine.WIO_LIGHT}
1094 | sensor.Configure(machine.ADCConfig{})
1095 |
1096 | // AD 値を読み取る
1097 | val := sensor.Get()
1098 | ```
1099 |
1100 | ここでは、光の強さに対応する電圧値 (0x0000 - 0xFFFF) をシリアルに出力しつつ、 0x8000 以上であれば led (液晶画面) を ON にするプログラムを作成します。
1101 |
1102 | ADC については以下に記載があります。
1103 |
1104 | * https://tinygo.org/docs/reference/microcontrollers/machine/wioterminal/#type-adc
1105 |
1106 | [./06_light_sensor/main.go](./06_light_sensor/main.go)
1107 | ```go:./06_light_sensor/main.go
1108 | package main
1109 |
1110 | import (
1111 | "fmt"
1112 | "machine"
1113 | "time"
1114 | )
1115 |
1116 | func main() {
1117 | machine.InitADC()
1118 |
1119 | led := machine.LCD_BACKLIGHT
1120 | led.Configure(machine.PinConfig{Mode: machine.PinOutput})
1121 |
1122 | sensor := machine.ADC{Pin: machine.WIO_LIGHT}
1123 | sensor.Configure(machine.ADCConfig{})
1124 |
1125 | for {
1126 | val := sensor.Get()
1127 | fmt.Printf("%04X\r\n", val)
1128 | if val < 0x8000 {
1129 | led.Low()
1130 | } else {
1131 | led.High()
1132 | }
1133 | time.Sleep(time.Millisecond * 100)
1134 | }
1135 | }
1136 | ```
1137 |
1138 | ## I2C / 加速度センサー
1139 |
1140 | 
1141 |
1142 | Wio Terminal には 3 軸加速度センサーである LIS3DH が搭載されています。 X / Y / Z 軸それぞれの加速度を読み取ることで傾き検知等が可能です。これは I2C 接続されているため、事前に I2C のセットアップが必要です。 I2C は回路図表記の `I2C0` ではなく `machine.I2C1` を使用します。
1143 |
1144 | ```go
1145 | machine.I2C1.Configure(machine.I2CConfig{SCL: machine.SCL1_PIN, SDA: machine.SDA1_PIN})
1146 | ```
1147 |
1148 | LIS3DH の driver は以下にあります。I2C で所定のコマンドを発行すると値を読み取ることが出来るため、とても簡単に使用することができます。
1149 |
1150 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/lis3dh
1151 |
1152 | [./07_lis3dh/main.go](./07_lis3dh/main.go)
1153 | ```go:./07_lis3dh/main.go
1154 | package main
1155 |
1156 | import (
1157 | "machine"
1158 | "time"
1159 |
1160 | "tinygo.org/x/drivers/lis3dh"
1161 | )
1162 |
1163 | var i2c = machine.I2C1
1164 |
1165 | func main() {
1166 | i2c.Configure(machine.I2CConfig{SCL: machine.SCL1_PIN, SDA: machine.SDA1_PIN})
1167 |
1168 | accel := lis3dh.New(i2c)
1169 | accel.Address = lis3dh.Address0 // address on the Wio Terminal
1170 | accel.Configure()
1171 | accel.SetRange(lis3dh.RANGE_2_G)
1172 |
1173 | println(accel.Connected())
1174 |
1175 | for {
1176 | x, y, z, _ := accel.ReadAcceleration()
1177 | println("X:", x, "Y:", y, "Z:", z)
1178 |
1179 | //rx, ry, rz := accel.ReadRawAcceleration()
1180 | //println("X (raw):", rx, "Y (raw):", ry, "Z (raw):", rz)
1181 |
1182 | time.Sleep(time.Millisecond * 100)
1183 | }
1184 | }
1185 | ```
1186 |
1187 |
1188 | ## SPI / ILI9341 ディスプレイ
1189 |
1190 | 
1191 |
1192 | 画面を使った処理はパソコン上のプログラムとは異なる感動があると思います。 Wio Terminal には SPI 接続の ili9341 ディスプレイが搭載されています。解像度は 320x240 です。
1193 |
1194 | 所定の初期化を実施した後は、比較的簡単に扱うことができます。ここでは単純な図形を表示してみます。初期化は以下のように行います。
1195 | `InitDisplay()` では ili9341 に接続されている SPI3 / LCD_SCK_PIN / LCD_SDO_PIN / LCD_SDI_PIN / LCD_BACKLIGHTの初期化を行い `*ili9341.Device` を返しています。以降は `*ili9341.Device` を用いて画面に描画していきます。
1196 |
1197 | ```go
1198 | func InitDisplay() *ili9341.Device {
1199 | machine.SPI3.Configure(machine.SPIConfig{
1200 | SCK: machine.LCD_SCK_PIN,
1201 | SDO: machine.LCD_SDO_PIN,
1202 | SDI: machine.LCD_SDI_PIN,
1203 | Frequency: 48000000,
1204 | })
1205 |
1206 | // configure backlight
1207 | backlight := machine.LCD_BACKLIGHT
1208 | backlight.Configure(machine.PinConfig{machine.PinOutput})
1209 |
1210 | display := ili9341.NewSPI(
1211 | machine.SPI3,
1212 | machine.LCD_DC,
1213 | machine.LCD_SS_PIN,
1214 | machine.LCD_RESET,
1215 | )
1216 |
1217 | // configure display
1218 | display.Configure(ili9341.Config{})
1219 |
1220 | backlight.High()
1221 |
1222 | display.SetRotation(ili9341.Rotation270)
1223 |
1224 | return display
1225 | }
1226 | ```
1227 |
1228 | `tinygo.org/x/drivers.Displayer` インターフェースは以下のように定義されていますので、基本的には `SetPixel()` で描画していくことになります。
1229 |
1230 | ```go
1231 | type Displayer interface {
1232 | // Size returns the current size of the display.
1233 | Size() (x, y int16)
1234 |
1235 | // SetPizel modifies the internal buffer.
1236 | SetPixel(x, y int16, c color.RGBA)
1237 |
1238 | // Display sends the buffer (if any) to the screen.
1239 | Display() error
1240 | }
1241 | ```
1242 |
1243 | しかし、 `SetPixel()` だけでは遅いし大変なので、多くの場合は `tinygo.org/x/tinydraw` や `tinygo.org/x/drivers/ili9341` の各種関数を用いて描画していきます。
1244 |
1245 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/ili9341
1246 | * https://pkg.go.dev/tinygo.org/x/tinydraw
1247 | * https://pkg.go.dev/tinygo.org/x/tinyfont
1248 |
1249 | ということで、 tinydraw と tinyfont を `go get` しておきましょう。
1250 |
1251 | ```
1252 | $ go get tinygo.org/x/tinydraw
1253 | go get: added tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c
1254 |
1255 | $ go get tinygo.org/x/tinyfont
1256 | ```
1257 |
1258 | ここでは以下のような画面を作っていきましょう。この画面は [基礎から学ぶ 組込みRust](https://www.c-r.com/book/detail/1403) で作成する題材の TinyGo 版になります。
1259 |
1260 | 
1261 |
1262 | 画面の構成要素は以下の通りです。
1263 |
1264 | * body : x=20 y=20 の位置から w=280 h=200 を白い四角で塗りつぶす (ili9341.Device.FillRectangle)
1265 | * lcd : x=25 y=25 の位置から w=270 h=160 を黒い四角で塗りつぶす (ili9341.Device.FillRectangle)
1266 | * speaker : x=40+i*15 y=190 の位置から w=5 h=20 を黒い四角で塗りつぶす (ili9341.Device.FillRectangle)
1267 | * buttons : x=40+i*60 y=40 の位置から w=40 h=5 を青い四角で塗りつぶす (ili9341.Device.FillRectangle)
1268 | * 5-way key : x=260 y=180 r=20 の青い円で塗りつぶす (tinydraw.FilledCircle)
1269 | * text : x=30 y=40 の位置にテキストを緑色で表示する (tinyfont.WriteLine)
1270 | * 中心に TinyGo のロゴ (60x51) を表示する (drivers.Displayer.SetPixel)
1271 |
1272 | 上記の画像は以下のようにして出力できます。なお、下記ソース内の `tinygo_logo_s_png` については、 png のデータから `const string` に変換したものを用意する必要があります。 以下の `graphics.go` を各自コピーして使ってください。
1273 |
1274 | * [./08_spi_ili9341](./08_spi_ili9341)
1275 |
1276 | [./08_spi_ili9341/main.go](./08_spi_ili9341/main.go)
1277 | ```go:./08_spi_ili9341/main.go
1278 | package main
1279 |
1280 | import (
1281 | "image/color"
1282 | "image/png"
1283 | "log"
1284 | "machine"
1285 | "strings"
1286 | "time"
1287 |
1288 | "tinygo.org/x/drivers/ili9341"
1289 | "tinygo.org/x/tinydraw"
1290 | "tinygo.org/x/tinyfont"
1291 | "tinygo.org/x/tinyfont/freemono"
1292 | )
1293 |
1294 | var (
1295 | white = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}
1296 | red = color.RGBA{R: 0xFF, G: 0x00, B: 0x00, A: 0xFF}
1297 | green = color.RGBA{R: 0x00, G: 0xFF, B: 0x00, A: 0xFF}
1298 | blue = color.RGBA{R: 0x00, G: 0x00, B: 0xFF, A: 0xFF}
1299 | black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF}
1300 | )
1301 |
1302 | func main() {
1303 | display := InitDisplay()
1304 |
1305 | // body
1306 | display.FillRectangle(20, 20, 280, 200, white)
1307 |
1308 | // lcd
1309 | display.FillRectangle(25, 25, 270, 160, black)
1310 |
1311 | // speaker
1312 | for i := int16(0); i < 4; i++ {
1313 | display.FillRectangle(40+i*15, 190, 5, 20, black)
1314 | }
1315 |
1316 | // buttons
1317 | for i := int16(0); i < 3; i++ {
1318 | display.FillRectangle(40+i*60, 15, 40, 5, blue)
1319 | }
1320 |
1321 | // 5-way key
1322 | tinydraw.FilledCircle(display, 260, 180, 20, blue)
1323 |
1324 | // text
1325 | tinyfont.WriteLine(display, &freemono.Regular9pt7b, 30, 40, "Booting Wio Terminal...", green)
1326 |
1327 | // tinygo logo
1328 | {
1329 | img, err := png.Decode(strings.NewReader(tinygo_logo_s_png))
1330 | if err != nil {
1331 | log.Fatal(err)
1332 | }
1333 |
1334 | w := img.Bounds().Dx()
1335 | h := img.Bounds().Dy()
1336 | for y := 0; y < h; y++ {
1337 | for x := 0; x < w; x++ {
1338 | r, g, b, _ := img.At(x, y).RGBA()
1339 | display.SetPixel((320-int16(w))/2+int16(x), (240-int16(h))/2+int16(y), color.RGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: 0xFF})
1340 | }
1341 | }
1342 | }
1343 |
1344 | for {
1345 | time.Sleep(time.Hour)
1346 | }
1347 | }
1348 |
1349 | func InitDisplay() *ili9341.Device {
1350 | machine.SPI3.Configure(machine.SPIConfig{
1351 | SCK: machine.LCD_SCK_PIN,
1352 | SDO: machine.LCD_SDO_PIN,
1353 | SDI: machine.LCD_SDI_PIN,
1354 | Frequency: 48000000,
1355 | })
1356 |
1357 | // configure backlight
1358 | backlight := machine.LCD_BACKLIGHT
1359 | backlight.Configure(machine.PinConfig{machine.PinOutput})
1360 |
1361 | display := ili9341.NewSPI(
1362 | machine.SPI3,
1363 | machine.LCD_DC,
1364 | machine.LCD_SS_PIN,
1365 | machine.LCD_RESET,
1366 | )
1367 |
1368 | // configure display
1369 | display.Configure(ili9341.Config{})
1370 |
1371 | backlight.High()
1372 |
1373 | display.SetRotation(ili9341.Rotation270)
1374 | display.FillScreen(color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF})
1375 |
1376 | return display
1377 | }
1378 | ```
1379 |
1380 | > tips: 画像表示について
1381 | > png 画像は小さいサイズであれば Go 標準の image/png を使うことができます。解像度が大きくなってくると RAM サイズの制限で描画できない事が多いです。例えば 320 x 240 サイズの `image.Image` 型に Decode された状態だと内部では `*image.RGBA` 型となり最低でも 320 x 240 x 4 = 76800 byte のメモリが必要となります。実際には計算途中のテンポラリ RAM などを含めると Wio Terminal が持つ 192KB の RAM では足りないことが多いです。
1382 | > このあたりを軽減するための package を `tinygo.org/x/drivers/image` に作っていますがまだ release されていません。
1383 |
1384 | ## SPI / ILI9341 ディスプレイ 2
1385 |
1386 | `SPI / ILI9341 ディスプレイ` では静止画の表示のみでした。ここでは少し動きを加えていきます。
1387 |
1388 | 以下のソースに瞬きを実装しているのでベースのソースコードとして go ファイルを 2 つダウンロードしてください。
1389 |
1390 | * [./11_spi_ili9341](https://github.com/sago35/tinygo-workshop/tree/de94799a9c6182bbee778366472ca5061819de7e/11_spi_ili9341)
1391 | * [main.go](https://github.com/sago35/tinygo-workshop/tree/de94799a9c6182bbee778366472ca5061819de7e/11_spi_ili9341/main.go)
1392 | * [graphics.go](https://github.com/sago35/tinygo-workshop/tree/de94799a9c6182bbee778366472ca5061819de7e/11_spi_ili9341/graphics.go)
1393 |
1394 | 上記ソースの状態で以下のようにして、目を閉じたり開いたりを実装しています。
1395 |
1396 | ```go
1397 | initEyes()
1398 |
1399 | for {
1400 | drawEye(display, 127, 91, eyeOpen)
1401 | drawEye(display, 181, 91, eyeOpen)
1402 | time.Sleep(1500 * time.Millisecond)
1403 | drawEye(display, 127, 91, eyeClose)
1404 | drawEye(display, 181, 91, eyeClose)
1405 | time.Sleep(300 * time.Millisecond)
1406 | }
1407 | ```
1408 |
1409 | ここに対して以下を実装してみましょう。普通に実装しても良いですが、瞬きの時間管理とキー操作の管理を goroutine で分けると組込みでも Go が使えるのか、という実感がわくと思います。
1410 |
1411 | * 上下左右キーで目線を動かす (GPIO の例を参考に)
1412 | * 一定時間で瞬きする
1413 |
1414 | 実際のコードは以下です。
1415 |
1416 | * [./11_spi_ili9341/main.go](./11_spi_ili9341/main.go)
1417 |
1418 | コードの抜粋は以下です。 goroutine を使って瞬きを実現しています。 (もちろん、 goroutine を使わずに実現することもできます)
1419 |
1420 | ```go
1421 | initEyes()
1422 |
1423 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
1424 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
1425 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
1426 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
1427 |
1428 | redraw := true
1429 | xofs := int16(0)
1430 | yofs := int16(0)
1431 | eye := eyeClose
1432 | eyeCh := make(chan struct{}, 1)
1433 | go func() {
1434 | for {
1435 | eyeCh <- struct{}{}
1436 | time.Sleep(1500 * time.Millisecond)
1437 | eyeCh <- struct{}{}
1438 | time.Sleep(300 * time.Millisecond)
1439 | }
1440 | }()
1441 |
1442 | for {
1443 | if !machine.WIO_5S_UP.Get() {
1444 | if 0 < yofs {
1445 | yofs--
1446 | redraw = true
1447 | }
1448 | } else if !machine.WIO_5S_LEFT.Get() {
1449 | if -4 < xofs {
1450 | xofs--
1451 | redraw = true
1452 | }
1453 | } else if !machine.WIO_5S_RIGHT.Get() {
1454 | if xofs < 7 {
1455 | xofs++
1456 | redraw = true
1457 | }
1458 | } else if !machine.WIO_5S_DOWN.Get() {
1459 | if yofs < 20 {
1460 | yofs++
1461 | redraw = true
1462 | }
1463 | }
1464 |
1465 | select {
1466 | case <-eyeCh:
1467 | if eye == eyeOpen {
1468 | eye = eyeClose
1469 | } else {
1470 | eye = eyeOpen
1471 | }
1472 | redraw = true
1473 | default:
1474 | }
1475 |
1476 | if redraw {
1477 | drawEye(display, 127+xofs, 91+yofs, eye)
1478 | drawEye(display, 181+xofs, 91+yofs, eye)
1479 | redraw = false
1480 | }
1481 | time.Sleep(50 * time.Millisecond)
1482 | }
1483 | ```
1484 |
1485 | ## WiFi
1486 |
1487 | 
1488 |
1489 | Wio Terminal には Realtek 社の RTL8720DN という WiFi / BLE に対応したチップが搭載されています。 TinyGo からもそのチップを使ってネットワークに接続したいですが、通常の Go の net/http package は大きすぎるため使用できません。そこで、機能制限がありますが TinyGo で使用できる Version を以下に作成しています。
1490 |
1491 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/rtl8720dn
1492 |
1493 | RTL8720DN を使うためには、最初に firmware の Version Up が必要です。後述の手順に従い Version Up を実施してください。
1494 |
1495 | WiFi の例はコードが非常に長くなるため省略しますが、以下のようにアクセスすることができます。基本的な機能 (`http.Get()` や `http.Post()` など) は Go の標準 package と同じように使うことができます。以下はまだ release branch には merge されていないため `go get tinygo.org/x/drivers@dev` を実行し dev branch を使用するように変更してください。
1496 |
1497 | ```go
1498 | res, err := http.Get(url)
1499 | res, err := http.Post(url, "application/json", body)
1500 |
1501 | req, err := http.NewRequest(method, url, body)
1502 | res, err := http.Do(req)
1503 | ```
1504 |
1505 | cookie も扱うことができます。
1506 |
1507 | ```go
1508 | import "tinygo.org/x/drivers/net/http/cookiejar"
1509 |
1510 | jar, err := cookiejar.New(nil)
1511 | if err != nil {
1512 | return err
1513 | }
1514 | client := &http.Client{Jar: jar}
1515 | http.DefaultClient = client
1516 |
1517 | res, err := http.Get(url)
1518 | ```
1519 |
1520 | [./09_webclient](./09_webclient) には HTTP アクセスを行う例があります。 10 秒毎に 1 回 `http://tinygo.org` にアクセスして結果を返します。 ssid と password を変更することで、自身の WiFi アクセスポイントに接続してください。 2.4GHz でも 5GHz でも接続可能です。
1521 |
1522 | [./10_webserver](./10_webserver) は Wio Terminal を Web Server にしてブラウザ経由で操作することができます。以下のような画面で LED の ON / OFF などを試すことができます。 ssid と password を変更することを忘れずに。 Wio Terminal の IP アドレスは USB-CDC 経由で表示させることができます。起動後 5 以内に USB-CDC メッセージを受信できるようにしておいてください。
1523 |
1524 | 
1525 |
1526 | `/6` にアクセスすると以下のようにテトリスで遊ぶことができます。左右キーとスペースキーで操作できます。このテトリスは [たった464文字のテトロミノ落ち物パズル!創る力を拡大しよう、高専インカレ&PCNサミットオンライン] (https://fukuno.jig.jp/3267) で紹介されていたものです。 Wio Terminal は実質的には js ファイルを serve しているだけでゲームには関わっていません。 (ゲーム自体は、アクセスした PC 側で処理されています)
1527 |
1528 | 
1529 |
1530 | その他の例は以下にあるので色々と試してみてください。ソースコード内の ssid と password を設定するのを忘れずに。
1531 |
1532 | * https://github.com/tinygo-org/drivers/tree/dev/examples/rtl8720dn
1533 |
1534 | ### RTL8720DN firmware の Version Up
1535 |
1536 | 以下に従い Version Up を行います。
1537 |
1538 | * https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/
1539 |
1540 | #### Windows
1541 |
1542 | 最低限のコマンドを記載します。これでうまくいかない場合は上記の Wiki に詳細があるので確認してください。
1543 |
1544 | ```
1545 | $ cd %USERPROFILE%
1546 | $ git clone https://github.com/Seeed-Studio/ambd_flash_tool
1547 | $ cd ambd_flash_tool
1548 | $ .\ambd_flash_tool.exe erase
1549 | $ .\ambd_flash_tool.exe flash
1550 | ```
1551 |
1552 | #### Linux
1553 |
1554 | 最低限のコマンドを記載します。これでうまくいかない場合は上記の Wiki に詳細があるので確認してください。
1555 |
1556 | ```
1557 | $ cd ~
1558 | $ git clone https://github.com/Seeed-Studio/ambd_flash_tool
1559 | $ python3 ambd_flash_tool.py erase
1560 | $ python3 ambd_flash_tool.py flash
1561 | ```
1562 |
1563 | # Bluetooth LE
1564 |
1565 | (現時点の TinyGo は BLE に対応していません)
1566 |
1567 | # まとめ
1568 |
1569 | これでハンズオンは終了となります。開発環境の立ち上げから printf debug までを体験してもらい、その後外部 package の使い方を体験してもらいました。 Wio Terminal はネットワークにもアクセスできるため色々な題材に使うことができます。是非色々なものを作ってみてください。
1570 |
1571 | * https://tinygo.org/
1572 | * https://tinygo.org/docs/reference/microcontrollers/wioterminal/
1573 | * https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/
1574 | * https://www.seeed.co.jp/
1575 | * [Wio Terminal で TinyGo プログラミングを始めよう](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef)
1576 | * [TinyGo + 'VSCode or Vim (もしくはそれ以外の LSP 対応エディタ)' で gopls 連携する方法](https://qiita.com/sago35/items/c30cbce4a0a3e12d899c)
1577 | * [TinyGo + Vim で gopls するための設定](https://qiita.com/sago35/items/f0b058ed5c32b6446834)
1578 |
1579 | # よくある質問
1580 |
1581 | ## JSON はどうやって扱うの?
1582 |
1583 | TinyGo は現状 reflect package のサポートが十分ではないため encoding/json は限定的にしか使えません。
1584 | JSON 関連は、以下の package を使うと良いです。
1585 |
1586 | * Unmarshal
1587 | * https://github.com/tidwall/gjson
1588 | * https://github.com/buger/jsonparser
1589 | * Marshal
1590 | * https://github.com/moznion/go-json-ice
1591 |
1592 | # LICENSE
1593 |
1594 | MIT
1595 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module workshop
2 |
3 | go 1.17
4 |
5 | require (
6 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
7 | golang.org/x/text v0.3.6 // indirect
8 | tinygo.org/x/drivers v0.17.2-0.20211106202608-3637033fec1c // indirect
9 | tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c // indirect
10 | tinygo.org/x/tinyfont v0.2.1 // indirect
11 | )
12 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE=
2 | github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
3 | github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
4 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
5 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
6 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
7 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
8 | github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
9 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
10 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
11 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
12 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
14 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
15 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
16 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
17 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
18 | tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
19 | tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
20 | tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
21 | tinygo.org/x/drivers v0.17.1 h1:pwr/gZAfQgx7Gs71AO+YZBG0QlWfSZrfQ4H17TIGRE0=
22 | tinygo.org/x/drivers v0.17.1/go.mod h1:+uFfVgSjxRPqsnalFrcQse/Tmhoxwl9AJmJIVuRbuRo=
23 | tinygo.org/x/drivers v0.17.2-0.20211106202608-3637033fec1c h1:+Iwmqk+XsWHVKBBoSbtYVupzQYHQV1nwhIv2LU8DZH8=
24 | tinygo.org/x/drivers v0.17.2-0.20211106202608-3637033fec1c/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI=
25 | tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c h1:QKOUxoOXDNosHIoX7PrANTGd5nmLjKKFZ81pXhkjw58=
26 | tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c/go.mod h1:ygmD8mKwhhF6HLXIs4FCe5JTYurTD2w32cmymeaYrEw=
27 | tinygo.org/x/tinyfont v0.2.1 h1:FAaemBzw8wsfhAtG6fWW+QjyWw/K8YqEeiWo4N1pv4o=
28 | tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM=
29 | tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20=
30 | tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4=
31 |
--------------------------------------------------------------------------------
/images/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/01.png
--------------------------------------------------------------------------------
/images/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/02.png
--------------------------------------------------------------------------------
/images/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/03.png
--------------------------------------------------------------------------------
/images/04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/04.png
--------------------------------------------------------------------------------
/images/05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/05.png
--------------------------------------------------------------------------------
/images/06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/06.png
--------------------------------------------------------------------------------
/images/07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/07.png
--------------------------------------------------------------------------------
/images/08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/08.png
--------------------------------------------------------------------------------
/images/09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/09.png
--------------------------------------------------------------------------------
/images/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/10.png
--------------------------------------------------------------------------------
/images/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/11.png
--------------------------------------------------------------------------------
/images/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/12.png
--------------------------------------------------------------------------------
/images/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/13.png
--------------------------------------------------------------------------------
/images/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/14.png
--------------------------------------------------------------------------------
/images/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/15.png
--------------------------------------------------------------------------------