Subversion Repositories libOLED

Rev

Rev 8 | Rev 13 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8 Rev 10
Line 4... Line 4...
4
 *  Created on: 31 Oct 2020
4
 *  Created on: 31 Oct 2020
5
 *      Author: mike
5
 *      Author: mike
6
 */
6
 */
7
#include "libOLED/fontclass.H"
7
#include "libOLED/fontclass.H"
8
 
8
 
9
char
-
 
10
font5x7_t::getPixel (char c, int x, int y)
9
char font5x7_t::getPixel(char c, int x, int y)
11
{
10
{
12
  if (x < 0 || x >= m_width)
11
  if (x < 0 || x >= m_width)
13
    return 0;
12
    return 0;
14
  if (y < 0 || y >= m_height)
13
  if (y < 0 || y >= m_height)
15
    return 0;
14
    return 0;
16
  uint8_t pixels = 0;
15
  uint8_t pixels = 0;
17
  if (c < ' ')
16
  if (c < ' ')
18
    c = ' ';
17
    c = ' ';
19
  if (c >= ' ' && c <= 0x7f)
18
  if (c >= ' ' && c <= 0x7f)
20
    pixels = m_data[(c - ' ') * m_width + x];
19
    pixels = m_data[(c - ' ') * m_width + x];
21
  if (c == '°')
20
  if (c == '�')
22
    pixels = m_data[(0x80-' ')* m_width + x];
21
    pixels = m_data[(0x80 - ' ') * m_width + x];
-
 
22
  // handle extended char set
-
 
23
  if (c >= 0x81 && c <= 0x81)
-
 
24
    pixels = m_data[(0x81 - ' ') * m_width + x];
23
 
25
 
24
  char v = (pixels >> y) & 1;
26
  char v = (pixels >> y) & 1;
25
  return v;
27
  return v;
26
}
28
}
27
 
29
 
28
char
-
 
29
font10x18_t::getPixel (char c, int x, int y)
30
char font10x18_t::getPixel(char c, int x, int y)
30
{
31
{
31
  if (x < 0 || x >= m_width)
32
  if (x < 0 || x >= m_width)
32
    return 0;
33
    return 0;
33
  if (y < 0 || y >= m_height)
34
  if (y < 0 || y >= m_height)
34
    return 0;
35
    return 0;
35
 
36
 
36
  c = c & 0x7F;
37
  c = c & 0x7F;
37
  if (c < ' ')
38
  if (c < ' ')
38
    c = ' ';
39
    c = ' ';
39
  if (c >= m_chars+' ')
40
  if (c >= m_chars + ' ')
40
    c = ' ';
41
    c = ' ';
41
 
42
 
42
  int xm = x + (c - ' ') * m_width;
43
  int xm = x + (c - ' ') * m_width;
43
  int index = (y * m_width * m_chars + xm) / 8;
44
  int index = (y * m_width * m_chars + xm) / 8;
44
  return ((m_data[index]) >> (xm & 7)) & 1;
45
  return ((m_data[index]) >> (xm & 7)) & 1;
45
 
-
 
46
}
46
}
47
 
47
 
48
static const char font5x7_data[] =
48
static const char font5x7_data[] =
-
 
49
    {
49
  { 0x00, 0x00, 0x00, 0x00, 0x00,   //   0x20 32
50
        0x00, 0x00, 0x00, 0x00, 0x00, //   0x20 32
50
      0x00, 0x00, 0x6f, 0x00, 0x00,   // ! 0x21 33
51
        0x00, 0x00, 0x6f, 0x00, 0x00, // ! 0x21 33
51
      0x00, 0x07, 0x00, 0x07, 0x00,   // " 0x22 34
52
        0x00, 0x07, 0x00, 0x07, 0x00, // " 0x22 34
52
      0x14, 0x7f, 0x14, 0x7f, 0x14,   // # 0x23 35
53
        0x14, 0x7f, 0x14, 0x7f, 0x14, // # 0x23 35
53
      0x2e, 0x2a, 0xff, 0x2a, 0x3a,   // $ 0x24 36
54
        0x2e, 0x2a, 0xff, 0x2a, 0x3a, // $ 0x24 36
54
      0x23, 0x13, 0x08, 0x64, 0x62,   // % 0x25 37
55
        0x23, 0x13, 0x08, 0x64, 0x62, // % 0x25 37
55
      0x36, 0x49, 0x56, 0x20, 0x50,   // & 0x26 38
56
        0x36, 0x49, 0x56, 0x20, 0x50, // & 0x26 38
56
      0x00, 0x00, 0x07, 0x00, 0x00,   // ' 0x27 39
57
        0x00, 0x00, 0x07, 0x00, 0x00, // ' 0x27 39
57
      0x00, 0x1c, 0x22, 0x41, 0x00,   // ( 0x28 40
58
        0x00, 0x1c, 0x22, 0x41, 0x00, // ( 0x28 40
58
      0x00, 0x41, 0x22, 0x1c, 0x00,   // ) 0x29 41
59
        0x00, 0x41, 0x22, 0x1c, 0x00, // ) 0x29 41
59
      0x14, 0x08, 0x3e, 0x08, 0x14,   // * 0x2a 42
60
        0x14, 0x08, 0x3e, 0x08, 0x14, // * 0x2a 42
60
      0x08, 0x08, 0x3e, 0x08, 0x08,   // + 0x2b 43
61
        0x08, 0x08, 0x3e, 0x08, 0x08, // + 0x2b 43
61
      0x00, 0x50, 0x30, 0x00, 0x00,   // , 0x2c 44
62
        0x00, 0x50, 0x30, 0x00, 0x00, // , 0x2c 44
62
      0x08, 0x08, 0x08, 0x08, 0x08,   // - 0x2d 45
63
        0x08, 0x08, 0x08, 0x08, 0x08, // - 0x2d 45
63
      0x00, 0x60, 0x60, 0x00, 0x00,   // . 0x2e 46
64
        0x00, 0x60, 0x60, 0x00, 0x00, // . 0x2e 46
64
      0x20, 0x10, 0x08, 0x04, 0x02,   // / 0x2f 47
65
        0x20, 0x10, 0x08, 0x04, 0x02, // / 0x2f 47
65
      0x3e, 0x51, 0x49, 0x45, 0x3e,   // 0 0x30 48
66
        0x3e, 0x51, 0x49, 0x45, 0x3e, // 0 0x30 48
66
      0x00, 0x42, 0x7f, 0x40, 0x00,   // 1 0x31 49
67
        0x00, 0x42, 0x7f, 0x40, 0x00, // 1 0x31 49
67
      0x42, 0x61, 0x51, 0x49, 0x46,   // 2 0x32 50
68
        0x42, 0x61, 0x51, 0x49, 0x46, // 2 0x32 50
68
      0x21, 0x41, 0x45, 0x4b, 0x31,   // 3 0x33 51
69
        0x21, 0x41, 0x45, 0x4b, 0x31, // 3 0x33 51
69
      0x18, 0x14, 0x12, 0x7f, 0x10,   // 4 0x34 52
70
        0x18, 0x14, 0x12, 0x7f, 0x10, // 4 0x34 52
70
      0x27, 0x45, 0x45, 0x45, 0x39,   // 5 0x35 53
71
        0x27, 0x45, 0x45, 0x45, 0x39, // 5 0x35 53
71
      0x3c, 0x4a, 0x49, 0x49, 0x30,   // 6 0x36 54
72
        0x3c, 0x4a, 0x49, 0x49, 0x30, // 6 0x36 54
72
      0x01, 0x71, 0x09, 0x05, 0x03,   // 7 0x37 55
73
        0x01, 0x71, 0x09, 0x05, 0x03, // 7 0x37 55
73
      0x36, 0x49, 0x49, 0x49, 0x36,   // 8 0x38 56
74
        0x36, 0x49, 0x49, 0x49, 0x36, // 8 0x38 56
74
      0x06, 0x49, 0x49, 0x29, 0x1e,   // 9 0x39 57
75
        0x06, 0x49, 0x49, 0x29, 0x1e, // 9 0x39 57
75
      0x00, 0x36, 0x36, 0x00, 0x00,   // : 0x3a 58
76
        0x00, 0x36, 0x36, 0x00, 0x00, // : 0x3a 58
76
      0x00, 0x56, 0x36, 0x00, 0x00,   // ; 0x3b 59
77
        0x00, 0x56, 0x36, 0x00, 0x00, // ; 0x3b 59
77
      0x08, 0x14, 0x22, 0x41, 0x00,   // < 0x3c 60
78
        0x08, 0x14, 0x22, 0x41, 0x00, // < 0x3c 60
78
      0x14, 0x14, 0x14, 0x14, 0x14,   // = 0x3d 61
79
        0x14, 0x14, 0x14, 0x14, 0x14, // = 0x3d 61
79
      0x00, 0x41, 0x22, 0x14, 0x08,   // > 0x3e 62
80
        0x00, 0x41, 0x22, 0x14, 0x08, // > 0x3e 62
80
      0x02, 0x01, 0x51, 0x09, 0x06,   // ? 0x3f 63
81
        0x02, 0x01, 0x51, 0x09, 0x06, // ? 0x3f 63
81
      0x3e, 0x41, 0x5d, 0x49, 0x4e,   // @ 0x40 64
82
        0x3e, 0x41, 0x5d, 0x49, 0x4e, // @ 0x40 64
82
      0x7e, 0x09, 0x09, 0x09, 0x7e,   // A 0x41 65
83
        0x7e, 0x09, 0x09, 0x09, 0x7e, // A 0x41 65
83
      0x7f, 0x49, 0x49, 0x49, 0x36,   // B 0x42 66
84
        0x7f, 0x49, 0x49, 0x49, 0x36, // B 0x42 66
84
      0x3e, 0x41, 0x41, 0x41, 0x22,   // C 0x43 67
85
        0x3e, 0x41, 0x41, 0x41, 0x22, // C 0x43 67
85
      0x7f, 0x41, 0x41, 0x41, 0x3e,   // D 0x44 68
86
        0x7f, 0x41, 0x41, 0x41, 0x3e, // D 0x44 68
86
      0x7f, 0x49, 0x49, 0x49, 0x41,   // E 0x45 69
87
        0x7f, 0x49, 0x49, 0x49, 0x41, // E 0x45 69
87
      0x7f, 0x09, 0x09, 0x09, 0x01,   // F 0x46 70
88
        0x7f, 0x09, 0x09, 0x09, 0x01, // F 0x46 70
88
      0x3e, 0x41, 0x49, 0x49, 0x7a,   // G 0x47 71
89
        0x3e, 0x41, 0x49, 0x49, 0x7a, // G 0x47 71
89
      0x7f, 0x08, 0x08, 0x08, 0x7f,   // H 0x48 72
90
        0x7f, 0x08, 0x08, 0x08, 0x7f, // H 0x48 72
90
      0x00, 0x41, 0x7f, 0x41, 0x00,   // I 0x49 73
91
        0x00, 0x41, 0x7f, 0x41, 0x00, // I 0x49 73
91
      0x20, 0x40, 0x41, 0x3f, 0x01,   // J 0x4a 74
92
        0x20, 0x40, 0x41, 0x3f, 0x01, // J 0x4a 74
92
      0x7f, 0x08, 0x14, 0x22, 0x41,   // K 0x4b 75
93
        0x7f, 0x08, 0x14, 0x22, 0x41, // K 0x4b 75
93
      0x7f, 0x40, 0x40, 0x40, 0x40,   // L 0x4c 76
94
        0x7f, 0x40, 0x40, 0x40, 0x40, // L 0x4c 76
94
      0x7f, 0x02, 0x0c, 0x02, 0x7f,   // M 0x4d 77
95
        0x7f, 0x02, 0x0c, 0x02, 0x7f, // M 0x4d 77
95
      0x7f, 0x04, 0x08, 0x10, 0x7f,   // N 0x4e 78
96
        0x7f, 0x04, 0x08, 0x10, 0x7f, // N 0x4e 78
96
      0x3e, 0x41, 0x41, 0x41, 0x3e,   // O 0x4f 79
97
        0x3e, 0x41, 0x41, 0x41, 0x3e, // O 0x4f 79
97
      0x7f, 0x09, 0x09, 0x09, 0x06,   // P 0x50 80
98
        0x7f, 0x09, 0x09, 0x09, 0x06, // P 0x50 80
98
      0x3e, 0x41, 0x51, 0x21, 0x5e,   // Q 0x51 81
99
        0x3e, 0x41, 0x51, 0x21, 0x5e, // Q 0x51 81
99
      0x7f, 0x09, 0x19, 0x29, 0x46,   // R 0x52 82
100
        0x7f, 0x09, 0x19, 0x29, 0x46, // R 0x52 82
100
      0x46, 0x49, 0x49, 0x49, 0x31,   // S 0x53 83
101
        0x46, 0x49, 0x49, 0x49, 0x31, // S 0x53 83
101
      0x01, 0x01, 0x7f, 0x01, 0x01,   // T 0x54 84
102
        0x01, 0x01, 0x7f, 0x01, 0x01, // T 0x54 84
102
      0x3f, 0x40, 0x40, 0x40, 0x3f,   // U 0x55 85
103
        0x3f, 0x40, 0x40, 0x40, 0x3f, // U 0x55 85
103
      0x0f, 0x30, 0x40, 0x30, 0x0f,   // V 0x56 86
104
        0x0f, 0x30, 0x40, 0x30, 0x0f, // V 0x56 86
104
      0x3f, 0x40, 0x30, 0x40, 0x3f,   // W 0x57 87
105
        0x3f, 0x40, 0x30, 0x40, 0x3f, // W 0x57 87
105
      0x63, 0x14, 0x08, 0x14, 0x63,   // X 0x58 88
106
        0x63, 0x14, 0x08, 0x14, 0x63, // X 0x58 88
106
      0x07, 0x08, 0x70, 0x08, 0x07,   // Y 0x59 89
107
        0x07, 0x08, 0x70, 0x08, 0x07, // Y 0x59 89
107
      0x61, 0x51, 0x49, 0x45, 0x43,   // Z 0x5a 90
108
        0x61, 0x51, 0x49, 0x45, 0x43, // Z 0x5a 90
108
      0x00, 0x00, 0x7f, 0x41, 0x00,   // [ 0x5b 91
109
        0x00, 0x00, 0x7f, 0x41, 0x00, // [ 0x5b 91
109
      0x02, 0x04, 0x08, 0x10, 0x20,   // \ 0x5c 92
110
        0x02, 0x04, 0x08, 0x10, 0x20, // \ 0x5c 92
110
      0x00, 0x41, 0x7f, 0x00, 0x00,   // ] 0x5d 93
111
        0x00, 0x41, 0x7f, 0x00, 0x00, // ] 0x5d 93
111
      0x04, 0x02, 0x01, 0x02, 0x04,   // ^ 0x5e 94
112
        0x04, 0x02, 0x01, 0x02, 0x04, // ^ 0x5e 94
112
      0x40, 0x40, 0x40, 0x40, 0x40,   // _ 0x5f 95
113
        0x40, 0x40, 0x40, 0x40, 0x40, // _ 0x5f 95
113
      0x00, 0x00, 0x03, 0x04, 0x00,   // ` 0x60 96
114
        0x00, 0x00, 0x03, 0x04, 0x00, // ` 0x60 96
114
      0x20, 0x54, 0x54, 0x54, 0x78,   // a 0x61 97
115
        0x20, 0x54, 0x54, 0x54, 0x78, // a 0x61 97
115
      0x7f, 0x48, 0x44, 0x44, 0x38,   // b 0x62 98
116
        0x7f, 0x48, 0x44, 0x44, 0x38, // b 0x62 98
116
      0x38, 0x44, 0x44, 0x44, 0x44,   // c 0x63 99
117
        0x38, 0x44, 0x44, 0x44, 0x44, // c 0x63 99
117
      0x38, 0x44, 0x44, 0x48, 0x7f,   // d 0x64 100
118
        0x38, 0x44, 0x44, 0x48, 0x7f, // d 0x64 100
118
      0x38, 0x54, 0x54, 0x54, 0x18,   // e 0x65 101
119
        0x38, 0x54, 0x54, 0x54, 0x18, // e 0x65 101
119
      0x08, 0x7e, 0x09, 0x01, 0x02,   // f 0x66 102
120
        0x08, 0x7e, 0x09, 0x01, 0x02, // f 0x66 102
120
      0x0c, 0x52, 0x52, 0x52, 0x3e,   // g 0x67 103
121
        0x0c, 0x52, 0x52, 0x52, 0x3e, // g 0x67 103
121
      0x7f, 0x08, 0x04, 0x04, 0x78,   // h 0x68 104
122
        0x7f, 0x08, 0x04, 0x04, 0x78, // h 0x68 104
122
      0x00, 0x44, 0x7d, 0x40, 0x00,   // i 0x69 105
123
        0x00, 0x44, 0x7d, 0x40, 0x00, // i 0x69 105
123
      0x20, 0x40, 0x44, 0x3d, 0x00,   // j 0x6a 106
124
        0x20, 0x40, 0x44, 0x3d, 0x00, // j 0x6a 106
124
      0x00, 0x7f, 0x10, 0x28, 0x44,   // k 0x6b 107
125
        0x00, 0x7f, 0x10, 0x28, 0x44, // k 0x6b 107
125
      0x00, 0x41, 0x7f, 0x40, 0x00,   // l 0x6c 108
126
        0x00, 0x41, 0x7f, 0x40, 0x00, // l 0x6c 108
126
      0x7c, 0x04, 0x18, 0x04, 0x78,   // m 0x6d 109
127
        0x7c, 0x04, 0x18, 0x04, 0x78, // m 0x6d 109
127
      0x7c, 0x08, 0x04, 0x04, 0x78,   // n 0x6e 110
128
        0x7c, 0x08, 0x04, 0x04, 0x78, // n 0x6e 110
128
      0x38, 0x44, 0x44, 0x44, 0x38,   // o 0x6f 111
129
        0x38, 0x44, 0x44, 0x44, 0x38, // o 0x6f 111
129
      0x7c, 0x14, 0x14, 0x14, 0x08,   // p 0x70 112
130
        0x7c, 0x14, 0x14, 0x14, 0x08, // p 0x70 112
130
      0x08, 0x14, 0x14, 0x14, 0x7c,   // q 0x71 113
131
        0x08, 0x14, 0x14, 0x14, 0x7c, // q 0x71 113
131
      0x7c, 0x08, 0x04, 0x04, 0x08,   // r 0x72 114
132
        0x7c, 0x08, 0x04, 0x04, 0x08, // r 0x72 114
132
      0x48, 0x54, 0x54, 0x54, 0x20,   // s 0x73 115
133
        0x48, 0x54, 0x54, 0x54, 0x20, // s 0x73 115
133
      0x04, 0x3f, 0x44, 0x40, 0x20,   // t 0x74 116
134
        0x04, 0x3f, 0x44, 0x40, 0x20, // t 0x74 116
134
      0x3c, 0x40, 0x40, 0x20, 0x7c,   // u 0x75 117
135
        0x3c, 0x40, 0x40, 0x20, 0x7c, // u 0x75 117
135
      0x1c, 0x20, 0x40, 0x20, 0x1c,   // v 0x76 118
136
        0x1c, 0x20, 0x40, 0x20, 0x1c, // v 0x76 118
136
      0x3c, 0x40, 0x30, 0x40, 0x3c,   // w 0x77 119
137
        0x3c, 0x40, 0x30, 0x40, 0x3c, // w 0x77 119
137
      0x44, 0x28, 0x10, 0x28, 0x44,   // x 0x78 120
138
        0x44, 0x28, 0x10, 0x28, 0x44, // x 0x78 120
138
      0x0c, 0x50, 0x50, 0x50, 0x3c,   // y 0x79 121
139
        0x0c, 0x50, 0x50, 0x50, 0x3c, // y 0x79 121
139
      0x44, 0x64, 0x54, 0x4c, 0x44,   // z 0x7a 122
140
        0x44, 0x64, 0x54, 0x4c, 0x44, // z 0x7a 122
140
      0x00, 0x08, 0x36, 0x41, 0x41,   //  0x7b 123
141
        0x00, 0x08, 0x36, 0x41, 0x41, //  0x7b 123
141
      0x00, 0x00, 0x7f, 0x00, 0x00,   // | 0x7c 124
142
        0x00, 0x00, 0x7f, 0x00, 0x00, // | 0x7c 124
142
      0x41, 0x41, 0x36, 0x08, 0x00,   //  0x7d 125
143
        0x41, 0x41, 0x36, 0x08, 0x00, //  0x7d 125
143
      0x08, 0x0c, 0x08, 0x18, 0x08,   // ~ 0x7e 126
144
        0x08, 0x0c, 0x08, 0x18, 0x08, // ~ 0x7e 126
144
      0x55, 0x2A, 0x55, 0x2A, 0x55,   //  0x7F 127
145
        0x55, 0x2A, 0x55, 0x2A, 0x55, //  0x7F 127
145
      0x00, 0x06, 0x09, 0x06, 0x00, // 0x80 (remapped in code) a ° sign
146
        0x00, 0x06, 0x09, 0x06, 0x00, // 0x80 (remapped in code) a degrees sign
-
 
147
        0x49, 0x7f, 0x49, 0x49, 0x36, //  0x81 (remapped in code) a sort of Bluetooth symbol
146
    };
148
};
147
#if defined(USE_OLD_FONT)#else#endif
149
#if defined(USE_OLD_FONT)#else#endif
148
 
150
 
149
 
151
font5x7_t small_font(font5x7_data);
150
font5x7_t small_font (font5x7_data);
152
 
151
 
153
font10x18_t large_font(font10x18_data);
152
font10x18_t large_font (font10x18_data);
154
 
153
 
155
154
156
155
157
156
158
157
159
158
160
159
161
160
162
161
163
162
164
163
165
164
166
165
167
166
168
167
169
168
170
169
171
170
172
171
173
172
174
173
175
174
176
175
177
176
178
177
179
178
180
179
181
180
182
181
183
182
184
183
185
184
186
185
187
186
188
187
189
188
190
189
191
190
192
191
193
192
194
193
195
194
196
195
197
196
198
197
199
198
200
199
201
200
202
201
203
202
204
203
205
204
206
205
207
206
208
207
209
208
210
209
211
210
212
211
213
212
214
213
215
214
216
215
217
216
218
217
219
218
220
219
221
220
222
221
223
222
224
223
225
224
226
225
227
226
228
227
229
228
230
229
231
230
232
231
233
232
234
233
235
234
236
235
237
236
238
237
239
238
240
239
241
240
242
241
243
242
244
243
245
244
246
245
247
246
248
247
249
248
250
249
251
250
252
251
253
252
254
253
255
254
256
255
257
256
258
257
259
258
260
259
261
260
262
261
263
262
264
263
265
264
266
265
267
266
268
267
269
268
270
269
271
270
272
271
273
272
274
273
275
274
276
275
277
276
278
277
279
278
280
279
281
280
282
281
283
282
284
283
285
284
286
285
287
286
288
287
289
288
290
289
291
290
292
291
293
292
294
293
295
294
296
295
297
296
298
297
299
298
300
299
301
300
302
301
303
302
304
303
305
304
306
305
307
306
308
307
309
308
310
309
311
310
312
311
313
312
314
313
315
314
316
315
317
316
318
317
319
318
320
319
321
320
322
321
323
322
324
323
325
324
326
325
327
326
328
327
329
328
330
329
331
330
332
331
333
332
334
333
335
334
336
335
337
336
338
337
339
338
340
339
341
340
342
341
343
342
344
343
345
344
346
345
347
346
348
347
349
348
350
349
351
350
352
351
353
352
354
353
355
354
356
355
357
356
358
357
359
358
360
359
361
360
362
361
363
362
364
363
365
364
366
365
367
366
368
367
369
368
370
369
371
370
372
371
373
372
374
373
375
374
376
375
377
376
378
377
379
378
380
379
381
380
382
381
383
382
384
383
385
384
386
385
387
386
388
387
389
388
390
389
391
390
392
391
393
392
394
393
395
394
396
395
397
396
398
397
399
398
400
399
401
400
402
401
403
402
404
403
405
404
406
405
407
406
408
407
409
408
410
409
411
410
412
411
413
412
414
413
415
414
416
415
417
416
418
417
419
418
420
419
421
420
422
421
423
422
424
423
425
424
426
425
427
426
428
427
429
428
430
429
431
430
432
431
433
432
434
433
435
434
436
435
437
436
438
437
439
438
440
439
441
440
442
441
443
442
444
443
445
444
446
445
447
446
448
447
449
448
450
449
451
450
452
451
453
452
454
453
455
454
456
455
457
456
458
457
459
458
460
459
461
460
462
461
463
462
464
463
465
464
466
465
467
466
468
467
469
468
470
469
471
470
472
471
473
472
474
473
475
474
476
475
477
476
478
477
479
478
480
479
481
480
482
481
483
482
484
483
485
484
486
485
487
486
488
487
489
488
490
489
491
490
492
491
493
492
494
493
495
494
496
495
497
496
498
497
499
498
500
499
501
500
502
501
503
502
504
503
505
504
506
505
507
506
508
507
509
508
510
509
511
510
512
511
513
512
514
513
515
-
 
516
514
517
515
-
 
516
-
 
517
518