authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-02-28 16:02:12 -08:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-02-28 16:02:12 -08:00
log3cf53f830c20b79c3e0bb5005d0f565128ec0e02
tree631f72d2022293bea7b66b913aa8c6735a249a81
parent9f19706657bfbf8a00e0f46d301b78e14179bd95

add BitGrid.asBrailleString()


2 files changed, 185 insertions(+), 7 deletions(-)

qrcode.zig+30
...@@ -534,6 +534,36 @@ fn BitGrid(comptime size: usize) type {...@@ -534,6 +534,36 @@ fn BitGrid(comptime size: usize) type {
534 }534 }
535 return content.toOwnedSlice();535 return content.toOwnedSlice();
536 }536 }
537
538 pub fn asBrailleString(grid: *const @This(), allocator: std.mem.Allocator) ![]u8 {
539 const B = packed struct(u8) { @"0": bool, @"1": bool, @"2": bool, @"3": bool, @"4": bool, @"5": bool, @"6": bool, @"7": bool };
540 var content: std.ArrayList(u8) = .init(allocator);
541 errdefer content.deinit();
542 for (0..grid.size / 4 + 1) |y| {
543 for (0..grid.size / 2 + 1) |x| {
544 var b: B = std.mem.zeroes(B);
545 inline for (0..2) |x2| {
546 inline for (0..4) |y2| blk: {
547 const real_x = x * 2 + x2;
548 const real_y = y * 4 + y2;
549 if (real_x >= grid.size) break :blk;
550 if (real_y >= grid.size) break :blk;
551 const is_set = grid.isSet(real_x, real_y);
552 if (!is_set) break :blk;
553 @field(b, "01263457"[x2 * 4 + y2 ..][0..1]) = true;
554 }
555 }
556 var cp: u21 = 0x2800;
557 cp += @as(u8, @bitCast(b));
558 var buf: [3]u8 = undefined;
559 _ = std.unicode.utf8Encode(cp, &buf) catch unreachable;
560 try content.appendSlice(&buf);
561 }
562 if (builtin.is_test) try content.appendSlice("|");
563 try content.appendSlice("\n");
564 }
565 return content.toOwnedSlice();
566 }
537 };567 };
538}568}
539569
test.zig+155-7
...@@ -4,7 +4,6 @@ const expect = @import("expect").expect;...@@ -4,7 +4,6 @@ const expect = @import("expect").expect;
44
5test {5test {
6 const grid = qrcode.encode(.latin1, .L, 1, "Ver1");6 const grid = qrcode.encode(.latin1, .L, 1, "Ver1");
7 _ = &grid;
8 const allocator = std.testing.allocator;7 const allocator = std.testing.allocator;
9 const blocks = try grid.asBlockString2(allocator);8 const blocks = try grid.asBlockString2(allocator);
10 defer allocator.free(blocks);9 defer allocator.free(blocks);
...@@ -22,10 +21,20 @@ test {...@@ -22,10 +21,20 @@ test {
22 \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀|21 \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀|
23 \\22 \\
24 );23 );
24 const braille = try grid.asBrailleString(allocator);
25 defer allocator.free(braille);
26 try expect(braille).toEqualString(
27 \\⡏⣭⡍⡇⢻⢽⡃⡏⣭⡍⡇|
28 \\⠧⠭⠥⠇⣇⣆⠅⠧⠭⠥⠇|
29 \\⠉⠷⡊⠥⢝⠉⡉⠍⣑⠌⡇|
30 \\⡭⠭⠥⡍⣲⣲⢴⣳⠤⠐⠅|
31 \\⡇⠿⠇⡇⣌⠋⡉⠍⡁⠤⠅|
32 \\⠉⠉⠉⠁⠁⠁⠀⠁⠈⠁⠁|
33 \\
34 );
25}35}
26test {36test {
27 const grid = qrcode.encode(.latin1, .L, 2, "Version 2");37 const grid = qrcode.encode(.latin1, .L, 2, "Version 2");
28 _ = &grid;
29 const allocator = std.testing.allocator;38 const allocator = std.testing.allocator;
30 const blocks = try grid.asBlockString2(allocator);39 const blocks = try grid.asBlockString2(allocator);
31 defer allocator.free(blocks);40 defer allocator.free(blocks);
...@@ -45,10 +54,21 @@ test {...@@ -45,10 +54,21 @@ test {
45 \\▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀▀|54 \\▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀▀|
46 \\55 \\
47 );56 );
57 const braille = try grid.asBrailleString(allocator);
58 defer allocator.free(braille);
59 try expect(braille).toEqualString(
60 \\⡏⣭⡍⡇⣂⡃⡽⣻⠂⡏⣭⡍⡇|
61 \\⠧⠭⠥⠇⢞⣔⠆⡌⡅⠧⠭⠥⠇|
62 \\⡿⣉⣅⢭⡏⠎⣲⢶⠭⠊⠼⢼⡄|
63 \\⡗⢰⡼⠍⡹⢥⠅⡙⣊⡎⠑⠭⠅|
64 \\⡥⠥⠥⡍⠞⠎⣲⢦⡏⠍⡟⢻⡇|
65 \\⡇⠿⠇⡇⡏⣥⠅⣩⢩⠏⡋⠇⡆|
66 \\⠉⠉⠉⠁⠁⠉⠀⠀⠁⠈⠉⠉⠁|
67 \\
68 );
48}69}
49test {70test {
50 const grid = qrcode.encode(.latin1, .L, 3, "Version 3 QR Code");71 const grid = qrcode.encode(.latin1, .L, 3, "Version 3 QR Code");
51 _ = &grid;
52 const allocator = std.testing.allocator;72 const allocator = std.testing.allocator;
53 const blocks = try grid.asBlockString2(allocator);73 const blocks = try grid.asBlockString2(allocator);
54 defer allocator.free(blocks);74 defer allocator.free(blocks);
...@@ -70,10 +90,22 @@ test {...@@ -70,10 +90,22 @@ test {
70 \\▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀ |90 \\▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀ |
71 \\91 \\
72 );92 );
93 const braille = try grid.asBrailleString(allocator);
94 defer allocator.free(braille);
95 try expect(braille).toEqualString(
96 \\⡏⣭⡍⡇⣧⡐⡞⠗⢡⢯⡆⡏⣭⡍⡇|
97 \\⠧⠭⠥⠇⠞⣇⢅⢄⡞⠜⠅⠧⠭⠥⠇|
98 \\⡭⣴⠭⠕⣤⠅⡙⡂⢦⣺⣡⣮⢾⢟⠇|
99 \\⢐⡙⡄⠍⢰⣮⢮⢭⡑⠕⠮⢜⢻⠐⡆|
100 \\⠒⠜⣷⢍⠵⠇⡙⡂⢦⣺⡉⢺⢫⢌⠆|
101 \\⡭⠭⠤⡍⡳⣬⢮⢭⡑⠕⡏⠍⡏⠜⡄|
102 \\⡇⠿⠇⡇⣑⡁⡙⡂⢦⡪⡻⡩⡙⢲⡄|
103 \\⠉⠉⠉⠁⠉⠉⠈⠉⠁⠁⠁⠀⠁⠈⠀|
104 \\
105 );
73}106}
74test {107test {
75 const grid = qrcode.encode(.latin1, .L, 4, "Version 4 QR Code, up to 50 char");108 const grid = qrcode.encode(.latin1, .L, 4, "Version 4 QR Code, up to 50 char");
76 _ = &grid;
77 const allocator = std.testing.allocator;109 const allocator = std.testing.allocator;
78 const blocks = try grid.asBlockString2(allocator);110 const blocks = try grid.asBlockString2(allocator);
79 defer allocator.free(blocks);111 defer allocator.free(blocks);
...@@ -97,10 +129,23 @@ test {...@@ -97,10 +129,23 @@ test {
97 \\▀▀▀▀▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀▀▀|129 \\▀▀▀▀▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀▀▀|
98 \\130 \\
99 );131 );
132 const braille = try grid.asBrailleString(allocator);
133 defer allocator.free(braille);
134 try expect(braille).toEqualString(
135 \\⡏⣭⡍⡇⢔⠡⣐⠡⣐⠡⡐⣝⡅⡏⣭⡍⡇|
136 \\⠧⠭⠥⠇⡌⢖⠏⢖⠏⢖⢇⣝⡇⠧⠭⠥⠇|
137 \\⡭⡗⣭⠭⣕⡴⣗⡴⣗⡴⣏⢄⢼⠧⡰⠷⡆|
138 \\⠲⣞⠖⢍⡗⣟⠠⢛⠠⢛⢘⡄⡹⢧⠠⢢⡇|
139 \\⠧⠝⣐⠕⣮⠷⣗⡴⣗⡴⣿⢎⣷⢃⢅⠢⠇|
140 \\⢔⠑⠾⠅⠥⣛⠠⢛⠠⢛⠠⢁⢖⢗⢐⢼⡇|
141 \\⡥⠤⠭⡍⡷⠶⣗⡴⣗⡴⣗⣴⡏⠍⣏⢬⠅|
142 \\⡇⠿⠇⡇⡝⣙⠠⢛⠠⢛⠠⠓⡭⠩⠕⢔⠇|
143 \\⠉⠉⠉⠁⠉⠀⠁⠀⠁⠀⠁⠈⠉⠁⠉⠉⠁|
144 \\
145 );
100}146}
101test {147test {
102 const grid = qrcode.encode(.latin1, .M, 10, "VERSION 10 QR CODE, UP TO 174 CHAR AT H LEVEL, WITH 57X57 MODULES AND PLENTY OF ERROR CORRECTION TO GO AROUND. NOTE THAT THERE ARE ADDITIONAL TRACKING BOXES");148 const grid = qrcode.encode(.latin1, .M, 10, "VERSION 10 QR CODE, UP TO 174 CHAR AT H LEVEL, WITH 57X57 MODULES AND PLENTY OF ERROR CORRECTION TO GO AROUND. NOTE THAT THERE ARE ADDITIONAL TRACKING BOXES");
103 _ = &grid;
104 const allocator = std.testing.allocator;149 const allocator = std.testing.allocator;
105 const blocks = try grid.asBlockString2(allocator);150 const blocks = try grid.asBlockString2(allocator);
106 defer allocator.free(blocks);151 defer allocator.free(blocks);
...@@ -136,6 +181,26 @@ test {...@@ -136,6 +181,26 @@ test {
136 \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ |181 \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ |
137 \\182 \\
138 );183 );
184 const braille = try grid.asBrailleString(allocator);
185 defer allocator.free(braille);
186 try expect(braille).toEqualString(
187 \\⡏⣭⡍⡇⣫⠎⢲⠲⡄⣳⡟⡣⡩⠒⠿⠍⢃⢐⡩⠛⠗⣻⢛⢽⠀⡏⣭⡍⡇|
188 \\⠧⠭⠥⠇⣔⡝⣞⡎⠆⠗⣄⢆⠆⡏⠍⡟⣍⣞⣏⠍⠄⠔⡕⢎⠄⠧⠭⠥⠇|
189 \\⠥⣹⢜⠝⡰⡕⡒⣩⡉⣽⢀⡱⢢⢝⣙⠣⠃⣒⠜⡜⡓⠢⠻⡕⣒⠵⣨⢪⡅|
190 \\⠫⣅⡏⢥⣤⠘⢩⠕⣪⣏⢸⣀⢿⣜⠄⡩⠪⢀⣙⣳⡼⡩⡪⡠⠉⡂⢖⡝⠂|
191 \\⣝⠵⠵⢥⣫⠻⠭⡑⢙⢖⠔⢧⢴⡉⡥⡬⣡⣶⡂⣀⢖⢥⢿⣋⣍⡩⢪⠼⠄|
192 \\⠾⢪⡗⠕⡙⢶⠖⡩⣿⠭⡾⡰⢖⠰⡱⣁⢄⡀⠤⠄⣱⢺⣌⠨⠓⠍⣻⠶⠅|
193 \\⡍⢶⡼⠽⡼⣠⢮⡶⣽⢡⢺⡌⡵⡧⠤⣍⢵⠌⣙⠒⠊⣠⢘⢇⡿⠦⣧⡡⡀|
194 \\⡏⡊⢧⠥⣏⢆⡞⡭⢧⡌⠫⢋⣅⡧⢥⠇⠉⢢⢬⣹⠚⡅⢡⢖⡧⣥⡯⢠⡁|
195 \\⡚⢛⡺⠥⠢⠯⠳⢎⢰⢪⢩⠍⢒⠑⣌⢺⠼⡍⠕⠼⢱⣩⢸⠥⣠⠤⡑⢒⠀|
196 \\⡢⡩⢊⠅⢰⡝⠺⠜⣊⠒⢑⢅⠧⡘⡲⡈⡾⡜⢫⣿⢌⢈⡊⡑⠋⢕⢀⢶⠂|
197 \\⢅⣗⢑⢕⢦⠙⣙⡍⠪⠽⠶⠷⠴⡈⢢⢳⡙⢫⠄⡊⠕⣔⡵⠋⠮⣢⡻⠴⡁|
198 \\⣕⣖⡻⢵⢸⣂⢂⣮⠾⢊⣠⣛⠊⠨⣱⢚⢜⢨⢊⠈⡫⢗⠼⡑⠼⠍⡽⠸⡄|
199 \\⡤⠤⠤⡅⣦⢣⣧⣡⣞⢻⡰⡇⡡⡏⠍⡏⠝⢟⣩⣇⠌⡉⠽⠄⡏⠍⣧⡎⠃|
200 \\⡇⠿⠇⡇⠮⠬⣹⠓⠹⡅⣓⡚⣚⣩⠩⠽⡉⢟⠄⡘⠤⢌⡙⠻⢽⣽⠃⠜⡀|
201 \\⠉⠉⠉⠁⠁⠈⠀⠀⠈⠈⠁⠉⠈⠀⠈⠀⠀⠉⠈⠈⠁⠀⠀⠁⠁⠀⠁⠀⠀|
202 \\
203 );
139}204}
140test {205test {
141 const grid = qrcode.encode(206 const grid = qrcode.encode(
...@@ -149,7 +214,6 @@ test {...@@ -149,7 +214,6 @@ test {
149 \\Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context, including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging). QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message. Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps.214 \\Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context, including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging). QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message. Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps.
150 ,215 ,
151 );216 );
152 _ = &grid;
153 const allocator = std.testing.allocator;217 const allocator = std.testing.allocator;
154 const blocks = try grid.asBlockString2(allocator);218 const blocks = try grid.asBlockString2(allocator);
155 defer allocator.free(blocks);219 defer allocator.free(blocks);
...@@ -215,6 +279,41 @@ test {...@@ -215,6 +279,41 @@ test {
215 \\▀▀▀▀▀▀▀ ▀ ▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ |279 \\▀▀▀▀▀▀▀ ▀ ▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ |
216 \\280 \\
217 );281 );
282 const braille = try grid.asBrailleString(allocator);
283 defer allocator.free(braille);
284 try expect(braille).toEqualString(
285 \\⡏⣭⡍⡇⡒⣻⣓⢨⡎⠊⢌⡖⢘⡵⠛⣣⣃⣀⠵⢜⠺⡣⢪⠄⡌⡥⠛⣻⣪⣽⡔⡔⣺⠃⣂⡼⡟⢼⣀⢫⠪⢤⡝⡕⢳⡪⠫⠬⣕⣜⢂⣂⡺⠥⠆⡏⣭⡍⡇|
286 \\⠧⠭⠥⠇⠞⣞⢟⡄⠝⣆⢍⡄⠜⣔⠄⡏⠍⣟⡝⡝⠞⢞⠎⣜⡝⡝⠖⠟⡏⠍⡗⡜⠞⠎⢏⣔⣝⡔⠇⠇⢟⡏⠍⣗⢞⢏⢏⣄⡅⡅⢖⢟⢝⡗⠄⠧⠭⠥⠇|
287 \\⡫⢛⠣⢭⢅⢖⣥⡗⠾⠻⡷⡁⡪⡨⢯⢙⢏⣁⣣⠨⠯⢅⠄⣓⡂⣪⠯⢟⣭⣹⡿⡐⠌⠔⢌⣢⡲⣢⠬⢄⢾⢛⡩⣩⢤⠟⢦⣋⡛⣠⠷⢟⢔⡹⢉⢈⠺⣮⡂|
288 \\⠢⢣⣌⠥⣨⢊⢎⡵⡾⡒⢲⢚⡻⡸⢬⡁⢼⡊⡡⡐⢴⣇⢬⣛⡣⡀⠄⢥⢑⣀⣳⣠⠤⢏⢜⡚⡫⡨⠗⢍⠵⣊⡃⡢⠟⢏⠜⣘⡣⡒⠍⢆⢼⣹⢁⠉⣳⡨⠃|
289 \\⣒⢸⣐⠕⢽⢩⢻⠩⡒⣤⢨⠔⣣⡰⠥⢙⢜⡈⡪⡨⠔⢕⢌⡂⡋⡰⠤⠷⡝⣂⡳⣠⢧⢆⢌⣊⣡⡈⠼⢄⢴⠊⡱⡑⠥⢧⠝⡘⡺⡳⢴⢞⢔⣁⢗⠏⠚⣶⠀|
290 \\⢘⠏⡃⢵⣷⢕⣝⠨⢬⣙⣓⣖⡿⡙⢄⣝⢇⣋⡪⡈⢤⡏⠄⣘⣻⡀⢷⡟⠙⡘⡲⡡⠤⢏⢄⣱⡊⡹⠼⢯⢡⢘⣳⡰⢦⠽⢗⣠⣺⡫⠼⢧⢴⡹⢏⠝⣣⡪⠂|
291 \\⢄⢛⠁⠕⢒⠛⠇⢼⣔⢳⠒⠽⡮⡰⠜⡕⢬⣢⡫⡨⢧⠟⢍⣁⡢⡢⠤⠝⢝⣠⡫⡳⢶⢭⢜⣚⡳⡺⠨⢧⢔⣖⡃⡚⢄⢎⢬⣚⡻⡻⢴⢝⢔⡚⢃⢙⢢⡦⠀|
292 \\⡮⣩⡴⠽⣗⣕⡾⡭⠔⢩⡬⡝⠾⣹⠬⡽⠤⣜⡻⡀⠏⢾⢴⣙⡩⡨⠬⠟⡼⠶⣦⡨⠼⢥⢄⣀⡣⣸⠼⢌⠄⡾⠴⡤⠄⢥⢜⡘⡠⡹⠴⢽⢜⣰⡵⠭⣆⣆⠂|
293 \\⣂⢔⠧⠥⣿⠫⣻⡅⣾⠮⣨⢵⢸⡳⢅⠧⡥⠇⡓⡒⠴⢷⢈⡨⡫⣠⢼⢅⠧⠥⢧⡸⠴⠟⠜⣀⡓⡈⢭⢭⠦⠧⢥⠷⠵⢟⢦⡃⡫⡠⠮⠔⠄⡸⡧⠥⢇⣎⡂|
294 \\⢁⣼⠋⢕⠗⡢⠠⠟⢰⢉⢅⢫⠷⡊⢄⠍⡸⢩⡲⣪⢼⢄⢔⣋⣣⡘⠦⢷⡾⠓⠵⡢⢥⣇⢞⣚⣠⠸⠸⢄⠵⡖⢧⠝⠌⣤⢎⣒⡣⡸⠬⢖⠞⡺⠦⠪⢯⡤⡂|
295 \\⡁⡥⣻⢭⠒⡯⡍⡱⠙⢏⢭⡍⠨⠿⢄⠿⡺⢉⡙⡒⠧⢵⢟⡒⡉⡠⠻⢇⡯⢷⠯⡫⠤⢏⢎⣂⡻⡨⠥⢟⠧⣢⢅⠣⠼⢯⢴⣱⡣⡪⠤⣵⠾⡪⢪⣦⢔⡺⠂|
296 \\⣂⡱⠊⠅⠔⣏⠓⣛⠈⣻⢵⢛⡖⡹⢔⠏⡢⢷⡔⣸⠴⢦⢘⣐⣑⡹⢼⢧⠸⠽⠿⡣⠥⢏⠍⢰⡣⠻⠼⢎⠮⡌⢷⠻⠼⢄⠌⣠⣻⣰⢤⢯⢰⡲⢚⠎⢔⣢⠂|
297 \\⢘⡰⠓⢵⢻⢌⡓⡻⢰⣶⢩⡄⡯⡰⢍⣙⡪⢅⡫⣨⠼⢧⢤⣐⡣⣈⠌⢗⡋⢽⢿⡸⢤⢍⢎⡂⡫⣠⠧⢗⠼⡧⢃⠱⢶⢝⢇⡐⣸⡋⠦⣏⢴⡪⠊⠢⠤⣮⠂|
298 \\⣌⢹⣌⢵⢂⢛⠩⢲⠏⣆⢪⣂⢶⣨⢔⠋⡸⠑⣰⡩⠿⢮⢔⣈⣻⡻⠤⢕⡙⠭⢳⡹⠬⢿⠇⣛⡋⡐⠥⢏⠼⠼⢧⠹⠵⢝⢧⣛⡢⡸⠤⢵⠘⠠⡪⢢⢔⡨⡃|
299 \\⠭⢚⡏⠍⣏⡮⣖⢥⠯⢇⠬⠇⠢⣱⠵⡏⠍⣗⡠⡲⢾⠄⢤⣂⣣⡠⢼⠷⡏⠍⣯⡛⠠⣏⢀⣛⣳⣰⠜⢏⢽⡏⠍⡧⠤⢏⢞⣐⡈⡁⠶⢥⠎⡀⡏⠍⣏⣦⡂|
300 \\⣂⠬⠫⢝⣵⡣⢌⣘⣇⡨⠹⣑⡱⡚⢕⡛⣹⣫⡠⡙⠅⢽⠟⡘⡲⡺⢽⢥⣛⠻⡗⡺⠴⢦⢏⡑⣻⡐⠥⠇⢬⢍⠻⡧⢥⢷⠄⣰⣳⡠⠤⢏⠝⡘⣿⠝⣩⣂⡂|
301 \\⢺⢎⡖⢵⡕⠝⠓⣓⣦⢼⢹⠈⡩⣠⠔⣓⢙⣲⡳⡙⠥⢇⢌⣛⡣⡰⠾⠭⣺⢒⡎⡫⠌⢇⢄⣻⡳⣢⠯⢔⠯⠵⢎⠺⢼⢄⢕⣰⣫⡈⠣⠏⠎⡐⣆⡴⣈⡶⠆|
302 \\⢸⠗⣆⠥⡉⡨⢞⡲⢶⢰⢌⣶⠰⡰⠵⣧⣵⠊⡙⡰⠾⢏⢞⣊⡪⡲⠅⢭⡢⢦⠲⡨⠧⢎⠅⣘⡣⣠⢴⠇⢥⠔⡚⢪⠕⠦⢦⣘⡫⣸⠏⢇⠝⢀⠺⡅⣰⣎⡂|
303 \\⢮⢻⢶⠽⠴⡱⣰⢿⠟⡅⠫⠏⡵⣱⠵⣗⡕⣖⡸⡠⠧⢗⢗⣙⣰⡨⢿⠇⠲⣢⡶⡚⠌⠗⢌⡐⡺⣫⢾⢬⠆⣐⡮⡦⢜⠇⢜⣐⡉⣲⠍⢟⢅⡐⢖⠤⣬⣂⠂|
304 \\⠯⣹⡞⢅⣟⢪⢬⠴⠭⣬⡴⡝⣳⡀⠴⡳⢅⣶⡈⡰⢥⢧⠞⣘⡙⡸⠜⠬⡚⠲⢾⡐⠞⢟⢴⡑⣳⡨⠬⢏⢅⠔⡦⠲⢥⢟⢔⣨⡚⡸⠽⢤⢔⣐⡒⡔⣨⡮⡂|
305 \\⣃⡼⡭⠥⡤⠈⠍⠭⠑⢻⣛⡌⣺⡰⠾⡾⠤⣮⡢⡀⠾⠍⢖⣃⡺⡠⠦⠅⡦⠦⡮⡐⠴⢖⢔⣐⣣⣠⠧⢭⢕⡽⠮⣶⠮⢜⢇⣙⡳⣹⠴⢅⢸⡒⡾⠴⣶⡶⡂|
306 \\⡒⠍⡧⠥⠇⡆⢬⣿⣗⠦⢁⣞⡻⣻⠔⠧⠥⣟⡳⡻⠥⢟⠄⣘⡣⡪⠴⠮⢧⢥⣿⡸⢰⣟⢵⡛⡩⡘⠭⢟⢼⠧⣥⡯⠤⣔⢜⣱⡨⡻⢶⢇⢭⣊⠧⣥⢟⣮⠃|
307 \\⢅⣬⣒⠕⢁⠘⣻⢢⠝⣅⡵⣣⣒⢨⠍⢣⡺⣝⡓⣱⠵⠎⢆⡓⡉⣫⠍⠏⠣⠭⡍⡘⢴⢆⢌⣡⣪⣻⢤⢅⢤⣥⣅⣤⢮⠄⢜⡀⡳⡡⠗⢆⢥⣰⠴⣺⢵⣈⠂|
308 \\⢟⡡⡷⠕⢦⡦⡘⠈⡌⡇⡑⢔⠤⡨⠼⠂⡪⡝⣣⠀⠭⠌⠞⣲⣗⡙⠮⠯⢣⠴⠭⣸⠔⢇⢼⡒⡱⡨⠼⢏⢔⡥⡄⡵⢾⢝⢜⣒⣣⣱⠵⢽⢚⣰⣥⡈⢹⡮⠂|
309 \\⠺⢸⡂⠭⠟⡶⣩⠬⡋⢹⠒⢖⡘⡸⠌⢲⡢⢕⡠⡩⠷⢞⢞⣀⡳⣸⠤⠏⠠⠤⡵⣲⠕⢖⢤⣐⣻⡘⠕⢏⢴⢤⠽⠔⠽⢏⢵⣸⡃⣲⠶⢥⢜⣠⠷⣉⢍⡮⠂|
310 \\⡬⢀⣊⠕⢩⡅⣈⢁⡯⠀⡲⣖⡓⡁⠏⣿⡫⢌⡩⡠⢴⠇⢝⡙⡣⡊⢿⢬⣥⢤⠬⣸⠝⢇⢄⣠⡡⡀⢼⢄⢄⢍⢼⠴⠽⢗⠟⣘⡰⣰⢶⠆⠄⢠⠪⡨⣭⡢⠂|
311 \\⠇⡖⢯⢭⡟⣒⠫⣝⠘⡐⡡⡁⡚⡘⠘⡪⠣⢍⣽⡀⠥⢕⢜⣐⣫⡠⠧⠍⣧⠴⡵⣪⠤⠄⠒⣫⡢⡂⠤⠟⢴⢣⡕⡄⠭⢶⢌⣺⣠⡠⠔⢤⢼⣂⡿⡣⢑⡦⠂|
312 \\⡬⠥⠤⡅⢾⡬⢷⢒⡁⡧⡾⣊⡹⡳⢜⡏⠍⣧⡻⡋⠤⠗⢔⣀⡻⡻⠔⠕⡏⠍⡧⡈⠯⠔⢗⣑⣣⡡⢴⢇⢅⡏⠍⣯⢼⢯⢌⣢⡣⡪⢼⢌⠎⣂⡏⠍⡗⣶⠂|
313 \\⡇⠿⠇⡇⣧⠄⡎⠊⠵⡕⡪⢸⡠⡙⠵⢯⢍⣑⡸⡳⠴⢝⢌⣑⡻⡩⠽⢇⠍⣙⡡⡸⠌⢶⠖⣓⣻⡰⠶⢿⠜⣋⡻⡑⠵⠍⢤⣃⡻⣸⢸⢷⢛⣊⠽⢙⣣⡆⠁|
314 \\⠉⠉⠉⠁⠁⠉⠁⠉⠈⠀⠁⠁⠈⠁⠈⠉⠈⠀⠁⠈⠉⠈⠉⠈⠁⠉⠀⠉⠈⠁⠉⠁⠉⠈⠉⠀⠉⠉⠁⠉⠈⠀⠉⠈⠀⠁⠈⠀⠁⠉⠉⠈⠈⠀⠁⠁⠈⠈⠀|
315 \\
316 );
218}317}
219test {318test {
220 const grid = qrcode.encode(319 const grid = qrcode.encode(
...@@ -228,7 +327,6 @@ test {...@@ -228,7 +327,6 @@ test {
228 \\Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context, including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging). QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message. Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps.327 \\Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context, including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging). QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message. Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps.
229 ,328 ,
230 );329 );
231 _ = &grid;
232 const allocator = std.testing.allocator;330 const allocator = std.testing.allocator;
233 const blocks = try grid.asBlockString2(allocator);331 const blocks = try grid.asBlockString2(allocator);
234 defer allocator.free(blocks);332 defer allocator.free(blocks);
...@@ -324,4 +422,54 @@ test {...@@ -324,4 +422,54 @@ test {
324 \\▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀|422 \\▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀|
325 \\423 \\
326 );424 );
425 const braille = try grid.asBrailleString(allocator);
426 defer allocator.free(braille);
427 try expect(braille).toEqualString(
428 \\⡏⣭⡍⡇⣧⡪⠭⡐⠧⢇⢀⠂⡃⡟⠾⠡⣜⣨⠲⢌⣴⣹⢊⣋⠻⡱⢉⠴⢃⣌⠴⠳⣴⣿⡱⢏⡆⢎⢏⢋⠓⢄⡿⣉⡬⠪⢈⡦⢖⠲⢏⢙⠷⣌⠃⣹⡘⢿⡑⣱⢉⣍⣛⠋⢋⣴⣃⣵⡼⡔⡫⡦⠿⡓⣍⢌⣅⠕⢊⢋⣄⡃⠆⢇⡂⡏⣭⡍⡇|
429 \\⠧⠭⠥⠇⢆⢏⢄⡖⢅⣝⢟⣕⣄⠝⡏⠍⡇⠄⡏⢗⠎⡌⢖⣔⡝⠕⢕⠗⡏⠍⣗⢗⣜⡟⢕⡏⡎⣗⡌⠏⢇⠝⡏⠍⡗⣗⠏⣞⣏⣗⣇⠕⡕⠌⢗⡅⡏⠍⣇⡍⡌⡍⠏⢔⡌⡄⡟⠏⢗⡕⡏⠍⣇⢔⡍⡌⡍⡆⠎⠏⡜⠄⠎⠆⡆⠧⠭⠥⠇|
430 \\⢍⣖⡫⢅⢦⠪⣛⡀⣫⣅⠥⠠⠻⡺⡻⣏⠵⣶⢁⡽⡵⣽⠹⢊⡾⢚⡿⣍⢛⠹⣍⢋⣜⣃⣋⡳⡐⡩⠴⢳⢿⢄⢋⢍⢱⢈⢛⢘⡍⢈⣻⠧⣱⡷⠫⠆⢿⣩⢝⣌⠳⣖⡝⡱⠳⣴⢚⢍⣌⡞⢏⣭⣋⢚⣅⠳⣆⣑⠰⠳⡬⠾⠱⠲⡰⠺⡼⡽⡇|
431 \\⢟⢏⡣⢅⢧⠂⢐⡋⢯⣍⠕⡧⠵⣃⡥⡓⠪⠃⢞⠷⡴⡽⢁⣌⡶⠋⢇⢋⠫⡵⣍⢋⣄⡪⢈⡳⡸⣓⡷⢳⠏⠴⡽⠸⡍⣋⠻⢀⣳⣋⡻⠶⡋⠴⠋⢎⢏⡓⢍⡶⡵⡦⡝⢉⡵⣔⠾⠱⢊⣆⢌⣄⣫⢤⠾⡵⡆⡇⢁⡵⡌⠈⠰⠲⣰⡳⡴⡵⡆|
432 \\⢟⣣⡣⢅⢧⢂⣺⢩⣩⣭⠲⠠⠵⡳⡙⡖⣢⣈⢘⠶⡴⣭⠩⣌⡶⢃⠾⣍⢓⠰⣍⢋⡌⣒⣋⣳⢤⡫⠴⢋⢄⢍⢻⢂⠰⢈⠳⢇⡋⢈⣻⠆⣷⡷⠫⠫⢏⠁⢯⣊⠳⣶⣥⠱⠳⣔⣒⢍⣌⣆⢏⡜⣣⠌⣇⠳⡾⡍⡸⠳⡔⠲⣇⡴⡈⠰⡴⡵⡆|
433 \\⢟⢉⡣⠭⣢⢚⠤⢯⣩⣍⣸⠠⠵⡛⡝⡆⢙⢒⣒⠶⡴⡭⠳⣍⡶⠣⡦⢋⠫⡵⡵⢬⣀⡫⢈⣣⢾⣒⡷⢫⠆⡴⣅⠺⣥⢏⠳⢟⡵⢋⣋⠃⡋⠴⢛⣮⢟⡉⢧⡶⡵⣞⣽⢉⡵⡄⢮⣍⣌⣖⢏⣌⣍⣄⡿⡵⡆⡹⢂⡵⣄⢀⠺⠲⣰⡳⣄⠳⡆|
434 \\⢟⣒⡣⢵⣢⢲⢐⢨⣩⡕⡘⡥⠵⣫⡛⣶⠜⢋⢐⠲⡴⡽⠩⣉⡶⠣⠶⢈⢳⡴⣍⢣⣙⣓⡳⡼⢼⡪⠴⢃⢧⢎⢛⢂⢰⢏⠳⢟⡏⣎⣋⢓⠷⡷⢋⣀⢸⡳⠫⣊⠳⡖⢹⣉⡵⣼⠒⢉⣌⣦⢎⣼⣍⣅⢀⠳⣆⣅⡿⠣⣖⠺⣇⡴⡈⠰⡼⡵⡆|
435 \\⢟⠫⡏⠍⣧⢺⢎⢭⣩⡭⣿⡦⠵⡃⡏⠍⡇⣑⣒⠳⡴⣥⠑⣍⡶⢓⡷⠺⡏⠍⡷⠬⣨⡨⢈⡣⠖⡲⢏⢄⠄⢬⡏⠍⣷⢏⠳⢿⢗⢏⣋⠋⢳⣰⣋⣘⡏⠍⣯⣎⢓⠲⡁⢉⡵⡔⠒⣉⣌⡾⡏⠍⣏⡽⡍⢷⢈⡼⢂⣅⡷⣄⠺⠒⡏⠍⣇⠳⡆|
436 \\⢟⠎⢫⢝⡥⣲⣹⣬⣩⡍⡘⡠⠵⣓⠟⡹⠇⣈⢘⠲⡴⡵⢹⣋⡶⠻⡤⠚⡹⣉⣏⠣⣉⠴⠳⡤⠻⡲⠷⢛⢇⢬⢟⠹⢗⣏⠳⠏⢄⡏⢋⢳⠔⠘⣍⣠⣏⠋⠫⢎⠫⣷⣭⢉⣕⠠⣲⢍⣌⡎⠽⡍⢏⣅⠐⢺⣈⣄⡟⢇⡶⡽⣇⣴⣋⢋⡽⣵⡀|
437 \\⢟⢙⣐⢭⣠⠂⡺⣮⣉⢥⣓⠡⠵⣳⡛⡠⡆⣐⣒⠶⡴⡽⡇⣉⡶⢃⢰⠚⡡⣉⡶⠬⣊⠴⢋⣣⠔⠰⢏⢬⠅⢤⢶⡵⠷⣏⡳⢷⠃⢟⢌⠋⠻⢘⣋⡐⢉⢳⢜⢎⢓⢢⣙⢉⡭⣵⢶⢉⡬⠂⠰⡴⢎⡽⡵⠺⢉⡼⢊⢊⡶⣅⠚⣲⠳⢌⣄⠻⠁|
438 \\⢟⡤⡀⢍⡰⡉⣢⣨⣙⡨⠿⠤⠕⣯⡝⣐⡁⣘⢬⠲⡴⣅⠢⣉⡶⠻⡅⠘⡙⢈⡶⡛⣉⠴⠳⡬⢎⠳⠷⢣⠟⢧⠖⡱⢿⠗⡳⠏⢌⡯⢌⢳⢼⣹⣉⣠⣎⠋⢛⢊⠫⡗⡭⢍⣕⢰⣚⢉⣔⣏⠵⡤⣎⣅⠰⠴⣈⣄⣷⢊⡶⣍⠳⣵⣿⣉⡬⠳⠁|
439 \\⢔⢾⣐⢅⢡⢢⢳⢬⣉⢥⡬⠣⣝⡶⡙⡰⠂⣘⢤⠲⣄⠻⡧⣍⠰⢃⢠⠸⡳⣉⡎⡑⣉⠴⢛⠟⢊⠳⢏⢄⢏⣣⠾⡵⢗⢶⡳⢷⠛⢯⢌⠋⠳⠸⣋⡐⢉⢳⢌⢉⢓⠲⡭⢉⡭⡅⣶⢉⡬⠊⠵⣔⢊⡽⣝⢴⢈⣌⣶⠰⡶⣍⢳⣳⠼⣱⡭⢻⡁|
440 \\⢗⡣⡀⠕⡵⡹⢏⢩⣛⡨⠏⡉⠆⣮⡝⡘⠄⣘⢜⠢⠾⣅⠚⡜⣁⡽⡕⠶⡽⠈⣠⡰⣋⠴⢓⠾⢏⠳⢗⣙⢍⣣⢶⠱⠗⠗⣳⡏⠔⢇⢌⠳⢴⣙⣋⣠⢎⠋⢋⢉⠋⢗⡱⢋⣕⢈⠣⣍⣔⣷⣉⡻⣎⡵⡴⢼⢈⣌⣾⠀⠶⣍⠣⡵⡗⣓⠵⠼⡁|
441 \\⢔⣂⣐⢝⣣⢢⠓⣙⢍⢥⡜⢮⣜⡶⣙⠲⠂⣘⢄⣌⣇⠻⡯⣯⡸⢃⠠⠦⣶⣉⡨⡁⣈⠴⢃⡦⢏⠳⢿⡳⢉⣣⢆⠱⠟⠯⡋⠴⢋⢯⠌⡳⢼⢩⣋⣠⢎⠳⢌⢉⢳⠱⠲⢋⣭⡵⡵⡶⡩⠒⠶⣌⢋⡵⡄⠶⢉⣌⡾⢄⡶⣍⠛⣱⣡⣀⠵⠺⡁|
442 \\⢗⣗⡏⠍⣷⡽⠟⣡⣟⡨⢇⣊⡃⣾⡏⠍⡇⣘⢌⣍⡾⣅⢂⡝⢀⣍⠡⠚⡏⠍⡿⡱⣈⠴⢻⠧⣋⠳⠇⣒⣋⣳⡏⠍⣯⠗⣳⡷⢋⠿⢴⠰⠼⢀⡋⠠⡏⠍⣏⢉⠣⣍⡴⠫⠲⣎⠳⡖⢕⣟⡏⠍⡿⠳⣴⢲⢉⣌⣾⠈⡶⣍⢣⡗⡏⠍⡧⠒⡀|
443 \\⢔⣂⠭⢭⣉⣧⠛⣁⠏⣥⣔⡙⣚⡦⠍⡛⡥⣜⢌⣝⣆⢋⢋⡜⠹⢋⠱⣄⢋⢿⠝⣚⣏⠴⠃⢔⢈⢳⣳⡩⢈⡳⠻⢋⡻⡦⡋⠴⠃⢾⠎⡳⢼⣩⣳⣃⡽⢋⣍⢱⠒⠱⠲⠃⠺⡶⡵⣶⠅⣵⠽⢋⣇⡵⡄⠢⠹⢊⣾⢘⡶⣍⠣⣥⣋⢋⢷⠪⠃|
444 \\⠳⣗⡾⠭⢈⠼⠟⡩⠔⡶⢖⣉⣦⢶⡒⢉⢡⢙⢌⣭⠞⢉⢋⡌⢁⣍⠱⣍⠂⠼⠷⡨⢌⠴⢓⠬⣋⠫⣙⣐⣋⣃⠱⢋⡳⣰⣳⡷⠋⢮⢴⠰⠔⣩⡉⢈⡴⢋⣍⠙⠒⣉⡴⢛⣪⣎⠳⡆⡍⡉⢃⡼⠺⠳⡜⢴⢁⣌⡮⠔⣄⢋⠫⣵⣫⠌⠇⢺⠁|
445 \\⢠⣂⢮⠽⢜⠝⡜⣹⢕⠰⢖⣱⡻⢒⡅⡛⡭⣜⢌⣥⢆⢎⢋⣄⢸⢉⠱⣅⣖⠥⠯⣒⣏⢔⢗⢕⢈⢳⣐⡩⢈⣓⠱⢋⠳⡠⣍⡴⠳⠫⠌⡳⠴⢐⣳⣋⡴⢋⣍⠡⢲⠱⠲⢋⢚⠲⡵⡞⣍⣵⠼⢂⣇⡵⡴⠴⠸⢊⣮⠴⡼⣍⠫⣽⣷⠀⠇⠜⠁|
446 \\⠾⣗⢻⠍⠋⡟⡜⡱⠛⠴⢖⣙⡪⢑⡕⠹⣥⢉⣎⡭⡗⢊⢋⡜⣑⢊⠱⣝⣊⠌⢽⠫⠴⢃⢞⠭⣋⢻⡈⣐⣋⡣⡱⢋⠴⣸⣛⡰⠳⠫⢶⠰⠴⠟⠍⢈⣔⣏⣍⠱⡲⢉⡴⠣⢛⡶⡵⡆⠥⣉⠳⡼⠺⠳⣄⠺⣇⣌⣖⢂⢀⢻⡩⣟⡭⠆⠖⠨⠄|
447 \\⢖⡪⠢⠅⠸⠙⡜⡹⡩⡱⢖⣩⠤⢒⡅⡻⡬⣬⢈⣍⡶⢊⢋⡄⡉⢌⠱⡍⠲⡬⠿⣓⣏⠜⢇⢔⠰⠄⡀⣉⣈⡣⠱⠻⠴⡰⡛⡰⠳⢫⡾⠷⠴⢷⠳⢋⡬⢊⡭⣅⠖⢉⡴⢻⢊⡲⡵⣖⣁⢉⢳⣇⣷⠷⣌⢃⠺⠚⢀⡼⡽⡽⡫⣼⢟⠊⡇⠰⡇|
448 \\⠱⡪⠻⠍⢂⡜⡜⣑⢡⡰⢖⡱⡦⣗⡕⡽⣤⠉⣉⡕⡦⢊⢋⡬⢸⢏⠱⡍⠶⡼⠴⠬⠴⢋⢇⢌⢋⠻⣐⣊⡰⡜⠱⢛⠴⣠⢳⡰⠳⠋⡣⡷⡴⠏⠌⢏⣔⣏⣕⠰⢂⢉⣔⡿⠆⡶⡵⣎⡭⣉⠣⣍⣮⢄⣎⠻⡷⣔⢈⣅⢀⢻⣉⡍⢬⠂⡇⢂⠂|
449 \\⣥⡪⡏⠍⣷⡝⡼⣡⣇⠰⢖⡹⠫⣑⡏⠍⣯⡀⣏⣕⡶⢎⢋⣌⡯⢊⠱⡍⡏⠍⡷⠴⢏⢔⠶⣌⠳⢴⣨⣋⣈⡫⡏⠍⡷⡈⠓⢰⡳⢳⣼⡖⡳⢷⢋⢯⡏⠍⡯⣵⠒⢉⡬⠊⡊⡶⣕⢚⢝⡽⡏⠍⣟⢂⣎⢃⠲⣅⢉⡽⣭⠻⢉⣄⡏⠍⣇⠺⡇|
450 \\⡀⡪⠙⠭⠥⡙⣴⢮⠴⡳⠖⠕⢡⠨⠍⣟⡵⠺⣈⡽⣴⢈⢋⡼⠺⢈⠱⡅⢏⣭⡷⠴⠷⢋⠷⣌⢋⠫⡂⣋⡰⣄⢏⢻⠵⣰⠤⢍⡳⠋⣳⡗⡳⠏⢌⣮⣻⠹⣗⠐⡶⣍⣔⡯⡞⠲⡭⡇⣭⠙⡉⡿⣩⢖⣎⠻⡧⣝⣉⣅⠐⢤⢈⡤⢏⠙⣉⢃⠂|
451 \\⡲⡪⡦⠽⢉⡜⡴⣰⢑⡱⢆⢯⢼⡧⠭⢘⣌⠕⠺⢃⠀⢎⢋⣄⣯⠘⠷⡝⣊⣜⡵⠴⢇⣃⠷⣌⠳⢼⣋⢌⣈⣋⣈⠓⠱⡈⢓⡉⡵⢳⡤⡷⡳⢷⠋⠶⠌⡳⡮⡥⣖⢉⡬⠊⢺⡶⣕⠚⡝⠙⣡⡶⣈⠀⢎⢃⠢⣝⢈⣍⠉⢾⣉⣼⡰⡍⣈⠻⡇|
452 \\⢟⡪⢫⠭⢥⠛⣴⠆⢉⣒⡟⠔⢱⠦⢝⢟⡬⢏⢁⡽⡥⠪⡹⠺⠪⢞⡵⡥⢍⣴⠷⠴⠗⡊⠷⣌⢣⡳⣊⢌⡰⣬⢊⢣⣱⢰⢼⢩⡳⠋⣻⡦⡳⢏⠌⢿⣳⢰⢐⢐⣊⢋⣔⡗⣚⠲⡭⣏⡤⡙⡩⡲⡈⠢⣎⢋⢳⣄⢉⣍⠉⢞⣈⡤⠷⣞⣌⢃⠂|
453 \\⣁⡪⡆⠽⡥⠥⠳⣰⠙⡲⣇⢯⢜⠄⠛⢛⣴⢥⠺⢃⠠⢻⣁⣄⣯⠂⣆⠛⣊⡌⠴⠴⠟⣨⠵⣌⠳⡋⣍⢌⡐⢌⠲⢼⡍⡋⢻⠘⣵⡳⣼⠿⡳⢏⢤⠶⢒⢳⢁⢸⢎⢋⣬⣊⣍⠱⣕⠲⠪⠙⡉⡶⣨⢈⣎⢋⢓⣍⣉⣍⠱⢺⢉⣼⡰⡮⢌⢋⠃|
454 \\⠲⡪⣜⠽⡤⢟⣳⠆⠁⠭⡘⠔⢡⢕⠠⢚⣤⢨⢅⡽⣍⠚⡹⠺⢒⠂⠿⡥⢍⣴⠳⠴⢟⣊⠴⣌⠋⡣⢌⢌⡀⣌⢉⠳⢵⠰⢴⣘⡏⠰⣴⠷⣳⣏⠔⢿⣓⠯⢉⣎⢋⢋⡤⡱⢋⢑⠊⢋⡴⠛⣉⠲⣈⠌⣎⢋⠓⣝⣈⣍⠡⢖⢉⣤⡱⣖⣏⢋⠃|
455 \\⣽⠈⣻⠽⡤⢗⡑⢰⠁⠧⢁⢯⢌⡀⡴⠝⢬⡣⡹⢃⢈⢻⢁⡴⢋⣄⣆⠛⣊⡌⠴⠴⢯⡰⠲⣌⢻⣓⣏⢌⠄⠬⡵⢜⡍⡳⠴⢹⣱⡳⣜⢆⡏⢌⢔⠶⢲⢯⠉⡶⣍⢳⣥⣉⣍⠡⡂⠱⠲⠻⢫⡶⣠⠢⠾⣍⠣⡥⢉⣍⠱⠚⢉⣤⡱⡮⢌⢋⠃|
456 \\⣥⡠⡏⠍⡧⠏⢠⡂⠁⠏⠛⢰⢑⡒⡏⠍⡇⣾⡳⢋⢉⠛⠸⠲⢋⡝⡿⣵⡏⠍⡷⠴⠟⣐⡳⣌⠻⡪⢌⢜⠗⠥⡏⠍⣷⠰⢴⡙⡋⠰⡼⠗⣳⣏⢜⠇⡏⠍⡇⣎⢋⢻⢭⠱⢋⠙⢢⢉⡴⠃⡏⠍⣷⢎⢇⢋⠃⡩⡹⢋⠉⠎⢉⡤⡏⠍⣏⢋⠃|
457 \\⣥⣚⠯⢝⡥⠷⢵⡆⡂⠟⡘⣳⢑⣪⣭⡿⣳⡨⢆⣍⢉⠳⡑⡲⢋⡝⣆⠳⡿⣍⠳⠴⢟⡫⠰⡌⠏⣑⣏⢴⢍⠧⡻⠋⢏⠳⢌⣼⣱⡳⡼⡷⡋⢌⠤⢗⢽⣹⠏⡲⣍⠃⢙⢋⣍⢱⢞⠵⠲⢓⣟⣉⢍⠄⠾⣍⢛⡋⣀⣍⢱⢊⠻⢂⢋⡉⣋⢋⠃|
458 \\⣥⡼⠩⢝⡤⢧⠏⡀⡂⠏⠟⣶⢑⡪⢀⠥⠯⠘⡽⢋⢉⠛⡐⡵⢋⣅⣎⠳⡶⡴⣍⠓⣟⣒⡳⡬⠕⡫⢌⢄⠗⣔⢀⣝⢷⡷⢌⣼⣉⠰⡴⡠⣳⣏⠌⢯⢌⣃⢌⢊⢋⢳⡭⡱⢋⠱⡮⡵⠲⢋⠺⢈⡼⢢⢆⢋⠃⣇⡿⢋⢁⠸⣇⣌⢋⣰⡼⣍⠃|
459 \\⣥⣫⠩⢝⡤⠗⠮⡃⡂⢯⢙⣲⢑⣂⡀⠋⠄⡪⢆⣍⢉⢣⠐⡵⢋⡍⠆⠲⣖⢈⠳⠬⣨⡨⢈⡓⠷⣓⣏⢔⢆⠬⣫⢍⠰⡷⢌⣼⡡⠷⡴⡘⠋⣌⠴⢻⢀⣉⠭⠶⣍⢓⣩⠱⢋⢁⢆⠵⠲⠫⡺⢑⡳⠻⡽⣍⠻⠻⢂⣝⠧⢂⠺⢊⢋⣈⣃⢋⠃|
460 \\⣥⢹⠩⢝⡤⠷⣙⡃⡂⢷⢱⣲⢑⡚⡩⣈⢻⠙⡽⢋⢉⠻⢁⡱⢋⣕⡆⠲⡮⣍⢋⠣⡀⢓⡳⣼⢿⣋⡴⠓⠞⢔⢨⠺⡽⠷⢌⡌⢩⡷⡴⣰⢬⣈⡴⠋⣄⣓⠮⡶⡭⡟⣍⠱⢋⠱⢂⠵⠲⢋⠶⠗⡳⢃⠀⠻⠱⢂⡿⢣⣆⠺⣇⣌⢋⣈⡻⣍⠃|
461 \\⣥⡆⠩⢝⣤⠋⠌⡁⡂⢗⠑⢵⢑⡢⢸⣿⢼⠩⢆⣍⢉⠓⡠⡵⢋⣅⠨⠶⣖⢈⠳⠼⡳⢋⣈⣳⠡⣋⣌⢜⢎⠬⣓⢂⠸⠷⢌⣴⢋⣶⠴⡈⢳⣹⡱⠻⣔⣚⠧⠶⣕⠂⢁⠱⠫⡥⢲⡵⠲⢋⡶⢯⡷⠻⡵⠴⠱⠺⢒⢛⣏⢃⠺⢊⠋⢈⣃⢻⡁|
462 \\⣥⠿⠩⠝⡄⡉⠳⠁⡢⢻⢴⣳⢑⣢⣵⡥⣻⠙⡍⢋⢉⢃⠓⡴⢋⡽⡥⠲⡮⣍⢋⠳⡰⢋⡰⡔⠴⢌⡴⢃⢄⠶⡘⠾⡭⠷⣌⡌⢤⢎⠲⣰⠜⣸⡱⢳⣔⣙⢭⠶⡭⣟⡌⠱⢓⢰⠂⠱⢒⡧⡲⢏⡱⢃⠘⠺⠱⢂⣯⠗⣎⠻⣷⣊⢳⣋⡻⡭⡁|
463 \\⣥⡮⡏⠍⣧⢚⣩⠁⣢⣆⡕⣲⠑⣪⡏⠍⣿⢉⣎⢏⢉⠻⡇⡱⢋⣅⠈⠂⡏⠍⡇⡻⡰⢋⣈⡋⠷⢌⣌⢜⢧⠖⡏⠍⣟⢯⣉⣴⠃⢇⠲⡈⢣⢩⡳⠻⡏⠍⡯⡶⣕⠚⢙⠱⠫⡵⢂⠵⠪⠪⡏⠍⡷⠻⡍⢾⠱⠺⢚⠦⢎⠳⣖⣕⡏⠍⡷⢗⡀|
464 \\⠒⡃⢿⠝⡇⡑⣓⠂⡲⢹⠱⢖⣪⢶⣍⣟⢻⢉⣿⣉⠹⣅⠂⡕⣉⡽⡥⢢⠏⠽⠻⡣⡰⢋⡈⠗⠳⢌⡴⢋⠷⡄⣹⠩⢵⠆⣋⡌⠌⠇⠴⣰⢴⡨⡳⢻⢟⠫⠳⡴⡭⣷⣅⡵⢓⠰⠒⡱⢒⣟⢋⣛⠳⢃⠠⠺⠱⠲⢻⠂⣎⠳⡦⡕⠹⠽⠣⢾⠁|
465 \\⣷⡓⢿⠵⢣⢲⣲⠃⢡⣆⣝⡝⠜⡃⣇⣮⢼⢉⣇⢌⣇⠻⡯⡈⡸⢃⠐⢮⢶⠷⠳⣻⡰⢋⣘⢧⠷⢌⣴⣈⠷⡌⣱⣕⣷⠯⡋⢴⢋⣿⠴⣈⠛⣨⡳⠣⡠⠒⠵⡴⣕⢲⣍⡶⠫⡵⣕⠱⠪⢚⣊⣳⠳⢋⠁⠨⠲⠲⢣⠞⣎⠳⡆⡱⣋⠳⠒⠮⠁|
466 \\⠒⡺⢿⠵⠄⡑⣳⠳⠳⢹⠉⠀⢮⠦⢅⣆⢹⢉⡏⠏⡾⣅⠒⡥⢁⡽⣕⢨⣞⡰⠫⡂⡱⢋⣨⠝⠷⢌⣄⣃⡳⡌⡱⢉⣼⠶⣷⣏⢄⣇⢲⢈⠻⠀⡳⢻⠿⣵⠴⡴⣅⣉⣌⡶⠳⣌⢋⠛⣕⣟⣋⡛⡶⢋⠹⠨⠱⠲⢛⠊⣎⠳⡎⡵⡳⠴⠒⢴⠁|
467 \\⣷⠺⠌⢍⡇⣶⣢⢢⢧⣆⣍⢀⠙⡳⣄⣶⢾⢉⣇⠆⢇⠻⡿⠃⠸⠳⡴⠖⢴⡰⢣⡫⡱⢋⣘⢍⠲⢌⣬⡫⠰⡌⡱⣍⣴⣟⡏⢌⢔⠎⠊⣋⠻⢸⣳⡣⡰⡍⠳⡴⡵⠱⢊⡎⢒⡶⣍⠓⢭⠚⢎⣛⢂⣍⠡⠺⠱⠲⠃⠔⣏⠳⡮⡥⣋⠳⠊⢮⠃|
468 \\⠒⡺⠍⠭⡖⠕⣣⠂⡑⢹⢁⠣⢨⠦⢅⡮⢬⢉⡿⣞⡿⡵⡶⢚⢀⡵⣄⠲⢦⡱⠻⡫⠵⢋⣐⠮⡳⠌⣀⣓⡳⡌⣱⣉⣜⢇⢱⣏⠄⢯⢴⢈⢓⡑⡋⠸⡱⣵⠴⡤⢚⣉⣌⡞⠦⢎⢋⠳⣝⠙⣊⡓⡾⢋⢁⢠⢁⡴⢫⢤⢎⠳⡦⡔⡭⡱⠢⢚⠁|
469 \\⠷⢞⠨⢍⠃⣲⣢⢺⠰⣛⣄⢃⣝⡳⣄⡖⣧⣋⣟⡗⠆⠳⡶⢂⠹⠳⣌⠓⡾⡰⠃⣑⡷⢋⡈⢕⠰⠄⡘⡩⠰⡌⡡⢉⣌⠓⡍⢌⢤⣗⠌⣋⠫⣙⣵⡻⡱⡍⠳⡔⣲⠱⢊⡞⢎⡶⣍⢓⣩⠥⢍⡳⣆⣍⠑⢸⠹⠲⢛⢒⡼⡵⡦⡥⠨⡡⠉⠿⡀|
470 \\⡬⠬⠬⡅⣳⡜⢡⠊⣰⣟⣄⢣⣐⢶⡏⠍⣯⢈⡷⠉⡯⠲⡶⠂⣑⠳⣌⢃⡏⠍⡷⡪⠴⢫⢌⠯⡳⠤⣘⣐⡳⡬⡏⠍⣏⠓⡳⣏⢌⣀⢲⢈⢫⣨⡉⢘⡏⠍⡷⡴⠺⣍⣌⣆⣎⣎⢋⠻⣭⠉⡏⠍⡿⢋⢙⢞⢀⡴⠛⢆⢀⠳⡖⡵⡏⠍⡇⢨⠁|
471 \\⡇⠿⠇⡇⣁⡞⢡⢪⣱⢚⣄⠋⣑⢆⠯⡙⣥⣫⠙⣆⣶⠲⡶⢊⣪⠰⣌⢣⢝⠭⠧⣓⣏⢤⢜⢔⠰⢬⣉⡫⠰⣌⡝⠿⣍⢣⣳⣈⢌⣨⢌⢋⢋⣼⢱⡳⢋⣏⡵⣴⢢⠱⢊⡆⢻⣊⢋⠓⢱⠹⣏⡍⣁⣍⠱⣄⠻⠲⢋⠾⡽⣥⠘⣅⢙⢋⠇⠚⠂|
472 \\⠉⠉⠉⠁⠉⠉⠁⠈⠁⠈⠀⠉⠀⠀⠀⠈⠉⠀⠁⠁⠁⠀⠀⠀⠈⠀⠈⠁⠁⠉⠈⠉⠀⠁⠈⠉⠉⠉⠁⠁⠁⠀⠁⠀⠈⠁⠁⠉⠈⠈⠀⠈⠉⠈⠈⠀⠈⠀⠁⠈⠀⠁⠈⠈⠈⠈⠉⠁⠉⠁⠈⠈⠈⠉⠁⠉⠁⠀⠉⠀⠀⠁⠉⠈⠉⠈⠈⠀⠁|
473 \\
474 );
327}475}