From 52f80aa8ae036a52bd149342dd01e18ec24d3906 Mon Sep 17 00:00:00 2001 From: Executor Date: Fri, 20 Mar 2026 10:31:41 +0800 Subject: [PATCH 1/3] [Proto] Make Lookup class fully rva-static --- Lagrange.Proto/Primitives/Lookup.cs | 2071 +++++++++++----------- Lagrange.Proto/Primitives/ProtoReader.cs | 4 +- 2 files changed, 1033 insertions(+), 1042 deletions(-) diff --git a/Lagrange.Proto/Primitives/Lookup.cs b/Lagrange.Proto/Primitives/Lookup.cs index e89f917b..b59a1712 100644 --- a/Lagrange.Proto/Primitives/Lookup.cs +++ b/Lagrange.Proto/Primitives/Lookup.cs @@ -1,14 +1,11 @@ -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using System.Runtime.Intrinsics; namespace Lagrange.Proto.Primitives; internal static class Lookup { - static Lookup() - { - byte[] data = + private static ReadOnlySpan UnderlyingDoubleVec => [ 0, 255, 255, 255, 255, 255, 255, 255, 1, 255, 255, 255, 255, 255, 255, 255, // 1, 1 0, 255, 255, 255, 255, 255, 255, 255, 1, 2, 255, 255, 255, 255, 255, 255, // 1, 2 @@ -102,1044 +99,1038 @@ static Lookup() 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 255, 255 // 10, 6 ]; - DoubleVec = new Vector128[90]; - - for (int i = 0; i < 90; i++) - { - DoubleVec[i] = Unsafe.ReadUnaligned>(ref MemoryMarshal.GetReference(data.AsSpan(i * 16, 16))); - } - } + public static ReadOnlySpan> DoubleVec => MemoryMarshal.Cast>(UnderlyingDoubleVec); - public static readonly Vector128[] DoubleVec; - - public static readonly (byte, byte, byte)[] DoubleStep1 = + private static ReadOnlySpan UnderlyingDoubleStep1 => [ - (0, 1, 1), // 0b0000000000000000 - (10, 2, 1), // 0b0000000000000001 - (1, 1, 2), // 0b0000000000000010 - (20, 3, 1), // 0b0000000000000011 - (0, 1, 1), // 0b0000000000000100 - (11, 2, 2), // 0b0000000000000101 - (2, 1, 3), // 0b0000000000000110 - (30, 4, 1), // 0b0000000000000111 - (0, 1, 1), // 0b0000000000001000 - (10, 2, 1), // 0b0000000000001001 - (1, 1, 2), // 0b0000000000001010 - (21, 3, 2), // 0b0000000000001011 - (0, 1, 1), // 0b0000000000001100 - (12, 2, 3), // 0b0000000000001101 - (3, 1, 4), // 0b0000000000001110 - (40, 5, 1), // 0b0000000000001111 - (0, 1, 1), // 0b0000000000010000 - (10, 2, 1), // 0b0000000000010001 - (1, 1, 2), // 0b0000000000010010 - (20, 3, 1), // 0b0000000000010011 - (0, 1, 1), // 0b0000000000010100 - (11, 2, 2), // 0b0000000000010101 - (2, 1, 3), // 0b0000000000010110 - (31, 4, 2), // 0b0000000000010111 - (0, 1, 1), // 0b0000000000011000 - (10, 2, 1), // 0b0000000000011001 - (1, 1, 2), // 0b0000000000011010 - (22, 3, 3), // 0b0000000000011011 - (0, 1, 1), // 0b0000000000011100 - (13, 2, 4), // 0b0000000000011101 - (4, 1, 5), // 0b0000000000011110 - (50, 6, 1), // 0b0000000000011111 - (0, 1, 1), // 0b0000000000100000 - (10, 2, 1), // 0b0000000000100001 - (1, 1, 2), // 0b0000000000100010 - (20, 3, 1), // 0b0000000000100011 - (0, 1, 1), // 0b0000000000100100 - (11, 2, 2), // 0b0000000000100101 - (2, 1, 3), // 0b0000000000100110 - (30, 4, 1), // 0b0000000000100111 - (0, 1, 1), // 0b0000000000101000 - (10, 2, 1), // 0b0000000000101001 - (1, 1, 2), // 0b0000000000101010 - (21, 3, 2), // 0b0000000000101011 - (0, 1, 1), // 0b0000000000101100 - (12, 2, 3), // 0b0000000000101101 - (3, 1, 4), // 0b0000000000101110 - (41, 5, 2), // 0b0000000000101111 - (0, 1, 1), // 0b0000000000110000 - (10, 2, 1), // 0b0000000000110001 - (1, 1, 2), // 0b0000000000110010 - (20, 3, 1), // 0b0000000000110011 - (0, 1, 1), // 0b0000000000110100 - (11, 2, 2), // 0b0000000000110101 - (2, 1, 3), // 0b0000000000110110 - (32, 4, 3), // 0b0000000000110111 - (0, 1, 1), // 0b0000000000111000 - (10, 2, 1), // 0b0000000000111001 - (1, 1, 2), // 0b0000000000111010 - (23, 3, 4), // 0b0000000000111011 - (0, 1, 1), // 0b0000000000111100 - (14, 2, 5), // 0b0000000000111101 - (5, 1, 6), // 0b0000000000111110 - (60, 7, 1), // 0b0000000000111111 - (0, 1, 1), // 0b0000000001000000 - (10, 2, 1), // 0b0000000001000001 - (1, 1, 2), // 0b0000000001000010 - (20, 3, 1), // 0b0000000001000011 - (0, 1, 1), // 0b0000000001000100 - (11, 2, 2), // 0b0000000001000101 - (2, 1, 3), // 0b0000000001000110 - (30, 4, 1), // 0b0000000001000111 - (0, 1, 1), // 0b0000000001001000 - (10, 2, 1), // 0b0000000001001001 - (1, 1, 2), // 0b0000000001001010 - (21, 3, 2), // 0b0000000001001011 - (0, 1, 1), // 0b0000000001001100 - (12, 2, 3), // 0b0000000001001101 - (3, 1, 4), // 0b0000000001001110 - (40, 5, 1), // 0b0000000001001111 - (0, 1, 1), // 0b0000000001010000 - (10, 2, 1), // 0b0000000001010001 - (1, 1, 2), // 0b0000000001010010 - (20, 3, 1), // 0b0000000001010011 - (0, 1, 1), // 0b0000000001010100 - (11, 2, 2), // 0b0000000001010101 - (2, 1, 3), // 0b0000000001010110 - (31, 4, 2), // 0b0000000001010111 - (0, 1, 1), // 0b0000000001011000 - (10, 2, 1), // 0b0000000001011001 - (1, 1, 2), // 0b0000000001011010 - (22, 3, 3), // 0b0000000001011011 - (0, 1, 1), // 0b0000000001011100 - (13, 2, 4), // 0b0000000001011101 - (4, 1, 5), // 0b0000000001011110 - (51, 6, 2), // 0b0000000001011111 - (0, 1, 1), // 0b0000000001100000 - (10, 2, 1), // 0b0000000001100001 - (1, 1, 2), // 0b0000000001100010 - (20, 3, 1), // 0b0000000001100011 - (0, 1, 1), // 0b0000000001100100 - (11, 2, 2), // 0b0000000001100101 - (2, 1, 3), // 0b0000000001100110 - (30, 4, 1), // 0b0000000001100111 - (0, 1, 1), // 0b0000000001101000 - (10, 2, 1), // 0b0000000001101001 - (1, 1, 2), // 0b0000000001101010 - (21, 3, 2), // 0b0000000001101011 - (0, 1, 1), // 0b0000000001101100 - (12, 2, 3), // 0b0000000001101101 - (3, 1, 4), // 0b0000000001101110 - (42, 5, 3), // 0b0000000001101111 - (0, 1, 1), // 0b0000000001110000 - (10, 2, 1), // 0b0000000001110001 - (1, 1, 2), // 0b0000000001110010 - (20, 3, 1), // 0b0000000001110011 - (0, 1, 1), // 0b0000000001110100 - (11, 2, 2), // 0b0000000001110101 - (2, 1, 3), // 0b0000000001110110 - (33, 4, 4), // 0b0000000001110111 - (0, 1, 1), // 0b0000000001111000 - (10, 2, 1), // 0b0000000001111001 - (1, 1, 2), // 0b0000000001111010 - (24, 3, 5), // 0b0000000001111011 - (0, 1, 1), // 0b0000000001111100 - (15, 2, 6), // 0b0000000001111101 - (6, 1, 7), // 0b0000000001111110 - (69, 8, 1), // 0b0000000001111111 - (0, 1, 1), // 0b0000000010000000 - (10, 2, 1), // 0b0000000010000001 - (1, 1, 2), // 0b0000000010000010 - (20, 3, 1), // 0b0000000010000011 - (0, 1, 1), // 0b0000000010000100 - (11, 2, 2), // 0b0000000010000101 - (2, 1, 3), // 0b0000000010000110 - (30, 4, 1), // 0b0000000010000111 - (0, 1, 1), // 0b0000000010001000 - (10, 2, 1), // 0b0000000010001001 - (1, 1, 2), // 0b0000000010001010 - (21, 3, 2), // 0b0000000010001011 - (0, 1, 1), // 0b0000000010001100 - (12, 2, 3), // 0b0000000010001101 - (3, 1, 4), // 0b0000000010001110 - (40, 5, 1), // 0b0000000010001111 - (0, 1, 1), // 0b0000000010010000 - (10, 2, 1), // 0b0000000010010001 - (1, 1, 2), // 0b0000000010010010 - (20, 3, 1), // 0b0000000010010011 - (0, 1, 1), // 0b0000000010010100 - (11, 2, 2), // 0b0000000010010101 - (2, 1, 3), // 0b0000000010010110 - (31, 4, 2), // 0b0000000010010111 - (0, 1, 1), // 0b0000000010011000 - (10, 2, 1), // 0b0000000010011001 - (1, 1, 2), // 0b0000000010011010 - (22, 3, 3), // 0b0000000010011011 - (0, 1, 1), // 0b0000000010011100 - (13, 2, 4), // 0b0000000010011101 - (4, 1, 5), // 0b0000000010011110 - (50, 6, 1), // 0b0000000010011111 - (0, 1, 1), // 0b0000000010100000 - (10, 2, 1), // 0b0000000010100001 - (1, 1, 2), // 0b0000000010100010 - (20, 3, 1), // 0b0000000010100011 - (0, 1, 1), // 0b0000000010100100 - (11, 2, 2), // 0b0000000010100101 - (2, 1, 3), // 0b0000000010100110 - (30, 4, 1), // 0b0000000010100111 - (0, 1, 1), // 0b0000000010101000 - (10, 2, 1), // 0b0000000010101001 - (1, 1, 2), // 0b0000000010101010 - (21, 3, 2), // 0b0000000010101011 - (0, 1, 1), // 0b0000000010101100 - (12, 2, 3), // 0b0000000010101101 - (3, 1, 4), // 0b0000000010101110 - (41, 5, 2), // 0b0000000010101111 - (0, 1, 1), // 0b0000000010110000 - (10, 2, 1), // 0b0000000010110001 - (1, 1, 2), // 0b0000000010110010 - (20, 3, 1), // 0b0000000010110011 - (0, 1, 1), // 0b0000000010110100 - (11, 2, 2), // 0b0000000010110101 - (2, 1, 3), // 0b0000000010110110 - (32, 4, 3), // 0b0000000010110111 - (0, 1, 1), // 0b0000000010111000 - (10, 2, 1), // 0b0000000010111001 - (1, 1, 2), // 0b0000000010111010 - (23, 3, 4), // 0b0000000010111011 - (0, 1, 1), // 0b0000000010111100 - (14, 2, 5), // 0b0000000010111101 - (5, 1, 6), // 0b0000000010111110 - (61, 7, 2), // 0b0000000010111111 - (0, 1, 1), // 0b0000000011000000 - (10, 2, 1), // 0b0000000011000001 - (1, 1, 2), // 0b0000000011000010 - (20, 3, 1), // 0b0000000011000011 - (0, 1, 1), // 0b0000000011000100 - (11, 2, 2), // 0b0000000011000101 - (2, 1, 3), // 0b0000000011000110 - (30, 4, 1), // 0b0000000011000111 - (0, 1, 1), // 0b0000000011001000 - (10, 2, 1), // 0b0000000011001001 - (1, 1, 2), // 0b0000000011001010 - (21, 3, 2), // 0b0000000011001011 - (0, 1, 1), // 0b0000000011001100 - (12, 2, 3), // 0b0000000011001101 - (3, 1, 4), // 0b0000000011001110 - (40, 5, 1), // 0b0000000011001111 - (0, 1, 1), // 0b0000000011010000 - (10, 2, 1), // 0b0000000011010001 - (1, 1, 2), // 0b0000000011010010 - (20, 3, 1), // 0b0000000011010011 - (0, 1, 1), // 0b0000000011010100 - (11, 2, 2), // 0b0000000011010101 - (2, 1, 3), // 0b0000000011010110 - (31, 4, 2), // 0b0000000011010111 - (0, 1, 1), // 0b0000000011011000 - (10, 2, 1), // 0b0000000011011001 - (1, 1, 2), // 0b0000000011011010 - (22, 3, 3), // 0b0000000011011011 - (0, 1, 1), // 0b0000000011011100 - (13, 2, 4), // 0b0000000011011101 - (4, 1, 5), // 0b0000000011011110 - (52, 6, 3), // 0b0000000011011111 - (0, 1, 1), // 0b0000000011100000 - (10, 2, 1), // 0b0000000011100001 - (1, 1, 2), // 0b0000000011100010 - (20, 3, 1), // 0b0000000011100011 - (0, 1, 1), // 0b0000000011100100 - (11, 2, 2), // 0b0000000011100101 - (2, 1, 3), // 0b0000000011100110 - (30, 4, 1), // 0b0000000011100111 - (0, 1, 1), // 0b0000000011101000 - (10, 2, 1), // 0b0000000011101001 - (1, 1, 2), // 0b0000000011101010 - (21, 3, 2), // 0b0000000011101011 - (0, 1, 1), // 0b0000000011101100 - (12, 2, 3), // 0b0000000011101101 - (3, 1, 4), // 0b0000000011101110 - (43, 5, 4), // 0b0000000011101111 - (0, 1, 1), // 0b0000000011110000 - (10, 2, 1), // 0b0000000011110001 - (1, 1, 2), // 0b0000000011110010 - (20, 3, 1), // 0b0000000011110011 - (0, 1, 1), // 0b0000000011110100 - (11, 2, 2), // 0b0000000011110101 - (2, 1, 3), // 0b0000000011110110 - (34, 4, 5), // 0b0000000011110111 - (0, 1, 1), // 0b0000000011111000 - (10, 2, 1), // 0b0000000011111001 - (1, 1, 2), // 0b0000000011111010 - (25, 3, 6), // 0b0000000011111011 - (0, 1, 1), // 0b0000000011111100 - (16, 2, 7), // 0b0000000011111101 - (7, 1, 8), // 0b0000000011111110 - (77, 9, 1), // 0b0000000011111111 - (0, 1, 1), // 0b0000000100000000 - (10, 2, 1), // 0b0000000100000001 - (1, 1, 2), // 0b0000000100000010 - (20, 3, 1), // 0b0000000100000011 - (0, 1, 1), // 0b0000000100000100 - (11, 2, 2), // 0b0000000100000101 - (2, 1, 3), // 0b0000000100000110 - (30, 4, 1), // 0b0000000100000111 - (0, 1, 1), // 0b0000000100001000 - (10, 2, 1), // 0b0000000100001001 - (1, 1, 2), // 0b0000000100001010 - (21, 3, 2), // 0b0000000100001011 - (0, 1, 1), // 0b0000000100001100 - (12, 2, 3), // 0b0000000100001101 - (3, 1, 4), // 0b0000000100001110 - (40, 5, 1), // 0b0000000100001111 - (0, 1, 1), // 0b0000000100010000 - (10, 2, 1), // 0b0000000100010001 - (1, 1, 2), // 0b0000000100010010 - (20, 3, 1), // 0b0000000100010011 - (0, 1, 1), // 0b0000000100010100 - (11, 2, 2), // 0b0000000100010101 - (2, 1, 3), // 0b0000000100010110 - (31, 4, 2), // 0b0000000100010111 - (0, 1, 1), // 0b0000000100011000 - (10, 2, 1), // 0b0000000100011001 - (1, 1, 2), // 0b0000000100011010 - (22, 3, 3), // 0b0000000100011011 - (0, 1, 1), // 0b0000000100011100 - (13, 2, 4), // 0b0000000100011101 - (4, 1, 5), // 0b0000000100011110 - (50, 6, 1), // 0b0000000100011111 - (0, 1, 1), // 0b0000000100100000 - (10, 2, 1), // 0b0000000100100001 - (1, 1, 2), // 0b0000000100100010 - (20, 3, 1), // 0b0000000100100011 - (0, 1, 1), // 0b0000000100100100 - (11, 2, 2), // 0b0000000100100101 - (2, 1, 3), // 0b0000000100100110 - (30, 4, 1), // 0b0000000100100111 - (0, 1, 1), // 0b0000000100101000 - (10, 2, 1), // 0b0000000100101001 - (1, 1, 2), // 0b0000000100101010 - (21, 3, 2), // 0b0000000100101011 - (0, 1, 1), // 0b0000000100101100 - (12, 2, 3), // 0b0000000100101101 - (3, 1, 4), // 0b0000000100101110 - (41, 5, 2), // 0b0000000100101111 - (0, 1, 1), // 0b0000000100110000 - (10, 2, 1), // 0b0000000100110001 - (1, 1, 2), // 0b0000000100110010 - (20, 3, 1), // 0b0000000100110011 - (0, 1, 1), // 0b0000000100110100 - (11, 2, 2), // 0b0000000100110101 - (2, 1, 3), // 0b0000000100110110 - (32, 4, 3), // 0b0000000100110111 - (0, 1, 1), // 0b0000000100111000 - (10, 2, 1), // 0b0000000100111001 - (1, 1, 2), // 0b0000000100111010 - (23, 3, 4), // 0b0000000100111011 - (0, 1, 1), // 0b0000000100111100 - (14, 2, 5), // 0b0000000100111101 - (5, 1, 6), // 0b0000000100111110 - (60, 7, 1), // 0b0000000100111111 - (0, 1, 1), // 0b0000000101000000 - (10, 2, 1), // 0b0000000101000001 - (1, 1, 2), // 0b0000000101000010 - (20, 3, 1), // 0b0000000101000011 - (0, 1, 1), // 0b0000000101000100 - (11, 2, 2), // 0b0000000101000101 - (2, 1, 3), // 0b0000000101000110 - (30, 4, 1), // 0b0000000101000111 - (0, 1, 1), // 0b0000000101001000 - (10, 2, 1), // 0b0000000101001001 - (1, 1, 2), // 0b0000000101001010 - (21, 3, 2), // 0b0000000101001011 - (0, 1, 1), // 0b0000000101001100 - (12, 2, 3), // 0b0000000101001101 - (3, 1, 4), // 0b0000000101001110 - (40, 5, 1), // 0b0000000101001111 - (0, 1, 1), // 0b0000000101010000 - (10, 2, 1), // 0b0000000101010001 - (1, 1, 2), // 0b0000000101010010 - (20, 3, 1), // 0b0000000101010011 - (0, 1, 1), // 0b0000000101010100 - (11, 2, 2), // 0b0000000101010101 - (2, 1, 3), // 0b0000000101010110 - (31, 4, 2), // 0b0000000101010111 - (0, 1, 1), // 0b0000000101011000 - (10, 2, 1), // 0b0000000101011001 - (1, 1, 2), // 0b0000000101011010 - (22, 3, 3), // 0b0000000101011011 - (0, 1, 1), // 0b0000000101011100 - (13, 2, 4), // 0b0000000101011101 - (4, 1, 5), // 0b0000000101011110 - (51, 6, 2), // 0b0000000101011111 - (0, 1, 1), // 0b0000000101100000 - (10, 2, 1), // 0b0000000101100001 - (1, 1, 2), // 0b0000000101100010 - (20, 3, 1), // 0b0000000101100011 - (0, 1, 1), // 0b0000000101100100 - (11, 2, 2), // 0b0000000101100101 - (2, 1, 3), // 0b0000000101100110 - (30, 4, 1), // 0b0000000101100111 - (0, 1, 1), // 0b0000000101101000 - (10, 2, 1), // 0b0000000101101001 - (1, 1, 2), // 0b0000000101101010 - (21, 3, 2), // 0b0000000101101011 - (0, 1, 1), // 0b0000000101101100 - (12, 2, 3), // 0b0000000101101101 - (3, 1, 4), // 0b0000000101101110 - (42, 5, 3), // 0b0000000101101111 - (0, 1, 1), // 0b0000000101110000 - (10, 2, 1), // 0b0000000101110001 - (1, 1, 2), // 0b0000000101110010 - (20, 3, 1), // 0b0000000101110011 - (0, 1, 1), // 0b0000000101110100 - (11, 2, 2), // 0b0000000101110101 - (2, 1, 3), // 0b0000000101110110 - (33, 4, 4), // 0b0000000101110111 - (0, 1, 1), // 0b0000000101111000 - (10, 2, 1), // 0b0000000101111001 - (1, 1, 2), // 0b0000000101111010 - (24, 3, 5), // 0b0000000101111011 - (0, 1, 1), // 0b0000000101111100 - (15, 2, 6), // 0b0000000101111101 - (6, 1, 7), // 0b0000000101111110 - (70, 8, 2), // 0b0000000101111111 - (0, 1, 1), // 0b0000000110000000 - (10, 2, 1), // 0b0000000110000001 - (1, 1, 2), // 0b0000000110000010 - (20, 3, 1), // 0b0000000110000011 - (0, 1, 1), // 0b0000000110000100 - (11, 2, 2), // 0b0000000110000101 - (2, 1, 3), // 0b0000000110000110 - (30, 4, 1), // 0b0000000110000111 - (0, 1, 1), // 0b0000000110001000 - (10, 2, 1), // 0b0000000110001001 - (1, 1, 2), // 0b0000000110001010 - (21, 3, 2), // 0b0000000110001011 - (0, 1, 1), // 0b0000000110001100 - (12, 2, 3), // 0b0000000110001101 - (3, 1, 4), // 0b0000000110001110 - (40, 5, 1), // 0b0000000110001111 - (0, 1, 1), // 0b0000000110010000 - (10, 2, 1), // 0b0000000110010001 - (1, 1, 2), // 0b0000000110010010 - (20, 3, 1), // 0b0000000110010011 - (0, 1, 1), // 0b0000000110010100 - (11, 2, 2), // 0b0000000110010101 - (2, 1, 3), // 0b0000000110010110 - (31, 4, 2), // 0b0000000110010111 - (0, 1, 1), // 0b0000000110011000 - (10, 2, 1), // 0b0000000110011001 - (1, 1, 2), // 0b0000000110011010 - (22, 3, 3), // 0b0000000110011011 - (0, 1, 1), // 0b0000000110011100 - (13, 2, 4), // 0b0000000110011101 - (4, 1, 5), // 0b0000000110011110 - (50, 6, 1), // 0b0000000110011111 - (0, 1, 1), // 0b0000000110100000 - (10, 2, 1), // 0b0000000110100001 - (1, 1, 2), // 0b0000000110100010 - (20, 3, 1), // 0b0000000110100011 - (0, 1, 1), // 0b0000000110100100 - (11, 2, 2), // 0b0000000110100101 - (2, 1, 3), // 0b0000000110100110 - (30, 4, 1), // 0b0000000110100111 - (0, 1, 1), // 0b0000000110101000 - (10, 2, 1), // 0b0000000110101001 - (1, 1, 2), // 0b0000000110101010 - (21, 3, 2), // 0b0000000110101011 - (0, 1, 1), // 0b0000000110101100 - (12, 2, 3), // 0b0000000110101101 - (3, 1, 4), // 0b0000000110101110 - (41, 5, 2), // 0b0000000110101111 - (0, 1, 1), // 0b0000000110110000 - (10, 2, 1), // 0b0000000110110001 - (1, 1, 2), // 0b0000000110110010 - (20, 3, 1), // 0b0000000110110011 - (0, 1, 1), // 0b0000000110110100 - (11, 2, 2), // 0b0000000110110101 - (2, 1, 3), // 0b0000000110110110 - (32, 4, 3), // 0b0000000110110111 - (0, 1, 1), // 0b0000000110111000 - (10, 2, 1), // 0b0000000110111001 - (1, 1, 2), // 0b0000000110111010 - (23, 3, 4), // 0b0000000110111011 - (0, 1, 1), // 0b0000000110111100 - (14, 2, 5), // 0b0000000110111101 - (5, 1, 6), // 0b0000000110111110 - (62, 7, 3), // 0b0000000110111111 - (0, 1, 1), // 0b0000000111000000 - (10, 2, 1), // 0b0000000111000001 - (1, 1, 2), // 0b0000000111000010 - (20, 3, 1), // 0b0000000111000011 - (0, 1, 1), // 0b0000000111000100 - (11, 2, 2), // 0b0000000111000101 - (2, 1, 3), // 0b0000000111000110 - (30, 4, 1), // 0b0000000111000111 - (0, 1, 1), // 0b0000000111001000 - (10, 2, 1), // 0b0000000111001001 - (1, 1, 2), // 0b0000000111001010 - (21, 3, 2), // 0b0000000111001011 - (0, 1, 1), // 0b0000000111001100 - (12, 2, 3), // 0b0000000111001101 - (3, 1, 4), // 0b0000000111001110 - (40, 5, 1), // 0b0000000111001111 - (0, 1, 1), // 0b0000000111010000 - (10, 2, 1), // 0b0000000111010001 - (1, 1, 2), // 0b0000000111010010 - (20, 3, 1), // 0b0000000111010011 - (0, 1, 1), // 0b0000000111010100 - (11, 2, 2), // 0b0000000111010101 - (2, 1, 3), // 0b0000000111010110 - (31, 4, 2), // 0b0000000111010111 - (0, 1, 1), // 0b0000000111011000 - (10, 2, 1), // 0b0000000111011001 - (1, 1, 2), // 0b0000000111011010 - (22, 3, 3), // 0b0000000111011011 - (0, 1, 1), // 0b0000000111011100 - (13, 2, 4), // 0b0000000111011101 - (4, 1, 5), // 0b0000000111011110 - (53, 6, 4), // 0b0000000111011111 - (0, 1, 1), // 0b0000000111100000 - (10, 2, 1), // 0b0000000111100001 - (1, 1, 2), // 0b0000000111100010 - (20, 3, 1), // 0b0000000111100011 - (0, 1, 1), // 0b0000000111100100 - (11, 2, 2), // 0b0000000111100101 - (2, 1, 3), // 0b0000000111100110 - (30, 4, 1), // 0b0000000111100111 - (0, 1, 1), // 0b0000000111101000 - (10, 2, 1), // 0b0000000111101001 - (1, 1, 2), // 0b0000000111101010 - (21, 3, 2), // 0b0000000111101011 - (0, 1, 1), // 0b0000000111101100 - (12, 2, 3), // 0b0000000111101101 - (3, 1, 4), // 0b0000000111101110 - (44, 5, 5), // 0b0000000111101111 - (0, 1, 1), // 0b0000000111110000 - (10, 2, 1), // 0b0000000111110001 - (1, 1, 2), // 0b0000000111110010 - (20, 3, 1), // 0b0000000111110011 - (0, 1, 1), // 0b0000000111110100 - (11, 2, 2), // 0b0000000111110101 - (2, 1, 3), // 0b0000000111110110 - (35, 4, 6), // 0b0000000111110111 - (0, 1, 1), // 0b0000000111111000 - (10, 2, 1), // 0b0000000111111001 - (1, 1, 2), // 0b0000000111111010 - (26, 3, 7), // 0b0000000111111011 - (0, 1, 1), // 0b0000000111111100 - (17, 2, 8), // 0b0000000111111101 - (8, 1, 9), // 0b0000000111111110 - (84, 10, 1), // 0b0000000111111111 - (0, 1, 1), // 0b0000001000000000 - (10, 2, 1), // 0b0000001000000001 - (1, 1, 2), // 0b0000001000000010 - (20, 3, 1), // 0b0000001000000011 - (0, 1, 1), // 0b0000001000000100 - (11, 2, 2), // 0b0000001000000101 - (2, 1, 3), // 0b0000001000000110 - (30, 4, 1), // 0b0000001000000111 - (0, 1, 1), // 0b0000001000001000 - (10, 2, 1), // 0b0000001000001001 - (1, 1, 2), // 0b0000001000001010 - (21, 3, 2), // 0b0000001000001011 - (0, 1, 1), // 0b0000001000001100 - (12, 2, 3), // 0b0000001000001101 - (3, 1, 4), // 0b0000001000001110 - (40, 5, 1), // 0b0000001000001111 - (0, 1, 1), // 0b0000001000010000 - (10, 2, 1), // 0b0000001000010001 - (1, 1, 2), // 0b0000001000010010 - (20, 3, 1), // 0b0000001000010011 - (0, 1, 1), // 0b0000001000010100 - (11, 2, 2), // 0b0000001000010101 - (2, 1, 3), // 0b0000001000010110 - (31, 4, 2), // 0b0000001000010111 - (0, 1, 1), // 0b0000001000011000 - (10, 2, 1), // 0b0000001000011001 - (1, 1, 2), // 0b0000001000011010 - (22, 3, 3), // 0b0000001000011011 - (0, 1, 1), // 0b0000001000011100 - (13, 2, 4), // 0b0000001000011101 - (4, 1, 5), // 0b0000001000011110 - (50, 6, 1), // 0b0000001000011111 - (0, 1, 1), // 0b0000001000100000 - (10, 2, 1), // 0b0000001000100001 - (1, 1, 2), // 0b0000001000100010 - (20, 3, 1), // 0b0000001000100011 - (0, 1, 1), // 0b0000001000100100 - (11, 2, 2), // 0b0000001000100101 - (2, 1, 3), // 0b0000001000100110 - (30, 4, 1), // 0b0000001000100111 - (0, 1, 1), // 0b0000001000101000 - (10, 2, 1), // 0b0000001000101001 - (1, 1, 2), // 0b0000001000101010 - (21, 3, 2), // 0b0000001000101011 - (0, 1, 1), // 0b0000001000101100 - (12, 2, 3), // 0b0000001000101101 - (3, 1, 4), // 0b0000001000101110 - (41, 5, 2), // 0b0000001000101111 - (0, 1, 1), // 0b0000001000110000 - (10, 2, 1), // 0b0000001000110001 - (1, 1, 2), // 0b0000001000110010 - (20, 3, 1), // 0b0000001000110011 - (0, 1, 1), // 0b0000001000110100 - (11, 2, 2), // 0b0000001000110101 - (2, 1, 3), // 0b0000001000110110 - (32, 4, 3), // 0b0000001000110111 - (0, 1, 1), // 0b0000001000111000 - (10, 2, 1), // 0b0000001000111001 - (1, 1, 2), // 0b0000001000111010 - (23, 3, 4), // 0b0000001000111011 - (0, 1, 1), // 0b0000001000111100 - (14, 2, 5), // 0b0000001000111101 - (5, 1, 6), // 0b0000001000111110 - (60, 7, 1), // 0b0000001000111111 - (0, 1, 1), // 0b0000001001000000 - (10, 2, 1), // 0b0000001001000001 - (1, 1, 2), // 0b0000001001000010 - (20, 3, 1), // 0b0000001001000011 - (0, 1, 1), // 0b0000001001000100 - (11, 2, 2), // 0b0000001001000101 - (2, 1, 3), // 0b0000001001000110 - (30, 4, 1), // 0b0000001001000111 - (0, 1, 1), // 0b0000001001001000 - (10, 2, 1), // 0b0000001001001001 - (1, 1, 2), // 0b0000001001001010 - (21, 3, 2), // 0b0000001001001011 - (0, 1, 1), // 0b0000001001001100 - (12, 2, 3), // 0b0000001001001101 - (3, 1, 4), // 0b0000001001001110 - (40, 5, 1), // 0b0000001001001111 - (0, 1, 1), // 0b0000001001010000 - (10, 2, 1), // 0b0000001001010001 - (1, 1, 2), // 0b0000001001010010 - (20, 3, 1), // 0b0000001001010011 - (0, 1, 1), // 0b0000001001010100 - (11, 2, 2), // 0b0000001001010101 - (2, 1, 3), // 0b0000001001010110 - (31, 4, 2), // 0b0000001001010111 - (0, 1, 1), // 0b0000001001011000 - (10, 2, 1), // 0b0000001001011001 - (1, 1, 2), // 0b0000001001011010 - (22, 3, 3), // 0b0000001001011011 - (0, 1, 1), // 0b0000001001011100 - (13, 2, 4), // 0b0000001001011101 - (4, 1, 5), // 0b0000001001011110 - (51, 6, 2), // 0b0000001001011111 - (0, 1, 1), // 0b0000001001100000 - (10, 2, 1), // 0b0000001001100001 - (1, 1, 2), // 0b0000001001100010 - (20, 3, 1), // 0b0000001001100011 - (0, 1, 1), // 0b0000001001100100 - (11, 2, 2), // 0b0000001001100101 - (2, 1, 3), // 0b0000001001100110 - (30, 4, 1), // 0b0000001001100111 - (0, 1, 1), // 0b0000001001101000 - (10, 2, 1), // 0b0000001001101001 - (1, 1, 2), // 0b0000001001101010 - (21, 3, 2), // 0b0000001001101011 - (0, 1, 1), // 0b0000001001101100 - (12, 2, 3), // 0b0000001001101101 - (3, 1, 4), // 0b0000001001101110 - (42, 5, 3), // 0b0000001001101111 - (0, 1, 1), // 0b0000001001110000 - (10, 2, 1), // 0b0000001001110001 - (1, 1, 2), // 0b0000001001110010 - (20, 3, 1), // 0b0000001001110011 - (0, 1, 1), // 0b0000001001110100 - (11, 2, 2), // 0b0000001001110101 - (2, 1, 3), // 0b0000001001110110 - (33, 4, 4), // 0b0000001001110111 - (0, 1, 1), // 0b0000001001111000 - (10, 2, 1), // 0b0000001001111001 - (1, 1, 2), // 0b0000001001111010 - (24, 3, 5), // 0b0000001001111011 - (0, 1, 1), // 0b0000001001111100 - (15, 2, 6), // 0b0000001001111101 - (6, 1, 7), // 0b0000001001111110 - (69, 8, 1), // 0b0000001001111111 - (0, 1, 1), // 0b0000001010000000 - (10, 2, 1), // 0b0000001010000001 - (1, 1, 2), // 0b0000001010000010 - (20, 3, 1), // 0b0000001010000011 - (0, 1, 1), // 0b0000001010000100 - (11, 2, 2), // 0b0000001010000101 - (2, 1, 3), // 0b0000001010000110 - (30, 4, 1), // 0b0000001010000111 - (0, 1, 1), // 0b0000001010001000 - (10, 2, 1), // 0b0000001010001001 - (1, 1, 2), // 0b0000001010001010 - (21, 3, 2), // 0b0000001010001011 - (0, 1, 1), // 0b0000001010001100 - (12, 2, 3), // 0b0000001010001101 - (3, 1, 4), // 0b0000001010001110 - (40, 5, 1), // 0b0000001010001111 - (0, 1, 1), // 0b0000001010010000 - (10, 2, 1), // 0b0000001010010001 - (1, 1, 2), // 0b0000001010010010 - (20, 3, 1), // 0b0000001010010011 - (0, 1, 1), // 0b0000001010010100 - (11, 2, 2), // 0b0000001010010101 - (2, 1, 3), // 0b0000001010010110 - (31, 4, 2), // 0b0000001010010111 - (0, 1, 1), // 0b0000001010011000 - (10, 2, 1), // 0b0000001010011001 - (1, 1, 2), // 0b0000001010011010 - (22, 3, 3), // 0b0000001010011011 - (0, 1, 1), // 0b0000001010011100 - (13, 2, 4), // 0b0000001010011101 - (4, 1, 5), // 0b0000001010011110 - (50, 6, 1), // 0b0000001010011111 - (0, 1, 1), // 0b0000001010100000 - (10, 2, 1), // 0b0000001010100001 - (1, 1, 2), // 0b0000001010100010 - (20, 3, 1), // 0b0000001010100011 - (0, 1, 1), // 0b0000001010100100 - (11, 2, 2), // 0b0000001010100101 - (2, 1, 3), // 0b0000001010100110 - (30, 4, 1), // 0b0000001010100111 - (0, 1, 1), // 0b0000001010101000 - (10, 2, 1), // 0b0000001010101001 - (1, 1, 2), // 0b0000001010101010 - (21, 3, 2), // 0b0000001010101011 - (0, 1, 1), // 0b0000001010101100 - (12, 2, 3), // 0b0000001010101101 - (3, 1, 4), // 0b0000001010101110 - (41, 5, 2), // 0b0000001010101111 - (0, 1, 1), // 0b0000001010110000 - (10, 2, 1), // 0b0000001010110001 - (1, 1, 2), // 0b0000001010110010 - (20, 3, 1), // 0b0000001010110011 - (0, 1, 1), // 0b0000001010110100 - (11, 2, 2), // 0b0000001010110101 - (2, 1, 3), // 0b0000001010110110 - (32, 4, 3), // 0b0000001010110111 - (0, 1, 1), // 0b0000001010111000 - (10, 2, 1), // 0b0000001010111001 - (1, 1, 2), // 0b0000001010111010 - (23, 3, 4), // 0b0000001010111011 - (0, 1, 1), // 0b0000001010111100 - (14, 2, 5), // 0b0000001010111101 - (5, 1, 6), // 0b0000001010111110 - (61, 7, 2), // 0b0000001010111111 - (0, 1, 1), // 0b0000001011000000 - (10, 2, 1), // 0b0000001011000001 - (1, 1, 2), // 0b0000001011000010 - (20, 3, 1), // 0b0000001011000011 - (0, 1, 1), // 0b0000001011000100 - (11, 2, 2), // 0b0000001011000101 - (2, 1, 3), // 0b0000001011000110 - (30, 4, 1), // 0b0000001011000111 - (0, 1, 1), // 0b0000001011001000 - (10, 2, 1), // 0b0000001011001001 - (1, 1, 2), // 0b0000001011001010 - (21, 3, 2), // 0b0000001011001011 - (0, 1, 1), // 0b0000001011001100 - (12, 2, 3), // 0b0000001011001101 - (3, 1, 4), // 0b0000001011001110 - (40, 5, 1), // 0b0000001011001111 - (0, 1, 1), // 0b0000001011010000 - (10, 2, 1), // 0b0000001011010001 - (1, 1, 2), // 0b0000001011010010 - (20, 3, 1), // 0b0000001011010011 - (0, 1, 1), // 0b0000001011010100 - (11, 2, 2), // 0b0000001011010101 - (2, 1, 3), // 0b0000001011010110 - (31, 4, 2), // 0b0000001011010111 - (0, 1, 1), // 0b0000001011011000 - (10, 2, 1), // 0b0000001011011001 - (1, 1, 2), // 0b0000001011011010 - (22, 3, 3), // 0b0000001011011011 - (0, 1, 1), // 0b0000001011011100 - (13, 2, 4), // 0b0000001011011101 - (4, 1, 5), // 0b0000001011011110 - (52, 6, 3), // 0b0000001011011111 - (0, 1, 1), // 0b0000001011100000 - (10, 2, 1), // 0b0000001011100001 - (1, 1, 2), // 0b0000001011100010 - (20, 3, 1), // 0b0000001011100011 - (0, 1, 1), // 0b0000001011100100 - (11, 2, 2), // 0b0000001011100101 - (2, 1, 3), // 0b0000001011100110 - (30, 4, 1), // 0b0000001011100111 - (0, 1, 1), // 0b0000001011101000 - (10, 2, 1), // 0b0000001011101001 - (1, 1, 2), // 0b0000001011101010 - (21, 3, 2), // 0b0000001011101011 - (0, 1, 1), // 0b0000001011101100 - (12, 2, 3), // 0b0000001011101101 - (3, 1, 4), // 0b0000001011101110 - (43, 5, 4), // 0b0000001011101111 - (0, 1, 1), // 0b0000001011110000 - (10, 2, 1), // 0b0000001011110001 - (1, 1, 2), // 0b0000001011110010 - (20, 3, 1), // 0b0000001011110011 - (0, 1, 1), // 0b0000001011110100 - (11, 2, 2), // 0b0000001011110101 - (2, 1, 3), // 0b0000001011110110 - (34, 4, 5), // 0b0000001011110111 - (0, 1, 1), // 0b0000001011111000 - (10, 2, 1), // 0b0000001011111001 - (1, 1, 2), // 0b0000001011111010 - (25, 3, 6), // 0b0000001011111011 - (0, 1, 1), // 0b0000001011111100 - (16, 2, 7), // 0b0000001011111101 - (7, 1, 8), // 0b0000001011111110 - (78, 9, 2), // 0b0000001011111111 - (0, 1, 1), // 0b0000001100000000 - (10, 2, 1), // 0b0000001100000001 - (1, 1, 2), // 0b0000001100000010 - (20, 3, 1), // 0b0000001100000011 - (0, 1, 1), // 0b0000001100000100 - (11, 2, 2), // 0b0000001100000101 - (2, 1, 3), // 0b0000001100000110 - (30, 4, 1), // 0b0000001100000111 - (0, 1, 1), // 0b0000001100001000 - (10, 2, 1), // 0b0000001100001001 - (1, 1, 2), // 0b0000001100001010 - (21, 3, 2), // 0b0000001100001011 - (0, 1, 1), // 0b0000001100001100 - (12, 2, 3), // 0b0000001100001101 - (3, 1, 4), // 0b0000001100001110 - (40, 5, 1), // 0b0000001100001111 - (0, 1, 1), // 0b0000001100010000 - (10, 2, 1), // 0b0000001100010001 - (1, 1, 2), // 0b0000001100010010 - (20, 3, 1), // 0b0000001100010011 - (0, 1, 1), // 0b0000001100010100 - (11, 2, 2), // 0b0000001100010101 - (2, 1, 3), // 0b0000001100010110 - (31, 4, 2), // 0b0000001100010111 - (0, 1, 1), // 0b0000001100011000 - (10, 2, 1), // 0b0000001100011001 - (1, 1, 2), // 0b0000001100011010 - (22, 3, 3), // 0b0000001100011011 - (0, 1, 1), // 0b0000001100011100 - (13, 2, 4), // 0b0000001100011101 - (4, 1, 5), // 0b0000001100011110 - (50, 6, 1), // 0b0000001100011111 - (0, 1, 1), // 0b0000001100100000 - (10, 2, 1), // 0b0000001100100001 - (1, 1, 2), // 0b0000001100100010 - (20, 3, 1), // 0b0000001100100011 - (0, 1, 1), // 0b0000001100100100 - (11, 2, 2), // 0b0000001100100101 - (2, 1, 3), // 0b0000001100100110 - (30, 4, 1), // 0b0000001100100111 - (0, 1, 1), // 0b0000001100101000 - (10, 2, 1), // 0b0000001100101001 - (1, 1, 2), // 0b0000001100101010 - (21, 3, 2), // 0b0000001100101011 - (0, 1, 1), // 0b0000001100101100 - (12, 2, 3), // 0b0000001100101101 - (3, 1, 4), // 0b0000001100101110 - (41, 5, 2), // 0b0000001100101111 - (0, 1, 1), // 0b0000001100110000 - (10, 2, 1), // 0b0000001100110001 - (1, 1, 2), // 0b0000001100110010 - (20, 3, 1), // 0b0000001100110011 - (0, 1, 1), // 0b0000001100110100 - (11, 2, 2), // 0b0000001100110101 - (2, 1, 3), // 0b0000001100110110 - (32, 4, 3), // 0b0000001100110111 - (0, 1, 1), // 0b0000001100111000 - (10, 2, 1), // 0b0000001100111001 - (1, 1, 2), // 0b0000001100111010 - (23, 3, 4), // 0b0000001100111011 - (0, 1, 1), // 0b0000001100111100 - (14, 2, 5), // 0b0000001100111101 - (5, 1, 6), // 0b0000001100111110 - (60, 7, 1), // 0b0000001100111111 - (0, 1, 1), // 0b0000001101000000 - (10, 2, 1), // 0b0000001101000001 - (1, 1, 2), // 0b0000001101000010 - (20, 3, 1), // 0b0000001101000011 - (0, 1, 1), // 0b0000001101000100 - (11, 2, 2), // 0b0000001101000101 - (2, 1, 3), // 0b0000001101000110 - (30, 4, 1), // 0b0000001101000111 - (0, 1, 1), // 0b0000001101001000 - (10, 2, 1), // 0b0000001101001001 - (1, 1, 2), // 0b0000001101001010 - (21, 3, 2), // 0b0000001101001011 - (0, 1, 1), // 0b0000001101001100 - (12, 2, 3), // 0b0000001101001101 - (3, 1, 4), // 0b0000001101001110 - (40, 5, 1), // 0b0000001101001111 - (0, 1, 1), // 0b0000001101010000 - (10, 2, 1), // 0b0000001101010001 - (1, 1, 2), // 0b0000001101010010 - (20, 3, 1), // 0b0000001101010011 - (0, 1, 1), // 0b0000001101010100 - (11, 2, 2), // 0b0000001101010101 - (2, 1, 3), // 0b0000001101010110 - (31, 4, 2), // 0b0000001101010111 - (0, 1, 1), // 0b0000001101011000 - (10, 2, 1), // 0b0000001101011001 - (1, 1, 2), // 0b0000001101011010 - (22, 3, 3), // 0b0000001101011011 - (0, 1, 1), // 0b0000001101011100 - (13, 2, 4), // 0b0000001101011101 - (4, 1, 5), // 0b0000001101011110 - (51, 6, 2), // 0b0000001101011111 - (0, 1, 1), // 0b0000001101100000 - (10, 2, 1), // 0b0000001101100001 - (1, 1, 2), // 0b0000001101100010 - (20, 3, 1), // 0b0000001101100011 - (0, 1, 1), // 0b0000001101100100 - (11, 2, 2), // 0b0000001101100101 - (2, 1, 3), // 0b0000001101100110 - (30, 4, 1), // 0b0000001101100111 - (0, 1, 1), // 0b0000001101101000 - (10, 2, 1), // 0b0000001101101001 - (1, 1, 2), // 0b0000001101101010 - (21, 3, 2), // 0b0000001101101011 - (0, 1, 1), // 0b0000001101101100 - (12, 2, 3), // 0b0000001101101101 - (3, 1, 4), // 0b0000001101101110 - (42, 5, 3), // 0b0000001101101111 - (0, 1, 1), // 0b0000001101110000 - (10, 2, 1), // 0b0000001101110001 - (1, 1, 2), // 0b0000001101110010 - (20, 3, 1), // 0b0000001101110011 - (0, 1, 1), // 0b0000001101110100 - (11, 2, 2), // 0b0000001101110101 - (2, 1, 3), // 0b0000001101110110 - (33, 4, 4), // 0b0000001101110111 - (0, 1, 1), // 0b0000001101111000 - (10, 2, 1), // 0b0000001101111001 - (1, 1, 2), // 0b0000001101111010 - (24, 3, 5), // 0b0000001101111011 - (0, 1, 1), // 0b0000001101111100 - (15, 2, 6), // 0b0000001101111101 - (6, 1, 7), // 0b0000001101111110 - (71, 8, 3), // 0b0000001101111111 - (0, 1, 1), // 0b0000001110000000 - (10, 2, 1), // 0b0000001110000001 - (1, 1, 2), // 0b0000001110000010 - (20, 3, 1), // 0b0000001110000011 - (0, 1, 1), // 0b0000001110000100 - (11, 2, 2), // 0b0000001110000101 - (2, 1, 3), // 0b0000001110000110 - (30, 4, 1), // 0b0000001110000111 - (0, 1, 1), // 0b0000001110001000 - (10, 2, 1), // 0b0000001110001001 - (1, 1, 2), // 0b0000001110001010 - (21, 3, 2), // 0b0000001110001011 - (0, 1, 1), // 0b0000001110001100 - (12, 2, 3), // 0b0000001110001101 - (3, 1, 4), // 0b0000001110001110 - (40, 5, 1), // 0b0000001110001111 - (0, 1, 1), // 0b0000001110010000 - (10, 2, 1), // 0b0000001110010001 - (1, 1, 2), // 0b0000001110010010 - (20, 3, 1), // 0b0000001110010011 - (0, 1, 1), // 0b0000001110010100 - (11, 2, 2), // 0b0000001110010101 - (2, 1, 3), // 0b0000001110010110 - (31, 4, 2), // 0b0000001110010111 - (0, 1, 1), // 0b0000001110011000 - (10, 2, 1), // 0b0000001110011001 - (1, 1, 2), // 0b0000001110011010 - (22, 3, 3), // 0b0000001110011011 - (0, 1, 1), // 0b0000001110011100 - (13, 2, 4), // 0b0000001110011101 - (4, 1, 5), // 0b0000001110011110 - (50, 6, 1), // 0b0000001110011111 - (0, 1, 1), // 0b0000001110100000 - (10, 2, 1), // 0b0000001110100001 - (1, 1, 2), // 0b0000001110100010 - (20, 3, 1), // 0b0000001110100011 - (0, 1, 1), // 0b0000001110100100 - (11, 2, 2), // 0b0000001110100101 - (2, 1, 3), // 0b0000001110100110 - (30, 4, 1), // 0b0000001110100111 - (0, 1, 1), // 0b0000001110101000 - (10, 2, 1), // 0b0000001110101001 - (1, 1, 2), // 0b0000001110101010 - (21, 3, 2), // 0b0000001110101011 - (0, 1, 1), // 0b0000001110101100 - (12, 2, 3), // 0b0000001110101101 - (3, 1, 4), // 0b0000001110101110 - (41, 5, 2), // 0b0000001110101111 - (0, 1, 1), // 0b0000001110110000 - (10, 2, 1), // 0b0000001110110001 - (1, 1, 2), // 0b0000001110110010 - (20, 3, 1), // 0b0000001110110011 - (0, 1, 1), // 0b0000001110110100 - (11, 2, 2), // 0b0000001110110101 - (2, 1, 3), // 0b0000001110110110 - (32, 4, 3), // 0b0000001110110111 - (0, 1, 1), // 0b0000001110111000 - (10, 2, 1), // 0b0000001110111001 - (1, 1, 2), // 0b0000001110111010 - (23, 3, 4), // 0b0000001110111011 - (0, 1, 1), // 0b0000001110111100 - (14, 2, 5), // 0b0000001110111101 - (5, 1, 6), // 0b0000001110111110 - (63, 7, 4), // 0b0000001110111111 - (0, 1, 1), // 0b0000001111000000 - (10, 2, 1), // 0b0000001111000001 - (1, 1, 2), // 0b0000001111000010 - (20, 3, 1), // 0b0000001111000011 - (0, 1, 1), // 0b0000001111000100 - (11, 2, 2), // 0b0000001111000101 - (2, 1, 3), // 0b0000001111000110 - (30, 4, 1), // 0b0000001111000111 - (0, 1, 1), // 0b0000001111001000 - (10, 2, 1), // 0b0000001111001001 - (1, 1, 2), // 0b0000001111001010 - (21, 3, 2), // 0b0000001111001011 - (0, 1, 1), // 0b0000001111001100 - (12, 2, 3), // 0b0000001111001101 - (3, 1, 4), // 0b0000001111001110 - (40, 5, 1), // 0b0000001111001111 - (0, 1, 1), // 0b0000001111010000 - (10, 2, 1), // 0b0000001111010001 - (1, 1, 2), // 0b0000001111010010 - (20, 3, 1), // 0b0000001111010011 - (0, 1, 1), // 0b0000001111010100 - (11, 2, 2), // 0b0000001111010101 - (2, 1, 3), // 0b0000001111010110 - (31, 4, 2), // 0b0000001111010111 - (0, 1, 1), // 0b0000001111011000 - (10, 2, 1), // 0b0000001111011001 - (1, 1, 2), // 0b0000001111011010 - (22, 3, 3), // 0b0000001111011011 - (0, 1, 1), // 0b0000001111011100 - (13, 2, 4), // 0b0000001111011101 - (4, 1, 5), // 0b0000001111011110 - (54, 6, 5), // 0b0000001111011111 - (0, 1, 1), // 0b0000001111100000 - (10, 2, 1), // 0b0000001111100001 - (1, 1, 2), // 0b0000001111100010 - (20, 3, 1), // 0b0000001111100011 - (0, 1, 1), // 0b0000001111100100 - (11, 2, 2), // 0b0000001111100101 - (2, 1, 3), // 0b0000001111100110 - (30, 4, 1), // 0b0000001111100111 - (0, 1, 1), // 0b0000001111101000 - (10, 2, 1), // 0b0000001111101001 - (1, 1, 2), // 0b0000001111101010 - (21, 3, 2), // 0b0000001111101011 - (0, 1, 1), // 0b0000001111101100 - (12, 2, 3), // 0b0000001111101101 - (3, 1, 4), // 0b0000001111101110 - (45, 5, 6), // 0b0000001111101111 - (0, 1, 1), // 0b0000001111110000 - (10, 2, 1), // 0b0000001111110001 - (1, 1, 2), // 0b0000001111110010 - (20, 3, 1), // 0b0000001111110011 - (0, 1, 1), // 0b0000001111110100 - (11, 2, 2), // 0b0000001111110101 - (2, 1, 3), // 0b0000001111110110 - (36, 4, 7), // 0b0000001111110111 - (0, 1, 1), // 0b0000001111111000 - (10, 2, 1), // 0b0000001111111001 - (1, 1, 2), // 0b0000001111111010 - (27, 3, 8), // 0b0000001111111011 - (0, 1, 1), // 0b0000001111111100 - (18, 2, 9), // 0b0000001111111101 - (9, 1, 10), // 0b0000001111111110 - (84, 11, 1) // 0b0000001111111111 + 0, 1, 1, 0, // 0b0000000000000000 + 10, 2, 1, 0, // 0b0000000000000001 + 1, 1, 2, 0, // 0b0000000000000010 + 20, 3, 1, 0, // 0b0000000000000011 + 0, 1, 1, 0, // 0b0000000000000100 + 11, 2, 2, 0, // 0b0000000000000101 + 2, 1, 3, 0, // 0b0000000000000110 + 30, 4, 1, 0, // 0b0000000000000111 + 0, 1, 1, 0, // 0b0000000000001000 + 10, 2, 1, 0, // 0b0000000000001001 + 1, 1, 2, 0, // 0b0000000000001010 + 21, 3, 2, 0, // 0b0000000000001011 + 0, 1, 1, 0, // 0b0000000000001100 + 12, 2, 3, 0, // 0b0000000000001101 + 3, 1, 4, 0, // 0b0000000000001110 + 40, 5, 1, 0, // 0b0000000000001111 + 0, 1, 1, 0, // 0b0000000000010000 + 10, 2, 1, 0, // 0b0000000000010001 + 1, 1, 2, 0, // 0b0000000000010010 + 20, 3, 1, 0, // 0b0000000000010011 + 0, 1, 1, 0, // 0b0000000000010100 + 11, 2, 2, 0, // 0b0000000000010101 + 2, 1, 3, 0, // 0b0000000000010110 + 31, 4, 2, 0, // 0b0000000000010111 + 0, 1, 1, 0, // 0b0000000000011000 + 10, 2, 1, 0, // 0b0000000000011001 + 1, 1, 2, 0, // 0b0000000000011010 + 22, 3, 3, 0, // 0b0000000000011011 + 0, 1, 1, 0, // 0b0000000000011100 + 13, 2, 4, 0, // 0b0000000000011101 + 4, 1, 5, 0, // 0b0000000000011110 + 50, 6, 1, 0, // 0b0000000000011111 + 0, 1, 1, 0, // 0b0000000000100000 + 10, 2, 1, 0, // 0b0000000000100001 + 1, 1, 2, 0, // 0b0000000000100010 + 20, 3, 1, 0, // 0b0000000000100011 + 0, 1, 1, 0, // 0b0000000000100100 + 11, 2, 2, 0, // 0b0000000000100101 + 2, 1, 3, 0, // 0b0000000000100110 + 30, 4, 1, 0, // 0b0000000000100111 + 0, 1, 1, 0, // 0b0000000000101000 + 10, 2, 1, 0, // 0b0000000000101001 + 1, 1, 2, 0, // 0b0000000000101010 + 21, 3, 2, 0, // 0b0000000000101011 + 0, 1, 1, 0, // 0b0000000000101100 + 12, 2, 3, 0, // 0b0000000000101101 + 3, 1, 4, 0, // 0b0000000000101110 + 41, 5, 2, 0, // 0b0000000000101111 + 0, 1, 1, 0, // 0b0000000000110000 + 10, 2, 1, 0, // 0b0000000000110001 + 1, 1, 2, 0, // 0b0000000000110010 + 20, 3, 1, 0, // 0b0000000000110011 + 0, 1, 1, 0, // 0b0000000000110100 + 11, 2, 2, 0, // 0b0000000000110101 + 2, 1, 3, 0, // 0b0000000000110110 + 32, 4, 3, 0, // 0b0000000000110111 + 0, 1, 1, 0, // 0b0000000000111000 + 10, 2, 1, 0, // 0b0000000000111001 + 1, 1, 2, 0, // 0b0000000000111010 + 23, 3, 4, 0, // 0b0000000000111011 + 0, 1, 1, 0, // 0b0000000000111100 + 14, 2, 5, 0, // 0b0000000000111101 + 5, 1, 6, 0, // 0b0000000000111110 + 60, 7, 1, 0, // 0b0000000000111111 + 0, 1, 1, 0, // 0b0000000001000000 + 10, 2, 1, 0, // 0b0000000001000001 + 1, 1, 2, 0, // 0b0000000001000010 + 20, 3, 1, 0, // 0b0000000001000011 + 0, 1, 1, 0, // 0b0000000001000100 + 11, 2, 2, 0, // 0b0000000001000101 + 2, 1, 3, 0, // 0b0000000001000110 + 30, 4, 1, 0, // 0b0000000001000111 + 0, 1, 1, 0, // 0b0000000001001000 + 10, 2, 1, 0, // 0b0000000001001001 + 1, 1, 2, 0, // 0b0000000001001010 + 21, 3, 2, 0, // 0b0000000001001011 + 0, 1, 1, 0, // 0b0000000001001100 + 12, 2, 3, 0, // 0b0000000001001101 + 3, 1, 4, 0, // 0b0000000001001110 + 40, 5, 1, 0, // 0b0000000001001111 + 0, 1, 1, 0, // 0b0000000001010000 + 10, 2, 1, 0, // 0b0000000001010001 + 1, 1, 2, 0, // 0b0000000001010010 + 20, 3, 1, 0, // 0b0000000001010011 + 0, 1, 1, 0, // 0b0000000001010100 + 11, 2, 2, 0, // 0b0000000001010101 + 2, 1, 3, 0, // 0b0000000001010110 + 31, 4, 2, 0, // 0b0000000001010111 + 0, 1, 1, 0, // 0b0000000001011000 + 10, 2, 1, 0, // 0b0000000001011001 + 1, 1, 2, 0, // 0b0000000001011010 + 22, 3, 3, 0, // 0b0000000001011011 + 0, 1, 1, 0, // 0b0000000001011100 + 13, 2, 4, 0, // 0b0000000001011101 + 4, 1, 5, 0, // 0b0000000001011110 + 51, 6, 2, 0, // 0b0000000001011111 + 0, 1, 1, 0, // 0b0000000001100000 + 10, 2, 1, 0, // 0b0000000001100001 + 1, 1, 2, 0, // 0b0000000001100010 + 20, 3, 1, 0, // 0b0000000001100011 + 0, 1, 1, 0, // 0b0000000001100100 + 11, 2, 2, 0, // 0b0000000001100101 + 2, 1, 3, 0, // 0b0000000001100110 + 30, 4, 1, 0, // 0b0000000001100111 + 0, 1, 1, 0, // 0b0000000001101000 + 10, 2, 1, 0, // 0b0000000001101001 + 1, 1, 2, 0, // 0b0000000001101010 + 21, 3, 2, 0, // 0b0000000001101011 + 0, 1, 1, 0, // 0b0000000001101100 + 12, 2, 3, 0, // 0b0000000001101101 + 3, 1, 4, 0, // 0b0000000001101110 + 42, 5, 3, 0, // 0b0000000001101111 + 0, 1, 1, 0, // 0b0000000001110000 + 10, 2, 1, 0, // 0b0000000001110001 + 1, 1, 2, 0, // 0b0000000001110010 + 20, 3, 1, 0, // 0b0000000001110011 + 0, 1, 1, 0, // 0b0000000001110100 + 11, 2, 2, 0, // 0b0000000001110101 + 2, 1, 3, 0, // 0b0000000001110110 + 33, 4, 4, 0, // 0b0000000001110111 + 0, 1, 1, 0, // 0b0000000001111000 + 10, 2, 1, 0, // 0b0000000001111001 + 1, 1, 2, 0, // 0b0000000001111010 + 24, 3, 5, 0, // 0b0000000001111011 + 0, 1, 1, 0, // 0b0000000001111100 + 15, 2, 6, 0, // 0b0000000001111101 + 6, 1, 7, 0, // 0b0000000001111110 + 69, 8, 1, 0, // 0b0000000001111111 + 0, 1, 1, 0, // 0b0000000010000000 + 10, 2, 1, 0, // 0b0000000010000001 + 1, 1, 2, 0, // 0b0000000010000010 + 20, 3, 1, 0, // 0b0000000010000011 + 0, 1, 1, 0, // 0b0000000010000100 + 11, 2, 2, 0, // 0b0000000010000101 + 2, 1, 3, 0, // 0b0000000010000110 + 30, 4, 1, 0, // 0b0000000010000111 + 0, 1, 1, 0, // 0b0000000010001000 + 10, 2, 1, 0, // 0b0000000010001001 + 1, 1, 2, 0, // 0b0000000010001010 + 21, 3, 2, 0, // 0b0000000010001011 + 0, 1, 1, 0, // 0b0000000010001100 + 12, 2, 3, 0, // 0b0000000010001101 + 3, 1, 4, 0, // 0b0000000010001110 + 40, 5, 1, 0, // 0b0000000010001111 + 0, 1, 1, 0, // 0b0000000010010000 + 10, 2, 1, 0, // 0b0000000010010001 + 1, 1, 2, 0, // 0b0000000010010010 + 20, 3, 1, 0, // 0b0000000010010011 + 0, 1, 1, 0, // 0b0000000010010100 + 11, 2, 2, 0, // 0b0000000010010101 + 2, 1, 3, 0, // 0b0000000010010110 + 31, 4, 2, 0, // 0b0000000010010111 + 0, 1, 1, 0, // 0b0000000010011000 + 10, 2, 1, 0, // 0b0000000010011001 + 1, 1, 2, 0, // 0b0000000010011010 + 22, 3, 3, 0, // 0b0000000010011011 + 0, 1, 1, 0, // 0b0000000010011100 + 13, 2, 4, 0, // 0b0000000010011101 + 4, 1, 5, 0, // 0b0000000010011110 + 50, 6, 1, 0, // 0b0000000010011111 + 0, 1, 1, 0, // 0b0000000010100000 + 10, 2, 1, 0, // 0b0000000010100001 + 1, 1, 2, 0, // 0b0000000010100010 + 20, 3, 1, 0, // 0b0000000010100011 + 0, 1, 1, 0, // 0b0000000010100100 + 11, 2, 2, 0, // 0b0000000010100101 + 2, 1, 3, 0, // 0b0000000010100110 + 30, 4, 1, 0, // 0b0000000010100111 + 0, 1, 1, 0, // 0b0000000010101000 + 10, 2, 1, 0, // 0b0000000010101001 + 1, 1, 2, 0, // 0b0000000010101010 + 21, 3, 2, 0, // 0b0000000010101011 + 0, 1, 1, 0, // 0b0000000010101100 + 12, 2, 3, 0, // 0b0000000010101101 + 3, 1, 4, 0, // 0b0000000010101110 + 41, 5, 2, 0, // 0b0000000010101111 + 0, 1, 1, 0, // 0b0000000010110000 + 10, 2, 1, 0, // 0b0000000010110001 + 1, 1, 2, 0, // 0b0000000010110010 + 20, 3, 1, 0, // 0b0000000010110011 + 0, 1, 1, 0, // 0b0000000010110100 + 11, 2, 2, 0, // 0b0000000010110101 + 2, 1, 3, 0, // 0b0000000010110110 + 32, 4, 3, 0, // 0b0000000010110111 + 0, 1, 1, 0, // 0b0000000010111000 + 10, 2, 1, 0, // 0b0000000010111001 + 1, 1, 2, 0, // 0b0000000010111010 + 23, 3, 4, 0, // 0b0000000010111011 + 0, 1, 1, 0, // 0b0000000010111100 + 14, 2, 5, 0, // 0b0000000010111101 + 5, 1, 6, 0, // 0b0000000010111110 + 61, 7, 2, 0, // 0b0000000010111111 + 0, 1, 1, 0, // 0b0000000011000000 + 10, 2, 1, 0, // 0b0000000011000001 + 1, 1, 2, 0, // 0b0000000011000010 + 20, 3, 1, 0, // 0b0000000011000011 + 0, 1, 1, 0, // 0b0000000011000100 + 11, 2, 2, 0, // 0b0000000011000101 + 2, 1, 3, 0, // 0b0000000011000110 + 30, 4, 1, 0, // 0b0000000011000111 + 0, 1, 1, 0, // 0b0000000011001000 + 10, 2, 1, 0, // 0b0000000011001001 + 1, 1, 2, 0, // 0b0000000011001010 + 21, 3, 2, 0, // 0b0000000011001011 + 0, 1, 1, 0, // 0b0000000011001100 + 12, 2, 3, 0, // 0b0000000011001101 + 3, 1, 4, 0, // 0b0000000011001110 + 40, 5, 1, 0, // 0b0000000011001111 + 0, 1, 1, 0, // 0b0000000011010000 + 10, 2, 1, 0, // 0b0000000011010001 + 1, 1, 2, 0, // 0b0000000011010010 + 20, 3, 1, 0, // 0b0000000011010011 + 0, 1, 1, 0, // 0b0000000011010100 + 11, 2, 2, 0, // 0b0000000011010101 + 2, 1, 3, 0, // 0b0000000011010110 + 31, 4, 2, 0, // 0b0000000011010111 + 0, 1, 1, 0, // 0b0000000011011000 + 10, 2, 1, 0, // 0b0000000011011001 + 1, 1, 2, 0, // 0b0000000011011010 + 22, 3, 3, 0, // 0b0000000011011011 + 0, 1, 1, 0, // 0b0000000011011100 + 13, 2, 4, 0, // 0b0000000011011101 + 4, 1, 5, 0, // 0b0000000011011110 + 52, 6, 3, 0, // 0b0000000011011111 + 0, 1, 1, 0, // 0b0000000011100000 + 10, 2, 1, 0, // 0b0000000011100001 + 1, 1, 2, 0, // 0b0000000011100010 + 20, 3, 1, 0, // 0b0000000011100011 + 0, 1, 1, 0, // 0b0000000011100100 + 11, 2, 2, 0, // 0b0000000011100101 + 2, 1, 3, 0, // 0b0000000011100110 + 30, 4, 1, 0, // 0b0000000011100111 + 0, 1, 1, 0, // 0b0000000011101000 + 10, 2, 1, 0, // 0b0000000011101001 + 1, 1, 2, 0, // 0b0000000011101010 + 21, 3, 2, 0, // 0b0000000011101011 + 0, 1, 1, 0, // 0b0000000011101100 + 12, 2, 3, 0, // 0b0000000011101101 + 3, 1, 4, 0, // 0b0000000011101110 + 43, 5, 4, 0, // 0b0000000011101111 + 0, 1, 1, 0, // 0b0000000011110000 + 10, 2, 1, 0, // 0b0000000011110001 + 1, 1, 2, 0, // 0b0000000011110010 + 20, 3, 1, 0, // 0b0000000011110011 + 0, 1, 1, 0, // 0b0000000011110100 + 11, 2, 2, 0, // 0b0000000011110101 + 2, 1, 3, 0, // 0b0000000011110110 + 34, 4, 5, 0, // 0b0000000011110111 + 0, 1, 1, 0, // 0b0000000011111000 + 10, 2, 1, 0, // 0b0000000011111001 + 1, 1, 2, 0, // 0b0000000011111010 + 25, 3, 6, 0, // 0b0000000011111011 + 0, 1, 1, 0, // 0b0000000011111100 + 16, 2, 7, 0, // 0b0000000011111101 + 7, 1, 8, 0, // 0b0000000011111110 + 77, 9, 1, 0, // 0b0000000011111111 + 0, 1, 1, 0, // 0b0000000100000000 + 10, 2, 1, 0, // 0b0000000100000001 + 1, 1, 2, 0, // 0b0000000100000010 + 20, 3, 1, 0, // 0b0000000100000011 + 0, 1, 1, 0, // 0b0000000100000100 + 11, 2, 2, 0, // 0b0000000100000101 + 2, 1, 3, 0, // 0b0000000100000110 + 30, 4, 1, 0, // 0b0000000100000111 + 0, 1, 1, 0, // 0b0000000100001000 + 10, 2, 1, 0, // 0b0000000100001001 + 1, 1, 2, 0, // 0b0000000100001010 + 21, 3, 2, 0, // 0b0000000100001011 + 0, 1, 1, 0, // 0b0000000100001100 + 12, 2, 3, 0, // 0b0000000100001101 + 3, 1, 4, 0, // 0b0000000100001110 + 40, 5, 1, 0, // 0b0000000100001111 + 0, 1, 1, 0, // 0b0000000100010000 + 10, 2, 1, 0, // 0b0000000100010001 + 1, 1, 2, 0, // 0b0000000100010010 + 20, 3, 1, 0, // 0b0000000100010011 + 0, 1, 1, 0, // 0b0000000100010100 + 11, 2, 2, 0, // 0b0000000100010101 + 2, 1, 3, 0, // 0b0000000100010110 + 31, 4, 2, 0, // 0b0000000100010111 + 0, 1, 1, 0, // 0b0000000100011000 + 10, 2, 1, 0, // 0b0000000100011001 + 1, 1, 2, 0, // 0b0000000100011010 + 22, 3, 3, 0, // 0b0000000100011011 + 0, 1, 1, 0, // 0b0000000100011100 + 13, 2, 4, 0, // 0b0000000100011101 + 4, 1, 5, 0, // 0b0000000100011110 + 50, 6, 1, 0, // 0b0000000100011111 + 0, 1, 1, 0, // 0b0000000100100000 + 10, 2, 1, 0, // 0b0000000100100001 + 1, 1, 2, 0, // 0b0000000100100010 + 20, 3, 1, 0, // 0b0000000100100011 + 0, 1, 1, 0, // 0b0000000100100100 + 11, 2, 2, 0, // 0b0000000100100101 + 2, 1, 3, 0, // 0b0000000100100110 + 30, 4, 1, 0, // 0b0000000100100111 + 0, 1, 1, 0, // 0b0000000100101000 + 10, 2, 1, 0, // 0b0000000100101001 + 1, 1, 2, 0, // 0b0000000100101010 + 21, 3, 2, 0, // 0b0000000100101011 + 0, 1, 1, 0, // 0b0000000100101100 + 12, 2, 3, 0, // 0b0000000100101101 + 3, 1, 4, 0, // 0b0000000100101110 + 41, 5, 2, 0, // 0b0000000100101111 + 0, 1, 1, 0, // 0b0000000100110000 + 10, 2, 1, 0, // 0b0000000100110001 + 1, 1, 2, 0, // 0b0000000100110010 + 20, 3, 1, 0, // 0b0000000100110011 + 0, 1, 1, 0, // 0b0000000100110100 + 11, 2, 2, 0, // 0b0000000100110101 + 2, 1, 3, 0, // 0b0000000100110110 + 32, 4, 3, 0, // 0b0000000100110111 + 0, 1, 1, 0, // 0b0000000100111000 + 10, 2, 1, 0, // 0b0000000100111001 + 1, 1, 2, 0, // 0b0000000100111010 + 23, 3, 4, 0, // 0b0000000100111011 + 0, 1, 1, 0, // 0b0000000100111100 + 14, 2, 5, 0, // 0b0000000100111101 + 5, 1, 6, 0, // 0b0000000100111110 + 60, 7, 1, 0, // 0b0000000100111111 + 0, 1, 1, 0, // 0b0000000101000000 + 10, 2, 1, 0, // 0b0000000101000001 + 1, 1, 2, 0, // 0b0000000101000010 + 20, 3, 1, 0, // 0b0000000101000011 + 0, 1, 1, 0, // 0b0000000101000100 + 11, 2, 2, 0, // 0b0000000101000101 + 2, 1, 3, 0, // 0b0000000101000110 + 30, 4, 1, 0, // 0b0000000101000111 + 0, 1, 1, 0, // 0b0000000101001000 + 10, 2, 1, 0, // 0b0000000101001001 + 1, 1, 2, 0, // 0b0000000101001010 + 21, 3, 2, 0, // 0b0000000101001011 + 0, 1, 1, 0, // 0b0000000101001100 + 12, 2, 3, 0, // 0b0000000101001101 + 3, 1, 4, 0, // 0b0000000101001110 + 40, 5, 1, 0, // 0b0000000101001111 + 0, 1, 1, 0, // 0b0000000101010000 + 10, 2, 1, 0, // 0b0000000101010001 + 1, 1, 2, 0, // 0b0000000101010010 + 20, 3, 1, 0, // 0b0000000101010011 + 0, 1, 1, 0, // 0b0000000101010100 + 11, 2, 2, 0, // 0b0000000101010101 + 2, 1, 3, 0, // 0b0000000101010110 + 31, 4, 2, 0, // 0b0000000101010111 + 0, 1, 1, 0, // 0b0000000101011000 + 10, 2, 1, 0, // 0b0000000101011001 + 1, 1, 2, 0, // 0b0000000101011010 + 22, 3, 3, 0, // 0b0000000101011011 + 0, 1, 1, 0, // 0b0000000101011100 + 13, 2, 4, 0, // 0b0000000101011101 + 4, 1, 5, 0, // 0b0000000101011110 + 51, 6, 2, 0, // 0b0000000101011111 + 0, 1, 1, 0, // 0b0000000101100000 + 10, 2, 1, 0, // 0b0000000101100001 + 1, 1, 2, 0, // 0b0000000101100010 + 20, 3, 1, 0, // 0b0000000101100011 + 0, 1, 1, 0, // 0b0000000101100100 + 11, 2, 2, 0, // 0b0000000101100101 + 2, 1, 3, 0, // 0b0000000101100110 + 30, 4, 1, 0, // 0b0000000101100111 + 0, 1, 1, 0, // 0b0000000101101000 + 10, 2, 1, 0, // 0b0000000101101001 + 1, 1, 2, 0, // 0b0000000101101010 + 21, 3, 2, 0, // 0b0000000101101011 + 0, 1, 1, 0, // 0b0000000101101100 + 12, 2, 3, 0, // 0b0000000101101101 + 3, 1, 4, 0, // 0b0000000101101110 + 42, 5, 3, 0, // 0b0000000101101111 + 0, 1, 1, 0, // 0b0000000101110000 + 10, 2, 1, 0, // 0b0000000101110001 + 1, 1, 2, 0, // 0b0000000101110010 + 20, 3, 1, 0, // 0b0000000101110011 + 0, 1, 1, 0, // 0b0000000101110100 + 11, 2, 2, 0, // 0b0000000101110101 + 2, 1, 3, 0, // 0b0000000101110110 + 33, 4, 4, 0, // 0b0000000101110111 + 0, 1, 1, 0, // 0b0000000101111000 + 10, 2, 1, 0, // 0b0000000101111001 + 1, 1, 2, 0, // 0b0000000101111010 + 24, 3, 5, 0, // 0b0000000101111011 + 0, 1, 1, 0, // 0b0000000101111100 + 15, 2, 6, 0, // 0b0000000101111101 + 6, 1, 7, 0, // 0b0000000101111110 + 70, 8, 2, 0, // 0b0000000101111111 + 0, 1, 1, 0, // 0b0000000110000000 + 10, 2, 1, 0, // 0b0000000110000001 + 1, 1, 2, 0, // 0b0000000110000010 + 20, 3, 1, 0, // 0b0000000110000011 + 0, 1, 1, 0, // 0b0000000110000100 + 11, 2, 2, 0, // 0b0000000110000101 + 2, 1, 3, 0, // 0b0000000110000110 + 30, 4, 1, 0, // 0b0000000110000111 + 0, 1, 1, 0, // 0b0000000110001000 + 10, 2, 1, 0, // 0b0000000110001001 + 1, 1, 2, 0, // 0b0000000110001010 + 21, 3, 2, 0, // 0b0000000110001011 + 0, 1, 1, 0, // 0b0000000110001100 + 12, 2, 3, 0, // 0b0000000110001101 + 3, 1, 4, 0, // 0b0000000110001110 + 40, 5, 1, 0, // 0b0000000110001111 + 0, 1, 1, 0, // 0b0000000110010000 + 10, 2, 1, 0, // 0b0000000110010001 + 1, 1, 2, 0, // 0b0000000110010010 + 20, 3, 1, 0, // 0b0000000110010011 + 0, 1, 1, 0, // 0b0000000110010100 + 11, 2, 2, 0, // 0b0000000110010101 + 2, 1, 3, 0, // 0b0000000110010110 + 31, 4, 2, 0, // 0b0000000110010111 + 0, 1, 1, 0, // 0b0000000110011000 + 10, 2, 1, 0, // 0b0000000110011001 + 1, 1, 2, 0, // 0b0000000110011010 + 22, 3, 3, 0, // 0b0000000110011011 + 0, 1, 1, 0, // 0b0000000110011100 + 13, 2, 4, 0, // 0b0000000110011101 + 4, 1, 5, 0, // 0b0000000110011110 + 50, 6, 1, 0, // 0b0000000110011111 + 0, 1, 1, 0, // 0b0000000110100000 + 10, 2, 1, 0, // 0b0000000110100001 + 1, 1, 2, 0, // 0b0000000110100010 + 20, 3, 1, 0, // 0b0000000110100011 + 0, 1, 1, 0, // 0b0000000110100100 + 11, 2, 2, 0, // 0b0000000110100101 + 2, 1, 3, 0, // 0b0000000110100110 + 30, 4, 1, 0, // 0b0000000110100111 + 0, 1, 1, 0, // 0b0000000110101000 + 10, 2, 1, 0, // 0b0000000110101001 + 1, 1, 2, 0, // 0b0000000110101010 + 21, 3, 2, 0, // 0b0000000110101011 + 0, 1, 1, 0, // 0b0000000110101100 + 12, 2, 3, 0, // 0b0000000110101101 + 3, 1, 4, 0, // 0b0000000110101110 + 41, 5, 2, 0, // 0b0000000110101111 + 0, 1, 1, 0, // 0b0000000110110000 + 10, 2, 1, 0, // 0b0000000110110001 + 1, 1, 2, 0, // 0b0000000110110010 + 20, 3, 1, 0, // 0b0000000110110011 + 0, 1, 1, 0, // 0b0000000110110100 + 11, 2, 2, 0, // 0b0000000110110101 + 2, 1, 3, 0, // 0b0000000110110110 + 32, 4, 3, 0, // 0b0000000110110111 + 0, 1, 1, 0, // 0b0000000110111000 + 10, 2, 1, 0, // 0b0000000110111001 + 1, 1, 2, 0, // 0b0000000110111010 + 23, 3, 4, 0, // 0b0000000110111011 + 0, 1, 1, 0, // 0b0000000110111100 + 14, 2, 5, 0, // 0b0000000110111101 + 5, 1, 6, 0, // 0b0000000110111110 + 62, 7, 3, 0, // 0b0000000110111111 + 0, 1, 1, 0, // 0b0000000111000000 + 10, 2, 1, 0, // 0b0000000111000001 + 1, 1, 2, 0, // 0b0000000111000010 + 20, 3, 1, 0, // 0b0000000111000011 + 0, 1, 1, 0, // 0b0000000111000100 + 11, 2, 2, 0, // 0b0000000111000101 + 2, 1, 3, 0, // 0b0000000111000110 + 30, 4, 1, 0, // 0b0000000111000111 + 0, 1, 1, 0, // 0b0000000111001000 + 10, 2, 1, 0, // 0b0000000111001001 + 1, 1, 2, 0, // 0b0000000111001010 + 21, 3, 2, 0, // 0b0000000111001011 + 0, 1, 1, 0, // 0b0000000111001100 + 12, 2, 3, 0, // 0b0000000111001101 + 3, 1, 4, 0, // 0b0000000111001110 + 40, 5, 1, 0, // 0b0000000111001111 + 0, 1, 1, 0, // 0b0000000111010000 + 10, 2, 1, 0, // 0b0000000111010001 + 1, 1, 2, 0, // 0b0000000111010010 + 20, 3, 1, 0, // 0b0000000111010011 + 0, 1, 1, 0, // 0b0000000111010100 + 11, 2, 2, 0, // 0b0000000111010101 + 2, 1, 3, 0, // 0b0000000111010110 + 31, 4, 2, 0, // 0b0000000111010111 + 0, 1, 1, 0, // 0b0000000111011000 + 10, 2, 1, 0, // 0b0000000111011001 + 1, 1, 2, 0, // 0b0000000111011010 + 22, 3, 3, 0, // 0b0000000111011011 + 0, 1, 1, 0, // 0b0000000111011100 + 13, 2, 4, 0, // 0b0000000111011101 + 4, 1, 5, 0, // 0b0000000111011110 + 53, 6, 4, 0, // 0b0000000111011111 + 0, 1, 1, 0, // 0b0000000111100000 + 10, 2, 1, 0, // 0b0000000111100001 + 1, 1, 2, 0, // 0b0000000111100010 + 20, 3, 1, 0, // 0b0000000111100011 + 0, 1, 1, 0, // 0b0000000111100100 + 11, 2, 2, 0, // 0b0000000111100101 + 2, 1, 3, 0, // 0b0000000111100110 + 30, 4, 1, 0, // 0b0000000111100111 + 0, 1, 1, 0, // 0b0000000111101000 + 10, 2, 1, 0, // 0b0000000111101001 + 1, 1, 2, 0, // 0b0000000111101010 + 21, 3, 2, 0, // 0b0000000111101011 + 0, 1, 1, 0, // 0b0000000111101100 + 12, 2, 3, 0, // 0b0000000111101101 + 3, 1, 4, 0, // 0b0000000111101110 + 44, 5, 5, 0, // 0b0000000111101111 + 0, 1, 1, 0, // 0b0000000111110000 + 10, 2, 1, 0, // 0b0000000111110001 + 1, 1, 2, 0, // 0b0000000111110010 + 20, 3, 1, 0, // 0b0000000111110011 + 0, 1, 1, 0, // 0b0000000111110100 + 11, 2, 2, 0, // 0b0000000111110101 + 2, 1, 3, 0, // 0b0000000111110110 + 35, 4, 6, 0, // 0b0000000111110111 + 0, 1, 1, 0, // 0b0000000111111000 + 10, 2, 1, 0, // 0b0000000111111001 + 1, 1, 2, 0, // 0b0000000111111010 + 26, 3, 7, 0, // 0b0000000111111011 + 0, 1, 1, 0, // 0b0000000111111100 + 17, 2, 8, 0, // 0b0000000111111101 + 8, 1, 9, 0, // 0b0000000111111110 + 84, 10, 1, 0, // 0b0000000111111111 + 0, 1, 1, 0, // 0b0000001000000000 + 10, 2, 1, 0, // 0b0000001000000001 + 1, 1, 2, 0, // 0b0000001000000010 + 20, 3, 1, 0, // 0b0000001000000011 + 0, 1, 1, 0, // 0b0000001000000100 + 11, 2, 2, 0, // 0b0000001000000101 + 2, 1, 3, 0, // 0b0000001000000110 + 30, 4, 1, 0, // 0b0000001000000111 + 0, 1, 1, 0, // 0b0000001000001000 + 10, 2, 1, 0, // 0b0000001000001001 + 1, 1, 2, 0, // 0b0000001000001010 + 21, 3, 2, 0, // 0b0000001000001011 + 0, 1, 1, 0, // 0b0000001000001100 + 12, 2, 3, 0, // 0b0000001000001101 + 3, 1, 4, 0, // 0b0000001000001110 + 40, 5, 1, 0, // 0b0000001000001111 + 0, 1, 1, 0, // 0b0000001000010000 + 10, 2, 1, 0, // 0b0000001000010001 + 1, 1, 2, 0, // 0b0000001000010010 + 20, 3, 1, 0, // 0b0000001000010011 + 0, 1, 1, 0, // 0b0000001000010100 + 11, 2, 2, 0, // 0b0000001000010101 + 2, 1, 3, 0, // 0b0000001000010110 + 31, 4, 2, 0, // 0b0000001000010111 + 0, 1, 1, 0, // 0b0000001000011000 + 10, 2, 1, 0, // 0b0000001000011001 + 1, 1, 2, 0, // 0b0000001000011010 + 22, 3, 3, 0, // 0b0000001000011011 + 0, 1, 1, 0, // 0b0000001000011100 + 13, 2, 4, 0, // 0b0000001000011101 + 4, 1, 5, 0, // 0b0000001000011110 + 50, 6, 1, 0, // 0b0000001000011111 + 0, 1, 1, 0, // 0b0000001000100000 + 10, 2, 1, 0, // 0b0000001000100001 + 1, 1, 2, 0, // 0b0000001000100010 + 20, 3, 1, 0, // 0b0000001000100011 + 0, 1, 1, 0, // 0b0000001000100100 + 11, 2, 2, 0, // 0b0000001000100101 + 2, 1, 3, 0, // 0b0000001000100110 + 30, 4, 1, 0, // 0b0000001000100111 + 0, 1, 1, 0, // 0b0000001000101000 + 10, 2, 1, 0, // 0b0000001000101001 + 1, 1, 2, 0, // 0b0000001000101010 + 21, 3, 2, 0, // 0b0000001000101011 + 0, 1, 1, 0, // 0b0000001000101100 + 12, 2, 3, 0, // 0b0000001000101101 + 3, 1, 4, 0, // 0b0000001000101110 + 41, 5, 2, 0, // 0b0000001000101111 + 0, 1, 1, 0, // 0b0000001000110000 + 10, 2, 1, 0, // 0b0000001000110001 + 1, 1, 2, 0, // 0b0000001000110010 + 20, 3, 1, 0, // 0b0000001000110011 + 0, 1, 1, 0, // 0b0000001000110100 + 11, 2, 2, 0, // 0b0000001000110101 + 2, 1, 3, 0, // 0b0000001000110110 + 32, 4, 3, 0, // 0b0000001000110111 + 0, 1, 1, 0, // 0b0000001000111000 + 10, 2, 1, 0, // 0b0000001000111001 + 1, 1, 2, 0, // 0b0000001000111010 + 23, 3, 4, 0, // 0b0000001000111011 + 0, 1, 1, 0, // 0b0000001000111100 + 14, 2, 5, 0, // 0b0000001000111101 + 5, 1, 6, 0, // 0b0000001000111110 + 60, 7, 1, 0, // 0b0000001000111111 + 0, 1, 1, 0, // 0b0000001001000000 + 10, 2, 1, 0, // 0b0000001001000001 + 1, 1, 2, 0, // 0b0000001001000010 + 20, 3, 1, 0, // 0b0000001001000011 + 0, 1, 1, 0, // 0b0000001001000100 + 11, 2, 2, 0, // 0b0000001001000101 + 2, 1, 3, 0, // 0b0000001001000110 + 30, 4, 1, 0, // 0b0000001001000111 + 0, 1, 1, 0, // 0b0000001001001000 + 10, 2, 1, 0, // 0b0000001001001001 + 1, 1, 2, 0, // 0b0000001001001010 + 21, 3, 2, 0, // 0b0000001001001011 + 0, 1, 1, 0, // 0b0000001001001100 + 12, 2, 3, 0, // 0b0000001001001101 + 3, 1, 4, 0, // 0b0000001001001110 + 40, 5, 1, 0, // 0b0000001001001111 + 0, 1, 1, 0, // 0b0000001001010000 + 10, 2, 1, 0, // 0b0000001001010001 + 1, 1, 2, 0, // 0b0000001001010010 + 20, 3, 1, 0, // 0b0000001001010011 + 0, 1, 1, 0, // 0b0000001001010100 + 11, 2, 2, 0, // 0b0000001001010101 + 2, 1, 3, 0, // 0b0000001001010110 + 31, 4, 2, 0, // 0b0000001001010111 + 0, 1, 1, 0, // 0b0000001001011000 + 10, 2, 1, 0, // 0b0000001001011001 + 1, 1, 2, 0, // 0b0000001001011010 + 22, 3, 3, 0, // 0b0000001001011011 + 0, 1, 1, 0, // 0b0000001001011100 + 13, 2, 4, 0, // 0b0000001001011101 + 4, 1, 5, 0, // 0b0000001001011110 + 51, 6, 2, 0, // 0b0000001001011111 + 0, 1, 1, 0, // 0b0000001001100000 + 10, 2, 1, 0, // 0b0000001001100001 + 1, 1, 2, 0, // 0b0000001001100010 + 20, 3, 1, 0, // 0b0000001001100011 + 0, 1, 1, 0, // 0b0000001001100100 + 11, 2, 2, 0, // 0b0000001001100101 + 2, 1, 3, 0, // 0b0000001001100110 + 30, 4, 1, 0, // 0b0000001001100111 + 0, 1, 1, 0, // 0b0000001001101000 + 10, 2, 1, 0, // 0b0000001001101001 + 1, 1, 2, 0, // 0b0000001001101010 + 21, 3, 2, 0, // 0b0000001001101011 + 0, 1, 1, 0, // 0b0000001001101100 + 12, 2, 3, 0, // 0b0000001001101101 + 3, 1, 4, 0, // 0b0000001001101110 + 42, 5, 3, 0, // 0b0000001001101111 + 0, 1, 1, 0, // 0b0000001001110000 + 10, 2, 1, 0, // 0b0000001001110001 + 1, 1, 2, 0, // 0b0000001001110010 + 20, 3, 1, 0, // 0b0000001001110011 + 0, 1, 1, 0, // 0b0000001001110100 + 11, 2, 2, 0, // 0b0000001001110101 + 2, 1, 3, 0, // 0b0000001001110110 + 33, 4, 4, 0, // 0b0000001001110111 + 0, 1, 1, 0, // 0b0000001001111000 + 10, 2, 1, 0, // 0b0000001001111001 + 1, 1, 2, 0, // 0b0000001001111010 + 24, 3, 5, 0, // 0b0000001001111011 + 0, 1, 1, 0, // 0b0000001001111100 + 15, 2, 6, 0, // 0b0000001001111101 + 6, 1, 7, 0, // 0b0000001001111110 + 69, 8, 1, 0, // 0b0000001001111111 + 0, 1, 1, 0, // 0b0000001010000000 + 10, 2, 1, 0, // 0b0000001010000001 + 1, 1, 2, 0, // 0b0000001010000010 + 20, 3, 1, 0, // 0b0000001010000011 + 0, 1, 1, 0, // 0b0000001010000100 + 11, 2, 2, 0, // 0b0000001010000101 + 2, 1, 3, 0, // 0b0000001010000110 + 30, 4, 1, 0, // 0b0000001010000111 + 0, 1, 1, 0, // 0b0000001010001000 + 10, 2, 1, 0, // 0b0000001010001001 + 1, 1, 2, 0, // 0b0000001010001010 + 21, 3, 2, 0, // 0b0000001010001011 + 0, 1, 1, 0, // 0b0000001010001100 + 12, 2, 3, 0, // 0b0000001010001101 + 3, 1, 4, 0, // 0b0000001010001110 + 40, 5, 1, 0, // 0b0000001010001111 + 0, 1, 1, 0, // 0b0000001010010000 + 10, 2, 1, 0, // 0b0000001010010001 + 1, 1, 2, 0, // 0b0000001010010010 + 20, 3, 1, 0, // 0b0000001010010011 + 0, 1, 1, 0, // 0b0000001010010100 + 11, 2, 2, 0, // 0b0000001010010101 + 2, 1, 3, 0, // 0b0000001010010110 + 31, 4, 2, 0, // 0b0000001010010111 + 0, 1, 1, 0, // 0b0000001010011000 + 10, 2, 1, 0, // 0b0000001010011001 + 1, 1, 2, 0, // 0b0000001010011010 + 22, 3, 3, 0, // 0b0000001010011011 + 0, 1, 1, 0, // 0b0000001010011100 + 13, 2, 4, 0, // 0b0000001010011101 + 4, 1, 5, 0, // 0b0000001010011110 + 50, 6, 1, 0, // 0b0000001010011111 + 0, 1, 1, 0, // 0b0000001010100000 + 10, 2, 1, 0, // 0b0000001010100001 + 1, 1, 2, 0, // 0b0000001010100010 + 20, 3, 1, 0, // 0b0000001010100011 + 0, 1, 1, 0, // 0b0000001010100100 + 11, 2, 2, 0, // 0b0000001010100101 + 2, 1, 3, 0, // 0b0000001010100110 + 30, 4, 1, 0, // 0b0000001010100111 + 0, 1, 1, 0, // 0b0000001010101000 + 10, 2, 1, 0, // 0b0000001010101001 + 1, 1, 2, 0, // 0b0000001010101010 + 21, 3, 2, 0, // 0b0000001010101011 + 0, 1, 1, 0, // 0b0000001010101100 + 12, 2, 3, 0, // 0b0000001010101101 + 3, 1, 4, 0, // 0b0000001010101110 + 41, 5, 2, 0, // 0b0000001010101111 + 0, 1, 1, 0, // 0b0000001010110000 + 10, 2, 1, 0, // 0b0000001010110001 + 1, 1, 2, 0, // 0b0000001010110010 + 20, 3, 1, 0, // 0b0000001010110011 + 0, 1, 1, 0, // 0b0000001010110100 + 11, 2, 2, 0, // 0b0000001010110101 + 2, 1, 3, 0, // 0b0000001010110110 + 32, 4, 3, 0, // 0b0000001010110111 + 0, 1, 1, 0, // 0b0000001010111000 + 10, 2, 1, 0, // 0b0000001010111001 + 1, 1, 2, 0, // 0b0000001010111010 + 23, 3, 4, 0, // 0b0000001010111011 + 0, 1, 1, 0, // 0b0000001010111100 + 14, 2, 5, 0, // 0b0000001010111101 + 5, 1, 6, 0, // 0b0000001010111110 + 61, 7, 2, 0, // 0b0000001010111111 + 0, 1, 1, 0, // 0b0000001011000000 + 10, 2, 1, 0, // 0b0000001011000001 + 1, 1, 2, 0, // 0b0000001011000010 + 20, 3, 1, 0, // 0b0000001011000011 + 0, 1, 1, 0, // 0b0000001011000100 + 11, 2, 2, 0, // 0b0000001011000101 + 2, 1, 3, 0, // 0b0000001011000110 + 30, 4, 1, 0, // 0b0000001011000111 + 0, 1, 1, 0, // 0b0000001011001000 + 10, 2, 1, 0, // 0b0000001011001001 + 1, 1, 2, 0, // 0b0000001011001010 + 21, 3, 2, 0, // 0b0000001011001011 + 0, 1, 1, 0, // 0b0000001011001100 + 12, 2, 3, 0, // 0b0000001011001101 + 3, 1, 4, 0, // 0b0000001011001110 + 40, 5, 1, 0, // 0b0000001011001111 + 0, 1, 1, 0, // 0b0000001011010000 + 10, 2, 1, 0, // 0b0000001011010001 + 1, 1, 2, 0, // 0b0000001011010010 + 20, 3, 1, 0, // 0b0000001011010011 + 0, 1, 1, 0, // 0b0000001011010100 + 11, 2, 2, 0, // 0b0000001011010101 + 2, 1, 3, 0, // 0b0000001011010110 + 31, 4, 2, 0, // 0b0000001011010111 + 0, 1, 1, 0, // 0b0000001011011000 + 10, 2, 1, 0, // 0b0000001011011001 + 1, 1, 2, 0, // 0b0000001011011010 + 22, 3, 3, 0, // 0b0000001011011011 + 0, 1, 1, 0, // 0b0000001011011100 + 13, 2, 4, 0, // 0b0000001011011101 + 4, 1, 5, 0, // 0b0000001011011110 + 52, 6, 3, 0, // 0b0000001011011111 + 0, 1, 1, 0, // 0b0000001011100000 + 10, 2, 1, 0, // 0b0000001011100001 + 1, 1, 2, 0, // 0b0000001011100010 + 20, 3, 1, 0, // 0b0000001011100011 + 0, 1, 1, 0, // 0b0000001011100100 + 11, 2, 2, 0, // 0b0000001011100101 + 2, 1, 3, 0, // 0b0000001011100110 + 30, 4, 1, 0, // 0b0000001011100111 + 0, 1, 1, 0, // 0b0000001011101000 + 10, 2, 1, 0, // 0b0000001011101001 + 1, 1, 2, 0, // 0b0000001011101010 + 21, 3, 2, 0, // 0b0000001011101011 + 0, 1, 1, 0, // 0b0000001011101100 + 12, 2, 3, 0, // 0b0000001011101101 + 3, 1, 4, 0, // 0b0000001011101110 + 43, 5, 4, 0, // 0b0000001011101111 + 0, 1, 1, 0, // 0b0000001011110000 + 10, 2, 1, 0, // 0b0000001011110001 + 1, 1, 2, 0, // 0b0000001011110010 + 20, 3, 1, 0, // 0b0000001011110011 + 0, 1, 1, 0, // 0b0000001011110100 + 11, 2, 2, 0, // 0b0000001011110101 + 2, 1, 3, 0, // 0b0000001011110110 + 34, 4, 5, 0, // 0b0000001011110111 + 0, 1, 1, 0, // 0b0000001011111000 + 10, 2, 1, 0, // 0b0000001011111001 + 1, 1, 2, 0, // 0b0000001011111010 + 25, 3, 6, 0, // 0b0000001011111011 + 0, 1, 1, 0, // 0b0000001011111100 + 16, 2, 7, 0, // 0b0000001011111101 + 7, 1, 8, 0, // 0b0000001011111110 + 78, 9, 2, 0, // 0b0000001011111111 + 0, 1, 1, 0, // 0b0000001100000000 + 10, 2, 1, 0, // 0b0000001100000001 + 1, 1, 2, 0, // 0b0000001100000010 + 20, 3, 1, 0, // 0b0000001100000011 + 0, 1, 1, 0, // 0b0000001100000100 + 11, 2, 2, 0, // 0b0000001100000101 + 2, 1, 3, 0, // 0b0000001100000110 + 30, 4, 1, 0, // 0b0000001100000111 + 0, 1, 1, 0, // 0b0000001100001000 + 10, 2, 1, 0, // 0b0000001100001001 + 1, 1, 2, 0, // 0b0000001100001010 + 21, 3, 2, 0, // 0b0000001100001011 + 0, 1, 1, 0, // 0b0000001100001100 + 12, 2, 3, 0, // 0b0000001100001101 + 3, 1, 4, 0, // 0b0000001100001110 + 40, 5, 1, 0, // 0b0000001100001111 + 0, 1, 1, 0, // 0b0000001100010000 + 10, 2, 1, 0, // 0b0000001100010001 + 1, 1, 2, 0, // 0b0000001100010010 + 20, 3, 1, 0, // 0b0000001100010011 + 0, 1, 1, 0, // 0b0000001100010100 + 11, 2, 2, 0, // 0b0000001100010101 + 2, 1, 3, 0, // 0b0000001100010110 + 31, 4, 2, 0, // 0b0000001100010111 + 0, 1, 1, 0, // 0b0000001100011000 + 10, 2, 1, 0, // 0b0000001100011001 + 1, 1, 2, 0, // 0b0000001100011010 + 22, 3, 3, 0, // 0b0000001100011011 + 0, 1, 1, 0, // 0b0000001100011100 + 13, 2, 4, 0, // 0b0000001100011101 + 4, 1, 5, 0, // 0b0000001100011110 + 50, 6, 1, 0, // 0b0000001100011111 + 0, 1, 1, 0, // 0b0000001100100000 + 10, 2, 1, 0, // 0b0000001100100001 + 1, 1, 2, 0, // 0b0000001100100010 + 20, 3, 1, 0, // 0b0000001100100011 + 0, 1, 1, 0, // 0b0000001100100100 + 11, 2, 2, 0, // 0b0000001100100101 + 2, 1, 3, 0, // 0b0000001100100110 + 30, 4, 1, 0, // 0b0000001100100111 + 0, 1, 1, 0, // 0b0000001100101000 + 10, 2, 1, 0, // 0b0000001100101001 + 1, 1, 2, 0, // 0b0000001100101010 + 21, 3, 2, 0, // 0b0000001100101011 + 0, 1, 1, 0, // 0b0000001100101100 + 12, 2, 3, 0, // 0b0000001100101101 + 3, 1, 4, 0, // 0b0000001100101110 + 41, 5, 2, 0, // 0b0000001100101111 + 0, 1, 1, 0, // 0b0000001100110000 + 10, 2, 1, 0, // 0b0000001100110001 + 1, 1, 2, 0, // 0b0000001100110010 + 20, 3, 1, 0, // 0b0000001100110011 + 0, 1, 1, 0, // 0b0000001100110100 + 11, 2, 2, 0, // 0b0000001100110101 + 2, 1, 3, 0, // 0b0000001100110110 + 32, 4, 3, 0, // 0b0000001100110111 + 0, 1, 1, 0, // 0b0000001100111000 + 10, 2, 1, 0, // 0b0000001100111001 + 1, 1, 2, 0, // 0b0000001100111010 + 23, 3, 4, 0, // 0b0000001100111011 + 0, 1, 1, 0, // 0b0000001100111100 + 14, 2, 5, 0, // 0b0000001100111101 + 5, 1, 6, 0, // 0b0000001100111110 + 60, 7, 1, 0, // 0b0000001100111111 + 0, 1, 1, 0, // 0b0000001101000000 + 10, 2, 1, 0, // 0b0000001101000001 + 1, 1, 2, 0, // 0b0000001101000010 + 20, 3, 1, 0, // 0b0000001101000011 + 0, 1, 1, 0, // 0b0000001101000100 + 11, 2, 2, 0, // 0b0000001101000101 + 2, 1, 3, 0, // 0b0000001101000110 + 30, 4, 1, 0, // 0b0000001101000111 + 0, 1, 1, 0, // 0b0000001101001000 + 10, 2, 1, 0, // 0b0000001101001001 + 1, 1, 2, 0, // 0b0000001101001010 + 21, 3, 2, 0, // 0b0000001101001011 + 0, 1, 1, 0, // 0b0000001101001100 + 12, 2, 3, 0, // 0b0000001101001101 + 3, 1, 4, 0, // 0b0000001101001110 + 40, 5, 1, 0, // 0b0000001101001111 + 0, 1, 1, 0, // 0b0000001101010000 + 10, 2, 1, 0, // 0b0000001101010001 + 1, 1, 2, 0, // 0b0000001101010010 + 20, 3, 1, 0, // 0b0000001101010011 + 0, 1, 1, 0, // 0b0000001101010100 + 11, 2, 2, 0, // 0b0000001101010101 + 2, 1, 3, 0, // 0b0000001101010110 + 31, 4, 2, 0, // 0b0000001101010111 + 0, 1, 1, 0, // 0b0000001101011000 + 10, 2, 1, 0, // 0b0000001101011001 + 1, 1, 2, 0, // 0b0000001101011010 + 22, 3, 3, 0, // 0b0000001101011011 + 0, 1, 1, 0, // 0b0000001101011100 + 13, 2, 4, 0, // 0b0000001101011101 + 4, 1, 5, 0, // 0b0000001101011110 + 51, 6, 2, 0, // 0b0000001101011111 + 0, 1, 1, 0, // 0b0000001101100000 + 10, 2, 1, 0, // 0b0000001101100001 + 1, 1, 2, 0, // 0b0000001101100010 + 20, 3, 1, 0, // 0b0000001101100011 + 0, 1, 1, 0, // 0b0000001101100100 + 11, 2, 2, 0, // 0b0000001101100101 + 2, 1, 3, 0, // 0b0000001101100110 + 30, 4, 1, 0, // 0b0000001101100111 + 0, 1, 1, 0, // 0b0000001101101000 + 10, 2, 1, 0, // 0b0000001101101001 + 1, 1, 2, 0, // 0b0000001101101010 + 21, 3, 2, 0, // 0b0000001101101011 + 0, 1, 1, 0, // 0b0000001101101100 + 12, 2, 3, 0, // 0b0000001101101101 + 3, 1, 4, 0, // 0b0000001101101110 + 42, 5, 3, 0, // 0b0000001101101111 + 0, 1, 1, 0, // 0b0000001101110000 + 10, 2, 1, 0, // 0b0000001101110001 + 1, 1, 2, 0, // 0b0000001101110010 + 20, 3, 1, 0, // 0b0000001101110011 + 0, 1, 1, 0, // 0b0000001101110100 + 11, 2, 2, 0, // 0b0000001101110101 + 2, 1, 3, 0, // 0b0000001101110110 + 33, 4, 4, 0, // 0b0000001101110111 + 0, 1, 1, 0, // 0b0000001101111000 + 10, 2, 1, 0, // 0b0000001101111001 + 1, 1, 2, 0, // 0b0000001101111010 + 24, 3, 5, 0, // 0b0000001101111011 + 0, 1, 1, 0, // 0b0000001101111100 + 15, 2, 6, 0, // 0b0000001101111101 + 6, 1, 7, 0, // 0b0000001101111110 + 71, 8, 3, 0, // 0b0000001101111111 + 0, 1, 1, 0, // 0b0000001110000000 + 10, 2, 1, 0, // 0b0000001110000001 + 1, 1, 2, 0, // 0b0000001110000010 + 20, 3, 1, 0, // 0b0000001110000011 + 0, 1, 1, 0, // 0b0000001110000100 + 11, 2, 2, 0, // 0b0000001110000101 + 2, 1, 3, 0, // 0b0000001110000110 + 30, 4, 1, 0, // 0b0000001110000111 + 0, 1, 1, 0, // 0b0000001110001000 + 10, 2, 1, 0, // 0b0000001110001001 + 1, 1, 2, 0, // 0b0000001110001010 + 21, 3, 2, 0, // 0b0000001110001011 + 0, 1, 1, 0, // 0b0000001110001100 + 12, 2, 3, 0, // 0b0000001110001101 + 3, 1, 4, 0, // 0b0000001110001110 + 40, 5, 1, 0, // 0b0000001110001111 + 0, 1, 1, 0, // 0b0000001110010000 + 10, 2, 1, 0, // 0b0000001110010001 + 1, 1, 2, 0, // 0b0000001110010010 + 20, 3, 1, 0, // 0b0000001110010011 + 0, 1, 1, 0, // 0b0000001110010100 + 11, 2, 2, 0, // 0b0000001110010101 + 2, 1, 3, 0, // 0b0000001110010110 + 31, 4, 2, 0, // 0b0000001110010111 + 0, 1, 1, 0, // 0b0000001110011000 + 10, 2, 1, 0, // 0b0000001110011001 + 1, 1, 2, 0, // 0b0000001110011010 + 22, 3, 3, 0, // 0b0000001110011011 + 0, 1, 1, 0, // 0b0000001110011100 + 13, 2, 4, 0, // 0b0000001110011101 + 4, 1, 5, 0, // 0b0000001110011110 + 50, 6, 1, 0, // 0b0000001110011111 + 0, 1, 1, 0, // 0b0000001110100000 + 10, 2, 1, 0, // 0b0000001110100001 + 1, 1, 2, 0, // 0b0000001110100010 + 20, 3, 1, 0, // 0b0000001110100011 + 0, 1, 1, 0, // 0b0000001110100100 + 11, 2, 2, 0, // 0b0000001110100101 + 2, 1, 3, 0, // 0b0000001110100110 + 30, 4, 1, 0, // 0b0000001110100111 + 0, 1, 1, 0, // 0b0000001110101000 + 10, 2, 1, 0, // 0b0000001110101001 + 1, 1, 2, 0, // 0b0000001110101010 + 21, 3, 2, 0, // 0b0000001110101011 + 0, 1, 1, 0, // 0b0000001110101100 + 12, 2, 3, 0, // 0b0000001110101101 + 3, 1, 4, 0, // 0b0000001110101110 + 41, 5, 2, 0, // 0b0000001110101111 + 0, 1, 1, 0, // 0b0000001110110000 + 10, 2, 1, 0, // 0b0000001110110001 + 1, 1, 2, 0, // 0b0000001110110010 + 20, 3, 1, 0, // 0b0000001110110011 + 0, 1, 1, 0, // 0b0000001110110100 + 11, 2, 2, 0, // 0b0000001110110101 + 2, 1, 3, 0, // 0b0000001110110110 + 32, 4, 3, 0, // 0b0000001110110111 + 0, 1, 1, 0, // 0b0000001110111000 + 10, 2, 1, 0, // 0b0000001110111001 + 1, 1, 2, 0, // 0b0000001110111010 + 23, 3, 4, 0, // 0b0000001110111011 + 0, 1, 1, 0, // 0b0000001110111100 + 14, 2, 5, 0, // 0b0000001110111101 + 5, 1, 6, 0, // 0b0000001110111110 + 63, 7, 4, 0, // 0b0000001110111111 + 0, 1, 1, 0, // 0b0000001111000000 + 10, 2, 1, 0, // 0b0000001111000001 + 1, 1, 2, 0, // 0b0000001111000010 + 20, 3, 1, 0, // 0b0000001111000011 + 0, 1, 1, 0, // 0b0000001111000100 + 11, 2, 2, 0, // 0b0000001111000101 + 2, 1, 3, 0, // 0b0000001111000110 + 30, 4, 1, 0, // 0b0000001111000111 + 0, 1, 1, 0, // 0b0000001111001000 + 10, 2, 1, 0, // 0b0000001111001001 + 1, 1, 2, 0, // 0b0000001111001010 + 21, 3, 2, 0, // 0b0000001111001011 + 0, 1, 1, 0, // 0b0000001111001100 + 12, 2, 3, 0, // 0b0000001111001101 + 3, 1, 4, 0, // 0b0000001111001110 + 40, 5, 1, 0, // 0b0000001111001111 + 0, 1, 1, 0, // 0b0000001111010000 + 10, 2, 1, 0, // 0b0000001111010001 + 1, 1, 2, 0, // 0b0000001111010010 + 20, 3, 1, 0, // 0b0000001111010011 + 0, 1, 1, 0, // 0b0000001111010100 + 11, 2, 2, 0, // 0b0000001111010101 + 2, 1, 3, 0, // 0b0000001111010110 + 31, 4, 2, 0, // 0b0000001111010111 + 0, 1, 1, 0, // 0b0000001111011000 + 10, 2, 1, 0, // 0b0000001111011001 + 1, 1, 2, 0, // 0b0000001111011010 + 22, 3, 3, 0, // 0b0000001111011011 + 0, 1, 1, 0, // 0b0000001111011100 + 13, 2, 4, 0, // 0b0000001111011101 + 4, 1, 5, 0, // 0b0000001111011110 + 54, 6, 5, 0, // 0b0000001111011111 + 0, 1, 1, 0, // 0b0000001111100000 + 10, 2, 1, 0, // 0b0000001111100001 + 1, 1, 2, 0, // 0b0000001111100010 + 20, 3, 1, 0, // 0b0000001111100011 + 0, 1, 1, 0, // 0b0000001111100100 + 11, 2, 2, 0, // 0b0000001111100101 + 2, 1, 3, 0, // 0b0000001111100110 + 30, 4, 1, 0, // 0b0000001111100111 + 0, 1, 1, 0, // 0b0000001111101000 + 10, 2, 1, 0, // 0b0000001111101001 + 1, 1, 2, 0, // 0b0000001111101010 + 21, 3, 2, 0, // 0b0000001111101011 + 0, 1, 1, 0, // 0b0000001111101100 + 12, 2, 3, 0, // 0b0000001111101101 + 3, 1, 4, 0, // 0b0000001111101110 + 45, 5, 6, 0, // 0b0000001111101111 + 0, 1, 1, 0, // 0b0000001111110000 + 10, 2, 1, 0, // 0b0000001111110001 + 1, 1, 2, 0, // 0b0000001111110010 + 20, 3, 1, 0, // 0b0000001111110011 + 0, 1, 1, 0, // 0b0000001111110100 + 11, 2, 2, 0, // 0b0000001111110101 + 2, 1, 3, 0, // 0b0000001111110110 + 36, 4, 7, 0, // 0b0000001111110111 + 0, 1, 1, 0, // 0b0000001111111000 + 10, 2, 1, 0, // 0b0000001111111001 + 1, 1, 2, 0, // 0b0000001111111010 + 27, 3, 8, 0, // 0b0000001111111011 + 0, 1, 1, 0, // 0b0000001111111100 + 18, 2, 9, 0, // 0b0000001111111101 + 9, 1, 10, 0, // 0b0000001111111110 + 84, 11, 1, 0 // 0b0000001111111111 ]; - + + public static ReadOnlySpan<(byte, byte, byte)> DoubleStep1 => MemoryMarshal.Cast(UnderlyingDoubleStep1); + public static readonly Vector128[] EncodeTwoVarIntShuffle = InitializeEncodeTwoVarIntShuffleTable(); private static Vector128[] InitializeEncodeTwoVarIntShuffleTable() diff --git a/Lagrange.Proto/Primitives/ProtoReader.cs b/Lagrange.Proto/Primitives/ProtoReader.cs index 0e4c92c8..0110cef3 100644 --- a/Lagrange.Proto/Primitives/ProtoReader.cs +++ b/Lagrange.Proto/Primitives/ProtoReader.cs @@ -302,8 +302,8 @@ private unsafe (TT, TU) DecodeTwo32VarIntUnsafe(ReadOnlySpan src) { var b = Unsafe.As>(ref MemoryMarshal.GetReference(src)); uint bitmask = (uint)Sse2.MoveMask(b) & 0b1111111111; - var (lookup, firstLen, secondLen) = Lookup.DoubleStep1[bitmask]; - var shuf = Lookup.DoubleVec[lookup]; + var (lookup, firstLen, secondLen) = Lookup.DoubleStep1[(int)bitmask]; + var shuf = Unsafe.Add(ref MemoryMarshal.GetReference(Lookup.DoubleVec), lookup); var comb = Ssse3.Shuffle(b, shuf).AsUInt64(); TT firstNum; From 39478b3dcbf341d5d00c5b9ed1fc132ebdf40b9a Mon Sep 17 00:00:00 2001 From: Executor Date: Fri, 20 Mar 2026 11:10:31 +0800 Subject: [PATCH 2/3] [Proto] Also make Lookup.EncodeTwoVarIntShuffle rva-static --- Lagrange.Proto/Primitives/Lookup.cs | 94 +++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 26 deletions(-) diff --git a/Lagrange.Proto/Primitives/Lookup.cs b/Lagrange.Proto/Primitives/Lookup.cs index b59a1712..230ba4d6 100644 --- a/Lagrange.Proto/Primitives/Lookup.cs +++ b/Lagrange.Proto/Primitives/Lookup.cs @@ -1131,31 +1131,73 @@ internal static class Lookup public static ReadOnlySpan<(byte, byte, byte)> DoubleStep1 => MemoryMarshal.Cast(UnderlyingDoubleStep1); - public static readonly Vector128[] EncodeTwoVarIntShuffle = InitializeEncodeTwoVarIntShuffleTable(); - - private static Vector128[] InitializeEncodeTwoVarIntShuffleTable() - { - const int maxBytes = 8; - var table = new Vector128[maxBytes * maxBytes]; - - for (int bytes1 = 1; bytes1 <= maxBytes; bytes1++) - { - for (int bytes2 = 1; bytes2 <= maxBytes; bytes2++) - { - if (bytes1 + bytes2 > 16) continue; - - int index = (bytes1 - 1) * maxBytes + (bytes2 - 1); - byte[] indices = new byte[16]; - int pos = 0; - - for (int i = 0; i < bytes1; i++) indices[pos++] = (byte)i; - for (int i = 0; i < bytes2; i++) indices[pos++] = (byte)(8 + i); - for (; pos < 16; pos++) indices[pos] = 0x80; - - table[index] = Vector128.Create(indices); - } - } + private static ReadOnlySpan UnderlyingEnc2VarIntShuffle => + [ + 0, 8, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 10, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 10, 11, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 10, 11, 12, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 10, 11, 12, 13, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 10, 11, 12, 13, 14, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 8, 9, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 10, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 10, 11, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 10, 11, 12, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 10, 11, 12, 13, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 10, 11, 12, 13, 14, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 8, 9, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 10, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 10, 11, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 10, 11, 12, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 10, 11, 12, 13, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 10, 11, 12, 13, 14, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 10, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 10, 11, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 10, 11, 12, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 10, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 10, 11, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 10, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 128, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 128, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 128, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 128, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 128, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 128, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 128, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 + ]; - return table; - } + public static ReadOnlySpan> EncodeTwoVarIntShuffle => MemoryMarshal.Cast>(UnderlyingEnc2VarIntShuffle); } \ No newline at end of file From d69abc34adf11951771bac4fd29fe7dfc7d61166 Mon Sep 17 00:00:00 2001 From: Executor Date: Fri, 20 Mar 2026 11:31:09 +0800 Subject: [PATCH 3/3] [Proto] Introduce DoubleStepInfo struct for memory consistency --- Lagrange.Proto/Primitives/Lookup.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Lagrange.Proto/Primitives/Lookup.cs b/Lagrange.Proto/Primitives/Lookup.cs index 230ba4d6..8844d2df 100644 --- a/Lagrange.Proto/Primitives/Lookup.cs +++ b/Lagrange.Proto/Primitives/Lookup.cs @@ -1129,7 +1129,7 @@ internal static class Lookup 84, 11, 1, 0 // 0b0000001111111111 ]; - public static ReadOnlySpan<(byte, byte, byte)> DoubleStep1 => MemoryMarshal.Cast(UnderlyingDoubleStep1); + public static ReadOnlySpan DoubleStep1 => MemoryMarshal.Cast(UnderlyingDoubleStep1); private static ReadOnlySpan UnderlyingEnc2VarIntShuffle => [ @@ -1200,4 +1200,17 @@ internal static class Lookup ]; public static ReadOnlySpan> EncodeTwoVarIntShuffle => MemoryMarshal.Cast>(UnderlyingEnc2VarIntShuffle); + + [StructLayout(LayoutKind.Sequential, Size = 4)] + public readonly struct DoubleStepInfo + { + public readonly byte Lookup, FirstLen, SecondLen; + + public void Deconstruct(out byte lookup, out byte firstLen, out byte secondLen) + { + lookup = Lookup; + firstLen = FirstLen; + secondLen = SecondLen; + } + } } \ No newline at end of file