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 {
534534 }
535535 return content.toOwnedSlice();
536536 }
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 }
537567 };
538568}
539569
test.zig+155-7
......@@ -4,7 +4,6 @@ const expect = @import("expect").expect;
44
55test {
66 const grid = qrcode.encode(.latin1, .L, 1, "Ver1");
7 _ = &grid;
87 const allocator = std.testing.allocator;
98 const blocks = try grid.asBlockString2(allocator);
109 defer allocator.free(blocks);
......@@ -22,10 +21,20 @@ test {
2221 \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀|
2322 \\
2423 );
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 );
2535}
2636test {
2737 const grid = qrcode.encode(.latin1, .L, 2, "Version 2");
28 _ = &grid;
2938 const allocator = std.testing.allocator;
3039 const blocks = try grid.asBlockString2(allocator);
3140 defer allocator.free(blocks);
......@@ -45,10 +54,21 @@ test {
4554 \\▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀▀|
4655 \\
4756 );
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 );
4869}
4970test {
5071 const grid = qrcode.encode(.latin1, .L, 3, "Version 3 QR Code");
51 _ = &grid;
5272 const allocator = std.testing.allocator;
5373 const blocks = try grid.asBlockString2(allocator);
5474 defer allocator.free(blocks);
......@@ -70,10 +90,22 @@ test {
7090 \\▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀ |
7191 \\
7292 );
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 );
73106}
74107test {
75108 const grid = qrcode.encode(.latin1, .L, 4, "Version 4 QR Code, up to 50 char");
76 _ = &grid;
77109 const allocator = std.testing.allocator;
78110 const blocks = try grid.asBlockString2(allocator);
79111 defer allocator.free(blocks);
......@@ -97,10 +129,23 @@ test {
97129 \\▀▀▀▀▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀▀▀|
98130 \\
99131 );
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 );
100146}
101147test {
102148 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;
104149 const allocator = std.testing.allocator;
105150 const blocks = try grid.asBlockString2(allocator);
106151 defer allocator.free(blocks);
......@@ -136,6 +181,26 @@ test {
136181 \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ |
137182 \\
138183 );
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 );
139204}
140205test {
141206 const grid = qrcode.encode(
......@@ -149,7 +214,6 @@ test {
149214 \\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.
150215 ,
151216 );
152 _ = &grid;
153217 const allocator = std.testing.allocator;
154218 const blocks = try grid.asBlockString2(allocator);
155219 defer allocator.free(blocks);
......@@ -215,6 +279,41 @@ test {
215279 \\▀▀▀▀▀▀▀ ▀ ▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ |
216280 \\
217281 );
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 );
218317}
219318test {
220319 const grid = qrcode.encode(
......@@ -228,7 +327,6 @@ test {
228327 \\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.
229328 ,
230329 );
231 _ = &grid;
232330 const allocator = std.testing.allocator;
233331 const blocks = try grid.asBlockString2(allocator);
234332 defer allocator.free(blocks);
......@@ -324,4 +422,54 @@ test {
324422 \\▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀|
325423 \\
326424 );
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 );
327475}