diff --git a/src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md b/src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md index fa2e7e6fc6e12..c7817d1b3fe9f 100644 --- a/src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md +++ b/src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md @@ -1,6 +1,7 @@ # Instructions for updating Unicode version in dotnet/runtime ## Table of Contents + - [Instructions for updating Unicode version in dotnet/runtime](#instructions-for-updating-unicode-version-in-dotnetruntime) - [Table of Contents](#table-of-contents) - [Overview](#overview) @@ -24,8 +25,7 @@ This repository has several places that need to be updated when we are ingesting - extracted/DerivedBidiClass.txt - extracted/DerivedName.txt -2. Once you have downloaded all those files, create a fork of the repo https://github.com/dotnet/runtime-assets and send a PR which creates a folder at `src/System.Private.Runtime.UnicodeData/` and places all of the downloaded files from step 1 there. You can look at a sample PR that did this for Unicode 14.0.0 here: https://github.com/dotnet/runtime-assets/pull/179 - +2. Once you have downloaded all those files, create a fork of the repo and send a PR which creates a folder at `src/System.Private.Runtime.UnicodeData/` and places all of the downloaded files from step 1 there. You can look at a sample PR that did this for Unicode 14.0.0 here: ## Ingest the created package into dotnet/runtime repo @@ -42,6 +42,6 @@ This should be done automatically by dependency-flow, so in theory there shouldn - System.Globalization.Nls.Tests.csproj - System.Text.Encodings.Web.Tests.csproj 4. If the new Unicode data contains casing changes/updates, then we will also need to update `src/coreclr/pal/src/locale/unicodedata.cpp` file. This file is used by most of the reflection stack whenever you specify the `BindingFlags.IgnoreCase`. In order to regenerate the contents of the `unicdedata.cpp` file, you need to run the Program located at `src/coreclr/pal/src/locale/unicodedata.cs` and give a full path to the new UnicodeData.txt as a parameter. -5. If the new Unicode data made changes on what character class a specific character belongs to, or added new characters, you may need to update the serialized Unicode character classes data in `System.Text.RegularExpressions` for the `NonBacktracking` engine. The telling sign that will show you if you need to do this, is if any tests are failing in the `System.Text.RegularExpressions.Tests` test project. In case some tests do fail (which means you need to update the serialized mappings), you will need to edit the file `src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs` and set the `Enabled` bool to `true`, and re-run the RegexTests. This will generate a couple of files in your `%temp%` directory: `IgnoreCaseRelation.cs` and `UnicodeCategoryRanges.cs`. These files will need to be copied (and overwrite the existing ones) to the folder `src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/` +5. Update the Regex casing equivalence table using the UnicodeData.txt file from the new Unicode version. You can find the instructions on how to do this [here](../../../System.Text.RegularExpressions/tools/Readme.md). 6. Finally, last step is to update the license for the Unicode data into our [Third party notices](../../../../../THIRD-PARTY-NOTICES.TXT) by copying the contents located in `https://www.unicode.org/license.html` to the section that has the Unicode license in our notices. 7. That's it, now commit all of the changed files, and send a PR into dotnet/runtime with the updates. If there were any special things you had to do that are not noted on this document, PLEASE UPDATE THESE INSTRUCTIONS to facilitate future updates. diff --git a/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs b/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs index 0d42d4c357c44..c65e5187a5b21 100644 --- a/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs +++ b/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs @@ -161,6 +161,27 @@ private static void EmitRegexDerivedTypeRunnerFactory(IndentedTextWriter writer, writer.WriteLine($" // Description:"); DescribeExpression(writer, rm.Tree.Root.Child(0), " // ", analysis); // skip implicit root capture writer.WriteLine(); + if (rm.Tree.Culture != null) + { + // If the RegexTree has Culture set, then we need to emit the _textInfo field that should be used at match time for casing operations. + // Instead of just using the culture set on the tree, we use it to check which behavior corresponds to the culture, and based on that we + // create a TextInfo based on a well-known culture that has the same behavior. This is done in order to ensure that the culture being used at + // runtime will be supported no matter where the code ends up running. + writer.WriteLine($" /// TextInfo that will be used for Backreference case comparisons."); + switch (RegexCaseEquivalences.GetRegexBehavior(rm.Tree.Culture)) + { + case RegexCaseBehavior.Invariant: + writer.WriteLine($" private readonly TextInfo _textInfo = CultureInfo.InvariantCulture.TextInfo;"); + break; + case RegexCaseBehavior.NonTurkish: + writer.WriteLine($" private readonly TextInfo _textInfo = CultureInfo.GetCultureInfo(\"en-US\").TextInfo;"); + break; + case RegexCaseBehavior.Turkish: + writer.WriteLine($" private readonly TextInfo _textInfo = CultureInfo.GetCultureInfo(\"tr-TR\").TextInfo;"); + break; + } + writer.WriteLine(); + } writer.WriteLine($" /// Scan the starting from base.runtextstart for the next match."); writer.WriteLine($" /// The text being scanned by the regular expression."); writer.WriteLine($" protected override void Scan(ReadOnlySpan inputSpan)"); @@ -385,7 +406,6 @@ private static void EmitTryFindNextPossibleStartingPosition(IndentedTextWriter w { RegexOptions options = (RegexOptions)rm.Options; RegexTree regexTree = rm.Tree; - bool hasTextInfo = false; bool rtl = (options & RegexOptions.RightToLeft) != 0; // In some cases, we need to emit declarations at the beginning of the method, but we only discover we need them later. @@ -429,39 +449,31 @@ private static void EmitTryFindNextPossibleStartingPosition(IndentedTextWriter w { // Either anchors weren't specified, or they don't completely root all matches to a specific location. - // If whatever search operation we need to perform entails case-insensitive operations - // that weren't already handled via creation of sets, we need to get an store the - // TextInfo object to use (unless RegexOptions.CultureInvariant was specified). - EmitTextInfo(writer, ref hasTextInfo, rm); - // Emit the code for whatever find mode has been determined. switch (regexTree.FindOptimizations.FindMode) { - case FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive: - Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingCaseSensitivePrefix)); - EmitIndexOf_LeftToRight(regexTree.FindOptimizations.LeadingCaseSensitivePrefix); + case FindNextStartingPositionMode.LeadingPrefix_LeftToRight: + Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingPrefix)); + EmitIndexOf_LeftToRight(regexTree.FindOptimizations.LeadingPrefix); break; - case FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive: - Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingCaseSensitivePrefix)); - EmitIndexOf_RightToLeft(regexTree.FindOptimizations.LeadingCaseSensitivePrefix); + case FindNextStartingPositionMode.LeadingPrefix_RightToLeft: + Debug.Assert(!string.IsNullOrEmpty(regexTree.FindOptimizations.LeadingPrefix)); + EmitIndexOf_RightToLeft(regexTree.FindOptimizations.LeadingPrefix); break; - case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive: - case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive: - case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive: - case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive: + case FindNextStartingPositionMode.LeadingSet_LeftToRight: + case FindNextStartingPositionMode.FixedSets_LeftToRight: Debug.Assert(regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 }); EmitFixedSet_LeftToRight(); break; - case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive: - case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive: + case FindNextStartingPositionMode.LeadingSet_RightToLeft: Debug.Assert(regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 }); EmitFixedSet_RightToLeft(); break; - case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight: Debug.Assert(regexTree.FindOptimizations.LiteralAfterLoop is not null); EmitLiteralAfterAtomicLoop(); break; @@ -692,8 +704,8 @@ void EmitIndexOf_RightToLeft(string prefix) // and potentially other sets at other fixed positions in the pattern. void EmitFixedSet_LeftToRight() { - List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? sets = regexTree.FindOptimizations.FixedDistanceSets; - (char[]? Chars, string Set, int Distance, bool CaseInsensitive) primarySet = sets![0]; + List<(char[]? Chars, string Set, int Distance)>? sets = regexTree.FindOptimizations.FixedDistanceSets; + (char[]? Chars, string Set, int Distance) primarySet = sets![0]; const int MaxSets = 4; int setsToUse = Math.Min(sets.Count, MaxSets); @@ -705,7 +717,7 @@ void EmitFixedSet_LeftToRight() // If we can use IndexOf{Any}, try to accelerate the skip loop via vectorization to match the first prefix. // We can use it if this is a case-sensitive class with a small number of characters in the class. int setIndex = 0; - bool canUseIndexOf = !primarySet.CaseInsensitive && primarySet.Chars is not null; + bool canUseIndexOf = primarySet.Chars is not null; bool needLoop = !canUseIndexOf || setsToUse > 1; FinishEmitBlock loopBlock = default; @@ -785,7 +797,7 @@ void EmitFixedSet_LeftToRight() for (; setIndex < setsToUse; setIndex++) { string spanIndex = $"span[i{(sets[setIndex].Distance > 0 ? $" + {sets[setIndex].Distance}" : "")}]"; - string charInClassExpr = MatchCharacterClass(hasTextInfo, options, spanIndex, sets[setIndex].Set, sets[setIndex].CaseInsensitive, negate: false, additionalDeclarations, requiredHelpers); + string charInClassExpr = MatchCharacterClass(options, spanIndex, sets[setIndex].Set, negate: false, additionalDeclarations, requiredHelpers); if (setIndex == start) { @@ -815,13 +827,13 @@ void EmitFixedSet_LeftToRight() // (Currently that position will always be a distance of 0, meaning the start of the pattern itself.) void EmitFixedSet_RightToLeft() { - (char[]? Chars, string Set, int Distance, bool CaseInsensitive) set = regexTree.FindOptimizations.FixedDistanceSets![0]; + (char[]? Chars, string Set, int Distance) set = regexTree.FindOptimizations.FixedDistanceSets![0]; Debug.Assert(set.Distance == 0); writer.WriteLine($"// The pattern begins with {DescribeSet(set.Set)}."); writer.WriteLine($"// Find the next occurrence. If it can't be found, there's no match."); - if (set.Chars is { Length: 1 } && !set.CaseInsensitive) + if (set.Chars is { Length: 1 }) { writer.WriteLine($"pos = inputSpan.Slice(0, pos).LastIndexOf({Literal(set.Chars[0])});"); using (EmitBlock(writer, "if (pos >= 0)")) @@ -834,7 +846,7 @@ void EmitFixedSet_RightToLeft() { using (EmitBlock(writer, "while ((uint)--pos < (uint)inputSpan.Length)")) { - using (EmitBlock(writer, $"if ({MatchCharacterClass(hasTextInfo, options, "inputSpan[pos]", set.Set, set.CaseInsensitive, negate: false, additionalDeclarations, requiredHelpers)})")) + using (EmitBlock(writer, $"if ({MatchCharacterClass(options, "inputSpan[pos]", set.Set, negate: false, additionalDeclarations, requiredHelpers)})")) { writer.WriteLine("base.runtextpos = pos + 1;"); writer.WriteLine("return true;"); @@ -900,7 +912,7 @@ void EmitLiteralAfterAtomicLoop() // We found the literal. Walk backwards from it finding as many matches as we can against the loop. writer.WriteLine("int prev = i - 1;"); - using (EmitBlock(writer, $"while ((uint)prev < (uint)slice.Length && {MatchCharacterClass(hasTextInfo, options, "slice[prev]", target.LoopNode.Str!, caseInsensitive: false, negate: false, additionalDeclarations, requiredHelpers)})")) + using (EmitBlock(writer, $"while ((uint)prev < (uint)slice.Length && {MatchCharacterClass(options, "slice[prev]", target.LoopNode.Str!, negate: false, additionalDeclarations, requiredHelpers)})")) { writer.WriteLine("prev--;"); } @@ -928,31 +940,6 @@ void EmitLiteralAfterAtomicLoop() indexOfFoundBlock.Dispose(); } } - - // If a TextInfo is needed to perform ToLower operations, emits a local initialized to the TextInfo to use. - static void EmitTextInfo(IndentedTextWriter writer, ref bool hasTextInfo, RegexMethod rm) - { - // Emit local to store current culture if needed - if ((rm.Options & RegexOptions.CultureInvariant) == 0) - { - bool needsCulture = rm.Tree.FindOptimizations.FindMode switch - { - FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive or - FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive or - FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive => true, - - _ when rm.Tree.FindOptimizations.FixedDistanceSets is List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets => sets.Exists(set => set.CaseInsensitive), - - _ => false, - }; - - if (needsCulture) - { - hasTextInfo = true; - writer.WriteLine("TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;"); - } - } - } } /// Emits the body of the TryMatchAtCurrentPosition. @@ -1007,7 +994,6 @@ private static void EmitTryMatchAtCurrentPosition(IndentedTextWriter writer, Reg writer.WriteLine("int pos = base.runtextpos;"); writer.WriteLine($"int matchStart = pos;"); bool hasTimeout = EmitLoopTimeoutCounterIfNeeded(writer, rm); - bool hasTextInfo = EmitInitializeCultureForTryMatchAtCurrentPositionIfNecessary(writer, rm, analysis); writer.Flush(); int additionalDeclarationsPosition = ((StringWriter)writer.InnerWriter).GetStringBuilder().Length; int additionalDeclarationsIndent = writer.Indent; @@ -1112,12 +1098,6 @@ void CaseGoto(string clause, string label) writer.Indent--; } - // Whether the node has RegexOptions.IgnoreCase set. - // TODO: https://github.com/dotnet/runtime/issues/61048. We should be able to delete this and all usage sites once - // IgnoreCase is erradicated from the tree. The only place it should possibly be left after that work is in a Backreference, - // and that can do this check directly as needed. - static bool IsCaseInsensitive(RegexNode node) => (node.Options & RegexOptions.IgnoreCase) != 0; - // Slices the inputSpan starting at pos until end and stores it into slice. void SliceInputSpan(bool defineLocal = false) { @@ -1220,9 +1200,7 @@ void EmitAlternation(RegexNode node) for (int i = 0; i < childCount && useSwitchedBranches; i++) { // If it's not a One, Multi, or Set, we can't apply this optimization. - // If it's IgnoreCase (and wasn't reduced to a non-IgnoreCase set), also ignore it to keep the logic simple. - if (node.Child(i).FindBranchOneMultiOrSetStart() is not RegexNode oneMultiOrSet || - IsCaseInsensitive(oneMultiOrSet)) + if (node.Child(i).FindBranchOneMultiOrSetStart() is not RegexNode oneMultiOrSet) { useSwitchedBranches = false; break; @@ -1303,7 +1281,6 @@ void EmitSwitchedBranches() RegexNode? childStart = child.FindBranchOneMultiOrSetStart(); Debug.Assert(childStart is not null, "Unexpectedly couldn't find the branch starting node."); - Debug.Assert(!IsCaseInsensitive(childStart), "Expected only to find non-IgnoreCase branch starts"); if (childStart.Kind is RegexNodeKind.Set) { @@ -1572,7 +1549,7 @@ void EmitWhenHasCapture() additionalDeclarations.Add("int matchLength = 0;"); writer.WriteLine($"matchLength = base.MatchLength({capnum});"); - bool caseInsensitive = IsCaseInsensitive(node); + bool caseInsensitive = (node.Options & RegexOptions.IgnoreCase) != 0; if ((node.Options & RegexOptions.RightToLeft) == 0) { @@ -1599,7 +1576,7 @@ void EmitWhenHasCapture() writer.WriteLine($"matchIndex = base.MatchIndex({capnum});"); using (EmitBlock(writer, $"for (int i = 0; i < matchLength; i++)")) { - using (EmitBlock(writer, $"if ({ToLower(hasTextInfo, options, $"inputSpan[matchIndex + i]")} != {ToLower(hasTextInfo, options, $"{sliceSpan}[i]")})")) + using (EmitBlock(writer, $"if (_textInfo.ToLower(inputSpan[matchIndex + i]) != _textInfo.ToLower({sliceSpan}[i]))")) { Goto(doneLabel); } @@ -1622,7 +1599,9 @@ void EmitWhenHasCapture() writer.WriteLine($"matchIndex = base.MatchIndex({capnum});"); using (EmitBlock(writer, $"for (int i = 0; i < matchLength; i++)")) { - using (EmitBlock(writer, $"if ({ToLowerIfNeeded(hasTextInfo, options, $"inputSpan[matchIndex + i]", caseInsensitive)} != {ToLowerIfNeeded(hasTextInfo, options, $"inputSpan[pos - matchLength + i]", caseInsensitive)})")) + using (EmitBlock(writer, caseInsensitive ? + $"if (_textInfo.ToLower(inputSpan[matchIndex + i]) != _textInfo.ToLower(inputSpan[pos - matchLength + i]))" : + $"if (inputSpan[matchIndex + i] != inputSpan[pos - matchLength + i])")) { Goto(doneLabel); } @@ -2132,7 +2111,7 @@ void EmitNode(RegexNode node, RegexNode? subsequent = null, bool emitLengthCheck { // Before we handle general-purpose matching logic for nodes, handle any special-casing. // - - if (rm.Tree.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive && + if (rm.Tree.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight && rm.Tree.FindOptimizations.LiteralAfterLoop?.LoopNode == node) { Debug.Assert(sliceStaticPos == 0, "This should be the first node and thus static position shouldn't have advanced."); @@ -2212,7 +2191,7 @@ void EmitNode(RegexNode node, RegexNode? subsequent = null, bool emitLengthCheck EmitSingleChar(node, emitLengthChecksIfRequired); return; - case RegexNodeKind.Multi when !IsCaseInsensitive(node) && (node.Options & RegexOptions.RightToLeft) == 0: + case RegexNodeKind.Multi when (node.Options & RegexOptions.RightToLeft) == 0: EmitMultiChar(node, emitLengthChecksIfRequired); return; @@ -2388,10 +2367,10 @@ void WritePrefix() sliceStaticPos += caseInsensitiveString.Length; i += nodesConsumed - 1; } - else if (child.Kind is RegexNodeKind.Multi && !IsCaseInsensitive(child)) + else if (child.Kind is RegexNodeKind.Multi) { WritePrefix(); - EmitMultiCharString(child.Str!, caseInsensitive: false, emitLengthCheck: false, clauseOnly: true, rightToLeft: false); + EmitMultiCharString(child.Str!, emitLengthCheck: false, clauseOnly: true, rightToLeft: false); prevDescription = DescribeNode(child, analysis); wroteClauses = true; } @@ -2482,11 +2461,10 @@ void EmitSingleChar(RegexNode node, bool emitLengthCheck = true, string? offset if (node.IsSetFamily) { - expr = $"{MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: true, additionalDeclarations, requiredHelpers)}"; + expr = MatchCharacterClass(options, expr, node.Str!, negate: true, additionalDeclarations, requiredHelpers); } else { - expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node)); expr = $"{expr} {(node.IsOneFamily ? "!=" : "==")} {Literal(node.Ch)}"; } @@ -2615,13 +2593,13 @@ void EmitMultiChar(RegexNode node, bool emitLengthCheck) { Debug.Assert(node.Kind is RegexNodeKind.Multi, $"Unexpected type: {node.Kind}"); Debug.Assert(node.Str is not null); - EmitMultiCharString(node.Str, IsCaseInsensitive(node), emitLengthCheck, clauseOnly: false, (node.Options & RegexOptions.RightToLeft) != 0); + EmitMultiCharString(node.Str, emitLengthCheck, clauseOnly: false, (node.Options & RegexOptions.RightToLeft) != 0); } - void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, bool clauseOnly, bool rightToLeft) + void EmitMultiCharString(string str, bool emitLengthCheck, bool clauseOnly, bool rightToLeft) { Debug.Assert(str.Length >= 2); - Debug.Assert(!clauseOnly || (!emitLengthCheck && !caseInsensitive && !rightToLeft)); + Debug.Assert(!clauseOnly || (!emitLengthCheck && !rightToLeft)); if (rightToLeft) { @@ -2634,7 +2612,7 @@ void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, using (EmitBlock(writer, $"for (int i = 0; i < {str.Length}; i++)")) { - using (EmitBlock(writer, $"if ({ToLowerIfNeeded(hasTextInfo, options, "inputSpan[--pos]", caseInsensitive)} != {Literal(str)}[{str.Length - 1} - i])")) + using (EmitBlock(writer, $"if (inputSpan[--pos] != {Literal(str)}[{str.Length - 1} - i])")) { Goto(doneLabel); } @@ -2643,38 +2621,17 @@ void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, return; } - if (caseInsensitive) // StartsWith(..., XxIgnoreCase) won't necessarily be the same as char-by-char comparison + string sourceSpan = sliceStaticPos > 0 ? $"{sliceSpan}.Slice({sliceStaticPos})" : sliceSpan; + string clause = $"!{sourceSpan}.StartsWith({Literal(str)})"; + if (clauseOnly) { - // This case should be relatively rare. It will only occur with IgnoreCase and a series of non-ASCII characters. - - if (emitLengthCheck) - { - EmitSpanLengthCheck(str.Length); - } - - using (EmitBlock(writer, $"for (int i = 0; i < {Literal(str)}.Length; i++)")) - { - string textSpanIndex = sliceStaticPos > 0 ? $"i + {sliceStaticPos}" : "i"; - using (EmitBlock(writer, $"if ({ToLower(hasTextInfo, options, $"{sliceSpan}[{textSpanIndex}]")} != {Literal(str)}[i])")) - { - Goto(doneLabel); - } - } + writer.Write(clause); } else { - string sourceSpan = sliceStaticPos > 0 ? $"{sliceSpan}.Slice({sliceStaticPos})" : sliceSpan; - string clause = $"!{sourceSpan}.StartsWith({Literal(str)})"; - if (clauseOnly) - { - writer.Write(clause); - } - else + using (EmitBlock(writer, $"if ({clause})")) { - using (EmitBlock(writer, $"if ({clause})")) - { - Goto(doneLabel); - } + Goto(doneLabel); } } @@ -2883,7 +2840,6 @@ void EmitSingleCharLazy(RegexNode node, RegexNode? subsequent = null, bool emitL { if (iterationCount is null && node.Kind is RegexNodeKind.Notonelazy && - !IsCaseInsensitive(node) && subsequent?.FindStartingLiteral(4) is ValueTuple literal && // 5 == max optimized by IndexOfAny, and we need to reserve 1 for node.Ch (literal.Item3 is not null ? !literal.Item3.Contains(node.Ch) : (literal.Item2?[0] ?? literal.Item1) != node.Ch)) // no overlap between node.Ch and the start of the literal { @@ -3196,10 +3152,10 @@ void EmitSingleCharRepeater(RegexNode node, bool emitLengthCheck = true) EmitSingleChar(node, emitLengthCheck); return; - case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily && !IsCaseInsensitive(node): + case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily: // This is a repeated case-sensitive character; emit it as a multi in order to get all the optimizations // afforded to a multi, e.g. unrolling the loop with multi-char reads/comparisons at a time. - EmitMultiCharString(new string(node.Ch, iterations), caseInsensitive: false, emitLengthCheck, clauseOnly: false, rtl); + EmitMultiCharString(new string(node.Ch, iterations), emitLengthCheck, clauseOnly: false, rtl); return; } @@ -3301,11 +3257,10 @@ void EmitSingleCharAtomicLoop(RegexNode node, bool emitLengthChecksIfRequired = string expr = $"inputSpan[pos - {iterationLocal} - 1]"; if (node.IsSetFamily) { - expr = MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: false, additionalDeclarations, requiredHelpers); + expr = MatchCharacterClass(options, expr, node.Str!, negate: false, additionalDeclarations, requiredHelpers); } else { - expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node)); expr = $"{expr} {(node.IsOneFamily ? "==" : "!=")} {Literal(node.Ch)}"; } @@ -3319,9 +3274,7 @@ void EmitSingleCharAtomicLoop(RegexNode node, bool emitLengthChecksIfRequired = } writer.WriteLine(); } - else if (node.IsNotoneFamily && - maxIterations == int.MaxValue && - (!IsCaseInsensitive(node))) + else if (node.IsNotoneFamily && maxIterations == int.MaxValue) { // For Notone, we're looking for a specific character, as everything until we find // it is consumed by the loop. If we're unbounded, such as with ".*" and if we're case-sensitive, @@ -3346,7 +3299,6 @@ void EmitSingleCharAtomicLoop(RegexNode node, bool emitLengthChecksIfRequired = } else if (node.IsSetFamily && maxIterations == int.MaxValue && - !IsCaseInsensitive(node) && (numSetChars = RegexCharClass.GetSetChars(node.Str!, setChars)) != 0 && RegexCharClass.IsNegated(node.Str!)) { @@ -3389,11 +3341,10 @@ void EmitSingleCharAtomicLoop(RegexNode node, bool emitLengthChecksIfRequired = string expr = $"{sliceSpan}[{iterationLocal}]"; if (node.IsSetFamily) { - expr = MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: false, additionalDeclarations, requiredHelpers); + expr = MatchCharacterClass(options, expr, node.Str!, negate: false, additionalDeclarations, requiredHelpers); } else { - expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node)); expr = $"{expr} {(node.IsOneFamily ? "==" : "!=")} {Literal(node.Ch)}"; } @@ -3459,11 +3410,10 @@ void EmitAtomicSingleCharZeroOrOne(RegexNode node) if (node.IsSetFamily) { - expr = MatchCharacterClass(hasTextInfo, options, expr, node.Str!, IsCaseInsensitive(node), negate: false, additionalDeclarations, requiredHelpers); + expr = MatchCharacterClass(options, expr, node.Str!, negate: false, additionalDeclarations, requiredHelpers); } else { - expr = ToLowerIfNeeded(hasTextInfo, options, expr, IsCaseInsensitive(node)); expr = $"{expr} {(node.IsOneFamily ? "==" : "!=")} {Literal(node.Ch)}"; } @@ -3820,24 +3770,7 @@ private static void EmitTimeoutCheck(IndentedTextWriter writer, bool hasTimeout) } } - private static bool EmitInitializeCultureForTryMatchAtCurrentPositionIfNecessary(IndentedTextWriter writer, RegexMethod rm, AnalysisResults analysis) - { - if (analysis.HasIgnoreCase && ((RegexOptions)rm.Options & RegexOptions.CultureInvariant) == 0) - { - writer.WriteLine("TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;"); - return true; - } - - return false; - } - - private static bool UseToLowerInvariant(bool hasTextInfo, RegexOptions options) => !hasTextInfo || (options & RegexOptions.CultureInvariant) != 0; - - private static string ToLower(bool hasTextInfo, RegexOptions options, string expression) => UseToLowerInvariant(hasTextInfo, options) ? $"char.ToLowerInvariant({expression})" : $"textInfo.ToLower({expression})"; - - private static string ToLowerIfNeeded(bool hasTextInfo, RegexOptions options, string expression, bool toLower) => toLower ? ToLower(hasTextInfo, options, expression) : expression; - - private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options, string chExpr, string charClass, bool caseInsensitive, bool negate, HashSet additionalDeclarations, Dictionary requiredHelpers) + private static string MatchCharacterClass(RegexOptions options, string chExpr, string charClass, bool negate, HashSet additionalDeclarations, Dictionary requiredHelpers) { // We need to perform the equivalent of calling RegexRunner.CharInClass(ch, charClass), // but that call is relatively expensive. Before we fall back to it, we try to optimize @@ -3845,8 +3778,7 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options // for which we can call a dedicated method, or a fast-path for ASCII using a lookup table. // First, see if the char class is a built-in one for which there's a better function - // we can just call directly. Everything in this section must work correctly for both - // case-sensitive and case-insensitive modes, regardless of culture. + // we can just call directly. switch (charClass) { case RegexCharClass.AnyClass: @@ -3870,24 +3802,8 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options return $"{(negate ? "!" : "")}{HelpersTypeName}.IsWordChar({chExpr})"; } - // If we're meant to be doing a case-insensitive lookup, and if we're not using the invariant culture, - // lowercase the input. If we're using the invariant culture, we may still end up calling ToLower later - // on, but we may also be able to avoid it, in particular in the case of our lookup table, where we can - // generate the lookup table already factoring in the invariant case sensitivity. There are multiple - // special-code paths between here and the lookup table, but we only take those if invariant is false; - // if it were true, they'd need to use CallToLower(). - bool invariant = false; - if (caseInsensitive) - { - invariant = UseToLowerInvariant(hasTextInfo, options); - if (!invariant) - { - chExpr = ToLower(hasTextInfo, options, chExpr); - } - } - // Next, handle simple sets of one range, e.g. [A-Z], [0-9], etc. This includes some built-in classes, like ECMADigitClass. - if (!invariant && RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive)) + if (RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive)) { negate ^= RegexCharClass.IsNegated(charClass); return lowInclusive == highInclusive ? @@ -3898,7 +3814,7 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options // Next if the character class contains nothing but a single Unicode category, we can calle char.GetUnicodeCategory and // compare against it. It has a fast-lookup path for ASCII, so is as good or better than any lookup we'd generate (plus // we get smaller code), and it's what we'd do for the fallback (which we get to avoid generating) as part of CharInClass. - if (!invariant && RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated)) + if (RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated)) { negate ^= negated; return $"(char.GetUnicodeCategory({chExpr}) {(negate ? "!=" : "==")} UnicodeCategory.{category})"; @@ -3908,7 +3824,7 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options // it may be cheaper and smaller to compare against each than it is to use a lookup table. We can also special-case // the very common case with case insensitivity of two characters next to each other being the upper and lowercase // ASCII variants of each other, in which case we can use bit manipulation to avoid a comparison. - if (!invariant && !RegexCharClass.IsNegated(charClass)) + if (!RegexCharClass.IsNegated(charClass)) { Span setChars = stackalloc char[3]; int mask; @@ -3942,29 +3858,26 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options // Analyze the character set more to determine what code to generate. RegexCharClass.CharClassAnalysisResults analysis = RegexCharClass.Analyze(charClass); - if (!invariant) // if we're being asked to do a case insensitive, invariant comparison, use the lookup table + if (analysis.ContainsNoAscii) { - if (analysis.ContainsNoAscii) - { - // We determined that the character class contains only non-ASCII, - // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is - // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly - // extend the analysis to produce a known lower-bound and compare against - // that rather than always using 128 as the pivot point.) - return negate ? - $"((ch = {chExpr}) < 128 || !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" : - $"((ch = {chExpr}) >= 128 && RegexRunner.CharInClass((char)ch, {Literal(charClass)}))"; - } + // We determined that the character class contains only non-ASCII, + // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is + // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly + // extend the analysis to produce a known lower-bound and compare against + // that rather than always using 128 as the pivot point.) + return negate ? + $"((ch = {chExpr}) < 128 || !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" : + $"((ch = {chExpr}) >= 128 && RegexRunner.CharInClass((char)ch, {Literal(charClass)}))"; + } - if (analysis.AllAsciiContained) - { - // We determined that every ASCII character is in the class, for example - // if the class were the negated example from case 1 above: - // [^\p{IsGreek}\p{IsGreekExtended}]. - return negate ? - $"((ch = {chExpr}) >= 128 && !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" : - $"((ch = {chExpr}) < 128 || RegexRunner.CharInClass((char)ch, {Literal(charClass)}))"; - } + if (analysis.AllAsciiContained) + { + // We determined that every ASCII character is in the class, for example + // if the class were the negated example from case 1 above: + // [^\p{IsGreek}\p{IsGreekExtended}]. + return negate ? + $"((ch = {chExpr}) >= 128 && !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" : + $"((ch = {chExpr}) < 128 || RegexRunner.CharInClass((char)ch, {Literal(charClass)}))"; } // Now, our big hammer is to generate a lookup table that lets us quickly index by character into a yes/no @@ -3982,15 +3895,12 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options // Generate the lookup table to store 128 answers as bits. We use a const string instead of a byte[] / static // data property because it lets IL emit handle all the details for us. - string bitVectorString = StringExtensions.Create(8, (charClass, invariant), static (dest, state) => // String length is 8 chars == 16 bytes == 128 bits. + string bitVectorString = StringExtensions.Create(8, charClass, static (dest, charClass) => // String length is 8 chars == 16 bytes == 128 bits. { for (int i = 0; i < 128; i++) { char c = (char)i; - bool isSet = state.invariant ? - RegexCharClass.CharInClass(char.ToLowerInvariant(c), state.charClass) : - RegexCharClass.CharInClass(c, state.charClass); - if (isSet) + if (RegexCharClass.CharInClass(c, charClass)) { dest[i >> 4] |= (char)(1 << (i & 0xF)); } @@ -4023,13 +3933,9 @@ private static string MatchCharacterClass(bool hasTextInfo, RegexOptions options // We know that the whole class wasn't ASCII, and we don't know anything about the non-ASCII // characters other than that some might be included, for example if the character class // were [\w\d], so since ch >= 128, we need to fall back to calling CharInClass. - return (negate, invariant) switch - { - (false, false) => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) != 0 : RegexRunner.CharInClass((char)ch, {Literal(charClass)}))", - (true, false) => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) == 0 : !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))", - (false, true) => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) != 0 : RegexRunner.CharInClass(char.ToLowerInvariant((char)ch), {Literal(charClass)}))", - (true, true) => $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) == 0 : !RegexRunner.CharInClass(char.ToLowerInvariant((char)ch), {Literal(charClass)}))", - }; + return negate ? + $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) == 0 : !RegexRunner.CharInClass((char)ch, {Literal(charClass)}))" : + $"((ch = {chExpr}) < 128 ? ({Literal(bitVectorString)}[ch >> 4] & (1 << (ch & 0xF))) != 0 : RegexRunner.CharInClass((char)ch, {Literal(charClass)}))"; } /// diff --git a/src/libraries/System.Text.RegularExpressions/gen/System.Text.RegularExpressions.Generator.csproj b/src/libraries/System.Text.RegularExpressions/gen/System.Text.RegularExpressions.Generator.csproj index ad113612a5493..049e7c5d75735 100644 --- a/src/libraries/System.Text.RegularExpressions/gen/System.Text.RegularExpressions.Generator.csproj +++ b/src/libraries/System.Text.RegularExpressions/gen/System.Text.RegularExpressions.Generator.csproj @@ -33,8 +33,10 @@ + + + - diff --git a/src/libraries/System.Text.RegularExpressions/src/System.Text.RegularExpressions.csproj b/src/libraries/System.Text.RegularExpressions/src/System.Text.RegularExpressions.csproj index 4fc98880dc259..d3d916d23d864 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System.Text.RegularExpressions.csproj +++ b/src/libraries/System.Text.RegularExpressions/src/System.Text.RegularExpressions.csproj @@ -24,8 +24,10 @@ + + + - @@ -83,10 +85,6 @@ - - - - diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunner.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunner.cs index 459ca6ed590a7..5117029dac99f 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunner.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunner.cs @@ -1,17 +1,22 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Globalization; + namespace System.Text.RegularExpressions { internal sealed class CompiledRegexRunner : RegexRunner { private readonly ScanDelegate _scanMethod; + /// This field will only be set if the pattern contains backreferences and has RegexOptions.IgnoreCase + private readonly TextInfo? _textInfo; internal delegate void ScanDelegate(RegexRunner runner, ReadOnlySpan text); - public CompiledRegexRunner(ScanDelegate scan) + public CompiledRegexRunner(ScanDelegate scan, CultureInfo? culture) { _scanMethod = scan; + _textInfo = culture?.TextInfo; } protected internal override void Scan(ReadOnlySpan text) diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunnerFactory.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunnerFactory.cs index 4a9147e4d363b..b7ec852f4cdbe 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunnerFactory.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/CompiledRegexRunnerFactory.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Globalization; using System.Reflection.Emit; namespace System.Text.RegularExpressions @@ -8,17 +9,20 @@ namespace System.Text.RegularExpressions internal sealed class CompiledRegexRunnerFactory : RegexRunnerFactory { private readonly DynamicMethod _scanMethod; + /// This field will only be set if the pattern has backreferences and uses RegexOptions.IgnoreCase + private readonly CultureInfo? _culture; // Delegate is lazily created to avoid forcing JIT'ing until the regex is actually executed. private CompiledRegexRunner.ScanDelegate? _scan; - public CompiledRegexRunnerFactory(DynamicMethod scanMethod) + public CompiledRegexRunnerFactory(DynamicMethod scanMethod, CultureInfo? culture) { _scanMethod = scanMethod; + _culture = culture; } protected internal override RegexRunner CreateInstance() => new CompiledRegexRunner( - _scan ??= _scanMethod.CreateDelegate()); + _scan ??= _scanMethod.CreateDelegate(), _culture); } } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Debug.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Debug.cs index 572a47b4d4ed1..dd6f9c6976a2c 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Debug.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.Debug.cs @@ -44,13 +44,12 @@ internal void SaveDGML(TextWriter writer, bool nfa, bool addDotStar, bool revers } /// - /// Generates two files IgnoreCaseRelation.cs and UnicodeCategoryRanges.cs for the namespace System.Text.RegularExpressions.Symbolic.Unicode + /// Generates UnicodeCategoryRanges.cs for the namespace System.Text.RegularExpressions.Symbolic.Unicode /// in the given directory path. Only avaliable in DEBUG mode. /// [ExcludeFromCodeCoverage(Justification = "Debug only")] internal static void GenerateUnicodeTables(string path) { - IgnoreCaseRelationGenerator.Generate("System.Text.RegularExpressions.Symbolic.Unicode", "IgnoreCaseRelation", path); UnicodeCategoryRangesGenerator.Generate("System.Text.RegularExpressions.Symbolic.Unicode", "UnicodeCategoryRanges", path); } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.cs index 07b435a930967..b9bcb9866e1d7 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.cs @@ -67,7 +67,7 @@ internal Regex(string pattern, CultureInfo? culture) RegexTree tree = Init(pattern, RegexOptions.None, s_defaultMatchTimeout, ref culture); // Create the interpreter factory. - factory = new RegexInterpreterFactory(tree, culture); + factory = new RegexInterpreterFactory(tree); // NOTE: This overload _does not_ delegate to the one that takes options, in order // to avoid unnecessarily rooting the support for RegexOptions.NonBacktracking/Compiler @@ -101,7 +101,7 @@ internal Regex(string pattern, RegexOptions options, TimeSpan matchTimeout, Cult } // If no factory was created, fall back to creating one for the interpreter. - factory ??= new RegexInterpreterFactory(tree, culture); + factory ??= new RegexInterpreterFactory(tree); } } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseBehavior.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseBehavior.cs new file mode 100644 index 0000000000000..a02e2b100661f --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseBehavior.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Globalization; + +namespace System.Text.RegularExpressions +{ + /// + /// When a regular expression specifies the option then comparisons between the input and the + /// pattern will made case-insensitively. In order to support this, we need to define which case mappings shall be used for the comparisons. + /// A case mapping exists whenever you have two characters 'A' and 'B', where either 'A' is the ToLower() representation of 'B' or both 'A' and 'B' lowercase to the + /// same character. Note that we don't consider a mapping when the only relationship between 'A' and 'B' is that one is the ToUpper() representation of the other. This + /// is for backwards compatibility since, in Regex, we have only consider ToLower() for case insensitive comparisons. Given the case mappings vary depending on the culture, + /// Regex supports 3 main different behaviors or mappings: Invariant, NonTurkish, and Turkish. This is in order to match the behavior of all .NET supported cultures + /// current behavior for ToLower(). As a side note, there should be no cases where 'A'.ToLower() == 'B' but 'A'.ToLower() != 'B'.ToLower(). This aspect is important since + /// for backreferences we make use a.ToLower() == b.ToLower() for comparisons so if there was such a case then it would lead to inconsistencies between how we handle + /// backreferences vs how we handle other case insensitive comparisons. + /// + internal enum RegexCaseBehavior + { + /// + /// Invariant case-mappings are used. This includes all of the common mappings across cultures. This behavior is used when either the user + /// specified or when the CurrentCulture is . + /// + Invariant, + + /// + /// These are all the same mappings used by Invariant behavior, with an additional one: \u0130 => \u0069 + /// This mode will be used when CurrentCulture is not Invariant or any of the tr/az cultures. + /// + NonTurkish, + + /// + /// These are all the same mappings used by non-Turkish behavior, with the exception of: \u0049 => \u0069 which mapping doesn't exist + /// on this behavior and with the additional mapping of: \u0069 => \u0131. This mode will be used when CurrentCulture is any of the tr/az cultures. + /// + Turkish + } +} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.Data.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.Data.cs new file mode 100644 index 0000000000000..888d23f524a52 --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.Data.cs @@ -0,0 +1,814 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace System.Text.RegularExpressions +{ + internal static partial class RegexCaseEquivalences + { + // THE FOLLOWING DATA IS AUTO GENERATED BY GenerateRegexCasingTable program UNDER THE TOOLS FOLDER + // PLEASE DON'T MODIFY BY HAND + // IF YOU NEED TO UPDATE UNICODE VERSION FOLLOW THE GUIDE AT src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md + + private static char[] EquivalenceCasingValues { get; } = new char[2336] + { + '\u0041', '\u0061', '\u0042', '\u0062', '\u0043', '\u0063', '\u0044', '\u0064', '\u0045', '\u0065', '\u0046', '\u0066', '\u0047', '\u0067', '\u0048', '\u0068', + '\u0049', '\u0069', '\u004A', '\u006A', '\u004B', '\u006B', '\u212A', '\u004C', '\u006C', '\u004D', '\u006D', '\u004E', '\u006E', '\u004F', '\u006F', '\u0050', + '\u0070', '\u0051', '\u0071', '\u0052', '\u0072', '\u0053', '\u0073', '\u0054', '\u0074', '\u0055', '\u0075', '\u0056', '\u0076', '\u0057', '\u0077', '\u0058', + '\u0078', '\u0059', '\u0079', '\u005A', '\u007A', '\u00C0', '\u00E0', '\u00C1', '\u00E1', '\u00C2', '\u00E2', '\u00C3', '\u00E3', '\u00C4', '\u00E4', '\u00C5', + '\u00E5', '\u212B', '\u00C6', '\u00E6', '\u00C7', '\u00E7', '\u00C8', '\u00E8', '\u00C9', '\u00E9', '\u00CA', '\u00EA', '\u00CB', '\u00EB', '\u00CC', '\u00EC', + '\u00CD', '\u00ED', '\u00CE', '\u00EE', '\u00CF', '\u00EF', '\u00D0', '\u00F0', '\u00D1', '\u00F1', '\u00D2', '\u00F2', '\u00D3', '\u00F3', '\u00D4', '\u00F4', + '\u00D5', '\u00F5', '\u00D6', '\u00F6', '\u00D8', '\u00F8', '\u00D9', '\u00F9', '\u00DA', '\u00FA', '\u00DB', '\u00FB', '\u00DC', '\u00FC', '\u00DD', '\u00FD', + '\u00DE', '\u00FE', '\u0100', '\u0101', '\u0102', '\u0103', '\u0104', '\u0105', '\u0106', '\u0107', '\u0108', '\u0109', '\u010A', '\u010B', '\u010C', '\u010D', + '\u010E', '\u010F', '\u0110', '\u0111', '\u0112', '\u0113', '\u0114', '\u0115', '\u0116', '\u0117', '\u0118', '\u0119', '\u011A', '\u011B', '\u011C', '\u011D', + '\u011E', '\u011F', '\u0120', '\u0121', '\u0122', '\u0123', '\u0124', '\u0125', '\u0126', '\u0127', '\u0128', '\u0129', '\u012A', '\u012B', '\u012C', '\u012D', + '\u012E', '\u012F', '\u0132', '\u0133', '\u0134', '\u0135', '\u0136', '\u0137', '\u0139', '\u013A', '\u013B', '\u013C', '\u013D', '\u013E', '\u013F', '\u0140', + '\u0141', '\u0142', '\u0143', '\u0144', '\u0145', '\u0146', '\u0147', '\u0148', '\u014A', '\u014B', '\u014C', '\u014D', '\u014E', '\u014F', '\u0150', '\u0151', + '\u0152', '\u0153', '\u0154', '\u0155', '\u0156', '\u0157', '\u0158', '\u0159', '\u015A', '\u015B', '\u015C', '\u015D', '\u015E', '\u015F', '\u0160', '\u0161', + '\u0162', '\u0163', '\u0164', '\u0165', '\u0166', '\u0167', '\u0168', '\u0169', '\u016A', '\u016B', '\u016C', '\u016D', '\u016E', '\u016F', '\u0170', '\u0171', + '\u0172', '\u0173', '\u0174', '\u0175', '\u0176', '\u0177', '\u00FF', '\u0178', '\u0179', '\u017A', '\u017B', '\u017C', '\u017D', '\u017E', '\u0181', '\u0253', + '\u0182', '\u0183', '\u0184', '\u0185', '\u0186', '\u0254', '\u0187', '\u0188', '\u0189', '\u0256', '\u018A', '\u0257', '\u018B', '\u018C', '\u018E', '\u01DD', + '\u018F', '\u0259', '\u0190', '\u025B', '\u0191', '\u0192', '\u0193', '\u0260', '\u0194', '\u0263', '\u0196', '\u0269', '\u0197', '\u0268', '\u0198', '\u0199', + '\u019C', '\u026F', '\u019D', '\u0272', '\u019F', '\u0275', '\u01A0', '\u01A1', '\u01A2', '\u01A3', '\u01A4', '\u01A5', '\u01A6', '\u0280', '\u01A7', '\u01A8', + '\u01A9', '\u0283', '\u01AC', '\u01AD', '\u01AE', '\u0288', '\u01AF', '\u01B0', '\u01B1', '\u028A', '\u01B2', '\u028B', '\u01B3', '\u01B4', '\u01B5', '\u01B6', + '\u01B7', '\u0292', '\u01B8', '\u01B9', '\u01BC', '\u01BD', '\u01C4', '\u01C5', '\u01C6', '\u01C7', '\u01C8', '\u01C9', '\u01CA', '\u01CB', '\u01CC', '\u01CD', + '\u01CE', '\u01CF', '\u01D0', '\u01D1', '\u01D2', '\u01D3', '\u01D4', '\u01D5', '\u01D6', '\u01D7', '\u01D8', '\u01D9', '\u01DA', '\u01DB', '\u01DC', '\u01DE', + '\u01DF', '\u01E0', '\u01E1', '\u01E2', '\u01E3', '\u01E4', '\u01E5', '\u01E6', '\u01E7', '\u01E8', '\u01E9', '\u01EA', '\u01EB', '\u01EC', '\u01ED', '\u01EE', + '\u01EF', '\u01F1', '\u01F2', '\u01F3', '\u01F4', '\u01F5', '\u0195', '\u01F6', '\u01BF', '\u01F7', '\u01F8', '\u01F9', '\u01FA', '\u01FB', '\u01FC', '\u01FD', + '\u01FE', '\u01FF', '\u0200', '\u0201', '\u0202', '\u0203', '\u0204', '\u0205', '\u0206', '\u0207', '\u0208', '\u0209', '\u020A', '\u020B', '\u020C', '\u020D', + '\u020E', '\u020F', '\u0210', '\u0211', '\u0212', '\u0213', '\u0214', '\u0215', '\u0216', '\u0217', '\u0218', '\u0219', '\u021A', '\u021B', '\u021C', '\u021D', + '\u021E', '\u021F', '\u019E', '\u0220', '\u0222', '\u0223', '\u0224', '\u0225', '\u0226', '\u0227', '\u0228', '\u0229', '\u022A', '\u022B', '\u022C', '\u022D', + '\u022E', '\u022F', '\u0230', '\u0231', '\u0232', '\u0233', '\u023A', '\u2C65', '\u023B', '\u023C', '\u019A', '\u023D', '\u023E', '\u2C66', '\u0241', '\u0242', + '\u0180', '\u0243', '\u0244', '\u0289', '\u0245', '\u028C', '\u0246', '\u0247', '\u0248', '\u0249', '\u024A', '\u024B', '\u024C', '\u024D', '\u024E', '\u024F', + '\u0370', '\u0371', '\u0372', '\u0373', '\u0376', '\u0377', '\u037F', '\u03F3', '\u0386', '\u03AC', '\u0388', '\u03AD', '\u0389', '\u03AE', '\u038A', '\u03AF', + '\u038C', '\u03CC', '\u038E', '\u03CD', '\u038F', '\u03CE', '\u0391', '\u03B1', '\u0392', '\u03B2', '\u0393', '\u03B3', '\u0394', '\u03B4', '\u0395', '\u03B5', + '\u0396', '\u03B6', '\u0397', '\u03B7', '\u0398', '\u03B8', '\u03F4', '\u0399', '\u03B9', '\u039A', '\u03BA', '\u039B', '\u03BB', '\u039C', '\u03BC', '\u039D', + '\u03BD', '\u039E', '\u03BE', '\u039F', '\u03BF', '\u03A0', '\u03C0', '\u03A1', '\u03C1', '\u03A3', '\u03C3', '\u03A4', '\u03C4', '\u03A5', '\u03C5', '\u03A6', + '\u03C6', '\u03A7', '\u03C7', '\u03A8', '\u03C8', '\u03A9', '\u03C9', '\u2126', '\u03AA', '\u03CA', '\u03AB', '\u03CB', '\u03CF', '\u03D7', '\u03D8', '\u03D9', + '\u03DA', '\u03DB', '\u03DC', '\u03DD', '\u03DE', '\u03DF', '\u03E0', '\u03E1', '\u03E2', '\u03E3', '\u03E4', '\u03E5', '\u03E6', '\u03E7', '\u03E8', '\u03E9', + '\u03EA', '\u03EB', '\u03EC', '\u03ED', '\u03EE', '\u03EF', '\u03F7', '\u03F8', '\u03F2', '\u03F9', '\u03FA', '\u03FB', '\u037B', '\u03FD', '\u037C', '\u03FE', + '\u037D', '\u03FF', '\u0400', '\u0450', '\u0401', '\u0451', '\u0402', '\u0452', '\u0403', '\u0453', '\u0404', '\u0454', '\u0405', '\u0455', '\u0406', '\u0456', + '\u0407', '\u0457', '\u0408', '\u0458', '\u0409', '\u0459', '\u040A', '\u045A', '\u040B', '\u045B', '\u040C', '\u045C', '\u040D', '\u045D', '\u040E', '\u045E', + '\u040F', '\u045F', '\u0410', '\u0430', '\u0411', '\u0431', '\u0412', '\u0432', '\u0413', '\u0433', '\u0414', '\u0434', '\u0415', '\u0435', '\u0416', '\u0436', + '\u0417', '\u0437', '\u0418', '\u0438', '\u0419', '\u0439', '\u041A', '\u043A', '\u041B', '\u043B', '\u041C', '\u043C', '\u041D', '\u043D', '\u041E', '\u043E', + '\u041F', '\u043F', '\u0420', '\u0440', '\u0421', '\u0441', '\u0422', '\u0442', '\u0423', '\u0443', '\u0424', '\u0444', '\u0425', '\u0445', '\u0426', '\u0446', + '\u0427', '\u0447', '\u0428', '\u0448', '\u0429', '\u0449', '\u042A', '\u044A', '\u042B', '\u044B', '\u042C', '\u044C', '\u042D', '\u044D', '\u042E', '\u044E', + '\u042F', '\u044F', '\u0460', '\u0461', '\u0462', '\u0463', '\u0464', '\u0465', '\u0466', '\u0467', '\u0468', '\u0469', '\u046A', '\u046B', '\u046C', '\u046D', + '\u046E', '\u046F', '\u0470', '\u0471', '\u0472', '\u0473', '\u0474', '\u0475', '\u0476', '\u0477', '\u0478', '\u0479', '\u047A', '\u047B', '\u047C', '\u047D', + '\u047E', '\u047F', '\u0480', '\u0481', '\u048A', '\u048B', '\u048C', '\u048D', '\u048E', '\u048F', '\u0490', '\u0491', '\u0492', '\u0493', '\u0494', '\u0495', + '\u0496', '\u0497', '\u0498', '\u0499', '\u049A', '\u049B', '\u049C', '\u049D', '\u049E', '\u049F', '\u04A0', '\u04A1', '\u04A2', '\u04A3', '\u04A4', '\u04A5', + '\u04A6', '\u04A7', '\u04A8', '\u04A9', '\u04AA', '\u04AB', '\u04AC', '\u04AD', '\u04AE', '\u04AF', '\u04B0', '\u04B1', '\u04B2', '\u04B3', '\u04B4', '\u04B5', + '\u04B6', '\u04B7', '\u04B8', '\u04B9', '\u04BA', '\u04BB', '\u04BC', '\u04BD', '\u04BE', '\u04BF', '\u04C0', '\u04CF', '\u04C1', '\u04C2', '\u04C3', '\u04C4', + '\u04C5', '\u04C6', '\u04C7', '\u04C8', '\u04C9', '\u04CA', '\u04CB', '\u04CC', '\u04CD', '\u04CE', '\u04D0', '\u04D1', '\u04D2', '\u04D3', '\u04D4', '\u04D5', + '\u04D6', '\u04D7', '\u04D8', '\u04D9', '\u04DA', '\u04DB', '\u04DC', '\u04DD', '\u04DE', '\u04DF', '\u04E0', '\u04E1', '\u04E2', '\u04E3', '\u04E4', '\u04E5', + '\u04E6', '\u04E7', '\u04E8', '\u04E9', '\u04EA', '\u04EB', '\u04EC', '\u04ED', '\u04EE', '\u04EF', '\u04F0', '\u04F1', '\u04F2', '\u04F3', '\u04F4', '\u04F5', + '\u04F6', '\u04F7', '\u04F8', '\u04F9', '\u04FA', '\u04FB', '\u04FC', '\u04FD', '\u04FE', '\u04FF', '\u0500', '\u0501', '\u0502', '\u0503', '\u0504', '\u0505', + '\u0506', '\u0507', '\u0508', '\u0509', '\u050A', '\u050B', '\u050C', '\u050D', '\u050E', '\u050F', '\u0510', '\u0511', '\u0512', '\u0513', '\u0514', '\u0515', + '\u0516', '\u0517', '\u0518', '\u0519', '\u051A', '\u051B', '\u051C', '\u051D', '\u051E', '\u051F', '\u0520', '\u0521', '\u0522', '\u0523', '\u0524', '\u0525', + '\u0526', '\u0527', '\u0528', '\u0529', '\u052A', '\u052B', '\u052C', '\u052D', '\u052E', '\u052F', '\u0531', '\u0561', '\u0532', '\u0562', '\u0533', '\u0563', + '\u0534', '\u0564', '\u0535', '\u0565', '\u0536', '\u0566', '\u0537', '\u0567', '\u0538', '\u0568', '\u0539', '\u0569', '\u053A', '\u056A', '\u053B', '\u056B', + '\u053C', '\u056C', '\u053D', '\u056D', '\u053E', '\u056E', '\u053F', '\u056F', '\u0540', '\u0570', '\u0541', '\u0571', '\u0542', '\u0572', '\u0543', '\u0573', + '\u0544', '\u0574', '\u0545', '\u0575', '\u0546', '\u0576', '\u0547', '\u0577', '\u0548', '\u0578', '\u0549', '\u0579', '\u054A', '\u057A', '\u054B', '\u057B', + '\u054C', '\u057C', '\u054D', '\u057D', '\u054E', '\u057E', '\u054F', '\u057F', '\u0550', '\u0580', '\u0551', '\u0581', '\u0552', '\u0582', '\u0553', '\u0583', + '\u0554', '\u0584', '\u0555', '\u0585', '\u0556', '\u0586', '\u10A0', '\u2D00', '\u10A1', '\u2D01', '\u10A2', '\u2D02', '\u10A3', '\u2D03', '\u10A4', '\u2D04', + '\u10A5', '\u2D05', '\u10A6', '\u2D06', '\u10A7', '\u2D07', '\u10A8', '\u2D08', '\u10A9', '\u2D09', '\u10AA', '\u2D0A', '\u10AB', '\u2D0B', '\u10AC', '\u2D0C', + '\u10AD', '\u2D0D', '\u10AE', '\u2D0E', '\u10AF', '\u2D0F', '\u10B0', '\u2D10', '\u10B1', '\u2D11', '\u10B2', '\u2D12', '\u10B3', '\u2D13', '\u10B4', '\u2D14', + '\u10B5', '\u2D15', '\u10B6', '\u2D16', '\u10B7', '\u2D17', '\u10B8', '\u2D18', '\u10B9', '\u2D19', '\u10BA', '\u2D1A', '\u10BB', '\u2D1B', '\u10BC', '\u2D1C', + '\u10BD', '\u2D1D', '\u10BE', '\u2D1E', '\u10BF', '\u2D1F', '\u10C0', '\u2D20', '\u10C1', '\u2D21', '\u10C2', '\u2D22', '\u10C3', '\u2D23', '\u10C4', '\u2D24', + '\u10C5', '\u2D25', '\u10C7', '\u2D27', '\u10CD', '\u2D2D', '\u13A0', '\uAB70', '\u13A1', '\uAB71', '\u13A2', '\uAB72', '\u13A3', '\uAB73', '\u13A4', '\uAB74', + '\u13A5', '\uAB75', '\u13A6', '\uAB76', '\u13A7', '\uAB77', '\u13A8', '\uAB78', '\u13A9', '\uAB79', '\u13AA', '\uAB7A', '\u13AB', '\uAB7B', '\u13AC', '\uAB7C', + '\u13AD', '\uAB7D', '\u13AE', '\uAB7E', '\u13AF', '\uAB7F', '\u13B0', '\uAB80', '\u13B1', '\uAB81', '\u13B2', '\uAB82', '\u13B3', '\uAB83', '\u13B4', '\uAB84', + '\u13B5', '\uAB85', '\u13B6', '\uAB86', '\u13B7', '\uAB87', '\u13B8', '\uAB88', '\u13B9', '\uAB89', '\u13BA', '\uAB8A', '\u13BB', '\uAB8B', '\u13BC', '\uAB8C', + '\u13BD', '\uAB8D', '\u13BE', '\uAB8E', '\u13BF', '\uAB8F', '\u13C0', '\uAB90', '\u13C1', '\uAB91', '\u13C2', '\uAB92', '\u13C3', '\uAB93', '\u13C4', '\uAB94', + '\u13C5', '\uAB95', '\u13C6', '\uAB96', '\u13C7', '\uAB97', '\u13C8', '\uAB98', '\u13C9', '\uAB99', '\u13CA', '\uAB9A', '\u13CB', '\uAB9B', '\u13CC', '\uAB9C', + '\u13CD', '\uAB9D', '\u13CE', '\uAB9E', '\u13CF', '\uAB9F', '\u13D0', '\uABA0', '\u13D1', '\uABA1', '\u13D2', '\uABA2', '\u13D3', '\uABA3', '\u13D4', '\uABA4', + '\u13D5', '\uABA5', '\u13D6', '\uABA6', '\u13D7', '\uABA7', '\u13D8', '\uABA8', '\u13D9', '\uABA9', '\u13DA', '\uABAA', '\u13DB', '\uABAB', '\u13DC', '\uABAC', + '\u13DD', '\uABAD', '\u13DE', '\uABAE', '\u13DF', '\uABAF', '\u13E0', '\uABB0', '\u13E1', '\uABB1', '\u13E2', '\uABB2', '\u13E3', '\uABB3', '\u13E4', '\uABB4', + '\u13E5', '\uABB5', '\u13E6', '\uABB6', '\u13E7', '\uABB7', '\u13E8', '\uABB8', '\u13E9', '\uABB9', '\u13EA', '\uABBA', '\u13EB', '\uABBB', '\u13EC', '\uABBC', + '\u13ED', '\uABBD', '\u13EE', '\uABBE', '\u13EF', '\uABBF', '\u13F0', '\u13F8', '\u13F1', '\u13F9', '\u13F2', '\u13FA', '\u13F3', '\u13FB', '\u13F4', '\u13FC', + '\u13F5', '\u13FD', '\u10D0', '\u1C90', '\u10D1', '\u1C91', '\u10D2', '\u1C92', '\u10D3', '\u1C93', '\u10D4', '\u1C94', '\u10D5', '\u1C95', '\u10D6', '\u1C96', + '\u10D7', '\u1C97', '\u10D8', '\u1C98', '\u10D9', '\u1C99', '\u10DA', '\u1C9A', '\u10DB', '\u1C9B', '\u10DC', '\u1C9C', '\u10DD', '\u1C9D', '\u10DE', '\u1C9E', + '\u10DF', '\u1C9F', '\u10E0', '\u1CA0', '\u10E1', '\u1CA1', '\u10E2', '\u1CA2', '\u10E3', '\u1CA3', '\u10E4', '\u1CA4', '\u10E5', '\u1CA5', '\u10E6', '\u1CA6', + '\u10E7', '\u1CA7', '\u10E8', '\u1CA8', '\u10E9', '\u1CA9', '\u10EA', '\u1CAA', '\u10EB', '\u1CAB', '\u10EC', '\u1CAC', '\u10ED', '\u1CAD', '\u10EE', '\u1CAE', + '\u10EF', '\u1CAF', '\u10F0', '\u1CB0', '\u10F1', '\u1CB1', '\u10F2', '\u1CB2', '\u10F3', '\u1CB3', '\u10F4', '\u1CB4', '\u10F5', '\u1CB5', '\u10F6', '\u1CB6', + '\u10F7', '\u1CB7', '\u10F8', '\u1CB8', '\u10F9', '\u1CB9', '\u10FA', '\u1CBA', '\u10FD', '\u1CBD', '\u10FE', '\u1CBE', '\u10FF', '\u1CBF', '\u1E00', '\u1E01', + '\u1E02', '\u1E03', '\u1E04', '\u1E05', '\u1E06', '\u1E07', '\u1E08', '\u1E09', '\u1E0A', '\u1E0B', '\u1E0C', '\u1E0D', '\u1E0E', '\u1E0F', '\u1E10', '\u1E11', + '\u1E12', '\u1E13', '\u1E14', '\u1E15', '\u1E16', '\u1E17', '\u1E18', '\u1E19', '\u1E1A', '\u1E1B', '\u1E1C', '\u1E1D', '\u1E1E', '\u1E1F', '\u1E20', '\u1E21', + '\u1E22', '\u1E23', '\u1E24', '\u1E25', '\u1E26', '\u1E27', '\u1E28', '\u1E29', '\u1E2A', '\u1E2B', '\u1E2C', '\u1E2D', '\u1E2E', '\u1E2F', '\u1E30', '\u1E31', + '\u1E32', '\u1E33', '\u1E34', '\u1E35', '\u1E36', '\u1E37', '\u1E38', '\u1E39', '\u1E3A', '\u1E3B', '\u1E3C', '\u1E3D', '\u1E3E', '\u1E3F', '\u1E40', '\u1E41', + '\u1E42', '\u1E43', '\u1E44', '\u1E45', '\u1E46', '\u1E47', '\u1E48', '\u1E49', '\u1E4A', '\u1E4B', '\u1E4C', '\u1E4D', '\u1E4E', '\u1E4F', '\u1E50', '\u1E51', + '\u1E52', '\u1E53', '\u1E54', '\u1E55', '\u1E56', '\u1E57', '\u1E58', '\u1E59', '\u1E5A', '\u1E5B', '\u1E5C', '\u1E5D', '\u1E5E', '\u1E5F', '\u1E60', '\u1E61', + '\u1E62', '\u1E63', '\u1E64', '\u1E65', '\u1E66', '\u1E67', '\u1E68', '\u1E69', '\u1E6A', '\u1E6B', '\u1E6C', '\u1E6D', '\u1E6E', '\u1E6F', '\u1E70', '\u1E71', + '\u1E72', '\u1E73', '\u1E74', '\u1E75', '\u1E76', '\u1E77', '\u1E78', '\u1E79', '\u1E7A', '\u1E7B', '\u1E7C', '\u1E7D', '\u1E7E', '\u1E7F', '\u1E80', '\u1E81', + '\u1E82', '\u1E83', '\u1E84', '\u1E85', '\u1E86', '\u1E87', '\u1E88', '\u1E89', '\u1E8A', '\u1E8B', '\u1E8C', '\u1E8D', '\u1E8E', '\u1E8F', '\u1E90', '\u1E91', + '\u1E92', '\u1E93', '\u1E94', '\u1E95', '\u00DF', '\u1E9E', '\u1EA0', '\u1EA1', '\u1EA2', '\u1EA3', '\u1EA4', '\u1EA5', '\u1EA6', '\u1EA7', '\u1EA8', '\u1EA9', + '\u1EAA', '\u1EAB', '\u1EAC', '\u1EAD', '\u1EAE', '\u1EAF', '\u1EB0', '\u1EB1', '\u1EB2', '\u1EB3', '\u1EB4', '\u1EB5', '\u1EB6', '\u1EB7', '\u1EB8', '\u1EB9', + '\u1EBA', '\u1EBB', '\u1EBC', '\u1EBD', '\u1EBE', '\u1EBF', '\u1EC0', '\u1EC1', '\u1EC2', '\u1EC3', '\u1EC4', '\u1EC5', '\u1EC6', '\u1EC7', '\u1EC8', '\u1EC9', + '\u1ECA', '\u1ECB', '\u1ECC', '\u1ECD', '\u1ECE', '\u1ECF', '\u1ED0', '\u1ED1', '\u1ED2', '\u1ED3', '\u1ED4', '\u1ED5', '\u1ED6', '\u1ED7', '\u1ED8', '\u1ED9', + '\u1EDA', '\u1EDB', '\u1EDC', '\u1EDD', '\u1EDE', '\u1EDF', '\u1EE0', '\u1EE1', '\u1EE2', '\u1EE3', '\u1EE4', '\u1EE5', '\u1EE6', '\u1EE7', '\u1EE8', '\u1EE9', + '\u1EEA', '\u1EEB', '\u1EEC', '\u1EED', '\u1EEE', '\u1EEF', '\u1EF0', '\u1EF1', '\u1EF2', '\u1EF3', '\u1EF4', '\u1EF5', '\u1EF6', '\u1EF7', '\u1EF8', '\u1EF9', + '\u1EFA', '\u1EFB', '\u1EFC', '\u1EFD', '\u1EFE', '\u1EFF', '\u1F00', '\u1F08', '\u1F01', '\u1F09', '\u1F02', '\u1F0A', '\u1F03', '\u1F0B', '\u1F04', '\u1F0C', + '\u1F05', '\u1F0D', '\u1F06', '\u1F0E', '\u1F07', '\u1F0F', '\u1F10', '\u1F18', '\u1F11', '\u1F19', '\u1F12', '\u1F1A', '\u1F13', '\u1F1B', '\u1F14', '\u1F1C', + '\u1F15', '\u1F1D', '\u1F20', '\u1F28', '\u1F21', '\u1F29', '\u1F22', '\u1F2A', '\u1F23', '\u1F2B', '\u1F24', '\u1F2C', '\u1F25', '\u1F2D', '\u1F26', '\u1F2E', + '\u1F27', '\u1F2F', '\u1F30', '\u1F38', '\u1F31', '\u1F39', '\u1F32', '\u1F3A', '\u1F33', '\u1F3B', '\u1F34', '\u1F3C', '\u1F35', '\u1F3D', '\u1F36', '\u1F3E', + '\u1F37', '\u1F3F', '\u1F40', '\u1F48', '\u1F41', '\u1F49', '\u1F42', '\u1F4A', '\u1F43', '\u1F4B', '\u1F44', '\u1F4C', '\u1F45', '\u1F4D', '\u1F51', '\u1F59', + '\u1F53', '\u1F5B', '\u1F55', '\u1F5D', '\u1F57', '\u1F5F', '\u1F60', '\u1F68', '\u1F61', '\u1F69', '\u1F62', '\u1F6A', '\u1F63', '\u1F6B', '\u1F64', '\u1F6C', + '\u1F65', '\u1F6D', '\u1F66', '\u1F6E', '\u1F67', '\u1F6F', '\u1F80', '\u1F88', '\u1F81', '\u1F89', '\u1F82', '\u1F8A', '\u1F83', '\u1F8B', '\u1F84', '\u1F8C', + '\u1F85', '\u1F8D', '\u1F86', '\u1F8E', '\u1F87', '\u1F8F', '\u1F90', '\u1F98', '\u1F91', '\u1F99', '\u1F92', '\u1F9A', '\u1F93', '\u1F9B', '\u1F94', '\u1F9C', + '\u1F95', '\u1F9D', '\u1F96', '\u1F9E', '\u1F97', '\u1F9F', '\u1FA0', '\u1FA8', '\u1FA1', '\u1FA9', '\u1FA2', '\u1FAA', '\u1FA3', '\u1FAB', '\u1FA4', '\u1FAC', + '\u1FA5', '\u1FAD', '\u1FA6', '\u1FAE', '\u1FA7', '\u1FAF', '\u1FB0', '\u1FB8', '\u1FB1', '\u1FB9', '\u1F70', '\u1FBA', '\u1F71', '\u1FBB', '\u1FB3', '\u1FBC', + '\u1F72', '\u1FC8', '\u1F73', '\u1FC9', '\u1F74', '\u1FCA', '\u1F75', '\u1FCB', '\u1FC3', '\u1FCC', '\u1FD0', '\u1FD8', '\u1FD1', '\u1FD9', '\u1F76', '\u1FDA', + '\u1F77', '\u1FDB', '\u1FE0', '\u1FE8', '\u1FE1', '\u1FE9', '\u1F7A', '\u1FEA', '\u1F7B', '\u1FEB', '\u1FE5', '\u1FEC', '\u1F78', '\u1FF8', '\u1F79', '\u1FF9', + '\u1F7C', '\u1FFA', '\u1F7D', '\u1FFB', '\u1FF3', '\u1FFC', '\u2132', '\u214E', '\u2160', '\u2170', '\u2161', '\u2171', '\u2162', '\u2172', '\u2163', '\u2173', + '\u2164', '\u2174', '\u2165', '\u2175', '\u2166', '\u2176', '\u2167', '\u2177', '\u2168', '\u2178', '\u2169', '\u2179', '\u216A', '\u217A', '\u216B', '\u217B', + '\u216C', '\u217C', '\u216D', '\u217D', '\u216E', '\u217E', '\u216F', '\u217F', '\u2183', '\u2184', '\u24B6', '\u24D0', '\u24B7', '\u24D1', '\u24B8', '\u24D2', + '\u24B9', '\u24D3', '\u24BA', '\u24D4', '\u24BB', '\u24D5', '\u24BC', '\u24D6', '\u24BD', '\u24D7', '\u24BE', '\u24D8', '\u24BF', '\u24D9', '\u24C0', '\u24DA', + '\u24C1', '\u24DB', '\u24C2', '\u24DC', '\u24C3', '\u24DD', '\u24C4', '\u24DE', '\u24C5', '\u24DF', '\u24C6', '\u24E0', '\u24C7', '\u24E1', '\u24C8', '\u24E2', + '\u24C9', '\u24E3', '\u24CA', '\u24E4', '\u24CB', '\u24E5', '\u24CC', '\u24E6', '\u24CD', '\u24E7', '\u24CE', '\u24E8', '\u24CF', '\u24E9', '\u2C00', '\u2C30', + '\u2C01', '\u2C31', '\u2C02', '\u2C32', '\u2C03', '\u2C33', '\u2C04', '\u2C34', '\u2C05', '\u2C35', '\u2C06', '\u2C36', '\u2C07', '\u2C37', '\u2C08', '\u2C38', + '\u2C09', '\u2C39', '\u2C0A', '\u2C3A', '\u2C0B', '\u2C3B', '\u2C0C', '\u2C3C', '\u2C0D', '\u2C3D', '\u2C0E', '\u2C3E', '\u2C0F', '\u2C3F', '\u2C10', '\u2C40', + '\u2C11', '\u2C41', '\u2C12', '\u2C42', '\u2C13', '\u2C43', '\u2C14', '\u2C44', '\u2C15', '\u2C45', '\u2C16', '\u2C46', '\u2C17', '\u2C47', '\u2C18', '\u2C48', + '\u2C19', '\u2C49', '\u2C1A', '\u2C4A', '\u2C1B', '\u2C4B', '\u2C1C', '\u2C4C', '\u2C1D', '\u2C4D', '\u2C1E', '\u2C4E', '\u2C1F', '\u2C4F', '\u2C20', '\u2C50', + '\u2C21', '\u2C51', '\u2C22', '\u2C52', '\u2C23', '\u2C53', '\u2C24', '\u2C54', '\u2C25', '\u2C55', '\u2C26', '\u2C56', '\u2C27', '\u2C57', '\u2C28', '\u2C58', + '\u2C29', '\u2C59', '\u2C2A', '\u2C5A', '\u2C2B', '\u2C5B', '\u2C2C', '\u2C5C', '\u2C2D', '\u2C5D', '\u2C2E', '\u2C5E', '\u2C2F', '\u2C5F', '\u2C60', '\u2C61', + '\u026B', '\u2C62', '\u1D7D', '\u2C63', '\u027D', '\u2C64', '\u2C67', '\u2C68', '\u2C69', '\u2C6A', '\u2C6B', '\u2C6C', '\u0251', '\u2C6D', '\u0271', '\u2C6E', + '\u0250', '\u2C6F', '\u0252', '\u2C70', '\u2C72', '\u2C73', '\u2C75', '\u2C76', '\u023F', '\u2C7E', '\u0240', '\u2C7F', '\u2C80', '\u2C81', '\u2C82', '\u2C83', + '\u2C84', '\u2C85', '\u2C86', '\u2C87', '\u2C88', '\u2C89', '\u2C8A', '\u2C8B', '\u2C8C', '\u2C8D', '\u2C8E', '\u2C8F', '\u2C90', '\u2C91', '\u2C92', '\u2C93', + '\u2C94', '\u2C95', '\u2C96', '\u2C97', '\u2C98', '\u2C99', '\u2C9A', '\u2C9B', '\u2C9C', '\u2C9D', '\u2C9E', '\u2C9F', '\u2CA0', '\u2CA1', '\u2CA2', '\u2CA3', + '\u2CA4', '\u2CA5', '\u2CA6', '\u2CA7', '\u2CA8', '\u2CA9', '\u2CAA', '\u2CAB', '\u2CAC', '\u2CAD', '\u2CAE', '\u2CAF', '\u2CB0', '\u2CB1', '\u2CB2', '\u2CB3', + '\u2CB4', '\u2CB5', '\u2CB6', '\u2CB7', '\u2CB8', '\u2CB9', '\u2CBA', '\u2CBB', '\u2CBC', '\u2CBD', '\u2CBE', '\u2CBF', '\u2CC0', '\u2CC1', '\u2CC2', '\u2CC3', + '\u2CC4', '\u2CC5', '\u2CC6', '\u2CC7', '\u2CC8', '\u2CC9', '\u2CCA', '\u2CCB', '\u2CCC', '\u2CCD', '\u2CCE', '\u2CCF', '\u2CD0', '\u2CD1', '\u2CD2', '\u2CD3', + '\u2CD4', '\u2CD5', '\u2CD6', '\u2CD7', '\u2CD8', '\u2CD9', '\u2CDA', '\u2CDB', '\u2CDC', '\u2CDD', '\u2CDE', '\u2CDF', '\u2CE0', '\u2CE1', '\u2CE2', '\u2CE3', + '\u2CEB', '\u2CEC', '\u2CED', '\u2CEE', '\u2CF2', '\u2CF3', '\uA640', '\uA641', '\uA642', '\uA643', '\uA644', '\uA645', '\uA646', '\uA647', '\uA648', '\uA649', + '\uA64A', '\uA64B', '\uA64C', '\uA64D', '\uA64E', '\uA64F', '\uA650', '\uA651', '\uA652', '\uA653', '\uA654', '\uA655', '\uA656', '\uA657', '\uA658', '\uA659', + '\uA65A', '\uA65B', '\uA65C', '\uA65D', '\uA65E', '\uA65F', '\uA660', '\uA661', '\uA662', '\uA663', '\uA664', '\uA665', '\uA666', '\uA667', '\uA668', '\uA669', + '\uA66A', '\uA66B', '\uA66C', '\uA66D', '\uA680', '\uA681', '\uA682', '\uA683', '\uA684', '\uA685', '\uA686', '\uA687', '\uA688', '\uA689', '\uA68A', '\uA68B', + '\uA68C', '\uA68D', '\uA68E', '\uA68F', '\uA690', '\uA691', '\uA692', '\uA693', '\uA694', '\uA695', '\uA696', '\uA697', '\uA698', '\uA699', '\uA69A', '\uA69B', + '\uA722', '\uA723', '\uA724', '\uA725', '\uA726', '\uA727', '\uA728', '\uA729', '\uA72A', '\uA72B', '\uA72C', '\uA72D', '\uA72E', '\uA72F', '\uA732', '\uA733', + '\uA734', '\uA735', '\uA736', '\uA737', '\uA738', '\uA739', '\uA73A', '\uA73B', '\uA73C', '\uA73D', '\uA73E', '\uA73F', '\uA740', '\uA741', '\uA742', '\uA743', + '\uA744', '\uA745', '\uA746', '\uA747', '\uA748', '\uA749', '\uA74A', '\uA74B', '\uA74C', '\uA74D', '\uA74E', '\uA74F', '\uA750', '\uA751', '\uA752', '\uA753', + '\uA754', '\uA755', '\uA756', '\uA757', '\uA758', '\uA759', '\uA75A', '\uA75B', '\uA75C', '\uA75D', '\uA75E', '\uA75F', '\uA760', '\uA761', '\uA762', '\uA763', + '\uA764', '\uA765', '\uA766', '\uA767', '\uA768', '\uA769', '\uA76A', '\uA76B', '\uA76C', '\uA76D', '\uA76E', '\uA76F', '\uA779', '\uA77A', '\uA77B', '\uA77C', + '\u1D79', '\uA77D', '\uA77E', '\uA77F', '\uA780', '\uA781', '\uA782', '\uA783', '\uA784', '\uA785', '\uA786', '\uA787', '\uA78B', '\uA78C', '\u0265', '\uA78D', + '\uA790', '\uA791', '\uA792', '\uA793', '\uA796', '\uA797', '\uA798', '\uA799', '\uA79A', '\uA79B', '\uA79C', '\uA79D', '\uA79E', '\uA79F', '\uA7A0', '\uA7A1', + '\uA7A2', '\uA7A3', '\uA7A4', '\uA7A5', '\uA7A6', '\uA7A7', '\uA7A8', '\uA7A9', '\u0266', '\uA7AA', '\u025C', '\uA7AB', '\u0261', '\uA7AC', '\u026C', '\uA7AD', + '\u026A', '\uA7AE', '\u029E', '\uA7B0', '\u0287', '\uA7B1', '\u029D', '\uA7B2', '\uA7B3', '\uAB53', '\uA7B4', '\uA7B5', '\uA7B6', '\uA7B7', '\uA7B8', '\uA7B9', + '\uA7BA', '\uA7BB', '\uA7BC', '\uA7BD', '\uA7BE', '\uA7BF', '\uA7C0', '\uA7C1', '\uA7C2', '\uA7C3', '\uA794', '\uA7C4', '\u0282', '\uA7C5', '\u1D8E', '\uA7C6', + '\uA7C7', '\uA7C8', '\uA7C9', '\uA7CA', '\uA7D0', '\uA7D1', '\uA7D6', '\uA7D7', '\uA7D8', '\uA7D9', '\uA7F5', '\uA7F6', '\uFF21', '\uFF41', '\uFF22', '\uFF42', + '\uFF23', '\uFF43', '\uFF24', '\uFF44', '\uFF25', '\uFF45', '\uFF26', '\uFF46', '\uFF27', '\uFF47', '\uFF28', '\uFF48', '\uFF29', '\uFF49', '\uFF2A', '\uFF4A', + '\uFF2B', '\uFF4B', '\uFF2C', '\uFF4C', '\uFF2D', '\uFF4D', '\uFF2E', '\uFF4E', '\uFF2F', '\uFF4F', '\uFF30', '\uFF50', '\uFF31', '\uFF51', '\uFF32', '\uFF52', + '\uFF33', '\uFF53', '\uFF34', '\uFF54', '\uFF35', '\uFF55', '\uFF36', '\uFF56', '\uFF37', '\uFF57', '\uFF38', '\uFF58', '\uFF39', '\uFF59', '\uFF3A', '\uFF5A' + }; + + private static ushort[] EquivalenceFirstLevelLookup { get; } = new ushort[64] + { + 0x0000, 0x0400, 0xffff, 0xffff, 0x0800, 0xffff, 0xffff, 0x0c00, 0x1000, 0x1400, 0xffff, 0x1800, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1c00, 0x2000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2400 + }; + + private static ushort[] EquivalenceCasingMap { get; } = new ushort[10240] + { + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0x4000, 0x4002, 0x4004, 0x4006, 0x4008, 0x400a, 0x400c, 0x400e, 0x4010, 0x4012, 0x6014, 0x4017, 0x4019, 0x401b, 0x401d, + 0x401f, 0x4021, 0x4023, 0x4025, 0x4027, 0x4029, 0x402b, 0x402d, 0x402f, 0x4031, 0x4033, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0x4000, 0x4002, 0x4004, 0x4006, 0x4008, 0x400a, 0x400c, 0x400e, 0x4010, 0x4012, 0x6014, 0x4017, 0x4019, 0x401b, 0x401d, + 0x401f, 0x4021, 0x4023, 0x4025, 0x4027, 0x4029, 0x402b, 0x402d, 0x402f, 0x4031, 0x4033, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x4035, 0x4037, 0x4039, 0x403b, 0x403d, 0x603f, 0x4042, 0x4044, 0x4046, 0x4048, 0x404a, 0x404c, 0x404e, 0x4050, 0x4052, 0x4054, + 0x4056, 0x4058, 0x405a, 0x405c, 0x405e, 0x4060, 0x4062, 0xffff, 0x4064, 0x4066, 0x4068, 0x406a, 0x406c, 0x406e, 0x4070, 0x4594, + 0x4035, 0x4037, 0x4039, 0x403b, 0x403d, 0x603f, 0x4042, 0x4044, 0x4046, 0x4048, 0x404a, 0x404c, 0x404e, 0x4050, 0x4052, 0x4054, + 0x4056, 0x4058, 0x405a, 0x405c, 0x405e, 0x4060, 0x4062, 0xffff, 0x4064, 0x4066, 0x4068, 0x406a, 0x406c, 0x406e, 0x4070, 0x40e6, + 0x4072, 0x4072, 0x4074, 0x4074, 0x4076, 0x4076, 0x4078, 0x4078, 0x407a, 0x407a, 0x407c, 0x407c, 0x407e, 0x407e, 0x4080, 0x4080, + 0x4082, 0x4082, 0x4084, 0x4084, 0x4086, 0x4086, 0x4088, 0x4088, 0x408a, 0x408a, 0x408c, 0x408c, 0x408e, 0x408e, 0x4090, 0x4090, + 0x4092, 0x4092, 0x4094, 0x4094, 0x4096, 0x4096, 0x4098, 0x4098, 0x409a, 0x409a, 0x409c, 0x409c, 0x409e, 0x409e, 0x40a0, 0x40a0, + 0xffff, 0xffff, 0x40a2, 0x40a2, 0x40a4, 0x40a4, 0x40a6, 0x40a6, 0xffff, 0x40a8, 0x40a8, 0x40aa, 0x40aa, 0x40ac, 0x40ac, 0x40ae, + 0x40ae, 0x40b0, 0x40b0, 0x40b2, 0x40b2, 0x40b4, 0x40b4, 0x40b6, 0x40b6, 0xffff, 0x40b8, 0x40b8, 0x40ba, 0x40ba, 0x40bc, 0x40bc, + 0x40be, 0x40be, 0x40c0, 0x40c0, 0x40c2, 0x40c2, 0x40c4, 0x40c4, 0x40c6, 0x40c6, 0x40c8, 0x40c8, 0x40ca, 0x40ca, 0x40cc, 0x40cc, + 0x40ce, 0x40ce, 0x40d0, 0x40d0, 0x40d2, 0x40d2, 0x40d4, 0x40d4, 0x40d6, 0x40d6, 0x40d8, 0x40d8, 0x40da, 0x40da, 0x40dc, 0x40dc, + 0x40de, 0x40de, 0x40e0, 0x40e0, 0x40e2, 0x40e2, 0x40e4, 0x40e4, 0x40e6, 0x40e8, 0x40e8, 0x40ea, 0x40ea, 0x40ec, 0x40ec, 0xffff, + 0x41b0, 0x40ee, 0x40f0, 0x40f0, 0x40f2, 0x40f2, 0x40f4, 0x40f6, 0x40f6, 0x40f8, 0x40fa, 0x40fc, 0x40fc, 0xffff, 0x40fe, 0x4100, + 0x4102, 0x4104, 0x4104, 0x4106, 0x4108, 0x4166, 0x410a, 0x410c, 0x410e, 0x410e, 0x41aa, 0xffff, 0x4110, 0x4112, 0x4192, 0x4114, + 0x4116, 0x4116, 0x4118, 0x4118, 0x411a, 0x411a, 0x411c, 0x411e, 0x411e, 0x4120, 0xffff, 0xffff, 0x4122, 0x4122, 0x4124, 0x4126, + 0x4126, 0x4128, 0x412a, 0x412c, 0x412c, 0x412e, 0x412e, 0x4130, 0x4132, 0x4132, 0xffff, 0xffff, 0x4134, 0x4134, 0xffff, 0x4168, + 0xffff, 0xffff, 0xffff, 0xffff, 0x6136, 0x6136, 0x6136, 0x6139, 0x6139, 0x6139, 0x613c, 0x613c, 0x613c, 0x413f, 0x413f, 0x4141, + 0x4141, 0x4143, 0x4143, 0x4145, 0x4145, 0x4147, 0x4147, 0x4149, 0x4149, 0x414b, 0x414b, 0x414d, 0x414d, 0x40fe, 0x414f, 0x414f, + 0x4151, 0x4151, 0x4153, 0x4153, 0x4155, 0x4155, 0x4157, 0x4157, 0x4159, 0x4159, 0x415b, 0x415b, 0x415d, 0x415d, 0x415f, 0x415f, + 0xffff, 0x6161, 0x6161, 0x6161, 0x4164, 0x4164, 0x4166, 0x4168, 0x416a, 0x416a, 0x416c, 0x416c, 0x416e, 0x416e, 0x4170, 0x4170, + 0x4172, 0x4172, 0x4174, 0x4174, 0x4176, 0x4176, 0x4178, 0x4178, 0x417a, 0x417a, 0x417c, 0x417c, 0x417e, 0x417e, 0x4180, 0x4180, + 0x4182, 0x4182, 0x4184, 0x4184, 0x4186, 0x4186, 0x4188, 0x4188, 0x418a, 0x418a, 0x418c, 0x418c, 0x418e, 0x418e, 0x4190, 0x4190, + 0x4192, 0xffff, 0x4194, 0x4194, 0x4196, 0x4196, 0x4198, 0x4198, 0x419a, 0x419a, 0x419c, 0x419c, 0x419e, 0x419e, 0x41a0, 0x41a0, + 0x41a2, 0x41a2, 0x41a4, 0x41a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x41a6, 0x41a8, 0x41a8, 0x41aa, 0x41ac, 0x4788, + 0x478a, 0x41ae, 0x41ae, 0x41b0, 0x41b2, 0x41b4, 0x41b6, 0x41b6, 0x41b8, 0x41b8, 0x41ba, 0x41ba, 0x41bc, 0x41bc, 0x41be, 0x41be, + 0x4780, 0x477c, 0x4782, 0x40ee, 0x40f4, 0xffff, 0x40f8, 0x40fa, 0xffff, 0x4100, 0xffff, 0x4102, 0x48ba, 0xffff, 0xffff, 0xffff, + 0x4106, 0x48bc, 0xffff, 0x4108, 0xffff, 0x489e, 0x48b8, 0xffff, 0x410c, 0x410a, 0x48c0, 0x4770, 0x48be, 0xffff, 0xffff, 0x4110, + 0xffff, 0x477e, 0x4112, 0xffff, 0xffff, 0x4114, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4774, 0xffff, 0xffff, + 0x411c, 0xffff, 0x48dc, 0x4120, 0xffff, 0xffff, 0xffff, 0x48c4, 0x4124, 0x41b2, 0x4128, 0x412a, 0x41b4, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0x4130, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x48c6, 0x48c2, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x41c0, 0x41c0, 0x41c2, 0x41c2, 0xffff, 0xffff, 0x41c4, 0x41c4, 0xffff, 0xffff, 0xffff, 0x422c, 0x422e, 0x4230, 0xffff, 0x41c6, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x41c8, 0xffff, 0x41ca, 0x41cc, 0x41ce, 0xffff, 0x41d0, 0xffff, 0x41d2, 0x41d4, + 0xffff, 0x41d6, 0x41d8, 0x41da, 0x41dc, 0x41de, 0x41e0, 0x41e2, 0x61e4, 0x41e7, 0x41e9, 0x41eb, 0x41ed, 0x41ef, 0x41f1, 0x41f3, + 0x41f5, 0x41f7, 0xffff, 0x41f9, 0x41fb, 0x41fd, 0x41ff, 0x4201, 0x4203, 0x6205, 0x4208, 0x420a, 0x41c8, 0x41ca, 0x41cc, 0x41ce, + 0xffff, 0x41d6, 0x41d8, 0x41da, 0x41dc, 0x41de, 0x41e0, 0x41e2, 0x61e4, 0x41e7, 0x41e9, 0x41eb, 0x41ed, 0x41ef, 0x41f1, 0x41f3, + 0x41f5, 0x41f7, 0xffff, 0x41f9, 0x41fb, 0x41fd, 0x41ff, 0x4201, 0x4203, 0x6205, 0x4208, 0x420a, 0x41d0, 0x41d2, 0x41d4, 0x420c, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x420c, 0x420e, 0x420e, 0x4210, 0x4210, 0x4212, 0x4212, 0x4214, 0x4214, + 0x4216, 0x4216, 0x4218, 0x4218, 0x421a, 0x421a, 0x421c, 0x421c, 0x421e, 0x421e, 0x4220, 0x4220, 0x4222, 0x4222, 0x4224, 0x4224, + 0xffff, 0xffff, 0x4228, 0x41c6, 0x61e4, 0xffff, 0xffff, 0x4226, 0x4226, 0x4228, 0x422a, 0x422a, 0xffff, 0x422c, 0x422e, 0x4230, + 0x4232, 0x4234, 0x4236, 0x4238, 0x423a, 0x423c, 0x423e, 0x4240, 0x4242, 0x4244, 0x4246, 0x4248, 0x424a, 0x424c, 0x424e, 0x4250, + 0x4252, 0x4254, 0x4256, 0x4258, 0x425a, 0x425c, 0x425e, 0x4260, 0x4262, 0x4264, 0x4266, 0x4268, 0x426a, 0x426c, 0x426e, 0x4270, + 0x4272, 0x4274, 0x4276, 0x4278, 0x427a, 0x427c, 0x427e, 0x4280, 0x4282, 0x4284, 0x4286, 0x4288, 0x428a, 0x428c, 0x428e, 0x4290, + 0x4252, 0x4254, 0x4256, 0x4258, 0x425a, 0x425c, 0x425e, 0x4260, 0x4262, 0x4264, 0x4266, 0x4268, 0x426a, 0x426c, 0x426e, 0x4270, + 0x4272, 0x4274, 0x4276, 0x4278, 0x427a, 0x427c, 0x427e, 0x4280, 0x4282, 0x4284, 0x4286, 0x4288, 0x428a, 0x428c, 0x428e, 0x4290, + 0x4232, 0x4234, 0x4236, 0x4238, 0x423a, 0x423c, 0x423e, 0x4240, 0x4242, 0x4244, 0x4246, 0x4248, 0x424a, 0x424c, 0x424e, 0x4250, + 0x4292, 0x4292, 0x4294, 0x4294, 0x4296, 0x4296, 0x4298, 0x4298, 0x429a, 0x429a, 0x429c, 0x429c, 0x429e, 0x429e, 0x42a0, 0x42a0, + 0x42a2, 0x42a2, 0x42a4, 0x42a4, 0x42a6, 0x42a6, 0x42a8, 0x42a8, 0x42aa, 0x42aa, 0x42ac, 0x42ac, 0x42ae, 0x42ae, 0x42b0, 0x42b0, + 0x42b2, 0x42b2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x42b4, 0x42b4, 0x42b6, 0x42b6, 0x42b8, 0x42b8, + 0x42ba, 0x42ba, 0x42bc, 0x42bc, 0x42be, 0x42be, 0x42c0, 0x42c0, 0x42c2, 0x42c2, 0x42c4, 0x42c4, 0x42c6, 0x42c6, 0x42c8, 0x42c8, + 0x42ca, 0x42ca, 0x42cc, 0x42cc, 0x42ce, 0x42ce, 0x42d0, 0x42d0, 0x42d2, 0x42d2, 0x42d4, 0x42d4, 0x42d6, 0x42d6, 0x42d8, 0x42d8, + 0x42da, 0x42da, 0x42dc, 0x42dc, 0x42de, 0x42de, 0x42e0, 0x42e0, 0x42e2, 0x42e2, 0x42e4, 0x42e4, 0x42e6, 0x42e6, 0x42e8, 0x42e8, + 0x42ea, 0x42ec, 0x42ec, 0x42ee, 0x42ee, 0x42f0, 0x42f0, 0x42f2, 0x42f2, 0x42f4, 0x42f4, 0x42f6, 0x42f6, 0x42f8, 0x42f8, 0x42ea, + 0x42fa, 0x42fa, 0x42fc, 0x42fc, 0x42fe, 0x42fe, 0x4300, 0x4300, 0x4302, 0x4302, 0x4304, 0x4304, 0x4306, 0x4306, 0x4308, 0x4308, + 0x430a, 0x430a, 0x430c, 0x430c, 0x430e, 0x430e, 0x4310, 0x4310, 0x4312, 0x4312, 0x4314, 0x4314, 0x4316, 0x4316, 0x4318, 0x4318, + 0x431a, 0x431a, 0x431c, 0x431c, 0x431e, 0x431e, 0x4320, 0x4320, 0x4322, 0x4322, 0x4324, 0x4324, 0x4326, 0x4326, 0x4328, 0x4328, + 0x432a, 0x432a, 0x432c, 0x432c, 0x432e, 0x432e, 0x4330, 0x4330, 0x4332, 0x4332, 0x4334, 0x4334, 0x4336, 0x4336, 0x4338, 0x4338, + 0x433a, 0x433a, 0x433c, 0x433c, 0x433e, 0x433e, 0x4340, 0x4340, 0x4342, 0x4342, 0x4344, 0x4344, 0x4346, 0x4346, 0x4348, 0x4348, + 0x434a, 0x434a, 0x434c, 0x434c, 0x434e, 0x434e, 0x4350, 0x4350, 0x4352, 0x4352, 0x4354, 0x4354, 0x4356, 0x4356, 0x4358, 0x4358, + 0xffff, 0x435a, 0x435c, 0x435e, 0x4360, 0x4362, 0x4364, 0x4366, 0x4368, 0x436a, 0x436c, 0x436e, 0x4370, 0x4372, 0x4374, 0x4376, + 0x4378, 0x437a, 0x437c, 0x437e, 0x4380, 0x4382, 0x4384, 0x4386, 0x4388, 0x438a, 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396, + 0x4398, 0x439a, 0x439c, 0x439e, 0x43a0, 0x43a2, 0x43a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0x435a, 0x435c, 0x435e, 0x4360, 0x4362, 0x4364, 0x4366, 0x4368, 0x436a, 0x436c, 0x436e, 0x4370, 0x4372, 0x4374, 0x4376, + 0x4378, 0x437a, 0x437c, 0x437e, 0x4380, 0x4382, 0x4384, 0x4386, 0x4388, 0x438a, 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396, + 0x4398, 0x439a, 0x439c, 0x439e, 0x43a0, 0x43a2, 0x43a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x43a6, 0x43a8, 0x43aa, 0x43ac, 0x43ae, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4, + 0x43c6, 0x43c8, 0x43ca, 0x43cc, 0x43ce, 0x43d0, 0x43d2, 0x43d4, 0x43d6, 0x43d8, 0x43da, 0x43dc, 0x43de, 0x43e0, 0x43e2, 0x43e4, + 0x43e6, 0x43e8, 0x43ea, 0x43ec, 0x43ee, 0x43f0, 0xffff, 0x43f2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x43f4, 0xffff, 0xffff, + 0x44a2, 0x44a4, 0x44a6, 0x44a8, 0x44aa, 0x44ac, 0x44ae, 0x44b0, 0x44b2, 0x44b4, 0x44b6, 0x44b8, 0x44ba, 0x44bc, 0x44be, 0x44c0, + 0x44c2, 0x44c4, 0x44c6, 0x44c8, 0x44ca, 0x44cc, 0x44ce, 0x44d0, 0x44d2, 0x44d4, 0x44d6, 0x44d8, 0x44da, 0x44dc, 0x44de, 0x44e0, + 0x44e2, 0x44e4, 0x44e6, 0x44e8, 0x44ea, 0x44ec, 0x44ee, 0x44f0, 0x44f2, 0x44f4, 0x44f6, 0xffff, 0xffff, 0x44f8, 0x44fa, 0x44fc, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x43f6, 0x43f8, 0x43fa, 0x43fc, 0x43fe, 0x4400, 0x4402, 0x4404, 0x4406, 0x4408, 0x440a, 0x440c, 0x440e, 0x4410, 0x4412, 0x4414, + 0x4416, 0x4418, 0x441a, 0x441c, 0x441e, 0x4420, 0x4422, 0x4424, 0x4426, 0x4428, 0x442a, 0x442c, 0x442e, 0x4430, 0x4432, 0x4434, + 0x4436, 0x4438, 0x443a, 0x443c, 0x443e, 0x4440, 0x4442, 0x4444, 0x4446, 0x4448, 0x444a, 0x444c, 0x444e, 0x4450, 0x4452, 0x4454, + 0x4456, 0x4458, 0x445a, 0x445c, 0x445e, 0x4460, 0x4462, 0x4464, 0x4466, 0x4468, 0x446a, 0x446c, 0x446e, 0x4470, 0x4472, 0x4474, + 0x4476, 0x4478, 0x447a, 0x447c, 0x447e, 0x4480, 0x4482, 0x4484, 0x4486, 0x4488, 0x448a, 0x448c, 0x448e, 0x4490, 0x4492, 0x4494, + 0x4496, 0x4498, 0x449a, 0x449c, 0x449e, 0x44a0, 0xffff, 0xffff, 0x4496, 0x4498, 0x449a, 0x449c, 0x449e, 0x44a0, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x44a2, 0x44a4, 0x44a6, 0x44a8, 0x44aa, 0x44ac, 0x44ae, 0x44b0, 0x44b2, 0x44b4, 0x44b6, 0x44b8, 0x44ba, 0x44bc, 0x44be, 0x44c0, + 0x44c2, 0x44c4, 0x44c6, 0x44c8, 0x44ca, 0x44cc, 0x44ce, 0x44d0, 0x44d2, 0x44d4, 0x44d6, 0x44d8, 0x44da, 0x44dc, 0x44de, 0x44e0, + 0x44e2, 0x44e4, 0x44e6, 0x44e8, 0x44ea, 0x44ec, 0x44ee, 0x44f0, 0x44f2, 0x44f4, 0x44f6, 0xffff, 0xffff, 0x44f8, 0x44fa, 0x44fc, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4890, 0xffff, 0xffff, 0xffff, 0x4772, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x48de, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x44fe, 0x44fe, 0x4500, 0x4500, 0x4502, 0x4502, 0x4504, 0x4504, 0x4506, 0x4506, 0x4508, 0x4508, 0x450a, 0x450a, 0x450c, 0x450c, + 0x450e, 0x450e, 0x4510, 0x4510, 0x4512, 0x4512, 0x4514, 0x4514, 0x4516, 0x4516, 0x4518, 0x4518, 0x451a, 0x451a, 0x451c, 0x451c, + 0x451e, 0x451e, 0x4520, 0x4520, 0x4522, 0x4522, 0x4524, 0x4524, 0x4526, 0x4526, 0x4528, 0x4528, 0x452a, 0x452a, 0x452c, 0x452c, + 0x452e, 0x452e, 0x4530, 0x4530, 0x4532, 0x4532, 0x4534, 0x4534, 0x4536, 0x4536, 0x4538, 0x4538, 0x453a, 0x453a, 0x453c, 0x453c, + 0x453e, 0x453e, 0x4540, 0x4540, 0x4542, 0x4542, 0x4544, 0x4544, 0x4546, 0x4546, 0x4548, 0x4548, 0x454a, 0x454a, 0x454c, 0x454c, + 0x454e, 0x454e, 0x4550, 0x4550, 0x4552, 0x4552, 0x4554, 0x4554, 0x4556, 0x4556, 0x4558, 0x4558, 0x455a, 0x455a, 0x455c, 0x455c, + 0x455e, 0x455e, 0x4560, 0x4560, 0x4562, 0x4562, 0x4564, 0x4564, 0x4566, 0x4566, 0x4568, 0x4568, 0x456a, 0x456a, 0x456c, 0x456c, + 0x456e, 0x456e, 0x4570, 0x4570, 0x4572, 0x4572, 0x4574, 0x4574, 0x4576, 0x4576, 0x4578, 0x4578, 0x457a, 0x457a, 0x457c, 0x457c, + 0x457e, 0x457e, 0x4580, 0x4580, 0x4582, 0x4582, 0x4584, 0x4584, 0x4586, 0x4586, 0x4588, 0x4588, 0x458a, 0x458a, 0x458c, 0x458c, + 0x458e, 0x458e, 0x4590, 0x4590, 0x4592, 0x4592, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4594, 0xffff, + 0x4596, 0x4596, 0x4598, 0x4598, 0x459a, 0x459a, 0x459c, 0x459c, 0x459e, 0x459e, 0x45a0, 0x45a0, 0x45a2, 0x45a2, 0x45a4, 0x45a4, + 0x45a6, 0x45a6, 0x45a8, 0x45a8, 0x45aa, 0x45aa, 0x45ac, 0x45ac, 0x45ae, 0x45ae, 0x45b0, 0x45b0, 0x45b2, 0x45b2, 0x45b4, 0x45b4, + 0x45b6, 0x45b6, 0x45b8, 0x45b8, 0x45ba, 0x45ba, 0x45bc, 0x45bc, 0x45be, 0x45be, 0x45c0, 0x45c0, 0x45c2, 0x45c2, 0x45c4, 0x45c4, + 0x45c6, 0x45c6, 0x45c8, 0x45c8, 0x45ca, 0x45ca, 0x45cc, 0x45cc, 0x45ce, 0x45ce, 0x45d0, 0x45d0, 0x45d2, 0x45d2, 0x45d4, 0x45d4, + 0x45d6, 0x45d6, 0x45d8, 0x45d8, 0x45da, 0x45da, 0x45dc, 0x45dc, 0x45de, 0x45de, 0x45e0, 0x45e0, 0x45e2, 0x45e2, 0x45e4, 0x45e4, + 0x45e6, 0x45e6, 0x45e8, 0x45e8, 0x45ea, 0x45ea, 0x45ec, 0x45ec, 0x45ee, 0x45ee, 0x45f0, 0x45f0, 0x45f2, 0x45f2, 0x45f4, 0x45f4, + 0x45f6, 0x45f8, 0x45fa, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604, 0x45f6, 0x45f8, 0x45fa, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604, + 0x4606, 0x4608, 0x460a, 0x460c, 0x460e, 0x4610, 0xffff, 0xffff, 0x4606, 0x4608, 0x460a, 0x460c, 0x460e, 0x4610, 0xffff, 0xffff, + 0x4612, 0x4614, 0x4616, 0x4618, 0x461a, 0x461c, 0x461e, 0x4620, 0x4612, 0x4614, 0x4616, 0x4618, 0x461a, 0x461c, 0x461e, 0x4620, + 0x4622, 0x4624, 0x4626, 0x4628, 0x462a, 0x462c, 0x462e, 0x4630, 0x4622, 0x4624, 0x4626, 0x4628, 0x462a, 0x462c, 0x462e, 0x4630, + 0x4632, 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0xffff, 0xffff, 0x4632, 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0xffff, 0xffff, + 0xffff, 0x463e, 0xffff, 0x4640, 0xffff, 0x4642, 0xffff, 0x4644, 0xffff, 0x463e, 0xffff, 0x4640, 0xffff, 0x4642, 0xffff, 0x4644, + 0x4646, 0x4648, 0x464a, 0x464c, 0x464e, 0x4650, 0x4652, 0x4654, 0x4646, 0x4648, 0x464a, 0x464c, 0x464e, 0x4650, 0x4652, 0x4654, + 0x468a, 0x468c, 0x4690, 0x4692, 0x4694, 0x4696, 0x469e, 0x46a0, 0x46ac, 0x46ae, 0x46a6, 0x46a8, 0x46b0, 0x46b2, 0xffff, 0xffff, + 0x4656, 0x4658, 0x465a, 0x465c, 0x465e, 0x4660, 0x4662, 0x4664, 0x4656, 0x4658, 0x465a, 0x465c, 0x465e, 0x4660, 0x4662, 0x4664, + 0x4666, 0x4668, 0x466a, 0x466c, 0x466e, 0x4670, 0x4672, 0x4674, 0x4666, 0x4668, 0x466a, 0x466c, 0x466e, 0x4670, 0x4672, 0x4674, + 0x4676, 0x4678, 0x467a, 0x467c, 0x467e, 0x4680, 0x4682, 0x4684, 0x4676, 0x4678, 0x467a, 0x467c, 0x467e, 0x4680, 0x4682, 0x4684, + 0x4686, 0x4688, 0xffff, 0x468e, 0xffff, 0xffff, 0xffff, 0xffff, 0x4686, 0x4688, 0x468a, 0x468c, 0x468e, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0x4698, 0xffff, 0xffff, 0xffff, 0xffff, 0x4690, 0x4692, 0x4694, 0x4696, 0x4698, 0xffff, 0xffff, 0xffff, + 0x469a, 0x469c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x469a, 0x469c, 0x469e, 0x46a0, 0xffff, 0xffff, 0xffff, 0xffff, + 0x46a2, 0x46a4, 0xffff, 0xffff, 0xffff, 0x46aa, 0xffff, 0xffff, 0x46a2, 0x46a4, 0x46a6, 0x46a8, 0x46aa, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0x46b4, 0xffff, 0xffff, 0xffff, 0xffff, 0x46ac, 0x46ae, 0x46b0, 0x46b2, 0x46b4, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6205, 0xffff, 0xffff, 0xffff, 0x6014, 0x603f, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0x46b6, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x46b6, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46c0, 0x46c2, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cc, 0x46ce, 0x46d0, 0x46d2, 0x46d4, 0x46d6, + 0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46c0, 0x46c2, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cc, 0x46ce, 0x46d0, 0x46d2, 0x46d4, 0x46d6, + 0xffff, 0xffff, 0xffff, 0x46d8, 0x46d8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x46da, 0x46dc, 0x46de, 0x46e0, 0x46e2, 0x46e4, 0x46e6, 0x46e8, 0x46ea, 0x46ec, + 0x46ee, 0x46f0, 0x46f2, 0x46f4, 0x46f6, 0x46f8, 0x46fa, 0x46fc, 0x46fe, 0x4700, 0x4702, 0x4704, 0x4706, 0x4708, 0x470a, 0x470c, + 0x46da, 0x46dc, 0x46de, 0x46e0, 0x46e2, 0x46e4, 0x46e6, 0x46e8, 0x46ea, 0x46ec, 0x46ee, 0x46f0, 0x46f2, 0x46f4, 0x46f6, 0x46f8, + 0x46fa, 0x46fc, 0x46fe, 0x4700, 0x4702, 0x4704, 0x4706, 0x4708, 0x470a, 0x470c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x470e, 0x4710, 0x4712, 0x4714, 0x4716, 0x4718, 0x471a, 0x471c, 0x471e, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, 0x472a, 0x472c, + 0x472e, 0x4730, 0x4732, 0x4734, 0x4736, 0x4738, 0x473a, 0x473c, 0x473e, 0x4740, 0x4742, 0x4744, 0x4746, 0x4748, 0x474a, 0x474c, + 0x474e, 0x4750, 0x4752, 0x4754, 0x4756, 0x4758, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, 0x4764, 0x4766, 0x4768, 0x476a, 0x476c, + 0x470e, 0x4710, 0x4712, 0x4714, 0x4716, 0x4718, 0x471a, 0x471c, 0x471e, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, 0x472a, 0x472c, + 0x472e, 0x4730, 0x4732, 0x4734, 0x4736, 0x4738, 0x473a, 0x473c, 0x473e, 0x4740, 0x4742, 0x4744, 0x4746, 0x4748, 0x474a, 0x474c, + 0x474e, 0x4750, 0x4752, 0x4754, 0x4756, 0x4758, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, 0x4764, 0x4766, 0x4768, 0x476a, 0x476c, + 0x476e, 0x476e, 0x4770, 0x4772, 0x4774, 0x41a6, 0x41ac, 0x4776, 0x4776, 0x4778, 0x4778, 0x477a, 0x477a, 0x477c, 0x477e, 0x4780, + 0x4782, 0xffff, 0x4784, 0x4784, 0xffff, 0x4786, 0x4786, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4788, 0x478a, + 0x478c, 0x478c, 0x478e, 0x478e, 0x4790, 0x4790, 0x4792, 0x4792, 0x4794, 0x4794, 0x4796, 0x4796, 0x4798, 0x4798, 0x479a, 0x479a, + 0x479c, 0x479c, 0x479e, 0x479e, 0x47a0, 0x47a0, 0x47a2, 0x47a2, 0x47a4, 0x47a4, 0x47a6, 0x47a6, 0x47a8, 0x47a8, 0x47aa, 0x47aa, + 0x47ac, 0x47ac, 0x47ae, 0x47ae, 0x47b0, 0x47b0, 0x47b2, 0x47b2, 0x47b4, 0x47b4, 0x47b6, 0x47b6, 0x47b8, 0x47b8, 0x47ba, 0x47ba, + 0x47bc, 0x47bc, 0x47be, 0x47be, 0x47c0, 0x47c0, 0x47c2, 0x47c2, 0x47c4, 0x47c4, 0x47c6, 0x47c6, 0x47c8, 0x47c8, 0x47ca, 0x47ca, + 0x47cc, 0x47cc, 0x47ce, 0x47ce, 0x47d0, 0x47d0, 0x47d2, 0x47d2, 0x47d4, 0x47d4, 0x47d6, 0x47d6, 0x47d8, 0x47d8, 0x47da, 0x47da, + 0x47dc, 0x47dc, 0x47de, 0x47de, 0x47e0, 0x47e0, 0x47e2, 0x47e2, 0x47e4, 0x47e4, 0x47e6, 0x47e6, 0x47e8, 0x47e8, 0x47ea, 0x47ea, + 0x47ec, 0x47ec, 0x47ee, 0x47ee, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x47f0, 0x47f0, 0x47f2, 0x47f2, 0xffff, + 0xffff, 0xffff, 0x47f4, 0x47f4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x43a6, 0x43a8, 0x43aa, 0x43ac, 0x43ae, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4, + 0x43c6, 0x43c8, 0x43ca, 0x43cc, 0x43ce, 0x43d0, 0x43d2, 0x43d4, 0x43d6, 0x43d8, 0x43da, 0x43dc, 0x43de, 0x43e0, 0x43e2, 0x43e4, + 0x43e6, 0x43e8, 0x43ea, 0x43ec, 0x43ee, 0x43f0, 0xffff, 0x43f2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x43f4, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x47f6, 0x47f6, 0x47f8, 0x47f8, 0x47fa, 0x47fa, 0x47fc, 0x47fc, 0x47fe, 0x47fe, 0x4800, 0x4800, 0x4802, 0x4802, 0x4804, 0x4804, + 0x4806, 0x4806, 0x4808, 0x4808, 0x480a, 0x480a, 0x480c, 0x480c, 0x480e, 0x480e, 0x4810, 0x4810, 0x4812, 0x4812, 0x4814, 0x4814, + 0x4816, 0x4816, 0x4818, 0x4818, 0x481a, 0x481a, 0x481c, 0x481c, 0x481e, 0x481e, 0x4820, 0x4820, 0x4822, 0x4822, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x4824, 0x4824, 0x4826, 0x4826, 0x4828, 0x4828, 0x482a, 0x482a, 0x482c, 0x482c, 0x482e, 0x482e, 0x4830, 0x4830, 0x4832, 0x4832, + 0x4834, 0x4834, 0x4836, 0x4836, 0x4838, 0x4838, 0x483a, 0x483a, 0x483c, 0x483c, 0x483e, 0x483e, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0x4840, 0x4840, 0x4842, 0x4842, 0x4844, 0x4844, 0x4846, 0x4846, 0x4848, 0x4848, 0x484a, 0x484a, 0x484c, 0x484c, + 0xffff, 0xffff, 0x484e, 0x484e, 0x4850, 0x4850, 0x4852, 0x4852, 0x4854, 0x4854, 0x4856, 0x4856, 0x4858, 0x4858, 0x485a, 0x485a, + 0x485c, 0x485c, 0x485e, 0x485e, 0x4860, 0x4860, 0x4862, 0x4862, 0x4864, 0x4864, 0x4866, 0x4866, 0x4868, 0x4868, 0x486a, 0x486a, + 0x486c, 0x486c, 0x486e, 0x486e, 0x4870, 0x4870, 0x4872, 0x4872, 0x4874, 0x4874, 0x4876, 0x4876, 0x4878, 0x4878, 0x487a, 0x487a, + 0x487c, 0x487c, 0x487e, 0x487e, 0x4880, 0x4880, 0x4882, 0x4882, 0x4884, 0x4884, 0x4886, 0x4886, 0x4888, 0x4888, 0x488a, 0x488a, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x488c, 0x488c, 0x488e, 0x488e, 0x4890, 0x4892, 0x4892, + 0x4894, 0x4894, 0x4896, 0x4896, 0x4898, 0x4898, 0x489a, 0x489a, 0xffff, 0xffff, 0xffff, 0x489c, 0x489c, 0x489e, 0xffff, 0xffff, + 0x48a0, 0x48a0, 0x48a2, 0x48a2, 0x48da, 0xffff, 0x48a4, 0x48a4, 0x48a6, 0x48a6, 0x48a8, 0x48a8, 0x48aa, 0x48aa, 0x48ac, 0x48ac, + 0x48ae, 0x48ae, 0x48b0, 0x48b0, 0x48b2, 0x48b2, 0x48b4, 0x48b4, 0x48b6, 0x48b6, 0x48b8, 0x48ba, 0x48bc, 0x48be, 0x48c0, 0xffff, + 0x48c2, 0x48c4, 0x48c6, 0x48c8, 0x48ca, 0x48ca, 0x48cc, 0x48cc, 0x48ce, 0x48ce, 0x48d0, 0x48d0, 0x48d2, 0x48d2, 0x48d4, 0x48d4, + 0x48d6, 0x48d6, 0x48d8, 0x48d8, 0x48da, 0x48dc, 0x48de, 0x48e0, 0x48e0, 0x48e2, 0x48e2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x48e4, 0x48e4, 0xffff, 0xffff, 0xffff, 0xffff, 0x48e6, 0x48e6, 0x48e8, 0x48e8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x48ea, 0x48ea, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0x48c8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0x43f6, 0x43f8, 0x43fa, 0x43fc, 0x43fe, 0x4400, 0x4402, 0x4404, 0x4406, 0x4408, 0x440a, 0x440c, 0x440e, 0x4410, 0x4412, 0x4414, + 0x4416, 0x4418, 0x441a, 0x441c, 0x441e, 0x4420, 0x4422, 0x4424, 0x4426, 0x4428, 0x442a, 0x442c, 0x442e, 0x4430, 0x4432, 0x4434, + 0x4436, 0x4438, 0x443a, 0x443c, 0x443e, 0x4440, 0x4442, 0x4444, 0x4446, 0x4448, 0x444a, 0x444c, 0x444e, 0x4450, 0x4452, 0x4454, + 0x4456, 0x4458, 0x445a, 0x445c, 0x445e, 0x4460, 0x4462, 0x4464, 0x4466, 0x4468, 0x446a, 0x446c, 0x446e, 0x4470, 0x4472, 0x4474, + 0x4476, 0x4478, 0x447a, 0x447c, 0x447e, 0x4480, 0x4482, 0x4484, 0x4486, 0x4488, 0x448a, 0x448c, 0x448e, 0x4490, 0x4492, 0x4494, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0x48ec, 0x48ee, 0x48f0, 0x48f2, 0x48f4, 0x48f6, 0x48f8, 0x48fa, 0x48fc, 0x48fe, 0x4900, 0x4902, 0x4904, 0x4906, 0x4908, + 0x490a, 0x490c, 0x490e, 0x4910, 0x4912, 0x4914, 0x4916, 0x4918, 0x491a, 0x491c, 0x491e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0x48ec, 0x48ee, 0x48f0, 0x48f2, 0x48f4, 0x48f6, 0x48f8, 0x48fa, 0x48fc, 0x48fe, 0x4900, 0x4902, 0x4904, 0x4906, 0x4908, + 0x490a, 0x490c, 0x490e, 0x4910, 0x4912, 0x4914, 0x4916, 0x4918, 0x491a, 0x491c, 0x491e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff + }; + } +} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.cs new file mode 100644 index 0000000000000..6dea0fd8ddd3c --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCaseEquivalences.cs @@ -0,0 +1,161 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics; +using System.Globalization; +using System.Runtime.CompilerServices; + +namespace System.Text.RegularExpressions +{ + /// + /// This class will perform fast lookups for case-insensitive searches in order to find which characters should + /// be considered equivalent. The mappings are generated based on Unicode ToLower() mappings and we generate the table + /// using the GenerateRegexCasingTable program located under the Tools folder for this library. + /// + internal static partial class RegexCaseEquivalences + { + public const int CharactersPerRange = 1024; + + private static readonly char[] s_specialCasingSetBehaviors = new char[5] + { + 'I', 'i', '\u0130', 'I', '\u0131' + }; + + /// + /// Performs a fast lookup which determines if a character is involved in case conversion, as well as + /// returns the characters that should be considered equivalent in case it does participate in case conversion. + /// This method, in contrast to does take in + /// culture and will also factor in the current culture in order to handle the special cases which are different between cultures. + /// + /// The character being analyzed + /// The to be used to determine the equivalences. + /// If is involved in case conversion, then equivalences will contain the + /// span of character which should be considered equal to in a case-insensitive comparison. + /// if is involved in case conversion; otherwise, + public static bool TryFindCaseEquivalencesForCharWithIBehavior(char c, CultureInfo culture, out ReadOnlySpan equivalences) + { + if ((c | 0x20) == 'i' || (c | 0x01) == '\u0131') + { + RegexCaseBehavior mappingBehavior = GetRegexBehavior(culture); + equivalences = c switch + { + // Invariant mappings + 'i' or 'I' when mappingBehavior is RegexCaseBehavior.Invariant => s_specialCasingSetBehaviors.AsSpan(0, 2), // 'I' and 'i' + + // Non-Turkish mappings + 'i' or 'I' or '\u0130' when mappingBehavior is RegexCaseBehavior.NonTurkish => s_specialCasingSetBehaviors.AsSpan(0, 3), // 'I', 'i', and '\u0130' + + // Turkish mappings + 'I' or '\u0131' when mappingBehavior is RegexCaseBehavior.Turkish => s_specialCasingSetBehaviors.AsSpan(3, 2), // 'I' and '\u0131' + 'i' or '\u0130' when mappingBehavior is RegexCaseBehavior.Turkish => s_specialCasingSetBehaviors.AsSpan(1, 2), // 'i' and '\u0130' + + // Default + _ => default + }; + return equivalences != default; + } + else + { + return TryFindCaseEquivalencesForChar(c, out equivalences); + } + } + + /// + /// Returns which should be used based on the passed in . + /// + /// The to be used to determine the behavior. + /// The that should be used. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RegexCaseBehavior GetRegexBehavior(CultureInfo culture) + { + return + culture.Name.Length == 0 ? RegexCaseBehavior.Invariant : + IsTurkishOrAzeri(culture.Name) ? RegexCaseBehavior.Turkish : + RegexCaseBehavior.NonTurkish; + + static bool IsTurkishOrAzeri(string cultureName) + { + if (cultureName.Length >= 2) + { + // Assert that the first two characters in culture name are between a-z lowercase + Debug.Assert(cultureName[0] is >= 'a' and <= 'z'); + Debug.Assert(cultureName[1] is >= 'a' and <= 'z'); + switch (cultureName[0]) + { + case 't': + return cultureName[1] == 'r' && (cultureName.Length == 2 || cultureName[2] == '-'); + case 'a': + return cultureName[1] == 'z' && (cultureName.Length == 2 || cultureName[2] == '-'); + } + } + return false; + } + } + + /// + /// Performs a fast lookup which determines if a character is involved in case conversion, as well as + /// returns the characters that should be considered equivalent in case it does participate in case conversion. + /// + /// The character being analyzed + /// If is involved in case conversion, then equivalences will contain the + /// span of character which should be considered equal to in a case-insensitive comparison. + /// if is involved in case conversion; otherwise, + /// + /// The casing equivalence data is saved in three different lookup tables: + /// EquivalenceFirstLevelLookup => This is a ushort array which contains an index to be used for searching on the next lookup table 'EquivalenceCasingMap'. + /// We first grab the passed in , and divide it by CharactersPerRange and save it to index. We then use this index to + /// perform a lookup in 'EquivalenceFirstLevelLookup' table. If the value at index is 0xFFFF, then + /// isn't involved in case conversion so we keep equivalences as default, and return false. If the value at index is not 0xFFFF + /// then we use that value to search in 'EquivalenceCasingMap'. + /// EquivalenceCasingMap => This is a ushort array which contains a ushort for each character in a given range. The 3 highest bits of the ushort represent + /// the number of characters that are considered equivalent to . The rest of the 13 bits of the ushort represent + /// the index that should be used to get those equivalent characters in the 'EquivalenceCasingValues' table. We first calculate the + /// index2 based on the value obtained from the first level lookup table and adding modulo CharactersPerRange. If the value of + /// EquivalenceCasingMap[index2] is 0xFFFF then isn't involved in case conversion so we return false. Otherwise, + /// we decompose the ushort into the highest 3 bits, and the other 13 to compute two different numbers: the number of equivalence characters + /// to grab from the third table (highest 3 bits and save it as count), and the index (aka. index3) to grab them from (other 13 bits). + /// EquivalenceCasingValues => The final table contains ushort representing characters. We grab the index3 computed in the previous table, and we use it + /// to search on this table and grab the next 'count' items which are the equivalence mappings for . + /// + /// Example: using character 'A' (0x0041). We caluclate index by doing `index = 0x0041 / CharactersPerRange` which results in 0. We then look on the first lookup table using the + /// calculated index `EquivalenceFirstLevelLookup[index]` which results in the value 0x0000. Because this value is not 0xFFFF, character 'A' may be participating in case + /// conversion, so we continue our search by looking into the second lookup table. We calculate index2 by doing `index2 = (0x0041 % CharactersPerRange) + 0x0000` which results in + /// index2 = 0x0041. We then use that index to search in the second lookup table `EquivalenceCasingMap[0x0041]` and get a value of 0x4000 back. Because that value isn't + /// 0xFFFF then we now know that the character 'A' participates in case conversion. We decompose the value we got from the second table 0x4000 (0b_0100_0000_0000_0000 in binary) + /// into the 3 highest bits (0b_010) and the rest of the 13 bits (0b_0_0000_0000_0000) resulting in: count = 2 and index3 = 0. This means that we finally must go into the + /// third lookup table EquivalenceFirstLevelLookup at index 0, and grab the next 2 items which gives us 0x0041 ('A') and 0x0061 ('a'), which are the two characters considered + /// equivalent in a case comparison for 'A'. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static bool TryFindCaseEquivalencesForChar(char c, out ReadOnlySpan equivalences) + { + // Dividing by CharactersPerRange, in order to get the range index for c + Debug.Assert((c / CharactersPerRange) < 0xFF); + byte index = (byte)((uint)c / CharactersPerRange); + ushort firstLevelLookupValue = EquivalenceFirstLevelLookup[index]; + + // If character belongs to a range that doesn't participate in casing, then just return false + if (firstLevelLookupValue == 0xFFFF) + { + equivalences = default; + return false; + } + + // Using mod CharactersPerRange operator to get the offset of c in the range, and add the firstLevelLookupValue + Debug.Assert(((c % CharactersPerRange) + firstLevelLookupValue) < 0xFFFF); + ushort index2 = (ushort)(((uint)c % CharactersPerRange) + firstLevelLookupValue); + ushort mappingValue = EquivalenceCasingMap[index2]; + if (mappingValue == 0xFFFF) + { + equivalences = default; + return false; + } + + byte count = (byte)((mappingValue >> 13) & 0b111); + ushort index3 = (ushort)(mappingValue & 0x1FFF); + equivalences = EquivalenceCasingValues.AsSpan(index3, count); + + return true; + } + } +} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.MappingTable.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.MappingTable.cs deleted file mode 100644 index 7df68727edffe..0000000000000 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.MappingTable.cs +++ /dev/null @@ -1,160 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; - -namespace System.Text.RegularExpressions -{ - internal sealed partial class RegexCharClass - { - /************************************************************************** - Let U be the set of Unicode character values and let L be the lowercase - function, mapping from U to U. To perform case insensitive matching of - character sets, we need to be able to map an interval I in U, say - - I = [chMin, chMax] = { ch : chMin <= ch <= chMax } - - to a set A such that A contains L(I) and A is contained in the union of - I and L(I). - - The table below partitions U into intervals on which L is non-decreasing. - Thus, for any interval J = [a, b] contained in one of these intervals, - L(J) is contained in [L(a), L(b)]. - - It is also true that for any such J, [L(a), L(b)] is contained in the - union of J and L(J). This does not follow from L being non-decreasing on - these intervals. It follows from the nature of the L on each interval. - On each interval, L has one of the following forms: - - (1) L(ch) = constant (LowercaseSet) - (2) L(ch) = ch + offset (LowercaseAdd) - (3) L(ch) = ch | 1 (LowercaseBor) - (4) L(ch) = ch + (ch & 1) (LowercaseBad) - - It is easy to verify that for any of these forms [L(a), L(b)] is - contained in the union of [a, b] and L([a, b]). - ***************************************************************************/ - - internal const int LowercaseSet = 0; // Set to arg. - internal const int LowercaseAdd = 1; // Add arg. - internal const int LowercaseBor = 2; // Bitwise or with 1. - internal const int LowercaseBad = 3; // Bitwise and with 1 and add original. - - internal static readonly LowerCaseMapping[] s_lcTable = new LowerCaseMapping[] - { - new LowerCaseMapping('\u0041', '\u005A', LowercaseAdd, 32), - new LowerCaseMapping('\u00C0', '\u00DE', LowercaseAdd, 32), - new LowerCaseMapping('\u0100', '\u012E', LowercaseBor, 0), - new LowerCaseMapping('\u0130', '\u0130', LowercaseSet, 0x0069), - new LowerCaseMapping('\u0132', '\u0136', LowercaseBor, 0), - new LowerCaseMapping('\u0139', '\u0147', LowercaseBad, 0), - new LowerCaseMapping('\u014A', '\u0176', LowercaseBor, 0), - new LowerCaseMapping('\u0178', '\u0178', LowercaseSet, 0x00FF), - new LowerCaseMapping('\u0179', '\u017D', LowercaseBad, 0), - new LowerCaseMapping('\u0181', '\u0181', LowercaseSet, 0x0253), - new LowerCaseMapping('\u0182', '\u0184', LowercaseBor, 0), - new LowerCaseMapping('\u0186', '\u0186', LowercaseSet, 0x0254), - new LowerCaseMapping('\u0187', '\u0187', LowercaseSet, 0x0188), - new LowerCaseMapping('\u0189', '\u018A', LowercaseAdd, 205), - new LowerCaseMapping('\u018B', '\u018B', LowercaseSet, 0x018C), - new LowerCaseMapping('\u018E', '\u018E', LowercaseSet, 0x01DD), - new LowerCaseMapping('\u018F', '\u018F', LowercaseSet, 0x0259), - new LowerCaseMapping('\u0190', '\u0190', LowercaseSet, 0x025B), - new LowerCaseMapping('\u0191', '\u0191', LowercaseSet, 0x0192), - new LowerCaseMapping('\u0193', '\u0193', LowercaseSet, 0x0260), - new LowerCaseMapping('\u0194', '\u0194', LowercaseSet, 0x0263), - new LowerCaseMapping('\u0196', '\u0196', LowercaseSet, 0x0269), - new LowerCaseMapping('\u0197', '\u0197', LowercaseSet, 0x0268), - new LowerCaseMapping('\u0198', '\u0198', LowercaseSet, 0x0199), - new LowerCaseMapping('\u019C', '\u019C', LowercaseSet, 0x026F), - new LowerCaseMapping('\u019D', '\u019D', LowercaseSet, 0x0272), - new LowerCaseMapping('\u019F', '\u019F', LowercaseSet, 0x0275), - new LowerCaseMapping('\u01A0', '\u01A4', LowercaseBor, 0), - new LowerCaseMapping('\u01A7', '\u01A7', LowercaseSet, 0x01A8), - new LowerCaseMapping('\u01A9', '\u01A9', LowercaseSet, 0x0283), - new LowerCaseMapping('\u01AC', '\u01AC', LowercaseSet, 0x01AD), - new LowerCaseMapping('\u01AE', '\u01AE', LowercaseSet, 0x0288), - new LowerCaseMapping('\u01AF', '\u01AF', LowercaseSet, 0x01B0), - new LowerCaseMapping('\u01B1', '\u01B2', LowercaseAdd, 217), - new LowerCaseMapping('\u01B3', '\u01B5', LowercaseBad, 0), - new LowerCaseMapping('\u01B7', '\u01B7', LowercaseSet, 0x0292), - new LowerCaseMapping('\u01B8', '\u01B8', LowercaseSet, 0x01B9), - new LowerCaseMapping('\u01BC', '\u01BC', LowercaseSet, 0x01BD), - new LowerCaseMapping('\u01C4', '\u01C5', LowercaseSet, 0x01C6), - new LowerCaseMapping('\u01C7', '\u01C8', LowercaseSet, 0x01C9), - new LowerCaseMapping('\u01CA', '\u01CB', LowercaseSet, 0x01CC), - new LowerCaseMapping('\u01CD', '\u01DB', LowercaseBad, 0), - new LowerCaseMapping('\u01DE', '\u01EE', LowercaseBor, 0), - new LowerCaseMapping('\u01F1', '\u01F2', LowercaseSet, 0x01F3), - new LowerCaseMapping('\u01F4', '\u01F4', LowercaseSet, 0x01F5), - new LowerCaseMapping('\u01FA', '\u0216', LowercaseBor, 0), - new LowerCaseMapping('\u0386', '\u0386', LowercaseSet, 0x03AC), - new LowerCaseMapping('\u0388', '\u038A', LowercaseAdd, 37), - new LowerCaseMapping('\u038C', '\u038C', LowercaseSet, 0x03CC), - new LowerCaseMapping('\u038E', '\u038F', LowercaseAdd, 63), - new LowerCaseMapping('\u0391', '\u03AB', LowercaseAdd, 32), - new LowerCaseMapping('\u03E2', '\u03EE', LowercaseBor, 0), - new LowerCaseMapping('\u0401', '\u040F', LowercaseAdd, 80), - new LowerCaseMapping('\u0410', '\u042F', LowercaseAdd, 32), - new LowerCaseMapping('\u0460', '\u0480', LowercaseBor, 0), - new LowerCaseMapping('\u0490', '\u04BE', LowercaseBor, 0), - new LowerCaseMapping('\u04C1', '\u04C3', LowercaseBad, 0), - new LowerCaseMapping('\u04C7', '\u04C7', LowercaseSet, 0x04C8), - new LowerCaseMapping('\u04CB', '\u04CB', LowercaseSet, 0x04CC), - new LowerCaseMapping('\u04D0', '\u04EA', LowercaseBor, 0), - new LowerCaseMapping('\u04EE', '\u04F4', LowercaseBor, 0), - new LowerCaseMapping('\u04F8', '\u04F8', LowercaseSet, 0x04F9), - new LowerCaseMapping('\u0531', '\u0556', LowercaseAdd, 48), - new LowerCaseMapping('\u10A0', '\u10C5', LowercaseAdd, 48), - new LowerCaseMapping('\u1E00', '\u1EF8', LowercaseBor, 0), - new LowerCaseMapping('\u1F08', '\u1F0F', LowercaseAdd, -8), - new LowerCaseMapping('\u1F18', '\u1F1F', LowercaseAdd, -8), - new LowerCaseMapping('\u1F28', '\u1F2F', LowercaseAdd, -8), - new LowerCaseMapping('\u1F38', '\u1F3F', LowercaseAdd, -8), - new LowerCaseMapping('\u1F48', '\u1F4D', LowercaseAdd, -8), - new LowerCaseMapping('\u1F59', '\u1F59', LowercaseSet, 0x1F51), - new LowerCaseMapping('\u1F5B', '\u1F5B', LowercaseSet, 0x1F53), - new LowerCaseMapping('\u1F5D', '\u1F5D', LowercaseSet, 0x1F55), - new LowerCaseMapping('\u1F5F', '\u1F5F', LowercaseSet, 0x1F57), - new LowerCaseMapping('\u1F68', '\u1F6F', LowercaseAdd, -8), - new LowerCaseMapping('\u1F88', '\u1F8F', LowercaseAdd, -8), - new LowerCaseMapping('\u1F98', '\u1F9F', LowercaseAdd, -8), - new LowerCaseMapping('\u1FA8', '\u1FAF', LowercaseAdd, -8), - new LowerCaseMapping('\u1FB8', '\u1FB9', LowercaseAdd, -8), - new LowerCaseMapping('\u1FBA', '\u1FBB', LowercaseAdd, -74), - new LowerCaseMapping('\u1FBC', '\u1FBC', LowercaseSet, 0x1FB3), - new LowerCaseMapping('\u1FC8', '\u1FCB', LowercaseAdd, -86), - new LowerCaseMapping('\u1FCC', '\u1FCC', LowercaseSet, 0x1FC3), - new LowerCaseMapping('\u1FD8', '\u1FD9', LowercaseAdd, -8), - new LowerCaseMapping('\u1FDA', '\u1FDB', LowercaseAdd, -100), - new LowerCaseMapping('\u1FE8', '\u1FE9', LowercaseAdd, -8), - new LowerCaseMapping('\u1FEA', '\u1FEB', LowercaseAdd, -112), - new LowerCaseMapping('\u1FEC', '\u1FEC', LowercaseSet, 0x1FE5), - new LowerCaseMapping('\u1FF8', '\u1FF9', LowercaseAdd, -128), - new LowerCaseMapping('\u1FFA', '\u1FFB', LowercaseAdd, -126), - new LowerCaseMapping('\u1FFC', '\u1FFC', LowercaseSet, 0x1FF3), - new LowerCaseMapping('\u2160', '\u216F', LowercaseAdd, 16), - new LowerCaseMapping('\u24B6', '\u24D0', LowercaseAdd, 26), - new LowerCaseMapping('\uFF21', '\uFF3A', LowercaseAdd, 32), - }; - - /// - /// Lower case mapping descriptor. - /// - internal readonly struct LowerCaseMapping - { - public readonly char ChMin; - public readonly char ChMax; - public readonly int LcOp; - public readonly int Data; - - internal LowerCaseMapping(char chMin, char chMax, int lcOp, int data) - { - ChMin = chMin; - ChMax = chMax; - LcOp = lcOp; - Data = data; - } - } - } -} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.cs index 398f882c79c7b..219d982352865 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCharClass.cs @@ -417,10 +417,10 @@ public void AddCategoryFromName(string categoryName, bool invert, bool caseInsen private void AddCategory(string category) => EnsureCategories().Append(category); /// - /// Adds to the class any lowercase versions of characters already + /// Adds to the class any case-equivalence versions of characters already /// in the class. Used for case-insensitivity. /// - public void AddLowercase(CultureInfo culture) + public void AddCaseEquivalences(CultureInfo culture) { List<(char First, char Last)>? rangeList = _rangelist; if (rangeList != null) @@ -431,12 +431,17 @@ public void AddLowercase(CultureInfo culture) (char First, char Last) range = rangeList[i]; if (range.First == range.Last) { - char lower = culture.TextInfo.ToLower(range.First); - rangeList[i] = (lower, lower); + if (RegexCaseEquivalences.TryFindCaseEquivalencesForCharWithIBehavior(range.First, culture, out ReadOnlySpan equivalences)) + { + foreach (char equivalence in equivalences) + { + AddChar(equivalence); + } + } } else { - AddLowercaseRange(range.First, range.Last); + AddCaseEquivalenceRange(range.First, range.Last, culture); } } } @@ -446,69 +451,16 @@ public void AddLowercase(CultureInfo culture) /// For a single range that's in the set, adds any additional ranges /// necessary to ensure that lowercase equivalents are also included. /// - private void AddLowercaseRange(char chMin, char chMax) + private void AddCaseEquivalenceRange(char chMin, char chMax, CultureInfo culture) { - int i = 0; - - for (int iMax = s_lcTable.Length; i < iMax;) + for (int i = chMin; i <= chMax; i++) { - int iMid = (i + iMax) >> 1; - if (s_lcTable[iMid].ChMax < chMin) - { - i = iMid + 1; - } - else - { - iMax = iMid; - } - } - - if (i >= s_lcTable.Length) - { - return; - } - - char chMinT, chMaxT; - LowerCaseMapping lc; - - for (; i < s_lcTable.Length && (lc = s_lcTable[i]).ChMin <= chMax; i++) - { - if ((chMinT = lc.ChMin) < chMin) - { - chMinT = chMin; - } - - if ((chMaxT = lc.ChMax) > chMax) + if (RegexCaseEquivalences.TryFindCaseEquivalencesForCharWithIBehavior((char)i, culture, out ReadOnlySpan equivalences)) { - chMaxT = chMax; - } - - switch (lc.LcOp) - { - case LowercaseSet: - chMinT = (char)lc.Data; - chMaxT = (char)lc.Data; - break; - - case LowercaseAdd: - chMinT += (char)lc.Data; - chMaxT += (char)lc.Data; - break; - - case LowercaseBor: - chMinT |= (char)1; - chMaxT |= (char)1; - break; - - case LowercaseBad: - chMinT += (char)(chMinT & 1); - chMaxT += (char)(chMaxT & 1); - break; - } - - if (chMinT < chMin || chMaxT > chMax) - { - AddRange(chMinT, chMaxT); + foreach (char equivalence in equivalences) + { + AddChar(equivalence); + } } } } @@ -1356,158 +1308,13 @@ private static RegexCharClass ParseRecursive(string charClass, int start) return ranges; } - #region Perf workaround until https://github.com/dotnet/runtime/issues/61048 and https://github.com/dotnet/runtime/issues/59492 are addressed - // TODO: https://github.com/dotnet/runtime/issues/61048 - // The below functionality needs to be removed/replaced/generalized. The goal is to avoid relying on - // ToLower and culture-based operation at match time, and instead be able to compute at construction - // time case folding equivalence classes that let us determine up-front the set of characters considered - // valid for a match. For now, we do this just for ASCII, and for anything else fall back to the - // pre-existing mechanism whereby a culture is used at construction time to ToLower and then one is - // used at match time to ToLower. We also skip 'i' and 'I', as the casing of those varies across culture - // whereas every other ASCII value's casing is stable across culture. We could hardcode the values for - // when an invariant vs tr/az culture vs any other culture is used, and we likely will, but for now doing - // so would be a breaking change, as in doing so we'd be relying only on the culture present at the time - // of construction rather than the one at the time of match. That will be resolved with - // https://github.com/dotnet/runtime/issues/59492. - - /// Creates a set string for a single character, optionally factoring in case-insensitivity. + /// Creates a set string for a single character. /// The character for which to create the set. - /// null if case-sensitive; non-null if case-insensitive, in which case it's the culture to use. - /// false if the caller should strip out RegexOptions.IgnoreCase because it's now fully represented by the set; otherwise, true. /// The create set string. - public static string OneToStringClass(char c, CultureInfo? caseInsensitive, out bool resultIsCaseInsensitive) - { - var vsb = new ValueStringBuilder(stackalloc char[4]); + public static string OneToStringClass(char c) + => CharsToStringClass(stackalloc char[1] { c }); - if (caseInsensitive is null) - { - resultIsCaseInsensitive = false; - vsb.Append(c); - } - else if (c < 128 && (c | 0x20) != 'i') - { - resultIsCaseInsensitive = false; - switch (c) - { - // These are the same in all cultures. As with the rest of this support, we can generalize this - // once we fix the aforementioned casing issues, e.g. by lazily populating an interning cache - // rather than hardcoding the strings for these values, once almost all values will be the same - // regardless of culture. - case 'A': case 'a': return "\0\x0004\0ABab"; - case 'B': case 'b': return "\0\x0004\0BCbc"; - case 'C': case 'c': return "\0\x0004\0CDcd"; - case 'D': case 'd': return "\0\x0004\0DEde"; - case 'E': case 'e': return "\0\x0004\0EFef"; - case 'F': case 'f': return "\0\x0004\0FGfg"; - case 'G': case 'g': return "\0\x0004\0GHgh"; - case 'H': case 'h': return "\0\x0004\0HIhi"; - // allow 'i' to fall through - case 'J': case 'j': return "\0\x0004\0JKjk"; - case 'K': case 'k': return "\0\x0006\0KLkl\u212A\u212B"; - case 'L': case 'l': return "\0\x0004\0LMlm"; - case 'M': case 'm': return "\0\x0004\0MNmn"; - case 'N': case 'n': return "\0\x0004\0NOno"; - case 'O': case 'o': return "\0\x0004\0OPop"; - case 'P': case 'p': return "\0\x0004\0PQpq"; - case 'Q': case 'q': return "\0\x0004\0QRqr"; - case 'R': case 'r': return "\0\x0004\0RSrs"; - case 'S': case 's': return "\0\x0004\0STst"; - case 'T': case 't': return "\0\x0004\0TUtu"; - case 'U': case 'u': return "\0\x0004\0UVuv"; - case 'V': case 'v': return "\0\x0004\0VWvw"; - case 'W': case 'w': return "\0\x0004\0WXwx"; - case 'X': case 'x': return "\0\x0004\0XYxy"; - case 'Y': case 'y': return "\0\x0004\0YZyz"; - case 'Z': case 'z': return "\0\x0004\0Z[z{"; - - // All the ASCII !ParticipatesInCaseConversion - case '\u0000': return "\0\u0002\0\u0000\u0001"; - case '\u0001': return "\0\u0002\0\u0001\u0002"; - case '\u0002': return "\0\u0002\0\u0002\u0003"; - case '\u0003': return "\0\u0002\0\u0003\u0004"; - case '\u0004': return "\0\u0002\0\u0004\u0005"; - case '\u0005': return "\0\u0002\0\u0005\u0006"; - case '\u0006': return "\0\u0002\0\u0006\u0007"; - case '\u0007': return "\0\u0002\0\u0007\u0008"; - case '\u0008': return "\0\u0002\0\u0008\u0009"; - case '\u0009': return "\0\u0002\0\u0009\u000A"; - case '\u000A': return "\0\u0002\0\u000A\u000B"; - case '\u000B': return "\0\u0002\0\u000B\u000C"; - case '\u000C': return "\0\u0002\0\u000C\u000D"; - case '\u000D': return "\0\u0002\0\u000D\u000E"; - case '\u000E': return "\0\u0002\0\u000E\u000F"; - case '\u000F': return "\0\u0002\0\u000F\u0010"; - case '\u0010': return "\0\u0002\0\u0010\u0011"; - case '\u0011': return "\0\u0002\0\u0011\u0012"; - case '\u0012': return "\0\u0002\0\u0012\u0013"; - case '\u0013': return "\0\u0002\0\u0013\u0014"; - case '\u0014': return "\0\u0002\0\u0014\u0015"; - case '\u0015': return "\0\u0002\0\u0015\u0016"; - case '\u0016': return "\0\u0002\0\u0016\u0017"; - case '\u0017': return "\0\u0002\0\u0017\u0018"; - case '\u0018': return "\0\u0002\0\u0018\u0019"; - case '\u0019': return "\0\u0002\0\u0019\u001A"; - case '\u001A': return "\0\u0002\0\u001A\u001B"; - case '\u001B': return "\0\u0002\0\u001B\u001C"; - case '\u001C': return "\0\u0002\0\u001C\u001D"; - case '\u001D': return "\0\u0002\0\u001D\u001E"; - case '\u001E': return "\0\u0002\0\u001E\u001F"; - case '\u001F': return "\0\u0002\0\u001F\u0020"; - case '\u0020': return "\0\u0002\0\u0020\u0021"; - case '\u0021': return "\0\u0002\0\u0021\u0022"; - case '\u0022': return "\0\u0002\0\u0022\u0023"; - case '\u0023': return "\0\u0002\0\u0023\u0024"; - case '\u0025': return "\0\u0002\0\u0025\u0026"; - case '\u0026': return "\0\u0002\0\u0026\u0027"; - case '\u0027': return "\0\u0002\0\u0027\u0028"; - case '\u0028': return "\0\u0002\0\u0028\u0029"; - case '\u0029': return "\0\u0002\0\u0029\u002A"; - case '\u002A': return "\0\u0002\0\u002A\u002B"; - case '\u002C': return "\0\u0002\0\u002C\u002D"; - case '\u002D': return "\0\u0002\0\u002D\u002E"; - case '\u002E': return "\0\u0002\0\u002E\u002F"; - case '\u002F': return "\0\u0002\0\u002F\u0030"; - case '\u0030': return "\0\u0002\0\u0030\u0031"; - case '\u0031': return "\0\u0002\0\u0031\u0032"; - case '\u0032': return "\0\u0002\0\u0032\u0033"; - case '\u0033': return "\0\u0002\0\u0033\u0034"; - case '\u0034': return "\0\u0002\0\u0034\u0035"; - case '\u0035': return "\0\u0002\0\u0035\u0036"; - case '\u0036': return "\0\u0002\0\u0036\u0037"; - case '\u0037': return "\0\u0002\0\u0037\u0038"; - case '\u0038': return "\0\u0002\0\u0038\u0039"; - case '\u0039': return "\0\u0002\0\u0039\u003A"; - case '\u003A': return "\0\u0002\0\u003A\u003B"; - case '\u003B': return "\0\u0002\0\u003B\u003C"; - case '\u003F': return "\0\u0002\0\u003F\u0040"; - case '\u0040': return "\0\u0002\0\u0040\u0041"; - case '\u005B': return "\0\u0002\0\u005B\u005C"; - case '\u005C': return "\0\u0002\0\u005C\u005D"; - case '\u005D': return "\0\u0002\0\u005D\u005E"; - case '\u005F': return "\0\u0002\0\u005F\u0060"; - case '\u007B': return "\0\u0002\0\u007B\u007C"; - case '\u007D': return "\0\u0002\0\u007D\u007E"; - case '\u007F': return "\0\u0002\0\u007F\u0080"; - } - AddAsciiCharIgnoreCaseEquivalence(c, ref vsb, caseInsensitive); - } - else if (!ParticipatesInCaseConversion(c)) - { - resultIsCaseInsensitive = false; - vsb.Append(c); - } - else - { - resultIsCaseInsensitive = true; - vsb.Append(char.ToLower(c, caseInsensitive)); - } - - string result = CharsToStringClass(vsb.AsSpan()); - vsb.Dispose(); - return result; - } - - private static unsafe string CharsToStringClass(ReadOnlySpan chars) + internal static unsafe string CharsToStringClass(ReadOnlySpan chars) { #if DEBUG // Make sure they're all sorted with no duplicates @@ -1523,6 +1330,40 @@ private static unsafe string CharsToStringClass(ReadOnlySpan chars) return EmptyClass; } + if (chars.Length == 2) + { + switch (chars[0], chars[1]) + { + case ('A', 'a'): case ('a', 'A'): return "\0\x0004\0ABab"; + case ('B', 'b'): case ('b', 'B'): return "\0\x0004\0BCbc"; + case ('C', 'c'): case ('c', 'C'): return "\0\x0004\0CDcd"; + case ('D', 'd'): case ('d', 'D'): return "\0\x0004\0DEde"; + case ('E', 'e'): case ('e', 'E'): return "\0\x0004\0EFef"; + case ('F', 'f'): case ('f', 'F'): return "\0\x0004\0FGfg"; + case ('G', 'g'): case ('g', 'G'): return "\0\x0004\0GHgh"; + case ('H', 'h'): case ('h', 'H'): return "\0\x0004\0HIhi"; + // 'I' and 'i' are missing since depending on the cultuure they may + // have additional mappings. + case ('J', 'j'): case ('j', 'J'): return "\0\x0004\0JKjk"; + // 'K' and 'k' are missing since their mapping also includes Kelvin K. + case ('L', 'l'): case ('l', 'L'): return "\0\x0004\0LMlm"; + case ('M', 'm'): case ('m', 'M'): return "\0\x0004\0MNmn"; + case ('N', 'n'): case ('n', 'N'): return "\0\x0004\0NOno"; + case ('O', 'o'): case ('o', 'O'): return "\0\x0004\0OPop"; + case ('P', 'p'): case ('p', 'P'): return "\0\x0004\0PQpq"; + case ('Q', 'q'): case ('q', 'Q'): return "\0\x0004\0QRqr"; + case ('R', 'r'): case ('r', 'R'): return "\0\x0004\0RSrs"; + case ('S', 's'): case ('s', 'S'): return "\0\x0004\0STst"; + case ('T', 't'): case ('t', 'T'): return "\0\x0004\0TUtu"; + case ('U', 'u'): case ('u', 'U'): return "\0\x0004\0UVuv"; + case ('V', 'v'): case ('v', 'V'): return "\0\x0004\0VWvw"; + case ('W', 'w'): case ('w', 'W'): return "\0\x0004\0WXwx"; + case ('X', 'x'): case ('x', 'X'): return "\0\x0004\0XYxy"; + case ('Y', 'y'): case ('y', 'Y'): return "\0\x0004\0YZyz"; + case ('Z', 'z'): case ('z', 'Z'): return "\0\x0004\0Z[z{"; + } + } + // Count how many characters there actually are. All but the very last possible // char value will have two characters, one for the inclusive beginning of range // and one for the exclusive end of range. @@ -1563,90 +1404,19 @@ private static unsafe string CharsToStringClass(ReadOnlySpan chars) } } - /// Tries to create from a RegexOptions.IgnoreCase set string a new set string that can be used without RegexOptions.IgnoreCase. - /// The original set string from a RegexOptions.IgnoreCase node. - /// The culture in use. - /// A new set string if one could be created. - public static string? MakeCaseSensitiveIfPossible(string set, CultureInfo culture) - { - if (IsNegated(set)) - { - return null; - } - - // We'll eventually need a more robust way to do this for any set. For now, we iterate through each character - // in the set, and to avoid spending lots of time doing so, we limit the number of characters. This approach also - // limits the structure of the sets allowed, e.g. they can't be negated, can't use subtraction, etc. - Span setChars = stackalloc char[64]; // arbitary limit chosen to include common groupings like all ASCII letters and digits - - // Try to get the set's characters. - int setCharsCount = GetSetChars(set, setChars); - if (setCharsCount == 0) - { - return null; - } - - // Enumerate all the characters and add all characters that form their case folding equivalence class. - var rcc = new RegexCharClass(); - var vsb = new ValueStringBuilder(stackalloc char[4]); - foreach (char c in setChars.Slice(0, setCharsCount)) - { - if (c >= 128 || c == 'i' || c == 'I') - { - return null; - } - - vsb.Length = 0; - AddAsciiCharIgnoreCaseEquivalence(c, ref vsb, culture); - foreach (char v in vsb.AsSpan()) - { - rcc.AddChar(v); - } - } - - // Return the constructed class. - return rcc.ToStringClass(); - } - - private static void AddAsciiCharIgnoreCaseEquivalence(char c, ref ValueStringBuilder vsb, CultureInfo culture) - { - Debug.Assert(c < 128, $"Expected ASCII, got {(int)c}"); - Debug.Assert(c != 'i' && c != 'I', "'i' currently doesn't work correctly in all cultures"); - - char upper = char.ToUpper(c, culture); - char lower = char.ToLower(c, culture); - - if (upper < lower) - { - vsb.Append(upper); - } - vsb.Append(lower); - if (upper > lower) - { - vsb.Append(upper); - } - - if (c == 'k' || c == 'K') - { - vsb.Append((char)0x212A); // kelvin sign - } - } - #endregion - /// /// Constructs the string representation of the class. /// - public string ToStringClass(RegexOptions options = RegexOptions.None) + public string ToStringClass() { - bool isNonBacktracking = (options & RegexOptions.NonBacktracking) != 0; var vsb = new ValueStringBuilder(stackalloc char[256]); - ToStringClass(isNonBacktracking, ref vsb); + ToStringClass(ref vsb); return vsb.ToString(); } - private void ToStringClass(bool isNonBacktracking, ref ValueStringBuilder vsb) + private void ToStringClass(ref ValueStringBuilder vsb) { - Canonicalize(isNonBacktracking); + Canonicalize(); int initialLength = vsb.Length; int categoriesLength = _categories?.Length ?? 0; @@ -1684,13 +1454,13 @@ private void ToStringClass(bool isNonBacktracking, ref ValueStringBuilder vsb) } // Append a subtractor if there is one. - _subtractor?.ToStringClass(isNonBacktracking, ref vsb); + _subtractor?.ToStringClass(ref vsb); } /// /// Logic to reduce a character class to a unique, sorted form. /// - private void Canonicalize(bool isNonBacktracking) + private void Canonicalize() { List<(char First, char Last)>? rangelist = _rangelist; if (rangelist != null) @@ -1747,13 +1517,7 @@ private void Canonicalize(bool isNonBacktracking) // If the class now represents a single negated range, but does so by including every // other character, invert it to produce a normalized form with a single range. This // is valuable for subsequent optimizations in most of the engines. - // TODO: https://github.com/dotnet/runtime/issues/61048. The special-casing for NonBacktracking - // can be deleted once this issue is addressed. The special-casing exists because NonBacktracking - // is on a different casing plan than the other engines and doesn't use ToLower on each input - // character at match time; this in turn can highlight differences between sets and their inverted - // versions of themselves, e.g. a difference between [0-AC-\uFFFF] and [^B]. - if (!isNonBacktracking && - !_negate && + if (!_negate && _subtractor is null && (_categories is null || _categories.Length == 0)) { diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs index a64f098a6610d..e6d1e47fb6b9f 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs @@ -21,6 +21,7 @@ internal abstract class RegexCompiler private static readonly FieldInfo s_runtextposField = RegexRunnerField("runtextpos"); private static readonly FieldInfo s_runtrackposField = RegexRunnerField("runtrackpos"); private static readonly FieldInfo s_runstackField = RegexRunnerField("runstack"); + private static readonly FieldInfo s_textInfo = typeof(CompiledRegexRunner).GetField("_textInfo", BindingFlags.Instance | BindingFlags.NonPublic)!; private static readonly MethodInfo s_captureMethod = RegexRunnerMethod("Capture"); private static readonly MethodInfo s_transferCaptureMethod = RegexRunnerMethod("TransferCapture"); @@ -38,12 +39,8 @@ internal abstract class RegexCompiler private static readonly MethodInfo s_charIsDigitMethod = typeof(char).GetMethod("IsDigit", new Type[] { typeof(char) })!; private static readonly MethodInfo s_charIsWhiteSpaceMethod = typeof(char).GetMethod("IsWhiteSpace", new Type[] { typeof(char) })!; private static readonly MethodInfo s_charGetUnicodeInfo = typeof(char).GetMethod("GetUnicodeCategory", new Type[] { typeof(char) })!; - private static readonly MethodInfo s_charToLowerInvariantMethod = typeof(char).GetMethod("ToLowerInvariant", new Type[] { typeof(char) })!; - private static readonly MethodInfo s_cultureInfoGetCurrentCultureMethod = typeof(CultureInfo).GetMethod("get_CurrentCulture")!; - private static readonly MethodInfo s_cultureInfoGetTextInfoMethod = typeof(CultureInfo).GetMethod("get_TextInfo")!; private static readonly MethodInfo s_spanGetItemMethod = typeof(ReadOnlySpan).GetMethod("get_Item", new Type[] { typeof(int) })!; private static readonly MethodInfo s_spanGetLengthMethod = typeof(ReadOnlySpan).GetMethod("get_Length")!; - private static readonly MethodInfo s_memoryMarshalGetReference = typeof(MemoryMarshal).GetMethod("GetReference", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)) })!.MakeGenericMethod(typeof(char)); private static readonly MethodInfo s_spanIndexOfChar = typeof(MemoryExtensions).GetMethod("IndexOf", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), Type.MakeGenericMethodParameter(0) })!.MakeGenericMethod(typeof(char)); private static readonly MethodInfo s_spanIndexOfSpan = typeof(MemoryExtensions).GetMethod("IndexOf", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)) })!.MakeGenericMethod(typeof(char)); private static readonly MethodInfo s_spanIndexOfAnyCharChar = typeof(MemoryExtensions).GetMethod("IndexOfAny", new Type[] { typeof(ReadOnlySpan<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), Type.MakeGenericMethodParameter(0), Type.MakeGenericMethodParameter(0) })!.MakeGenericMethod(typeof(char)); @@ -78,8 +75,6 @@ internal abstract class RegexCompiler /// Pool of ReadOnlySpan of char locals. private Stack? _readOnlySpanCharLocalsPool; - /// Local representing a cached TextInfo for the culture to use for all case-insensitive operations. - private LocalBuilder? _textInfo; /// Local representing a timeout counter for loops (set loops and node loops). private LocalBuilder? _loopTimeoutCounter; /// A frequency with which the timeout should be validated. @@ -337,33 +332,14 @@ public void Dispose() } } - /// Sets the culture local to CultureInfo.CurrentCulture. - private void InitLocalCultureInfo() - { - Debug.Assert(_textInfo != null); - Call(s_cultureInfoGetCurrentCultureMethod); - Callvirt(s_cultureInfoGetTextInfoMethod); - Stloc(_textInfo); - } - - /// Whether ToLower operations should be performed with the invariant culture as opposed to the one in . - private bool UseToLowerInvariant => _textInfo == null || (_options & RegexOptions.CultureInvariant) != 0; - - /// Invokes either char.ToLowerInvariant(c) or _textInfo.ToLower(c). + /// Invokes textInfo.ToLower(c). private void CallToLower() { - if (UseToLowerInvariant) - { - Call(s_charToLowerInvariantMethod); - } - else - { - using RentedLocalBuilder currentCharLocal = RentInt32Local(); - Stloc(currentCharLocal); - Ldloc(_textInfo!); - Ldloc(currentCharLocal); - Callvirt(s_textInfoToLowerMethod); - } + using RentedLocalBuilder currentCharLocal = RentInt32Local(); + Stloc(currentCharLocal); + Ldthisfld(s_textInfo); + Ldloc(currentCharLocal); + Callvirt(s_textInfoToLowerMethod); } /// Generates the implementation for TryFindNextPossibleStartingPosition. @@ -377,27 +353,6 @@ protected void EmitTryFindNextPossibleStartingPosition() LocalBuilder pos = DeclareInt32(); bool rtl = (_options & RegexOptions.RightToLeft) != 0; - _textInfo = null; - if ((_options & RegexOptions.CultureInvariant) == 0) - { - bool needsCulture = _regexTree.FindOptimizations.FindMode switch - { - FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive or - FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive or - FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive => true, - - _ when _regexTree.FindOptimizations.FixedDistanceSets is List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets => sets.Exists(set => set.CaseInsensitive), - - _ => false, - }; - - if (needsCulture) - { - _textInfo = DeclareTextInfo(); - InitLocalCultureInfo(); - } - } - // Load necessary locals // int pos = base.runtextpos; // ReadOnlySpan inputSpan = dynamicMethodArg; // TODO: We can reference the arg directly rather than using another local. @@ -461,31 +416,28 @@ FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive or // Either anchors weren't specified, or they don't completely root all matches to a specific location. switch (_regexTree.FindOptimizations.FindMode) { - case FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive: - Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix)); - EmitIndexOf_LeftToRight(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix); + case FindNextStartingPositionMode.LeadingPrefix_LeftToRight: + Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingPrefix)); + EmitIndexOf_LeftToRight(_regexTree.FindOptimizations.LeadingPrefix); break; - case FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive: - Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix)); - EmitIndexOf_RightToLeft(_regexTree.FindOptimizations.LeadingCaseSensitivePrefix); + case FindNextStartingPositionMode.LeadingPrefix_RightToLeft: + Debug.Assert(!string.IsNullOrEmpty(_regexTree.FindOptimizations.LeadingPrefix)); + EmitIndexOf_RightToLeft(_regexTree.FindOptimizations.LeadingPrefix); break; - case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive: - case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive: - case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive: - case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive: + case FindNextStartingPositionMode.LeadingSet_LeftToRight: + case FindNextStartingPositionMode.FixedSets_LeftToRight: Debug.Assert(_regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 }); EmitFixedSet_LeftToRight(); break; - case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive: - case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive: + case FindNextStartingPositionMode.LeadingSet_RightToLeft: Debug.Assert(_regexTree.FindOptimizations.FixedDistanceSets is { Count: > 0 }); EmitFixedSet_RightToLeft(); break; - case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight: Debug.Assert(_regexTree.FindOptimizations.LiteralAfterLoop is not null); EmitLiteralAfterAtomicLoop(); break; @@ -817,8 +769,8 @@ void EmitIndexOf_RightToLeft(string prefix) // and potentially other sets at other fixed positions in the pattern. void EmitFixedSet_LeftToRight() { - List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? sets = _regexTree.FindOptimizations.FixedDistanceSets; - (char[]? Chars, string Set, int Distance, bool CaseInsensitive) primarySet = sets![0]; + List<(char[]? Chars, string Set, int Distance)>? sets = _regexTree.FindOptimizations.FixedDistanceSets; + (char[]? Chars, string Set, int Distance) primarySet = sets![0]; const int MaxSets = 4; int setsToUse = Math.Min(sets.Count, MaxSets); @@ -834,7 +786,7 @@ void EmitFixedSet_LeftToRight() // If we can use IndexOf{Any}, try to accelerate the skip loop via vectorization to match the first prefix. // We can use it if this is a case-sensitive class with a small number of characters in the class. int setIndex = 0; - bool canUseIndexOf = !primarySet.CaseInsensitive && primarySet.Chars is not null; + bool canUseIndexOf = primarySet.Chars is not null; bool needLoop = !canUseIndexOf || setsToUse > 1; Label checkSpanLengthLabel = default; @@ -968,7 +920,7 @@ void EmitFixedSet_LeftToRight() } Call(s_spanGetItemMethod); LdindU2(); - EmitMatchCharacterClass(sets[setIndex].Set, sets[setIndex].CaseInsensitive); + EmitMatchCharacterClass(sets[setIndex].Set); BrfalseFar(charNotInClassLabel); } @@ -1014,10 +966,10 @@ void EmitFixedSet_LeftToRight() // (Currently that position will always be a distance of 0, meaning the start of the pattern itself.) void EmitFixedSet_RightToLeft() { - (char[]? Chars, string Set, int Distance, bool CaseInsensitive) set = _regexTree.FindOptimizations.FixedDistanceSets![0]; + (char[]? Chars, string Set, int Distance) set = _regexTree.FindOptimizations.FixedDistanceSets![0]; Debug.Assert(set.Distance == 0); - if (set.Chars is { Length: 1 } && !set.CaseInsensitive) + if (set.Chars is { Length: 1 }) { // pos = inputSpan.Slice(0, pos).LastIndexOf(set.Chars[0]); Ldloca(inputSpan); @@ -1058,12 +1010,12 @@ void EmitFixedSet_RightToLeft() Call(s_spanGetLengthMethod); BgeUnFar(returnFalse); - // if (!MatchCharacterClass(inputSpan[i], set.Set, set.CaseInsensitive)) goto condition; + // if (!MatchCharacterClass(inputSpan[i], set.Set)) goto condition; Ldloca(inputSpan); Ldloc(pos); Call(s_spanGetItemMethod); LdindU2(); - EmitMatchCharacterClass(set.Set, set.CaseInsensitive); + EmitMatchCharacterClass(set.Set); Brfalse(condition); // base.runtextpos = pos + 1; @@ -1165,7 +1117,7 @@ void EmitLiteralAfterAtomicLoop() Ldloc(prev); Call(s_spanGetItemMethod); LdindU2(); - EmitMatchCharacterClass(target.LoopNode.Str!, caseInsensitive: false); + EmitMatchCharacterClass(target.LoopNode.Str!); BrtrueFar(innerLoopBody); MarkLabel(innerLoopEnd); @@ -1268,7 +1220,7 @@ protected void EmitTryMatchAtCurrentPosition() // We can special case these to do essentially nothing in TryMatchAtCurrentPosition other than emit the capture. switch (node.Kind) { - case RegexNodeKind.Multi or RegexNodeKind.Notone or RegexNodeKind.One or RegexNodeKind.Set when !IsCaseInsensitive(node): + case RegexNodeKind.Multi or RegexNodeKind.Notone or RegexNodeKind.One or RegexNodeKind.Set: // This is the case for single and multiple characters, though the whole thing is only guaranteed // to have been validated in TryFindNextPossibleStartingPosition when doing case-sensitive comparison. // base.Capture(0, base.runtextpos, base.runtextpos + node.Str.Length); @@ -1313,9 +1265,6 @@ protected void EmitTryMatchAtCurrentPosition() _loopTimeoutCounter = DeclareInt32(); } - // CultureInfo culture = CultureInfo.CurrentCulture; // only if the whole expression or any subportion is ignoring case, and we're not using invariant - InitializeCultureForTryMatchAtCurrentPositionIfNecessary(analysis); - // ReadOnlySpan inputSpan = input; Ldarg_1(); Stloc(inputSpan); @@ -1414,12 +1363,6 @@ protected void EmitTryMatchAtCurrentPosition() // Generated code successfully. return; - // Whether the node has RegexOptions.IgnoreCase set. - // TODO: https://github.com/dotnet/runtime/issues/61048. We should be able to delete this and all usage sites once - // IgnoreCase is erradicated from the tree. The only place it should possibly be left after that work is in a Backreference, - // and that can do this check directly as needed. - static bool IsCaseInsensitive(RegexNode node) => (node.Options & RegexOptions.IgnoreCase) != 0; - // Slices the inputSpan starting at pos until end and stores it into slice. void SliceInputSpan() { @@ -1460,18 +1403,6 @@ void EmitSpanLengthCheck(int requiredLength, LocalBuilder? dynamicRequiredLength BgeUnFar(doneLabel); } - // Emits code to get ref slice[sliceStaticPos] - void EmitTextSpanOffset() - { - Ldloc(slice); - Call(s_memoryMarshalGetReference); - if (sliceStaticPos > 0) - { - Ldc(sliceStaticPos * sizeof(char)); - Add(); - } - } - // Adds the value of sliceStaticPos into the pos local, zeros out sliceStaticPos, // and resets slice to be inputSpan.Slice(pos). void TransferSliceStaticPosToPos(bool forceSliceReload = false) @@ -1738,7 +1669,7 @@ void EmitBackreference(RegexNode node) Add(); Call(s_spanGetItemMethod); LdindU2(); - if (IsCaseInsensitive(node)) + if ((node.Options & RegexOptions.IgnoreCase) != 0) { CallToLower(); } @@ -1758,7 +1689,7 @@ void EmitBackreference(RegexNode node) } Call(s_spanGetItemMethod); LdindU2(); - if (IsCaseInsensitive(node)) + if ((node.Options & RegexOptions.IgnoreCase) != 0) { CallToLower(); } @@ -2358,7 +2289,7 @@ void EmitNode(RegexNode node, RegexNode? subsequent = null, bool emitLengthCheck { // Before we handle general-purpose matching logic for nodes, handle any special-casing. // - - if (_regexTree!.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive && + if (_regexTree!.FindOptimizations.FindMode == FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight && _regexTree!.FindOptimizations.LiteralAfterLoop?.LoopNode == node) { Debug.Assert(sliceStaticPos == 0, "This should be the first node and thus static position shouldn't have advanced."); @@ -2671,15 +2602,11 @@ void EmitSingleChar(RegexNode node, bool emitLengthCheck = true, LocalBuilder? o // if (loadedChar != ch) goto doneLabel; if (node.IsSetFamily) { - EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node)); + EmitMatchCharacterClass(node.Str!); BrfalseFar(doneLabel); } else { - if (IsCaseInsensitive(node)) - { - CallToLower(); - } Ldc(node.Ch); if (node.IsOneFamily) { @@ -2891,10 +2818,10 @@ void EmitAnchors(RegexNode node) void EmitMultiChar(RegexNode node, bool emitLengthCheck) { Debug.Assert(node.Kind is RegexNodeKind.Multi, $"Unexpected type: {node.Kind}"); - EmitMultiCharString(node.Str!, IsCaseInsensitive(node), emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0); + EmitMultiCharString(node.Str!, emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0); } - void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, bool rightToLeft) + void EmitMultiCharString(string str, bool emitLengthCheck, bool rightToLeft) { Debug.Assert(str.Length >= 2); @@ -2922,10 +2849,6 @@ void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, Ldloc(pos); Call(s_spanGetItemMethod); LdindU2(); - if (caseInsensitive) - { - CallToLower(); - } Ldc(str[i]); BneFar(doneLabel); } @@ -2933,38 +2856,14 @@ void EmitMultiCharString(string str, bool caseInsensitive, bool emitLengthCheck, return; } - if (caseInsensitive) // StartsWith(..., XxIgnoreCase) won't necessarily be the same as char-by-char comparison - { - // This case should be relatively rare. It will only occur with IgnoreCase and a series of non-ASCII characters. - - if (emitLengthCheck) - { - EmitSpanLengthCheck(str.Length); - } - - foreach (char c in str) - { - // if (c != slice[sliceStaticPos++]) goto doneLabel; - EmitTextSpanOffset(); - sliceStaticPos++; - LdindU2(); - CallToLower(); - Ldc(c); - BneFar(doneLabel); - } - } - else - { - // if (!slice.Slice(sliceStaticPos).StartsWith("...") goto doneLabel; - Ldloca(slice); - Ldc(sliceStaticPos); - Call(s_spanSliceIntMethod); - Ldstr(str); - Call(s_stringAsSpanMethod); - Call(s_spanStartsWithSpan); - BrfalseFar(doneLabel); - sliceStaticPos += str.Length; - } + Ldloca(slice); + Ldc(sliceStaticPos); + Call(s_spanSliceIntMethod); + Ldstr(str); + Call(s_stringAsSpanMethod); + Call(s_spanStartsWithSpan); + BrfalseFar(doneLabel); + sliceStaticPos += str.Length; } // Emits the code to handle a backtracking, single-character loop. @@ -3274,7 +3173,6 @@ void EmitSingleCharLazy(RegexNode node, RegexNode? subsequent = null, bool emitL if (!rtl && iterationCount is null && node.Kind is RegexNodeKind.Notonelazy && - !IsCaseInsensitive(node) && subsequent?.FindStartingLiteral(4) is ValueTuple literal && // 5 == max optimized by IndexOfAny, and we need to reserve 1 for node.Ch (literal.Item3 is not null ? !literal.Item3.Contains(node.Ch) : (literal.Item2?[0] ?? literal.Item1) != node.Ch)) // no overlap between node.Ch and the start of the literal { @@ -3736,10 +3634,10 @@ void EmitSingleCharRepeater(RegexNode node, bool emitLengthChecksIfRequired = tr EmitSingleChar(node, emitLengthChecksIfRequired); return; - case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily && !IsCaseInsensitive(node): + case <= RegexNode.MultiVsRepeaterLimit when node.IsOneFamily: // This is a repeated case-sensitive character; emit it as a multi in order to get all the optimizations // afforded to a multi, e.g. unrolling the loop with multi-char reads/comparisons at a time. - EmitMultiCharString(new string(node.Ch, iterations), caseInsensitive: false, emitLengthChecksIfRequired, rtl); + EmitMultiCharString(new string(node.Ch, iterations), emitLengthChecksIfRequired, rtl); return; } @@ -3912,15 +3810,11 @@ void EmitSingleCharAtomicLoop(RegexNode node) LdindU2(); if (node.IsSetFamily) { - EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node)); + EmitMatchCharacterClass(node.Str!); BrfalseFar(atomicLoopDoneLabel); } else { - if (IsCaseInsensitive(node)) - { - CallToLower(); - } Ldc(node.Ch); if (node.IsOneFamily) { @@ -3952,8 +3846,7 @@ void EmitSingleCharAtomicLoop(RegexNode node) } } else if (node.IsNotoneFamily && - maxIterations == int.MaxValue && - (!IsCaseInsensitive(node))) + maxIterations == int.MaxValue) { // For Notone, we're looking for a specific character, as everything until we find // it is consumed by the loop. If we're unbounded, such as with ".*" and if we're case-sensitive, @@ -3993,7 +3886,6 @@ void EmitSingleCharAtomicLoop(RegexNode node) } else if (node.IsSetFamily && maxIterations == int.MaxValue && - !IsCaseInsensitive(node) && (numSetChars = RegexCharClass.GetSetChars(node.Str!, setChars)) != 0 && RegexCharClass.IsNegated(node.Str!)) { @@ -4097,15 +3989,11 @@ void EmitSingleCharAtomicLoop(RegexNode node) LdindU2(); if (node.IsSetFamily) { - EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node)); + EmitMatchCharacterClass(node.Str!); BrfalseFar(atomicLoopDoneLabel); } else { - if (IsCaseInsensitive(node)) - { - CallToLower(); - } Ldc(node.Ch); if (node.IsOneFamily) { @@ -4223,15 +4111,11 @@ void EmitAtomicSingleCharZeroOrOne(RegexNode node) LdindU2(); if (node.IsSetFamily) { - EmitMatchCharacterClass(node.Str!, IsCaseInsensitive(node)); + EmitMatchCharacterClass(node.Str!); BrfalseFar(skipUpdatesLabel); } else { - if (IsCaseInsensitive(node)) - { - CallToLower(); - } Ldc(node.Ch); if (node.IsOneFamily) { @@ -4742,20 +4626,9 @@ FindNextStartingPositionMode.LeadingAnchor_RightToLeft_Start or Ret(); } - private void InitializeCultureForTryMatchAtCurrentPositionIfNecessary(AnalysisResults analysis) - { - _textInfo = null; - if (analysis.HasIgnoreCase && (_options & RegexOptions.CultureInvariant) == 0) - { - // cache CultureInfo in local variable which saves excessive thread local storage accesses - _textInfo = DeclareTextInfo(); - InitLocalCultureInfo(); - } - } - /// Emits a a check for whether the character is in the specified character class. /// The character to be checked has already been loaded onto the stack. - private void EmitMatchCharacterClass(string charClass, bool caseInsensitive) + private void EmitMatchCharacterClass(string charClass) { // We need to perform the equivalent of calling RegexRunner.CharInClass(ch, charClass), // but that call is relatively expensive. Before we fall back to it, we try to optimize @@ -4763,8 +4636,7 @@ private void EmitMatchCharacterClass(string charClass, bool caseInsensitive) // for which we can call a dedicated method, or a fast-path for ASCII using a lookup table. // First, see if the char class is a built-in one for which there's a better function - // we can just call directly. Everything in this section must work correctly for both - // case-sensitive and case-insensitive modes, regardless of culture. + // we can just call directly. switch (charClass) { case RegexCharClass.AnyClass: @@ -4810,24 +4682,8 @@ private void EmitMatchCharacterClass(string charClass, bool caseInsensitive) return; } - // If we're meant to be doing a case-insensitive lookup, and if we're not using the invariant culture, - // lowercase the input. If we're using the invariant culture, we may still end up calling ToLower later - // on, but we may also be able to avoid it, in particular in the case of our lookup table, where we can - // generate the lookup table already factoring in the invariant case sensitivity. There are multiple - // special-code paths between here and the lookup table, but we only take those if invariant is false; - // if it were true, they'd need to use CallToLower(). - bool invariant = false; - if (caseInsensitive) - { - invariant = UseToLowerInvariant; - if (!invariant) - { - CallToLower(); - } - } - // Next, handle simple sets of one range, e.g. [A-Z], [0-9], etc. This includes some built-in classes, like ECMADigitClass. - if (!invariant && RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive)) + if (RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive)) { if (lowInclusive == highInclusive) { @@ -4857,7 +4713,7 @@ private void EmitMatchCharacterClass(string charClass, bool caseInsensitive) // Next if the character class contains nothing but a single Unicode category, we can calle char.GetUnicodeCategory and // compare against it. It has a fast-lookup path for ASCII, so is as good or better than any lookup we'd generate (plus // we get smaller code), and it's what we'd do for the fallback (which we get to avoid generating) as part of CharInClass. - if (!invariant && RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated)) + if (RegexCharClass.TryGetSingleUnicodeCategory(charClass, out UnicodeCategory category, out bool negated)) { // char.GetUnicodeCategory(ch) == category Call(s_charGetUnicodeInfo); @@ -4879,7 +4735,7 @@ private void EmitMatchCharacterClass(string charClass, bool caseInsensitive) // Next, if there's only 2 or 3 chars in the set (fairly common due to the sets we create for prefixes), // it's cheaper and smaller to compare against each than it is to use a lookup table. - if (!invariant && !RegexCharClass.IsNegated(charClass)) + if (!RegexCharClass.IsNegated(charClass)) { Span setChars = stackalloc char[3]; int numChars = RegexCharClass.GetSetChars(charClass, setChars); @@ -4928,10 +4784,6 @@ private void EmitMatchCharacterClass(string charClass, bool caseInsensitive) void EmitCharInClass() { Ldloc(tempLocal); - if (invariant) - { - CallToLower(); - } Ldstr(charClass); Call(s_charInClassMethod); Stloc(resultLocal); @@ -4940,49 +4792,46 @@ void EmitCharInClass() Label doneLabel = DefineLabel(); Label comparisonLabel = DefineLabel(); - if (!invariant) // if we're being asked to do a case insensitive, invariant comparison, use the lookup table + if (analysis.ContainsNoAscii) { - if (analysis.ContainsNoAscii) - { - // We determined that the character class contains only non-ASCII, - // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is - // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly - // extend the analysis to produce a known lower-bound and compare against - // that rather than always using 128 as the pivot point.) - - // ch >= 128 && RegexRunner.CharInClass(ch, "...") - Ldloc(tempLocal); - Ldc(128); - Blt(comparisonLabel); - EmitCharInClass(); - Br(doneLabel); - MarkLabel(comparisonLabel); - Ldc(0); - Stloc(resultLocal); - MarkLabel(doneLabel); - Ldloc(resultLocal); - return; - } + // We determined that the character class contains only non-ASCII, + // for example if the class were [\p{IsGreek}\p{IsGreekExtended}], which is + // the same as [\u0370-\u03FF\u1F00-1FFF]. (In the future, we could possibly + // extend the analysis to produce a known lower-bound and compare against + // that rather than always using 128 as the pivot point.) - if (analysis.AllAsciiContained) - { - // We determined that every ASCII character is in the class, for example - // if the class were the negated example from case 1 above: - // [^\p{IsGreek}\p{IsGreekExtended}]. + // ch >= 128 && RegexRunner.CharInClass(ch, "...") + Ldloc(tempLocal); + Ldc(128); + Blt(comparisonLabel); + EmitCharInClass(); + Br(doneLabel); + MarkLabel(comparisonLabel); + Ldc(0); + Stloc(resultLocal); + MarkLabel(doneLabel); + Ldloc(resultLocal); + return; + } - // ch < 128 || RegexRunner.CharInClass(ch, "...") - Ldloc(tempLocal); - Ldc(128); - Blt(comparisonLabel); - EmitCharInClass(); - Br(doneLabel); - MarkLabel(comparisonLabel); - Ldc(1); - Stloc(resultLocal); - MarkLabel(doneLabel); - Ldloc(resultLocal); - return; - } + if (analysis.AllAsciiContained) + { + // We determined that every ASCII character is in the class, for example + // if the class were the negated example from case 1 above: + // [^\p{IsGreek}\p{IsGreekExtended}]. + + // ch < 128 || RegexRunner.CharInClass(ch, "...") + Ldloc(tempLocal); + Ldc(128); + Blt(comparisonLabel); + EmitCharInClass(); + Br(doneLabel); + MarkLabel(comparisonLabel); + Ldc(1); + Stloc(resultLocal); + MarkLabel(doneLabel); + Ldloc(resultLocal); + return; } // Now, our big hammer is to generate a lookup table that lets us quickly index by character into a yes/no @@ -5000,15 +4849,12 @@ void EmitCharInClass() // Generate the lookup table to store 128 answers as bits. We use a const string instead of a byte[] / static // data property because it lets IL emit handle all the details for us. - string bitVectorString = string.Create(8, (charClass, invariant), static (dest, state) => // String length is 8 chars == 16 bytes == 128 bits. + string bitVectorString = string.Create(8, charClass, static (dest, charClass) => // String length is 8 chars == 16 bytes == 128 bits. { for (int i = 0; i < 128; i++) { char c = (char)i; - bool isSet = state.invariant ? - RegexCharClass.CharInClass(char.ToLowerInvariant(c), state.charClass) : - RegexCharClass.CharInClass(c, state.charClass); - if (isSet) + if (RegexCharClass.CharInClass(c, charClass)) { dest[i >> 4] |= (char)(1 << (i & 0xF)); } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexFindOptimizations.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexFindOptimizations.cs index 5547039f05354..f06e1ec46142d 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexFindOptimizations.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexFindOptimizations.cs @@ -12,15 +12,12 @@ internal sealed class RegexFindOptimizations { /// True if the input should be processed right-to-left rather than left-to-right. private readonly bool _rightToLeft; - /// Provides the ToLower routine for lowercasing characters. - private readonly TextInfo _textInfo; /// Lookup table used for optimizing ASCII when doing set queries. private readonly uint[]?[]? _asciiLookups; - public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo culture) + public RegexFindOptimizations(RegexNode root, RegexOptions options) { _rightToLeft = (options & RegexOptions.RightToLeft) != 0; - _textInfo = culture.TextInfo; MinRequiredLength = root.ComputeMinLength(); @@ -80,14 +77,14 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo } } - // If there's a leading case-sensitive substring, just use IndexOf and inherit all of its optimizations. - string caseSensitivePrefix = RegexPrefixAnalyzer.FindCaseSensitivePrefix(root); - if (caseSensitivePrefix.Length > 1) + // If there's a leading substring, just use IndexOf and inherit all of its optimizations. + string prefix = RegexPrefixAnalyzer.FindPrefix(root); + if (prefix.Length > 1) { - LeadingCaseSensitivePrefix = caseSensitivePrefix; + LeadingPrefix = prefix; FindMode = _rightToLeft ? - FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive : - FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive; + FindNextStartingPositionMode.LeadingPrefix_RightToLeft : + FindNextStartingPositionMode.LeadingPrefix_LeftToRight; return; } @@ -107,14 +104,14 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo if (_rightToLeft) { // Determine a set for anything that can possibly start the expression. - if (RegexPrefixAnalyzer.FindFirstCharClass(root, culture) is (string CharClass, bool CaseInsensitive) set) + if (RegexPrefixAnalyzer.FindFirstCharClass(root) is string charClass) { // See if the set is limited to holding only a few characters. Span scratch = stackalloc char[5]; // max optimized by IndexOfAny today int scratchCount; char[]? chars = null; - if (!RegexCharClass.IsNegated(set.CharClass) && - (scratchCount = RegexCharClass.GetSetChars(set.CharClass, scratch)) > 0) + if (!RegexCharClass.IsNegated(charClass) && + (scratchCount = RegexCharClass.GetSetChars(charClass, scratch)) > 0) { chars = scratch.Slice(0, scratchCount).ToArray(); } @@ -125,20 +122,16 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo // The set contains one and only one character, meaning every match starts // with the same literal value (potentially case-insensitive). Search for that. FixedDistanceLiteral = (chars[0], 0); - FindMode = set.CaseInsensitive ? - FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseInsensitive : - FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseSensitive; + FindMode = FindNextStartingPositionMode.LeadingLiteral_RightToLeft; } else { // The set may match multiple characters. Search for that. - FixedDistanceSets = new List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>() + FixedDistanceSets = new List<(char[]? Chars, string Set, int Distance)>() { - (chars, set.CharClass, 0, set.CaseInsensitive) + (chars, charClass, 0) }; - FindMode = set.CaseInsensitive ? - FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive : - FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive; + FindMode = FindNextStartingPositionMode.LeadingSet_RightToLeft; _asciiLookups = new uint[1][]; } } @@ -152,7 +145,7 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo (RegexNode LoopNode, (char Char, string? String, char[]? Chars) Literal)? literalAfterLoop = RegexPrefixAnalyzer.FindLiteralFollowingLeadingLoop(root); // Build up a list of all of the sets that are a fixed distance from the start of the expression. - List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? fixedDistanceSets = RegexPrefixAnalyzer.FindFixedDistanceSets(root, culture, thorough: !interpreter); + List<(char[]? Chars, string Set, int Distance)>? fixedDistanceSets = RegexPrefixAnalyzer.FindFixedDistanceSets(root, thorough: !interpreter); Debug.Assert(fixedDistanceSets is null || fixedDistanceSets.Count != 0); // If we got such sets, we'll likely use them. However, if the best of them is something that doesn't support a vectorized @@ -168,9 +161,7 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo fixedDistanceSets[0].Chars is { Length: 1 }) { FixedDistanceLiteral = (fixedDistanceSets[0].Chars![0], fixedDistanceSets[0].Distance); - FindMode = fixedDistanceSets[0].CaseInsensitive ? - FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive : - FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseSensitive; + FindMode = FindNextStartingPositionMode.FixedLiteral_LeftToRight; } else { @@ -184,13 +175,8 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo // Store the sets, and compute which mode to use. FixedDistanceSets = fixedDistanceSets; - FindMode = (fixedDistanceSets.Count == 1 && fixedDistanceSets[0].Distance == 0, fixedDistanceSets[0].CaseInsensitive) switch - { - (true, true) => FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive, - (true, false) => FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, - (false, true) => FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive, - (false, false) => FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive, - }; + FindMode = (fixedDistanceSets.Count == 1 && fixedDistanceSets[0].Distance == 0) ? FindNextStartingPositionMode.LeadingSet_LeftToRight + : FindNextStartingPositionMode.FixedSets_LeftToRight; _asciiLookups = new uint[fixedDistanceSets.Count][]; } return; @@ -199,7 +185,7 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo // If we found a literal we can search for after a leading set loop, use it. if (literalAfterLoop is not null) { - FindMode = FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive; + FindMode = FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight; LiteralAfterLoop = literalAfterLoop; _asciiLookups = new uint[1][]; return; @@ -227,14 +213,14 @@ public RegexFindOptimizations(RegexNode root, RegexOptions options, CultureInfo public int? MaxPossibleLength { get; } /// Gets the leading prefix. May be an empty string. - public string LeadingCaseSensitivePrefix { get; } = string.Empty; + public string LeadingPrefix { get; } = string.Empty; /// When in fixed distance literal mode, gets the literal and how far it is from the start of the pattern. public (char Literal, int Distance) FixedDistanceLiteral { get; } /// When in fixed distance set mode, gets the set and how far it is from the start of the pattern. /// The case-insensitivity of the 0th entry will always match the mode selected, but subsequent entries may not. - public List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? FixedDistanceSets { get; } + public List<(char[]? Chars, string Set, int Distance)>? FixedDistanceSets { get; } /// When in literal after set loop node, gets the literal to search for and the RegexNode representing the leading loop. public (RegexNode LoopNode, (char Char, string? String, char[]? Chars) Literal)? LiteralAfterLoop { get; } @@ -393,9 +379,9 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos // There's a case-sensitive prefix. Search for it with ordinal IndexOf. - case FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.LeadingPrefix_LeftToRight: { - int i = textSpan.Slice(pos).IndexOf(LeadingCaseSensitivePrefix.AsSpan()); + int i = textSpan.Slice(pos).IndexOf(LeadingPrefix.AsSpan()); if (i >= 0) { pos += i; @@ -406,12 +392,12 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos return false; } - case FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive: + case FindNextStartingPositionMode.LeadingPrefix_RightToLeft: { - int i = textSpan.Slice(0, pos).LastIndexOf(LeadingCaseSensitivePrefix.AsSpan()); + int i = textSpan.Slice(0, pos).LastIndexOf(LeadingPrefix.AsSpan()); if (i >= 0) { - pos = i + LeadingCaseSensitivePrefix.Length; + pos = i + LeadingPrefix.Length; return true; } @@ -421,7 +407,7 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos // There's a literal at the beginning of the pattern. Search for it. - case FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseSensitive: + case FindNextStartingPositionMode.LeadingLiteral_RightToLeft: { int i = textSpan.Slice(0, pos).LastIndexOf(FixedDistanceLiteral.Literal); if (i >= 0) @@ -434,30 +420,11 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos return false; } - case FindNextStartingPositionMode.LeadingLiteral_RightToLeft_CaseInsensitive: - { - char ch = FixedDistanceLiteral.Literal; - TextInfo ti = _textInfo; - - ReadOnlySpan span = textSpan.Slice(0, pos); - for (int i = span.Length - 1; i >= 0; i--) - { - if (ti.ToLower(span[i]) == ch) - { - pos = i + 1; - return true; - } - } - - pos = 0; - return false; - } - // There's a set at the beginning of the pattern. Search for it. - case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.LeadingSet_LeftToRight: { - (char[]? chars, string set, _, _) = FixedDistanceSets![0]; + (char[]? chars, string set, _) = FixedDistanceSets![0]; ReadOnlySpan span = textSpan.Slice(pos); if (chars is not null) @@ -486,27 +453,7 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos return false; } - case FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseInsensitive: - { - ref uint[]? startingAsciiLookup = ref _asciiLookups![0]; - string set = FixedDistanceSets![0].Set; - TextInfo ti = _textInfo; - - ReadOnlySpan span = textSpan.Slice(pos); - for (int i = 0; i < span.Length; i++) - { - if (RegexCharClass.CharInClass(ti.ToLower(span[i]), set, ref startingAsciiLookup)) - { - pos += i; - return true; - } - } - - pos = textSpan.Length; - return false; - } - - case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive: + case FindNextStartingPositionMode.LeadingSet_RightToLeft: { ref uint[]? startingAsciiLookup = ref _asciiLookups![0]; string set = FixedDistanceSets![0].Set; @@ -525,29 +472,9 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos return false; } - case FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseInsensitive: - { - ref uint[]? startingAsciiLookup = ref _asciiLookups![0]; - string set = FixedDistanceSets![0].Set; - TextInfo ti = _textInfo; - - ReadOnlySpan span = textSpan.Slice(0, pos); - for (int i = span.Length - 1; i >= 0; i--) - { - if (RegexCharClass.CharInClass(ti.ToLower(span[i]), set, ref startingAsciiLookup)) - { - pos = i + 1; - return true; - } - } - - pos = 0; - return false; - } - // There's a literal at a fixed offset from the beginning of the pattern. Search for it. - case FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.FixedLiteral_LeftToRight: { Debug.Assert(FixedDistanceLiteral.Distance <= MinRequiredLength); @@ -562,33 +489,12 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos return false; } - case FindNextStartingPositionMode.FixedLiteral_LeftToRight_CaseInsensitive: - { - Debug.Assert(FixedDistanceLiteral.Distance <= MinRequiredLength); - - char ch = FixedDistanceLiteral.Literal; - TextInfo ti = _textInfo; - - ReadOnlySpan span = textSpan.Slice(pos + FixedDistanceLiteral.Distance); - for (int i = 0; i < span.Length; i++) - { - if (ti.ToLower(span[i]) == ch) - { - pos += i; - return true; - } - } - - pos = textSpan.Length; - return false; - } - // There are one or more sets at fixed offsets from the start of the pattern. - case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.FixedSets_LeftToRight: { - List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets = FixedDistanceSets!; - (char[]? primaryChars, string primarySet, int primaryDistance, _) = sets[0]; + List<(char[]? Chars, string Set, int Distance)> sets = FixedDistanceSets!; + (char[]? primaryChars, string primarySet, int primaryDistance) = sets[0]; int endMinusRequiredLength = textSpan.Length - Math.Max(1, MinRequiredLength); if (primaryChars is not null) @@ -612,9 +518,9 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos for (int i = 1; i < sets.Count; i++) { - (_, string nextSet, int nextDistance, bool nextCaseInsensitive) = sets[i]; + (_, string nextSet, int nextDistance) = sets[i]; char c = textSpan[inputPosition + nextDistance]; - if (!RegexCharClass.CharInClass(nextCaseInsensitive ? _textInfo.ToLower(c) : c, nextSet, ref _asciiLookups![i])) + if (!RegexCharClass.CharInClass(c, nextSet, ref _asciiLookups![i])) { goto Bumpalong; } @@ -640,9 +546,9 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos for (int i = 1; i < sets.Count; i++) { - (_, string nextSet, int nextDistance, bool nextCaseInsensitive) = sets[i]; + (_, string nextSet, int nextDistance) = sets[i]; c = textSpan[inputPosition + nextDistance]; - if (!RegexCharClass.CharInClass(nextCaseInsensitive ? _textInfo.ToLower(c) : c, nextSet, ref _asciiLookups![i])) + if (!RegexCharClass.CharInClass(c, nextSet, ref _asciiLookups![i])) { goto Bumpalong; } @@ -659,45 +565,8 @@ public bool TryFindNextStartingPosition(ReadOnlySpan textSpan, ref int pos return false; } - case FindNextStartingPositionMode.FixedSets_LeftToRight_CaseInsensitive: - { - List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> sets = FixedDistanceSets!; - (_, string primarySet, int primaryDistance, _) = sets[0]; - - int endMinusRequiredLength = textSpan.Length - Math.Max(1, MinRequiredLength); - TextInfo ti = _textInfo; - ref uint[]? startingAsciiLookup = ref _asciiLookups![0]; - - for (int inputPosition = pos; inputPosition <= endMinusRequiredLength; inputPosition++) - { - char c = textSpan[inputPosition + primaryDistance]; - if (!RegexCharClass.CharInClass(ti.ToLower(c), primarySet, ref startingAsciiLookup)) - { - goto Bumpalong; - } - - for (int i = 1; i < sets.Count; i++) - { - (_, string nextSet, int nextDistance, bool nextCaseInsensitive) = sets[i]; - c = textSpan[inputPosition + nextDistance]; - if (!RegexCharClass.CharInClass(nextCaseInsensitive ? _textInfo.ToLower(c) : c, nextSet, ref _asciiLookups![i])) - { - goto Bumpalong; - } - } - - pos = inputPosition; - return true; - - Bumpalong:; - } - - pos = textSpan.Length; - return false; - } - // There's a literal after a leading set loop. Find the literal, then walk backwards through the loop to find the starting position. - case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive: + case FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight: { Debug.Assert(LiteralAfterLoop is not null); (RegexNode loopNode, (char Char, string? String, char[]? Chars) literal) = LiteralAfterLoop.GetValueOrDefault(); @@ -779,37 +648,27 @@ internal enum FindNextStartingPositionMode /// An "endz" anchor at the end of the pattern, with the pattern always matching a fixed-length expression. TrailingAnchor_FixedLength_LeftToRight_EndZ, - /// A case-sensitive multi-character substring at the beginning of the pattern. - LeadingPrefix_LeftToRight_CaseSensitive, - /// A case-sensitive multi-character substring at the beginning of the right-to-left pattern. - LeadingPrefix_RightToLeft_CaseSensitive, - - /// A case-sensitive set starting the pattern. - LeadingSet_LeftToRight_CaseSensitive, - /// A case-insensitive set starting the pattern. - LeadingSet_LeftToRight_CaseInsensitive, - /// A case-sensitive set starting the right-to-left pattern. - LeadingSet_RightToLeft_CaseSensitive, - /// A case-insensitive set starting the right-to-left pattern. - LeadingSet_RightToLeft_CaseInsensitive, - - /// A case-sensitive single character at a fixed distance from the start of the right-to-left pattern. - LeadingLiteral_RightToLeft_CaseSensitive, - /// A case-insensitive single character at a fixed distance from the start of the right-to-left pattern. - LeadingLiteral_RightToLeft_CaseInsensitive, - - /// A case-sensitive single character at a fixed distance from the start of the pattern. - FixedLiteral_LeftToRight_CaseSensitive, - /// A case-insensitive single character at a fixed distance from the start of the pattern. - FixedLiteral_LeftToRight_CaseInsensitive, - - /// One or more sets at a fixed distance from the start of the pattern. At least the first set is case-sensitive. - FixedSets_LeftToRight_CaseSensitive, - /// One or more sets at a fixed distance from the start of the pattern. At least the first set is case-insensitive. - FixedSets_LeftToRight_CaseInsensitive, - - /// A literal after a non-overlapping set loop at the start of the pattern. The literal is case-sensitive. - LiteralAfterLoop_LeftToRight_CaseSensitive, + /// A multi-character substring at the beginning of the pattern. + LeadingPrefix_LeftToRight, + /// A multi-character substring at the beginning of the right-to-left pattern. + LeadingPrefix_RightToLeft, + + /// A set starting the pattern. + LeadingSet_LeftToRight, + /// A set starting the right-to-left pattern. + LeadingSet_RightToLeft, + + /// A single character at a fixed distance from the start of the right-to-left pattern. + LeadingLiteral_RightToLeft, + + /// A single character at a fixed distance from the start of the pattern. + FixedLiteral_LeftToRight, + + /// One or more sets at a fixed distance from the start of the pattern. + FixedSets_LeftToRight, + + /// A literal after a non-overlapping set loop at the start of the pattern. + LiteralAfterLoop_LeftToRight, /// Nothing to search for. Nop. NoSearch, diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexInterpreter.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexInterpreter.cs index 1583c6180203d..eb0a43bed77d4 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexInterpreter.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexInterpreter.cs @@ -12,14 +12,20 @@ namespace System.Text.RegularExpressions internal sealed class RegexInterpreterFactory : RegexRunnerFactory { private readonly RegexInterpreterCode _code; + private readonly TextInfo? _textInfo; - public RegexInterpreterFactory(RegexTree tree, CultureInfo culture) => + public RegexInterpreterFactory(RegexTree tree) + { + // We use the TextInfo field from the tree's culture which will only be set to an actual culture if the + // tree contains IgnoreCase backreferences. If the tree doesn't have IgnoreCase backreferences, then we keep _textInfo as null. + _textInfo = tree.Culture?.TextInfo; // Generate and store the RegexInterpretedCode for the RegexTree and the specified culture - _code = RegexWriter.Write(tree, culture); + _code = RegexWriter.Write(tree); + } protected internal override RegexRunner CreateInstance() => // Create a new interpreter instance. - new RegexInterpreter(_code, RegexParser.GetTargetCulture(_code.Options)); + new RegexInterpreter(_code, _textInfo); } /// Executes a block of regular expression codes while consuming input. @@ -28,20 +34,19 @@ internal sealed class RegexInterpreter : RegexRunner private const int LoopTimeoutCheckCount = 2048; // conservative value to provide reasonably-accurate timeout handling. private readonly RegexInterpreterCode _code; - private readonly TextInfo _textInfo; + private readonly TextInfo? _textInfo; private RegexOpcode _operator; private int _codepos; private bool _rightToLeft; private bool _caseInsensitive; - public RegexInterpreter(RegexInterpreterCode code, CultureInfo culture) + public RegexInterpreter(RegexInterpreterCode code, TextInfo? textInfo) { Debug.Assert(code != null, "code must not be null."); - Debug.Assert(culture != null, "culture must not be null."); _code = code; - _textInfo = culture.TextInfo; + _textInfo = textInfo; } protected override void InitTrackCount() => runtrackcount = _code.TrackCount; @@ -215,8 +220,7 @@ private void StackPush(int i1, int i2) private char Forwardcharnext(ReadOnlySpan inputSpan) { int i = _rightToLeft ? --runtextpos : runtextpos++; - char ch = inputSpan[i]; - return _caseInsensitive ? _textInfo.ToLower(ch) : ch; + return inputSpan[i]; } private bool MatchString(string str, ReadOnlySpan inputSpan) @@ -243,25 +247,11 @@ private bool MatchString(string str, ReadOnlySpan inputSpan) pos = runtextpos; } - if (!_caseInsensitive) - { - while (c != 0) - { - if (str[--c] != inputSpan[--pos]) - { - return false; - } - } - } - else + while (c != 0) { - TextInfo ti = _textInfo; - while (c != 0) + if (str[--c] != inputSpan[--pos]) { - if (str[--c] != ti.ToLower(inputSpan[--pos])) - { - return false; - } + return false; } } @@ -312,6 +302,7 @@ private bool MatchRef(int index, int length, ReadOnlySpan inputSpan) } else { + Debug.Assert(_textInfo != null, "If the pattern has backreferences and is IgnoreCase, then _textInfo must not be null."); TextInfo ti = _textInfo; while (c-- != 0) { diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexLWCGCompiler.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexLWCGCompiler.cs index 0a1ab21806263..e97dabae774d3 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexLWCGCompiler.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexLWCGCompiler.cs @@ -61,7 +61,7 @@ internal sealed class RegexLWCGCompiler : RegexCompiler DynamicMethod scanMethod = DefineDynamicMethod($"Regex{regexNum}_Scan{description}", null, typeof(CompiledRegexRunner), new[] { typeof(RegexRunner), typeof(ReadOnlySpan) }); EmitScan(options, tryfindNextPossibleStartPositionMethod, tryMatchAtCurrentPositionMethod); - return new CompiledRegexRunnerFactory(scanMethod); + return new CompiledRegexRunnerFactory(scanMethod, regexTree.Culture); } /// Begins the definition of a new method (no args) with a specified return value. diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexNode.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexNode.cs index 37c862f52a345..132d7457d7112 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexNode.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexNode.cs @@ -97,25 +97,17 @@ public static RegexNode CreateOneWithCaseConversion(char ch, RegexOptions option { Debug.Assert(culture is not null); - // If the character is part of a Unicode category that doesn't participate in case conversion, - // we can simply strip out the IgnoreCase option and make the node case-sensitive. - if (!RegexCharClass.ParticipatesInCaseConversion(ch)) + if (!RegexCaseEquivalences.TryFindCaseEquivalencesForCharWithIBehavior(ch, culture, out ReadOnlySpan equivalences)) { + // If we reach here, then we know that ch does not participate in case conversion, so we just + // create a One node with it and strip out the IgnoreCase option. return new RegexNode(RegexNodeKind.One, options & ~RegexOptions.IgnoreCase, ch); } - // Create a set for the character, trying to include all case-insensitive equivalent characters. - // If it's successful in doing so, resultIsCaseInsensitive will be false and we can strip - // out RegexOptions.IgnoreCase as part of creating the set. - string stringSet = RegexCharClass.OneToStringClass(ch, culture, out bool resultIsCaseInsensitive); - if (!resultIsCaseInsensitive) - { - return new RegexNode(RegexNodeKind.Set, options & ~RegexOptions.IgnoreCase, stringSet); - } - - // Otherwise, until we can get rid of ToLower usage at match time entirely (https://github.com/dotnet/runtime/issues/61048), - // lowercase the character and proceed to create an IgnoreCase One node. - ch = culture.TextInfo.ToLower(ch); + // If it does participate in case conversion, then transform the Node into a set with + // all possible valid values and remove the IgnoreCase option to make the node case-sensitive. + string stringSet = RegexCharClass.CharsToStringClass(equivalences); + return new RegexNode(RegexNodeKind.Set, options & ~RegexOptions.IgnoreCase, stringSet); } // Create a One node for the character. @@ -295,6 +287,17 @@ private void ValidateFinalTreeInvariants() Debug.Assert(node.Str is null, $"Expected null string for {node.Kind}, got \"{node.Str}\"."); break; } + + // Validate only Backreference nodes have IgnoreCase Option + switch (node.Kind) + { + case RegexNodeKind.Backreference: + break; + + default: + Debug.Assert((node.Options & RegexOptions.IgnoreCase) == 0, $"{node.Kind} node should not have RegexOptions.IgnoreCase"); + break; + } } } #endif @@ -501,10 +504,7 @@ private void EliminateEndingBacktracking() /// internal RegexNode Reduce() { - // TODO: https://github.com/dotnet/runtime/issues/61048 - // As part of overhauling IgnoreCase handling, the parser shouldn't produce any nodes other than Backreference - // that ever have IgnoreCase set on them. For now, though, remove IgnoreCase from any nodes for which it - // has no behavioral effect. + // Remove IgnoreCase option from everything except a Backreference switch (Kind) { default: @@ -512,10 +512,6 @@ internal RegexNode Reduce() Options &= ~RegexOptions.IgnoreCase; break; - case RegexNodeKind.One or RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic: - case RegexNodeKind.Notone or RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic: - case RegexNodeKind.Set or RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic: - case RegexNodeKind.Multi: case RegexNodeKind.Backreference: // Still meaningful break; @@ -1017,11 +1013,9 @@ void ReduceSingleLetterAndNestedAlternations() } prev.Kind = RegexNodeKind.Set; - prev.Str = prevCharClass.ToStringClass(Options); - if ((prev.Options & RegexOptions.IgnoreCase) != 0 && - RegexCharClass.MakeCaseSensitiveIfPossible(prev.Str, RegexParser.GetTargetCulture(prev.Options)) is string newSetString) + prev.Str = prevCharClass.ToStringClass(); + if ((prev.Options & RegexOptions.IgnoreCase) != 0) { - prev.Str = newSetString; prev.Options &= ~RegexOptions.IgnoreCase; } } @@ -1983,8 +1977,8 @@ private static bool CanBeMadeAtomic(RegexNode node, RegexNode subsequent, bool a break; } - // If the two nodes don't agree on options in any way, don't try to optimize them. - // TODO: Remove this once https://github.com/dotnet/runtime/issues/61048 is implemented. + // If the current node's options don't match the subsequent node, then we cannot make it atomic. + // This applies to RightToLeft for lookbehinds, as well as patterns that enable/disable global flags in the middle of the pattern. if (node.Options != subsequent.Options) { return false; @@ -2230,9 +2224,9 @@ public int ComputeMinLength() case RegexNodeKind.Empty: case RegexNodeKind.Nothing: case RegexNodeKind.UpdateBumpalong: - // Nothing to match. In the future, we could potentially use Nothing to say that the min length - // is infinite, but that would require a different structure, as that would only apply if the - // Nothing match is required in all cases (rather than, say, as one branch of an alternation). + // Nothing to match. In the future, we could potentially use Nothing to say that the min length + // is infinite, but that would require a different structure, as that would only apply if the + // Nothing match is required in all cases (rather than, say, as one branch of an alternation). case RegexNodeKind.Beginning: case RegexNodeKind.Bol: case RegexNodeKind.Boundary: @@ -2245,7 +2239,7 @@ public int ComputeMinLength() case RegexNodeKind.Start: case RegexNodeKind.NegativeLookaround: case RegexNodeKind.PositiveLookaround: - // Zero-width + // Zero-width case RegexNodeKind.Backreference: // Requires matching data available only at run-time. In the future, we could choose to find // and follow the capture group this aligns with, while being careful not to end up in an @@ -2415,16 +2409,9 @@ public bool TryGetOrdinalCaseInsensitiveString(int childIndex, int exclusiveChil // Iterate from the child index to the exclusive upper bound. int i = childIndex; - for ( ; i < exclusiveChildBound; i++) + for (; i < exclusiveChildBound; i++) { RegexNode child = Child(i); - if ((child.Options & RegexOptions.IgnoreCase) != 0) - { - // TODO https://github.com/dotnet/runtime/issues/61048: Remove this block once fixed. - // We don't want any nodes that are still IgnoreCase, as they'd no longer be IgnoreCase if - // they were applicable to this optimization. - break; - } if (child.Kind is RegexNodeKind.One) { diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexParser.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexParser.cs index bd89292697a28..52d909444d627 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexParser.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexParser.cs @@ -29,6 +29,7 @@ internal ref struct RegexParser private readonly string _pattern; private int _currentPos; private readonly CultureInfo _culture; + private bool _hasIgnoreCaseBackreferenceNodes; private int _autocap; private int _capcount; @@ -57,6 +58,7 @@ private RegexParser(string pattern, RegexOptions options, CultureInfo culture, H _pattern = pattern; _options = options; _culture = culture; + _hasIgnoreCaseBackreferenceNodes = false; _caps = caps; _capsize = capsize; _capnames = capnames; @@ -110,7 +112,7 @@ public static RegexTree Parse(string pattern, RegexOptions options, CultureInfo } } - return new RegexTree(root, captureCount, parser._capnamelist?.ToArray(), parser._capnames!, sparseMapping, options, culture); + return new RegexTree(root, captureCount, parser._capnamelist?.ToArray(), parser._capnames!, sparseMapping, options, parser._hasIgnoreCaseBackreferenceNodes ? culture : null); } /// @@ -265,7 +267,9 @@ private RegexNode ScanRegex() char ch; bool isQuantifier = false; - StartGroup(new RegexNode(RegexNodeKind.Capture, _options, 0, -1)); + // For the main Capture object, strip out the IgnoreCase option. The rest of the nodes will strip it out depending on the content + // of each node. + StartGroup(new RegexNode(RegexNodeKind.Capture, (_options & ~RegexOptions.IgnoreCase), 0, -1)); while (CharsRight() > 0) { @@ -334,10 +338,8 @@ private RegexNode ScanRegex() case '[': { - string setString = ScanCharClass(UseOptionI(), scanOnly: false)!.ToStringClass(_options); - _unit = UseOptionI() && RegexCharClass.MakeCaseSensitiveIfPossible(setString, _culture) is string newSetString ? - new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, newSetString) : - new RegexNode(RegexNodeKind.Set, _options, setString); + string setString = ScanCharClass(UseOptionI(), scanOnly: false)!.ToStringClass(); + _unit = new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, setString); } break; @@ -762,7 +764,7 @@ private RegexNode ScanReplacement() if (!scanOnly && caseInsensitive) { - charClass!.AddLowercase(_culture); + charClass!.AddCaseEquivalences(_culture); } return charClass; @@ -1169,32 +1171,32 @@ private void ScanBlank() case 'w': MoveRight(); return scanOnly ? null : - new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass); + new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass); case 'W': MoveRight(); return scanOnly ? null : - new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass); + new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass); case 's': MoveRight(); return scanOnly ? null : - new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass); + new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass); case 'S': MoveRight(); return scanOnly ? null : - new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass); + new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass); case 'd': MoveRight(); return scanOnly ? null : - new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass); + new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass); case 'D': MoveRight(); return scanOnly ? null : - new RegexNode(RegexNodeKind.Set, RemoveIgnoreCaseIfNotEcma(_options), UseOptionE() ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass); + new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), UseOptionE() ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass); case 'p': case 'P': @@ -1208,29 +1210,18 @@ private void ScanBlank() cc.AddCategoryFromName(ParseProperty(), ch != 'p', UseOptionI(), _pattern, _currentPos); if (UseOptionI()) { - cc.AddLowercase(_culture); + cc.AddCaseEquivalences(_culture); } - return new RegexNode(RegexNodeKind.Set, _options, cc.ToStringClass(_options)); + return new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), cc.ToStringClass()); default: - return ScanBasicBackslash(scanOnly); - } - - static RegexOptions RemoveIgnoreCaseIfNotEcma(RegexOptions options) - { - // This function is used for \w, \W, \d, \D, \s, and \S to remove IgnoreCase, - // since they already include the notion of casing in their definitions. - // However, for compatibility, if ECMAScript is specified, we avoid stripping - // out the IgnoreCase. We should revisit this as part of https://github.com/dotnet/runtime/issues/61048, - // as it seems wrong that specifying ECMAScript (which implies non-Unicode) would - // then still involve lowercasing potentially Unicode character inputs to match - // against these sets. - if ((options & RegexOptions.ECMAScript) == 0) - { - options &= ~RegexOptions.IgnoreCase; - } - return options; + RegexNode? result = ScanBasicBackslash(scanOnly); + if (result != null && result.Kind == RegexNodeKind.Backreference && (result.Options & RegexOptions.IgnoreCase) != 0) + { + _hasIgnoreCaseBackreferenceNodes = true; + } + return result; } } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexPrefixAnalyzer.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexPrefixAnalyzer.cs index c9077b79dbaa2..a913d0f337e3a 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexPrefixAnalyzer.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexPrefixAnalyzer.cs @@ -40,7 +40,7 @@ private RegexPrefixAnalyzer(Span intStack) } /// Computes the leading substring in ; may be empty. - public static string FindCaseSensitivePrefix(RegexNode node) + public static string FindPrefix(RegexNode node) { var vsb = new ValueStringBuilder(stackalloc char[64]); Process(node, ref vsb); @@ -130,17 +130,17 @@ static bool Process(RegexNode node, ref ValueStringBuilder vsb) } // One character - case RegexNodeKind.One when (node.Options & RegexOptions.IgnoreCase) == 0: + case RegexNodeKind.One: vsb.Append(node.Ch); return !rtl; // Multiple characters - case RegexNodeKind.Multi when (node.Options & RegexOptions.IgnoreCase) == 0: + case RegexNodeKind.Multi: vsb.Append(node.Str); return !rtl; // Loop of one character - case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0 && (node.Options & RegexOptions.IgnoreCase) == 0: + case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0: const int SingleCharIterationLimit = 32; // arbitrary cut-off to avoid creating super long strings unnecessarily int count = Math.Min(node.M, SingleCharIterationLimit); vsb.Append(node.Ch, count); @@ -192,18 +192,17 @@ static bool Process(RegexNode node, ref ValueStringBuilder vsb) /// Finds sets at fixed-offsets from the beginning of the pattern/ /// The RegexNode tree root. - /// The culture to use for any case conversions. /// true to spend more time finding sets (e.g. through alternations); false to do a faster analysis that's potentially more incomplete. /// The array of found sets, or null if there aren't any. - public static List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>? FindFixedDistanceSets(RegexNode root, CultureInfo culture, bool thorough) + public static List<(char[]? Chars, string Set, int Distance)>? FindFixedDistanceSets(RegexNode root, bool thorough) { const int MaxLoopExpansion = 20; // arbitrary cut-off to avoid loops adding significant overhead to processing const int MaxFixedResults = 50; // arbitrary cut-off to avoid generating lots of sets unnecessarily // Find all fixed-distance sets. - var results = new List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>(); + var results = new List<(char[]? Chars, string Set, int Distance)>(); int distance = 0; - TryFindFixedSets(root, results, ref distance, culture, thorough); + TryFindFixedSets(root, results, ref distance, thorough); // Remove any sets that match everything; they're not helpful. (This check exists primarily to weed // out use of . in Singleline mode.) @@ -226,10 +225,10 @@ static bool Process(RegexNode node, ref ValueStringBuilder vsb) // doesn't. if (results.Count == 0) { - (string CharClass, bool CaseInsensitive)? first = FindFirstCharClass(root, culture); - if (first is not null) + string? charClass = FindFirstCharClass(root); + if (charClass is not null) { - results.Add((null, first.Value.CharClass, 0, first.Value.CaseInsensitive)); + results.Add((null, charClass, 0)); } if (results.Count == 0) @@ -238,28 +237,17 @@ static bool Process(RegexNode node, ref ValueStringBuilder vsb) } } - // For every entry, see if we can mark any that are case-insensitive as actually being case-sensitive - // based on not participating in case conversion. And then for ones that are case-sensitive, try to - // get the chars that make up the set, if there are few enough. + // For every entry, try to get the chars that make up the set, if there are few enough. Span scratch = stackalloc char[5]; // max optimized by IndexOfAny today for (int i = 0; i < results.Count; i++) { - (char[]? Chars, string Set, int Distance, bool CaseInsensitive) result = results[i]; + (char[]? Chars, string Set, int Distance) result = results[i]; if (!RegexCharClass.IsNegated(result.Set)) { int count = RegexCharClass.GetSetChars(result.Set, scratch); if (count != 0) { - if (result.CaseInsensitive && !RegexCharClass.ParticipatesInCaseConversion(scratch.Slice(0, count))) - { - result.CaseInsensitive = false; - } - - if (!result.CaseInsensitive) - { - result.Chars = scratch.Slice(0, count).ToArray(); - } - + result.Chars = scratch.Slice(0, count).ToArray(); results[i] = result; } } @@ -269,12 +257,6 @@ static bool Process(RegexNode node, ref ValueStringBuilder vsb) // for the fastest and that have the best chance of matching as few false positives as possible. results.Sort((s1, s2) => { - if (s1.CaseInsensitive != s2.CaseInsensitive) - { - // If their case-sensitivities don't match, whichever is case-sensitive comes first / is considered lower. - return s1.CaseInsensitive ? 1 : -1; - } - if (s1.Chars is not null && s2.Chars is not null) { // Then of the ones that are the same length, prefer those with less frequent values. The frequency is @@ -322,7 +304,7 @@ static float SumFrequencies(char[] chars) // of the node. If it returns false, the node isn't entirely fixed, in which case subsequent nodes // shouldn't be examined and distance should no longer be trusted. However, regardless of whether it // returns true or false, it may have populated results, and all populated results are valid. - static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)> results, ref int distance, CultureInfo culture, bool thorough) + static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, int Distance)> results, ref int distance, bool thorough) { if (!StackHelper.TryEnsureSufficientExecutionStack()) { @@ -334,27 +316,25 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in return false; } - bool caseInsensitive = (node.Options & RegexOptions.IgnoreCase) != 0; - switch (node.Kind) { case RegexNodeKind.One: if (results.Count < MaxFixedResults) { - string setString = RegexCharClass.OneToStringClass(node.Ch, caseInsensitive ? culture : null, out bool resultIsCaseInsensitive); - results.Add((null, setString, distance++, resultIsCaseInsensitive)); + string setString = RegexCharClass.OneToStringClass(node.Ch); + results.Add((null, setString, distance++)); return true; } return false; case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when node.M > 0: { - string setString = RegexCharClass.OneToStringClass(node.Ch, caseInsensitive ? culture : null, out bool resultIsCaseInsensitive); + string setString = RegexCharClass.OneToStringClass(node.Ch); int minIterations = Math.Min(node.M, MaxLoopExpansion); int i = 0; for (; i < minIterations && results.Count < MaxFixedResults; i++) { - results.Add((null, setString, distance++, resultIsCaseInsensitive)); + results.Add((null, setString, distance++)); } return i == node.M && i == node.N; } @@ -365,8 +345,8 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in int i = 0; for (; i < s.Length && results.Count < MaxFixedResults; i++) { - string setString = RegexCharClass.OneToStringClass(s[i], caseInsensitive ? culture : null, out bool resultIsCaseInsensitive); - results.Add((null, setString, distance++, resultIsCaseInsensitive)); + string setString = RegexCharClass.OneToStringClass(s[i]); + results.Add((null, setString, distance++)); } return i == s.Length; } @@ -374,7 +354,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in case RegexNodeKind.Set: if (results.Count < MaxFixedResults) { - results.Add((null, node.Str!, distance++, caseInsensitive)); + results.Add((null, node.Str!, distance++)); return true; } return false; @@ -385,7 +365,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in int i = 0; for (; i < minIterations && results.Count < MaxFixedResults; i++) { - results.Add((null, node.Str!, distance++, caseInsensitive)); + results.Add((null, node.Str!, distance++)); } return i == node.M && i == node.N; } @@ -422,7 +402,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in case RegexNodeKind.Atomic: case RegexNodeKind.Group: case RegexNodeKind.Capture: - return TryFindFixedSets(node.Child(0), results, ref distance, culture, thorough); + return TryFindFixedSets(node.Child(0), results, ref distance, thorough); case RegexNodeKind.Lazyloop or RegexNodeKind.Loop when node.M > 0: // This effectively only iterates the loop once. If deemed valuable, @@ -431,7 +411,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in // summed distance for all node.M iterations. If node.M == node.N, // this would then also allow continued evaluation of the rest of the // expression after the loop. - TryFindFixedSets(node.Child(0), results, ref distance, culture, thorough); + TryFindFixedSets(node.Child(0), results, ref distance, thorough); return false; case RegexNodeKind.Concatenate: @@ -439,7 +419,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in int childCount = node.ChildCount(); for (int i = 0; i < childCount; i++) { - if (!TryFindFixedSets(node.Child(i), results, ref distance, culture, thorough)) + if (!TryFindFixedSets(node.Child(i), results, ref distance, thorough)) { return false; } @@ -452,14 +432,14 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in int childCount = node.ChildCount(); bool allSameSize = true; int? sameDistance = null; - var combined = new Dictionary(); + var combined = new Dictionary(); - var localResults = new List<(char[]? Chars, string Set, int Distance, bool CaseInsensitive)>(); + var localResults = new List<(char[]? Chars, string Set, int Distance)>(); for (int i = 0; i < childCount; i++) { localResults.Clear(); int localDistance = 0; - allSameSize &= TryFindFixedSets(node.Child(i), localResults, ref localDistance, culture, thorough); + allSameSize &= TryFindFixedSets(node.Child(i), localResults, ref localDistance, thorough); if (localResults.Count == 0) { @@ -478,12 +458,11 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in } } - foreach ((char[]? Chars, string Set, int Distance, bool CaseInsensitive) fixedSet in localResults) + foreach ((char[]? Chars, string Set, int Distance) fixedSet in localResults) { - if (combined.TryGetValue(fixedSet.Distance, out (RegexCharClass Set, bool CaseInsensitive, int Count) value)) + if (combined.TryGetValue(fixedSet.Distance, out (RegexCharClass Set, int Count) value)) { - if (fixedSet.CaseInsensitive == value.CaseInsensitive && - value.Set.TryAddCharClass(RegexCharClass.Parse(fixedSet.Set))) + if (value.Set.TryAddCharClass(RegexCharClass.Parse(fixedSet.Set))) { value.Count++; combined[fixedSet.Distance] = value; @@ -491,12 +470,12 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in } else { - combined[fixedSet.Distance] = (RegexCharClass.Parse(fixedSet.Set), fixedSet.CaseInsensitive, 1); + combined[fixedSet.Distance] = (RegexCharClass.Parse(fixedSet.Set), 1); } } } - foreach (KeyValuePair pair in combined) + foreach (KeyValuePair pair in combined) { if (results.Count >= MaxFixedResults) { @@ -506,7 +485,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in if (pair.Value.Count == childCount) { - results.Add((null, pair.Value.Set.ToStringClass(), pair.Key + distance, pair.Value.CaseInsensitive)); + results.Add((null, pair.Value.Set.ToStringClass(), pair.Key + distance)); } } @@ -533,7 +512,7 @@ static bool TryFindFixedSets(RegexNode node, List<(char[]? Chars, string Set, in /// variable position, but this will find [ab] as it's instead looking for anything that under any /// circumstance could possibly start a match. /// - public static (string CharClass, bool CaseInsensitive)? FindFirstCharClass(RegexNode root, CultureInfo culture) + public static string? FindFirstCharClass(RegexNode root) { var s = new RegexPrefixAnalyzer(stackalloc int[StackBufferSize]); RegexFC? fc = s.RegexFCFromRegexTree(root); @@ -544,12 +523,7 @@ public static (string CharClass, bool CaseInsensitive)? FindFirstCharClass(Regex return null; } - if (fc.CaseInsensitive) - { - fc.AddLowercase(culture); - } - - return (fc.GetFirstChars(), fc.CaseInsensitive); + return fc.GetFirstChars(); } /// @@ -602,35 +576,31 @@ public static (RegexNode LoopNode, (char Char, string? String, char[]? Chars) Li } // If the subsequent node is a literal, we need to ensure it doesn't overlap with the prior set. - // For simplicity, we also want to ensure they're both case-sensitive. If there's no overlap - // and they're both case-sensitive, we have a winner. - if (((firstChild.Options | nextChild.Options) & RegexOptions.IgnoreCase) == 0) + // If there's no overlap, we have a winner. + switch (nextChild.Kind) { - switch (nextChild.Kind) - { - case RegexNodeKind.One when !RegexCharClass.CharInClass(nextChild.Ch, firstChild.Str!): - return (firstChild, (nextChild.Ch, null, null)); + case RegexNodeKind.One when !RegexCharClass.CharInClass(nextChild.Ch, firstChild.Str!): + return (firstChild, (nextChild.Ch, null, null)); - case RegexNodeKind.Multi when !RegexCharClass.CharInClass(nextChild.Str![0], firstChild.Str!): - return (firstChild, ('\0', nextChild.Str, null)); + case RegexNodeKind.Multi when !RegexCharClass.CharInClass(nextChild.Str![0], firstChild.Str!): + return (firstChild, ('\0', nextChild.Str, null)); - case RegexNodeKind.Set when !RegexCharClass.IsNegated(nextChild.Str!): - Span chars = stackalloc char[5]; // maximum number of chars optimized by IndexOfAny - chars = chars.Slice(0, RegexCharClass.GetSetChars(nextChild.Str!, chars)); - if (!chars.IsEmpty) + case RegexNodeKind.Set when !RegexCharClass.IsNegated(nextChild.Str!): + Span chars = stackalloc char[5]; // maximum number of chars optimized by IndexOfAny + chars = chars.Slice(0, RegexCharClass.GetSetChars(nextChild.Str!, chars)); + if (!chars.IsEmpty) + { + foreach (char c in chars) { - foreach (char c in chars) + if (RegexCharClass.CharInClass(c, firstChild.Str!)) { - if (RegexCharClass.CharInClass(c, firstChild.Str!)) - { - return null; - } + return null; } - - return (firstChild, ('\0', null, chars.ToArray())); } - break; - } + + return (firstChild, ('\0', null, chars.ToArray())); + } + break; } // Otherwise, we couldn't find the pattern of an atomic set loop followed by a literal. @@ -848,7 +818,6 @@ private RegexFC PopFC() /// private void CalculateFC(RegexNodeKind nodeType, RegexNode node, int CurIndex) { - bool ci = (node.Options & RegexOptions.IgnoreCase) != 0; bool rtl = (node.Options & RegexOptions.RightToLeft) != 0; switch (nodeType) @@ -929,42 +898,42 @@ private void CalculateFC(RegexNodeKind nodeType, RegexNode node, int CurIndex) case RegexNodeKind.One: case RegexNodeKind.Notone: - PushFC(new RegexFC(node.Ch, nodeType == RegexNodeKind.Notone, false, ci)); + PushFC(new RegexFC(node.Ch, nodeType == RegexNodeKind.Notone, false)); break; case RegexNodeKind.Oneloop: case RegexNodeKind.Oneloopatomic: case RegexNodeKind.Onelazy: - PushFC(new RegexFC(node.Ch, false, node.M == 0, ci)); + PushFC(new RegexFC(node.Ch, false, node.M == 0)); break; case RegexNodeKind.Notoneloop: case RegexNodeKind.Notoneloopatomic: case RegexNodeKind.Notonelazy: - PushFC(new RegexFC(node.Ch, true, node.M == 0, ci)); + PushFC(new RegexFC(node.Ch, true, node.M == 0)); break; case RegexNodeKind.Multi: if (node.Str!.Length == 0) PushFC(new RegexFC(true)); else if (!rtl) - PushFC(new RegexFC(node.Str[0], false, false, ci)); + PushFC(new RegexFC(node.Str[0], false, false)); else - PushFC(new RegexFC(node.Str[node.Str.Length - 1], false, false, ci)); + PushFC(new RegexFC(node.Str[node.Str.Length - 1], false, false)); break; case RegexNodeKind.Set: - PushFC(new RegexFC(node.Str!, false, ci)); + PushFC(new RegexFC(node.Str!, false)); break; case RegexNodeKind.Setloop: case RegexNodeKind.Setloopatomic: case RegexNodeKind.Setlazy: - PushFC(new RegexFC(node.Str!, node.M == 0, ci)); + PushFC(new RegexFC(node.Str!, node.M == 0)); break; case RegexNodeKind.Backreference: - PushFC(new RegexFC(RegexCharClass.AnyClass, true, false)); + PushFC(new RegexFC(RegexCharClass.AnyClass, true)); break; case RegexNodeKind.Nothing: @@ -1078,7 +1047,7 @@ public RegexFC(bool nullable) _nullable = nullable; } - public RegexFC(char ch, bool not, bool nullable, bool caseInsensitive) + public RegexFC(char ch, bool not, bool nullable) { _cc = new RegexCharClass(); @@ -1099,16 +1068,14 @@ public RegexFC(char ch, bool not, bool nullable, bool caseInsensitive) _cc.AddRange(ch, ch); } - CaseInsensitive = caseInsensitive; _nullable = nullable; } - public RegexFC(string charClass, bool nullable, bool caseInsensitive) + public RegexFC(string charClass, bool nullable) { _cc = RegexCharClass.Parse(charClass); _nullable = nullable; - CaseInsensitive = caseInsensitive; } public bool AddFC(RegexFC fc, bool concatenate) @@ -1132,19 +1099,10 @@ public bool AddFC(RegexFC fc, bool concatenate) _nullable = true; } - CaseInsensitive |= fc.CaseInsensitive; _cc.AddCharClass(fc._cc); return true; } - public bool CaseInsensitive { get; private set; } - - public void AddLowercase(CultureInfo culture) - { - Debug.Assert(CaseInsensitive); - _cc.AddLowercase(culture); - } - public string GetFirstChars() => _cc.ToStringClass(); } } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexTree.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexTree.cs index 8e7ada11b4926..4ee944e47f91a 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexTree.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexTree.cs @@ -21,6 +21,8 @@ internal sealed class RegexTree public readonly RegexFindOptimizations FindOptimizations; /// The number of captures in the regex. public readonly int CaptureCount; + /// If the pattern has backreferences and uses IgnoreCase, we cache the Culture at creation time to use it at match time. + public readonly CultureInfo? Culture; /// A list of all the captures' names. /// /// For numbered (implicitly or explicitly) captures, these are string representations of the numbers. This may be null if all captures were numbered @@ -38,7 +40,7 @@ internal sealed class RegexTree /// public readonly Hashtable? CaptureNumberSparseMapping; - internal RegexTree(RegexNode root, int captureCount, string[]? captureNames, Hashtable? captureNameToNumberMapping, Hashtable? captureNumberSparseMapping, RegexOptions options, CultureInfo culture) + internal RegexTree(RegexNode root, int captureCount, string[]? captureNames, Hashtable? captureNameToNumberMapping, Hashtable? captureNumberSparseMapping, RegexOptions options, CultureInfo? culture) { #if DEBUG // Asserts to both demonstrate and validate the relationships between the various capture data structures. @@ -69,12 +71,13 @@ internal RegexTree(RegexNode root, int captureCount, string[]? captureNames, Has #endif Root = root; + Culture = culture; CaptureNumberSparseMapping = captureNumberSparseMapping; CaptureCount = captureCount; CaptureNameToNumberMapping = captureNameToNumberMapping; CaptureNames = captureNames; Options = options; - FindOptimizations = new RegexFindOptimizations(root, options, culture); + FindOptimizations = new RegexFindOptimizations(root, options); } } } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexWriter.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexWriter.cs index 4dcbcbc33b940..a3c372b9a9bb5 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexWriter.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexWriter.cs @@ -21,7 +21,6 @@ internal ref struct RegexWriter private const int IntStackSize = 32; private readonly RegexTree _tree; - private readonly CultureInfo _culture; private readonly Dictionary _stringTable; private ValueListBuilder _emitted; private ValueListBuilder _intStack; @@ -35,10 +34,9 @@ static RegexWriter() } #endif - private RegexWriter(RegexTree tree, CultureInfo culture, Span emittedSpan, Span intStackSpan) + private RegexWriter(RegexTree tree, Span emittedSpan, Span intStackSpan) { _tree = tree; - _culture = culture; _emitted = new ValueListBuilder(emittedSpan); _intStack = new ValueListBuilder(intStackSpan); _stringTable = new Dictionary(); @@ -58,9 +56,9 @@ public void Dispose() /// This is the only function that should be called from outside. /// It takes a and creates a corresponding . /// - public static RegexInterpreterCode Write(RegexTree tree, CultureInfo culture) + public static RegexInterpreterCode Write(RegexTree tree) { - using var writer = new RegexWriter(tree, culture, stackalloc int[EmittedSize], stackalloc int[IntStackSize]); + using var writer = new RegexWriter(tree, stackalloc int[EmittedSize], stackalloc int[IntStackSize]); return writer.EmitCode(); } diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVector64Algebra.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVector64Algebra.cs index 4245fece934c2..108ef1be69dee 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVector64Algebra.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVector64Algebra.cs @@ -57,11 +57,7 @@ public ulong Or(ReadOnlySpan predicates) public ulong Or(ulong predicate1, ulong predicate2) => predicate1 | predicate2; - public ulong CharConstraint(char c, bool caseInsensitive = false, string? culture = null) - { - Debug.Assert(!caseInsensitive); - return ((ulong)1) << _classifier.GetMintermID(c); - } + public ulong CharConstraint(char c) => ((ulong)1) << _classifier.GetMintermID(c); /// /// Assumes that set is a union of some minterms (or empty). diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVectorAlgebra.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVectorAlgebra.cs index db243a521bae1..86e80fe59c485 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVectorAlgebra.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/BitVectorAlgebra.cs @@ -49,12 +49,7 @@ public BitVectorAlgebra(BDD[] minterms) public BitVector Or(BitVector predicate1, BitVector predicate2) => BitVector.Or(predicate1, predicate2); - public BitVector CharConstraint(char c, bool caseInsensitive = false, string? culture = null) - { - Debug.Assert(!caseInsensitive); - int i = _classifier.GetMintermID(c); - return _mintermVectors[i]; - } + public BitVector CharConstraint(char c) => _mintermVectors[_classifier.GetMintermID(c)]; /// /// Assumes that set is a union of some minterms (or empty). diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/CharSetSolver.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/CharSetSolver.cs index 80e0932c79915..d31345c343258 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/CharSetSolver.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/CharSetSolver.cs @@ -16,7 +16,6 @@ internal sealed class CharSetSolver : BDDAlgebra, ICharAlgebra { /// BDDs for all ASCII characters for fast lookup. private readonly BDD[] _charPredTable = new BDD[128]; - private readonly IgnoreCaseTransformer _ignoreCase; internal readonly BDD _nonAscii; /// Initialize the solver. @@ -24,7 +23,6 @@ internal sealed class CharSetSolver : BDDAlgebra, ICharAlgebra private CharSetSolver() { _nonAscii = CreateCharSetFromRange('\x80', '\uFFFF'); - _ignoreCase = new IgnoreCaseTransformer(this); // do this last in ctor, as IgnoreCaseTransform's ctor uses `this` } /// Singleton instance of . @@ -33,20 +31,13 @@ private CharSetSolver() /// /// Make a character predicate for the given character c. /// - public BDD CharConstraint(char c, bool ignoreCase = false, string? culture = null) + public BDD CharConstraint(char c) { - if (ignoreCase) - { - return _ignoreCase.Apply(c, culture); - } - else - { - // individual character BDDs are always fixed - BDD[] charPredTable = _charPredTable; - return c < charPredTable.Length ? - charPredTable[c] ??= CreateBDDFromChar(c) : - CreateBDDFromChar(c); - } + // individual character BDDs are always fixed + BDD[] charPredTable = _charPredTable; + return c < charPredTable.Length ? + charPredTable[c] ??= CreateBDDFromChar(c) : + CreateBDDFromChar(c); } private BDD CreateBDDFromChar(ushort c) @@ -69,22 +60,15 @@ public BDD CreateCharSetFromRange(char m, char n) => /// /// Make a character set of all the characters in the interval from c to d. - /// If ignoreCase is true ignore cases for upper and lower case characters by including both versions. /// - public BDD RangeConstraint(char c, char d, bool ignoreCase = false, string? culture = null) + public BDD RangeConstraint(char c, char d) { if (c == d) { - return CharConstraint(c, ignoreCase, culture); - } - - BDD res = CreateSetFromRange(c, d, 15); - if (ignoreCase) - { - res = _ignoreCase.Apply(res, culture); + return CharConstraint(c); } - return res; + return CreateSetFromRange(c, d, 15); } #if DEBUG diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/ICharAlgebra.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/ICharAlgebra.cs index 9235d6d99acf6..dd128d5eb07a9 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/ICharAlgebra.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/ICharAlgebra.cs @@ -10,13 +10,10 @@ namespace System.Text.RegularExpressions.Symbolic internal interface ICharAlgebra : IBooleanAlgebra { /// - /// Make a constraint describing a singleton set containing the character c, or - /// a set containing also the upper and lowercase versions of c if caseInsensitive is true. + /// Make a constraint describing a singleton set containing the character c. /// - /// if true include both the uppercase and the lowercase versions of the given character /// the given character - /// given culture, if null then the current culture is assumed - T CharConstraint(char c, bool caseInsensitive = false, string? culture = null); + T CharConstraint(char c); /// /// Make a term that encodes the given character set. diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/RegexNodeConverter.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/RegexNodeConverter.cs index a2571f10b71ad..574e1fa6755ed 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/RegexNodeConverter.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/RegexNodeConverter.cs @@ -53,10 +53,10 @@ public SymbolicRegexNode ConvertToSymbolicRegexNode(RegexNode node, bool tr // Singletons and multis case RegexNodeKind.One: - return _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(node.Ch, (node.Options & RegexOptions.IgnoreCase) != 0, _culture.Name)); + return _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(node.Ch)); case RegexNodeKind.Notone: - return _builder.CreateSingleton(CharSetSolver.Instance.Not(CharSetSolver.Instance.CharConstraint(node.Ch, (node.Options & RegexOptions.IgnoreCase) != 0, _culture.Name))); + return _builder.CreateSingleton(CharSetSolver.Instance.Not(CharSetSolver.Instance.CharConstraint(node.Ch))); case RegexNodeKind.Set: return ConvertSet(node); @@ -70,7 +70,7 @@ public SymbolicRegexNode ConvertToSymbolicRegexNode(RegexNode node, bool tr var nodes = new SymbolicRegexNode[str.Length]; for (int i = 0; i < nodes.Length; i++) { - nodes[i] = _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(str[i], ignoreCase, _culture.Name)); + nodes[i] = _builder.CreateSingleton(CharSetSolver.Instance.CharConstraint(str[i])); } return _builder.CreateConcat(nodes, tryCreateFixedLengthMarker); } @@ -108,7 +108,7 @@ public SymbolicRegexNode ConvertToSymbolicRegexNode(RegexNode node, bool tr { // Create a BDD that represents the character, then create a loop around it. bool ignoreCase = (node.Options & RegexOptions.IgnoreCase) != 0; - BDD bdd = CharSetSolver.Instance.CharConstraint(node.Ch, ignoreCase, _culture.Name); + BDD bdd = CharSetSolver.Instance.CharConstraint(node.Ch); if (node.IsNotoneFamily) { bdd = CharSetSolver.Instance.Not(bdd); @@ -323,7 +323,7 @@ BDD Compute(bool ignoreCase, string set) { foreach ((char first, char last) in ranges) { - BDD bdd = CharSetSolver.Instance.RangeConstraint(first, last, ignoreCase, _culture.Name); + BDD bdd = CharSetSolver.Instance.RangeConstraint(first, last); if (negate) { bdd = CharSetSolver.Instance.Not(bdd); diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/GeneratorHelper.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/GeneratorHelper.cs deleted file mode 100644 index 5900e44a29738..0000000000000 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/GeneratorHelper.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Diagnostics.CodeAnalysis; -using System.IO; - -namespace System.Text.RegularExpressions.Symbolic.Unicode -{ -#if DEBUG - [ExcludeFromCodeCoverage] - internal static class GeneratorHelper - { - public static void WriteInt64ArrayInitSyntax(StreamWriter sw, long[] values) - { - sw.Write("new long[] {"); - for (int i = 0; i < values.Length; i++) - { - sw.Write($" 0x{values[i]:X}, "); - } - sw.Write("}"); - } - - public static void WriteByteArrayInitSyntax(StreamWriter sw, byte[] values) - { - sw.Write("new byte[] {"); - for (int i = 0; i < values.Length; i++) - { - sw.Write($" 0x{values[i]:X}, "); - } - sw.Write("}"); - } - } -#endif -} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelation.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelation.cs deleted file mode 100644 index 561c515e05f01..0000000000000 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelation.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -// This is a programmatically generated file from Regex.GenerateUnicodeTables. -// It provides serialized BDD Unicode category definitions for System.Environment.Version = 7.0.0 - -namespace System.Text.RegularExpressions.Symbolic.Unicode -{ - internal static class IgnoreCaseRelation - { - /// Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture. - public static readonly byte[] IgnoreCaseEnUsSerializedBDD = new byte[] { 0x5, 0x5, 0x0, 0x0, 0x0, 0x0, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x18, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x21, 0x0, 0x18, 0x0, 0x0, 0x41, 0x0, 0x8, 0x0, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x2, 0x0, 0x30, 0x0, 0x0, 0xE2, 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0xA2, 0x0, 0x0, 0x0, 0x0, 0xC2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x38, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x48, 0x0, 0x0, 0x22, 0x1, 0x0, 0x0, 0x0, 0x42, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x50, 0x0, 0x0, 0xC2, 0x0, 0x38, 0x0, 0x0, 0x2, 0x0, 0x58, 0x0, 0x0, 0xC2, 0x0, 0x48, 0x0, 0x0, 0x82, 0x1, 0x0, 0x0, 0x0, 0xA3, 0x1, 0x0, 0x0, 0x0, 0xC3, 0x1, 0x0, 0x0, 0x0, 0xE3, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x80, 0x0, 0x0, 0x3, 0x0, 0x88, 0x0, 0x0, 0x3, 0x0, 0x90, 0x0, 0x0, 0x3, 0x0, 0x98, 0x0, 0x0, 0x3, 0x0, 0xA0, 0x0, 0x0, 0x3, 0x0, 0x68, 0x0, 0x0, 0x3, 0x0, 0x70, 0x0, 0x0, 0x3, 0x0, 0x78, 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x0, 0x23, 0x2, 0x0, 0x0, 0x0, 0x43, 0x2, 0x0, 0x0, 0x0, 0x63, 0x2, 0x0, 0x0, 0x0, 0x83, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, 0xA8, 0x0, 0x0, 0xC3, 0x2, 0x0, 0x0, 0x0, 0xE3, 0x1, 0x80, 0x0, 0x0, 0x3, 0x0, 0xB8, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x23, 0x3, 0x0, 0x0, 0x0, 0xE3, 0x2, 0x0, 0x0, 0x0, 0x43, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0xC0, 0x0, 0x0, 0x3, 0x0, 0xC8, 0x0, 0x0, 0x3, 0x0, 0xD0, 0x0, 0x0, 0x63, 0x3, 0x0, 0x0, 0x0, 0xA3, 0x2, 0x0, 0x0, 0x0, 0x3, 0x0, 0xD8, 0x0, 0x0, 0x63, 0x2, 0xA0, 0x0, 0x0, 0x63, 0x2, 0x90, 0x0, 0x0, 0x3, 0x2, 0x78, 0x0, 0x0, 0x3, 0x0, 0xB0, 0x0, 0x0, 0xC3, 0x1, 0x68, 0x0, 0x0, 0x3, 0x0, 0xE0, 0x0, 0x0, 0xA3, 0x3, 0x0, 0x0, 0x0, 0x43, 0x3, 0x80, 0x0, 0x0, 0x3, 0x0, 0xF0, 0x0, 0x0, 0xE4, 0x3, 0x0, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x24, 0x4, 0x0, 0x0, 0x0, 0x44, 0x4, 0x0, 0x0, 0x0, 0x64, 0x4, 0x0, 0x0, 0x0, 0x84, 0x4, 0x0, 0x0, 0x0, 0xA4, 0x4, 0x0, 0x0, 0x0, 0xC4, 0x4, 0x0, 0x0, 0x0, 0xE4, 0x4, 0x0, 0x0, 0x0, 0x4, 0x5, 0x0, 0x0, 0x0, 0x24, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x50, 0x1, 0x0, 0x4, 0x0, 0x58, 0x1, 0x0, 0x4, 0x0, 0x60, 0x1, 0x0, 0x4, 0x0, 0x68, 0x1, 0x0, 0x4, 0x0, 0x70, 0x1, 0x0, 0x4, 0x0, 0xF8, 0x0, 0x0, 0x4, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0, 0x8, 0x1, 0x0, 0x4, 0x0, 0x10, 0x1, 0x0, 0x4, 0x0, 0x18, 0x1, 0x0, 0x4, 0x0, 0x20, 0x1, 0x0, 0x4, 0x0, 0x28, 0x1, 0x0, 0x4, 0x0, 0x30, 0x1, 0x0, 0x4, 0x0, 0x38, 0x1, 0x0, 0x4, 0x0, 0x40, 0x1, 0x0, 0x44, 0x5, 0x0, 0x0, 0x0, 0x64, 0x5, 0x0, 0x0, 0x0, 0x84, 0x5, 0x0, 0x0, 0x0, 0xA4, 0x5, 0x0, 0x0, 0x0, 0xC4, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x48, 0x1, 0x0, 0xE4, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x80, 0x1, 0x0, 0x4, 0x0, 0x88, 0x1, 0x0, 0x4, 0x0, 0x90, 0x1, 0x0, 0x64, 0x6, 0x0, 0x0, 0x0, 0x84, 0x6, 0x0, 0x0, 0x0, 0xA4, 0x6, 0x0, 0x0, 0x0, 0xC4, 0x6, 0x0, 0x0, 0x0, 0xE4, 0x6, 0x0, 0x0, 0x0, 0x4, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0xB0, 0x1, 0x0, 0x4, 0x0, 0xB8, 0x1, 0x0, 0x4, 0x0, 0xC0, 0x1, 0x0, 0x4, 0x0, 0xC8, 0x1, 0x0, 0x44, 0x6, 0x0, 0x0, 0x0, 0x24, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0xD0, 0x1, 0x0, 0x44, 0x7, 0x0, 0x0, 0x0, 0x4, 0x6, 0x0, 0x0, 0x0, 0x4, 0x0, 0x98, 0x1, 0x0, 0x4, 0x0, 0xA0, 0x1, 0x0, 0x4, 0x0, 0xA8, 0x1, 0x0, 0x4, 0x0, 0xD8, 0x1, 0x0, 0x44, 0x5, 0x20, 0x1, 0x0, 0x64, 0x5, 0x28, 0x1, 0x0, 0x84, 0x5, 0x30, 0x1, 0x0, 0xA4, 0x5, 0x38, 0x1, 0x0, 0xC4, 0x5, 0x40, 0x1, 0x0, 0xE4, 0x3, 0x48, 0x1, 0x0, 0x4, 0x0, 0xE0, 0x1, 0x0, 0xA4, 0x7, 0x0, 0x0, 0x0, 0x4, 0x0, 0xF0, 0x1, 0x0, 0x4, 0x0, 0x70, 0x0, 0x0, 0x4, 0x0, 0x78, 0x0, 0x0, 0xC4, 0x1, 0x0, 0x0, 0x0, 0xE4, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0xE8, 0x1, 0x0, 0x4, 0x0, 0x80, 0x0, 0x0, 0x4, 0x0, 0x88, 0x0, 0x0, 0x4, 0x0, 0x90, 0x0, 0x0, 0x4, 0x0, 0x98, 0x0, 0x0, 0x4, 0x0, 0xA0, 0x0, 0x0, 0x4, 0x0, 0x68, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0x0, 0x24, 0x2, 0x0, 0x0, 0x0, 0x44, 0x2, 0x0, 0x0, 0x0, 0x64, 0x2, 0x0, 0x0, 0x0, 0x84, 0x2, 0x0, 0x0, 0x0, 0xA4, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0xF8, 0x1, 0x0, 0x4, 0x0, 0x78, 0x1, 0x0, 0x4, 0x0, 0x0, 0x2, 0x0, 0x24, 0x8, 0x0, 0x0, 0x0, 0x24, 0x6, 0x0, 0x0, 0x0, 0x44, 0x4, 0x50, 0x1, 0x0, 0x44, 0x8, 0x0, 0x0, 0x0, 0x84, 0x7, 0x0, 0x0, 0x0, 0x4, 0x8, 0x0, 0x0, 0x0, 0x24, 0x5, 0x50, 0x1, 0x0, 0x4, 0x0, 0x18, 0x2, 0x0, 0x4, 0x0, 0x20, 0x2, 0x0, 0x4, 0x0, 0x28, 0x2, 0x0, 0x64, 0x7, 0x0, 0x0, 0x0, 0x5, 0x0, 0x30, 0x2, 0x0, 0xC5, 0x8, 0x0, 0x0, 0x0, 0x5, 0x0, 0x38, 0x2, 0x0, 0xE5, 0x8, 0x0, 0x0, 0x0, 0x5, 0x0, 0x40, 0x2, 0x0, 0x5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x48, 0x2, 0x0, 0x25, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x2, 0x0, 0x45, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x58, 0x2, 0x0, 0x65, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x60, 0x2, 0x0, 0x85, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x68, 0x2, 0x0, 0xA5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x70, 0x2, 0x0, 0xC5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x78, 0x2, 0x0, 0xE5, 0x9, 0x0, 0x0, 0x0, 0x5, 0x0, 0x80, 0x2, 0x0, 0x5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0x88, 0x2, 0x0, 0x25, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0x90, 0x2, 0x0, 0x45, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0x98, 0x2, 0x0, 0x65, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xA0, 0x2, 0x0, 0x85, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xA8, 0x2, 0x0, 0xA5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB0, 0x2, 0x0, 0xC5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB8, 0x2, 0x0, 0xE5, 0xA, 0x0, 0x0, 0x0, 0x5, 0x0, 0xC0, 0x2, 0x0, 0x5, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xC8, 0x2, 0x0, 0x25, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xD0, 0x2, 0x0, 0x45, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xD8, 0x2, 0x0, 0x65, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xE0, 0x2, 0x0, 0x85, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xE8, 0x2, 0x0, 0xA5, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xF0, 0x2, 0x0, 0xC5, 0xB, 0x0, 0x0, 0x0, 0x5, 0x0, 0xF8, 0x2, 0x0, 0xE5, 0xB, 0x0, 0x0, 0x0, 0x5, 0xC, 0x0, 0x0, 0x0, 0x25, 0xC, 0x0, 0x0, 0x0, 0x45, 0xC, 0x0, 0x0, 0x0, 0x65, 0xC, 0x0, 0x0, 0x0, 0x85, 0xC, 0x0, 0x0, 0x0, 0xA5, 0xC, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x0, 0x5, 0x0, 0x8, 0x3, 0x0, 0x5, 0x0, 0x10, 0x3, 0x0, 0x5, 0x0, 0x18, 0x3, 0x0, 0x5, 0x0, 0x20, 0x3, 0x0, 0x5, 0x0, 0x28, 0x3, 0x0, 0xC5, 0xC, 0x0, 0x0, 0x0, 0x5, 0x0, 0x38, 0x3, 0x0, 0x5, 0x0, 0x40, 0x3, 0x0, 0x5, 0x0, 0x48, 0x3, 0x0, 0x45, 0xD, 0x0, 0x0, 0x0, 0x65, 0xD, 0x0, 0x0, 0x0, 0x85, 0xD, 0x0, 0x0, 0x0, 0xA5, 0xD, 0x0, 0x0, 0x0, 0xC5, 0xD, 0x0, 0x0, 0x0, 0xE5, 0xD, 0x0, 0x0, 0x0, 0x5, 0xE, 0x0, 0x0, 0x0, 0x25, 0xE, 0x0, 0x0, 0x0, 0x45, 0xE, 0x0, 0x0, 0x0, 0x25, 0xD, 0x0, 0x0, 0x0, 0x65, 0xE, 0x0, 0x0, 0x0, 0x5, 0x0, 0x50, 0x3, 0x0, 0x5, 0x0, 0x58, 0x3, 0x0, 0x5, 0x0, 0x60, 0x3, 0x0, 0x5, 0x0, 0x68, 0x3, 0x0, 0x5, 0x0, 0x70, 0x3, 0x0, 0x5, 0x0, 0xA0, 0x3, 0x0, 0x5, 0x0, 0xA8, 0x3, 0x0, 0x5, 0x0, 0xB0, 0x3, 0x0, 0x5, 0x0, 0x88, 0x3, 0x0, 0x5, 0x0, 0x90, 0x3, 0x0, 0x5, 0x0, 0x98, 0x3, 0x0, 0xE5, 0xE, 0x0, 0x0, 0x0, 0x5, 0xF, 0x0, 0x0, 0x0, 0x25, 0xF, 0x0, 0x0, 0x0, 0x45, 0xF, 0x0, 0x0, 0x0, 0x65, 0xF, 0x0, 0x0, 0x0, 0x5, 0x0, 0x78, 0x3, 0x0, 0x5, 0x0, 0xC8, 0x3, 0x0, 0x5, 0x0, 0xD0, 0x3, 0x0, 0x5, 0x0, 0xD8, 0x3, 0x0, 0x5, 0x0, 0x80, 0x3, 0x0, 0x85, 0xE, 0x0, 0x0, 0x0, 0x85, 0xF, 0x0, 0x0, 0x0, 0xC5, 0xE, 0x0, 0x0, 0x0, 0xA5, 0xE, 0x0, 0x0, 0x0, 0xE5, 0xC, 0x0, 0x0, 0x0, 0x5, 0xD, 0x0, 0x0, 0x0, 0x5, 0xC, 0x88, 0x2, 0x0, 0x25, 0xC, 0x90, 0x2, 0x0, 0x45, 0xC, 0x98, 0x2, 0x0, 0x65, 0xC, 0xA0, 0x2, 0x0, 0x85, 0xC, 0xA8, 0x2, 0x0, 0xC5, 0x8, 0xB0, 0x2, 0x0, 0xE5, 0x8, 0xB8, 0x2, 0x0, 0x5, 0x9, 0xC0, 0x2, 0x0, 0x25, 0x9, 0xC8, 0x2, 0x0, 0x45, 0x9, 0xD0, 0x2, 0x0, 0x65, 0x9, 0xD8, 0x2, 0x0, 0x85, 0x9, 0xE0, 0x2, 0x0, 0xA5, 0x9, 0xE8, 0x2, 0x0, 0xC5, 0x9, 0xF0, 0x2, 0x0, 0xE5, 0x9, 0xF8, 0x2, 0x0, 0x5, 0xA, 0x28, 0x3, 0x0, 0xE5, 0xA, 0x88, 0x2, 0x0, 0x5, 0xB, 0x90, 0x2, 0x0, 0x25, 0xB, 0x98, 0x2, 0x0, 0x45, 0xB, 0xA0, 0x2, 0x0, 0x65, 0xB, 0xA8, 0x2, 0x0, 0x85, 0xB, 0xB0, 0x2, 0x0, 0xA5, 0xB, 0xB8, 0x2, 0x0, 0xC5, 0xB, 0xC0, 0x2, 0x0, 0xE5, 0xB, 0xC8, 0x2, 0x0, 0xA5, 0xC, 0xD0, 0x2, 0x0, 0x5, 0x0, 0xE8, 0x3, 0x0, 0x5, 0x0, 0xF0, 0x3, 0x0, 0x5, 0x0, 0xF8, 0x3, 0x0, 0x5, 0x0, 0x0, 0x4, 0x0, 0x5, 0x0, 0x8, 0x4, 0x0, 0x5, 0x0, 0x10, 0x4, 0x0, 0x5, 0x0, 0x18, 0x4, 0x0, 0x45, 0x5, 0x0, 0x0, 0x0, 0x65, 0x5, 0x0, 0x0, 0x0, 0x85, 0x5, 0x0, 0x0, 0x0, 0xA5, 0x5, 0x0, 0x0, 0x0, 0xC5, 0x5, 0x0, 0x0, 0x0, 0xE5, 0x3, 0x0, 0x0, 0x0, 0x5, 0x4, 0x0, 0x0, 0x0, 0x25, 0x4, 0x0, 0x0, 0x0, 0x45, 0x4, 0x0, 0x0, 0x0, 0x65, 0x4, 0x0, 0x0, 0x0, 0x85, 0x4, 0x0, 0x0, 0x0, 0xA5, 0x4, 0x0, 0x0, 0x0, 0xC5, 0x4, 0x0, 0x0, 0x0, 0xE5, 0x4, 0x0, 0x0, 0x0, 0x5, 0x5, 0x0, 0x0, 0x0, 0x25, 0x5, 0x0, 0x0, 0x0, 0x85, 0x10, 0x0, 0x0, 0x0, 0xA5, 0x10, 0x0, 0x0, 0x0, 0xC5, 0x10, 0x0, 0x0, 0x0, 0xE5, 0x10, 0x0, 0x0, 0x0, 0x5, 0x0, 0x40, 0x4, 0x0, 0x5, 0x0, 0x48, 0x4, 0x0, 0x5, 0x0, 0x50, 0x4, 0x0, 0x5, 0x11, 0x0, 0x0, 0x0, 0x25, 0x11, 0x0, 0x0, 0x0, 0x65, 0x11, 0x0, 0x0, 0x0, 0x85, 0x11, 0x0, 0x0, 0x0, 0xA5, 0x11, 0x0, 0x0, 0x0, 0xC5, 0x11, 0x0, 0x0, 0x0, 0xE5, 0x11, 0x0, 0x0, 0x0, 0x5, 0x12, 0x0, 0x0, 0x0, 0x5, 0x0, 0x88, 0x4, 0x0, 0x5, 0x0, 0x90, 0x4, 0x0, 0x5, 0x0, 0x98, 0x4, 0x0, 0x5, 0x0, 0xA0, 0x4, 0x0, 0x5, 0x0, 0xA8, 0x4, 0x0, 0x5, 0x0, 0xB0, 0x4, 0x0, 0x5, 0x0, 0x58, 0x4, 0x0, 0x5, 0x0, 0x60, 0x4, 0x0, 0x5, 0x0, 0x68, 0x4, 0x0, 0x5, 0x0, 0x70, 0x4, 0x0, 0x5, 0x0, 0x78, 0x4, 0x0, 0x5, 0x0, 0x80, 0x4, 0x0, 0x5, 0x0, 0x30, 0x4, 0x0, 0x5, 0x0, 0x38, 0x4, 0x0, 0x25, 0x12, 0x0, 0x0, 0x0, 0x45, 0x12, 0x0, 0x0, 0x0, 0x65, 0x12, 0x0, 0x0, 0x0, 0x85, 0x12, 0x0, 0x0, 0x0, 0xA5, 0x12, 0x0, 0x0, 0x0, 0xC5, 0x12, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB8, 0x4, 0x0, 0x5, 0x0, 0xE0, 0x3, 0x0, 0x5, 0x0, 0xC0, 0x4, 0x0, 0x5, 0x0, 0xC8, 0x4, 0x0, 0x45, 0x13, 0x0, 0x0, 0x0, 0x65, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, 0xE0, 0x4, 0x0, 0x25, 0xA, 0xB0, 0x2, 0x0, 0x45, 0xA, 0xB8, 0x2, 0x0, 0x65, 0xA, 0xC0, 0x2, 0x0, 0x85, 0xA, 0xD0, 0x2, 0x0, 0xA5, 0x13, 0x0, 0x0, 0x0, 0x5, 0x0, 0xB8, 0x3, 0x0, 0x5, 0x0, 0xC0, 0x3, 0x0, 0x5, 0x0, 0xD8, 0x4, 0x0, 0x5, 0x0, 0x30, 0x3, 0x0, 0x5, 0x0, 0xF0, 0x4, 0x0, 0x5, 0x0, 0xF8, 0x4, 0x0, 0x5, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x8, 0x5, 0x0, 0x5, 0x0, 0x10, 0x5, 0x0, 0x5, 0x0, 0x18, 0x5, 0x0, 0xC5, 0x13, 0x0, 0x0, 0x0, 0x5, 0x14, 0x0, 0x0, 0x0, 0x85, 0x14, 0x0, 0x0, 0x0, 0xA6, 0x14, 0x30, 0x5, 0x0, 0xE6, 0x14, 0x40, 0x5, 0x0, 0x26, 0x15, 0x50, 0x5, 0x0, 0x66, 0x15, 0x60, 0x5, 0x0, 0xA6, 0x15, 0x70, 0x5, 0x0, 0xE6, 0x15, 0x80, 0x5, 0x0, 0x26, 0x16, 0x90, 0x5, 0x0, 0x66, 0x16, 0xA0, 0x5, 0x0, 0xA6, 0x16, 0xB0, 0x5, 0x0, 0xE6, 0x16, 0xC0, 0x5, 0x0, 0x26, 0x17, 0xD0, 0x5, 0x0, 0x66, 0x17, 0xE0, 0x5, 0x0, 0xA6, 0x17, 0xF0, 0x5, 0x0, 0xE6, 0x17, 0x0, 0x6, 0x0, 0x26, 0x18, 0x10, 0x6, 0x0, 0x66, 0x18, 0x20, 0x6, 0x0, 0xA6, 0x18, 0x30, 0x6, 0x0, 0xE6, 0x18, 0x40, 0x6, 0x0, 0x26, 0x19, 0x50, 0x6, 0x0, 0x66, 0x19, 0x60, 0x6, 0x0, 0xA6, 0x19, 0x70, 0x6, 0x0, 0xE6, 0x19, 0x80, 0x6, 0x0, 0x26, 0x1A, 0x90, 0x6, 0x0, 0x66, 0x1A, 0xA0, 0x6, 0x0, 0xA6, 0x1A, 0xB0, 0x6, 0x0, 0xE6, 0x1A, 0xC0, 0x6, 0x0, 0x6, 0x0, 0xC8, 0x6, 0x0, 0x86, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD0, 0x6, 0x0, 0xC6, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD8, 0x6, 0x0, 0x6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE0, 0x6, 0x0, 0x46, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE8, 0x6, 0x0, 0x86, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x30, 0x5, 0x0, 0xC6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x40, 0x5, 0x0, 0x6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x50, 0x5, 0x0, 0x46, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x60, 0x5, 0x0, 0x86, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x70, 0x5, 0x0, 0xC6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x80, 0x5, 0x0, 0x6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x90, 0x5, 0x0, 0x46, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xA0, 0x5, 0x0, 0x86, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xB0, 0x5, 0x0, 0xC6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xC0, 0x5, 0x0, 0x6, 0x1B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD0, 0x5, 0x0, 0xC6, 0x1B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE0, 0x5, 0x0, 0xE6, 0x1B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xF0, 0x5, 0x0, 0x6, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x6, 0x0, 0x26, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x6, 0x0, 0x46, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x20, 0x6, 0x0, 0x66, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x30, 0x6, 0x0, 0xA6, 0x14, 0x0, 0x0, 0x0, 0x6, 0x0, 0x40, 0x6, 0x0, 0xE6, 0x14, 0x0, 0x0, 0x0, 0x6, 0x0, 0x50, 0x6, 0x0, 0x26, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x60, 0x6, 0x0, 0x66, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x70, 0x6, 0x0, 0xA6, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x80, 0x6, 0x0, 0xE6, 0x15, 0x0, 0x0, 0x0, 0x6, 0x0, 0x90, 0x6, 0x0, 0x26, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xA0, 0x6, 0x0, 0x66, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xB0, 0x6, 0x0, 0xA6, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xC0, 0x6, 0x0, 0xE6, 0x16, 0x0, 0x0, 0x0, 0x6, 0x0, 0xF0, 0x6, 0x0, 0x26, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0xF8, 0x6, 0x0, 0x66, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x7, 0x0, 0xA6, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0x8, 0x7, 0x0, 0xE6, 0x17, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x7, 0x0, 0x26, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x18, 0x7, 0x0, 0x66, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x28, 0x5, 0x0, 0xA6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x38, 0x5, 0x0, 0xE6, 0x18, 0x0, 0x0, 0x0, 0x6, 0x0, 0x48, 0x5, 0x0, 0x26, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x58, 0x5, 0x0, 0x66, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x68, 0x5, 0x0, 0xA6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x78, 0x5, 0x0, 0xE6, 0x19, 0x0, 0x0, 0x0, 0x6, 0x0, 0x88, 0x5, 0x0, 0x26, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x98, 0x5, 0x0, 0x66, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xA8, 0x5, 0x0, 0xA6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xB8, 0x5, 0x0, 0xE6, 0x1A, 0x0, 0x0, 0x0, 0x6, 0x0, 0xC8, 0x5, 0x0, 0x86, 0x1C, 0x0, 0x0, 0x0, 0x6, 0x0, 0xD8, 0x5, 0x0, 0x6, 0x0, 0xE8, 0x5, 0x0, 0x6, 0x0, 0xF8, 0x5, 0x0, 0x6, 0x0, 0x8, 0x6, 0x0, 0x6, 0x0, 0x18, 0x6, 0x0, 0x6, 0x0, 0x28, 0x6, 0x0, 0x6, 0x0, 0x38, 0x6, 0x0, 0x6, 0x0, 0x48, 0x6, 0x0, 0x6, 0x0, 0x58, 0x6, 0x0, 0x6, 0x0, 0x68, 0x6, 0x0, 0x6, 0x0, 0x78, 0x6, 0x0, 0x6, 0x0, 0x88, 0x6, 0x0, 0x6, 0x0, 0x98, 0x6, 0x0, 0x6, 0x0, 0xA8, 0x6, 0x0, 0x6, 0x0, 0xB8, 0x6, 0x0, 0x6, 0x0, 0x20, 0x7, 0x0, 0x26, 0x1B, 0x0, 0x0, 0x0, 0x46, 0x1B, 0x0, 0x0, 0x0, 0x66, 0x1B, 0x0, 0x0, 0x0, 0x86, 0x1B, 0x0, 0x0, 0x0, 0xA6, 0x1B, 0x0, 0x0, 0x0, 0xC6, 0x14, 0x0, 0x0, 0x0, 0x6, 0x15, 0x0, 0x0, 0x0, 0x46, 0x15, 0x0, 0x0, 0x0, 0x86, 0x15, 0x0, 0x0, 0x0, 0xC6, 0x15, 0x0, 0x0, 0x0, 0x6, 0x16, 0x0, 0x0, 0x0, 0x46, 0x16, 0x0, 0x0, 0x0, 0x86, 0x16, 0x0, 0x0, 0x0, 0xC6, 0x16, 0x0, 0x0, 0x0, 0x6, 0x17, 0x0, 0x0, 0x0, 0x46, 0x17, 0x0, 0x0, 0x0, 0xA6, 0x1C, 0x0, 0x0, 0x0, 0xC6, 0x1C, 0x0, 0x0, 0x0, 0xE6, 0x1C, 0x0, 0x0, 0x0, 0x26, 0x1A, 0x88, 0x5, 0x0, 0x6, 0x1D, 0x0, 0x0, 0x0, 0x6, 0x0, 0x48, 0x7, 0x0, 0x6, 0x0, 0x50, 0x7, 0x0, 0x6, 0x0, 0x58, 0x7, 0x0, 0x6, 0x0, 0x60, 0x7, 0x0, 0x6, 0x0, 0x68, 0x7, 0x0, 0x6, 0x0, 0x70, 0x7, 0x0, 0x6, 0x0, 0x78, 0x7, 0x0, 0x6, 0x0, 0x80, 0x7, 0x0, 0x6, 0x0, 0x88, 0x7, 0x0, 0x6, 0x0, 0x90, 0x7, 0x0, 0x6, 0x0, 0x98, 0x7, 0x0, 0x6, 0x0, 0xA0, 0x7, 0x0, 0x6, 0x0, 0xA8, 0x7, 0x0, 0x6, 0x0, 0xB0, 0x7, 0x0, 0x6, 0x0, 0xB8, 0x7, 0x0, 0x6, 0x0, 0xC0, 0x7, 0x0, 0x6, 0x0, 0xC8, 0x7, 0x0, 0x6, 0x0, 0xD0, 0x7, 0x0, 0x6, 0x0, 0xD8, 0x7, 0x0, 0x6, 0x0, 0xE0, 0x7, 0x0, 0x6, 0x0, 0xE8, 0x7, 0x0, 0x6, 0x0, 0x40, 0x7, 0x0, 0x6, 0x0, 0xF0, 0x7, 0x0, 0x26, 0x1D, 0x0, 0x0, 0x0, 0xE6, 0x1F, 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, 0x26, 0x20, 0x0, 0x0, 0x0, 0x46, 0x20, 0x0, 0x0, 0x0, 0x66, 0x20, 0x0, 0x0, 0x0, 0xE6, 0x1D, 0x0, 0x0, 0x0, 0x6, 0x1E, 0x0, 0x0, 0x0, 0x26, 0x1E, 0x0, 0x0, 0x0, 0x46, 0x1E, 0x0, 0x0, 0x0, 0x66, 0x1E, 0x0, 0x0, 0x0, 0x86, 0x1E, 0x0, 0x0, 0x0, 0xA6, 0x1E, 0x0, 0x0, 0x0, 0xC6, 0x1E, 0x0, 0x0, 0x0, 0xE6, 0x1E, 0x0, 0x0, 0x0, 0x6, 0x1F, 0x0, 0x0, 0x0, 0x86, 0x20, 0x0, 0x0, 0x0, 0x26, 0x1F, 0x0, 0x0, 0x0, 0x46, 0x1F, 0x0, 0x0, 0x0, 0xA6, 0x20, 0x0, 0x0, 0x0, 0xC6, 0x20, 0x0, 0x0, 0x0, 0xE6, 0x20, 0x0, 0x0, 0x0, 0x6, 0x21, 0x0, 0x0, 0x0, 0x86, 0x1F, 0x0, 0x0, 0x0, 0xA6, 0x1F, 0x0, 0x0, 0x0, 0xC6, 0x1F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x48, 0x8, 0x0, 0x6, 0x0, 0x8, 0x8, 0x0, 0x6, 0x0, 0x10, 0x8, 0x0, 0x6, 0x0, 0x18, 0x8, 0x0, 0x6, 0x0, 0x20, 0x8, 0x0, 0x6, 0x0, 0x28, 0x8, 0x0, 0x6, 0x0, 0x30, 0x8, 0x0, 0x6, 0x0, 0x38, 0x8, 0x0, 0x6, 0x0, 0x40, 0x8, 0x0, 0x26, 0x21, 0x0, 0x0, 0x0, 0x46, 0x21, 0x0, 0x0, 0x0, 0x66, 0x21, 0x0, 0x0, 0x0, 0x6, 0x0, 0x60, 0x8, 0x0, 0xA6, 0x21, 0x0, 0x0, 0x0, 0xC6, 0x21, 0x0, 0x0, 0x0, 0x6, 0x1C, 0xF0, 0x5, 0x0, 0x26, 0x1C, 0x0, 0x6, 0x0, 0x46, 0x1C, 0x10, 0x6, 0x0, 0x66, 0x1C, 0x20, 0x6, 0x0, 0xA6, 0x14, 0x30, 0x6, 0x0, 0xE6, 0x14, 0x40, 0x6, 0x0, 0x26, 0x15, 0x50, 0x6, 0x0, 0x66, 0x15, 0x60, 0x6, 0x0, 0xA6, 0x15, 0x70, 0x6, 0x0, 0xE6, 0x15, 0x80, 0x6, 0x0, 0x26, 0x16, 0x90, 0x6, 0x0, 0x66, 0x16, 0xA0, 0x6, 0x0, 0xA6, 0x16, 0xB0, 0x6, 0x0, 0xE6, 0x16, 0xC0, 0x6, 0x0, 0x26, 0x17, 0xF0, 0x6, 0x0, 0x66, 0x17, 0xF8, 0x6, 0x0, 0xA6, 0x17, 0x0, 0x7, 0x0, 0xE6, 0x17, 0x8, 0x7, 0x0, 0x26, 0x18, 0x10, 0x7, 0x0, 0x66, 0x18, 0x18, 0x7, 0x0, 0xA6, 0x18, 0x28, 0x5, 0x0, 0xE6, 0x18, 0x38, 0x5, 0x0, 0x26, 0x19, 0x48, 0x5, 0x0, 0x66, 0x19, 0x58, 0x5, 0x0, 0xA6, 0x19, 0x68, 0x5, 0x0, 0xE6, 0x19, 0x78, 0x5, 0x0, 0x66, 0x1A, 0x98, 0x5, 0x0, 0xA6, 0x1A, 0xA8, 0x5, 0x0, 0xE6, 0x1A, 0xB8, 0x5, 0x0, 0x86, 0x1C, 0xC8, 0x5, 0x0, 0x6, 0x0, 0x78, 0x8, 0x0, 0x6, 0x0, 0x80, 0x8, 0x0, 0x6, 0x0, 0x88, 0x8, 0x0, 0x6, 0x0, 0x90, 0x8, 0x0, 0x6, 0x0, 0x98, 0x8, 0x0, 0x6, 0x0, 0xA0, 0x8, 0x0, 0x6, 0x0, 0xA8, 0x8, 0x0, 0x6, 0x0, 0xB0, 0x8, 0x0, 0x6, 0x0, 0xB8, 0x8, 0x0, 0x6, 0x0, 0xC0, 0x8, 0x0, 0x6, 0x0, 0xC8, 0x8, 0x0, 0x6, 0x0, 0xD0, 0x8, 0x0, 0x6, 0x0, 0xD8, 0x8, 0x0, 0x6, 0x0, 0xE0, 0x8, 0x0, 0x6, 0x0, 0xE8, 0x8, 0x0, 0x6, 0x0, 0xF0, 0x8, 0x0, 0xE6, 0x23, 0x0, 0x0, 0x0, 0x6, 0x24, 0x0, 0x0, 0x0, 0x26, 0x24, 0x0, 0x0, 0x0, 0x46, 0x24, 0x0, 0x0, 0x0, 0x66, 0x24, 0x0, 0x0, 0x0, 0x86, 0x24, 0x0, 0x0, 0x0, 0xA6, 0x24, 0x0, 0x0, 0x0, 0xC6, 0x24, 0x0, 0x0, 0x0, 0xE6, 0x24, 0x0, 0x0, 0x0, 0x6, 0x25, 0x0, 0x0, 0x0, 0x26, 0x25, 0x0, 0x0, 0x0, 0x46, 0x25, 0x0, 0x0, 0x0, 0x66, 0x25, 0x0, 0x0, 0x0, 0x86, 0x25, 0x0, 0x0, 0x0, 0xA6, 0x25, 0x0, 0x0, 0x0, 0xC6, 0x25, 0x0, 0x0, 0x0, 0xE6, 0x14, 0xC8, 0x6, 0x0, 0x26, 0x15, 0xD0, 0x6, 0x0, 0x66, 0x15, 0xD8, 0x6, 0x0, 0xA6, 0x15, 0xE0, 0x6, 0x0, 0xE6, 0x15, 0xE8, 0x6, 0x0, 0x26, 0x16, 0x30, 0x5, 0x0, 0x66, 0x16, 0x40, 0x5, 0x0, 0xA6, 0x16, 0x50, 0x5, 0x0, 0xE6, 0x16, 0x60, 0x5, 0x0, 0x26, 0x17, 0x70, 0x5, 0x0, 0x6, 0x0, 0x78, 0x9, 0x0, 0x6, 0x26, 0x0, 0x0, 0x0, 0x26, 0x26, 0x0, 0x0, 0x0, 0x46, 0x26, 0x0, 0x0, 0x0, 0x66, 0x26, 0x0, 0x0, 0x0, 0x86, 0x26, 0x0, 0x0, 0x0, 0xA6, 0x26, 0x0, 0x0, 0x0, 0xC6, 0x26, 0x0, 0x0, 0x0, 0xE6, 0x26, 0x0, 0x0, 0x0, 0x6, 0x27, 0x0, 0x0, 0x0, 0x26, 0x27, 0x0, 0x0, 0x0, 0x46, 0x27, 0x0, 0x0, 0x0, 0x66, 0x27, 0x0, 0x0, 0x0, 0x86, 0x27, 0x0, 0x0, 0x0, 0xA6, 0x27, 0x0, 0x0, 0x0, 0xC6, 0x27, 0x0, 0x0, 0x0, 0xE6, 0x27, 0x0, 0x0, 0x0, 0xA6, 0x17, 0xB0, 0x5, 0x0, 0x66, 0xB, 0x0, 0x0, 0x0, 0xA6, 0xA, 0x0, 0x0, 0x0, 0x6, 0x28, 0x0, 0x0, 0x0, 0x26, 0x28, 0x0, 0x0, 0x0, 0x46, 0x28, 0x0, 0x0, 0x0, 0x66, 0x28, 0x0, 0x0, 0x0, 0x86, 0x28, 0x0, 0x0, 0x0, 0xA6, 0x28, 0x0, 0x0, 0x0, 0xC6, 0x28, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0xA, 0x0, 0x6, 0x0, 0x38, 0xA, 0x0, 0x6, 0x0, 0x40, 0xA, 0x0, 0x6, 0x0, 0x48, 0xA, 0x0, 0x6, 0x0, 0x50, 0xA, 0x0, 0x6, 0x0, 0x58, 0xA, 0x0, 0x6, 0x0, 0x60, 0xA, 0x0, 0x6, 0x0, 0x68, 0xA, 0x0, 0x6, 0x0, 0x70, 0xA, 0x0, 0x6, 0x0, 0x10, 0xA, 0x0, 0x6, 0x0, 0x18, 0xA, 0x0, 0x6, 0x0, 0x78, 0xA, 0x0, 0x6, 0x0, 0x80, 0xA, 0x0, 0x6, 0x0, 0x88, 0xA, 0x0, 0x6, 0x0, 0x90, 0xA, 0x0, 0x6, 0x0, 0x98, 0xA, 0x0, 0x6, 0x0, 0xA0, 0xA, 0x0, 0x6, 0x0, 0x20, 0xA, 0x0, 0x6, 0x0, 0x28, 0xA, 0x0, 0x6, 0x0, 0xA8, 0xA, 0x0, 0x6, 0x0, 0xB0, 0xA, 0x0, 0x6, 0x0, 0xB8, 0xA, 0x0, 0x6, 0x0, 0xC0, 0xA, 0x0, 0x6, 0x0, 0xC8, 0xA, 0x0, 0x6, 0x0, 0xD0, 0xA, 0x0, 0x6, 0x0, 0xD8, 0xA, 0x0, 0x6, 0x0, 0xE0, 0xA, 0x0, 0x26, 0x29, 0x0, 0x0, 0x0, 0x46, 0x29, 0x0, 0x0, 0x0, 0x66, 0x29, 0x0, 0x0, 0x0, 0x86, 0x29, 0x0, 0x0, 0x0, 0xA6, 0x29, 0x0, 0x0, 0x0, 0xC6, 0x29, 0x0, 0x0, 0x0, 0xE6, 0x29, 0x0, 0x0, 0x0, 0x26, 0x2A, 0x0, 0x0, 0x0, 0x66, 0x2A, 0x0, 0x0, 0x0, 0xE6, 0x2A, 0x0, 0x0, 0x0, 0x6, 0x2B, 0x0, 0x0, 0x0, 0x26, 0x2B, 0x0, 0x0, 0x0, 0x46, 0x2B, 0x0, 0x0, 0x0, 0x66, 0x2B, 0x0, 0x0, 0x0, 0x86, 0x2B, 0x0, 0x0, 0x0, 0x6, 0x0, 0xE8, 0xA, 0x0, 0x6, 0x0, 0xF0, 0xA, 0x0, 0x6, 0x0, 0xF8, 0xA, 0x0, 0x6, 0x0, 0x0, 0xB, 0x0, 0x6, 0x0, 0x8, 0xB, 0x0, 0x6, 0x0, 0x10, 0xB, 0x0, 0x46, 0x1D, 0x0, 0x0, 0x0, 0x66, 0x1D, 0x0, 0x0, 0x0, 0x86, 0x1D, 0x0, 0x0, 0x0, 0xA6, 0x1D, 0x0, 0x0, 0x0, 0xC6, 0x1D, 0x0, 0x0, 0x0, 0x86, 0x21, 0x0, 0x0, 0x0, 0xE6, 0x2B, 0x0, 0x0, 0x0, 0x6, 0x2C, 0x0, 0x0, 0x0, 0x26, 0x2C, 0x0, 0x0, 0x0, 0x46, 0x2C, 0x0, 0x0, 0x0, 0xE6, 0x28, 0x0, 0x0, 0x0, 0x6, 0x29, 0x0, 0x0, 0x0, 0xE6, 0x21, 0x0, 0x0, 0x0, 0x6, 0x22, 0x0, 0x0, 0x0, 0x26, 0x22, 0x0, 0x0, 0x0, 0x46, 0x22, 0x0, 0x0, 0x0, 0x66, 0x22, 0x0, 0x0, 0x0, 0x86, 0x22, 0x0, 0x0, 0x0, 0xA6, 0x22, 0x0, 0x0, 0x0, 0xC6, 0x22, 0x0, 0x0, 0x0, 0xE6, 0x22, 0x0, 0x0, 0x0, 0x6, 0x23, 0x0, 0x0, 0x0, 0x26, 0x23, 0x0, 0x0, 0x0, 0x46, 0x23, 0x0, 0x0, 0x0, 0x66, 0x23, 0x0, 0x0, 0x0, 0x86, 0x23, 0x0, 0x0, 0x0, 0xA6, 0x23, 0x0, 0x0, 0x0, 0xC6, 0x23, 0x0, 0x0, 0x0, 0x86, 0x17, 0xC8, 0x6, 0x0, 0xC6, 0x17, 0xD0, 0x6, 0x0, 0x6, 0x18, 0xD8, 0x6, 0x0, 0x46, 0x18, 0xE0, 0x6, 0x0, 0x86, 0x18, 0xE8, 0x6, 0x0, 0xC6, 0x18, 0x30, 0x5, 0x0, 0x6, 0x19, 0x40, 0x5, 0x0, 0x46, 0x19, 0x50, 0x5, 0x0, 0x86, 0x19, 0x60, 0x5, 0x0, 0xC6, 0x19, 0x70, 0x5, 0x0, 0x6, 0x1A, 0x80, 0x5, 0x0, 0x46, 0x1A, 0x90, 0x5, 0x0, 0x86, 0x1A, 0xA0, 0x5, 0x0, 0xC6, 0x1A, 0xB0, 0x5, 0x0, 0x6, 0x1B, 0xC0, 0x5, 0x0, 0x66, 0x2C, 0x0, 0x0, 0x0, 0x86, 0x2C, 0x0, 0x0, 0x0, 0x66, 0x1F, 0x0, 0x0, 0x0, 0xA6, 0x2C, 0x0, 0x0, 0x0, 0xE6, 0x25, 0x0, 0x0, 0x0, 0xC6, 0x2C, 0x0, 0x0, 0x0, 0xE6, 0x1B, 0xD8, 0x5, 0x0, 0x6, 0x1C, 0xE8, 0x5, 0x0, 0x26, 0x1C, 0xF8, 0x5, 0x0, 0x46, 0x1C, 0x8, 0x6, 0x0, 0x66, 0x1C, 0x18, 0x6, 0x0, 0xA6, 0x14, 0x28, 0x6, 0x0, 0xE6, 0x14, 0x38, 0x6, 0x0, 0x26, 0x15, 0x48, 0x6, 0x0, 0x66, 0x15, 0x58, 0x6, 0x0, 0xA6, 0x15, 0x68, 0x6, 0x0, 0xE6, 0x15, 0x78, 0x6, 0x0, 0x26, 0x16, 0x88, 0x6, 0x0, 0x66, 0x16, 0x98, 0x6, 0x0, 0xA6, 0x16, 0xA8, 0x6, 0x0, 0xE6, 0x16, 0xB8, 0x6, 0x0, 0x26, 0x17, 0x20, 0x7, 0x0, 0x86, 0x1C, 0xF0, 0x6, 0x0, 0x6, 0x0, 0x0, 0x3, 0x0, 0x6, 0x0, 0x8, 0x3, 0x0, 0x6, 0x0, 0x10, 0x3, 0x0, 0x6, 0x0, 0x18, 0x3, 0x0, 0x6, 0x0, 0x20, 0x3, 0x0, 0x6, 0x0, 0x30, 0x2, 0x0, 0x6, 0x0, 0x38, 0x2, 0x0, 0x6, 0x0, 0x40, 0x2, 0x0, 0x6, 0x0, 0x48, 0x2, 0x0, 0x6, 0x0, 0x50, 0x2, 0x0, 0x6, 0x0, 0x58, 0x2, 0x0, 0x6, 0x0, 0x60, 0x2, 0x0, 0x6, 0x0, 0x68, 0x2, 0x0, 0x6, 0x0, 0x70, 0x2, 0x0, 0x6, 0x0, 0x78, 0x2, 0x0, 0x6, 0x0, 0x80, 0x2, 0x0, 0xE6, 0x2C, 0x0, 0x0, 0x0, 0x6, 0x2D, 0x0, 0x0, 0x0, 0x46, 0x16, 0x40, 0x2, 0x0, 0x26, 0x2D, 0x0, 0x0, 0x0, 0xA6, 0x17, 0xD8, 0x5, 0x0, 0xE6, 0x17, 0xE8, 0x5, 0x0, 0x6, 0x0, 0x50, 0xB, 0x0, 0x6, 0x0, 0x58, 0xB, 0x0, 0x6, 0x0, 0x60, 0xB, 0x0, 0x6, 0x0, 0x68, 0xB, 0x0, 0x6, 0x0, 0xF8, 0x7, 0x0, 0x86, 0x15, 0xC8, 0x6, 0x0, 0xC6, 0x15, 0x78, 0x5, 0x0, 0xC6, 0x2D, 0x0, 0x0, 0x0, 0x26, 0x1C, 0xE8, 0x5, 0x0, 0xE6, 0x2D, 0x0, 0x0, 0x0, 0x6, 0x2E, 0x0, 0x0, 0x0, 0x26, 0x2E, 0x0, 0x0, 0x0, 0x46, 0x2E, 0x0, 0x0, 0x0, 0x66, 0x2E, 0x0, 0x0, 0x0, 0x86, 0x2E, 0x0, 0x0, 0x0, 0xA6, 0x2E, 0x0, 0x0, 0x0, 0xC6, 0x2E, 0x0, 0x0, 0x0, 0xE6, 0x2E, 0x0, 0x0, 0x0, 0x6, 0x2F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x28, 0x7, 0x0, 0x6, 0x0, 0xC8, 0xB, 0x0, 0x6, 0x0, 0xD0, 0xB, 0x0, 0x6, 0x0, 0x70, 0x8, 0x0, 0x6, 0x0, 0xA0, 0xB, 0x0, 0x6, 0x0, 0x38, 0x7, 0x0, 0x66, 0x2F, 0x0, 0x0, 0x0, 0x86, 0x1C, 0xC8, 0x6, 0x0, 0x6, 0x0, 0xD8, 0xB, 0x0, 0x6, 0x0, 0x0, 0x8, 0x0, 0xE6, 0xA, 0x0, 0x0, 0x0, 0x26, 0xC, 0x0, 0x0, 0x0, 0x46, 0xC, 0x0, 0x0, 0x0, 0x66, 0xC, 0x0, 0x0, 0x0, 0x86, 0xC, 0x0, 0x0, 0x0, 0xC6, 0x8, 0x0, 0x0, 0x0, 0xE6, 0x8, 0x0, 0x0, 0x0, 0x6, 0x9, 0x0, 0x0, 0x0, 0x46, 0x9, 0x0, 0x0, 0x0, 0x66, 0x9, 0x0, 0x0, 0x0, 0x86, 0x9, 0x0, 0x0, 0x0, 0xA6, 0x9, 0x0, 0x0, 0x0, 0xC6, 0x9, 0x0, 0x0, 0x0, 0xE6, 0x9, 0x0, 0x0, 0x0, 0x6, 0xA, 0x0, 0x0, 0x0, 0x26, 0xA, 0x0, 0x0, 0x0, 0x46, 0xA, 0x0, 0x0, 0x0, 0x66, 0xA, 0x0, 0x0, 0x0, 0x86, 0xA, 0x0, 0x0, 0x0, 0xC6, 0xA, 0x0, 0x0, 0x0, 0x6, 0xB, 0x0, 0x0, 0x0, 0x26, 0xB, 0x0, 0x0, 0x0, 0x46, 0xB, 0x0, 0x0, 0x0, 0x86, 0xB, 0x0, 0x0, 0x0, 0xA6, 0xB, 0x0, 0x0, 0x0, 0xC6, 0xB, 0x0, 0x0, 0x0, 0xE6, 0xB, 0x0, 0x0, 0x0, 0xA6, 0xC, 0x0, 0x0, 0x0, 0x26, 0x9, 0x0, 0x0, 0x0, 0x7, 0x0, 0xE0, 0xB, 0x0, 0x7, 0x0, 0xE8, 0xB, 0x0, 0x7, 0x0, 0xF0, 0xB, 0x0, 0x7, 0x0, 0xF8, 0xB, 0x0, 0x7, 0x0, 0x0, 0xC, 0x0, 0x7, 0x0, 0x8, 0xC, 0x0, 0x7, 0x0, 0x10, 0xC, 0x0, 0x7, 0x0, 0x18, 0xC, 0x0, 0x7, 0x0, 0x20, 0xC, 0x0, 0x7, 0x0, 0x28, 0xC, 0x0, 0x7, 0x0, 0x30, 0xC, 0x0, 0x7, 0x0, 0x38, 0xC, 0x0, 0x7, 0x0, 0x40, 0xC, 0x0, 0x7, 0x0, 0x48, 0xC, 0x0, 0x7, 0x0, 0x50, 0xC, 0x0, 0x7, 0x0, 0x58, 0xC, 0x0, 0x7, 0x0, 0x60, 0xC, 0x0, 0x7, 0x0, 0x68, 0xC, 0x0, 0x7, 0x0, 0x70, 0xC, 0x0, 0x7, 0x0, 0x78, 0xC, 0x0, 0x7, 0x0, 0x80, 0xC, 0x0, 0x7, 0x0, 0x88, 0xC, 0x0, 0x7, 0x0, 0x90, 0xC, 0x0, 0x7, 0x0, 0x98, 0xC, 0x0, 0x7, 0x0, 0xA0, 0xC, 0x0, 0x7, 0x0, 0xA8, 0xC, 0x0, 0xC7, 0x32, 0x0, 0x0, 0x0, 0xE7, 0x32, 0x0, 0x0, 0x0, 0x7, 0x33, 0x0, 0x0, 0x0, 0x27, 0x33, 0x0, 0x0, 0x0, 0x47, 0x33, 0x0, 0x0, 0x0, 0x67, 0x33, 0x0, 0x0, 0x0, 0x87, 0x33, 0x0, 0x0, 0x0, 0xA7, 0x33, 0x0, 0x0, 0x0, 0xC7, 0x33, 0x0, 0x0, 0x0, 0xE7, 0x33, 0x0, 0x0, 0x0, 0x7, 0x34, 0x0, 0x0, 0x0, 0x27, 0x34, 0x0, 0x0, 0x0, 0x47, 0x34, 0x0, 0x0, 0x0, 0x67, 0x34, 0x0, 0x0, 0x0, 0x87, 0x34, 0x0, 0x0, 0x0, 0xA7, 0x34, 0x0, 0x0, 0x0, 0xC7, 0x34, 0x0, 0x0, 0x0, 0xE7, 0x34, 0x0, 0x0, 0x0, 0x7, 0x35, 0x0, 0x0, 0x0, 0x27, 0x35, 0x0, 0x0, 0x0, 0x47, 0x35, 0x0, 0x0, 0x0, 0x67, 0x35, 0x0, 0x0, 0x0, 0x87, 0x35, 0x0, 0x0, 0x0, 0xA7, 0x35, 0x0, 0x0, 0x0, 0xC7, 0x35, 0x0, 0x0, 0x0, 0xE7, 0x35, 0x0, 0x0, 0x0, 0x7, 0x36, 0x0, 0x0, 0x0, 0x27, 0x36, 0x0, 0x0, 0x0, 0x47, 0x36, 0x0, 0x0, 0x0, 0x67, 0x36, 0x0, 0x0, 0x0, 0x87, 0x36, 0x0, 0x0, 0x0, 0xA7, 0x36, 0x0, 0x0, 0x0, 0xC7, 0x36, 0x0, 0x0, 0x0, 0xE7, 0x36, 0x0, 0x0, 0x0, 0x7, 0x37, 0x0, 0x0, 0x0, 0x27, 0x37, 0x0, 0x0, 0x0, 0x47, 0x37, 0x0, 0x0, 0x0, 0x67, 0x37, 0x0, 0x0, 0x0, 0x87, 0x37, 0x0, 0x0, 0x0, 0xA7, 0x37, 0x0, 0x0, 0x0, 0xC7, 0x37, 0x0, 0x0, 0x0, 0xE7, 0x37, 0x0, 0x0, 0x0, 0x7, 0x38, 0x0, 0x0, 0x0, 0x27, 0x38, 0x0, 0x0, 0x0, 0x47, 0x38, 0x0, 0x0, 0x0, 0x67, 0x38, 0x0, 0x0, 0x0, 0x87, 0x38, 0x0, 0x0, 0x0, 0xA7, 0x38, 0x0, 0x0, 0x0, 0xC7, 0x38, 0x0, 0x0, 0x0, 0xE7, 0x38, 0x0, 0x0, 0x0, 0x7, 0x39, 0x0, 0x0, 0x0, 0x27, 0x39, 0x0, 0x0, 0x0, 0x47, 0x39, 0x0, 0x0, 0x0, 0x67, 0x39, 0x0, 0x0, 0x0, 0x87, 0x39, 0x0, 0x0, 0x0, 0xA7, 0x39, 0x0, 0x0, 0x0, 0xC7, 0x39, 0x0, 0x0, 0x0, 0xE7, 0x39, 0x0, 0x0, 0x0, 0x7, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x3A, 0x0, 0x0, 0x0, 0x47, 0x3A, 0x0, 0x0, 0x0, 0x67, 0x3A, 0x0, 0x0, 0x0, 0x87, 0x3A, 0x0, 0x0, 0x0, 0xA7, 0x3A, 0x0, 0x0, 0x0, 0xC7, 0x3A, 0x0, 0x0, 0x0, 0xE7, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x3B, 0x0, 0x0, 0x0, 0x27, 0x3B, 0x0, 0x0, 0x0, 0x47, 0x3B, 0x0, 0x0, 0x0, 0x67, 0x3B, 0x0, 0x0, 0x0, 0x87, 0x3B, 0x0, 0x0, 0x0, 0xA7, 0x3B, 0x0, 0x0, 0x0, 0xC7, 0x3B, 0x0, 0x0, 0x0, 0xE7, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x3C, 0x0, 0x0, 0x0, 0x27, 0x3C, 0x0, 0x0, 0x0, 0x47, 0x3C, 0x0, 0x0, 0x0, 0x67, 0x3C, 0x0, 0x0, 0x0, 0x87, 0x3C, 0x0, 0x0, 0x0, 0xA7, 0x3C, 0x0, 0x0, 0x0, 0xC7, 0x3C, 0x0, 0x0, 0x0, 0xE7, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x3D, 0x0, 0x0, 0x0, 0x27, 0x3D, 0x0, 0x0, 0x0, 0x47, 0x3D, 0x0, 0x0, 0x0, 0x67, 0x3D, 0x0, 0x0, 0x0, 0x87, 0x3D, 0x0, 0x0, 0x0, 0xA7, 0x3D, 0x0, 0x0, 0x0, 0xC7, 0x3D, 0x0, 0x0, 0x0, 0xE7, 0x3D, 0x0, 0x0, 0x0, 0x7, 0x3E, 0x0, 0x0, 0x0, 0x27, 0x3E, 0x0, 0x0, 0x0, 0x47, 0x3E, 0x0, 0x0, 0x0, 0x67, 0x3E, 0x0, 0x0, 0x0, 0x87, 0x3E, 0x0, 0x0, 0x0, 0xA7, 0x3E, 0x0, 0x0, 0x0, 0xC7, 0x3E, 0x0, 0x0, 0x0, 0xE7, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x3F, 0x0, 0x0, 0x0, 0x27, 0x3F, 0x0, 0x0, 0x0, 0x47, 0x3F, 0x0, 0x0, 0x0, 0x67, 0x3F, 0x0, 0x0, 0x0, 0x87, 0x3F, 0x0, 0x0, 0x0, 0xA7, 0x3F, 0x0, 0x0, 0x0, 0xC7, 0x3F, 0x0, 0x0, 0x0, 0xE7, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x27, 0x40, 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, 0x0, 0x67, 0x40, 0x0, 0x0, 0x0, 0x87, 0x40, 0x0, 0x0, 0x0, 0xA7, 0x40, 0x0, 0x0, 0x0, 0x7, 0x0, 0x30, 0x10, 0x0, 0x7, 0x0, 0x38, 0x10, 0x0, 0x7, 0x0, 0x40, 0x10, 0x0, 0x7, 0x0, 0x48, 0x10, 0x0, 0x7, 0x0, 0x50, 0x10, 0x0, 0x7, 0x0, 0x58, 0x10, 0x0, 0x7, 0x0, 0x60, 0x10, 0x0, 0x7, 0x0, 0x68, 0x10, 0x0, 0x7, 0x0, 0x70, 0x10, 0x0, 0x7, 0x0, 0x78, 0x10, 0x0, 0x7, 0x0, 0x80, 0x10, 0x0, 0x7, 0x0, 0x88, 0x10, 0x0, 0x7, 0x0, 0x90, 0x10, 0x0, 0x7, 0x0, 0x98, 0x10, 0x0, 0x7, 0x0, 0xA0, 0x10, 0x0, 0x7, 0x0, 0xA8, 0x10, 0x0, 0x7, 0x0, 0x78, 0xE, 0x0, 0xC7, 0x42, 0x0, 0x0, 0x0, 0xE7, 0x42, 0x0, 0x0, 0x0, 0x7, 0x43, 0x0, 0x0, 0x0, 0x27, 0x43, 0x0, 0x0, 0x0, 0x47, 0x43, 0x0, 0x0, 0x0, 0x67, 0x43, 0x0, 0x0, 0x0, 0x87, 0x43, 0x0, 0x0, 0x0, 0xA7, 0x43, 0x0, 0x0, 0x0, 0xC7, 0x43, 0x0, 0x0, 0x0, 0xE7, 0x43, 0x0, 0x0, 0x0, 0x7, 0x44, 0x0, 0x0, 0x0, 0x7, 0x0, 0x8, 0xD, 0x0, 0x7, 0x0, 0xE8, 0xC, 0x0, 0x7, 0x0, 0x98, 0xD, 0x0, 0x7, 0x0, 0xE8, 0xD, 0x0, 0x7, 0x0, 0x48, 0xD, 0x0, 0x27, 0x44, 0x0, 0x0, 0x0, 0x47, 0x44, 0x0, 0x0, 0x0, 0x67, 0x44, 0x0, 0x0, 0x0, 0x87, 0x44, 0x0, 0x0, 0x0, 0xA7, 0x44, 0x0, 0x0, 0x0, 0xC7, 0x44, 0x0, 0x0, 0x0, 0xE7, 0x44, 0x0, 0x0, 0x0, 0x7, 0x45, 0x0, 0x0, 0x0, 0x27, 0x45, 0x0, 0x0, 0x0, 0x47, 0x45, 0x0, 0x0, 0x0, 0x67, 0x45, 0x0, 0x0, 0x0, 0x87, 0x45, 0x0, 0x0, 0x0, 0x7, 0x0, 0x58, 0xD, 0x0, 0xA7, 0x45, 0x0, 0x0, 0x0, 0xC7, 0x45, 0x0, 0x0, 0x0, 0xE7, 0x45, 0x0, 0x0, 0x0, 0x7, 0x46, 0x0, 0x0, 0x0, 0x27, 0x46, 0x0, 0x0, 0x0, 0x7, 0x0, 0x90, 0x11, 0x0, 0x7, 0x0, 0x98, 0x11, 0x0, 0x7, 0x0, 0xA0, 0x11, 0x0, 0x7, 0x0, 0xA8, 0x11, 0x0, 0x7, 0x0, 0xB0, 0x11, 0x0, 0x7, 0x0, 0xB8, 0x11, 0x0, 0x7, 0x0, 0xC0, 0x11, 0x0, 0x7, 0x0, 0xC8, 0x11, 0x0, 0x7, 0x0, 0xD0, 0x11, 0x0, 0x7, 0x0, 0xD8, 0x11, 0x0, 0x7, 0x0, 0xE0, 0x11, 0x0, 0x7, 0x0, 0xE8, 0x11, 0x0, 0x7, 0x0, 0xF0, 0x11, 0x0, 0x7, 0x0, 0xF8, 0x11, 0x0, 0x7, 0x0, 0x0, 0x12, 0x0, 0x7, 0x0, 0x8, 0x12, 0x0, 0x7, 0x0, 0x10, 0x12, 0x0, 0x7, 0x0, 0x18, 0x12, 0x0, 0x7, 0x0, 0x20, 0x12, 0x0, 0x7, 0x0, 0x28, 0x12, 0x0, 0x7, 0x0, 0x30, 0x12, 0x0, 0x7, 0x0, 0x38, 0x12, 0x0, 0x7, 0x0, 0x40, 0x12, 0x0, 0x7, 0x0, 0x48, 0x12, 0x0, 0x7, 0x0, 0x50, 0x12, 0x0, 0x7, 0x0, 0xD0, 0x10, 0x0, 0x7, 0x0, 0x58, 0x12, 0x0, 0x7, 0x0, 0xD8, 0x10, 0x0, 0x7, 0x0, 0xE0, 0x10, 0x0, 0x7, 0x0, 0xE8, 0x10, 0x0, 0x7, 0x0, 0xF0, 0x10, 0x0, 0x7, 0x0, 0xF8, 0x10, 0x0, 0x7, 0x0, 0x0, 0x11, 0x0, 0x7, 0x0, 0x60, 0x12, 0x0, 0x7, 0x0, 0x68, 0x12, 0x0, 0x7, 0x0, 0x70, 0x12, 0x0, 0x7, 0x0, 0x78, 0x12, 0x0, 0x7, 0x0, 0x8, 0x11, 0x0, 0x7, 0x0, 0x10, 0x11, 0x0, 0x7, 0x0, 0x18, 0x11, 0x0, 0x7, 0x0, 0x20, 0x11, 0x0, 0x7, 0x4A, 0x0, 0x0, 0x0, 0x27, 0x4A, 0x0, 0x0, 0x0, 0x47, 0x4A, 0x0, 0x0, 0x0, 0x67, 0x4A, 0x0, 0x0, 0x0, 0x87, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x0, 0xD0, 0xD, 0x0, 0x7, 0x0, 0x30, 0xE, 0x0, 0x7, 0x0, 0x50, 0xE, 0x0, 0x7, 0x0, 0x60, 0xE, 0x0, 0x7, 0x0, 0x70, 0xE, 0x0, 0x7, 0x0, 0x80, 0xE, 0x0, 0x7, 0x0, 0x90, 0xE, 0x0, 0x7, 0x0, 0xA0, 0xE, 0x0, 0x7, 0x0, 0xB0, 0xE, 0x0, 0x7, 0x0, 0xC0, 0xE, 0x0, 0x7, 0x0, 0xD0, 0xE, 0x0, 0x7, 0x0, 0xE0, 0xE, 0x0, 0x7, 0x0, 0xF0, 0xE, 0x0, 0x7, 0x0, 0x0, 0xF, 0x0, 0x7, 0x0, 0x10, 0xF, 0x0, 0x7, 0x0, 0x20, 0xF, 0x0, 0x7, 0x0, 0x30, 0xF, 0x0, 0x7, 0x0, 0x40, 0xF, 0x0, 0x7, 0x0, 0x50, 0xF, 0x0, 0x7, 0x0, 0x60, 0xF, 0x0, 0x7, 0x0, 0x70, 0xF, 0x0, 0x7, 0x0, 0x80, 0xF, 0x0, 0x7, 0x0, 0x90, 0xF, 0x0, 0x7, 0x0, 0xA0, 0xF, 0x0, 0x7, 0x0, 0xB0, 0xF, 0x0, 0x7, 0x0, 0xB8, 0xF, 0x0, 0x7, 0x0, 0xC0, 0xF, 0x0, 0x7, 0x0, 0xC8, 0xF, 0x0, 0x7, 0x0, 0xD0, 0xF, 0x0, 0x7, 0x0, 0xD8, 0xF, 0x0, 0x7, 0x0, 0xE0, 0xF, 0x0, 0x7, 0x0, 0xE8, 0xF, 0x0, 0x7, 0x0, 0xF0, 0xF, 0x0, 0x7, 0x0, 0xF8, 0xF, 0x0, 0x7, 0x0, 0x0, 0x10, 0x0, 0x7, 0x0, 0x8, 0x10, 0x0, 0x7, 0x0, 0x10, 0x10, 0x0, 0x7, 0x0, 0x18, 0x10, 0x0, 0x7, 0x0, 0x20, 0x10, 0x0, 0x7, 0x0, 0x28, 0x10, 0x0, 0xA7, 0x4A, 0x0, 0x0, 0x0, 0xC7, 0x4A, 0x0, 0x0, 0x0, 0xE7, 0x4A, 0x0, 0x0, 0x0, 0x67, 0x47, 0x0, 0x0, 0x0, 0x87, 0x47, 0x0, 0x0, 0x0, 0xA7, 0x47, 0x0, 0x0, 0x0, 0xC7, 0x47, 0x0, 0x0, 0x0, 0xE7, 0x47, 0x0, 0x0, 0x0, 0x7, 0x48, 0x0, 0x0, 0x0, 0x27, 0x48, 0x0, 0x0, 0x0, 0x47, 0x48, 0x0, 0x0, 0x0, 0x67, 0x48, 0x0, 0x0, 0x0, 0x87, 0x48, 0x0, 0x0, 0x0, 0xA7, 0x48, 0x0, 0x0, 0x0, 0xC7, 0x48, 0x0, 0x0, 0x0, 0xE7, 0x48, 0x0, 0x0, 0x0, 0x7, 0x49, 0x0, 0x0, 0x0, 0x27, 0x49, 0x0, 0x0, 0x0, 0x47, 0x49, 0x0, 0x0, 0x0, 0x67, 0x49, 0x0, 0x0, 0x0, 0x87, 0x49, 0x0, 0x0, 0x0, 0x7, 0x4B, 0x0, 0x0, 0x0, 0xA7, 0x49, 0x0, 0x0, 0x0, 0xC7, 0x49, 0x0, 0x0, 0x0, 0xE7, 0x49, 0x0, 0x0, 0x0, 0x7, 0x0, 0xA8, 0xF, 0x0, 0x7, 0x0, 0xB0, 0xC, 0x0, 0x7, 0x0, 0xB0, 0x10, 0x0, 0x7, 0x0, 0xA8, 0x12, 0x0, 0x7, 0x0, 0x88, 0xE, 0x0, 0x7, 0x0, 0xB8, 0xC, 0x0, 0x7, 0x0, 0xA8, 0xE, 0x0, 0x7, 0x0, 0xC8, 0xC, 0x0, 0x7, 0x0, 0xD8, 0xC, 0x0, 0x7, 0x0, 0x98, 0xE, 0x0, 0x7, 0x0, 0xB8, 0x12, 0x0, 0x7, 0x0, 0xC8, 0x12, 0x0, 0x7, 0x0, 0xD0, 0x12, 0x0, 0x7, 0x0, 0xC0, 0xC, 0x0, 0x7, 0x0, 0x0, 0xD, 0x0, 0x7, 0x0, 0x68, 0xD, 0x0, 0x7, 0x0, 0x78, 0xD, 0x0, 0x7, 0x0, 0x88, 0xD, 0x0, 0x7, 0x0, 0xF8, 0xC, 0x0, 0x7, 0x0, 0xD8, 0x12, 0x0, 0x7, 0x0, 0xE0, 0x12, 0x0, 0x7, 0x0, 0xE8, 0x12, 0x0, 0x7, 0x0, 0xF0, 0x12, 0x0, 0x7, 0x0, 0xF8, 0x12, 0x0, 0x7, 0x0, 0x0, 0x13, 0x0, 0x7, 0x0, 0x8, 0x13, 0x0, 0x7, 0x0, 0x10, 0x13, 0x0, 0x7, 0x0, 0x18, 0x13, 0x0, 0x7, 0x0, 0x20, 0x13, 0x0, 0x7, 0x0, 0x28, 0x13, 0x0, 0x7, 0x0, 0x30, 0x13, 0x0, 0x7, 0x0, 0x38, 0x13, 0x0, 0x7, 0x0, 0x40, 0x13, 0x0, 0x7, 0x0, 0x48, 0x13, 0x0, 0x7, 0x0, 0x50, 0x13, 0x0, 0x7, 0x0, 0x58, 0x13, 0x0, 0x7, 0x0, 0x60, 0x13, 0x0, 0x7, 0x0, 0x68, 0x13, 0x0, 0x7, 0x0, 0x70, 0x13, 0x0, 0x7, 0x0, 0x78, 0x13, 0x0, 0x7, 0x0, 0x80, 0x13, 0x0, 0x7, 0x0, 0x88, 0x13, 0x0, 0x7, 0x0, 0x90, 0x13, 0x0, 0x7, 0x0, 0x98, 0x13, 0x0, 0x7, 0x0, 0xA0, 0x13, 0x0, 0x7, 0x0, 0xC8, 0x10, 0x0, 0x7, 0x0, 0xA8, 0x13, 0x0, 0x7, 0x0, 0xB0, 0x13, 0x0, 0x7, 0x0, 0xB8, 0x13, 0x0, 0x7, 0x0, 0xC0, 0x13, 0x0, 0x7, 0x0, 0xC8, 0x13, 0x0, 0x7, 0x0, 0xD0, 0x13, 0x0, 0x7, 0x0, 0xD8, 0x13, 0x0, 0x7, 0x0, 0xE0, 0x13, 0x0, 0x7, 0x0, 0xE8, 0x13, 0x0, 0x7, 0x0, 0xF0, 0x13, 0x0, 0x7, 0x0, 0xF8, 0x13, 0x0, 0x7, 0x0, 0x0, 0x14, 0x0, 0x7, 0x0, 0x8, 0x14, 0x0, 0x7, 0x0, 0x10, 0x14, 0x0, 0x7, 0x0, 0x18, 0x14, 0x0, 0x7, 0x0, 0x20, 0x14, 0x0, 0x7, 0x0, 0x28, 0x14, 0x0, 0x7, 0x0, 0x30, 0x14, 0x0, 0x7, 0x0, 0x38, 0x14, 0x0, 0x7, 0x0, 0x40, 0x14, 0x0, 0x27, 0x51, 0x0, 0x0, 0x0, 0x47, 0x51, 0x0, 0x0, 0x0, 0x67, 0x51, 0x0, 0x0, 0x0, 0x87, 0x51, 0x0, 0x0, 0x0, 0xA7, 0x51, 0x0, 0x0, 0x0, 0xC7, 0x51, 0x0, 0x0, 0x0, 0xE7, 0x51, 0x0, 0x0, 0x0, 0x7, 0x52, 0x0, 0x0, 0x0, 0x27, 0x52, 0x0, 0x0, 0x0, 0x47, 0x52, 0x0, 0x0, 0x0, 0x67, 0x52, 0x0, 0x0, 0x0, 0x87, 0x52, 0x0, 0x0, 0x0, 0xA7, 0x52, 0x0, 0x0, 0x0, 0xC7, 0x52, 0x0, 0x0, 0x0, 0xE7, 0x52, 0x0, 0x0, 0x0, 0x7, 0x53, 0x0, 0x0, 0x0, 0x27, 0x53, 0x0, 0x0, 0x0, 0x47, 0x53, 0x0, 0x0, 0x0, 0x67, 0x53, 0x0, 0x0, 0x0, 0x87, 0x53, 0x0, 0x0, 0x0, 0xA7, 0x53, 0x0, 0x0, 0x0, 0xC7, 0x53, 0x0, 0x0, 0x0, 0xE7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x54, 0x0, 0x0, 0x0, 0x27, 0x54, 0x0, 0x0, 0x0, 0x47, 0x54, 0x0, 0x0, 0x0, 0x67, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x20, 0x15, 0x0, 0x7, 0x0, 0x28, 0x15, 0x0, 0x7, 0x0, 0x30, 0x15, 0x0, 0x7, 0x0, 0x38, 0x15, 0x0, 0x7, 0x0, 0x40, 0x15, 0x0, 0x7, 0x0, 0x48, 0x15, 0x0, 0x7, 0x0, 0x50, 0x15, 0x0, 0x7, 0x0, 0x58, 0x15, 0x0, 0x7, 0x0, 0x60, 0x15, 0x0, 0x7, 0x0, 0x68, 0x15, 0x0, 0x7, 0x0, 0x70, 0x15, 0x0, 0x7, 0x0, 0x78, 0x15, 0x0, 0x7, 0x0, 0x80, 0x15, 0x0, 0x7, 0x0, 0x88, 0x15, 0x0, 0x7, 0x0, 0x90, 0x15, 0x0, 0x7, 0x0, 0x98, 0x15, 0x0, 0x7, 0x0, 0xA0, 0x15, 0x0, 0x7, 0x0, 0xF0, 0xD, 0x0, 0xA7, 0x56, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0xE, 0x0, 0x7, 0x0, 0xB0, 0x15, 0x0, 0x7, 0x0, 0x40, 0xE, 0x0, 0xA7, 0x31, 0x0, 0x0, 0x0, 0xE7, 0x56, 0x0, 0x0, 0x0, 0x47, 0x41, 0x40, 0x10, 0x0, 0x67, 0x41, 0x48, 0x10, 0x0, 0x7, 0x57, 0x0, 0x0, 0x0, 0xE7, 0x33, 0x50, 0x10, 0x0, 0x27, 0x34, 0x58, 0x10, 0x0, 0x27, 0x57, 0x0, 0x0, 0x0, 0x47, 0x57, 0x0, 0x0, 0x0, 0xE7, 0x37, 0x70, 0x10, 0x0, 0x27, 0x38, 0x78, 0x10, 0x0, 0x67, 0x57, 0x0, 0x0, 0x0, 0x87, 0x57, 0x0, 0x0, 0x0, 0xA7, 0x57, 0x0, 0x0, 0x0, 0xE7, 0x3B, 0x80, 0x10, 0x0, 0x27, 0x3C, 0x88, 0x10, 0x0, 0x67, 0x3C, 0x90, 0x10, 0x0, 0xA7, 0x3C, 0x98, 0x10, 0x0, 0xC7, 0x57, 0x0, 0x0, 0x0, 0xC7, 0x33, 0xA0, 0x10, 0x0, 0x7, 0x34, 0xA8, 0x10, 0x0, 0xE7, 0x57, 0x0, 0x0, 0x0, 0x7, 0x58, 0x0, 0x0, 0x0, 0x27, 0x58, 0x0, 0x0, 0x0, 0x47, 0x58, 0x0, 0x0, 0x0, 0x67, 0x58, 0x0, 0x0, 0x0, 0x87, 0x58, 0x0, 0x0, 0x0, 0xA7, 0x58, 0x0, 0x0, 0x0, 0xC7, 0x58, 0x0, 0x0, 0x0, 0xE7, 0x58, 0x0, 0x0, 0x0, 0x7, 0x59, 0x0, 0x0, 0x0, 0x27, 0x59, 0x0, 0x0, 0x0, 0x47, 0x59, 0x0, 0x0, 0x0, 0x67, 0x59, 0x0, 0x0, 0x0, 0x87, 0x59, 0x0, 0x0, 0x0, 0xA7, 0x59, 0x0, 0x0, 0x0, 0xC7, 0x59, 0x0, 0x0, 0x0, 0xE7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x5A, 0x0, 0x0, 0x0, 0x27, 0x5A, 0x0, 0x0, 0x0, 0x47, 0x5A, 0x0, 0x0, 0x0, 0x67, 0x5A, 0x0, 0x0, 0x0, 0x87, 0x5A, 0x0, 0x0, 0x0, 0xA7, 0x5A, 0x0, 0x0, 0x0, 0xC7, 0x5A, 0x0, 0x0, 0x0, 0xE7, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x5B, 0x0, 0x0, 0x0, 0x7, 0x0, 0xC8, 0x16, 0x0, 0x7, 0x0, 0xD0, 0x16, 0x0, 0x7, 0x0, 0xD8, 0x16, 0x0, 0x7, 0x0, 0xE0, 0x16, 0x0, 0x7, 0x0, 0xE8, 0x16, 0x0, 0x7, 0x0, 0xF0, 0x16, 0x0, 0x7, 0x0, 0xC8, 0x15, 0x0, 0x7, 0x0, 0xD0, 0x15, 0x0, 0x7, 0x0, 0xF8, 0x16, 0x0, 0x7, 0x0, 0x0, 0x17, 0x0, 0x7, 0x0, 0x8, 0x17, 0x0, 0x7, 0x0, 0xD8, 0x15, 0x0, 0x7, 0x0, 0x10, 0x17, 0x0, 0x7, 0x0, 0x18, 0x17, 0x0, 0x7, 0x0, 0x20, 0x17, 0x0, 0x7, 0x0, 0x28, 0x17, 0x0, 0x7, 0x0, 0x30, 0x17, 0x0, 0x7, 0x0, 0x38, 0x17, 0x0, 0x7, 0x0, 0x40, 0x17, 0x0, 0x7, 0x0, 0x48, 0x17, 0x0, 0x7, 0x0, 0x50, 0x17, 0x0, 0x7, 0x0, 0x58, 0x17, 0x0, 0x7, 0x0, 0x60, 0x17, 0x0, 0x7, 0x0, 0x68, 0x17, 0x0, 0x7, 0x0, 0xF8, 0x15, 0x0, 0x7, 0x0, 0x0, 0x16, 0x0, 0x7, 0x0, 0x8, 0x16, 0x0, 0x7, 0x0, 0x10, 0x16, 0x0, 0x7, 0x0, 0x18, 0x16, 0x0, 0x7, 0x0, 0x20, 0x16, 0x0, 0x7, 0x0, 0x28, 0x16, 0x0, 0x7, 0x0, 0x30, 0x16, 0x0, 0x7, 0x0, 0x38, 0x16, 0x0, 0x7, 0x0, 0x40, 0x16, 0x0, 0x7, 0x0, 0x58, 0x16, 0x0, 0x7, 0x0, 0x60, 0x16, 0x0, 0x7, 0x0, 0x68, 0x16, 0x0, 0x7, 0x0, 0x70, 0x16, 0x0, 0x7, 0x0, 0x78, 0x16, 0x0, 0x7, 0x0, 0x80, 0x16, 0x0, 0x7, 0x0, 0x88, 0x16, 0x0, 0x7, 0x0, 0x90, 0x16, 0x0, 0x7, 0x0, 0x98, 0x16, 0x0, 0x7, 0x0, 0xA0, 0x16, 0x0, 0x7, 0x0, 0xA8, 0x16, 0x0, 0x7, 0x0, 0xB0, 0x16, 0x0, 0x7, 0x0, 0xB8, 0x16, 0x0, 0x7, 0x0, 0xC0, 0x16, 0x0, 0x47, 0x46, 0x0, 0x0, 0x0, 0xC7, 0x5D, 0x0, 0x0, 0x0, 0xE7, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x5E, 0x0, 0x0, 0x0, 0x27, 0x5E, 0x0, 0x0, 0x0, 0x47, 0x5E, 0x0, 0x0, 0x0, 0x67, 0x5E, 0x0, 0x0, 0x0, 0xA7, 0x46, 0x0, 0x0, 0x0, 0xC7, 0x46, 0x0, 0x0, 0x0, 0xE7, 0x46, 0x0, 0x0, 0x0, 0x7, 0x47, 0x0, 0x0, 0x0, 0x27, 0x47, 0x0, 0x0, 0x0, 0x47, 0x47, 0x0, 0x0, 0x0, 0x7, 0x0, 0x70, 0x17, 0x0, 0x7, 0x0, 0x78, 0x17, 0x0, 0x7, 0x0, 0x80, 0x17, 0x0, 0x7, 0x0, 0x88, 0x17, 0x0, 0x7, 0x0, 0x90, 0x17, 0x0, 0x7, 0x0, 0x98, 0x17, 0x0, 0x7, 0x0, 0xC0, 0x12, 0x0, 0x7, 0x0, 0x28, 0x11, 0x0, 0x7, 0x0, 0x30, 0x11, 0x0, 0x7, 0x0, 0x38, 0x11, 0x0, 0x7, 0x0, 0x40, 0x11, 0x0, 0x7, 0x0, 0x48, 0x11, 0x0, 0x7, 0x0, 0x50, 0x11, 0x0, 0x7, 0x0, 0x80, 0x12, 0x0, 0x7, 0x0, 0x58, 0x11, 0x0, 0x7, 0x0, 0x60, 0x11, 0x0, 0x7, 0x0, 0x88, 0x12, 0x0, 0x7, 0x0, 0x90, 0x12, 0x0, 0x7, 0x0, 0x98, 0x12, 0x0, 0x7, 0x0, 0xA0, 0x12, 0x0, 0x7, 0x0, 0x70, 0x11, 0x0, 0x7, 0x0, 0x78, 0x11, 0x0, 0x7, 0x0, 0x80, 0x11, 0x0, 0x7, 0x0, 0x88, 0x11, 0x0, 0xC7, 0x40, 0x0, 0x0, 0x0, 0xE7, 0x40, 0x0, 0x0, 0x0, 0x7, 0x41, 0x0, 0x0, 0x0, 0x67, 0x41, 0x0, 0x0, 0x0, 0x87, 0x41, 0x0, 0x0, 0x0, 0xA7, 0x41, 0x0, 0x0, 0x0, 0xC7, 0x41, 0x0, 0x0, 0x0, 0xE7, 0x41, 0x0, 0x0, 0x0, 0x7, 0x42, 0x0, 0x0, 0x0, 0x27, 0x42, 0x0, 0x0, 0x0, 0x47, 0x42, 0x0, 0x0, 0x0, 0x67, 0x42, 0x0, 0x0, 0x0, 0x87, 0x42, 0x0, 0x0, 0x0, 0xA7, 0x42, 0x0, 0x0, 0x0, 0x87, 0x5E, 0x0, 0x0, 0x0, 0xA7, 0x5E, 0x0, 0x0, 0x0, 0xC7, 0x5E, 0x0, 0x0, 0x0, 0xE7, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x27, 0x5F, 0x0, 0x0, 0x0, 0xE7, 0x3F, 0x48, 0xE, 0x0, 0x7, 0x40, 0x58, 0xE, 0x0, 0x27, 0x40, 0x68, 0xE, 0x0, 0x47, 0x40, 0x78, 0xE, 0x0, 0x67, 0x40, 0x88, 0xE, 0x0, 0x87, 0x40, 0x98, 0xE, 0x0, 0xA7, 0x40, 0xA8, 0xE, 0x0, 0x7, 0x0, 0xD0, 0x17, 0x0, 0x7, 0x0, 0xD8, 0x17, 0x0, 0x7, 0x0, 0xE0, 0x17, 0x0, 0x7, 0x0, 0xE8, 0x17, 0x0, 0x7, 0x0, 0xF0, 0x17, 0x0, 0x7, 0x0, 0xF8, 0x17, 0x0, 0x7, 0x0, 0x0, 0x18, 0x0, 0x7, 0x0, 0x8, 0x18, 0x0, 0x7, 0x0, 0x10, 0x18, 0x0, 0x7, 0x0, 0x18, 0x18, 0x0, 0x7, 0x0, 0x20, 0x18, 0x0, 0x7, 0x0, 0x28, 0x18, 0x0, 0x7, 0x0, 0x30, 0x18, 0x0, 0x7, 0x0, 0x38, 0x18, 0x0, 0x7, 0x0, 0x40, 0x18, 0x0, 0x7, 0x0, 0x48, 0x18, 0x0, 0x7, 0x0, 0x50, 0x18, 0x0, 0x7, 0x0, 0x58, 0x18, 0x0, 0x7, 0x0, 0x60, 0x18, 0x0, 0x7, 0x0, 0x68, 0x18, 0x0, 0x7, 0x0, 0x70, 0x18, 0x0, 0x7, 0x0, 0x78, 0x18, 0x0, 0x7, 0x0, 0x80, 0x18, 0x0, 0x7, 0x0, 0x88, 0x18, 0x0, 0x7, 0x0, 0x90, 0x18, 0x0, 0x7, 0x0, 0x98, 0x18, 0x0, 0x7, 0x0, 0xA0, 0x18, 0x0, 0x7, 0x0, 0xA8, 0x18, 0x0, 0x7, 0x0, 0xB0, 0x18, 0x0, 0x7, 0x0, 0xB8, 0x18, 0x0, 0x7, 0x0, 0xC0, 0x18, 0x0, 0x27, 0x63, 0x0, 0x0, 0x0, 0x47, 0x63, 0x0, 0x0, 0x0, 0x67, 0x63, 0x0, 0x0, 0x0, 0x87, 0x63, 0x0, 0x0, 0x0, 0xA7, 0x63, 0x0, 0x0, 0x0, 0xC7, 0x63, 0x0, 0x0, 0x0, 0x7, 0x0, 0xF8, 0x18, 0x0, 0x7, 0x0, 0x0, 0x19, 0x0, 0x7, 0x0, 0x8, 0x19, 0x0, 0x7, 0x0, 0x10, 0x19, 0x0, 0x7, 0x0, 0x18, 0x19, 0x0, 0x7, 0x0, 0x20, 0x19, 0x0, 0x7, 0x0, 0x28, 0x19, 0x0, 0x7, 0x0, 0x30, 0x19, 0x0, 0x7, 0x0, 0x38, 0x19, 0x0, 0x7, 0x0, 0x40, 0x19, 0x0, 0x7, 0x0, 0x48, 0x19, 0x0, 0x7, 0x0, 0x50, 0x19, 0x0, 0x7, 0x0, 0x58, 0x19, 0x0, 0x7, 0x0, 0x60, 0x19, 0x0, 0x7, 0x0, 0x68, 0x19, 0x0, 0x7, 0x0, 0x70, 0x19, 0x0, 0x7, 0x0, 0x78, 0x19, 0x0, 0x7, 0x0, 0x80, 0x19, 0x0, 0x7, 0x0, 0x88, 0x19, 0x0, 0x7, 0x0, 0x90, 0x19, 0x0, 0x7, 0x0, 0x98, 0x19, 0x0, 0x7, 0x0, 0xA0, 0x19, 0x0, 0x7, 0x0, 0xA8, 0x19, 0x0, 0x7, 0x0, 0xB0, 0x19, 0x0, 0x7, 0x0, 0xB8, 0x19, 0x0, 0x7, 0x0, 0xC0, 0x19, 0x0, 0x7, 0x0, 0xC8, 0x19, 0x0, 0x7, 0x0, 0xD0, 0x19, 0x0, 0x7, 0x0, 0xD8, 0x19, 0x0, 0x7, 0x0, 0xE0, 0x19, 0x0, 0x7, 0x0, 0xE8, 0x19, 0x0, 0x7, 0x0, 0xF0, 0x19, 0x0, 0x7, 0x0, 0xF8, 0x19, 0x0, 0xC7, 0x40, 0x40, 0x10, 0x0, 0xE7, 0x40, 0x48, 0x10, 0x0, 0x7, 0x41, 0x50, 0x10, 0x0, 0x7, 0x68, 0x0, 0x0, 0x0, 0x27, 0x68, 0x0, 0x0, 0x0, 0x47, 0x68, 0x0, 0x0, 0x0, 0x47, 0x42, 0x30, 0x10, 0x0, 0x67, 0x68, 0x0, 0x0, 0x0, 0x87, 0x68, 0x0, 0x0, 0x0, 0xA7, 0x68, 0x0, 0x0, 0x0, 0x27, 0x18, 0x0, 0x0, 0x0, 0x67, 0x31, 0x0, 0x0, 0x0, 0x87, 0x31, 0x0, 0x0, 0x0, 0xC7, 0x31, 0x0, 0x0, 0x0, 0xE7, 0x31, 0x0, 0x0, 0x0, 0x7, 0x32, 0x0, 0x0, 0x0, 0x27, 0x32, 0x0, 0x0, 0x0, 0x47, 0x32, 0x0, 0x0, 0x0, 0x67, 0x32, 0x0, 0x0, 0x0, 0xA7, 0x32, 0x0, 0x0, 0x0, 0xE7, 0x65, 0x0, 0x0, 0x0, 0x7, 0x66, 0x0, 0x0, 0x0, 0x27, 0x66, 0x0, 0x0, 0x0, 0x47, 0x66, 0x0, 0x0, 0x0, 0x67, 0x66, 0x0, 0x0, 0x0, 0x87, 0x66, 0x0, 0x0, 0x0, 0xA7, 0x66, 0x0, 0x0, 0x0, 0xC7, 0x66, 0x0, 0x0, 0x0, 0x7, 0x67, 0x0, 0x0, 0x0, 0x27, 0x67, 0x0, 0x0, 0x0, 0x47, 0x67, 0x0, 0x0, 0x0, 0x67, 0x67, 0x0, 0x0, 0x0, 0x87, 0x67, 0x0, 0x0, 0x0, 0xA7, 0x67, 0x0, 0x0, 0x0, 0xC7, 0x67, 0x0, 0x0, 0x0, 0xC7, 0x68, 0x0, 0x0, 0x0, 0xE7, 0x68, 0x0, 0x0, 0x0, 0x7, 0x69, 0x0, 0x0, 0x0, 0x27, 0x69, 0x0, 0x0, 0x0, 0x27, 0x3F, 0x58, 0xF, 0x0, 0x87, 0x3F, 0x68, 0xF, 0x0, 0x7, 0x0, 0x18, 0xD, 0x0, 0x7, 0x0, 0x28, 0xD, 0x0, 0x7, 0x0, 0xA8, 0xD, 0x0, 0x7, 0x0, 0xF8, 0xD, 0x0, 0x7, 0x0, 0x18, 0xE, 0x0, 0x7, 0x0, 0x38, 0xE, 0x0, 0x7, 0x0, 0x48, 0xE, 0x0, 0x7, 0x0, 0x68, 0xE, 0x0, 0x7, 0x0, 0x78, 0xF, 0x0, 0x7, 0x0, 0xF0, 0x18, 0x0, 0x7, 0x0, 0xD0, 0xC, 0x0, 0x7, 0x0, 0x50, 0x1A, 0x0, 0x67, 0x69, 0x0, 0x0, 0x0, 0x87, 0x69, 0x0, 0x0, 0x0, 0xA7, 0x69, 0x0, 0x0, 0x0, 0xC7, 0x69, 0x0, 0x0, 0x0, 0xE7, 0x69, 0x0, 0x0, 0x0, 0x7, 0x6A, 0x0, 0x0, 0x0, 0x27, 0x6A, 0x0, 0x0, 0x0, 0x47, 0x6A, 0x0, 0x0, 0x0, 0x67, 0x6A, 0x0, 0x0, 0x0, 0x87, 0x6A, 0x0, 0x0, 0x0, 0xA7, 0x6A, 0x0, 0x0, 0x0, 0xC7, 0x6A, 0x0, 0x0, 0x0, 0xE7, 0x6A, 0x0, 0x0, 0x0, 0x7, 0x6B, 0x0, 0x0, 0x0, 0x27, 0x6B, 0x0, 0x0, 0x0, 0x47, 0x6B, 0x0, 0x0, 0x0, 0x67, 0x6B, 0x0, 0x0, 0x0, 0x87, 0x6B, 0x0, 0x0, 0x0, 0xA7, 0x6B, 0x0, 0x0, 0x0, 0xC7, 0x6B, 0x0, 0x0, 0x0, 0x7, 0x0, 0xF8, 0x1A, 0x0, 0x7, 0x0, 0xC0, 0x10, 0x0, 0x7, 0x0, 0xE0, 0x18, 0x0, 0x7, 0x0, 0xE8, 0x18, 0x0, 0x7, 0x0, 0x0, 0x1B, 0x0, 0x7, 0x0, 0x8, 0x1B, 0x0, 0x7, 0x0, 0x10, 0x1B, 0x0, 0x7, 0x0, 0xA0, 0xD, 0x0, 0x7, 0x0, 0x18, 0x1B, 0x0, 0x87, 0x6C, 0x0, 0x0, 0x0, 0xA7, 0x6C, 0x0, 0x0, 0x0, 0xC7, 0x6C, 0x0, 0x0, 0x0, 0xE7, 0x6C, 0x0, 0x0, 0x0, 0x7, 0x6D, 0x0, 0x0, 0x0, 0x27, 0x6D, 0x0, 0x0, 0x0, 0x47, 0x6D, 0x0, 0x0, 0x0, 0x67, 0x6D, 0x0, 0x0, 0x0, 0x87, 0x6D, 0x0, 0x0, 0x0, 0xA7, 0x6D, 0x0, 0x0, 0x0, 0xC7, 0x6D, 0x0, 0x0, 0x0, 0xE7, 0x6D, 0x0, 0x0, 0x0, 0x7, 0x6E, 0x0, 0x0, 0x0, 0x27, 0x6E, 0x0, 0x0, 0x0, 0x47, 0x6E, 0x0, 0x0, 0x0, 0x67, 0x6E, 0x0, 0x0, 0x0, 0x87, 0x6E, 0x0, 0x0, 0x0, 0xA7, 0x6E, 0x0, 0x0, 0x0, 0xC7, 0x56, 0x0, 0x0, 0x0, 0xC7, 0x6E, 0x0, 0x0, 0x0, 0x67, 0x6C, 0x0, 0x0, 0x0, 0xE7, 0x6E, 0x0, 0x0, 0x0, 0x7, 0x6F, 0x0, 0x0, 0x0, 0x27, 0x6F, 0x0, 0x0, 0x0, 0x47, 0x6F, 0x0, 0x0, 0x0, 0x67, 0x6F, 0x0, 0x0, 0x0, 0x87, 0x6F, 0x0, 0x0, 0x0, 0xA7, 0x6F, 0x0, 0x0, 0x0, 0xC7, 0x6F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x40, 0x1B, 0x0, 0x7, 0x0, 0x48, 0x1B, 0x0, 0x7, 0x0, 0x50, 0x1B, 0x0, 0x7, 0x0, 0xF8, 0x1B, 0x0, 0x7, 0x0, 0x58, 0x1B, 0x0, 0x7, 0x0, 0x60, 0x1B, 0x0, 0x7, 0x0, 0x68, 0x1B, 0x0, 0x7, 0x0, 0x70, 0x1B, 0x0, 0x7, 0x0, 0x78, 0x1B, 0x0, 0x7, 0x0, 0x80, 0x1B, 0x0, 0x7, 0x0, 0x88, 0x1B, 0x0, 0x7, 0x0, 0x90, 0x1B, 0x0, 0x7, 0x0, 0x98, 0x1B, 0x0, 0x7, 0x0, 0xA0, 0x1B, 0x0, 0x7, 0x0, 0xA8, 0x1B, 0x0, 0x7, 0x0, 0xB0, 0x1B, 0x0, 0x7, 0x0, 0xB8, 0x1B, 0x0, 0x7, 0x0, 0xC0, 0x1B, 0x0, 0x7, 0x0, 0xC8, 0x1B, 0x0, 0x7, 0x0, 0xA8, 0x15, 0x0, 0x7, 0x0, 0xD0, 0x1B, 0x0, 0x7, 0x0, 0xD8, 0x1B, 0x0, 0x7, 0x0, 0xE0, 0x1B, 0x0, 0x7, 0x0, 0xE8, 0x1B, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x28, 0x70, 0x0, 0x0, 0x0, 0x48, 0x70, 0x0, 0x0, 0x0, 0x68, 0x70, 0x0, 0x0, 0x0, 0x88, 0x70, 0x0, 0x0, 0x0, 0xA8, 0x70, 0x0, 0x0, 0x0, 0xC8, 0x70, 0x0, 0x0, 0x0, 0xE8, 0x70, 0x0, 0x0, 0x0, 0x8, 0x71, 0x0, 0x0, 0x0, 0x28, 0x71, 0x0, 0x0, 0x0, 0x48, 0x71, 0x0, 0x0, 0x0, 0x68, 0x71, 0x0, 0x0, 0x0, 0x88, 0x71, 0x0, 0x0, 0x0, 0xA8, 0x71, 0x0, 0x0, 0x0, 0xC8, 0x71, 0x0, 0x0, 0x0, 0xE8, 0x71, 0x0, 0x0, 0x0, 0x8, 0x72, 0x0, 0x0, 0x0, 0x28, 0x72, 0x0, 0x0, 0x0, 0x48, 0x72, 0x0, 0x0, 0x0, 0x68, 0x72, 0x0, 0x0, 0x0, 0x88, 0x72, 0x0, 0x0, 0x0, 0xA8, 0x72, 0x0, 0x0, 0x0, 0xC8, 0x72, 0x0, 0x0, 0x0, 0xE8, 0x72, 0x0, 0x0, 0x0, 0x8, 0x73, 0x0, 0x0, 0x0, 0x28, 0x73, 0x0, 0x0, 0x0, 0x48, 0x73, 0x0, 0x0, 0x0, 0x68, 0x73, 0x0, 0x0, 0x0, 0x88, 0x73, 0x0, 0x0, 0x0, 0xA8, 0x73, 0x0, 0x0, 0x0, 0xC8, 0x73, 0x0, 0x0, 0x0, 0xE8, 0x73, 0x0, 0x0, 0x0, 0x8, 0x74, 0x0, 0x0, 0x0, 0x28, 0x74, 0x0, 0x0, 0x0, 0x48, 0x74, 0x0, 0x0, 0x0, 0x68, 0x74, 0x0, 0x0, 0x0, 0x88, 0x74, 0x0, 0x0, 0x0, 0xA8, 0x74, 0x0, 0x0, 0x0, 0xC8, 0x74, 0x0, 0x0, 0x0, 0xE8, 0x74, 0x0, 0x0, 0x0, 0x8, 0x75, 0x0, 0x0, 0x0, 0x28, 0x75, 0x0, 0x0, 0x0, 0x48, 0x75, 0x0, 0x0, 0x0, 0x68, 0x75, 0x0, 0x0, 0x0, 0x88, 0x75, 0x0, 0x0, 0x0, 0xA8, 0x75, 0x0, 0x0, 0x0, 0xC8, 0x75, 0x0, 0x0, 0x0, 0xE8, 0x75, 0x0, 0x0, 0x0, 0x8, 0x76, 0x0, 0x0, 0x0, 0x28, 0x76, 0x0, 0x0, 0x0, 0x48, 0x76, 0x0, 0x0, 0x0, 0x68, 0x76, 0x0, 0x0, 0x0, 0x88, 0x76, 0x0, 0x0, 0x0, 0xA8, 0x76, 0x0, 0x0, 0x0, 0xC8, 0x76, 0x0, 0x0, 0x0, 0xE8, 0x76, 0x0, 0x0, 0x0, 0x8, 0x77, 0x0, 0x0, 0x0, 0x28, 0x77, 0x0, 0x0, 0x0, 0x48, 0x77, 0x0, 0x0, 0x0, 0x68, 0x77, 0x0, 0x0, 0x0, 0x88, 0x77, 0x0, 0x0, 0x0, 0xA8, 0x77, 0x0, 0x0, 0x0, 0xC8, 0x77, 0x0, 0x0, 0x0, 0xE8, 0x77, 0x0, 0x0, 0x0, 0x8, 0x78, 0x0, 0x0, 0x0, 0x28, 0x78, 0x0, 0x0, 0x0, 0x48, 0x78, 0x0, 0x0, 0x0, 0x68, 0x78, 0x0, 0x0, 0x0, 0x88, 0x78, 0x0, 0x0, 0x0, 0xA8, 0x78, 0x0, 0x0, 0x0, 0xC8, 0x78, 0x0, 0x0, 0x0, 0xE8, 0x78, 0x0, 0x0, 0x0, 0x8, 0x79, 0x0, 0x0, 0x0, 0x28, 0x79, 0x0, 0x0, 0x0, 0x48, 0x79, 0x0, 0x0, 0x0, 0x68, 0x79, 0x0, 0x0, 0x0, 0x88, 0x79, 0x0, 0x0, 0x0, 0xA8, 0x79, 0x0, 0x0, 0x0, 0xC8, 0x79, 0x0, 0x0, 0x0, 0xE8, 0x79, 0x0, 0x0, 0x0, 0x8, 0x7A, 0x0, 0x0, 0x0, 0x28, 0x7A, 0x0, 0x0, 0x0, 0x48, 0x7A, 0x0, 0x0, 0x0, 0x68, 0x7A, 0x0, 0x0, 0x0, 0x88, 0x7A, 0x0, 0x0, 0x0, 0xA8, 0x7A, 0x0, 0x0, 0x0, 0xC8, 0x7A, 0x0, 0x0, 0x0, 0xE8, 0x7A, 0x0, 0x0, 0x0, 0x8, 0x7B, 0x0, 0x0, 0x0, 0x28, 0x7B, 0x0, 0x0, 0x0, 0x48, 0x7B, 0x0, 0x0, 0x0, 0x68, 0x7B, 0x0, 0x0, 0x0, 0x88, 0x7B, 0x0, 0x0, 0x0, 0xA8, 0x7B, 0x0, 0x0, 0x0, 0xC8, 0x7B, 0x0, 0x0, 0x0, 0xE8, 0x7B, 0x0, 0x0, 0x0, 0x8, 0x7C, 0x0, 0x0, 0x0, 0x28, 0x7C, 0x0, 0x0, 0x0, 0x48, 0x7C, 0x0, 0x0, 0x0, 0x68, 0x7C, 0x0, 0x0, 0x0, 0x88, 0x7C, 0x0, 0x0, 0x0, 0xA8, 0x7C, 0x0, 0x0, 0x0, 0xC8, 0x7C, 0x0, 0x0, 0x0, 0xE8, 0x7C, 0x0, 0x0, 0x0, 0x8, 0x7D, 0x0, 0x0, 0x0, 0x28, 0x7D, 0x0, 0x0, 0x0, 0x48, 0x7D, 0x0, 0x0, 0x0, 0x68, 0x7D, 0x0, 0x0, 0x0, 0x88, 0x7D, 0x0, 0x0, 0x0, 0xA8, 0x7D, 0x0, 0x0, 0x0, 0xC8, 0x7D, 0x0, 0x0, 0x0, 0xE8, 0x7D, 0x0, 0x0, 0x0, 0x8, 0x7E, 0x0, 0x0, 0x0, 0x28, 0x7E, 0x0, 0x0, 0x0, 0x48, 0x7E, 0x0, 0x0, 0x0, 0x68, 0x7E, 0x0, 0x0, 0x0, 0x88, 0x7E, 0x0, 0x0, 0x0, 0xA8, 0x7E, 0x0, 0x0, 0x0, 0xC8, 0x7E, 0x0, 0x0, 0x0, 0xE8, 0x7E, 0x0, 0x0, 0x0, 0x8, 0x7F, 0x0, 0x0, 0x0, 0x28, 0x7F, 0x0, 0x0, 0x0, 0x48, 0x7F, 0x0, 0x0, 0x0, 0x68, 0x7F, 0x0, 0x0, 0x0, 0x88, 0x7F, 0x0, 0x0, 0x0, 0xA8, 0x7F, 0x0, 0x0, 0x0, 0xC8, 0x7F, 0x0, 0x0, 0x0, 0xE8, 0x7F, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0x28, 0x80, 0x0, 0x0, 0x0, 0x48, 0x80, 0x0, 0x0, 0x0, 0x68, 0x80, 0x0, 0x0, 0x0, 0x88, 0x80, 0x0, 0x0, 0x0, 0xA8, 0x80, 0x0, 0x0, 0x0, 0xC8, 0x80, 0x0, 0x0, 0x0, 0xE8, 0x80, 0x0, 0x0, 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x28, 0x81, 0x0, 0x0, 0x0, 0x48, 0x81, 0x0, 0x0, 0x0, 0x68, 0x81, 0x0, 0x0, 0x0, 0x88, 0x81, 0x0, 0x0, 0x0, 0xA8, 0x81, 0x0, 0x0, 0x0, 0xC8, 0x81, 0x0, 0x0, 0x0, 0xE8, 0x81, 0x0, 0x0, 0x0, 0x8, 0x82, 0x0, 0x0, 0x0, 0x28, 0x82, 0x0, 0x0, 0x0, 0x48, 0x82, 0x0, 0x0, 0x0, 0x68, 0x82, 0x0, 0x0, 0x0, 0x88, 0x82, 0x0, 0x0, 0x0, 0xA8, 0x82, 0x0, 0x0, 0x0, 0xC8, 0x82, 0x0, 0x0, 0x0, 0xE8, 0x82, 0x0, 0x0, 0x0, 0x8, 0x83, 0x0, 0x0, 0x0, 0x28, 0x83, 0x0, 0x0, 0x0, 0x48, 0x83, 0x0, 0x0, 0x0, 0x68, 0x83, 0x0, 0x0, 0x0, 0x88, 0x83, 0x0, 0x0, 0x0, 0xA8, 0x83, 0x0, 0x0, 0x0, 0x8, 0x0, 0x38, 0x20, 0x0, 0xC8, 0x83, 0x0, 0x0, 0x0, 0xE8, 0x83, 0x0, 0x0, 0x0, 0x8, 0x84, 0x0, 0x0, 0x0, 0x28, 0x84, 0x0, 0x0, 0x0, 0x48, 0x84, 0x0, 0x0, 0x0, 0x68, 0x84, 0x0, 0x0, 0x0, 0x88, 0x84, 0x0, 0x0, 0x0, 0xA8, 0x84, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x1E, 0x0, 0x8, 0x0, 0x10, 0x20, 0x0, 0x8, 0x0, 0xE0, 0x1E, 0x0, 0x8, 0x0, 0x30, 0x21, 0x0, 0x8, 0x0, 0x38, 0x21, 0x0, 0x8, 0x0, 0x40, 0x21, 0x0, 0x8, 0x0, 0x48, 0x21, 0x0, 0x8, 0x0, 0x50, 0x21, 0x0, 0x68, 0x85, 0x0, 0x0, 0x0, 0x88, 0x85, 0x0, 0x0, 0x0, 0xA8, 0x85, 0x0, 0x0, 0x0, 0xC8, 0x85, 0x0, 0x0, 0x0, 0xE8, 0x85, 0x0, 0x0, 0x0, 0x8, 0x86, 0x0, 0x0, 0x0, 0x28, 0x86, 0x0, 0x0, 0x0, 0x48, 0x86, 0x0, 0x0, 0x0, 0x68, 0x86, 0x0, 0x0, 0x0, 0x88, 0x86, 0x0, 0x0, 0x0, 0xA8, 0x86, 0x0, 0x0, 0x0, 0xC8, 0x86, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB8, 0x21, 0x0, 0x8, 0x87, 0x0, 0x0, 0x0, 0x28, 0x87, 0x0, 0x0, 0x0, 0x48, 0x87, 0x0, 0x0, 0x0, 0x68, 0x87, 0x0, 0x0, 0x0, 0x88, 0x87, 0x0, 0x0, 0x0, 0xA8, 0x87, 0x0, 0x0, 0x0, 0xC8, 0x87, 0x0, 0x0, 0x0, 0xE8, 0x87, 0x0, 0x0, 0x0, 0x8, 0x88, 0x0, 0x0, 0x0, 0x28, 0x88, 0x0, 0x0, 0x0, 0x48, 0x88, 0x0, 0x0, 0x0, 0x68, 0x88, 0x0, 0x0, 0x0, 0x88, 0x88, 0x0, 0x0, 0x0, 0xA8, 0x88, 0x0, 0x0, 0x0, 0xC8, 0x88, 0x0, 0x0, 0x0, 0xE8, 0x88, 0x0, 0x0, 0x0, 0x8, 0x89, 0x0, 0x0, 0x0, 0x28, 0x89, 0x0, 0x0, 0x0, 0x48, 0x89, 0x0, 0x0, 0x0, 0x68, 0x89, 0x0, 0x0, 0x0, 0x88, 0x89, 0x0, 0x0, 0x0, 0xA8, 0x89, 0x0, 0x0, 0x0, 0xC8, 0x89, 0x0, 0x0, 0x0, 0xE8, 0x89, 0x0, 0x0, 0x0, 0x8, 0x8A, 0x0, 0x0, 0x0, 0x28, 0x8A, 0x0, 0x0, 0x0, 0x48, 0x8A, 0x0, 0x0, 0x0, 0x68, 0x8A, 0x0, 0x0, 0x0, 0x88, 0x8A, 0x0, 0x0, 0x0, 0xA8, 0x8A, 0x0, 0x0, 0x0, 0xC8, 0x8A, 0x0, 0x0, 0x0, 0xE8, 0x8A, 0x0, 0x0, 0x0, 0x8, 0x8B, 0x0, 0x0, 0x0, 0x28, 0x8B, 0x0, 0x0, 0x0, 0x48, 0x8B, 0x0, 0x0, 0x0, 0x68, 0x8B, 0x0, 0x0, 0x0, 0x88, 0x8B, 0x0, 0x0, 0x0, 0xA8, 0x8B, 0x0, 0x0, 0x0, 0xC8, 0x8B, 0x0, 0x0, 0x0, 0xE8, 0x8B, 0x0, 0x0, 0x0, 0x8, 0x8C, 0x0, 0x0, 0x0, 0x28, 0x8C, 0x0, 0x0, 0x0, 0x48, 0x8C, 0x0, 0x0, 0x0, 0x68, 0x8C, 0x0, 0x0, 0x0, 0x88, 0x8C, 0x0, 0x0, 0x0, 0xA8, 0x8C, 0x0, 0x0, 0x0, 0x8, 0x0, 0x90, 0x21, 0x0, 0x8, 0x0, 0x98, 0x21, 0x0, 0x8, 0x0, 0xA0, 0x21, 0x0, 0x8, 0x0, 0x30, 0x23, 0x0, 0x8, 0x0, 0xA8, 0x21, 0x0, 0x8, 0x0, 0xB0, 0x21, 0x0, 0x8, 0x0, 0x38, 0x23, 0x0, 0x8, 0x0, 0x40, 0x23, 0x0, 0x8, 0x0, 0x48, 0x23, 0x0, 0x8, 0x0, 0x50, 0x23, 0x0, 0x8, 0x0, 0xC8, 0x21, 0x0, 0x8, 0x0, 0xD0, 0x21, 0x0, 0x8, 0x0, 0xD8, 0x21, 0x0, 0x8, 0x0, 0xE0, 0x21, 0x0, 0x8, 0x0, 0x8, 0x22, 0x0, 0x8, 0x0, 0x10, 0x22, 0x0, 0x8, 0x0, 0x18, 0x22, 0x0, 0x8, 0x0, 0x20, 0x22, 0x0, 0x8, 0x0, 0x28, 0x22, 0x0, 0x8, 0x0, 0x30, 0x22, 0x0, 0x8, 0x0, 0x38, 0x22, 0x0, 0x8, 0x0, 0x40, 0x22, 0x0, 0x8, 0x0, 0x48, 0x22, 0x0, 0x8, 0x0, 0x50, 0x22, 0x0, 0x8, 0x0, 0x58, 0x22, 0x0, 0x8, 0x0, 0x60, 0x22, 0x0, 0x8, 0x0, 0x68, 0x22, 0x0, 0x8, 0x0, 0x70, 0x22, 0x0, 0x8, 0x0, 0x78, 0x22, 0x0, 0x8, 0x0, 0x80, 0x22, 0x0, 0x8, 0x0, 0x88, 0x22, 0x0, 0x8, 0x0, 0x90, 0x22, 0x0, 0x8, 0x0, 0x98, 0x22, 0x0, 0x8, 0x0, 0xA0, 0x22, 0x0, 0x8, 0x0, 0xA8, 0x22, 0x0, 0x8, 0x0, 0xB0, 0x22, 0x0, 0x8, 0x0, 0xB8, 0x22, 0x0, 0x68, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF8, 0x1E, 0x0, 0x88, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x58, 0x1F, 0x0, 0xA8, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x78, 0x1F, 0x0, 0xC8, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x88, 0x1F, 0x0, 0xE8, 0x8D, 0x0, 0x0, 0x0, 0x8, 0x0, 0x98, 0x1F, 0x0, 0x8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xA8, 0x1F, 0x0, 0x28, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB8, 0x1F, 0x0, 0x48, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC8, 0x1F, 0x0, 0x68, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xD0, 0x1C, 0x0, 0x88, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE0, 0x1C, 0x0, 0xA8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x1C, 0x0, 0xC8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1D, 0x0, 0xE8, 0x8E, 0x0, 0x0, 0x0, 0x8, 0x0, 0x10, 0x1D, 0x0, 0x8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x20, 0x1D, 0x0, 0x28, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x30, 0x1D, 0x0, 0x48, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x40, 0x1D, 0x0, 0x68, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x50, 0x1D, 0x0, 0x88, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x60, 0x1D, 0x0, 0xA8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x70, 0x1D, 0x0, 0xC8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x80, 0x1D, 0x0, 0xE8, 0x8F, 0x0, 0x0, 0x0, 0x8, 0x0, 0x90, 0x1D, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xA0, 0x1D, 0x0, 0x28, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB0, 0x1D, 0x0, 0x48, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC0, 0x1D, 0x0, 0x68, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xD0, 0x1D, 0x0, 0x88, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE0, 0x1D, 0x0, 0xA8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x1D, 0x0, 0xC8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1E, 0x0, 0xE8, 0x90, 0x0, 0x0, 0x0, 0x8, 0x0, 0x10, 0x1E, 0x0, 0x8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x20, 0x1E, 0x0, 0x28, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x30, 0x1E, 0x0, 0x48, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x40, 0x1E, 0x0, 0x68, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x50, 0x1E, 0x0, 0x88, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x60, 0x1E, 0x0, 0xA8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x70, 0x1E, 0x0, 0xC8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x80, 0x1E, 0x0, 0xE8, 0x91, 0x0, 0x0, 0x0, 0x8, 0x0, 0x90, 0x1E, 0x0, 0x8, 0x92, 0x0, 0x0, 0x0, 0x8, 0x0, 0xA0, 0x1E, 0x0, 0x28, 0x92, 0x0, 0x0, 0x0, 0x8, 0x0, 0xB0, 0x1E, 0x0, 0x48, 0x92, 0x0, 0x0, 0x0, 0x8, 0x0, 0xC0, 0x1E, 0x0, 0x8, 0x0, 0x98, 0x24, 0x0, 0x8, 0x0, 0xA0, 0x24, 0x0, 0x8, 0x0, 0xA8, 0x24, 0x0, 0x8, 0x0, 0xB0, 0x24, 0x0, 0x8, 0x0, 0xB8, 0x24, 0x0, 0x8, 0x0, 0xC0, 0x24, 0x0, 0x8, 0x0, 0xC8, 0x24, 0x0, 0x8, 0x0, 0xD0, 0x24, 0x0, 0x8, 0x0, 0xD8, 0x24, 0x0, 0x8, 0x0, 0xE0, 0x24, 0x0, 0x8, 0x0, 0xE8, 0x24, 0x0, 0x8, 0x0, 0xF0, 0x24, 0x0, 0x8, 0x0, 0xF8, 0x24, 0x0, 0x8, 0x0, 0x0, 0x25, 0x0, 0x8, 0x0, 0x8, 0x25, 0x0, 0x8, 0x0, 0x10, 0x25, 0x0, 0x8, 0x0, 0x18, 0x25, 0x0, 0x8, 0x0, 0x20, 0x25, 0x0, 0x8, 0x0, 0x28, 0x25, 0x0, 0x8, 0x0, 0xF8, 0x20, 0x0, 0x8, 0x0, 0x30, 0x25, 0x0, 0x8, 0x0, 0x0, 0x21, 0x0, 0x8, 0x0, 0x8, 0x21, 0x0, 0x8, 0x0, 0x10, 0x21, 0x0, 0x8, 0x0, 0x18, 0x21, 0x0, 0x8, 0x0, 0x20, 0x21, 0x0, 0x8, 0x0, 0x28, 0x21, 0x0, 0x8, 0x0, 0x38, 0x25, 0x0, 0x8, 0x0, 0x40, 0x25, 0x0, 0x8, 0x0, 0x48, 0x25, 0x0, 0x8, 0x0, 0x50, 0x25, 0x0, 0x8, 0x0, 0x58, 0x25, 0x0, 0x8, 0x0, 0x58, 0x21, 0x0, 0x8, 0x0, 0x60, 0x21, 0x0, 0x8, 0x0, 0x68, 0x21, 0x0, 0x8, 0x0, 0x70, 0x21, 0x0, 0x8, 0x0, 0x78, 0x21, 0x0, 0x8, 0x0, 0x80, 0x21, 0x0, 0x8, 0x0, 0x88, 0x21, 0x0, 0x8, 0x0, 0x50, 0x20, 0x0, 0x8, 0x0, 0x60, 0x25, 0x0, 0x8, 0x0, 0x58, 0x20, 0x0, 0x8, 0x0, 0x68, 0x25, 0x0, 0x8, 0x0, 0x70, 0x25, 0x0, 0x8, 0x0, 0x78, 0x25, 0x0, 0x8, 0x0, 0xC8, 0x20, 0x0, 0x8, 0x0, 0x80, 0x25, 0x0, 0x8, 0x0, 0x88, 0x25, 0x0, 0x8, 0x0, 0x90, 0x25, 0x0, 0x8, 0x0, 0x98, 0x25, 0x0, 0x8, 0x0, 0xC0, 0x20, 0x0, 0x8, 0x0, 0xA0, 0x25, 0x0, 0x8, 0x0, 0xA8, 0x25, 0x0, 0x8, 0x0, 0xB0, 0x25, 0x0, 0x8, 0x0, 0xB8, 0x25, 0x0, 0x8, 0x0, 0xC0, 0x25, 0x0, 0x8, 0x0, 0xC8, 0x25, 0x0, 0x8, 0x0, 0xD0, 0x25, 0x0, 0x8, 0x0, 0xD8, 0x25, 0x0, 0x8, 0x0, 0x60, 0x20, 0x0, 0x8, 0x0, 0xE0, 0x25, 0x0, 0x8, 0x0, 0xE8, 0x25, 0x0, 0x8, 0x0, 0xF0, 0x25, 0x0, 0x8, 0x0, 0xF8, 0x25, 0x0, 0x8, 0x0, 0x0, 0x26, 0x0, 0x8, 0x0, 0x8, 0x26, 0x0, 0x8, 0x0, 0x10, 0x26, 0x0, 0x8, 0x0, 0x18, 0x26, 0x0, 0x8, 0x0, 0x20, 0x26, 0x0, 0x8, 0x0, 0x28, 0x26, 0x0, 0x8, 0x0, 0x30, 0x26, 0x0, 0x8, 0x0, 0x38, 0x26, 0x0, 0x8, 0x0, 0x40, 0x26, 0x0, 0x8, 0x0, 0x48, 0x26, 0x0, 0x8, 0x0, 0x50, 0x26, 0x0, 0x8, 0x0, 0x58, 0x26, 0x0, 0x8, 0x0, 0x60, 0x26, 0x0, 0x8, 0x0, 0x68, 0x26, 0x0, 0x8, 0x0, 0x70, 0x26, 0x0, 0x8, 0x0, 0x78, 0x26, 0x0, 0x8, 0x0, 0x80, 0x26, 0x0, 0x8, 0x0, 0x88, 0x26, 0x0, 0x8, 0x0, 0x90, 0x26, 0x0, 0x8, 0x0, 0x98, 0x26, 0x0, 0x8, 0x0, 0xA0, 0x26, 0x0, 0x8, 0x0, 0xA8, 0x26, 0x0, 0x8, 0x0, 0xB0, 0x26, 0x0, 0x8, 0x0, 0xB8, 0x26, 0x0, 0x8, 0x0, 0xC0, 0x26, 0x0, 0x8, 0x0, 0xC8, 0x26, 0x0, 0x8, 0x0, 0xD0, 0x26, 0x0, 0x8, 0x0, 0xD8, 0x26, 0x0, 0x8, 0x0, 0xE0, 0x26, 0x0, 0x8, 0x0, 0xE8, 0x26, 0x0, 0x8, 0x0, 0xF0, 0x26, 0x0, 0x8, 0x0, 0xF8, 0x26, 0x0, 0x8, 0x0, 0x0, 0x27, 0x0, 0x8, 0x0, 0x8, 0x27, 0x0, 0x8, 0x0, 0x10, 0x27, 0x0, 0x8, 0x0, 0x18, 0x27, 0x0, 0x8, 0x0, 0x20, 0x27, 0x0, 0x8, 0x0, 0x28, 0x27, 0x0, 0x8, 0x0, 0x30, 0x27, 0x0, 0x8, 0x0, 0x38, 0x27, 0x0, 0x8, 0x0, 0x40, 0x27, 0x0, 0x8, 0x0, 0x48, 0x27, 0x0, 0x8, 0x0, 0x50, 0x27, 0x0, 0x8, 0x0, 0x58, 0x27, 0x0, 0x8, 0x0, 0x60, 0x27, 0x0, 0x8, 0x0, 0x68, 0x27, 0x0, 0x8, 0x0, 0x70, 0x27, 0x0, 0x8, 0x0, 0x78, 0x27, 0x0, 0x8, 0x0, 0x80, 0x27, 0x0, 0x8, 0x0, 0x88, 0x27, 0x0, 0x8, 0x0, 0x90, 0x27, 0x0, 0x8, 0x0, 0x98, 0x27, 0x0, 0x8, 0x0, 0xA0, 0x27, 0x0, 0x8, 0x0, 0xA8, 0x27, 0x0, 0x8, 0x0, 0xB0, 0x27, 0x0, 0x8, 0x0, 0xB8, 0x27, 0x0, 0x8, 0x0, 0xC0, 0x27, 0x0, 0x8, 0x0, 0xC8, 0x27, 0x0, 0x8, 0x0, 0xD0, 0x27, 0x0, 0x8, 0x0, 0xD8, 0x27, 0x0, 0x8, 0x0, 0xE0, 0x27, 0x0, 0x8, 0x0, 0xE8, 0x27, 0x0, 0x8, 0x0, 0xF0, 0x27, 0x0, 0x8, 0x0, 0xF8, 0x27, 0x0, 0x8, 0x0, 0x0, 0x28, 0x0, 0x8, 0x0, 0x8, 0x28, 0x0, 0x8, 0x0, 0x10, 0x28, 0x0, 0x8, 0x0, 0x18, 0x28, 0x0, 0x8, 0x0, 0x20, 0x28, 0x0, 0x8, 0x0, 0x28, 0x28, 0x0, 0x8, 0x0, 0x30, 0x28, 0x0, 0x8, 0x0, 0x38, 0x28, 0x0, 0x8, 0xA1, 0x0, 0x0, 0x0, 0x28, 0xA1, 0x0, 0x0, 0x0, 0x48, 0xA1, 0x0, 0x0, 0x0, 0x68, 0xA1, 0x0, 0x0, 0x0, 0x88, 0xA1, 0x0, 0x0, 0x0, 0xA8, 0xA1, 0x0, 0x0, 0x0, 0xC8, 0xA1, 0x0, 0x0, 0x0, 0xE8, 0xA1, 0x0, 0x0, 0x0, 0x8, 0xA2, 0x0, 0x0, 0x0, 0x28, 0xA2, 0x0, 0x0, 0x0, 0x48, 0xA2, 0x0, 0x0, 0x0, 0x68, 0xA2, 0x0, 0x0, 0x0, 0x88, 0xA2, 0x0, 0x0, 0x0, 0xA8, 0xA2, 0x0, 0x0, 0x0, 0xC8, 0xA2, 0x0, 0x0, 0x0, 0xE8, 0xA2, 0x0, 0x0, 0x0, 0x8, 0xA3, 0x0, 0x0, 0x0, 0x28, 0xA3, 0x0, 0x0, 0x0, 0x48, 0xA3, 0x0, 0x0, 0x0, 0x8, 0x0, 0xD8, 0x28, 0x0, 0x88, 0xA3, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE8, 0x28, 0x0, 0xC8, 0xA3, 0x0, 0x0, 0x0, 0xE8, 0xA3, 0x0, 0x0, 0x0, 0x8, 0xA4, 0x0, 0x0, 0x0, 0x28, 0xA4, 0x0, 0x0, 0x0, 0x48, 0xA4, 0x0, 0x0, 0x0, 0x88, 0x41, 0x0, 0x0, 0x0, 0xA8, 0x41, 0x0, 0x0, 0x0, 0x68, 0xA4, 0x0, 0x0, 0x0, 0x88, 0xA4, 0x0, 0x0, 0x0, 0xA8, 0xA4, 0x0, 0x0, 0x0, 0xC8, 0xA4, 0x0, 0x0, 0x0, 0xE8, 0xA4, 0x0, 0x0, 0x0, 0x8, 0xA5, 0x0, 0x0, 0x0, 0x28, 0xA5, 0x0, 0x0, 0x0, 0x48, 0xA5, 0x0, 0x0, 0x0, 0x68, 0xA5, 0x0, 0x0, 0x0, 0x88, 0xA5, 0x0, 0x0, 0x0, 0xA8, 0xA5, 0x0, 0x0, 0x0, 0xC8, 0xA5, 0x0, 0x0, 0x0, 0xE8, 0xA5, 0x0, 0x0, 0x0, 0x8, 0xA6, 0x0, 0x0, 0x0, 0x28, 0xA6, 0x0, 0x0, 0x0, 0x48, 0xA6, 0x0, 0x0, 0x0, 0x68, 0xA6, 0x0, 0x0, 0x0, 0x88, 0xA6, 0x0, 0x0, 0x0, 0xA8, 0xA6, 0x0, 0x0, 0x0, 0xC8, 0xA6, 0x0, 0x0, 0x0, 0xE8, 0xA6, 0x0, 0x0, 0x0, 0x8, 0xA7, 0x0, 0x0, 0x0, 0x28, 0xA7, 0x0, 0x0, 0x0, 0x48, 0xA7, 0x0, 0x0, 0x0, 0x68, 0xA7, 0x0, 0x0, 0x0, 0x88, 0xA7, 0x0, 0x0, 0x0, 0xA8, 0xA7, 0x0, 0x0, 0x0, 0xC8, 0xA7, 0x0, 0x0, 0x0, 0xE8, 0xA7, 0x0, 0x0, 0x0, 0x8, 0xA8, 0x0, 0x0, 0x0, 0x28, 0xA8, 0x0, 0x0, 0x0, 0x48, 0xA8, 0x0, 0x0, 0x0, 0x68, 0xA8, 0x0, 0x0, 0x0, 0x88, 0xA8, 0x0, 0x0, 0x0, 0xA8, 0xA8, 0x0, 0x0, 0x0, 0xC8, 0xA8, 0x0, 0x0, 0x0, 0xE8, 0xA8, 0x0, 0x0, 0x0, 0x8, 0xA9, 0x0, 0x0, 0x0, 0x28, 0xA9, 0x0, 0x0, 0x0, 0x48, 0xA9, 0x0, 0x0, 0x0, 0x68, 0xA9, 0x0, 0x0, 0x0, 0x88, 0xA9, 0x0, 0x0, 0x0, 0xA8, 0xA9, 0x0, 0x0, 0x0, 0xC8, 0xA9, 0x0, 0x0, 0x0, 0xE8, 0xA9, 0x0, 0x0, 0x0, 0x8, 0xAA, 0x0, 0x0, 0x0, 0x28, 0xAA, 0x0, 0x0, 0x0, 0x48, 0xAA, 0x0, 0x0, 0x0, 0x68, 0xAA, 0x0, 0x0, 0x0, 0x88, 0xAA, 0x0, 0x0, 0x0, 0xA8, 0xAA, 0x0, 0x0, 0x0, 0xC8, 0xAA, 0x0, 0x0, 0x0, 0xE8, 0xAA, 0x0, 0x0, 0x0, 0x8, 0xAB, 0x0, 0x0, 0x0, 0x28, 0xAB, 0x0, 0x0, 0x0, 0x48, 0xAB, 0x0, 0x0, 0x0, 0x68, 0xAB, 0x0, 0x0, 0x0, 0x88, 0xAB, 0x0, 0x0, 0x0, 0xA8, 0xAB, 0x0, 0x0, 0x0, 0xC8, 0xAB, 0x0, 0x0, 0x0, 0xE8, 0xAB, 0x0, 0x0, 0x0, 0x8, 0xAC, 0x0, 0x0, 0x0, 0x28, 0xAC, 0x0, 0x0, 0x0, 0x48, 0xAC, 0x0, 0x0, 0x0, 0x68, 0xAC, 0x0, 0x0, 0x0, 0x88, 0xAC, 0x0, 0x0, 0x0, 0xA8, 0xAC, 0x0, 0x0, 0x0, 0xC8, 0xAC, 0x0, 0x0, 0x0, 0xE8, 0xAC, 0x0, 0x0, 0x0, 0x8, 0xAD, 0x0, 0x0, 0x0, 0x28, 0xAD, 0x0, 0x0, 0x0, 0x48, 0xAD, 0x0, 0x0, 0x0, 0x68, 0xAD, 0x0, 0x0, 0x0, 0x88, 0xAD, 0x0, 0x0, 0x0, 0xA8, 0xAD, 0x0, 0x0, 0x0, 0xC8, 0xAD, 0x0, 0x0, 0x0, 0xE8, 0xAD, 0x0, 0x0, 0x0, 0x8, 0xAE, 0x0, 0x0, 0x0, 0x28, 0xAE, 0x0, 0x0, 0x0, 0x48, 0xAE, 0x0, 0x0, 0x0, 0x68, 0xAE, 0x0, 0x0, 0x0, 0x88, 0xAE, 0x0, 0x0, 0x0, 0xA8, 0xAE, 0x0, 0x0, 0x0, 0xC8, 0xAE, 0x0, 0x0, 0x0, 0xE8, 0xAE, 0x0, 0x0, 0x0, 0x8, 0xAF, 0x0, 0x0, 0x0, 0x28, 0xAF, 0x0, 0x0, 0x0, 0x48, 0xAF, 0x0, 0x0, 0x0, 0x68, 0xAF, 0x0, 0x0, 0x0, 0x88, 0xAF, 0x0, 0x0, 0x0, 0xA8, 0xAF, 0x0, 0x0, 0x0, 0x8, 0x0, 0xF0, 0x2B, 0x0, 0x8, 0x0, 0xF8, 0x2B, 0x0, 0x8, 0x0, 0x0, 0x2C, 0x0, 0x8, 0x0, 0x8, 0x2C, 0x0, 0x8, 0x0, 0x10, 0x2C, 0x0, 0x8, 0x0, 0x18, 0x2C, 0x0, 0x8, 0x0, 0x20, 0x2C, 0x0, 0x8, 0x0, 0x28, 0x2C, 0x0, 0x8, 0x0, 0x30, 0x2C, 0x0, 0x8, 0x0, 0x38, 0x2C, 0x0, 0x8, 0x0, 0x40, 0x2C, 0x0, 0x8, 0x0, 0x48, 0x2C, 0x0, 0x8, 0x0, 0x50, 0x2C, 0x0, 0x8, 0x0, 0xD8, 0x1D, 0x0, 0x8, 0x0, 0xE8, 0x21, 0x0, 0x8, 0x0, 0x58, 0x2C, 0x0, 0x8, 0x0, 0x60, 0x2C, 0x0, 0x8, 0x0, 0x68, 0x2C, 0x0, 0x8, 0x0, 0x70, 0x2C, 0x0, 0x8, 0x0, 0x78, 0x2C, 0x0, 0x8, 0x0, 0x80, 0x2C, 0x0, 0x8, 0x0, 0x0, 0x22, 0x0, 0x8, 0x0, 0xC0, 0x22, 0x0, 0x8, 0x0, 0xC8, 0x22, 0x0, 0x8, 0x0, 0xD0, 0x22, 0x0, 0x8, 0x0, 0xD8, 0x22, 0x0, 0x8, 0x0, 0xE0, 0x22, 0x0, 0x8, 0x0, 0xE8, 0x22, 0x0, 0x8, 0x0, 0xF0, 0x22, 0x0, 0x8, 0x0, 0x88, 0x2C, 0x0, 0x8, 0x0, 0xF8, 0x22, 0x0, 0x8, 0x0, 0x0, 0x23, 0x0, 0x8, 0x0, 0x8, 0x23, 0x0, 0x8, 0x0, 0x10, 0x23, 0x0, 0x8, 0x0, 0x18, 0x23, 0x0, 0x8, 0x0, 0x20, 0x23, 0x0, 0x8, 0x0, 0x28, 0x23, 0x0, 0x8, 0x0, 0x90, 0x2C, 0x0, 0x8, 0x0, 0x98, 0x2C, 0x0, 0x8, 0x0, 0xA0, 0x2C, 0x0, 0x8, 0x0, 0xA8, 0x2C, 0x0, 0x8, 0x0, 0xB0, 0x2C, 0x0, 0x8, 0x0, 0xB8, 0x2C, 0x0, 0x8, 0x0, 0xC0, 0x2C, 0x0, 0x8, 0x0, 0xC8, 0x2C, 0x0, 0x8, 0x0, 0xD0, 0x2C, 0x0, 0x8, 0x0, 0xD8, 0x2C, 0x0, 0x8, 0x0, 0xE0, 0x2C, 0x0, 0x8, 0x0, 0xE8, 0x2C, 0x0, 0x8, 0x0, 0xF0, 0x2C, 0x0, 0x8, 0x0, 0xF8, 0x2C, 0x0, 0x8, 0x0, 0x0, 0x2D, 0x0, 0x8, 0x0, 0x8, 0x2D, 0x0, 0x8, 0x0, 0x10, 0x2D, 0x0, 0x8, 0x0, 0x18, 0x2D, 0x0, 0x8, 0x0, 0x20, 0x2D, 0x0, 0x8, 0x0, 0x28, 0x2D, 0x0, 0x8, 0x0, 0x30, 0x2D, 0x0, 0x8, 0x0, 0x38, 0x2D, 0x0, 0x8, 0x0, 0x40, 0x2D, 0x0, 0x8, 0x0, 0x48, 0x2D, 0x0, 0x8, 0x0, 0x50, 0x2D, 0x0, 0x8, 0x0, 0x58, 0x2D, 0x0, 0x8, 0x0, 0x60, 0x2D, 0x0, 0x8, 0x0, 0x68, 0x2D, 0x0, 0x8, 0x0, 0x70, 0x2D, 0x0, 0x8, 0x0, 0x78, 0x2D, 0x0, 0x8, 0x0, 0x80, 0x2D, 0x0, 0x8, 0x0, 0xD8, 0x1C, 0x0, 0x8, 0x0, 0xE8, 0x1C, 0x0, 0x8, 0x0, 0xF8, 0x1C, 0x0, 0x8, 0x0, 0x8, 0x1D, 0x0, 0x8, 0x0, 0x18, 0x1D, 0x0, 0x8, 0x0, 0x28, 0x1D, 0x0, 0x8, 0x0, 0x38, 0x1D, 0x0, 0x8, 0x0, 0x48, 0x1D, 0x0, 0x8, 0x0, 0x58, 0x1D, 0x0, 0x8, 0x0, 0x68, 0x1D, 0x0, 0x8, 0x0, 0x78, 0x1D, 0x0, 0x8, 0x0, 0x88, 0x1D, 0x0, 0x8, 0x0, 0x98, 0x1D, 0x0, 0x8, 0x0, 0xA8, 0x1D, 0x0, 0x8, 0x0, 0xB8, 0x1D, 0x0, 0x8, 0x0, 0xC8, 0x1D, 0x0, 0x8, 0x0, 0xD0, 0x1E, 0x0, 0x8, 0x0, 0xE8, 0x1D, 0x0, 0x8, 0x0, 0xF8, 0x1D, 0x0, 0x8, 0x0, 0x0, 0x1F, 0x0, 0x8, 0x0, 0x8, 0x1E, 0x0, 0x8, 0x0, 0x10, 0x1F, 0x0, 0x8, 0x0, 0x18, 0x1E, 0x0, 0x8, 0x0, 0x20, 0x1F, 0x0, 0x8, 0x0, 0x28, 0x1E, 0x0, 0x8, 0x0, 0x30, 0x1F, 0x0, 0x8, 0x0, 0x38, 0x1E, 0x0, 0x8, 0x0, 0x40, 0x1F, 0x0, 0x8, 0x0, 0x48, 0x1E, 0x0, 0x8, 0x0, 0x50, 0x1F, 0x0, 0x8, 0x0, 0x58, 0x1E, 0x0, 0x8, 0x0, 0x60, 0x1F, 0x0, 0x8, 0x0, 0x68, 0x1E, 0x0, 0x8, 0x0, 0x70, 0x1F, 0x0, 0x8, 0x0, 0x78, 0x1E, 0x0, 0x8, 0x0, 0x80, 0x1F, 0x0, 0x8, 0x0, 0x88, 0x1E, 0x0, 0x8, 0x0, 0x90, 0x1F, 0x0, 0x8, 0x0, 0x98, 0x1E, 0x0, 0x8, 0x0, 0xA0, 0x1F, 0x0, 0x8, 0x0, 0xA8, 0x1E, 0x0, 0x8, 0x0, 0xB0, 0x1F, 0x0, 0x8, 0x0, 0xB8, 0x1E, 0x0, 0x8, 0x0, 0xC0, 0x1F, 0x0, 0x8, 0x0, 0xC8, 0x1E, 0x0, 0x28, 0xB6, 0x0, 0x0, 0x0, 0x48, 0xB6, 0x0, 0x0, 0x0, 0x68, 0xB6, 0x0, 0x0, 0x0, 0x88, 0xB6, 0x0, 0x0, 0x0, 0xA8, 0xB6, 0x0, 0x0, 0x0, 0xC8, 0xB6, 0x0, 0x0, 0x0, 0xE8, 0xB6, 0x0, 0x0, 0x0, 0x8, 0xB7, 0x0, 0x0, 0x0, 0x28, 0xB7, 0x0, 0x0, 0x0, 0x48, 0xB7, 0x0, 0x0, 0x0, 0x68, 0xB7, 0x0, 0x0, 0x0, 0x88, 0xB7, 0x0, 0x0, 0x0, 0xA8, 0xB7, 0x0, 0x0, 0x0, 0xC8, 0xB7, 0x0, 0x0, 0x0, 0xE8, 0xB7, 0x0, 0x0, 0x0, 0x8, 0xB8, 0x0, 0x0, 0x0, 0x28, 0xB8, 0x0, 0x0, 0x0, 0x48, 0xB8, 0x0, 0x0, 0x0, 0x68, 0xB8, 0x0, 0x0, 0x0, 0x88, 0xB8, 0x0, 0x0, 0x0, 0xA8, 0xB8, 0x0, 0x0, 0x0, 0xC8, 0xB8, 0x0, 0x0, 0x0, 0xE8, 0xB8, 0x0, 0x0, 0x0, 0x8, 0xB9, 0x0, 0x0, 0x0, 0x28, 0xB9, 0x0, 0x0, 0x0, 0x48, 0xB9, 0x0, 0x0, 0x0, 0x68, 0xB9, 0x0, 0x0, 0x0, 0x88, 0xB9, 0x0, 0x0, 0x0, 0xA8, 0xB9, 0x0, 0x0, 0x0, 0xC8, 0xB9, 0x0, 0x0, 0x0, 0xE8, 0xB9, 0x0, 0x0, 0x0, 0x8, 0xBA, 0x0, 0x0, 0x0, 0x28, 0xBA, 0x0, 0x0, 0x0, 0x48, 0xBA, 0x0, 0x0, 0x0, 0x68, 0xBA, 0x0, 0x0, 0x0, 0x88, 0xBA, 0x0, 0x0, 0x0, 0xA8, 0xBA, 0x0, 0x0, 0x0, 0xC8, 0xBA, 0x0, 0x0, 0x0, 0xE8, 0xBA, 0x0, 0x0, 0x0, 0x8, 0xBB, 0x0, 0x0, 0x0, 0x28, 0xBB, 0x0, 0x0, 0x0, 0x48, 0xBB, 0x0, 0x0, 0x0, 0x68, 0xBB, 0x0, 0x0, 0x0, 0x88, 0xBB, 0x0, 0x0, 0x0, 0x48, 0xB2, 0x0, 0x0, 0x0, 0x68, 0xB2, 0x0, 0x0, 0x0, 0x88, 0xB2, 0x0, 0x0, 0x0, 0xA8, 0xB2, 0x0, 0x0, 0x0, 0xC8, 0xB2, 0x0, 0x0, 0x0, 0xE8, 0xB2, 0x0, 0x0, 0x0, 0x8, 0xB3, 0x0, 0x0, 0x0, 0x28, 0xB3, 0x0, 0x0, 0x0, 0x48, 0xB3, 0x0, 0x0, 0x0, 0x68, 0xB3, 0x0, 0x0, 0x0, 0x88, 0xB3, 0x0, 0x0, 0x0, 0xA8, 0xB3, 0x0, 0x0, 0x0, 0xC8, 0xB3, 0x0, 0x0, 0x0, 0xE8, 0xB3, 0x0, 0x0, 0x0, 0x8, 0xB4, 0x0, 0x0, 0x0, 0x28, 0xB4, 0x0, 0x0, 0x0, 0x48, 0xB4, 0x0, 0x0, 0x0, 0x8, 0x0, 0xE8, 0x2E, 0x0, 0x8, 0x0, 0xF0, 0x2E, 0x0, 0x8, 0x0, 0xF8, 0x2E, 0x0, 0x8, 0x0, 0xE0, 0x20, 0x0, 0x8, 0x0, 0xE8, 0x20, 0x0, 0x8, 0x0, 0x0, 0x2F, 0x0, 0x8, 0x0, 0x8, 0x2F, 0x0, 0x8, 0x0, 0x10, 0x2F, 0x0, 0x8, 0x0, 0x18, 0x2F, 0x0, 0x8, 0x0, 0x20, 0x2F, 0x0, 0x8, 0x0, 0x28, 0x2F, 0x0, 0x8, 0x0, 0x30, 0x2F, 0x0, 0x8, 0x0, 0x38, 0x2F, 0x0, 0x8, 0x0, 0x40, 0x2F, 0x0, 0x8, 0x0, 0x48, 0x2F, 0x0, 0x8, 0x0, 0x50, 0x2F, 0x0, 0x8, 0x0, 0x58, 0x2F, 0x0, 0x8, 0x0, 0x60, 0x2F, 0x0, 0x8, 0x0, 0x68, 0x2F, 0x0, 0x8, 0x0, 0x70, 0x2F, 0x0, 0x8, 0x0, 0x78, 0x2F, 0x0, 0x8, 0x0, 0x80, 0x2F, 0x0, 0x8, 0x0, 0x88, 0x2F, 0x0, 0x8, 0x0, 0x90, 0x2F, 0x0, 0x8, 0x0, 0x58, 0x1C, 0x0, 0x8, 0x0, 0x60, 0x1C, 0x0, 0x8, 0x0, 0x68, 0x1C, 0x0, 0x8, 0x0, 0x70, 0x1C, 0x0, 0x8, 0x0, 0x78, 0x1C, 0x0, 0x8, 0x0, 0x80, 0x1C, 0x0, 0x8, 0x0, 0x88, 0x1C, 0x0, 0x8, 0x0, 0x90, 0x1C, 0x0, 0x8, 0x0, 0x98, 0x1C, 0x0, 0x8, 0x0, 0xA0, 0x1C, 0x0, 0x8, 0x0, 0xA8, 0x1C, 0x0, 0x8, 0x0, 0xB0, 0x1C, 0x0, 0x8, 0x0, 0xB8, 0x1C, 0x0, 0x8, 0x0, 0xC0, 0x1C, 0x0, 0x8, 0x0, 0xC8, 0x1C, 0x0, 0x8, 0x0, 0x98, 0x2F, 0x0, 0x8, 0x0, 0xA0, 0x2F, 0x0, 0x8, 0x0, 0xA8, 0x2F, 0x0, 0x8, 0x0, 0xB0, 0x2F, 0x0, 0x8, 0x0, 0xB8, 0x2F, 0x0, 0x8, 0x0, 0xC0, 0x2F, 0x0, 0x8, 0x0, 0xC8, 0x2F, 0x0, 0x8, 0x0, 0xD0, 0x2F, 0x0, 0x8, 0x0, 0xD8, 0x2F, 0x0, 0x8, 0x0, 0xE0, 0x2F, 0x0, 0x8, 0x0, 0xE8, 0x2F, 0x0, 0x8, 0x0, 0xF0, 0x2F, 0x0, 0x8, 0x0, 0xF8, 0x2F, 0x0, 0x8, 0x0, 0x0, 0x30, 0x0, 0x8, 0x0, 0x8, 0x30, 0x0, 0x8, 0x0, 0x10, 0x30, 0x0, 0x8, 0x0, 0x18, 0x30, 0x0, 0x88, 0xC0, 0x0, 0x0, 0x0, 0xA8, 0xC0, 0x0, 0x0, 0x0, 0xC8, 0xC0, 0x0, 0x0, 0x0, 0x8, 0xB0, 0x0, 0x0, 0x0, 0xE8, 0xC0, 0x0, 0x0, 0x0, 0x8, 0xC1, 0x0, 0x0, 0x0, 0x28, 0xC1, 0x0, 0x0, 0x0, 0x48, 0xC1, 0x0, 0x0, 0x0, 0xA8, 0xB0, 0x0, 0x0, 0x0, 0xC8, 0xB0, 0x0, 0x0, 0x0, 0xE8, 0xB0, 0x0, 0x0, 0x0, 0x8, 0xB1, 0x0, 0x0, 0x0, 0x28, 0xB1, 0x0, 0x0, 0x0, 0x48, 0xB1, 0x0, 0x0, 0x0, 0xC8, 0x92, 0x0, 0x0, 0x0, 0xE8, 0x92, 0x0, 0x0, 0x0, 0x8, 0x93, 0x0, 0x0, 0x0, 0x28, 0x93, 0x0, 0x0, 0x0, 0x48, 0x93, 0x0, 0x0, 0x0, 0x68, 0x93, 0x0, 0x0, 0x0, 0x68, 0xC1, 0x0, 0x0, 0x0, 0x88, 0xC1, 0x0, 0x0, 0x0, 0xA8, 0xC1, 0x0, 0x0, 0x0, 0xC8, 0xC1, 0x0, 0x0, 0x0, 0xE8, 0xC1, 0x0, 0x0, 0x0, 0x8, 0xC2, 0x0, 0x0, 0x0, 0x28, 0xC2, 0x0, 0x0, 0x0, 0x48, 0xC2, 0x0, 0x0, 0x0, 0x68, 0xC2, 0x0, 0x0, 0x0, 0x88, 0xC2, 0x0, 0x0, 0x0, 0xA8, 0xC2, 0x0, 0x0, 0x0, 0xC8, 0xC2, 0x0, 0x0, 0x0, 0xE8, 0xC2, 0x0, 0x0, 0x0, 0x8, 0xC3, 0x0, 0x0, 0x0, 0x28, 0xC3, 0x0, 0x0, 0x0, 0x48, 0xC3, 0x0, 0x0, 0x0, 0x68, 0xC3, 0x0, 0x0, 0x0, 0x88, 0xC3, 0x0, 0x0, 0x0, 0xA8, 0xC3, 0x0, 0x0, 0x0, 0xC8, 0xC3, 0x0, 0x0, 0x0, 0xE8, 0xC3, 0x0, 0x0, 0x0, 0x8, 0xC4, 0x0, 0x0, 0x0, 0x28, 0xC4, 0x0, 0x0, 0x0, 0x48, 0xC4, 0x0, 0x0, 0x0, 0x68, 0xC4, 0x0, 0x0, 0x0, 0x88, 0xC4, 0x0, 0x0, 0x0, 0xA8, 0xC4, 0x0, 0x0, 0x0, 0xC8, 0xC4, 0x0, 0x0, 0x0, 0xE8, 0xC4, 0x0, 0x0, 0x0, 0x8, 0xC5, 0x0, 0x0, 0x0, 0x28, 0xC5, 0x0, 0x0, 0x0, 0x48, 0xC5, 0x0, 0x0, 0x0, 0xC8, 0xB1, 0x0, 0x0, 0x0, 0xE8, 0x95, 0x0, 0x0, 0x0, 0x8, 0xB2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x58, 0x31, 0x0, 0x8, 0x0, 0xF0, 0x1F, 0x0, 0x8, 0x0, 0xF8, 0x1F, 0x0, 0x8, 0x0, 0x60, 0x31, 0x0, 0x8, 0x0, 0x8, 0x20, 0x0, 0x8, 0x0, 0x30, 0x20, 0x0, 0x8, 0x0, 0x48, 0x20, 0x0, 0x8, 0x0, 0xA0, 0x20, 0x0, 0x8, 0x0, 0xB8, 0x20, 0x0, 0x8, 0x0, 0x68, 0x31, 0x0, 0x8, 0x0, 0x70, 0x31, 0x0, 0x8, 0x0, 0x78, 0x31, 0x0, 0x8, 0x0, 0x80, 0x31, 0x0, 0x8, 0x0, 0x88, 0x31, 0x0, 0x8, 0x0, 0x90, 0x31, 0x0, 0x8, 0x0, 0x98, 0x31, 0x0, 0x8, 0x0, 0xA0, 0x31, 0x0, 0x8, 0x0, 0xD0, 0x20, 0x0, 0x8, 0x0, 0xA8, 0x31, 0x0, 0x8, 0x0, 0xB0, 0x31, 0x0, 0x8, 0x0, 0xB8, 0x31, 0x0, 0x8, 0x0, 0xC0, 0x31, 0x0, 0x8, 0x0, 0x90, 0x23, 0x0, 0xC8, 0xAF, 0x0, 0x0, 0x0, 0xE8, 0xAF, 0x0, 0x0, 0x0, 0x28, 0xB0, 0x0, 0x0, 0x0, 0x28, 0xC7, 0x0, 0x0, 0x0, 0x48, 0xC7, 0x0, 0x0, 0x0, 0x68, 0xB0, 0x0, 0x0, 0x0, 0x68, 0xC7, 0x0, 0x0, 0x0, 0x88, 0xC7, 0x0, 0x0, 0x0, 0xA8, 0xC7, 0x0, 0x0, 0x0, 0xC8, 0xC7, 0x0, 0x0, 0x0, 0xE8, 0xC7, 0x0, 0x0, 0x0, 0x8, 0xC8, 0x0, 0x0, 0x0, 0x28, 0xC8, 0x0, 0x0, 0x0, 0x48, 0xC8, 0x0, 0x0, 0x0, 0x68, 0xC8, 0x0, 0x0, 0x0, 0xC8, 0xBB, 0x0, 0x0, 0x0, 0x88, 0xC8, 0x0, 0x0, 0x0, 0xA8, 0xC8, 0x0, 0x0, 0x0, 0xC8, 0xC8, 0x0, 0x0, 0x0, 0xE8, 0xC8, 0x0, 0x0, 0x0, 0x8, 0xC9, 0x0, 0x0, 0x0, 0x28, 0xC9, 0x0, 0x0, 0x0, 0x48, 0x95, 0x0, 0x0, 0x0, 0x48, 0xC9, 0x0, 0x0, 0x0, 0x68, 0xC9, 0x0, 0x0, 0x0, 0x88, 0xC9, 0x0, 0x0, 0x0, 0xA8, 0xC9, 0x0, 0x0, 0x0, 0x28, 0x82, 0x18, 0x2D, 0x0, 0xE8, 0xB1, 0x0, 0x0, 0x0, 0xC8, 0xC9, 0x0, 0x0, 0x0, 0xE8, 0xC9, 0x0, 0x0, 0x0, 0x8, 0xCA, 0x0, 0x0, 0x0, 0xC8, 0xC6, 0x0, 0x0, 0x0, 0x28, 0xCA, 0x0, 0x0, 0x0, 0x48, 0xCA, 0x0, 0x0, 0x0, 0x8, 0xC7, 0x0, 0x0, 0x0, 0x68, 0xCA, 0x0, 0x0, 0x0, 0x88, 0xCA, 0xA8, 0x32, 0x0, 0x8, 0x0, 0xB0, 0x32, 0x0, 0x8, 0x0, 0xB8, 0x32, 0x0, 0x8, 0x0, 0xC0, 0x32, 0x0, 0x8, 0x0, 0xC8, 0x32, 0x0, 0x8, 0x0, 0xD0, 0x32, 0x0, 0x8, 0x0, 0xD8, 0x32, 0x0, 0x8, 0x0, 0xE0, 0x32, 0x0, 0x8, 0x0, 0xE8, 0x32, 0x0, 0x8, 0x0, 0xF0, 0x32, 0x0, 0x8, 0x0, 0xF8, 0x32, 0x0, 0x8, 0x0, 0x0, 0x33, 0x0, 0x8, 0x0, 0x8, 0x33, 0x0, 0x8, 0x0, 0x10, 0x33, 0x0, 0x8, 0x0, 0x18, 0x33, 0x0, 0x8, 0x0, 0x20, 0x33, 0x0, 0x8, 0x0, 0x28, 0x33, 0x0, 0x8, 0x0, 0x30, 0x33, 0x0, 0x8, 0x0, 0x38, 0x33, 0x0, 0x8, 0x0, 0x40, 0x33, 0x0, 0x8, 0x0, 0x48, 0x33, 0x0, 0x8, 0x0, 0x50, 0x33, 0x0, 0x8, 0x0, 0x58, 0x33, 0x0, 0x8, 0x0, 0x60, 0x33, 0x0, 0x8, 0x0, 0x68, 0x33, 0x0, 0x8, 0x0, 0x70, 0x33, 0x0, 0x8, 0x0, 0x78, 0x33, 0x0, 0x8, 0x0, 0x80, 0x33, 0x0, 0x8, 0x0, 0x88, 0x33, 0x0, 0x8, 0x0, 0x90, 0x33, 0x0, 0x8, 0x0, 0x98, 0x33, 0x0, 0x8, 0x0, 0xA0, 0x33, 0x0, 0x8, 0x0, 0xA8, 0x33, 0x0, 0x8, 0x0, 0xB0, 0x33, 0x0, 0x8, 0x0, 0xB8, 0x33, 0x0, 0x8, 0x0, 0xC0, 0x33, 0x0, 0x8, 0x0, 0xC8, 0x33, 0x0, 0x8, 0x0, 0xD0, 0x33, 0x0, 0x8, 0x0, 0xD8, 0x33, 0x0, 0x8, 0x0, 0xE0, 0x33, 0x0, 0x8, 0x0, 0xE8, 0x33, 0x0, 0x8, 0x0, 0xF0, 0x33, 0x0, 0x8, 0x0, 0xF8, 0x33, 0x0, 0x8, 0x0, 0x0, 0x34, 0x0, 0x8, 0x0, 0x8, 0x34, 0x0, 0x8, 0x0, 0x10, 0x34, 0x0, 0x8, 0x0, 0x18, 0x34, 0x0, 0x8, 0x0, 0x20, 0x34, 0x0, 0x8, 0x0, 0x28, 0x34, 0x0, 0x8, 0x0, 0x30, 0x34, 0x0, 0x8, 0x0, 0x38, 0x34, 0x0, 0x8, 0x0, 0x40, 0x34, 0x0, 0x8, 0x0, 0x48, 0x34, 0x0, 0x8, 0x0, 0x50, 0x34, 0x0, 0x69, 0xD1, 0x0, 0x0, 0x0, 0x89, 0xD1, 0x0, 0x0, 0x0, 0xA9, 0xD1, 0x0, 0x0, 0x0, 0xC9, 0xD1, 0x0, 0x0, 0x0, 0xE9, 0xD1, 0x0, 0x0, 0x0, 0x9, 0xD2, 0x0, 0x0, 0x0, 0x29, 0xD2, 0x0, 0x0, 0x0, 0x49, 0xD2, 0x0, 0x0, 0x0, 0x69, 0xD2, 0x0, 0x0, 0x0, 0x89, 0xD2, 0x0, 0x0, 0x0, 0xA9, 0xD2, 0x0, 0x0, 0x0, 0xC9, 0xD2, 0x0, 0x0, 0x0, 0xE9, 0xD2, 0x0, 0x0, 0x0, 0x9, 0xD3, 0x0, 0x0, 0x0, 0x29, 0xD3, 0x0, 0x0, 0x0, 0x49, 0xD3, 0x0, 0x0, 0x0, 0x69, 0xD3, 0x0, 0x0, 0x0, 0x89, 0xD3, 0x0, 0x0, 0x0, 0xA9, 0xD3, 0x0, 0x0, 0x0, 0xC9, 0xD3, 0x0, 0x0, 0x0, 0xE9, 0xD3, 0x0, 0x0, 0x0, 0x9, 0xD4, 0x0, 0x0, 0x0, 0x29, 0xD4, 0x0, 0x0, 0x0, 0x49, 0xD4, 0x0, 0x0, 0x0, 0x69, 0xD4, 0x0, 0x0, 0x0, 0x89, 0xD4, 0x0, 0x0, 0x0, 0xA9, 0xD4, 0x0, 0x0, 0x0, 0xC9, 0xD4, 0x0, 0x0, 0x0, 0xE9, 0xD4, 0x0, 0x0, 0x0, 0x9, 0xD5, 0x0, 0x0, 0x0, 0x29, 0xD5, 0x0, 0x0, 0x0, 0x49, 0xD5, 0x0, 0x0, 0x0, 0x69, 0xD5, 0x0, 0x0, 0x0, 0x89, 0xD5, 0x0, 0x0, 0x0, 0xA9, 0xD5, 0x0, 0x0, 0x0, 0xC9, 0xD5, 0x0, 0x0, 0x0, 0xE9, 0xD5, 0x0, 0x0, 0x0, 0x9, 0xD6, 0x0, 0x0, 0x0, 0x29, 0xD6, 0x0, 0x0, 0x0, 0x49, 0xD6, 0x0, 0x0, 0x0, 0x69, 0xD6, 0x0, 0x0, 0x0, 0x89, 0xD6, 0x0, 0x0, 0x0, 0xA9, 0xD6, 0x0, 0x0, 0x0, 0xC9, 0xD6, 0x0, 0x0, 0x0, 0xE9, 0xD6, 0x0, 0x0, 0x0, 0x9, 0xD7, 0x0, 0x0, 0x0, 0x29, 0xD7, 0x0, 0x0, 0x0, 0x49, 0xD7, 0x0, 0x0, 0x0, 0x69, 0xD7, 0x0, 0x0, 0x0, 0x89, 0xD7, 0x0, 0x0, 0x0, 0xA9, 0xD7, 0x0, 0x0, 0x0, 0xC9, 0xD7, 0x0, 0x0, 0x0, 0xE9, 0xD7, 0x0, 0x0, 0x0, 0x9, 0xD8, 0x0, 0x0, 0x0, 0x29, 0xD8, 0x0, 0x0, 0x0, 0x49, 0xD8, 0x0, 0x0, 0x0, 0x69, 0xD8, 0x0, 0x0, 0x0, 0x89, 0xD8, 0x0, 0x0, 0x0, 0xA9, 0xD8, 0x0, 0x0, 0x0, 0xC9, 0xD8, 0x0, 0x0, 0x0, 0xE9, 0xD8, 0x0, 0x0, 0x0, 0x9, 0xD9, 0x0, 0x0, 0x0, 0x29, 0xD9, 0x0, 0x0, 0x0, 0x49, 0xD9, 0x0, 0x0, 0x0, 0x69, 0xD9, 0x0, 0x0, 0x0, 0x89, 0xD9, 0x0, 0x0, 0x0, 0xA9, 0xD9, 0x0, 0x0, 0x0, 0xC9, 0xD9, 0x0, 0x0, 0x0, 0xE9, 0xD9, 0x0, 0x0, 0x0, 0x9, 0xDA, 0x0, 0x0, 0x0, 0x29, 0xDA, 0x0, 0x0, 0x0, 0x49, 0xDA, 0x0, 0x0, 0x0, 0x69, 0xDA, 0x0, 0x0, 0x0, 0x89, 0xDA, 0x0, 0x0, 0x0, 0xA9, 0xDA, 0x0, 0x0, 0x0, 0xC9, 0xDA, 0x0, 0x0, 0x0, 0xE9, 0xDA, 0x0, 0x0, 0x0, 0x9, 0xDB, 0x0, 0x0, 0x0, 0x29, 0xDB, 0x0, 0x0, 0x0, 0x49, 0xDB, 0x0, 0x0, 0x0, 0x69, 0xDB, 0x0, 0x0, 0x0, 0x89, 0xDB, 0x0, 0x0, 0x0, 0xA9, 0xDB, 0x0, 0x0, 0x0, 0xC9, 0xDB, 0x0, 0x0, 0x0, 0xE9, 0xDB, 0x0, 0x0, 0x0, 0x9, 0xDC, 0x0, 0x0, 0x0, 0x29, 0xDC, 0x0, 0x0, 0x0, 0x49, 0xDC, 0x0, 0x0, 0x0, 0x69, 0xDC, 0x0, 0x0, 0x0, 0x89, 0xDC, 0x0, 0x0, 0x0, 0xA9, 0xDC, 0x0, 0x0, 0x0, 0xC9, 0xDC, 0x0, 0x0, 0x0, 0xE9, 0xDC, 0x0, 0x0, 0x0, 0x9, 0xDD, 0x0, 0x0, 0x0, 0x29, 0xDD, 0x0, 0x0, 0x0, 0x49, 0xDD, 0x0, 0x0, 0x0, 0x69, 0xDD, 0x0, 0x0, 0x0, 0x89, 0xDD, 0x0, 0x0, 0x0, 0xA9, 0xDD, 0x0, 0x0, 0x0, 0xC9, 0xDD, 0x0, 0x0, 0x0, 0xE9, 0xDD, 0x0, 0x0, 0x0, 0x9, 0xDE, 0x0, 0x0, 0x0, 0x29, 0xDE, 0x0, 0x0, 0x0, 0x49, 0xDE, 0x0, 0x0, 0x0, 0x69, 0xDE, 0x0, 0x0, 0x0, 0x89, 0xDE, 0x0, 0x0, 0x0, 0xA9, 0xDE, 0x0, 0x0, 0x0, 0xC9, 0xDE, 0x0, 0x0, 0x0, 0xE9, 0xDE, 0x0, 0x0, 0x0, 0x9, 0xDF, 0x0, 0x0, 0x0, 0x29, 0xDF, 0x0, 0x0, 0x0, 0x49, 0xDF, 0x0, 0x0, 0x0, 0x69, 0xDF, 0x0, 0x0, 0x0, 0x89, 0xDF, 0x0, 0x0, 0x0, 0xA9, 0xDF, 0x0, 0x0, 0x0, 0xC9, 0xDF, 0x0, 0x0, 0x0, 0xE9, 0xDF, 0x0, 0x0, 0x0, 0x9, 0xE0, 0x0, 0x0, 0x0, 0x29, 0xE0, 0x0, 0x0, 0x0, 0x49, 0xE0, 0x0, 0x0, 0x0, 0x69, 0xE0, 0x0, 0x0, 0x0, 0x89, 0xE0, 0x0, 0x0, 0x0, 0xA9, 0xE0, 0x0, 0x0, 0x0, 0xC9, 0xE0, 0x0, 0x0, 0x0, 0xE9, 0xE0, 0x0, 0x0, 0x0, 0x9, 0xE1, 0x0, 0x0, 0x0, 0x29, 0xE1, 0x0, 0x0, 0x0, 0x49, 0xE1, 0x0, 0x0, 0x0, 0x69, 0xE1, 0x0, 0x0, 0x0, 0x89, 0xE1, 0x0, 0x0, 0x0, 0xA9, 0xE1, 0x0, 0x0, 0x0, 0xC9, 0xE1, 0x0, 0x0, 0x0, 0xE9, 0xE1, 0x0, 0x0, 0x0, 0x9, 0xE2, 0x0, 0x0, 0x0, 0x29, 0xE2, 0x0, 0x0, 0x0, 0x49, 0xE2, 0x0, 0x0, 0x0, 0x69, 0xE2, 0x0, 0x0, 0x0, 0x89, 0xE2, 0x0, 0x0, 0x0, 0xA9, 0xE2, 0x0, 0x0, 0x0, 0xC9, 0xE2, 0x0, 0x0, 0x0, 0xE9, 0xE2, 0x0, 0x0, 0x0, 0x9, 0xE3, 0x0, 0x0, 0x0, 0x29, 0xE3, 0x0, 0x0, 0x0, 0x49, 0xE3, 0x0, 0x0, 0x0, 0x69, 0xE3, 0x0, 0x0, 0x0, 0x89, 0xE3, 0x0, 0x0, 0x0, 0xA9, 0xE3, 0x0, 0x0, 0x0, 0xC9, 0xE3, 0x0, 0x0, 0x0, 0xE9, 0xE3, 0x0, 0x0, 0x0, 0x9, 0xE4, 0x0, 0x0, 0x0, 0x29, 0xE4, 0x0, 0x0, 0x0, 0x49, 0xE4, 0x0, 0x0, 0x0, 0x69, 0xE4, 0x0, 0x0, 0x0, 0x89, 0xE4, 0x0, 0x0, 0x0, 0xA9, 0xE4, 0x0, 0x0, 0x0, 0xC9, 0xE4, 0x0, 0x0, 0x0, 0xE9, 0xE4, 0x0, 0x0, 0x0, 0x9, 0xE5, 0x0, 0x0, 0x0, 0x9, 0x0, 0x30, 0x38, 0x0, 0x29, 0xE5, 0x0, 0x0, 0x0, 0x49, 0xE5, 0x0, 0x0, 0x0, 0x69, 0xE5, 0x0, 0x0, 0x0, 0x89, 0xE5, 0x0, 0x0, 0x0, 0xA9, 0xE5, 0x0, 0x0, 0x0, 0xC9, 0xE5, 0x0, 0x0, 0x0, 0xE9, 0xE5, 0x0, 0x0, 0x0, 0x9, 0xE6, 0x0, 0x0, 0x0, 0x29, 0xE6, 0x0, 0x0, 0x0, 0x49, 0xE6, 0x0, 0x0, 0x0, 0x69, 0xE6, 0x0, 0x0, 0x0, 0x89, 0xE6, 0x0, 0x0, 0x0, 0xA9, 0xE6, 0x0, 0x0, 0x0, 0xC9, 0xE6, 0x0, 0x0, 0x0, 0xE9, 0xE6, 0x0, 0x0, 0x0, 0x9, 0xE7, 0x0, 0x0, 0x0, 0x29, 0xE7, 0x0, 0x0, 0x0, 0x49, 0xE7, 0x0, 0x0, 0x0, 0x69, 0xE7, 0x0, 0x0, 0x0, 0x89, 0xE7, 0x0, 0x0, 0x0, 0xA9, 0xE7, 0x0, 0x0, 0x0, 0xC9, 0xE7, 0x0, 0x0, 0x0, 0xE9, 0xE7, 0x0, 0x0, 0x0, 0x9, 0xE8, 0x0, 0x0, 0x0, 0x29, 0xE8, 0x0, 0x0, 0x0, 0x49, 0xE8, 0x0, 0x0, 0x0, 0x69, 0xE8, 0x0, 0x0, 0x0, 0x89, 0xE8, 0x0, 0x0, 0x0, 0xA9, 0xE8, 0x0, 0x0, 0x0, 0xC9, 0xE8, 0x0, 0x0, 0x0, 0xE9, 0xE8, 0x0, 0x0, 0x0, 0x9, 0xE9, 0x0, 0x0, 0x0, 0x29, 0xE9, 0x0, 0x0, 0x0, 0x49, 0xE9, 0x0, 0x0, 0x0, 0x69, 0xE9, 0x0, 0x0, 0x0, 0x89, 0xE9, 0x0, 0x0, 0x0, 0x9, 0x0, 0xD8, 0x38, 0x0, 0xA9, 0xE9, 0x0, 0x0, 0x0, 0xC9, 0xE9, 0x0, 0x0, 0x0, 0xE9, 0xE9, 0x0, 0x0, 0x0, 0x9, 0xEA, 0x0, 0x0, 0x0, 0x29, 0xEA, 0x0, 0x0, 0x0, 0x49, 0xEA, 0x0, 0x0, 0x0, 0x69, 0xEA, 0x0, 0x0, 0x0, 0x89, 0xEA, 0x0, 0x0, 0x0, 0xA9, 0xEA, 0x0, 0x0, 0x0, 0xC9, 0xEA, 0x0, 0x0, 0x0, 0xE9, 0xEA, 0x0, 0x0, 0x0, 0x9, 0xEB, 0x0, 0x0, 0x0, 0x29, 0xEB, 0x0, 0x0, 0x0, 0x49, 0xEB, 0x0, 0x0, 0x0, 0x69, 0xEB, 0x0, 0x0, 0x0, 0x89, 0xEB, 0x0, 0x0, 0x0, 0xA9, 0xEB, 0x0, 0x0, 0x0, 0xC9, 0xEB, 0x0, 0x0, 0x0, 0xE9, 0xEB, 0x0, 0x0, 0x0, 0x9, 0xEC, 0x0, 0x0, 0x0, 0x29, 0xEC, 0x0, 0x0, 0x0, 0x49, 0xEC, 0x0, 0x0, 0x0, 0x69, 0xEC, 0x0, 0x0, 0x0, 0x89, 0xEC, 0x0, 0x0, 0x0, 0xA9, 0xEC, 0x0, 0x0, 0x0, 0xC9, 0xEC, 0x0, 0x0, 0x0, 0xE9, 0xEC, 0x0, 0x0, 0x0, 0x9, 0xED, 0x0, 0x0, 0x0, 0x29, 0xED, 0x0, 0x0, 0x0, 0x49, 0xED, 0x0, 0x0, 0x0, 0x69, 0xED, 0x0, 0x0, 0x0, 0x89, 0xED, 0x0, 0x0, 0x0, 0xA9, 0xED, 0x0, 0x0, 0x0, 0xC9, 0xED, 0x0, 0x0, 0x0, 0xE9, 0xED, 0x0, 0x0, 0x0, 0x9, 0xEE, 0x0, 0x0, 0x0, 0x29, 0xEE, 0x0, 0x0, 0x0, 0x49, 0xEE, 0x0, 0x0, 0x0, 0x69, 0xEE, 0x0, 0x0, 0x0, 0x89, 0xEE, 0x0, 0x0, 0x0, 0xA9, 0xEE, 0x0, 0x0, 0x0, 0xC9, 0xEE, 0x0, 0x0, 0x0, 0xE9, 0xEE, 0x0, 0x0, 0x0, 0x9, 0xEF, 0x0, 0x0, 0x0, 0x29, 0xEF, 0x0, 0x0, 0x0, 0x49, 0xEF, 0x0, 0x0, 0x0, 0x69, 0xEF, 0x0, 0x0, 0x0, 0x89, 0xEF, 0x0, 0x0, 0x0, 0xA9, 0xEF, 0x0, 0x0, 0x0, 0xC9, 0xEF, 0x0, 0x0, 0x0, 0xE9, 0xEF, 0x0, 0x0, 0x0, 0x9, 0xF0, 0x0, 0x0, 0x0, 0x29, 0xF0, 0x0, 0x0, 0x0, 0x49, 0xF0, 0x0, 0x0, 0x0, 0x69, 0xF0, 0x0, 0x0, 0x0, 0x89, 0xF0, 0x0, 0x0, 0x0, 0xA9, 0xF0, 0x0, 0x0, 0x0, 0xC9, 0xF0, 0x0, 0x0, 0x0, 0xE9, 0xF0, 0x0, 0x0, 0x0, 0x9, 0xF1, 0x0, 0x0, 0x0, 0x29, 0xF1, 0x0, 0x0, 0x0, 0x49, 0xF1, 0x0, 0x0, 0x0, 0x69, 0xF1, 0x0, 0x0, 0x0, 0x89, 0xF1, 0x0, 0x0, 0x0, 0xA9, 0xF1, 0x0, 0x0, 0x0, 0xC9, 0xF1, 0x0, 0x0, 0x0, 0xE9, 0xF1, 0x0, 0x0, 0x0, 0x9, 0xF2, 0x0, 0x0, 0x0, 0x29, 0xF2, 0x0, 0x0, 0x0, 0x49, 0xF2, 0x0, 0x0, 0x0, 0x69, 0xF2, 0x0, 0x0, 0x0, 0x89, 0xF2, 0x0, 0x0, 0x0, 0xA9, 0xF2, 0x0, 0x0, 0x0, 0xC9, 0xF2, 0x0, 0x0, 0x0, 0xE9, 0xF2, 0x0, 0x0, 0x0, 0x9, 0xF3, 0x0, 0x0, 0x0, 0x29, 0xF3, 0x0, 0x0, 0x0, 0x9, 0x0, 0xD0, 0x3C, 0x0, 0x9, 0x0, 0xD8, 0x3C, 0x0, 0x9, 0x0, 0xE0, 0x3C, 0x0, 0x9, 0x0, 0xE8, 0x3C, 0x0, 0x9, 0x0, 0xF0, 0x3C, 0x0, 0x9, 0x0, 0xF8, 0x3C, 0x0, 0x9, 0x0, 0x0, 0x3D, 0x0, 0x9, 0x0, 0x8, 0x3D, 0x0, 0x9, 0x0, 0x10, 0x3D, 0x0, 0x9, 0x0, 0x18, 0x3D, 0x0, 0x9, 0x0, 0x20, 0x3D, 0x0, 0x9, 0x0, 0x28, 0x3D, 0x0, 0x9, 0x0, 0x30, 0x3D, 0x0, 0x9, 0x0, 0x38, 0x3D, 0x0, 0x9, 0x0, 0x40, 0x3D, 0x0, 0x9, 0x0, 0x48, 0x3D, 0x0, 0x9, 0x0, 0x50, 0x3D, 0x0, 0x9, 0x0, 0x58, 0x3D, 0x0, 0x9, 0x0, 0x60, 0x3D, 0x0, 0x9, 0x0, 0x68, 0x3D, 0x0, 0x9, 0x0, 0x70, 0x3D, 0x0, 0x9, 0x0, 0x78, 0x3D, 0x0, 0x9, 0x0, 0x80, 0x3D, 0x0, 0x9, 0x0, 0x88, 0x3D, 0x0, 0x9, 0x0, 0x90, 0x3D, 0x0, 0x9, 0x0, 0x98, 0x3D, 0x0, 0x9, 0x0, 0xA0, 0x3D, 0x0, 0x9, 0x0, 0xA8, 0x3D, 0x0, 0x9, 0x0, 0xB0, 0x3D, 0x0, 0x9, 0x0, 0xB8, 0x3D, 0x0, 0x9, 0x0, 0xC0, 0x3D, 0x0, 0x9, 0x0, 0xC8, 0x3D, 0x0, 0x9, 0x0, 0xD0, 0x3D, 0x0, 0x9, 0x0, 0xD8, 0x3D, 0x0, 0x9, 0x0, 0xE0, 0x3D, 0x0, 0x9, 0x0, 0xE8, 0x3D, 0x0, 0x9, 0x0, 0xF0, 0x3D, 0x0, 0x9, 0x0, 0xF8, 0x3D, 0x0, 0x9, 0x0, 0x0, 0x3E, 0x0, 0x9, 0x0, 0x8, 0x3E, 0x0, 0x9, 0x0, 0x10, 0x3E, 0x0, 0x9, 0x0, 0x18, 0x3E, 0x0, 0x9, 0x0, 0x20, 0x3E, 0x0, 0x9, 0x0, 0x28, 0x3E, 0x0, 0x9, 0x0, 0x30, 0x3E, 0x0, 0x9, 0x0, 0x38, 0x3E, 0x0, 0x9, 0x0, 0x40, 0x3E, 0x0, 0x9, 0x0, 0x48, 0x3E, 0x0, 0x9, 0x0, 0x50, 0x3E, 0x0, 0x9, 0x0, 0x58, 0x3E, 0x0, 0x9, 0x0, 0x60, 0x3E, 0x0, 0x9, 0x0, 0x68, 0x3E, 0x0, 0x9, 0x0, 0x70, 0x3E, 0x0, 0x9, 0x0, 0x78, 0x3E, 0x0, 0x9, 0x0, 0x80, 0x3E, 0x0, 0x9, 0x0, 0x88, 0x3E, 0x0, 0x9, 0x0, 0x90, 0x3E, 0x0, 0x9, 0x0, 0x98, 0x3E, 0x0, 0x9, 0x0, 0xA0, 0x3E, 0x0, 0x9, 0x0, 0xA8, 0x3E, 0x0, 0x9, 0x0, 0xB0, 0x3E, 0x0, 0x9, 0x0, 0xB8, 0x3E, 0x0, 0x9, 0x0, 0xC0, 0x3E, 0x0, 0x9, 0x0, 0xC8, 0x3E, 0x0, 0x9, 0x0, 0xD0, 0x3E, 0x0, 0x9, 0x0, 0xD8, 0x3E, 0x0, 0x9, 0x0, 0xE0, 0x3E, 0x0, 0x9, 0x0, 0xE8, 0x3E, 0x0, 0x9, 0x0, 0xF0, 0x3E, 0x0, 0x9, 0x0, 0xF8, 0x3E, 0x0, 0x9, 0x0, 0x0, 0x3F, 0x0, 0x9, 0x0, 0x8, 0x3F, 0x0, 0x9, 0x0, 0x10, 0x3F, 0x0, 0x9, 0x0, 0x18, 0x3F, 0x0, 0x9, 0x0, 0x20, 0x3F, 0x0, 0x9, 0x0, 0x28, 0x3F, 0x0, 0x9, 0x0, 0x30, 0x3F, 0x0, 0x9, 0x0, 0x38, 0x3F, 0x0, 0x9, 0x0, 0x40, 0x3F, 0x0, 0x9, 0x0, 0x48, 0x3F, 0x0, 0x9, 0x0, 0x50, 0x3F, 0x0, 0x9, 0x0, 0x58, 0x3F, 0x0, 0x9, 0x0, 0x60, 0x3F, 0x0, 0x9, 0x0, 0x68, 0x3F, 0x0, 0x9, 0x0, 0x70, 0x3F, 0x0, 0x9, 0x0, 0x78, 0x3F, 0x0, 0x9, 0x0, 0x80, 0x3F, 0x0, 0x9, 0x0, 0x88, 0x3F, 0x0, 0x9, 0x0, 0x90, 0x3F, 0x0, 0x9, 0x0, 0x98, 0x3F, 0x0, 0x9, 0x0, 0xA0, 0x3F, 0x0, 0x9, 0x0, 0xA8, 0x3F, 0x0, 0x9, 0x0, 0xB0, 0x3F, 0x0, 0x9, 0x0, 0xB8, 0x3F, 0x0, 0x9, 0x0, 0xC0, 0x3F, 0x0, 0x9, 0x0, 0xC8, 0x3F, 0x0, 0x9, 0x0, 0xD0, 0x3F, 0x0, 0x9, 0x0, 0xD8, 0x3F, 0x0, 0x9, 0x0, 0xE0, 0x3F, 0x0, 0x9, 0x0, 0xE8, 0x3F, 0x0, 0x9, 0x0, 0xF0, 0x3F, 0x0, 0x9, 0x0, 0xF8, 0x3F, 0x0, 0x9, 0x0, 0x0, 0x40, 0x0, 0x9, 0x0, 0x8, 0x40, 0x0, 0x9, 0x0, 0x10, 0x40, 0x0, 0x9, 0x0, 0x18, 0x40, 0x0, 0x9, 0x0, 0x20, 0x40, 0x0, 0x9, 0x0, 0x28, 0x40, 0x0, 0x9, 0x0, 0x30, 0x40, 0x0, 0x9, 0x0, 0x38, 0x40, 0x0, 0x9, 0x0, 0x40, 0x40, 0x0, 0x9, 0x0, 0x48, 0x40, 0x0, 0x9, 0x0, 0x50, 0x40, 0x0, 0x9, 0x0, 0x58, 0x40, 0x0, 0x9, 0x0, 0x60, 0x40, 0x0, 0x9, 0x0, 0x68, 0x40, 0x0, 0x9, 0x0, 0x70, 0x40, 0x0, 0x9, 0x0, 0x78, 0x40, 0x0, 0x9, 0x0, 0x80, 0x40, 0x0, 0x9, 0x0, 0xA8, 0x3B, 0x0, 0x9, 0x0, 0xB0, 0x3B, 0x0, 0x9, 0x0, 0xB8, 0x3B, 0x0, 0x9, 0x0, 0xC0, 0x3B, 0x0, 0x9, 0x0, 0xC8, 0x3B, 0x0, 0x9, 0x0, 0xD0, 0x3B, 0x0, 0x9, 0x0, 0xD8, 0x3B, 0x0, 0x9, 0x0, 0xE0, 0x3B, 0x0, 0x9, 0x0, 0xE8, 0x3B, 0x0, 0x9, 0x0, 0xF0, 0x3B, 0x0, 0x9, 0x0, 0xF8, 0x3B, 0x0, 0x9, 0x0, 0x0, 0x3C, 0x0, 0x9, 0x0, 0x8, 0x3C, 0x0, 0x9, 0x0, 0x10, 0x3C, 0x0, 0x9, 0x0, 0x88, 0x40, 0x0, 0x49, 0x2, 0x1, 0x0, 0x0, 0x9, 0x0, 0x98, 0x40, 0x0, 0x89, 0x2, 0x1, 0x0, 0x0, 0x9, 0x0, 0xA8, 0x40, 0x0, 0x9, 0x0, 0xB0, 0x40, 0x0, 0x9, 0x0, 0xB8, 0x40, 0x0, 0x9, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xC8, 0x40, 0x0, 0x49, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xD8, 0x40, 0x0, 0x89, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xE8, 0x40, 0x0, 0xC9, 0x3, 0x1, 0x0, 0x0, 0x9, 0x0, 0xF8, 0x40, 0x0, 0x9, 0x0, 0x0, 0x41, 0x0, 0x9, 0x0, 0x8, 0x41, 0x0, 0x9, 0x0, 0xC8, 0x39, 0x0, 0x49, 0x4, 0x1, 0x0, 0x0, 0x9, 0x0, 0x30, 0x3A, 0x0, 0x69, 0x4, 0x1, 0x0, 0x0, 0x9, 0x0, 0x20, 0x41, 0x0, 0xA9, 0x4, 0x1, 0x0, 0x0, 0x9, 0x0, 0x30, 0x41, 0x0, 0x9, 0x0, 0xB8, 0x38, 0x0, 0x9, 0x0, 0x38, 0x41, 0x0, 0x9, 0x5, 0x1, 0x0, 0x0, 0x9, 0x0, 0x48, 0x3C, 0x0, 0x9, 0x0, 0x48, 0x41, 0x0, 0x9, 0x0, 0x50, 0x41, 0x0, 0x9, 0x0, 0x58, 0x41, 0x0, 0x9, 0x0, 0x60, 0x41, 0x0, 0x9, 0x0, 0x68, 0x41, 0x0, 0x9, 0x0, 0x70, 0x41, 0x0, 0x9, 0x0, 0x78, 0x41, 0x0, 0x9, 0x0, 0x80, 0x41, 0x0, 0x9, 0x0, 0x88, 0x41, 0x0, 0x9, 0x0, 0x90, 0x41, 0x0, 0x9, 0x0, 0x98, 0x41, 0x0, 0x9, 0x0, 0xA0, 0x41, 0x0, 0x9, 0x0, 0xA8, 0x41, 0x0, 0x9, 0x0, 0xB0, 0x41, 0x0, 0x9, 0x0, 0xB8, 0x41, 0x0, 0x9, 0x0, 0xC0, 0x41, 0x0, 0x9, 0x0, 0xC8, 0x41, 0x0, 0x9, 0x0, 0xD0, 0x41, 0x0, 0x9, 0x0, 0xD8, 0x41, 0x0, 0x9, 0x0, 0xE0, 0x41, 0x0, 0x9, 0x0, 0xE8, 0x41, 0x0, 0x9, 0x0, 0xF0, 0x41, 0x0, 0x9, 0x0, 0xF8, 0x41, 0x0, 0x9, 0x0, 0x0, 0x42, 0x0, 0x9, 0x0, 0x8, 0x42, 0x0, 0x9, 0x0, 0x10, 0x42, 0x0, 0x9, 0x0, 0x18, 0x42, 0x0, 0x9, 0x0, 0x20, 0x42, 0x0, 0x9, 0x0, 0x28, 0x42, 0x0, 0x9, 0x0, 0x30, 0x42, 0x0, 0x9, 0x0, 0x38, 0x42, 0x0, 0x9, 0x0, 0x40, 0x42, 0x0, 0x9, 0x0, 0x48, 0x42, 0x0, 0x9, 0x0, 0x50, 0x42, 0x0, 0x9, 0x0, 0x58, 0x42, 0x0, 0x9, 0x0, 0x60, 0x42, 0x0, 0x9, 0x0, 0x68, 0x42, 0x0, 0x9, 0x0, 0x70, 0x42, 0x0, 0x9, 0x0, 0x78, 0x42, 0x0, 0x9, 0x0, 0x80, 0x42, 0x0, 0x9, 0x0, 0x88, 0x42, 0x0, 0x9, 0x0, 0x90, 0x42, 0x0, 0x9, 0x0, 0x98, 0x42, 0x0, 0x9, 0x0, 0xA0, 0x42, 0x0, 0x9, 0x0, 0xA8, 0x42, 0x0, 0x9, 0x0, 0xB0, 0x42, 0x0, 0x9, 0x0, 0xB8, 0x42, 0x0, 0x9, 0x0, 0xC0, 0x42, 0x0, 0x9, 0x0, 0xC8, 0x42, 0x0, 0x9, 0x0, 0xD0, 0x42, 0x0, 0x9, 0x0, 0xD8, 0x42, 0x0, 0x9, 0x0, 0xE0, 0x42, 0x0, 0x9, 0x0, 0xE8, 0x42, 0x0, 0x9, 0x0, 0xF0, 0x42, 0x0, 0x9, 0x0, 0xF8, 0x42, 0x0, 0x9, 0x0, 0x0, 0x43, 0x0, 0x9, 0x0, 0x8, 0x43, 0x0, 0x9, 0x0, 0x10, 0x43, 0x0, 0x9, 0x0, 0x18, 0x43, 0x0, 0x9, 0x0, 0x20, 0x43, 0x0, 0x9, 0x0, 0x28, 0x43, 0x0, 0x9, 0x0, 0x30, 0x43, 0x0, 0x9, 0x0, 0x38, 0x43, 0x0, 0x9, 0x0, 0x40, 0x43, 0x0, 0x9, 0x0, 0x48, 0x43, 0x0, 0x9, 0x0, 0x50, 0x43, 0x0, 0x9, 0x0, 0x58, 0x43, 0x0, 0x9, 0x0, 0x60, 0x43, 0x0, 0x9, 0x0, 0x68, 0x43, 0x0, 0x9, 0x0, 0x70, 0x43, 0x0, 0x9, 0x0, 0x78, 0x43, 0x0, 0x9, 0x0, 0x80, 0x43, 0x0, 0x9, 0x0, 0x88, 0x43, 0x0, 0x9, 0x0, 0x90, 0x43, 0x0, 0x9, 0x0, 0x98, 0x43, 0x0, 0x9, 0x0, 0xA0, 0x43, 0x0, 0x9, 0x0, 0xA8, 0x43, 0x0, 0x9, 0x0, 0xB0, 0x43, 0x0, 0x9, 0x0, 0xB8, 0x43, 0x0, 0x9, 0x0, 0xC0, 0x43, 0x0, 0x9, 0x0, 0xC8, 0x43, 0x0, 0x9, 0x0, 0xD0, 0x43, 0x0, 0x9, 0x0, 0xD8, 0x43, 0x0, 0x9, 0x0, 0xE0, 0x43, 0x0, 0x9, 0x0, 0xE8, 0x43, 0x0, 0x9, 0x0, 0xF0, 0x43, 0x0, 0x9, 0x0, 0xF8, 0x43, 0x0, 0x9, 0x0, 0x0, 0x44, 0x0, 0x9, 0x0, 0x8, 0x44, 0x0, 0x9, 0x0, 0x10, 0x44, 0x0, 0x9, 0x0, 0x18, 0x44, 0x0, 0x9, 0x0, 0x20, 0x44, 0x0, 0x9, 0x0, 0x28, 0x44, 0x0, 0x9, 0x0, 0x30, 0x44, 0x0, 0x9, 0x0, 0x38, 0x44, 0x0, 0x9, 0x0, 0x40, 0x44, 0x0, 0x29, 0x11, 0x1, 0x0, 0x0, 0x49, 0x11, 0x1, 0x0, 0x0, 0x69, 0x11, 0x1, 0x0, 0x0, 0x89, 0x11, 0x1, 0x0, 0x0, 0xA9, 0x11, 0x1, 0x0, 0x0, 0xC9, 0x11, 0x1, 0x0, 0x0, 0xE9, 0x11, 0x1, 0x0, 0x0, 0x9, 0x12, 0x1, 0x0, 0x0, 0x29, 0x12, 0x1, 0x0, 0x0, 0x49, 0x12, 0x1, 0x0, 0x0, 0x69, 0x12, 0x1, 0x0, 0x0, 0x89, 0x12, 0x1, 0x0, 0x0, 0xA9, 0x12, 0x1, 0x0, 0x0, 0xC9, 0x12, 0x1, 0x0, 0x0, 0xE9, 0x12, 0x1, 0x0, 0x0, 0x9, 0x13, 0x1, 0x0, 0x0, 0x29, 0x13, 0x1, 0x0, 0x0, 0x49, 0x13, 0x1, 0x0, 0x0, 0x69, 0x13, 0x1, 0x0, 0x0, 0x89, 0x13, 0x1, 0x0, 0x0, 0xA9, 0x13, 0x1, 0x0, 0x0, 0xC9, 0x13, 0x1, 0x0, 0x0, 0xE9, 0x13, 0x1, 0x0, 0x0, 0x9, 0x14, 0x1, 0x0, 0x0, 0x29, 0x14, 0x1, 0x0, 0x0, 0x49, 0x14, 0x1, 0x0, 0x0, 0x69, 0x14, 0x1, 0x0, 0x0, 0x89, 0x14, 0x1, 0x0, 0x0, 0xA9, 0x14, 0x1, 0x0, 0x0, 0xC9, 0x14, 0x1, 0x0, 0x0, 0xE9, 0x14, 0x1, 0x0, 0x0, 0x9, 0x15, 0x1, 0x0, 0x0, 0x29, 0x15, 0x1, 0x0, 0x0, 0x49, 0x15, 0x1, 0x0, 0x0, 0x69, 0x15, 0x1, 0x0, 0x0, 0x89, 0x15, 0x1, 0x0, 0x0, 0xA9, 0x15, 0x1, 0x0, 0x0, 0xC9, 0x15, 0x1, 0x0, 0x0, 0xE9, 0x15, 0x1, 0x0, 0x0, 0x9, 0x16, 0x1, 0x0, 0x0, 0x29, 0x16, 0x1, 0x0, 0x0, 0x49, 0x16, 0x1, 0x0, 0x0, 0x69, 0x16, 0x1, 0x0, 0x0, 0x89, 0x16, 0x1, 0x0, 0x0, 0xA9, 0x16, 0x1, 0x0, 0x0, 0xC9, 0x16, 0x1, 0x0, 0x0, 0xE9, 0x16, 0x1, 0x0, 0x0, 0x9, 0x17, 0x1, 0x0, 0x0, 0x29, 0x17, 0x1, 0x0, 0x0, 0x49, 0x17, 0x1, 0x0, 0x0, 0x69, 0x17, 0x1, 0x0, 0x0, 0x89, 0x17, 0x1, 0x0, 0x0, 0xA9, 0x17, 0x1, 0x0, 0x0, 0xC9, 0x17, 0x1, 0x0, 0x0, 0xE9, 0x17, 0x1, 0x0, 0x0, 0x9, 0x18, 0x1, 0x0, 0x0, 0x29, 0x18, 0x1, 0x0, 0x0, 0x49, 0x18, 0x1, 0x0, 0x0, 0x69, 0x18, 0x1, 0x0, 0x0, 0x89, 0x18, 0x1, 0x0, 0x0, 0xA9, 0x18, 0x1, 0x0, 0x0, 0xC9, 0x18, 0x1, 0x0, 0x0, 0xE9, 0x18, 0x1, 0x0, 0x0, 0x9, 0x19, 0x1, 0x0, 0x0, 0x29, 0x19, 0x1, 0x0, 0x0, 0x49, 0x19, 0x1, 0x0, 0x0, 0x69, 0x19, 0x1, 0x0, 0x0, 0x89, 0x19, 0x1, 0x0, 0x0, 0xA9, 0x19, 0x1, 0x0, 0x0, 0xC9, 0x19, 0x1, 0x0, 0x0, 0xE9, 0x19, 0x1, 0x0, 0x0, 0x9, 0x1A, 0x1, 0x0, 0x0, 0x29, 0x1A, 0x1, 0x0, 0x0, 0x49, 0x1A, 0x1, 0x0, 0x0, 0x69, 0x1A, 0x1, 0x0, 0x0, 0x89, 0x1A, 0x1, 0x0, 0x0, 0xA9, 0x1A, 0x1, 0x0, 0x0, 0xC9, 0x1A, 0x1, 0x0, 0x0, 0xE9, 0x1A, 0x1, 0x0, 0x0, 0x9, 0x1B, 0x1, 0x0, 0x0, 0x29, 0x1B, 0x1, 0x0, 0x0, 0x49, 0x1B, 0x1, 0x0, 0x0, 0x69, 0x1B, 0x1, 0x0, 0x0, 0x89, 0x1B, 0x1, 0x0, 0x0, 0xA9, 0x1B, 0x1, 0x0, 0x0, 0xC9, 0x1B, 0x1, 0x0, 0x0, 0xE9, 0x1B, 0x1, 0x0, 0x0, 0x9, 0x1C, 0x1, 0x0, 0x0, 0x29, 0x1C, 0x1, 0x0, 0x0, 0x49, 0x1C, 0x1, 0x0, 0x0, 0x69, 0x1C, 0x1, 0x0, 0x0, 0x89, 0x1C, 0x1, 0x0, 0x0, 0xA9, 0x1C, 0x1, 0x0, 0x0, 0xC9, 0x1C, 0x1, 0x0, 0x0, 0xE9, 0x1C, 0x1, 0x0, 0x0, 0x9, 0x1D, 0x1, 0x0, 0x0, 0x29, 0x1D, 0x1, 0x0, 0x0, 0x49, 0x1D, 0x1, 0x0, 0x0, 0x69, 0x1D, 0x1, 0x0, 0x0, 0x89, 0x1D, 0x1, 0x0, 0x0, 0xA9, 0x1D, 0x1, 0x0, 0x0, 0xC9, 0x1D, 0x1, 0x0, 0x0, 0xE9, 0x1D, 0x1, 0x0, 0x0, 0x49, 0xFD, 0x0, 0x0, 0x0, 0x9, 0x1E, 0x1, 0x0, 0x0, 0x29, 0x1E, 0x1, 0x0, 0x0, 0x49, 0x1E, 0x1, 0x0, 0x0, 0x69, 0x1E, 0x1, 0x0, 0x0, 0x89, 0x1E, 0x1, 0x0, 0x0, 0xA9, 0x1E, 0x1, 0x0, 0x0, 0xC9, 0x1E, 0x1, 0x0, 0x0, 0xA9, 0xFD, 0x0, 0x0, 0x0, 0xC9, 0xFD, 0x0, 0x0, 0x0, 0xE9, 0xFD, 0x0, 0x0, 0x0, 0x9, 0xFE, 0x0, 0x0, 0x0, 0x29, 0xFE, 0x0, 0x0, 0x0, 0x49, 0xFE, 0x0, 0x0, 0x0, 0x69, 0xFE, 0x0, 0x0, 0x0, 0x89, 0xFE, 0x0, 0x0, 0x0, 0xA9, 0xFE, 0x0, 0x0, 0x0, 0xC9, 0xFE, 0x0, 0x0, 0x0, 0xE9, 0xFE, 0x0, 0x0, 0x0, 0x9, 0xFF, 0x0, 0x0, 0x0, 0x29, 0xFF, 0x0, 0x0, 0x0, 0x49, 0xFF, 0x0, 0x0, 0x0, 0x69, 0xFF, 0x0, 0x0, 0x0, 0x89, 0xFF, 0x0, 0x0, 0x0, 0xA9, 0xFF, 0x0, 0x0, 0x0, 0xC9, 0xFF, 0x0, 0x0, 0x0, 0xE9, 0xFF, 0x0, 0x0, 0x0, 0x9, 0x0, 0x1, 0x0, 0x0, 0x29, 0x0, 0x1, 0x0, 0x0, 0x49, 0x0, 0x1, 0x0, 0x0, 0x69, 0x0, 0x1, 0x0, 0x0, 0x89, 0x0, 0x1, 0x0, 0x0, 0xA9, 0x0, 0x1, 0x0, 0x0, 0xC9, 0x0, 0x1, 0x0, 0x0, 0xE9, 0x0, 0x1, 0x0, 0x0, 0x9, 0x1, 0x1, 0x0, 0x0, 0x29, 0x1, 0x1, 0x0, 0x0, 0x49, 0x1, 0x1, 0x0, 0x0, 0x69, 0x1, 0x1, 0x0, 0x0, 0x89, 0x1, 0x1, 0x0, 0x0, 0xA9, 0x1, 0x1, 0x0, 0x0, 0xC9, 0x1, 0x1, 0x0, 0x0, 0x9, 0x0, 0xB8, 0x47, 0x0, 0x9, 0x1F, 0x1, 0x0, 0x0, 0x29, 0x1F, 0x1, 0x0, 0x0, 0x49, 0x1F, 0x1, 0x0, 0x0, 0x69, 0x1F, 0x1, 0x0, 0x0, 0x89, 0x1F, 0x1, 0x0, 0x0, 0xA9, 0x1F, 0x1, 0x0, 0x0, 0xC9, 0x2, 0x1, 0x0, 0x0, 0xC9, 0x1F, 0x1, 0x0, 0x0, 0xE9, 0x1F, 0x1, 0x0, 0x0, 0x9, 0x20, 0x1, 0x0, 0x0, 0x29, 0x20, 0x1, 0x0, 0x0, 0x49, 0x20, 0x1, 0x0, 0x0, 0x69, 0x20, 0x1, 0x0, 0x0, 0x89, 0x20, 0x1, 0x0, 0x0, 0xA9, 0x20, 0x1, 0x0, 0x0, 0xC9, 0x20, 0x1, 0x0, 0x0, 0xE9, 0x20, 0x1, 0x0, 0x0, 0x9, 0x21, 0x1, 0x0, 0x0, 0x29, 0x21, 0x1, 0x0, 0x0, 0x49, 0x21, 0x1, 0x0, 0x0, 0x69, 0x21, 0x1, 0x0, 0x0, 0x89, 0x21, 0x1, 0x0, 0x0, 0xA9, 0x21, 0x1, 0x0, 0x0, 0xC9, 0x21, 0x1, 0x0, 0x0, 0xE9, 0x21, 0x1, 0x0, 0x0, 0x9, 0x22, 0x1, 0x0, 0x0, 0x29, 0x22, 0x1, 0x0, 0x0, 0x49, 0x22, 0x1, 0x0, 0x0, 0x69, 0x22, 0x1, 0x0, 0x0, 0x89, 0x22, 0x1, 0x0, 0x0, 0xA9, 0x22, 0x1, 0x0, 0x0, 0xC9, 0x22, 0x1, 0x0, 0x0, 0xE9, 0x22, 0x1, 0x0, 0x0, 0x9, 0x23, 0x1, 0x0, 0x0, 0x29, 0x23, 0x1, 0x0, 0x0, 0x49, 0x23, 0x1, 0x0, 0x0, 0x69, 0x23, 0x1, 0x0, 0x0, 0x89, 0x23, 0x1, 0x0, 0x0, 0xA9, 0x23, 0x1, 0x0, 0x0, 0xC9, 0x23, 0x1, 0x0, 0x0, 0xE9, 0x23, 0x1, 0x0, 0x0, 0x9, 0x0, 0x0, 0x49, 0x0, 0x9, 0x0, 0x8, 0x49, 0x0, 0x9, 0x0, 0x10, 0x49, 0x0, 0x9, 0x0, 0x18, 0x49, 0x0, 0x9, 0x0, 0x20, 0x49, 0x0, 0x9, 0x0, 0x28, 0x49, 0x0, 0x9, 0x0, 0x30, 0x49, 0x0, 0x9, 0x0, 0x38, 0x49, 0x0, 0x9, 0x0, 0x40, 0x49, 0x0, 0x9, 0x0, 0x48, 0x49, 0x0, 0x9, 0x0, 0x50, 0x49, 0x0, 0x9, 0x0, 0x58, 0x49, 0x0, 0x9, 0x0, 0x60, 0x49, 0x0, 0x9, 0x0, 0x68, 0x49, 0x0, 0x9, 0x0, 0x70, 0x49, 0x0, 0x9, 0x0, 0x78, 0x49, 0x0, 0x9, 0x0, 0x80, 0x49, 0x0, 0x9, 0x0, 0x88, 0x49, 0x0, 0x9, 0x0, 0x90, 0x49, 0x0, 0x9, 0x0, 0x98, 0x49, 0x0, 0x9, 0x0, 0xA0, 0x49, 0x0, 0x9, 0x0, 0xA8, 0x49, 0x0, 0x9, 0x0, 0xB0, 0x49, 0x0, 0x9, 0x0, 0xB8, 0x49, 0x0, 0x9, 0x0, 0xC0, 0x49, 0x0, 0x9, 0x0, 0xC8, 0x49, 0x0, 0x9, 0x0, 0xD0, 0x49, 0x0, 0x9, 0x0, 0xD8, 0x49, 0x0, 0x9, 0x0, 0xE0, 0x49, 0x0, 0x9, 0x0, 0xE8, 0x49, 0x0, 0x9, 0x0, 0xF0, 0x49, 0x0, 0x9, 0x0, 0xA0, 0x39, 0x0, 0x9, 0x0, 0xF8, 0x49, 0x0, 0x9, 0x0, 0x90, 0x39, 0x0, 0x9, 0x0, 0x0, 0x4A, 0x0, 0x9, 0x0, 0x8, 0x4A, 0x0, 0x9, 0x0, 0x10, 0x4A, 0x0, 0x9, 0x0, 0x18, 0x4A, 0x0, 0x9, 0x0, 0x20, 0x4A, 0x0, 0x9, 0x0, 0x28, 0x4A, 0x0, 0x9, 0x0, 0x30, 0x4A, 0x0, 0x9, 0x0, 0x38, 0x4A, 0x0, 0x9, 0x0, 0x40, 0x4A, 0x0, 0x9, 0x0, 0x48, 0x4A, 0x0, 0x9, 0x0, 0x50, 0x4A, 0x0, 0x9, 0x0, 0x58, 0x4A, 0x0, 0x9, 0x0, 0x60, 0x4A, 0x0, 0x9, 0x0, 0x68, 0x4A, 0x0, 0x9, 0x0, 0x70, 0x4A, 0x0, 0x9, 0x0, 0x78, 0x4A, 0x0, 0x9, 0x0, 0x80, 0x4A, 0x0, 0x9, 0x0, 0x88, 0x4A, 0x0, 0x9, 0x0, 0x90, 0x4A, 0x0, 0x9, 0x0, 0x98, 0x4A, 0x0, 0x9, 0x0, 0xA0, 0x4A, 0x0, 0x9, 0x0, 0xA8, 0x4A, 0x0, 0x9, 0x0, 0xB0, 0x4A, 0x0, 0x9, 0x0, 0xB8, 0x4A, 0x0, 0x9, 0x0, 0xC0, 0x4A, 0x0, 0x9, 0x0, 0xC8, 0x4A, 0x0, 0x9, 0x0, 0xD0, 0x4A, 0x0, 0x69, 0x2B, 0x1, 0x0, 0x0, 0x89, 0x2B, 0x1, 0x0, 0x0, 0xA9, 0x2B, 0x1, 0x0, 0x0, 0xC9, 0x2B, 0x1, 0x0, 0x0, 0xE9, 0x2B, 0x1, 0x0, 0x0, 0x9, 0x2C, 0x1, 0x0, 0x0, 0x9, 0x0, 0x8, 0x4B, 0x0, 0x9, 0x0, 0x10, 0x4B, 0x0, 0x9, 0x0, 0x18, 0x4B, 0x0, 0x9, 0x0, 0x20, 0x4B, 0x0, 0x9, 0x0, 0x28, 0x4B, 0x0, 0x9, 0x0, 0x30, 0x4B, 0x0, 0x9, 0x0, 0x38, 0x4B, 0x0, 0x9, 0x0, 0x40, 0x4B, 0x0, 0x9, 0x0, 0x48, 0x4B, 0x0, 0x9, 0x0, 0x50, 0x4B, 0x0, 0x9, 0x0, 0x58, 0x4B, 0x0, 0x9, 0x0, 0x60, 0x4B, 0x0, 0x9, 0x0, 0x68, 0x4B, 0x0, 0x9, 0x0, 0x70, 0x4B, 0x0, 0x9, 0x0, 0x78, 0x4B, 0x0, 0x9, 0x0, 0x80, 0x4B, 0x0, 0x9, 0x0, 0x88, 0x4B, 0x0, 0x9, 0x0, 0x90, 0x4B, 0x0, 0x9, 0x0, 0x98, 0x4B, 0x0, 0x9, 0x0, 0xA0, 0x4B, 0x0, 0x9, 0x0, 0xA8, 0x4B, 0x0, 0x9, 0x0, 0xB0, 0x4B, 0x0, 0x9, 0x0, 0xB8, 0x4B, 0x0, 0x9, 0x0, 0xC0, 0x4B, 0x0, 0x9, 0x0, 0xC8, 0x4B, 0x0, 0x9, 0x0, 0xD0, 0x4B, 0x0, 0x9, 0x0, 0xD8, 0x4B, 0x0, 0x9, 0x0, 0xE0, 0x4B, 0x0, 0x9, 0x0, 0xE8, 0x4B, 0x0, 0x9, 0x0, 0xF0, 0x4B, 0x0, 0x9, 0x0, 0xF8, 0x4B, 0x0, 0x9, 0x0, 0x0, 0x4C, 0x0, 0x9, 0x0, 0x8, 0x4C, 0x0, 0x9, 0x0, 0x10, 0x4C, 0x0, 0x9, 0x0, 0x18, 0x4C, 0x0, 0x9, 0x0, 0x20, 0x4C, 0x0, 0x9, 0x0, 0x28, 0x4C, 0x0, 0x9, 0x0, 0x30, 0x4C, 0x0, 0x9, 0x0, 0x70, 0x3B, 0x0, 0x9, 0x0, 0x78, 0x3B, 0x0, 0x9, 0x0, 0x80, 0x3B, 0x0, 0x9, 0x0, 0x88, 0x3B, 0x0, 0x9, 0x0, 0x90, 0x3B, 0x0, 0x9, 0x0, 0x98, 0x3B, 0x0, 0x9, 0x0, 0xA0, 0x3B, 0x0, 0x9, 0x0, 0x38, 0x4C, 0x0, 0x9, 0x0, 0x40, 0x4C, 0x0, 0x9, 0x0, 0x48, 0x4C, 0x0, 0x9, 0x0, 0x50, 0x4C, 0x0, 0x9, 0x0, 0x58, 0x4C, 0x0, 0x9, 0x0, 0x60, 0x4C, 0x0, 0x9, 0x0, 0x68, 0x4C, 0x0, 0x9, 0x0, 0x70, 0x4C, 0x0, 0x9, 0x0, 0x78, 0x4C, 0x0, 0x9, 0x0, 0x80, 0x4C, 0x0, 0x9, 0x0, 0x88, 0x4C, 0x0, 0x9, 0x0, 0x90, 0x4C, 0x0, 0x9, 0x0, 0x98, 0x4C, 0x0, 0x9, 0x0, 0xA0, 0x4C, 0x0, 0x9, 0x0, 0xA8, 0x4C, 0x0, 0x9, 0x0, 0xB0, 0x4C, 0x0, 0x9, 0x0, 0xB8, 0x4C, 0x0, 0x9, 0x0, 0x50, 0x47, 0x0, 0x9, 0x0, 0x58, 0x47, 0x0, 0x9, 0x0, 0x60, 0x47, 0x0, 0x9, 0x0, 0x68, 0x47, 0x0, 0x9, 0x0, 0x70, 0x47, 0x0, 0x9, 0x0, 0x78, 0x47, 0x0, 0x9, 0x0, 0x80, 0x47, 0x0, 0x9, 0x0, 0x88, 0x47, 0x0, 0x9, 0x0, 0x90, 0x47, 0x0, 0x9, 0x0, 0x98, 0x47, 0x0, 0x9, 0x0, 0xA0, 0x47, 0x0, 0x9, 0x0, 0xA8, 0x47, 0x0, 0x9, 0x0, 0xB0, 0x47, 0x0, 0x9, 0x0, 0xC0, 0x4C, 0x0, 0x9, 0x0, 0xC8, 0x4C, 0x0, 0x9, 0x0, 0xD0, 0x4C, 0x0, 0x9, 0x0, 0xD8, 0x4C, 0x0, 0x9, 0x0, 0xE0, 0x4C, 0x0, 0x9, 0x0, 0xE8, 0x4C, 0x0, 0x9, 0x0, 0xF0, 0x4C, 0x0, 0x9, 0x0, 0xF8, 0x4C, 0x0, 0x9, 0x0, 0xC0, 0x47, 0x0, 0x9, 0x0, 0xC8, 0x47, 0x0, 0x9, 0x0, 0xD0, 0x47, 0x0, 0x9, 0x0, 0xD8, 0x47, 0x0, 0x9, 0x0, 0xE0, 0x47, 0x0, 0x9, 0x0, 0xE8, 0x47, 0x0, 0x9, 0x0, 0xF0, 0x47, 0x0, 0x9, 0x0, 0xF8, 0x47, 0x0, 0x9, 0x0, 0x18, 0x3C, 0x0, 0x9, 0x0, 0x20, 0x3C, 0x0, 0x9, 0x0, 0x28, 0x3C, 0x0, 0x9, 0x0, 0x30, 0x3C, 0x0, 0x9, 0x0, 0x38, 0x3C, 0x0, 0x9, 0x0, 0x40, 0x3C, 0x0, 0x9, 0x0, 0x0, 0x4D, 0x0, 0x9, 0x0, 0x8, 0x4D, 0x0, 0x9, 0x0, 0x10, 0x4D, 0x0, 0x9, 0x0, 0x18, 0x4D, 0x0, 0x9, 0x0, 0x20, 0x4D, 0x0, 0x9, 0x0, 0x28, 0x4D, 0x0, 0x9, 0x0, 0x30, 0x4D, 0x0, 0x9, 0x0, 0x38, 0x4D, 0x0, 0x9, 0x0, 0x40, 0x4D, 0x0, 0x9, 0x0, 0x48, 0x4D, 0x0, 0x9, 0x0, 0x50, 0x4D, 0x0, 0x9, 0x0, 0x58, 0x4D, 0x0, 0x9, 0x0, 0x60, 0x4D, 0x0, 0x9, 0x0, 0x68, 0x4D, 0x0, 0x9, 0x0, 0x70, 0x4D, 0x0, 0x9, 0x0, 0x78, 0x4D, 0x0, 0x9, 0x0, 0x80, 0x4D, 0x0, 0x9, 0x0, 0x88, 0x4D, 0x0, 0x9, 0x0, 0x90, 0x4D, 0x0, 0x9, 0x0, 0x98, 0x4D, 0x0, 0x9, 0x0, 0xA0, 0x4D, 0x0, 0x9, 0x0, 0xA8, 0x4D, 0x0, 0x9, 0x0, 0xB0, 0x4D, 0x0, 0x9, 0x0, 0xB8, 0x4D, 0x0, 0x9, 0x0, 0xC0, 0x4D, 0x0, 0x9, 0x0, 0xC8, 0x4D, 0x0, 0x9, 0x0, 0xD0, 0x4D, 0x0, 0x9, 0x0, 0xD8, 0x4D, 0x0, 0x9, 0x0, 0xE0, 0x4D, 0x0, 0x9, 0x0, 0xE8, 0x4D, 0x0, 0x9, 0x0, 0xF0, 0x4D, 0x0, 0x9, 0x0, 0xF8, 0x4D, 0x0, 0x9, 0x0, 0x0, 0x4E, 0x0, 0x9, 0x0, 0x8, 0x4E, 0x0, 0x9, 0x0, 0x10, 0x4E, 0x0, 0x9, 0x0, 0x18, 0x4E, 0x0, 0x9, 0x0, 0x20, 0x4E, 0x0, 0x9, 0x0, 0x28, 0x4E, 0x0, 0x9, 0x0, 0x30, 0x4E, 0x0, 0x9, 0x0, 0x38, 0x4E, 0x0, 0x9, 0x0, 0x40, 0x4E, 0x0, 0x9, 0x0, 0x48, 0x4E, 0x0, 0x9, 0x0, 0x50, 0x4E, 0x0, 0x9, 0x0, 0x58, 0x4E, 0x0, 0x9, 0x0, 0x60, 0x4E, 0x0, 0x9, 0x0, 0x68, 0x4E, 0x0, 0x9, 0x0, 0x70, 0x4E, 0x0, 0x9, 0x0, 0x78, 0x4E, 0x0, 0x9, 0x3A, 0x1, 0x0, 0x0, 0x29, 0x3A, 0x1, 0x0, 0x0, 0x49, 0x3A, 0x1, 0x0, 0x0, 0x69, 0x3A, 0x1, 0x0, 0x0, 0x89, 0x3A, 0x1, 0x0, 0x0, 0xA9, 0x3A, 0x1, 0x0, 0x0, 0xC9, 0x3A, 0x1, 0x0, 0x0, 0xE9, 0x3A, 0x1, 0x0, 0x0, 0x9, 0x3B, 0x1, 0x0, 0x0, 0x29, 0x3B, 0x1, 0x0, 0x0, 0x49, 0x3B, 0x1, 0x0, 0x0, 0x69, 0x3B, 0x1, 0x0, 0x0, 0x89, 0x3B, 0x1, 0x0, 0x0, 0xA9, 0x3B, 0x1, 0x0, 0x0, 0xC9, 0x3B, 0x1, 0x0, 0x0, 0xE9, 0x3B, 0x1, 0x0, 0x0, 0x9, 0x3C, 0x1, 0x0, 0x0, 0x29, 0x3C, 0x1, 0x0, 0x0, 0x49, 0x3C, 0x1, 0x0, 0x0, 0x69, 0x3C, 0x1, 0x0, 0x0, 0x89, 0x3C, 0x1, 0x0, 0x0, 0xA9, 0x3C, 0x1, 0x0, 0x0, 0xC9, 0x3C, 0x1, 0x0, 0x0, 0xE9, 0x3C, 0x1, 0x0, 0x0, 0x9, 0x3D, 0x1, 0x0, 0x0, 0x29, 0x3D, 0x1, 0x0, 0x0, 0x49, 0x3D, 0x1, 0x0, 0x0, 0x69, 0x3D, 0x1, 0x0, 0x0, 0x89, 0x3D, 0x1, 0x0, 0x0, 0xA9, 0x3D, 0x1, 0x0, 0x0, 0xC9, 0x3D, 0x1, 0x0, 0x0, 0xE9, 0x3D, 0x1, 0x0, 0x0, 0x9, 0x3E, 0x1, 0x0, 0x0, 0x29, 0x3E, 0x1, 0x0, 0x0, 0x49, 0x3E, 0x1, 0x0, 0x0, 0x69, 0x3E, 0x1, 0x0, 0x0, 0x89, 0x3E, 0x1, 0x0, 0x0, 0xA9, 0x3E, 0x1, 0x0, 0x0, 0xC9, 0x3E, 0x1, 0x0, 0x0, 0xE9, 0x3E, 0x1, 0x0, 0x0, 0x9, 0x3F, 0x1, 0x0, 0x0, 0x29, 0x3F, 0x1, 0x0, 0x0, 0x49, 0x3F, 0x1, 0x0, 0x0, 0x69, 0x3F, 0x1, 0x0, 0x0, 0x89, 0x3F, 0x1, 0x0, 0x0, 0xA9, 0x3F, 0x1, 0x0, 0x0, 0xC9, 0x3F, 0x1, 0x0, 0x0, 0xE9, 0x3F, 0x1, 0x0, 0x0, 0x9, 0x40, 0x1, 0x0, 0x0, 0x29, 0x40, 0x1, 0x0, 0x0, 0x49, 0x40, 0x1, 0x0, 0x0, 0x69, 0x40, 0x1, 0x0, 0x0, 0x89, 0x40, 0x1, 0x0, 0x0, 0xA9, 0x40, 0x1, 0x0, 0x0, 0xC9, 0x40, 0x1, 0x0, 0x0, 0xA9, 0x2A, 0xA9, 0x35, 0x0, 0xE9, 0x40, 0x1, 0x0, 0x0, 0x9, 0x41, 0xF9, 0x35, 0x0, 0x29, 0x41, 0x9, 0x36, 0x0, 0x49, 0x41, 0x1, 0x0, 0x0, 0x69, 0x41, 0x39, 0x36, 0x0, 0x89, 0x41, 0x89, 0x36, 0x0, 0xA9, 0x41, 0xB9, 0x36, 0x0, 0xC9, 0x41, 0x29, 0x37, 0x0, 0xE9, 0x41, 0x49, 0x37, 0x0, 0x29, 0x3, 0x59, 0x37, 0x0, 0x9, 0x42, 0xB9, 0x37, 0x0, 0x29, 0x42, 0xA9, 0x37, 0x0, 0xC9, 0x4, 0xD9, 0x37, 0x0, 0x49, 0x42, 0xE9, 0x37, 0x0, 0x69, 0x42, 0x19, 0x38, 0x0, 0x89, 0x42, 0x29, 0x38, 0x0, 0xA9, 0x42, 0x51, 0x38, 0x0, 0xC9, 0x42, 0x59, 0x38, 0x0, 0xE9, 0x42, 0x71, 0x38, 0x0, 0x9, 0x43, 0x99, 0x38, 0x0, 0x29, 0x43, 0xA1, 0x38, 0x0, 0x49, 0x43, 0x1, 0x0, 0x0, 0x69, 0x43, 0x79, 0x37, 0x0, 0x89, 0x43, 0x1, 0x0, 0x0, 0xA9, 0x43, 0x39, 0x37, 0x0, 0x9, 0x0, 0xF0, 0x50, 0x0, 0x9, 0x0, 0xF8, 0x50, 0x0, 0x9, 0x0, 0x98, 0x4E, 0x0, 0x9, 0x0, 0x0, 0x51, 0x0, 0x9, 0x0, 0x8, 0x51, 0x0, 0x9, 0x0, 0x10, 0x51, 0x0, 0x9, 0x0, 0x18, 0x51, 0x0, 0x9, 0x0, 0x20, 0x51, 0x0, 0x9, 0x0, 0xC0, 0x4E, 0x0, 0x9, 0x0, 0xC8, 0x4E, 0x0, 0x9, 0x0, 0xD0, 0x4E, 0x0, 0x9, 0x0, 0xD8, 0x4E, 0x0, 0x9, 0x0, 0xE0, 0x4E, 0x0, 0x9, 0x0, 0xE8, 0x4E, 0x0, 0x9, 0x0, 0xF0, 0x4E, 0x0, 0x9, 0x0, 0xF8, 0x4E, 0x0, 0x9, 0x0, 0x0, 0x4F, 0x0, 0x9, 0x0, 0x28, 0x51, 0x0, 0x9, 0x0, 0x30, 0x51, 0x0, 0x9, 0x0, 0x38, 0x51, 0x0, 0x9, 0x0, 0x40, 0x51, 0x0, 0x9, 0x0, 0x48, 0x51, 0x0, 0x9, 0x0, 0x50, 0x51, 0x0, 0x9, 0x0, 0x58, 0x51, 0x0, 0x9, 0x0, 0x60, 0x51, 0x0, 0x9, 0x0, 0x68, 0x51, 0x0, 0x9, 0x0, 0x70, 0x51, 0x0, 0x9, 0x0, 0x78, 0x51, 0x0, 0x9, 0x0, 0x80, 0x51, 0x0, 0x9, 0x0, 0x68, 0x39, 0x0, 0x9, 0x0, 0x78, 0x39, 0x0, 0x9, 0x0, 0x88, 0x51, 0x0, 0x9, 0x0, 0x90, 0x51, 0x0, 0x9, 0x0, 0x98, 0x51, 0x0, 0x9, 0x0, 0xA0, 0x51, 0x0, 0x9, 0x0, 0xA8, 0x51, 0x0, 0x9, 0x0, 0xE0, 0x39, 0x0, 0x9, 0x0, 0xE8, 0x39, 0x0, 0x9, 0x0, 0xF0, 0x39, 0x0, 0x9, 0x0, 0x10, 0x3A, 0x0, 0x9, 0x0, 0xB0, 0x51, 0x0, 0x9, 0x0, 0x38, 0x3A, 0x0, 0x9, 0x0, 0xB8, 0x51, 0x0, 0x9, 0x0, 0x48, 0x3A, 0x0, 0x9, 0x0, 0x50, 0x3A, 0x0, 0x9, 0x0, 0xC0, 0x51, 0x0, 0x9, 0x0, 0x68, 0x3A, 0x0, 0x9, 0x0, 0x70, 0x3A, 0x0, 0x9, 0x0, 0xC8, 0x51, 0x0, 0x9, 0x0, 0x20, 0x50, 0x0, 0x9, 0x0, 0xD0, 0x51, 0x0, 0x9, 0x0, 0x28, 0x50, 0x0, 0x9, 0x0, 0x30, 0x50, 0x0, 0x9, 0x0, 0x78, 0x3A, 0x0, 0x9, 0x0, 0x80, 0x3A, 0x0, 0x9, 0x0, 0x88, 0x3A, 0x0, 0x9, 0x0, 0x90, 0x3A, 0x0, 0x9, 0x0, 0x98, 0x3A, 0x0, 0x9, 0x0, 0xA0, 0x3A, 0x0, 0x9, 0x0, 0xA8, 0x3A, 0x0, 0x9, 0x0, 0xB0, 0x3A, 0x0, 0x9, 0x0, 0xB8, 0x3A, 0x0, 0x9, 0x0, 0xC0, 0x3A, 0x0, 0x9, 0x0, 0xC8, 0x3A, 0x0, 0x9, 0x0, 0xD0, 0x3A, 0x0, 0x9, 0x0, 0xD8, 0x3A, 0x0, 0x9, 0x0, 0xE0, 0x3A, 0x0, 0x9, 0x0, 0xE8, 0x3A, 0x0, 0x9, 0x0, 0xF0, 0x3A, 0x0, 0x9, 0x0, 0xF8, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x3B, 0x0, 0x9, 0x0, 0x8, 0x3B, 0x0, 0x9, 0x0, 0xD8, 0x51, 0x0, 0x9, 0x0, 0xE0, 0x51, 0x0, 0x9, 0x0, 0xE8, 0x51, 0x0, 0x9, 0x0, 0xF0, 0x51, 0x0, 0x9, 0x0, 0xF8, 0x51, 0x0, 0x9, 0x0, 0x0, 0x52, 0x0, 0x9, 0x0, 0x8, 0x52, 0x0, 0x9, 0x0, 0x10, 0x52, 0x0, 0x9, 0x0, 0x58, 0x3B, 0x0, 0x9, 0x0, 0x60, 0x3B, 0x0, 0x9, 0x0, 0x68, 0x3B, 0x0, 0x9, 0x0, 0x18, 0x52, 0x0, 0x9, 0x0, 0x20, 0x52, 0x0, 0x9, 0x0, 0x28, 0x52, 0x0, 0x9, 0x0, 0x30, 0x52, 0x0, 0x9, 0x0, 0x38, 0x52, 0x0, 0x9, 0x0, 0x40, 0x52, 0x0, 0x9, 0x0, 0x48, 0x52, 0x0, 0x9, 0x0, 0x50, 0x52, 0x0, 0x9, 0x0, 0x58, 0x52, 0x0, 0x9, 0x0, 0x60, 0x52, 0x0, 0x9, 0x0, 0x68, 0x52, 0x0, 0x9, 0x0, 0x70, 0x52, 0x0, 0x9, 0x0, 0x78, 0x52, 0x0, 0x9, 0x0, 0x80, 0x52, 0x0, 0x9, 0x0, 0x88, 0x52, 0x0, 0x9, 0x0, 0x90, 0x52, 0x0, 0x9, 0x0, 0x98, 0x52, 0x0, 0x9, 0x0, 0xA0, 0x52, 0x0, 0x9, 0x0, 0xA8, 0x52, 0x0, 0x9, 0x0, 0xB0, 0x52, 0x0, 0x9, 0x0, 0xB8, 0x52, 0x0, 0x9, 0x0, 0xC0, 0x52, 0x0, 0x9, 0x0, 0xC8, 0x52, 0x0, 0x9, 0x0, 0xD0, 0x52, 0x0, 0x9, 0x0, 0xD8, 0x52, 0x0, 0x9, 0x0, 0xE0, 0x52, 0x0, 0x9, 0x0, 0xE8, 0x52, 0x0, 0x9, 0x0, 0xF0, 0x52, 0x0, 0x9, 0x0, 0xF8, 0x52, 0x0, 0x9, 0x0, 0x0, 0x53, 0x0, 0x9, 0x0, 0x8, 0x53, 0x0, 0x9, 0x0, 0x10, 0x53, 0x0, 0x9, 0x0, 0x18, 0x53, 0x0, 0x9, 0x0, 0x20, 0x53, 0x0, 0x9, 0x0, 0x28, 0x53, 0x0, 0x9, 0x0, 0x30, 0x53, 0x0, 0x9, 0x0, 0x38, 0x53, 0x0, 0x9, 0x0, 0x40, 0x53, 0x0, 0x9, 0x0, 0x48, 0x53, 0x0, 0x9, 0x0, 0x50, 0x53, 0x0, 0x9, 0x0, 0x58, 0x53, 0x0, 0x9, 0x0, 0x60, 0x53, 0x0, 0x9, 0x0, 0x68, 0x53, 0x0, 0x9, 0x0, 0x70, 0x53, 0x0, 0x9, 0x0, 0x78, 0x53, 0x0, 0x9, 0x0, 0x80, 0x53, 0x0, 0x9, 0x0, 0x88, 0x53, 0x0, 0x9, 0x0, 0x90, 0x53, 0x0, 0x9, 0x0, 0x98, 0x53, 0x0, 0x9, 0x0, 0xA0, 0x53, 0x0, 0x9, 0x0, 0xA8, 0x53, 0x0, 0x9, 0x0, 0xB0, 0x53, 0x0, 0x9, 0x0, 0xB8, 0x53, 0x0, 0x9, 0x0, 0xC0, 0x53, 0x0, 0x2A, 0x4F, 0x1, 0x0, 0x0, 0x4A, 0x4F, 0x1, 0x0, 0x0, 0x6A, 0x4F, 0x1, 0x0, 0x0, 0x8A, 0x4F, 0x1, 0x0, 0x0, 0xAA, 0x4F, 0x1, 0x0, 0x0, 0xCA, 0x4F, 0x1, 0x0, 0x0, 0xEA, 0x4F, 0x1, 0x0, 0x0, 0xA, 0x50, 0x1, 0x0, 0x0, 0x2A, 0x50, 0x1, 0x0, 0x0, 0x4A, 0x50, 0x1, 0x0, 0x0, 0x6A, 0x50, 0x1, 0x0, 0x0, 0x8A, 0x50, 0x1, 0x0, 0x0, 0xAA, 0x50, 0x1, 0x0, 0x0, 0xCA, 0x50, 0x1, 0x0, 0x0, 0xEA, 0x50, 0x1, 0x0, 0x0, 0xA, 0x51, 0x1, 0x0, 0x0, 0x2A, 0x51, 0x1, 0x0, 0x0, 0x4A, 0x51, 0x1, 0x0, 0x0, 0x6A, 0x51, 0x1, 0x0, 0x0, 0x8A, 0x51, 0x1, 0x0, 0x0, 0xAA, 0x51, 0x1, 0x0, 0x0, 0xCA, 0x51, 0x1, 0x0, 0x0, 0xEA, 0x51, 0x1, 0x0, 0x0, 0xA, 0x52, 0x1, 0x0, 0x0, 0x2A, 0x52, 0x1, 0x0, 0x0, 0x4A, 0x52, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x54, 0x0, 0xA, 0x0, 0xA0, 0x54, 0x0, 0xA, 0x0, 0xA8, 0x54, 0x0, 0xA, 0x0, 0xB0, 0x54, 0x0, 0xA, 0x0, 0xB8, 0x54, 0x0, 0xA, 0x0, 0xC0, 0x54, 0x0, 0xA, 0x0, 0xC8, 0x54, 0x0, 0xA, 0x0, 0xD0, 0x54, 0x0, 0xA, 0x0, 0xD8, 0x54, 0x0, 0xA, 0x0, 0xE0, 0x54, 0x0, 0xA, 0x0, 0xE8, 0x54, 0x0, 0xA, 0x0, 0xF0, 0x54, 0x0, 0xA, 0x0, 0xF8, 0x54, 0x0, 0xA, 0x0, 0x0, 0x55, 0x0, 0xA, 0x0, 0x8, 0x55, 0x0, 0xA, 0x0, 0x10, 0x55, 0x0, 0xA, 0x0, 0x18, 0x55, 0x0, 0xA, 0x0, 0x20, 0x55, 0x0, 0xA, 0x0, 0x28, 0x55, 0x0, 0xA, 0x0, 0x30, 0x55, 0x0, 0xA, 0x0, 0x38, 0x55, 0x0, 0xA, 0x0, 0x40, 0x55, 0x0, 0xA, 0x0, 0x48, 0x55, 0x0, 0xA, 0x0, 0x50, 0x55, 0x0, 0xA, 0x0, 0x58, 0x55, 0x0, 0xA, 0x0, 0x60, 0x55, 0x0, 0xA, 0x0, 0x68, 0x55, 0x0, 0xA, 0x0, 0x70, 0x55, 0x0, 0xA, 0x0, 0x78, 0x55, 0x0, 0xA, 0x0, 0x80, 0x55, 0x0, 0xA, 0x0, 0x88, 0x55, 0x0, 0xA, 0x0, 0x90, 0x55, 0x0, 0xA, 0x0, 0x98, 0x55, 0x0, 0xA, 0x0, 0xA0, 0x55, 0x0, 0xA, 0x0, 0xA8, 0x55, 0x0, 0xA, 0x0, 0xB0, 0x55, 0x0, 0xA, 0x0, 0xB8, 0x55, 0x0, 0xA, 0x0, 0xC0, 0x55, 0x0, 0xA, 0x0, 0xC8, 0x55, 0x0, 0xA, 0x0, 0xD0, 0x55, 0x0, 0xA, 0x0, 0xD8, 0x55, 0x0, 0xA, 0x0, 0xE0, 0x55, 0x0, 0xA, 0x0, 0xE8, 0x55, 0x0, 0xA, 0x0, 0xF0, 0x55, 0x0, 0xA, 0x0, 0xF8, 0x55, 0x0, 0xA, 0x0, 0x0, 0x56, 0x0, 0xA, 0x0, 0x8, 0x56, 0x0, 0xA, 0x0, 0x10, 0x56, 0x0, 0xA, 0x0, 0x18, 0x56, 0x0, 0xA, 0x0, 0x20, 0x56, 0x0, 0xA, 0x0, 0x28, 0x56, 0x0, 0xA, 0x0, 0x30, 0x56, 0x0, 0xA, 0x0, 0x38, 0x56, 0x0, 0xA, 0x0, 0x40, 0x56, 0x0, 0xA, 0x0, 0x48, 0x56, 0x0, 0xA, 0x0, 0x50, 0x56, 0x0, 0xA, 0x0, 0x58, 0x56, 0x0, 0xA, 0x0, 0x60, 0x56, 0x0, 0xA, 0x0, 0x68, 0x56, 0x0, 0xA, 0x0, 0x70, 0x56, 0x0, 0xA, 0x0, 0x78, 0x56, 0x0, 0xA, 0x0, 0x80, 0x56, 0x0, 0xA, 0x0, 0x88, 0x56, 0x0, 0xA, 0x0, 0x90, 0x56, 0x0, 0xA, 0x0, 0x98, 0x56, 0x0, 0xA, 0x0, 0xA0, 0x56, 0x0, 0xA, 0x0, 0xA8, 0x56, 0x0, 0xA, 0x0, 0xB0, 0x56, 0x0, 0xA, 0x0, 0xB8, 0x56, 0x0, 0xA, 0x0, 0xC0, 0x56, 0x0, 0xA, 0x0, 0xC8, 0x56, 0x0, 0xA, 0x0, 0xD0, 0x56, 0x0, 0xA, 0x0, 0xD8, 0x56, 0x0, 0xA, 0x0, 0xE0, 0x56, 0x0, 0xA, 0x0, 0xE8, 0x56, 0x0, 0xA, 0x0, 0xF0, 0x56, 0x0, 0xA, 0x0, 0xF8, 0x56, 0x0, 0xA, 0x0, 0x0, 0x57, 0x0, 0xA, 0x0, 0x8, 0x57, 0x0, 0xA, 0x0, 0x10, 0x57, 0x0, 0xA, 0x0, 0x18, 0x57, 0x0, 0xA, 0x0, 0x20, 0x57, 0x0, 0xA, 0x0, 0x28, 0x57, 0x0, 0xA, 0x0, 0x30, 0x57, 0x0, 0xA, 0x0, 0x38, 0x57, 0x0, 0xA, 0x0, 0x40, 0x57, 0x0, 0xA, 0x0, 0x48, 0x57, 0x0, 0xA, 0x0, 0x50, 0x57, 0x0, 0xA, 0x0, 0x58, 0x57, 0x0, 0xA, 0x0, 0x60, 0x57, 0x0, 0xA, 0x0, 0x68, 0x57, 0x0, 0xA, 0x0, 0x70, 0x57, 0x0, 0xA, 0x0, 0x78, 0x57, 0x0, 0xA, 0x0, 0x80, 0x57, 0x0, 0xA, 0x0, 0x88, 0x57, 0x0, 0xA, 0x0, 0x90, 0x57, 0x0, 0xA, 0x0, 0x98, 0x57, 0x0, 0xA, 0x0, 0xA0, 0x57, 0x0, 0xA, 0x0, 0xA8, 0x57, 0x0, 0xA, 0x0, 0xB0, 0x57, 0x0, 0xA, 0x0, 0xB8, 0x57, 0x0, 0xA, 0x0, 0xC0, 0x57, 0x0, 0xA, 0x0, 0xC8, 0x57, 0x0, 0xA, 0x0, 0xD0, 0x57, 0x0, 0xA, 0x0, 0xD8, 0x57, 0x0, 0xA, 0x0, 0xE0, 0x57, 0x0, 0xA, 0x0, 0xE8, 0x57, 0x0, 0xA, 0x0, 0xF0, 0x57, 0x0, 0xA, 0x0, 0xF8, 0x57, 0x0, 0xA, 0x0, 0x0, 0x58, 0x0, 0xA, 0x0, 0x8, 0x58, 0x0, 0xA, 0x0, 0x10, 0x58, 0x0, 0xA, 0x0, 0x18, 0x58, 0x0, 0xA, 0x0, 0x20, 0x58, 0x0, 0xA, 0x0, 0x28, 0x58, 0x0, 0xA, 0x0, 0x30, 0x58, 0x0, 0xA, 0x0, 0x38, 0x58, 0x0, 0xA, 0x0, 0x40, 0x58, 0x0, 0xA, 0x0, 0x48, 0x58, 0x0, 0xA, 0x0, 0x50, 0x58, 0x0, 0xA, 0x0, 0x58, 0x58, 0x0, 0xA, 0x0, 0x60, 0x58, 0x0, 0xA, 0x0, 0x68, 0x58, 0x0, 0xA, 0x0, 0x70, 0x58, 0x0, 0xA, 0x0, 0x78, 0x58, 0x0, 0xA, 0x0, 0x80, 0x58, 0x0, 0xA, 0x0, 0x88, 0x58, 0x0, 0xA, 0x0, 0x90, 0x58, 0x0, 0xA, 0x0, 0x98, 0x58, 0x0, 0x6A, 0x55, 0x1, 0x0, 0x0, 0x8A, 0x62, 0x1, 0x0, 0x0, 0xAA, 0x62, 0x1, 0x0, 0x0, 0xCA, 0x62, 0x1, 0x0, 0x0, 0xCA, 0x5C, 0x1, 0x0, 0x0, 0xEA, 0x62, 0x1, 0x0, 0x0, 0xA, 0x5D, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x58, 0x0, 0x2A, 0x63, 0x1, 0x0, 0x0, 0x4A, 0x63, 0x1, 0x0, 0x0, 0x6A, 0x63, 0x1, 0x0, 0x0, 0x8A, 0x63, 0x1, 0x0, 0x0, 0xAA, 0x63, 0x1, 0x0, 0x0, 0xCA, 0x63, 0x1, 0x0, 0x0, 0xEA, 0x63, 0x1, 0x0, 0x0, 0xA, 0x64, 0x1, 0x0, 0x0, 0xAA, 0x55, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x59, 0x0, 0xEA, 0x55, 0x1, 0x0, 0x0, 0xA, 0x0, 0x10, 0x59, 0x0, 0x2A, 0x56, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x59, 0x0, 0xAA, 0x56, 0x1, 0x0, 0x0, 0xA, 0x0, 0x20, 0x59, 0x0, 0xEA, 0x56, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x59, 0x0, 0x2A, 0x57, 0x1, 0x0, 0x0, 0xA, 0x0, 0x30, 0x59, 0x0, 0x6A, 0x57, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x59, 0x0, 0xAA, 0x57, 0x1, 0x0, 0x0, 0xA, 0x0, 0x40, 0x59, 0x0, 0x2A, 0x65, 0x1, 0x0, 0x0, 0x4A, 0x65, 0x1, 0x0, 0x0, 0x6A, 0x65, 0x1, 0x0, 0x0, 0x8A, 0x65, 0x1, 0x0, 0x0, 0xAA, 0x65, 0x1, 0x0, 0x0, 0xCA, 0x65, 0x1, 0x0, 0x0, 0xEA, 0x65, 0x1, 0x0, 0x0, 0xA, 0x66, 0x1, 0x0, 0x0, 0x2A, 0x66, 0x1, 0x0, 0x0, 0x4A, 0x66, 0x1, 0x0, 0x0, 0x6A, 0x66, 0x1, 0x0, 0x0, 0x8A, 0x66, 0x1, 0x0, 0x0, 0xAA, 0x5E, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x59, 0x0, 0xCA, 0x66, 0x1, 0x0, 0x0, 0xEA, 0x66, 0x1, 0x0, 0x0, 0xA, 0x67, 0x1, 0x0, 0x0, 0x2A, 0x67, 0x1, 0x0, 0x0, 0x4A, 0x67, 0x1, 0x0, 0x0, 0x6A, 0x67, 0x1, 0x0, 0x0, 0xAA, 0x60, 0x1, 0x0, 0x0, 0x8A, 0x67, 0x1, 0x0, 0x0, 0xAA, 0x67, 0x1, 0x0, 0x0, 0xCA, 0x67, 0x1, 0x0, 0x0, 0xEA, 0x67, 0x1, 0x0, 0x0, 0xA, 0x68, 0x1, 0x0, 0x0, 0x2A, 0x68, 0x1, 0x0, 0x0, 0x4A, 0x68, 0x1, 0x0, 0x0, 0x6A, 0x68, 0x1, 0x0, 0x0, 0x8A, 0x68, 0x1, 0x0, 0x0, 0xAA, 0x68, 0x1, 0x0, 0x0, 0xCA, 0x68, 0x1, 0x0, 0x0, 0xEA, 0x68, 0x1, 0x0, 0x0, 0xA, 0x69, 0x1, 0x0, 0x0, 0x2A, 0x69, 0x1, 0x0, 0x0, 0x4A, 0x69, 0x1, 0x0, 0x0, 0x6A, 0x69, 0x1, 0x0, 0x0, 0x8A, 0x69, 0x1, 0x0, 0x0, 0xAA, 0x69, 0x1, 0x0, 0x0, 0xCA, 0x69, 0x1, 0x0, 0x0, 0xEA, 0x69, 0x1, 0x0, 0x0, 0xA, 0x6A, 0x1, 0x0, 0x0, 0x2A, 0x6A, 0x1, 0x0, 0x0, 0x4A, 0x6A, 0x1, 0x0, 0x0, 0x6A, 0x6A, 0x1, 0x0, 0x0, 0x8A, 0x6A, 0x1, 0x0, 0x0, 0xAA, 0x6A, 0x1, 0x0, 0x0, 0xCA, 0x6A, 0x1, 0x0, 0x0, 0xEA, 0x6A, 0x1, 0x0, 0x0, 0xA, 0x6B, 0x1, 0x0, 0x0, 0x2A, 0x6B, 0x1, 0x0, 0x0, 0x4A, 0x6B, 0x1, 0x0, 0x0, 0x6A, 0x6B, 0x1, 0x0, 0x0, 0x8A, 0x6B, 0x1, 0x0, 0x0, 0xAA, 0x6B, 0x1, 0x0, 0x0, 0xCA, 0x6B, 0x1, 0x0, 0x0, 0xEA, 0x6B, 0x1, 0x0, 0x0, 0xA, 0x6C, 0x1, 0x0, 0x0, 0x2A, 0x6C, 0x1, 0x0, 0x0, 0x4A, 0x6C, 0x1, 0x0, 0x0, 0x6A, 0x6C, 0x1, 0x0, 0x0, 0x8A, 0x6C, 0x1, 0x0, 0x0, 0xAA, 0x6C, 0x1, 0x0, 0x0, 0xCA, 0x6C, 0x1, 0x0, 0x0, 0xEA, 0x6C, 0x1, 0x0, 0x0, 0xA, 0x6D, 0x1, 0x0, 0x0, 0x2A, 0x6D, 0x1, 0x0, 0x0, 0x4A, 0x6D, 0x1, 0x0, 0x0, 0x6A, 0x6D, 0x1, 0x0, 0x0, 0x8A, 0x6D, 0x1, 0x0, 0x0, 0xAA, 0x6D, 0x1, 0x0, 0x0, 0xCA, 0x6D, 0x1, 0x0, 0x0, 0xEA, 0x6D, 0x1, 0x0, 0x0, 0xA, 0x6E, 0x1, 0x0, 0x0, 0x2A, 0x6E, 0x1, 0x0, 0x0, 0x4A, 0x6E, 0x1, 0x0, 0x0, 0x6A, 0x6E, 0x1, 0x0, 0x0, 0x8A, 0x6E, 0x1, 0x0, 0x0, 0xAA, 0x6E, 0x1, 0x0, 0x0, 0xCA, 0x6E, 0x1, 0x0, 0x0, 0xEA, 0x6E, 0x1, 0x0, 0x0, 0xA, 0x6F, 0x1, 0x0, 0x0, 0x2A, 0x6F, 0x1, 0x0, 0x0, 0x4A, 0x6F, 0x1, 0x0, 0x0, 0x6A, 0x6F, 0x1, 0x0, 0x0, 0x8A, 0x6F, 0x1, 0x0, 0x0, 0xAA, 0x6F, 0x1, 0x0, 0x0, 0xCA, 0x6F, 0x1, 0x0, 0x0, 0xEA, 0x6F, 0x1, 0x0, 0x0, 0xA, 0x70, 0x1, 0x0, 0x0, 0x2A, 0x70, 0x1, 0x0, 0x0, 0x4A, 0x70, 0x1, 0x0, 0x0, 0x6A, 0x70, 0x1, 0x0, 0x0, 0x8A, 0x70, 0x1, 0x0, 0x0, 0xAA, 0x70, 0x1, 0x0, 0x0, 0xCA, 0x70, 0x1, 0x0, 0x0, 0xEA, 0x70, 0x1, 0x0, 0x0, 0xA, 0x71, 0x1, 0x0, 0x0, 0x2A, 0x71, 0x1, 0x0, 0x0, 0x4A, 0x71, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x5C, 0x0, 0x8A, 0x71, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x5C, 0x0, 0xCA, 0x71, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x5C, 0x0, 0xA, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x5C, 0x0, 0x4A, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x5C, 0x0, 0x8A, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x5C, 0x0, 0xCA, 0x72, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x5C, 0x0, 0xA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x5C, 0x0, 0x4A, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD8, 0x5C, 0x0, 0x8A, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE8, 0x5C, 0x0, 0xCA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF8, 0x5C, 0x0, 0xA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x5D, 0x0, 0x4A, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x5D, 0x0, 0x8A, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x5D, 0x0, 0xCA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x5D, 0x0, 0xA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x5D, 0x0, 0x4A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x5D, 0x0, 0x8A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x5D, 0x0, 0xCA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x5D, 0x0, 0xA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x5D, 0x0, 0x4A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x5D, 0x0, 0x8A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x5D, 0x0, 0xCA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x5D, 0x0, 0xA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x5D, 0x0, 0x4A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD8, 0x5D, 0x0, 0x8A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE8, 0x5D, 0x0, 0xCA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF8, 0x5D, 0x0, 0xA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x5E, 0x0, 0x4A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x5E, 0x0, 0x8A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x5E, 0x0, 0xCA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x5E, 0x0, 0xA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x5E, 0x0, 0x4A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x5E, 0x0, 0x8A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x5E, 0x0, 0xCA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x5E, 0x0, 0xA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x5E, 0x0, 0x4A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x5E, 0x0, 0x8A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x5E, 0x0, 0xCA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x5E, 0x0, 0xA, 0x7B, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x5E, 0x0, 0x4A, 0x7B, 0x1, 0x0, 0x0, 0x6A, 0x7B, 0x1, 0x0, 0x0, 0x8A, 0x7B, 0x1, 0x0, 0x0, 0xAA, 0x7B, 0x1, 0x0, 0x0, 0xCA, 0x7B, 0x1, 0x0, 0x0, 0xEA, 0x7B, 0x1, 0x0, 0x0, 0xA, 0x7C, 0x1, 0x0, 0x0, 0x2A, 0x7C, 0x1, 0x0, 0x0, 0x4A, 0x7C, 0x1, 0x0, 0x0, 0x6A, 0x7C, 0x1, 0x0, 0x0, 0x8A, 0x7C, 0x1, 0x0, 0x0, 0xAA, 0x7C, 0x1, 0x0, 0x0, 0xCA, 0x7C, 0x1, 0x0, 0x0, 0xEA, 0x7C, 0x1, 0x0, 0x0, 0xA, 0x7D, 0x1, 0x0, 0x0, 0x2A, 0x7D, 0x1, 0x0, 0x0, 0x4A, 0x7D, 0x1, 0x0, 0x0, 0x6A, 0x7D, 0x1, 0x0, 0x0, 0x8A, 0x7D, 0x1, 0x0, 0x0, 0xAA, 0x7D, 0x1, 0x0, 0x0, 0xCA, 0x7D, 0x1, 0x0, 0x0, 0xEA, 0x7D, 0x1, 0x0, 0x0, 0xA, 0x7E, 0x1, 0x0, 0x0, 0x2A, 0x7E, 0x1, 0x0, 0x0, 0x4A, 0x7E, 0x1, 0x0, 0x0, 0x6A, 0x7E, 0x1, 0x0, 0x0, 0x8A, 0x7E, 0x1, 0x0, 0x0, 0xAA, 0x7E, 0x1, 0x0, 0x0, 0xCA, 0x7E, 0x1, 0x0, 0x0, 0xEA, 0x7E, 0x1, 0x0, 0x0, 0xA, 0x7F, 0x1, 0x0, 0x0, 0x2A, 0x7F, 0x1, 0x0, 0x0, 0x4A, 0x7F, 0x1, 0x0, 0x0, 0x6A, 0x7F, 0x1, 0x0, 0x0, 0x8A, 0x7F, 0x1, 0x0, 0x0, 0xAA, 0x7F, 0x1, 0x0, 0x0, 0xCA, 0x7F, 0x1, 0x0, 0x0, 0xEA, 0x7F, 0x1, 0x0, 0x0, 0xA, 0x80, 0x1, 0x0, 0x0, 0x2A, 0x80, 0x1, 0x0, 0x0, 0x4A, 0x80, 0x1, 0x0, 0x0, 0x6A, 0x80, 0x1, 0x0, 0x0, 0x8A, 0x80, 0x1, 0x0, 0x0, 0xAA, 0x80, 0x1, 0x0, 0x0, 0xCA, 0x80, 0x1, 0x0, 0x0, 0xEA, 0x80, 0x1, 0x0, 0x0, 0xA, 0x81, 0x1, 0x0, 0x0, 0x2A, 0x81, 0x1, 0x0, 0x0, 0x4A, 0x81, 0x1, 0x0, 0x0, 0x6A, 0x81, 0x1, 0x0, 0x0, 0x8A, 0x81, 0x1, 0x0, 0x0, 0xAA, 0x81, 0x1, 0x0, 0x0, 0xCA, 0x81, 0x1, 0x0, 0x0, 0xEA, 0x81, 0x1, 0x0, 0x0, 0xA, 0x0, 0x80, 0x60, 0x0, 0x2A, 0x82, 0x1, 0x0, 0x0, 0xA, 0x0, 0x90, 0x60, 0x0, 0x6A, 0x82, 0x1, 0x0, 0x0, 0x8A, 0x82, 0x1, 0x0, 0x0, 0xAA, 0x82, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB0, 0x60, 0x0, 0xEA, 0x82, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x60, 0x0, 0x2A, 0x83, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x60, 0x0, 0x6A, 0x83, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x60, 0x0, 0xAA, 0x83, 0x1, 0x0, 0x0, 0xCA, 0x83, 0x1, 0x0, 0x0, 0xEA, 0x83, 0x1, 0x0, 0x0, 0xA, 0x84, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x61, 0x0, 0x4A, 0x84, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x61, 0x0, 0x8A, 0x84, 0x1, 0x0, 0x0, 0xA, 0x0, 0x28, 0x61, 0x0, 0xCA, 0x84, 0x1, 0x0, 0x0, 0xEA, 0x84, 0x1, 0x0, 0x0, 0xA, 0x85, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x61, 0x0, 0x4A, 0x85, 0x1, 0x0, 0x0, 0x6A, 0x85, 0x1, 0x0, 0x0, 0x8A, 0x85, 0x1, 0x0, 0x0, 0xAA, 0x85, 0x1, 0x0, 0x0, 0xCA, 0x85, 0x1, 0x0, 0x0, 0xEA, 0x85, 0x1, 0x0, 0x0, 0xA, 0x86, 0x1, 0x0, 0x0, 0x2A, 0x86, 0x1, 0x0, 0x0, 0x4A, 0x86, 0x1, 0x0, 0x0, 0x6A, 0x86, 0x1, 0x0, 0x0, 0x8A, 0x86, 0x1, 0x0, 0x0, 0xAA, 0x86, 0x1, 0x0, 0x0, 0xCA, 0x86, 0x1, 0x0, 0x0, 0xEA, 0x86, 0x1, 0x0, 0x0, 0xA, 0x87, 0x1, 0x0, 0x0, 0x2A, 0x87, 0x1, 0x0, 0x0, 0x4A, 0x87, 0x1, 0x0, 0x0, 0x6A, 0x87, 0x1, 0x0, 0x0, 0x8A, 0x87, 0x1, 0x0, 0x0, 0xAA, 0x87, 0x1, 0x0, 0x0, 0xCA, 0x87, 0x1, 0x0, 0x0, 0xEA, 0x87, 0x1, 0x0, 0x0, 0xA, 0x88, 0x1, 0x0, 0x0, 0x2A, 0x88, 0x1, 0x0, 0x0, 0x4A, 0x88, 0x1, 0x0, 0x0, 0x6A, 0x88, 0x1, 0x0, 0x0, 0x8A, 0x88, 0x1, 0x0, 0x0, 0xAA, 0x88, 0x1, 0x0, 0x0, 0xCA, 0x88, 0x1, 0x0, 0x0, 0xEA, 0x88, 0x1, 0x0, 0x0, 0xA, 0x89, 0x1, 0x0, 0x0, 0x2A, 0x89, 0x1, 0x0, 0x0, 0x4A, 0x89, 0x1, 0x0, 0x0, 0x6A, 0x89, 0x1, 0x0, 0x0, 0x8A, 0x89, 0x1, 0x0, 0x0, 0xAA, 0x89, 0x1, 0x0, 0x0, 0xCA, 0x89, 0x1, 0x0, 0x0, 0xEA, 0x89, 0x1, 0x0, 0x0, 0xA, 0x8A, 0x1, 0x0, 0x0, 0x2A, 0x8A, 0x1, 0x0, 0x0, 0x4A, 0x8A, 0x1, 0x0, 0x0, 0x6A, 0x8A, 0x1, 0x0, 0x0, 0x8A, 0x8A, 0x1, 0x0, 0x0, 0xAA, 0x8A, 0x1, 0x0, 0x0, 0xCA, 0x8A, 0x1, 0x0, 0x0, 0xEA, 0x8A, 0x1, 0x0, 0x0, 0xA, 0x8B, 0x1, 0x0, 0x0, 0x2A, 0x8B, 0x1, 0x0, 0x0, 0x4A, 0x8B, 0x1, 0x0, 0x0, 0x6A, 0x8B, 0x1, 0x0, 0x0, 0x8A, 0x8B, 0x1, 0x0, 0x0, 0xAA, 0x8B, 0x1, 0x0, 0x0, 0xCA, 0x8B, 0x1, 0x0, 0x0, 0xEA, 0x8B, 0x1, 0x0, 0x0, 0xA, 0x8C, 0x1, 0x0, 0x0, 0x2A, 0x8C, 0x1, 0x0, 0x0, 0x4A, 0x8C, 0x1, 0x0, 0x0, 0x6A, 0x8C, 0x1, 0x0, 0x0, 0x8A, 0x8C, 0x1, 0x0, 0x0, 0xAA, 0x8C, 0x1, 0x0, 0x0, 0xCA, 0x8C, 0x1, 0x0, 0x0, 0xEA, 0x8C, 0x1, 0x0, 0x0, 0xA, 0x8D, 0x1, 0x0, 0x0, 0x2A, 0x8D, 0x1, 0x0, 0x0, 0x4A, 0x8D, 0x1, 0x0, 0x0, 0x6A, 0x8D, 0x1, 0x0, 0x0, 0x8A, 0x8D, 0x1, 0x0, 0x0, 0xAA, 0x8D, 0x1, 0x0, 0x0, 0xCA, 0x8D, 0x1, 0x0, 0x0, 0xEA, 0x8D, 0x1, 0x0, 0x0, 0xA, 0x8E, 0x1, 0x0, 0x0, 0x2A, 0x8E, 0x1, 0x0, 0x0, 0x4A, 0x8E, 0x1, 0x0, 0x0, 0x6A, 0x8E, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA0, 0x63, 0x0, 0xA, 0x0, 0xA8, 0x63, 0x0, 0xA, 0x0, 0xB0, 0x63, 0x0, 0xA, 0x0, 0xB8, 0x63, 0x0, 0xA, 0x0, 0xC0, 0x63, 0x0, 0xA, 0x0, 0xC8, 0x63, 0x0, 0xA, 0x0, 0xD0, 0x63, 0x0, 0xA, 0x0, 0xD8, 0x63, 0x0, 0xA, 0x0, 0xE0, 0x63, 0x0, 0xA, 0x0, 0xE8, 0x63, 0x0, 0xA, 0x0, 0xF0, 0x63, 0x0, 0xA, 0x0, 0xF8, 0x63, 0x0, 0xA, 0x0, 0x0, 0x64, 0x0, 0xA, 0x0, 0x8, 0x64, 0x0, 0xA, 0x0, 0x10, 0x64, 0x0, 0xA, 0x0, 0x18, 0x64, 0x0, 0xA, 0x0, 0x20, 0x64, 0x0, 0xA, 0x0, 0x28, 0x64, 0x0, 0xA, 0x0, 0x30, 0x64, 0x0, 0xA, 0x0, 0x38, 0x64, 0x0, 0xA, 0x0, 0x40, 0x64, 0x0, 0xA, 0x0, 0x48, 0x64, 0x0, 0xA, 0x0, 0x50, 0x64, 0x0, 0xA, 0x0, 0x58, 0x64, 0x0, 0x8A, 0x91, 0x1, 0x0, 0x0, 0xAA, 0x91, 0x1, 0x0, 0x0, 0xCA, 0x91, 0x1, 0x0, 0x0, 0xEA, 0x91, 0x1, 0x0, 0x0, 0xA, 0x92, 0x1, 0x0, 0x0, 0x2A, 0x92, 0x1, 0x0, 0x0, 0x4A, 0x92, 0x1, 0x0, 0x0, 0x6A, 0x92, 0x1, 0x0, 0x0, 0x8A, 0x92, 0x1, 0x0, 0x0, 0xAA, 0x92, 0x1, 0x0, 0x0, 0xCA, 0x92, 0x1, 0x0, 0x0, 0xEA, 0x92, 0x1, 0x0, 0x0, 0xA, 0x93, 0x1, 0x0, 0x0, 0x2A, 0x93, 0x1, 0x0, 0x0, 0x4A, 0x93, 0x1, 0x0, 0x0, 0x6A, 0x93, 0x1, 0x0, 0x0, 0x8A, 0x93, 0x1, 0x0, 0x0, 0xAA, 0x93, 0x1, 0x0, 0x0, 0xCA, 0x93, 0x1, 0x0, 0x0, 0xEA, 0x93, 0x1, 0x0, 0x0, 0xA, 0x94, 0x1, 0x0, 0x0, 0x2A, 0x94, 0x1, 0x0, 0x0, 0x4A, 0x94, 0x1, 0x0, 0x0, 0x6A, 0x94, 0x1, 0x0, 0x0, 0x8A, 0x94, 0x1, 0x0, 0x0, 0xAA, 0x94, 0x1, 0x0, 0x0, 0xCA, 0x94, 0x1, 0x0, 0x0, 0xEA, 0x94, 0x1, 0x0, 0x0, 0xA, 0x95, 0x1, 0x0, 0x0, 0x2A, 0x95, 0x1, 0x0, 0x0, 0x4A, 0x95, 0x1, 0x0, 0x0, 0x6A, 0x95, 0x1, 0x0, 0x0, 0x8A, 0x95, 0x1, 0x0, 0x0, 0xAA, 0x95, 0x1, 0x0, 0x0, 0xCA, 0x95, 0x1, 0x0, 0x0, 0xEA, 0x95, 0x1, 0x0, 0x0, 0xA, 0x96, 0x1, 0x0, 0x0, 0x2A, 0x96, 0x1, 0x0, 0x0, 0x4A, 0x96, 0x1, 0x0, 0x0, 0x6A, 0x96, 0x1, 0x0, 0x0, 0x8A, 0x96, 0x1, 0x0, 0x0, 0xAA, 0x96, 0x1, 0x0, 0x0, 0xCA, 0x96, 0x1, 0x0, 0x0, 0xEA, 0x96, 0x1, 0x0, 0x0, 0xA, 0x97, 0x1, 0x0, 0x0, 0x2A, 0x97, 0x1, 0x0, 0x0, 0x4A, 0x97, 0x1, 0x0, 0x0, 0x6A, 0x97, 0x1, 0x0, 0x0, 0x8A, 0x97, 0x1, 0x0, 0x0, 0xAA, 0x97, 0x1, 0x0, 0x0, 0xCA, 0x97, 0x1, 0x0, 0x0, 0xEA, 0x97, 0x1, 0x0, 0x0, 0xA, 0x98, 0x1, 0x0, 0x0, 0x2A, 0x98, 0x1, 0x0, 0x0, 0x4A, 0x98, 0x1, 0x0, 0x0, 0x6A, 0x98, 0x1, 0x0, 0x0, 0x8A, 0x98, 0x1, 0x0, 0x0, 0xAA, 0x98, 0x1, 0x0, 0x0, 0xCA, 0x98, 0x1, 0x0, 0x0, 0xEA, 0x98, 0x1, 0x0, 0x0, 0xA, 0x99, 0x1, 0x0, 0x0, 0x2A, 0x99, 0x1, 0x0, 0x0, 0x4A, 0x99, 0x1, 0x0, 0x0, 0x6A, 0x99, 0x1, 0x0, 0x0, 0x8A, 0x99, 0x1, 0x0, 0x0, 0xAA, 0x99, 0x1, 0x0, 0x0, 0xCA, 0x99, 0x1, 0x0, 0x0, 0xEA, 0x99, 0x1, 0x0, 0x0, 0xA, 0x9A, 0x1, 0x0, 0x0, 0x2A, 0x9A, 0x1, 0x0, 0x0, 0x4A, 0x9A, 0x1, 0x0, 0x0, 0x6A, 0x9A, 0x1, 0x0, 0x0, 0x8A, 0x9A, 0x1, 0x0, 0x0, 0xAA, 0x9A, 0x1, 0x0, 0x0, 0xCA, 0x9A, 0x1, 0x0, 0x0, 0xEA, 0x9A, 0x1, 0x0, 0x0, 0xA, 0x9B, 0x1, 0x0, 0x0, 0x2A, 0x9B, 0x1, 0x0, 0x0, 0x4A, 0x9B, 0x1, 0x0, 0x0, 0x6A, 0x9B, 0x1, 0x0, 0x0, 0x8A, 0x9B, 0x1, 0x0, 0x0, 0xAA, 0x9B, 0x1, 0x0, 0x0, 0xCA, 0x9B, 0x1, 0x0, 0x0, 0xEA, 0x9B, 0x1, 0x0, 0x0, 0xA, 0x9C, 0x1, 0x0, 0x0, 0x2A, 0x9C, 0x1, 0x0, 0x0, 0x4A, 0x9C, 0x1, 0x0, 0x0, 0x6A, 0x9C, 0x1, 0x0, 0x0, 0x8A, 0x9C, 0x1, 0x0, 0x0, 0xAA, 0x9C, 0x1, 0x0, 0x0, 0xCA, 0x9C, 0x1, 0x0, 0x0, 0xEA, 0x9C, 0x1, 0x0, 0x0, 0xA, 0x9D, 0x1, 0x0, 0x0, 0x2A, 0x9D, 0x1, 0x0, 0x0, 0x4A, 0x9D, 0x1, 0x0, 0x0, 0x6A, 0x9D, 0x1, 0x0, 0x0, 0x8A, 0x9D, 0x1, 0x0, 0x0, 0xAA, 0x9D, 0x1, 0x0, 0x0, 0xCA, 0x9D, 0x1, 0x0, 0x0, 0xEA, 0x9D, 0x1, 0x0, 0x0, 0xA, 0x9E, 0x1, 0x0, 0x0, 0x2A, 0x9E, 0x1, 0x0, 0x0, 0x4A, 0x9E, 0x1, 0x0, 0x0, 0x6A, 0x9E, 0x1, 0x0, 0x0, 0x8A, 0x9E, 0x1, 0x0, 0x0, 0xAA, 0x9E, 0x1, 0x0, 0x0, 0xCA, 0x9E, 0x1, 0x0, 0x0, 0xEA, 0x9E, 0x1, 0x0, 0x0, 0xA, 0x9F, 0x1, 0x0, 0x0, 0x2A, 0x9F, 0x1, 0x0, 0x0, 0x4A, 0x9F, 0x1, 0x0, 0x0, 0x6A, 0x9F, 0x1, 0x0, 0x0, 0x8A, 0x9F, 0x1, 0x0, 0x0, 0xAA, 0x9F, 0x1, 0x0, 0x0, 0xCA, 0x9F, 0x1, 0x0, 0x0, 0xEA, 0x9F, 0x1, 0x0, 0x0, 0xA, 0xA0, 0x1, 0x0, 0x0, 0x2A, 0xA0, 0x1, 0x0, 0x0, 0x4A, 0xA0, 0x1, 0x0, 0x0, 0x6A, 0xA0, 0x1, 0x0, 0x0, 0x8A, 0xA0, 0x1, 0x0, 0x0, 0xAA, 0xA0, 0x1, 0x0, 0x0, 0xCA, 0xA0, 0x1, 0x0, 0x0, 0xEA, 0xA0, 0x1, 0x0, 0x0, 0xA, 0xA1, 0x1, 0x0, 0x0, 0x2A, 0xA1, 0x1, 0x0, 0x0, 0x4A, 0xA1, 0x1, 0x0, 0x0, 0x6A, 0xA1, 0x1, 0x0, 0x0, 0x8A, 0xA1, 0x1, 0x0, 0x0, 0xAA, 0xA1, 0x1, 0x0, 0x0, 0xCA, 0xA1, 0x1, 0x0, 0x0, 0xEA, 0xA1, 0x1, 0x0, 0x0, 0xA, 0xA2, 0x1, 0x0, 0x0, 0x2A, 0xA2, 0x1, 0x0, 0x0, 0x4A, 0xA2, 0x1, 0x0, 0x0, 0x6A, 0xA2, 0x1, 0x0, 0x0, 0x8A, 0xA2, 0x1, 0x0, 0x0, 0xAA, 0xA2, 0x1, 0x0, 0x0, 0xCA, 0xA2, 0x1, 0x0, 0x0, 0xEA, 0xA2, 0x1, 0x0, 0x0, 0xA, 0xA3, 0x1, 0x0, 0x0, 0x2A, 0xA3, 0x1, 0x0, 0x0, 0x4A, 0xA3, 0x1, 0x0, 0x0, 0x6A, 0xA3, 0x1, 0x0, 0x0, 0x6A, 0x64, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x68, 0x0, 0xAA, 0xA3, 0x1, 0x0, 0x0, 0xCA, 0xA3, 0x1, 0x0, 0x0, 0xEA, 0xA3, 0x1, 0x0, 0x0, 0xA, 0xA4, 0x1, 0x0, 0x0, 0x2A, 0xA4, 0x1, 0x0, 0x0, 0x4A, 0xA4, 0x1, 0x0, 0x0, 0x6A, 0xA4, 0x1, 0x0, 0x0, 0x8A, 0xA4, 0x1, 0x0, 0x0, 0xAA, 0xA4, 0x1, 0x0, 0x0, 0xCA, 0xA4, 0x1, 0x0, 0x0, 0xEA, 0xA4, 0x1, 0x0, 0x0, 0xA, 0xA5, 0x1, 0x0, 0x0, 0x2A, 0xA5, 0x1, 0x0, 0x0, 0x4A, 0xA5, 0x1, 0x0, 0x0, 0x6A, 0xA5, 0x1, 0x0, 0x0, 0x8A, 0xA5, 0x1, 0x0, 0x0, 0xAA, 0xA5, 0x1, 0x0, 0x0, 0xCA, 0xA5, 0x1, 0x0, 0x0, 0xEA, 0xA5, 0x1, 0x0, 0x0, 0xA, 0xA6, 0x1, 0x0, 0x0, 0x2A, 0xA6, 0x1, 0x0, 0x0, 0x4A, 0xA6, 0x1, 0x0, 0x0, 0x6A, 0xA6, 0x1, 0x0, 0x0, 0x8A, 0xA6, 0x1, 0x0, 0x0, 0xAA, 0xA6, 0x1, 0x0, 0x0, 0xCA, 0xA6, 0x1, 0x0, 0x0, 0xEA, 0xA6, 0x1, 0x0, 0x0, 0xA, 0xA7, 0x1, 0x0, 0x0, 0x2A, 0xA7, 0x1, 0x0, 0x0, 0x4A, 0xA7, 0x1, 0x0, 0x0, 0x6A, 0xA7, 0x1, 0x0, 0x0, 0x8A, 0xA7, 0x1, 0x0, 0x0, 0xAA, 0xA7, 0x1, 0x0, 0x0, 0xCA, 0xA7, 0x1, 0x0, 0x0, 0xEA, 0xA7, 0x1, 0x0, 0x0, 0xA, 0xA8, 0x1, 0x0, 0x0, 0x2A, 0xA8, 0x1, 0x0, 0x0, 0x4A, 0xA8, 0x1, 0x0, 0x0, 0x6A, 0xA8, 0x1, 0x0, 0x0, 0x8A, 0xA8, 0x1, 0x0, 0x0, 0xAA, 0xA8, 0x1, 0x0, 0x0, 0x6A, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0x30, 0x6A, 0x0, 0xAA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0x38, 0x6A, 0x0, 0xEA, 0x73, 0x1, 0x0, 0x0, 0xA, 0x0, 0x40, 0x6A, 0x0, 0xAA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x48, 0x6A, 0x0, 0xEA, 0x74, 0x1, 0x0, 0x0, 0xA, 0x0, 0x50, 0x6A, 0x0, 0x2A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x58, 0x6A, 0x0, 0x6A, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x60, 0x6A, 0x0, 0xAA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x68, 0x6A, 0x0, 0xEA, 0x75, 0x1, 0x0, 0x0, 0xA, 0x0, 0x70, 0x6A, 0x0, 0x2A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x78, 0x6A, 0x0, 0x6A, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x80, 0x6A, 0x0, 0xAA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x88, 0x6A, 0x0, 0xEA, 0x76, 0x1, 0x0, 0x0, 0xA, 0x0, 0x90, 0x6A, 0x0, 0x2A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0x98, 0x6A, 0x0, 0x6A, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA0, 0x6A, 0x0, 0xAA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA8, 0x6A, 0x0, 0xEA, 0x77, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB0, 0x6A, 0x0, 0x2A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB8, 0x6A, 0x0, 0x6A, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x6A, 0x0, 0xAA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC8, 0x6A, 0x0, 0xEA, 0x78, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x6A, 0x0, 0x2A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD8, 0x6A, 0x0, 0x6A, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x6A, 0x0, 0xAA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE8, 0x6A, 0x0, 0xEA, 0x79, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF0, 0x6A, 0x0, 0x2A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF8, 0x6A, 0x0, 0x6A, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x0, 0x6B, 0x0, 0xAA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x8, 0x6B, 0x0, 0xEA, 0x7A, 0x1, 0x0, 0x0, 0xA, 0x0, 0x10, 0x6B, 0x0, 0x2A, 0x7B, 0x1, 0x0, 0x0, 0xA, 0x0, 0x18, 0x6B, 0x0, 0x8A, 0xAC, 0x1, 0x0, 0x0, 0xAA, 0xAC, 0x1, 0x0, 0x0, 0xA, 0x0, 0x30, 0x6B, 0x0, 0xEA, 0xAC, 0x1, 0x0, 0x0, 0xA, 0x0, 0x40, 0x6B, 0x0, 0x2A, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x50, 0x6B, 0x0, 0x6A, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x60, 0x6B, 0x0, 0xAA, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x70, 0x6B, 0x0, 0xEA, 0xAD, 0x1, 0x0, 0x0, 0xA, 0x0, 0x80, 0x6B, 0x0, 0x2A, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0x90, 0x6B, 0x0, 0x6A, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0xA0, 0x6B, 0x0, 0xAA, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0xB0, 0x6B, 0x0, 0xEA, 0xAE, 0x1, 0x0, 0x0, 0xA, 0x0, 0xC0, 0x6B, 0x0, 0x2A, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x6B, 0x0, 0x6A, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0xE0, 0x6B, 0x0, 0xAA, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0xF0, 0x6B, 0x0, 0xEA, 0xAF, 0x1, 0x0, 0x0, 0xA, 0x0, 0x0, 0x6C, 0x0, 0x2A, 0xB0, 0x1, 0x0, 0x0, 0xA, 0x0, 0x10, 0x6C, 0x0, 0xA, 0x0, 0x18, 0x6C, 0x0, 0xA, 0x0, 0x20, 0x6C, 0x0, 0xA, 0x0, 0x28, 0x6C, 0x0, 0xA, 0x0, 0x30, 0x6C, 0x0, 0xA, 0x0, 0x38, 0x6C, 0x0, 0xA, 0x0, 0x40, 0x6C, 0x0, 0x2A, 0xB1, 0x1, 0x0, 0x0, 0x4A, 0xB1, 0x1, 0x0, 0x0, 0x6A, 0xB1, 0x1, 0x0, 0x0, 0x8A, 0xB1, 0x1, 0x0, 0x0, 0xAA, 0xB1, 0x1, 0x0, 0x0, 0xCA, 0xB1, 0x1, 0x0, 0x0, 0xEA, 0xB1, 0x1, 0x0, 0x0, 0xA, 0xB2, 0x1, 0x0, 0x0, 0x2A, 0xB2, 0x1, 0x0, 0x0, 0x4A, 0xB2, 0x1, 0x0, 0x0, 0x6A, 0xB2, 0x1, 0x0, 0x0, 0x8A, 0xB2, 0x1, 0x0, 0x0, 0xAA, 0xB2, 0x1, 0x0, 0x0, 0xCA, 0xB2, 0x1, 0x0, 0x0, 0xEA, 0xB2, 0x1, 0x0, 0x0, 0xA, 0xB3, 0x1, 0x0, 0x0, 0x2A, 0xB3, 0x1, 0x0, 0x0, 0x4A, 0xB3, 0x1, 0x0, 0x0, 0x6A, 0xB3, 0x1, 0x0, 0x0, 0x8A, 0xB3, 0x1, 0x0, 0x0, 0xAA, 0xB3, 0x1, 0x0, 0x0, 0xCA, 0xB3, 0x1, 0x0, 0x0, 0xEA, 0xB3, 0x1, 0x0, 0x0, 0xA, 0xB4, 0x1, 0x0, 0x0, 0x2A, 0xB4, 0x1, 0x0, 0x0, 0x4A, 0xB4, 0x1, 0x0, 0x0, 0x6A, 0xB4, 0x1, 0x0, 0x0, 0x8A, 0xB4, 0x1, 0x0, 0x0, 0xAA, 0xB4, 0x1, 0x0, 0x0, 0xCA, 0xB4, 0x1, 0x0, 0x0, 0xEA, 0xB4, 0x1, 0x0, 0x0, 0xA, 0xB5, 0x1, 0x0, 0x0, 0x2A, 0xB5, 0x1, 0x0, 0x0, 0x4A, 0xB5, 0x1, 0x0, 0x0, 0x6A, 0xB5, 0x1, 0x0, 0x0, 0x8A, 0xB5, 0x1, 0x0, 0x0, 0xAA, 0xB5, 0x1, 0x0, 0x0, 0xCA, 0xB5, 0x1, 0x0, 0x0, 0xEA, 0xB5, 0x1, 0x0, 0x0, 0xA, 0xB6, 0x1, 0x0, 0x0, 0x2A, 0xB6, 0x1, 0x0, 0x0, 0x4A, 0xB6, 0x1, 0x0, 0x0, 0x6A, 0xB6, 0x1, 0x0, 0x0, 0x8A, 0xB6, 0x1, 0x0, 0x0, 0xAA, 0xB6, 0x1, 0x0, 0x0, 0xCA, 0xB6, 0x1, 0x0, 0x0, 0xEA, 0xB6, 0x1, 0x0, 0x0, 0xA, 0xB7, 0x1, 0x0, 0x0, 0x2A, 0xB7, 0x1, 0x0, 0x0, 0x4A, 0xB7, 0x1, 0x0, 0x0, 0x6A, 0xB7, 0x1, 0x0, 0x0, 0x8A, 0xB7, 0x1, 0x0, 0x0, 0xAA, 0xB7, 0x1, 0x0, 0x0, 0xCA, 0xB7, 0x1, 0x0, 0x0, 0xEA, 0xB7, 0x1, 0x0, 0x0, 0xA, 0xB8, 0x1, 0x0, 0x0, 0x2A, 0xB8, 0x1, 0x0, 0x0, 0x4A, 0xB8, 0x1, 0x0, 0x0, 0x6A, 0xB8, 0x1, 0x0, 0x0, 0x8A, 0xB8, 0x1, 0x0, 0x0, 0xAA, 0xB8, 0x1, 0x0, 0x0, 0xCA, 0xB8, 0x1, 0x0, 0x0, 0xEA, 0xB8, 0x1, 0x0, 0x0, 0xA, 0xB9, 0x1, 0x0, 0x0, 0x2A, 0xB9, 0x1, 0x0, 0x0, 0x4A, 0xB9, 0x1, 0x0, 0x0, 0x6A, 0xB9, 0x1, 0x0, 0x0, 0x8A, 0xB9, 0x1, 0x0, 0x0, 0xAA, 0xB9, 0x1, 0x0, 0x0, 0xCA, 0xB9, 0x1, 0x0, 0x0, 0xEA, 0xB9, 0x1, 0x0, 0x0, 0xA, 0xBA, 0x1, 0x0, 0x0, 0x2A, 0xBA, 0x1, 0x0, 0x0, 0x4A, 0xBA, 0x1, 0x0, 0x0, 0x6A, 0xBA, 0x1, 0x0, 0x0, 0x8A, 0xBA, 0x1, 0x0, 0x0, 0xAA, 0xBA, 0x1, 0x0, 0x0, 0xCA, 0xBA, 0x1, 0x0, 0x0, 0xEA, 0xBA, 0x1, 0x0, 0x0, 0xA, 0xBB, 0x1, 0x0, 0x0, 0x2A, 0xBB, 0x1, 0x0, 0x0, 0x4A, 0xBB, 0x1, 0x0, 0x0, 0x6A, 0xBB, 0x1, 0x0, 0x0, 0x8A, 0xBB, 0x1, 0x0, 0x0, 0xAA, 0xBB, 0x1, 0x0, 0x0, 0xCA, 0xBB, 0x1, 0x0, 0x0, 0xEA, 0xBB, 0x1, 0x0, 0x0, 0xA, 0xBC, 0x1, 0x0, 0x0, 0x2A, 0xBC, 0x1, 0x0, 0x0, 0x4A, 0xBC, 0x1, 0x0, 0x0, 0x6A, 0xBC, 0x1, 0x0, 0x0, 0x8A, 0xBC, 0x1, 0x0, 0x0, 0xAA, 0xBC, 0x1, 0x0, 0x0, 0xCA, 0xBC, 0x1, 0x0, 0x0, 0xEA, 0xBC, 0x1, 0x0, 0x0, 0xA, 0xBD, 0x1, 0x0, 0x0, 0x2A, 0xBD, 0x1, 0x0, 0x0, 0x4A, 0xBD, 0x1, 0x0, 0x0, 0x6A, 0xBD, 0x1, 0x0, 0x0, 0x8A, 0xBD, 0x1, 0x0, 0x0, 0xAA, 0xBD, 0x1, 0x0, 0x0, 0xCA, 0xBD, 0x1, 0x0, 0x0, 0xEA, 0xBD, 0x1, 0x0, 0x0, 0xA, 0xBE, 0x1, 0x0, 0x0, 0x2A, 0xBE, 0x1, 0x0, 0x0, 0x4A, 0xBE, 0x1, 0x0, 0x0, 0x6A, 0xBE, 0x1, 0x0, 0x0, 0x8A, 0xBE, 0x1, 0x0, 0x0, 0xAA, 0xBE, 0x1, 0x0, 0x0, 0xCA, 0xBE, 0x1, 0x0, 0x0, 0xEA, 0xBE, 0x1, 0x0, 0x0, 0xA, 0xBF, 0x1, 0x0, 0x0, 0x2A, 0xBF, 0x1, 0x0, 0x0, 0x4A, 0xBF, 0x1, 0x0, 0x0, 0x6A, 0xBF, 0x1, 0x0, 0x0, 0x8A, 0xBF, 0x1, 0x0, 0x0, 0xAA, 0xBF, 0x1, 0x0, 0x0, 0xCA, 0xBF, 0x1, 0x0, 0x0, 0xEA, 0xBF, 0x1, 0x0, 0x0, 0xA, 0xC0, 0x1, 0x0, 0x0, 0x2A, 0xC0, 0x1, 0x0, 0x0, 0x4A, 0xC0, 0x1, 0x0, 0x0, 0x6A, 0xC0, 0x1, 0x0, 0x0, 0x8A, 0xC0, 0x1, 0x0, 0x0, 0xAA, 0xC0, 0x1, 0x0, 0x0, 0xCA, 0xC0, 0x1, 0x0, 0x0, 0xEA, 0xC0, 0x1, 0x0, 0x0, 0xA, 0xC1, 0x1, 0x0, 0x0, 0x2A, 0xC1, 0x1, 0x0, 0x0, 0x4A, 0xC1, 0x1, 0x0, 0x0, 0x6A, 0xC1, 0x1, 0x0, 0x0, 0x8A, 0xC1, 0x1, 0x0, 0x0, 0xAA, 0xC1, 0x1, 0x0, 0x0, 0xCA, 0xC1, 0x1, 0x0, 0x0, 0xEA, 0xC1, 0x1, 0x0, 0x0, 0xA, 0xC2, 0x1, 0x0, 0x0, 0x2A, 0xC2, 0x1, 0x0, 0x0, 0x4A, 0xC2, 0x1, 0x0, 0x0, 0x6A, 0xC2, 0x1, 0x0, 0x0, 0x8A, 0xC2, 0x1, 0x0, 0x0, 0xAA, 0xC2, 0x1, 0x0, 0x0, 0xCA, 0xC2, 0x1, 0x0, 0x0, 0xEA, 0xC2, 0x1, 0x0, 0x0, 0xA, 0xC3, 0x1, 0x0, 0x0, 0x2A, 0xC3, 0x1, 0x0, 0x0, 0xA, 0x0, 0xD0, 0x70, 0x0, 0xA, 0x0, 0xD8, 0x70, 0x0, 0xA, 0x0, 0xE0, 0x70, 0x0, 0xA, 0x0, 0xE8, 0x70, 0x0, 0xA, 0x0, 0xF0, 0x70, 0x0, 0xA, 0x0, 0xF8, 0x70, 0x0, 0xA, 0x0, 0x0, 0x71, 0x0, 0xA, 0x0, 0x8, 0x71, 0x0, 0xA, 0x0, 0x10, 0x71, 0x0, 0xA, 0x0, 0x18, 0x71, 0x0, 0xA, 0x0, 0x20, 0x71, 0x0, 0xA, 0x0, 0x28, 0x71, 0x0, 0xA, 0x0, 0x30, 0x71, 0x0, 0xA, 0x0, 0x38, 0x71, 0x0, 0xA, 0x0, 0x40, 0x71, 0x0, 0xA, 0x0, 0x48, 0x71, 0x0, 0xA, 0x0, 0x50, 0x71, 0x0, 0xA, 0x0, 0x58, 0x71, 0x0, 0xA, 0x0, 0x60, 0x71, 0x0, 0xA, 0x0, 0x68, 0x71, 0x0, 0xA, 0x0, 0x70, 0x71, 0x0, 0xA, 0x0, 0x78, 0x71, 0x0, 0xA, 0x0, 0x80, 0x71, 0x0, 0xA, 0x0, 0x88, 0x71, 0x0, 0xA, 0x0, 0x90, 0x71, 0x0, 0xA, 0x0, 0x98, 0x71, 0x0, 0xA, 0x0, 0xA0, 0x71, 0x0, 0xA, 0x0, 0xA8, 0x71, 0x0, 0xA, 0x0, 0xB0, 0x71, 0x0, 0xA, 0x0, 0xB8, 0x71, 0x0, 0xA, 0x0, 0xC0, 0x71, 0x0, 0xA, 0x0, 0xC8, 0x71, 0x0, 0xA, 0x0, 0xD0, 0x71, 0x0, 0xA, 0x0, 0xD8, 0x71, 0x0, 0xA, 0x0, 0xE0, 0x71, 0x0, 0xA, 0x0, 0xE8, 0x71, 0x0, 0xA, 0x0, 0xF0, 0x71, 0x0, 0xA, 0x0, 0xF8, 0x71, 0x0, 0xA, 0x0, 0x0, 0x72, 0x0, 0xA, 0x0, 0x8, 0x72, 0x0, 0xA, 0x0, 0x10, 0x72, 0x0, 0xA, 0x0, 0x18, 0x72, 0x0, 0xA, 0x0, 0x20, 0x72, 0x0, 0xA, 0x0, 0x28, 0x72, 0x0, 0xA, 0x0, 0x30, 0x72, 0x0, 0xA, 0x0, 0x38, 0x72, 0x0, 0xA, 0x0, 0x40, 0x72, 0x0, 0xA, 0x0, 0x48, 0x72, 0x0, 0xA, 0x0, 0x50, 0x72, 0x0, 0xA, 0x0, 0x58, 0x72, 0x0, 0xA, 0x0, 0x60, 0x72, 0x0, 0xA, 0x0, 0x68, 0x72, 0x0, 0xA, 0x0, 0x70, 0x72, 0x0, 0xA, 0x0, 0x78, 0x72, 0x0, 0xA, 0x0, 0x80, 0x72, 0x0, 0xA, 0x0, 0x88, 0x72, 0x0, 0xA, 0x0, 0x90, 0x72, 0x0, 0xA, 0x0, 0x98, 0x72, 0x0, 0xA, 0x0, 0xA0, 0x72, 0x0, 0xA, 0x0, 0xA8, 0x72, 0x0, 0xA, 0x0, 0xB0, 0x72, 0x0, 0xA, 0x0, 0xB8, 0x72, 0x0, 0xA, 0x0, 0xC0, 0x72, 0x0, 0xA, 0x0, 0xC8, 0x72, 0x0, 0xA, 0x0, 0xD0, 0x72, 0x0, 0xA, 0x0, 0xD8, 0x72, 0x0, 0xA, 0x0, 0xE0, 0x72, 0x0, 0xA, 0x0, 0xE8, 0x72, 0x0, 0xA, 0x0, 0xF0, 0x72, 0x0, 0xA, 0x0, 0xF8, 0x72, 0x0, 0xA, 0x0, 0x0, 0x73, 0x0, 0xA, 0x0, 0x8, 0x73, 0x0, 0xA, 0x0, 0x10, 0x73, 0x0, 0xA, 0x0, 0x18, 0x73, 0x0, 0xA, 0x0, 0x20, 0x73, 0x0, 0xA, 0x0, 0x28, 0x73, 0x0, 0xA, 0x0, 0x10, 0x5C, 0x0, 0xA, 0x0, 0x18, 0x5C, 0x0, 0xA, 0x0, 0x20, 0x5C, 0x0, 0xA, 0x0, 0x28, 0x5C, 0x0, 0xA, 0x0, 0x30, 0x5C, 0x0, 0xA, 0x0, 0x30, 0x73, 0x0, 0xA, 0x0, 0x38, 0x73, 0x0, 0xA, 0x0, 0x40, 0x73, 0x0, 0xA, 0x0, 0x48, 0x73, 0x0, 0xA, 0x0, 0x60, 0x69, 0x0, 0xA, 0x0, 0x68, 0x69, 0x0, 0xA, 0x0, 0x70, 0x69, 0x0, 0xA, 0x0, 0x78, 0x69, 0x0, 0xA, 0x0, 0x80, 0x69, 0x0, 0xA, 0x0, 0x88, 0x69, 0x0, 0xA, 0x0, 0x90, 0x69, 0x0, 0xA, 0x0, 0x98, 0x69, 0x0, 0xA, 0x0, 0xA0, 0x69, 0x0, 0xA, 0x0, 0x50, 0x73, 0x0, 0xA, 0x0, 0xB0, 0x69, 0x0, 0xA, 0x0, 0xB8, 0x69, 0x0, 0xA, 0x0, 0xC0, 0x69, 0x0, 0xA, 0x0, 0xC8, 0x69, 0x0, 0xA, 0x0, 0xD0, 0x69, 0x0, 0xA, 0x0, 0xD8, 0x69, 0x0, 0xA, 0x0, 0xE0, 0x69, 0x0, 0xA, 0x0, 0xE8, 0x69, 0x0, 0xA, 0x0, 0xF0, 0x69, 0x0, 0xA, 0x0, 0xF8, 0x69, 0x0, 0xA, 0x0, 0x0, 0x6A, 0x0, 0xA, 0x0, 0x8, 0x6A, 0x0, 0xA, 0x0, 0x10, 0x6A, 0x0, 0xA, 0x0, 0x18, 0x6A, 0x0, 0xA, 0x0, 0x20, 0x6A, 0x0, 0xA, 0x0, 0x28, 0x6A, 0x0, 0xA, 0x0, 0x58, 0x73, 0x0, 0xA, 0x0, 0x60, 0x73, 0x0, 0xA, 0x0, 0x68, 0x73, 0x0, 0xA, 0x0, 0x70, 0x73, 0x0, 0xA, 0x0, 0x78, 0x73, 0x0, 0xA, 0x0, 0x80, 0x73, 0x0, 0xA, 0x0, 0x88, 0x73, 0x0, 0xA, 0x0, 0x90, 0x73, 0x0, 0xA, 0x0, 0x98, 0x73, 0x0, 0xA, 0x0, 0xA0, 0x73, 0x0, 0xA, 0x0, 0xA8, 0x73, 0x0, 0xA, 0x0, 0xB0, 0x73, 0x0, 0xA, 0x0, 0xB8, 0x73, 0x0, 0xA, 0x0, 0xC0, 0x73, 0x0, 0xA, 0x0, 0xC8, 0x73, 0x0, 0xA, 0x0, 0xD0, 0x73, 0x0, 0xA, 0x0, 0xD8, 0x73, 0x0, 0xA, 0x0, 0xE0, 0x73, 0x0, 0xA, 0x0, 0xE8, 0x73, 0x0, 0xA, 0x0, 0xF0, 0x73, 0x0, 0xA, 0x0, 0xF8, 0x73, 0x0, 0xA, 0x0, 0x0, 0x74, 0x0, 0xA, 0x0, 0x8, 0x74, 0x0, 0xA, 0x0, 0x10, 0x74, 0x0, 0xA, 0x0, 0x18, 0x74, 0x0, 0xA, 0x0, 0x20, 0x74, 0x0, 0xA, 0x0, 0x28, 0x74, 0x0, 0xA, 0x0, 0x30, 0x74, 0x0, 0xA, 0x0, 0x38, 0x74, 0x0, 0xA, 0x0, 0x40, 0x74, 0x0, 0xA, 0x0, 0x48, 0x74, 0x0, 0xA, 0x0, 0x50, 0x74, 0x0, 0xA, 0x0, 0x58, 0x74, 0x0, 0xA, 0x0, 0x60, 0x74, 0x0, 0xA, 0x0, 0x68, 0x74, 0x0, 0xA, 0x0, 0x70, 0x74, 0x0, 0xA, 0x0, 0x78, 0x74, 0x0, 0xA, 0x0, 0x80, 0x74, 0x0, 0xA, 0x0, 0x88, 0x74, 0x0, 0xA, 0x0, 0x90, 0x74, 0x0, 0xA, 0x0, 0x98, 0x74, 0x0, 0xA, 0x0, 0xA0, 0x74, 0x0, 0xA, 0x0, 0xA8, 0x74, 0x0, 0xA, 0x0, 0xB0, 0x74, 0x0, 0xA, 0x0, 0xB8, 0x74, 0x0, 0xA, 0x0, 0xC0, 0x74, 0x0, 0xA, 0x0, 0xC8, 0x74, 0x0, 0xA, 0x0, 0xD0, 0x74, 0x0, 0xA, 0x0, 0xD8, 0x74, 0x0, 0xA, 0x0, 0xE0, 0x74, 0x0, 0xA, 0x0, 0xE8, 0x74, 0x0, 0xA, 0x0, 0xF0, 0x74, 0x0, 0xA, 0x0, 0xF8, 0x74, 0x0, 0xA, 0x0, 0x0, 0x75, 0x0, 0xA, 0x0, 0x8, 0x75, 0x0, 0xA, 0x0, 0x10, 0x75, 0x0, 0xA, 0x0, 0x18, 0x75, 0x0, 0xA, 0x0, 0x20, 0x75, 0x0, 0xA, 0x0, 0x28, 0x75, 0x0, 0xA, 0x0, 0x30, 0x75, 0x0, 0xA, 0x0, 0x38, 0x75, 0x0, 0xA, 0x0, 0x40, 0x75, 0x0, 0xA, 0x0, 0x48, 0x75, 0x0, 0xA, 0x0, 0x50, 0x75, 0x0, 0xA, 0x0, 0x58, 0x75, 0x0, 0xA, 0x0, 0x60, 0x75, 0x0, 0xA, 0x0, 0x68, 0x75, 0x0, 0xA, 0x0, 0x70, 0x75, 0x0, 0xA, 0x0, 0x78, 0x75, 0x0, 0xA, 0x0, 0x80, 0x75, 0x0, 0xA, 0x0, 0x88, 0x75, 0x0, 0xA, 0x0, 0x90, 0x75, 0x0, 0xA, 0x0, 0x98, 0x75, 0x0, 0xA, 0x0, 0xA0, 0x75, 0x0, 0xA, 0x0, 0xA8, 0x75, 0x0, 0xA, 0x0, 0xB0, 0x75, 0x0, 0xA, 0x0, 0xB8, 0x75, 0x0, 0xA, 0x0, 0xC0, 0x75, 0x0, 0xA, 0x0, 0xC8, 0x75, 0x0, 0xA, 0x0, 0xD0, 0x75, 0x0, 0xA, 0x0, 0xD8, 0x75, 0x0, 0xA, 0x0, 0xE0, 0x75, 0x0, 0xA, 0x0, 0xE8, 0x75, 0x0, 0xA, 0x0, 0xF0, 0x75, 0x0, 0xA, 0x0, 0x78, 0x6D, 0x0, 0xA, 0x0, 0x80, 0x6D, 0x0, 0xA, 0x0, 0x88, 0x6D, 0x0, 0xA, 0x0, 0x90, 0x6D, 0x0, 0xA, 0x0, 0x98, 0x6D, 0x0, 0xA, 0x0, 0xA0, 0x6D, 0x0, 0xA, 0x0, 0xA8, 0x6D, 0x0, 0xA, 0x0, 0xB0, 0x6D, 0x0, 0xA, 0x0, 0xB8, 0x6D, 0x0, 0xA, 0x0, 0xC0, 0x6D, 0x0, 0xA, 0x0, 0xC8, 0x6D, 0x0, 0xA, 0x0, 0xD0, 0x6D, 0x0, 0xA, 0x0, 0xD8, 0x6D, 0x0, 0xA, 0x0, 0xE0, 0x6D, 0x0, 0xA, 0x0, 0xE8, 0x6D, 0x0, 0xA, 0x0, 0xF0, 0x6D, 0x0, 0xA, 0x0, 0xF8, 0x6D, 0x0, 0xA, 0x0, 0x0, 0x6E, 0x0, 0xA, 0x0, 0x8, 0x6E, 0x0, 0xA, 0x0, 0x10, 0x6E, 0x0, 0xA, 0x0, 0x18, 0x6E, 0x0, 0xA, 0x0, 0x20, 0x6E, 0x0, 0xA, 0x0, 0x28, 0x6E, 0x0, 0xA, 0x0, 0x30, 0x6E, 0x0, 0xA, 0x0, 0xF8, 0x75, 0x0, 0xA, 0x0, 0x0, 0x76, 0x0, 0xA, 0x0, 0x8, 0x76, 0x0, 0xA, 0x0, 0x10, 0x76, 0x0, 0xA, 0x0, 0x18, 0x76, 0x0, 0xA, 0x0, 0x20, 0x76, 0x0, 0xA, 0x0, 0x28, 0x76, 0x0, 0xA, 0x0, 0x30, 0x76, 0x0, 0xA, 0x0, 0x38, 0x76, 0x0, 0xA, 0x0, 0x40, 0x76, 0x0, 0xA, 0x0, 0x48, 0x76, 0x0, 0xA, 0x0, 0x50, 0x76, 0x0, 0xA, 0x0, 0x58, 0x76, 0x0, 0xA, 0x0, 0x60, 0x76, 0x0, 0xA, 0x0, 0x68, 0x76, 0x0, 0xA, 0x0, 0x70, 0x76, 0x0, 0xA, 0x0, 0x78, 0x76, 0x0, 0xA, 0x0, 0x80, 0x76, 0x0, 0xA, 0x0, 0x88, 0x76, 0x0, 0xA, 0x0, 0x90, 0x76, 0x0, 0xA, 0x0, 0x98, 0x76, 0x0, 0xA, 0x0, 0xA0, 0x76, 0x0, 0xA, 0x0, 0xA8, 0x76, 0x0, 0xA, 0x0, 0xB0, 0x76, 0x0, 0xA, 0x0, 0xB8, 0x76, 0x0, 0xA, 0x0, 0xC0, 0x76, 0x0, 0xA, 0x0, 0xC8, 0x76, 0x0, 0xA, 0x0, 0xD0, 0x76, 0x0, 0xA, 0x0, 0xD8, 0x76, 0x0, 0xA, 0x0, 0xE0, 0x76, 0x0, 0xA, 0x0, 0xE8, 0x76, 0x0, 0xA, 0x0, 0xF0, 0x76, 0x0, 0xA, 0x0, 0xF8, 0x76, 0x0, 0xA, 0x0, 0x0, 0x77, 0x0, 0xA, 0x0, 0x8, 0x77, 0x0, 0xA, 0x0, 0x10, 0x77, 0x0, 0xA, 0x0, 0x18, 0x77, 0x0, 0xA, 0x0, 0x20, 0x77, 0x0, 0xA, 0x0, 0x28, 0x77, 0x0, 0xA, 0x0, 0x30, 0x77, 0x0, 0xA, 0x0, 0x38, 0x77, 0x0, 0xA, 0x0, 0x40, 0x77, 0x0, 0xA, 0x0, 0x48, 0x77, 0x0, 0xA, 0x0, 0x50, 0x77, 0x0, 0xA, 0x0, 0x58, 0x77, 0x0, 0xA, 0x0, 0x60, 0x77, 0x0, 0xA, 0x0, 0x68, 0x77, 0x0, 0xA, 0x0, 0x70, 0x77, 0x0, 0xA, 0x0, 0x78, 0x77, 0x0, 0xA, 0x0, 0x80, 0x77, 0x0, 0xA, 0x0, 0x88, 0x77, 0x0, 0xA, 0x0, 0x90, 0x77, 0x0, 0xA, 0x0, 0x98, 0x77, 0x0, 0x8B, 0xDE, 0x1, 0x0, 0x0, 0xAB, 0xDE, 0x1, 0x0, 0x0, 0xCB, 0xDE, 0x1, 0x0, 0x0, 0xEB, 0xDE, 0x1, 0x0, 0x0, 0xB, 0xDF, 0x1, 0x0, 0x0, 0x2B, 0xDF, 0x1, 0x0, 0x0, 0x4B, 0xDF, 0x1, 0x0, 0x0, 0x6B, 0xDF, 0x1, 0x0, 0x0, 0x8B, 0xDF, 0x1, 0x0, 0x0, 0xAB, 0xDF, 0x1, 0x0, 0x0, 0xCB, 0xDF, 0x1, 0x0, 0x0, 0xEB, 0xDF, 0x1, 0x0, 0x0, 0xB, 0xE0, 0x1, 0x0, 0x0, 0x2B, 0xE0, 0x1, 0x0, 0x0, 0x4B, 0xE0, 0x1, 0x0, 0x0, 0x6B, 0xE0, 0x1, 0x0, 0x0, 0x8B, 0xE0, 0x1, 0x0, 0x0, 0xAB, 0xE0, 0x1, 0x0, 0x0, 0xCB, 0xE0, 0x1, 0x0, 0x0, 0xEB, 0xE0, 0x1, 0x0, 0x0, 0xB, 0xE1, 0x1, 0x0, 0x0, 0x2B, 0xE1, 0x1, 0x0, 0x0, 0x4B, 0xE1, 0x1, 0x0, 0x0, 0x6B, 0xE1, 0x1, 0x0, 0x0, 0x8B, 0xE1, 0x1, 0x0, 0x0, 0xAB, 0xE1, 0x1, 0x0, 0x0, 0xCB, 0xE1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x78, 0x78, 0x0, 0xB, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0x88, 0x78, 0x0, 0x4B, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0x98, 0x78, 0x0, 0x8B, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x78, 0x0, 0xCB, 0xE2, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x78, 0x0, 0xB, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x78, 0x0, 0x4B, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x78, 0x0, 0x8B, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x78, 0x0, 0xCB, 0xE3, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x78, 0x0, 0xB, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x8, 0x79, 0x0, 0x4B, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x18, 0x79, 0x0, 0x8B, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x79, 0x0, 0xCB, 0xE4, 0x1, 0x0, 0x0, 0xB, 0x0, 0x38, 0x79, 0x0, 0xB, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x48, 0x79, 0x0, 0x4B, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x58, 0x79, 0x0, 0x8B, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x68, 0x79, 0x0, 0xCB, 0xE5, 0x1, 0x0, 0x0, 0xB, 0x0, 0x78, 0x79, 0x0, 0xB, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0x88, 0x79, 0x0, 0x4B, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0x98, 0x79, 0x0, 0x8B, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x79, 0x0, 0xCB, 0xE6, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x79, 0x0, 0xB, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x79, 0x0, 0x4B, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x79, 0x0, 0x8B, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x79, 0x0, 0xCB, 0xE7, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x79, 0x0, 0xB, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x8, 0x7A, 0x0, 0x4B, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x18, 0x7A, 0x0, 0x8B, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x7A, 0x0, 0xCB, 0xE8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x38, 0x7A, 0x0, 0xB, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x48, 0x7A, 0x0, 0x4B, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x58, 0x7A, 0x0, 0x8B, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x68, 0x7A, 0x0, 0xCB, 0xE9, 0x1, 0x0, 0x0, 0xB, 0x0, 0x78, 0x7A, 0x0, 0xB, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0x88, 0x7A, 0x0, 0x4B, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0x98, 0x7A, 0x0, 0x8B, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x7A, 0x0, 0xCB, 0xEA, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x7A, 0x0, 0xB, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x7A, 0x0, 0x4B, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x7A, 0x0, 0x8B, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x7A, 0x0, 0xCB, 0xEB, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x7A, 0x0, 0xB, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x8, 0x7B, 0x0, 0x4B, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x18, 0x7B, 0x0, 0x8B, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x7B, 0x0, 0xCB, 0xEC, 0x1, 0x0, 0x0, 0xB, 0x0, 0x38, 0x7B, 0x0, 0xB, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x48, 0x7B, 0x0, 0x4B, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x58, 0x7B, 0x0, 0x8B, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x68, 0x7B, 0x0, 0xCB, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x70, 0x78, 0x0, 0xEB, 0xED, 0x1, 0x0, 0x0, 0xB, 0x0, 0x80, 0x78, 0x0, 0xB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0x90, 0x78, 0x0, 0x2B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA0, 0x78, 0x0, 0x4B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB0, 0x78, 0x0, 0x6B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC0, 0x78, 0x0, 0x8B, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD0, 0x78, 0x0, 0xAB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE0, 0x78, 0x0, 0xCB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF0, 0x78, 0x0, 0xEB, 0xEE, 0x1, 0x0, 0x0, 0xB, 0x0, 0x0, 0x79, 0x0, 0xB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x10, 0x79, 0x0, 0x2B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x20, 0x79, 0x0, 0x4B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x30, 0x79, 0x0, 0x6B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x40, 0x79, 0x0, 0x8B, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x50, 0x79, 0x0, 0xAB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x60, 0x79, 0x0, 0xCB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x70, 0x79, 0x0, 0xEB, 0xEF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x80, 0x79, 0x0, 0xB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0x90, 0x79, 0x0, 0x2B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA0, 0x79, 0x0, 0x4B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xB0, 0x79, 0x0, 0x6B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xC0, 0x79, 0x0, 0x8B, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xD0, 0x79, 0x0, 0xAB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xE0, 0x79, 0x0, 0xCB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0xF0, 0x79, 0x0, 0xEB, 0xF0, 0x1, 0x0, 0x0, 0xB, 0x0, 0x0, 0x7A, 0x0, 0xB, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x10, 0x7A, 0x0, 0x2B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x20, 0x7A, 0x0, 0x4B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x30, 0x7A, 0x0, 0x6B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x40, 0x7A, 0x0, 0x8B, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x50, 0x7A, 0x0, 0xAB, 0xF1, 0x1, 0x0, 0x0, 0xB, 0x0, 0x60, 0x7A, 0x0, 0xCB, 0xF1, 0x79, 0x7C, 0x0, 0xB, 0x0, 0x80, 0x7C, 0x0, 0xB, 0x0, 0x88, 0x7C, 0x0, 0xB, 0x0, 0x90, 0x7C, 0x0, 0xB, 0x0, 0x98, 0x7C, 0x0, 0x8B, 0xF2, 0x1, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x7C, 0x0, 0xB, 0x0, 0xB0, 0x7C, 0x0, 0xB, 0x0, 0xB8, 0x7C, 0x0, 0xB, 0x0, 0xC0, 0x7C, 0x0, 0xB, 0x0, 0xC8, 0x7C, 0x0, 0xB, 0x0, 0xD0, 0x7C, 0x0, 0xB, 0x0, 0xD8, 0x7C, 0x0, 0xB, 0x0, 0xE0, 0x7C, 0x0, 0xB, 0x0, 0xE8, 0x7C, 0x0, 0xB, 0x0, 0xF0, 0x7C, 0x0, 0xB, 0x0, 0xF8, 0x7C, 0x0, 0xB, 0x0, 0x0, 0x7D, 0x0, 0xB, 0x0, 0x8, 0x7D, 0x0, 0xB, 0x0, 0x10, 0x7D, 0x0, 0xB, 0x0, 0x18, 0x7D, 0x0, 0xB, 0x0, 0x20, 0x7D, 0x0, 0xB, 0x0, 0x28, 0x7D, 0x0, 0xB, 0x0, 0x30, 0x7D, 0x0, 0xB, 0x0, 0x38, 0x7D, 0x0, 0xB, 0x0, 0x40, 0x7D, 0x0, 0xB, 0x0, 0x48, 0x7D, 0x0, 0xB, 0x0, 0x50, 0x7D, 0x0, 0xB, 0x0, 0x58, 0x7D, 0x0, 0xB, 0x0, 0x60, 0x7D, 0x0, 0xB, 0x0, 0x68, 0x7D, 0x0, 0xB, 0x0, 0x70, 0x7D, 0x0, 0xB, 0x0, 0x78, 0x7D, 0x0, 0xB, 0x0, 0x80, 0x7D, 0x0, 0xB, 0x0, 0x88, 0x7D, 0x0, 0xB, 0x0, 0x90, 0x7D, 0x0, 0xB, 0x0, 0x98, 0x7D, 0x0, 0xB, 0x0, 0xA0, 0x7D, 0x0, 0xB, 0x0, 0xA8, 0x7D, 0x0, 0xB, 0x0, 0xB0, 0x7D, 0x0, 0xB, 0x0, 0xB8, 0x7D, 0x0, 0xB, 0x0, 0xC0, 0x7D, 0x0, 0xB, 0x0, 0xC8, 0x7D, 0x0, 0xB, 0x0, 0xD0, 0x7D, 0x0, 0xB, 0x0, 0xD8, 0x7D, 0x0, 0xB, 0x0, 0xE0, 0x7D, 0x0, 0xB, 0x0, 0xE8, 0x7D, 0x0, 0xB, 0x0, 0xF0, 0x7D, 0x0, 0xB, 0x0, 0xF8, 0x7D, 0x0, 0xB, 0x0, 0x0, 0x7E, 0x0, 0xB, 0x0, 0x8, 0x7E, 0x0, 0xB, 0x0, 0x10, 0x7E, 0x0, 0xB, 0x0, 0x18, 0x7E, 0x0, 0x8B, 0xF8, 0x1, 0x0, 0x0, 0xB, 0x0, 0x28, 0x7E, 0x0, 0xB, 0x0, 0x30, 0x7E, 0x0, 0xB, 0x0, 0x38, 0x7E, 0x0, 0xB, 0x0, 0x40, 0x7E, 0x0, 0xB, 0x0, 0x48, 0x7E, 0x0, 0xB, 0x0, 0x50, 0x7E, 0x0, 0xB, 0x0, 0x58, 0x7E, 0x0, 0xB, 0x0, 0x60, 0x7E, 0x0, 0xB, 0x0, 0x68, 0x7E, 0x0, 0xB, 0x0, 0x70, 0x7E, 0x0, 0xB, 0x0, 0x78, 0x7E, 0x0, 0xB, 0x0, 0x80, 0x7E, 0x0, 0xB, 0x0, 0x88, 0x7E, 0x0, 0xB, 0x0, 0x90, 0x7E, 0x0, 0xB, 0x0, 0x98, 0x7E, 0x0, 0xB, 0x0, 0xA0, 0x7E, 0x0, 0xB, 0x0, 0xA8, 0x7E, 0x0, 0xB, 0x0, 0xB0, 0x7E, 0x0, 0xB, 0x0, 0xB8, 0x7E, 0x0, 0xB, 0x0, 0xC0, 0x7E, 0x0, 0xB, 0x0, 0xC8, 0x7E, 0x0, 0xB, 0x0, 0xD0, 0x7E, 0x0, 0xB, 0x0, 0xD8, 0x7E, 0x0, 0xB, 0x0, 0xE0, 0x7E, 0x0, 0xB, 0x0, 0xE8, 0x7E, 0x0, 0xB, 0x0, 0xF0, 0x7E, 0x0, 0xB, 0x0, 0xF8, 0x7E, 0x0, 0xB, 0x0, 0x0, 0x7F, 0x0, 0xB, 0x0, 0x8, 0x7F, 0x0, 0xB, 0x0, 0x10, 0x7F, 0x0, 0xB, 0x0, 0x18, 0x7F, 0x0, 0xB, 0x0, 0x20, 0x7F, 0x0, 0xB, 0x0, 0x28, 0x7F, 0x0, 0xB, 0x0, 0x30, 0x7F, 0x0, 0xB, 0x0, 0x38, 0x7F, 0x0, 0xB, 0x0, 0x40, 0x7F, 0x0, 0xB, 0x0, 0x48, 0x7F, 0x0, 0xB, 0x0, 0x50, 0x7F, 0x0, 0xB, 0x0, 0x58, 0x7F, 0x0, 0xB, 0x0, 0x60, 0x7F, 0x0, 0xB, 0x0, 0x68, 0x7F, 0x0, 0xB, 0x0, 0x70, 0x7F, 0x0, 0xB, 0x0, 0x78, 0x7F, 0x0, 0xB, 0x0, 0x80, 0x7F, 0x0, 0xB, 0x0, 0x88, 0x7F, 0x0, 0xB, 0x0, 0x90, 0x7F, 0x0, 0xB, 0x0, 0x98, 0x7F, 0x0, 0xB, 0x0, 0xA0, 0x7F, 0x0, 0xB, 0x0, 0xA8, 0x7F, 0x0, 0xB, 0x0, 0xB0, 0x7F, 0x0, 0xB, 0x0, 0xB8, 0x7F, 0x0, 0xB, 0x0, 0xC0, 0x7F, 0x0, 0xB, 0x0, 0xC8, 0x7F, 0x0, 0xB, 0x0, 0xD0, 0x7F, 0x0, 0xB, 0x0, 0xD8, 0x7F, 0x0, 0xB, 0x0, 0xE0, 0x7F, 0x0, 0xB, 0x0, 0xE8, 0x7F, 0x0, 0xB, 0x0, 0xF0, 0x7F, 0x0, 0xB, 0x0, 0xF8, 0x7F, 0x0, 0xB, 0x0, 0x0, 0x80, 0x0, 0xB, 0x0, 0x8, 0x80, 0x0, 0xB, 0x0, 0x10, 0x80, 0x0, 0xB, 0x0, 0x18, 0x80, 0x0, 0xB, 0x0, 0x20, 0x80, 0x0, 0xB, 0x0, 0x28, 0x80, 0x0, 0xB, 0x0, 0x30, 0x80, 0x0, 0xB, 0x0, 0x38, 0x80, 0x0, 0xB, 0x0, 0x40, 0x80, 0x0, 0xB, 0x0, 0x48, 0x80, 0x0, 0xB, 0x0, 0x50, 0x80, 0x0, 0xB, 0x0, 0x58, 0x80, 0x0, 0xB, 0x0, 0x60, 0x80, 0x0, 0xB, 0x0, 0x68, 0x80, 0x0, 0xB, 0x0, 0x70, 0x80, 0x0, 0xB, 0x0, 0x78, 0x80, 0x0, 0xB, 0x0, 0x80, 0x80, 0x0, 0xB, 0x0, 0x88, 0x80, 0x0, 0x4B, 0x2, 0x2, 0x0, 0x0, 0xB, 0x0, 0x98, 0x80, 0x0, 0x8B, 0x2, 0x2, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x80, 0x0, 0xCB, 0x2, 0x2, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x80, 0x0, 0xB, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x80, 0x0, 0x4B, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x80, 0x0, 0x8B, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x80, 0x0, 0xCB, 0x3, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x80, 0x0, 0xB, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x8, 0x81, 0x0, 0x4B, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x18, 0x81, 0x0, 0x8B, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x28, 0x81, 0x0, 0xCB, 0x4, 0x2, 0x0, 0x0, 0xB, 0x0, 0x38, 0x81, 0x0, 0xB, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x48, 0x81, 0x0, 0x4B, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x58, 0x81, 0x0, 0x8B, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x68, 0x81, 0x0, 0xCB, 0x5, 0x2, 0x0, 0x0, 0xB, 0x0, 0x78, 0x81, 0x0, 0xB, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0x88, 0x81, 0x0, 0x4B, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0x98, 0x81, 0x0, 0x8B, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x81, 0x0, 0xCB, 0x6, 0x2, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x81, 0x0, 0xB, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x81, 0x0, 0x4B, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x81, 0x0, 0x8B, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x81, 0x0, 0xCB, 0x7, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x81, 0x0, 0xB, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x8, 0x82, 0x0, 0x4B, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x18, 0x82, 0x0, 0x8B, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x28, 0x82, 0x0, 0xCB, 0x8, 0x2, 0x0, 0x0, 0xB, 0x0, 0x38, 0x82, 0x0, 0xB, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x48, 0x82, 0x0, 0x4B, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x58, 0x82, 0x0, 0x8B, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x68, 0x82, 0x0, 0xCB, 0x9, 0x2, 0x0, 0x0, 0xB, 0x0, 0x78, 0x82, 0x0, 0xB, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0x88, 0x82, 0x0, 0x4B, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0x98, 0x82, 0x0, 0x8B, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0xA8, 0x82, 0x0, 0xCB, 0xA, 0x2, 0x0, 0x0, 0xB, 0x0, 0xB8, 0x82, 0x0, 0xB, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC8, 0x82, 0x0, 0x4B, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD8, 0x82, 0x0, 0x8B, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xE8, 0x82, 0x0, 0xCB, 0xB, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF8, 0x82, 0x0, 0xB, 0xC, 0x2, 0x0, 0x0, 0xB, 0x0, 0x8, 0x83, 0x0, 0x4B, 0xC, 0x2, 0x0, 0x0, 0x6B, 0xC, 0x2, 0x0, 0x0, 0x8B, 0xC, 0x2, 0x0, 0x0, 0xAB, 0xC, 0x2, 0x0, 0x0, 0xCB, 0xC, 0x2, 0x0, 0x0, 0xEB, 0xC, 0x2, 0x0, 0x0, 0xB, 0xD, 0x2, 0x0, 0x0, 0x2B, 0xD, 0x2, 0x0, 0x0, 0x4B, 0xD, 0x2, 0x0, 0x0, 0x6B, 0xD, 0x2, 0x0, 0x0, 0x8B, 0xD, 0x2, 0x0, 0x0, 0xAB, 0xD, 0x2, 0x0, 0x0, 0xCB, 0xD, 0x2, 0x0, 0x0, 0xEB, 0xD, 0x2, 0x0, 0x0, 0xB, 0xE, 0x2, 0x0, 0x0, 0x2B, 0xE, 0x2, 0x0, 0x0, 0x4B, 0xE, 0x2, 0x0, 0x0, 0x6B, 0xE, 0x2, 0x0, 0x0, 0x8B, 0xE, 0x2, 0x0, 0x0, 0xAB, 0xE, 0x2, 0x0, 0x0, 0xCB, 0xE, 0x2, 0x0, 0x0, 0xEB, 0xE, 0x2, 0x0, 0x0, 0xB, 0xF, 0x2, 0x0, 0x0, 0x2B, 0xF, 0x2, 0x0, 0x0, 0x4B, 0xF, 0x2, 0x0, 0x0, 0x6B, 0xF, 0x2, 0x0, 0x0, 0x8B, 0xF, 0x2, 0x0, 0x0, 0xAB, 0xF, 0x2, 0x0, 0x0, 0xCB, 0xF, 0x2, 0x0, 0x0, 0xEB, 0xF, 0x2, 0x0, 0x0, 0xB, 0x10, 0x2, 0x0, 0x0, 0x2B, 0x10, 0x2, 0x0, 0x0, 0x4B, 0x10, 0x2, 0x0, 0x0, 0x6B, 0x10, 0x2, 0x0, 0x0, 0x8B, 0x10, 0x2, 0x0, 0x0, 0xAB, 0x10, 0x2, 0x0, 0x0, 0xCB, 0x10, 0x2, 0x0, 0x0, 0xEB, 0x10, 0x2, 0x0, 0x0, 0xB, 0x11, 0x2, 0x0, 0x0, 0x2B, 0x11, 0x2, 0x0, 0x0, 0x4B, 0x11, 0x2, 0x0, 0x0, 0x6B, 0x11, 0x2, 0x0, 0x0, 0x8B, 0x11, 0x2, 0x0, 0x0, 0xAB, 0x11, 0x2, 0x0, 0x0, 0xCB, 0x11, 0x2, 0x0, 0x0, 0xEB, 0x11, 0x2, 0x0, 0x0, 0xB, 0x12, 0x2, 0x0, 0x0, 0x2B, 0x12, 0x2, 0x0, 0x0, 0x4B, 0x12, 0x2, 0x0, 0x0, 0x6B, 0x12, 0x2, 0x0, 0x0, 0x8B, 0x12, 0x2, 0x0, 0x0, 0xAB, 0x12, 0x2, 0x0, 0x0, 0xCB, 0x12, 0x2, 0x0, 0x0, 0xEB, 0x12, 0x2, 0x0, 0x0, 0xB, 0x0, 0xC0, 0x84, 0x0, 0x2B, 0x13, 0x2, 0x0, 0x0, 0xB, 0x0, 0xD0, 0x84, 0x0, 0x6B, 0x13, 0x2, 0x0, 0x0, 0x8B, 0x13, 0x2, 0x0, 0x0, 0xAB, 0x13, 0x2, 0x0, 0x0, 0xB, 0x0, 0xF0, 0x84, 0x0, 0xEB, 0x13, 0x2, 0x0, 0x0, 0xB, 0x0, 0x0, 0x85, 0x0, 0x2B, 0x14, 0x2, 0x0, 0x0, 0xB, 0x0, 0x10, 0x85, 0x0, 0x6B, 0x14, 0x2, 0x0, 0x0, 0xB, 0x0, 0x20, 0x85, 0x0, 0xAB, 0x14, 0x2, 0x0, 0x0, 0xCB, 0x14, 0x2, 0x0, 0x0, 0xEB, 0x14, 0x2, 0x0, 0x0, 0xB, 0x15, 0x2, 0x0, 0x0, 0xB, 0x0, 0x48, 0x85, 0x0, 0x4B, 0x15, 0x2, 0x0, 0x0, 0xB, 0x0, 0x58, 0x85, 0x0, 0x8B, 0x15, 0x2, 0x0, 0x0, 0xB, 0x0, 0x68, 0x85, 0x0, 0xCB, 0x15, 0x2, 0x0, 0x0, 0xEB, 0x15, 0x2, 0x0, 0x0, 0xB, 0x16, 0x2, 0x0, 0x0, 0xB, 0x0, 0x88, 0x85, 0x0, 0x4B, 0x16, 0x2, 0x0, 0x0, 0x6B, 0x16, 0x2, 0x0, 0x0, 0x8B, 0x16, 0x2, 0x0, 0x0, 0xAB, 0x16, 0x2, 0x0, 0x0, 0xCB, 0x16, 0x2, 0x0, 0x0, 0xEB, 0x16, 0x2, 0x0, 0x0, 0xB, 0x17, 0x2, 0x0, 0x0, 0x2B, 0x17, 0x2, 0x0, 0x0, 0x4B, 0x17, 0x2, 0x0, 0x0, 0x6B, 0x17, 0x2, 0x0, 0x0, 0x8B, 0x17, 0x2, 0x0, 0x0, 0xAB, 0x17, 0x2, 0x0, 0x0, 0xCB, 0x17, 0x2, 0x0, 0x0, 0xEB, 0x17, 0x2, 0x0, 0x0, 0xB, 0x18, 0x2, 0x0, 0x0, 0x2B, 0x18, 0x2, 0x0, 0x0, 0x4B, 0x18, 0x2, 0x0, 0x0, 0x6B, 0x18, 0x2, 0x0, 0x0, 0x8B, 0x18, 0x2, 0x0, 0x0, 0xAB, 0x18, 0x2, 0x0, 0x0, 0xCB, 0x18, 0x2, 0x0, 0x0, 0xEB, 0x18, 0x2, 0x0, 0x0, 0xB, 0x19, 0x2, 0x0, 0x0, 0x2B, 0x19, 0x2, 0x0, 0x0, 0x4B, 0x19, 0x2, 0x0, 0x0, 0x6B, 0x19, 0x2, 0x0, 0x0, 0x8B, 0x19, 0x2, 0x0, 0x0, 0xAB, 0x19, 0x2, 0x0, 0x0, 0xCB, 0x19, 0x2, 0x0, 0x0, 0xEB, 0x19, 0x2, 0x0, 0x0, 0xB, 0x1A, 0x2, 0x0, 0x0, 0x2B, 0x1A, 0x2, 0x0, 0x0, 0x4B, 0x1A, 0x2, 0x0, 0x0, 0x6B, 0x1A, 0x2, 0x0, 0x0, 0x8B, 0x1A, 0x2, 0x0, 0x0, 0xAB, 0x1A, 0x2, 0x0, 0x0, 0xCB, 0x1A, 0x2, 0x0, 0x0, 0xEB, 0x1A, 0x2, 0x0, 0x0, 0xB, 0x1B, 0x2, 0x0, 0x0, 0x2B, 0x1B, 0x2, 0x0, 0x0, 0x4B, 0x1B, 0x2, 0x0, 0x0, 0x6B, 0x1B, 0x2, 0x0, 0x0, 0x8B, 0x1B, 0x2, 0x0, 0x0, 0xAB, 0x1B, 0x2, 0x0, 0x0, 0xCB, 0x1B, 0x2, 0x0, 0x0, 0xEB, 0x1B, 0x2, 0x0, 0x0, 0xB, 0x1C, 0x2, 0x0, 0x0, 0x2B, 0x1C, 0x2, 0x0, 0x0, 0xB, 0x0, 0x10, 0x87, 0x0, 0xB, 0x0, 0x18, 0x87, 0x0, 0xB, 0x0, 0x20, 0x87, 0x0, 0xB, 0x0, 0x28, 0x87, 0x0, 0xB, 0x0, 0x30, 0x87, 0x0, 0xB, 0x0, 0x38, 0x87, 0x0, 0xB, 0x0, 0x40, 0x87, 0x0, 0xB, 0x0, 0x48, 0x87, 0x0, 0xB, 0x0, 0x50, 0x87, 0x0, 0xB, 0x0, 0x58, 0x87, 0x0, 0xB, 0x0, 0x60, 0x87, 0x0, 0xB, 0x0, 0x68, 0x87, 0x0, 0xB, 0x0, 0x70, 0x87, 0x0, 0xB, 0x0, 0x78, 0x87, 0x0, 0xB, 0x0, 0x80, 0x87, 0x0, 0xB, 0x0, 0x88, 0x87, 0x0, 0xB, 0x0, 0x90, 0x87, 0x0, 0xB, 0x0, 0x98, 0x87, 0x0, 0xB, 0x0, 0xA0, 0x87, 0x0, 0xB, 0x0, 0xA8, 0x87, 0x0, 0xB, 0x0, 0xB0, 0x87, 0x0, 0xB, 0x0, 0xB8, 0x87, 0x0, 0xB, 0x0, 0xC0, 0x87, 0x0, 0xB, 0x0, 0xC8, 0x87, 0x0, 0xB, 0x0, 0xD0, 0x87, 0x0, 0xB, 0x0, 0xD8, 0x87, 0x0, 0xB, 0x0, 0xE0, 0x87, 0x0, 0xB, 0x0, 0xE8, 0x87, 0x0, 0xB, 0x0, 0xF0, 0x87, 0x0, 0xB, 0x0, 0xF8, 0x87, 0x0, 0xB, 0x0, 0x0, 0x88, 0x0, 0xB, 0x0, 0x8, 0x88, 0x0, 0xB, 0x0, 0x10, 0x88, 0x0, 0xB, 0x0, 0x18, 0x88, 0x0, 0xB, 0x0, 0x20, 0x88, 0x0, 0xB, 0x0, 0x28, 0x88, 0x0, 0xB, 0x0, 0x30, 0x88, 0x0, 0xB, 0x0, 0x38, 0x88, 0x0, 0xB, 0x0, 0x40, 0x88, 0x0, 0xB, 0x0, 0x48, 0x88, 0x0, 0xB, 0x0, 0x50, 0x88, 0x0, 0xB, 0x0, 0x58, 0x88, 0x0, 0xB, 0x0, 0x60, 0x88, 0x0, 0xB, 0x0, 0x68, 0x88, 0x0, 0xB, 0x0, 0x70, 0x88, 0x0, 0xB, 0x0, 0x78, 0x88, 0x0, 0xB, 0x0, 0x80, 0x88, 0x0, 0xB, 0x0, 0x88, 0x88, 0x0, 0xB, 0x0, 0x90, 0x88, 0x0, 0xB, 0x0, 0x98, 0x88, 0x0, 0x8B, 0x22, 0x2, 0x0, 0x0, 0xAB, 0x22, 0x2, 0x0, 0x0, 0xCB, 0x22, 0x2, 0x0, 0x0, 0xEB, 0x22, 0x2, 0x0, 0x0, 0xB, 0x23, 0x2, 0x0, 0x0, 0x2B, 0x23, 0x2, 0x0, 0x0, 0x4B, 0x23, 0x2, 0x0, 0x0, 0x6B, 0x23, 0x2, 0x0, 0x0, 0x8B, 0x23, 0x2, 0x0, 0x0, 0xAB, 0x23, 0x2, 0x0, 0x0, 0xCB, 0x23, 0x2, 0x0, 0x0, 0xEB, 0x23, 0x2, 0x0, 0x0, 0xB, 0x24, 0x2, 0x0, 0x0, 0x2B, 0x24, 0x2, 0x0, 0x0, 0x4B, 0x24, 0x2, 0x0, 0x0, 0x6B, 0x24, 0x2, 0x0, 0x0, 0x8B, 0x24, 0x2, 0x0, 0x0, 0xAB, 0x24, 0x2, 0x0, 0x0, 0xCB, 0x24, 0x2, 0x0, 0x0, 0xEB, 0x24, 0x2, 0x0, 0x0, 0xB, 0x25, 0x2, 0x0, 0x0, 0x2B, 0x25, 0x2, 0x0, 0x0, 0x4B, 0x25, 0x2, 0x0, 0x0, 0x6B, 0x25, 0x2, 0x0, 0x0, 0x8B, 0x25, 0x2, 0x0, 0x0, 0xAB, 0x25, 0x2, 0x0, 0x0, 0xCB, 0x25, 0x2, 0x0, 0x0, 0xEB, 0x25, 0x2, 0x0, 0x0, 0xB, 0x26, 0x2, 0x0, 0x0, 0x2B, 0x26, 0x2, 0x0, 0x0, 0x4B, 0x26, 0x2, 0x0, 0x0, 0x6B, 0x26, 0x2, 0x0, 0x0, 0x8B, 0x26, 0x2, 0x0, 0x0, 0xAB, 0x26, 0x2, 0x0, 0x0, 0xCB, 0x26, 0x2, 0x0, 0x0, 0xEB, 0x26, 0x2, 0x0, 0x0, 0xB, 0x27, 0x2, 0x0, 0x0, 0x2B, 0x27, 0x2, 0x0, 0x0, 0x4B, 0x27, 0x2, 0x0, 0x0, 0x6B, 0x27, 0x2, 0x0, 0x0, 0x8B, 0x27, 0x2, 0x0, 0x0, 0xAB, 0x27, 0x2, 0x0, 0x0, 0xCB, 0x27, 0x2, 0x0, 0x0, 0xEB, 0x27, 0x2, 0x0, 0x0, 0xB, 0x28, 0x2, 0x0, 0x0, 0x2B, 0x28, 0x2, 0x0, 0x0, 0x4B, 0x28, 0x2, 0x0, 0x0, 0x6B, 0x28, 0x2, 0x0, 0x0, 0x8B, 0x28, 0x2, 0x0, 0x0, 0xAB, 0x28, 0x2, 0x0, 0x0, 0xCB, 0x28, 0x2, 0x0, 0x0, 0xEB, 0x28, 0x2, 0x0, 0x0, 0xB, 0x29, 0x2, 0x0, 0x0, 0x2B, 0x29, 0x2, 0x0, 0x0, 0x4B, 0x29, 0x2, 0x0, 0x0, 0x6B, 0x29, 0x2, 0x0, 0x0, 0x8B, 0x29, 0x2, 0x0, 0x0, 0xAB, 0x29, 0x2, 0x0, 0x0, 0xCB, 0x29, 0x2, 0x0, 0x0, 0xEB, 0x29, 0x2, 0x0, 0x0, 0xB, 0x2A, 0x2, 0x0, 0x0, 0x2B, 0x2A, 0x2, 0x0, 0x0, 0x4B, 0x2A, 0x2, 0x0, 0x0, 0x6B, 0x2A, 0x2, 0x0, 0x0, 0x8B, 0x2A, 0x2, 0x0, 0x0, 0xAB, 0x2A, 0x2, 0x0, 0x0, 0xCB, 0x2A, 0x2, 0x0, 0x0, 0xEB, 0x2A, 0x2, 0x0, 0x0, 0xB, 0x2B, 0x2, 0x0, 0x0, 0x2B, 0x2B, 0x2, 0x0, 0x0, 0x4B, 0x2B, 0x2, 0x0, 0x0, 0x6B, 0x2B, 0x2, 0x0, 0x0, 0x8B, 0x2B, 0x2, 0x0, 0x0, 0xAB, 0x2B, 0x2, 0x0, 0x0, 0xCB, 0x2B, 0x2, 0x0, 0x0, 0xEB, 0x2B, 0x2, 0x0, 0x0, 0xB, 0x2C, 0x2, 0x0, 0x0, 0x2B, 0x2C, 0x2, 0x0, 0x0, 0x4B, 0x2C, 0x2, 0x0, 0x0, 0x6B, 0x2C, 0x2, 0x0, 0x0, 0x8B, 0x2C, 0x2, 0x0, 0x0, 0xAB, 0x2C, 0x2, 0x0, 0x0, 0xCB, 0x2C, 0x2, 0x0, 0x0, 0xEB, 0x2C, 0x2, 0x0, 0x0, 0xB, 0x2D, 0x2, 0x0, 0x0, 0x2B, 0x2D, 0x2, 0x0, 0x0, 0x4B, 0x2D, 0x2, 0x0, 0x0, 0x6B, 0x2D, 0x2, 0x0, 0x0, 0x8B, 0x2D, 0x2, 0x0, 0x0, 0xAB, 0x2D, 0x2, 0x0, 0x0, 0xCB, 0x2D, 0x2, 0x0, 0x0, 0xEB, 0x2D, 0x2, 0x0, 0x0, 0xB, 0x2E, 0x2, 0x0, 0x0, 0x2B, 0x2E, 0x2, 0x0, 0x0, 0x4B, 0x2E, 0x2, 0x0, 0x0, 0x6B, 0x2E, 0x2, 0x0, 0x0, 0x8B, 0x2E, 0x2, 0x0, 0x0, 0xAB, 0x2E, 0x2, 0x0, 0x0, 0xCB, 0x2E, 0x2, 0x0, 0x0, 0xEB, 0x2E, 0x2, 0x0, 0x0, 0xB, 0x2F, 0x2, 0x0, 0x0, 0x2B, 0x2F, 0x2, 0x0, 0x0, 0x4B, 0x2F, 0x2, 0x0, 0x0, 0x6B, 0x2F, 0x2, 0x0, 0x0, 0x8B, 0x2F, 0x2, 0x0, 0x0, 0xAB, 0x2F, 0x2, 0x0, 0x0, 0xCB, 0x2F, 0x2, 0x0, 0x0, 0xEB, 0x2F, 0x2, 0x0, 0x0, 0xB, 0x30, 0x2, 0x0, 0x0, 0x2B, 0x30, 0x2, 0x0, 0x0, 0x4B, 0x30, 0x2, 0x0, 0x0, 0x6B, 0x30, 0x2, 0x0, 0x0, 0x8B, 0x30, 0x2, 0x0, 0x0, 0xAB, 0x30, 0x2, 0x0, 0x0, 0xCB, 0x30, 0x2, 0x0, 0x0, 0xEB, 0x30, 0x2, 0x0, 0x0, 0xB, 0x31, 0x2, 0x0, 0x0, 0x2B, 0x31, 0x2, 0x0, 0x0, 0x4B, 0x31, 0x2, 0x0, 0x0, 0x6B, 0x31, 0x2, 0x0, 0x0, 0x8B, 0x31, 0x2, 0x0, 0x0, 0xAB, 0x31, 0x2, 0x0, 0x0, 0xCB, 0x31, 0x2, 0x0, 0x0, 0xEB, 0x31, 0x2, 0x0, 0x0, 0xB, 0x32, 0x2, 0x0, 0x0, 0x2B, 0x32, 0x2, 0x0, 0x0, 0x4B, 0x32, 0x2, 0x0, 0x0, 0x6B, 0x32, 0x2, 0x0, 0x0, 0x8B, 0x32, 0x2, 0x0, 0x0, 0xAB, 0x32, 0x2, 0x0, 0x0, 0xCB, 0x32, 0x2, 0x0, 0x0, 0xEB, 0x32, 0x2, 0x0, 0x0, 0xB, 0x33, 0x2, 0x0, 0x0, 0x2B, 0x33, 0x2, 0x0, 0x0, 0x4B, 0x33, 0x2, 0x0, 0x0, 0x6B, 0x33, 0x2, 0x0, 0x0, 0x8B, 0x33, 0x2, 0x0, 0x0, 0xAB, 0x33, 0x2, 0x0, 0x0, 0xCB, 0x33, 0x2, 0x0, 0x0, 0xEB, 0x33, 0x2, 0x0, 0x0, 0xB, 0x34, 0x2, 0x0, 0x0, 0x2B, 0x34, 0x2, 0x0, 0x0, 0x4B, 0x34, 0x2, 0x0, 0x0, 0x6B, 0x34, 0x2, 0x0, 0x0, 0x8B, 0x34, 0x2, 0x0, 0x0, 0xB, 0x0, 0x28, 0x8D, 0x0, 0xB, 0xFE, 0x1, 0x0, 0x0, 0x2B, 0xFE, 0x1, 0x0, 0x0, 0x4B, 0xFE, 0x1, 0x0, 0x0, 0x6B, 0xFE, 0x1, 0x0, 0x0, 0x8B, 0xFE, 0x1, 0x0, 0x0, 0xAB, 0xFE, 0x1, 0x0, 0x0, 0xCB, 0xFE, 0x1, 0x0, 0x0, 0xEB, 0xFE, 0x1, 0x0, 0x0, 0xB, 0xFF, 0x1, 0x0, 0x0, 0x2B, 0xFF, 0x1, 0x0, 0x0, 0x4B, 0xFF, 0x1, 0x0, 0x0, 0xCB, 0x34, 0x2, 0x0, 0x0, 0xEB, 0x34, 0x2, 0x0, 0x0, 0xB, 0x35, 0x2, 0x0, 0x0, 0x2B, 0x35, 0x2, 0x0, 0x0, 0x4B, 0x35, 0x2, 0x0, 0x0, 0x6B, 0x35, 0x2, 0x0, 0x0, 0x8B, 0x35, 0x2, 0x0, 0x0, 0xAB, 0x35, 0x2, 0x0, 0x0, 0xCB, 0x35, 0x2, 0x0, 0x0, 0x6B, 0xFF, 0x1, 0x0, 0x0, 0x8B, 0xFF, 0x1, 0x0, 0x0, 0xAB, 0xFF, 0x1, 0x0, 0x0, 0xCB, 0xFF, 0x1, 0x0, 0x0, 0xEB, 0xFF, 0x1, 0x0, 0x0, 0xB, 0x0, 0x2, 0x0, 0x0, 0x2B, 0x0, 0x2, 0x0, 0x0, 0x4B, 0x0, 0x2, 0x0, 0x0, 0x6B, 0x0, 0x2, 0x0, 0x0, 0x8B, 0x0, 0x2, 0x0, 0x0, 0xAB, 0x0, 0x2, 0x0, 0x0, 0xCB, 0x0, 0x2, 0x0, 0x0, 0xEB, 0x0, 0x2, 0x0, 0x0, 0xB, 0x1, 0x2, 0x0, 0x0, 0x2B, 0x1, 0x2, 0x0, 0x0, 0x4B, 0x1, 0x2, 0x0, 0x0, 0x6B, 0x1, 0x2, 0x0, 0x0, 0x8B, 0x1, 0x2, 0x0, 0x0, 0xAB, 0x1, 0x2, 0x0, 0x0, 0xCB, 0x1, 0x2, 0x0, 0x0, 0xEB, 0x1, 0x2, 0x0, 0x0, 0xB, 0x2, 0x2, 0x0, 0x0, 0x2B, 0x2, 0x2, 0x0, 0x0, 0xEB, 0x35, 0x2, 0x0, 0x0, 0xB, 0x36, 0x2, 0x0, 0x0, 0x2B, 0x36, 0x2, 0x0, 0x0, 0x4B, 0x36, 0x2, 0x0, 0x0, 0x6B, 0x36, 0x2, 0x0, 0x0, 0x8B, 0x36, 0x2, 0x0, 0x0, 0xAB, 0x36, 0x2, 0x0, 0x0, 0xCB, 0x36, 0x2, 0x0, 0x0, 0xEB, 0x36, 0x2, 0x0, 0x0, 0xB, 0x37, 0x2, 0x0, 0x0, 0x2B, 0x37, 0x2, 0x0, 0x0, 0x4B, 0x37, 0x2, 0x0, 0x0, 0x6B, 0x37, 0x2, 0x0, 0x0, 0x8B, 0x37, 0x2, 0x0, 0x0, 0xAB, 0x37, 0x2, 0x0, 0x0, 0xCB, 0x37, 0x2, 0x0, 0x0, 0xEB, 0x37, 0x2, 0x0, 0x0, 0xB, 0x38, 0x2, 0x0, 0x0, 0x2B, 0x38, 0x2, 0x0, 0x0, 0x4B, 0x38, 0x2, 0x0, 0x0, 0x6B, 0x38, 0x2, 0x0, 0x0, 0x8B, 0x38, 0x2, 0x0, 0x0, 0xAB, 0x38, 0x2, 0x0, 0x0, 0xCB, 0x38, 0x2, 0x0, 0x0, 0xEB, 0x38, 0x2, 0x0, 0x0, 0xB, 0x39, 0x2, 0x0, 0x0, 0x2B, 0x39, 0x2, 0x0, 0x0, 0x4B, 0x39, 0x2, 0x0, 0x0, 0x6B, 0x39, 0x2, 0x0, 0x0, 0x8B, 0x39, 0x2, 0x0, 0x0, 0xAB, 0x39, 0x2, 0x0, 0x0, 0xCB, 0x39, 0x2, 0x0, 0x0, 0xEB, 0x39, 0x82, 0x8E, 0x0, 0x2B, 0x3A, 0x92, 0x8E, 0x0, 0x6B, 0x3A, 0xA2, 0x8E, 0x0, 0xAB, 0x3A, 0xB2, 0x8E, 0x0, 0xEB, 0x3A, 0xC2, 0x8E, 0x0, 0x2B, 0x3B, 0xD2, 0x8E, 0x0, 0x6B, 0x3B, 0xE2, 0x8E, 0x0, 0xAB, 0x3B, 0xF2, 0x8E, 0x0, 0xEB, 0x3B, 0x2, 0x8F, 0x0, 0x2B, 0x3C, 0x12, 0x8F, 0x0, 0x6B, 0x3C, 0x22, 0x8F, 0x0, 0xAB, 0x3C, 0x32, 0x8F, 0x0, 0xEB, 0x3C, 0x42, 0x8F, 0x0, 0x2B, 0x3D, 0x52, 0x8F, 0x0, 0x6B, 0x3D, 0x62, 0x8F, 0x0, 0xAB, 0x3D, 0x72, 0x8F, 0x0, 0xEB, 0x3D, 0x82, 0x8F, 0x0, 0x2B, 0x3E, 0x92, 0x8F, 0x0, 0x6B, 0x3E, 0xA2, 0x8F, 0x0, 0xAB, 0x3E, 0xB2, 0x8F, 0x0, 0xEB, 0x3E, 0xC2, 0x8F, 0x0, 0x2B, 0x3F, 0xD2, 0x8F, 0x0, 0x6B, 0x3F, 0xE2, 0x8F, 0x0, 0xAB, 0x3F, 0xF2, 0x8F, 0x0, 0xEB, 0x3F, 0x2, 0x90, 0x0, 0x2B, 0x40, 0x12, 0x90, 0x0, 0x6B, 0x40, 0x22, 0x90, 0x0, 0xAB, 0x40, 0x32, 0x90, 0x0, 0xEB, 0x40, 0x42, 0x90, 0x0, 0x2B, 0x41, 0x52, 0x90, 0x0, 0x6B, 0x41, 0x2A, 0x8D, 0x0, 0x8B, 0x41, 0x6A, 0x90, 0x0, 0xCB, 0x41, 0x7A, 0x90, 0x0, 0xB, 0x42, 0x8A, 0x90, 0x0, 0x4B, 0x42, 0x9A, 0x90, 0x0, 0x8B, 0x42, 0xAA, 0x90, 0x0, 0xCB, 0x42, 0xBA, 0x90, 0x0, 0xB, 0x43, 0xCA, 0x90, 0x0, 0x4B, 0x43, 0xDA, 0x90, 0x0, 0x8B, 0x43, 0xEA, 0x90, 0x0, 0xCB, 0x43, 0xFA, 0x90, 0x0, 0xB, 0x44, 0xA, 0x91, 0x0, 0x4B, 0x44, 0x1A, 0x91, 0x0, 0x8B, 0x44, 0x2A, 0x91, 0x0, 0xCB, 0x44, 0x3A, 0x91, 0x0, 0xB, 0x45, 0x4A, 0x91, 0x0, 0xB, 0x0, 0x50, 0x91, 0x0, 0xB, 0x0, 0x58, 0x91, 0x0, 0xB, 0x0, 0x60, 0x91, 0x0, 0xB, 0x0, 0x68, 0x91, 0x0, 0xB, 0x0, 0x70, 0x91, 0x0, 0xB, 0x0, 0x78, 0x91, 0x0, 0xB, 0x0, 0x80, 0x91, 0x0, 0xB, 0x0, 0x88, 0x91, 0x0, 0xB, 0x0, 0x90, 0x91, 0x0, 0xB, 0x0, 0x98, 0x91, 0x0, 0xB, 0x0, 0xA0, 0x91, 0x0, 0xB, 0x0, 0xA8, 0x91, 0x0, 0xB, 0x0, 0xB0, 0x91, 0x0, 0xB, 0x0, 0xB8, 0x91, 0x0, 0xB, 0x0, 0xC0, 0x91, 0x0, 0xB, 0x0, 0xC8, 0x91, 0x0, 0xB, 0x0, 0xD0, 0x91, 0x0, 0xB, 0x0, 0xD8, 0x91, 0x0, 0xB, 0x0, 0xE0, 0x91, 0x0, 0xB, 0x0, 0xE8, 0x91, 0x0, 0xB, 0x0, 0xF0, 0x91, 0x0, 0xB, 0x0, 0xF8, 0x91, 0x0, 0xB, 0x0, 0x0, 0x92, 0x0, 0xB, 0x0, 0x8, 0x92, 0x0, 0xB, 0x0, 0x10, 0x92, 0x0, 0xB, 0x0, 0x18, 0x92, 0x0, 0xB, 0x0, 0x20, 0x92, 0x0, 0xB, 0x0, 0x28, 0x92, 0x0, 0xB, 0x0, 0x30, 0x92, 0x0, 0xB, 0x0, 0x38, 0x92, 0x0, 0xB, 0x0, 0x40, 0x92, 0x0, 0xB, 0x0, 0x48, 0x92, 0x0, 0xB, 0x0, 0x50, 0x92, 0x0, 0xB, 0x0, 0x58, 0x92, 0x0, 0xB, 0x0, 0x60, 0x92, 0x0, 0xB, 0x0, 0x68, 0x92, 0x0, 0xB, 0x0, 0x70, 0x92, 0x0, 0xB, 0x0, 0x78, 0x92, 0x0, 0xB, 0x0, 0x80, 0x92, 0x0, 0xB, 0x0, 0x88, 0x92, 0x0, 0xB, 0x0, 0x90, 0x92, 0x0, 0xB, 0x0, 0x98, 0x92, 0x0, 0xB, 0x0, 0xA0, 0x92, 0x0, 0xB, 0x0, 0xA8, 0x92, 0x0, 0xB, 0x0, 0xB0, 0x92, 0x0, 0xB, 0x0, 0xB8, 0x92, 0x0, 0xB, 0x0, 0xC0, 0x92, 0x0, 0xB, 0x0, 0xC8, 0x92, 0x0, 0xB, 0x0, 0xD0, 0x92, 0x0, 0xB, 0x0, 0xD8, 0x92, 0x0, 0xB, 0x0, 0xE0, 0x92, 0x0, 0xB, 0x0, 0xE8, 0x92, 0x0, 0xB, 0x0, 0xF0, 0x92, 0x0, 0xB, 0x0, 0xF8, 0x92, 0x0, 0xB, 0x0, 0x0, 0x93, 0x0, 0xB, 0x0, 0x8, 0x93, 0x0, 0xB, 0x0, 0x10, 0x93, 0x0, 0xB, 0x0, 0x18, 0x93, 0x0, 0xB, 0x0, 0x20, 0x93, 0x0, 0xB, 0x0, 0x28, 0x93, 0x0, 0xB, 0x0, 0x30, 0x93, 0x0, 0xB, 0x0, 0x38, 0x93, 0x0, 0xB, 0x0, 0x40, 0x93, 0x0, 0xB, 0x0, 0x48, 0x93, 0x0, 0xB, 0x0, 0x50, 0x93, 0x0, 0xB, 0x0, 0x58, 0x93, 0x0, 0xB, 0x0, 0x60, 0x93, 0x0, 0xB, 0x0, 0x68, 0x93, 0x0, 0xB, 0x0, 0x70, 0x93, 0x0, 0xB, 0x0, 0x78, 0x93, 0x0, 0xB, 0x0, 0x80, 0x93, 0x0, 0xB, 0x0, 0x88, 0x93, 0x0, 0xB, 0x0, 0x90, 0x93, 0x0, 0xB, 0x0, 0x98, 0x93, 0x0, 0xB, 0x0, 0x10, 0x83, 0x0, 0xB, 0x0, 0xA0, 0x93, 0x0, 0xB, 0x0, 0xA8, 0x93, 0x0, 0xB, 0x0, 0xB0, 0x93, 0x0, 0xB, 0x0, 0xB8, 0x93, 0x0, 0xB, 0x0, 0xC0, 0x93, 0x0, 0xB, 0x0, 0xC8, 0x93, 0x0, 0xB, 0x0, 0xD0, 0x93, 0x0, 0xB, 0x0, 0x28, 0x83, 0x0, 0xB, 0x0, 0x30, 0x83, 0x0, 0xB, 0x0, 0x38, 0x83, 0x0, 0xB, 0x0, 0x40, 0x83, 0x0, 0xB, 0x0, 0x48, 0x83, 0x0, 0xB, 0x0, 0x50, 0x83, 0x0, 0xB, 0x0, 0x58, 0x83, 0x0, 0xB, 0x0, 0x60, 0x83, 0x0, 0xB, 0x0, 0x68, 0x83, 0x0, 0xB, 0x0, 0x70, 0x83, 0x0, 0xB, 0x0, 0xD8, 0x93, 0x0, 0xB, 0x0, 0xE0, 0x93, 0x0, 0xB, 0x0, 0xE8, 0x93, 0x0, 0xB, 0x0, 0xF0, 0x93, 0x0, 0xB, 0x0, 0xF8, 0x93, 0x0, 0xB, 0x0, 0x0, 0x94, 0x0, 0xB, 0x0, 0x8, 0x94, 0x0, 0xB, 0x0, 0x10, 0x94, 0x0, 0xB, 0x0, 0xB8, 0x83, 0x0, 0xB, 0x0, 0xC0, 0x83, 0x0, 0xB, 0x0, 0xC8, 0x83, 0x0, 0xB, 0x0, 0xD0, 0x83, 0x0, 0xB, 0x0, 0xD8, 0x83, 0x0, 0xB, 0x0, 0xE0, 0x83, 0x0, 0xB, 0x0, 0xE8, 0x83, 0x0, 0xB, 0x0, 0xF0, 0x83, 0x0, 0xB, 0x0, 0xF8, 0x83, 0x0, 0xB, 0x0, 0x0, 0x84, 0x0, 0xB, 0x0, 0x8, 0x84, 0x0, 0xB, 0x0, 0x10, 0x84, 0x0, 0xB, 0x0, 0x18, 0x84, 0x0, 0xB, 0x0, 0x20, 0x84, 0x0, 0xB, 0x0, 0x28, 0x84, 0x0, 0xB, 0x0, 0x30, 0x84, 0x0, 0xB, 0x0, 0x38, 0x84, 0x0, 0xB, 0x0, 0x40, 0x84, 0x0, 0xB, 0x0, 0x48, 0x84, 0x0, 0xB, 0x0, 0x50, 0x84, 0x0, 0xB, 0x0, 0x58, 0x84, 0x0, 0xB, 0x0, 0x60, 0x84, 0x0, 0xB, 0x0, 0x68, 0x84, 0x0, 0xB, 0x0, 0x70, 0x84, 0x0, 0xB, 0x0, 0x78, 0x84, 0x0, 0xB, 0x0, 0x80, 0x84, 0x0, 0xB, 0x0, 0x88, 0x84, 0x0, 0xB, 0x0, 0xB0, 0x84, 0x0, 0xB, 0x0, 0x18, 0x94, 0x0, 0xB, 0x0, 0x20, 0x94, 0x0, 0xB, 0x0, 0x28, 0x94, 0x0, 0xB, 0x0, 0x30, 0x94, 0x0, 0xB, 0x0, 0x38, 0x94, 0x0, 0xB, 0x0, 0x40, 0x94, 0x0, 0xB, 0x0, 0xE0, 0x84, 0x0, 0xB, 0x0, 0x48, 0x94, 0x0, 0xB, 0x0, 0x50, 0x94, 0x0, 0xB, 0x0, 0x58, 0x94, 0x0, 0xB, 0x0, 0x60, 0x94, 0x0, 0xB, 0x0, 0x68, 0x94, 0x0, 0xB, 0x0, 0x70, 0x94, 0x0, 0xB, 0x0, 0x78, 0x94, 0x0, 0xB, 0x0, 0x80, 0x94, 0x0, 0xB, 0x0, 0x90, 0x85, 0x0, 0xB, 0x0, 0x88, 0x94, 0x0, 0xB, 0x0, 0x90, 0x94, 0x0, 0xB, 0x0, 0x98, 0x94, 0x0, 0xB, 0x0, 0xA0, 0x94, 0x0, 0xB, 0x0, 0xA8, 0x94, 0x0, 0xB, 0x0, 0xB0, 0x94, 0x0, 0xB, 0x0, 0xB8, 0x94, 0x0, 0xB, 0x0, 0xC0, 0x94, 0x0, 0xB, 0x0, 0xC8, 0x94, 0x0, 0xB, 0x0, 0xD0, 0x94, 0x0, 0xB, 0x0, 0xD8, 0x94, 0x0, 0xB, 0x0, 0xE0, 0x94, 0x0, 0xB, 0x0, 0xE8, 0x94, 0x0, 0xB, 0x0, 0xF0, 0x94, 0x0, 0xB, 0x0, 0xF8, 0x94, 0x0, 0xB, 0x0, 0x0, 0x95, 0x0, 0xB, 0x0, 0x8, 0x95, 0x0, 0xB, 0x0, 0x10, 0x95, 0x0, 0xB, 0x0, 0x18, 0x95, 0x0, 0xB, 0x0, 0x20, 0x95, 0x0, 0xB, 0x0, 0x28, 0x95, 0x0, 0xB, 0x0, 0x30, 0x95, 0x0, 0xB, 0x0, 0x38, 0x95, 0x0, 0xB, 0x0, 0x40, 0x95, 0x0, 0xB, 0x0, 0x48, 0x95, 0x0, 0xB, 0x0, 0x50, 0x95, 0x0, 0xB, 0x0, 0x58, 0x95, 0x0, 0xB, 0x0, 0x60, 0x95, 0x0, 0xB, 0x0, 0x68, 0x95, 0x0, 0xB, 0x0, 0x70, 0x95, 0x0, 0xB, 0x0, 0x78, 0x95, 0x0, 0xB, 0x0, 0x80, 0x95, 0x0, 0xB, 0x0, 0x88, 0x95, 0x0, 0xB, 0x0, 0x90, 0x95, 0x0, 0xB, 0x0, 0x98, 0x95, 0x0, 0xB, 0x0, 0xA0, 0x95, 0x0, 0xB, 0x0, 0xA8, 0x95, 0x0, 0xB, 0x0, 0xB0, 0x95, 0x0, 0xB, 0x0, 0xB8, 0x95, 0x0, 0xB, 0x0, 0xC0, 0x95, 0x0, 0xB, 0x0, 0xC8, 0x95, 0x0, 0xB, 0x0, 0xD0, 0x95, 0x0, 0xB, 0x0, 0xD8, 0x95, 0x0, 0xB, 0x0, 0xE0, 0x95, 0x0, 0xB, 0x0, 0xE8, 0x95, 0x0, 0xB, 0x0, 0xF0, 0x95, 0x0, 0xB, 0x0, 0xF8, 0x95, 0x0, 0xB, 0x0, 0x0, 0x96, 0x0, 0xB, 0x0, 0x8, 0x96, 0x0, 0xB, 0x0, 0x10, 0x96, 0x0, 0xB, 0x0, 0x18, 0x96, 0x0, 0xB, 0x0, 0x20, 0x96, 0x0, 0xB, 0x0, 0x28, 0x96, 0x0, 0xB, 0x0, 0x30, 0x96, 0x0, 0xB, 0x0, 0x38, 0x96, 0x0, 0xB, 0x0, 0x40, 0x96, 0x0, 0xB, 0x0, 0x48, 0x96, 0x0, 0xB, 0x0, 0x50, 0x96, 0x0, 0xB, 0x0, 0x58, 0x96, 0x0, 0xB, 0x0, 0x60, 0x96, 0x0, 0xB, 0x0, 0x68, 0x96, 0x0, 0xB, 0x0, 0x70, 0x96, 0x0, 0xB, 0x0, 0x78, 0x96, 0x0, 0xB, 0x0, 0x80, 0x96, 0x0, 0xB, 0x0, 0x88, 0x96, 0x0, 0xB, 0x0, 0x90, 0x96, 0x0, 0xB, 0x0, 0x98, 0x96, 0x0, 0xB, 0x0, 0xA0, 0x96, 0x0, 0xB, 0x0, 0xA8, 0x96, 0x0, 0xB, 0x0, 0xB0, 0x96, 0x0, 0xB, 0x0, 0xB8, 0x96, 0x0, 0xB, 0x0, 0xC0, 0x96, 0x0, 0xB, 0x0, 0xC8, 0x96, 0x0, 0xB, 0x0, 0xD0, 0x96, 0x0, 0xB, 0x0, 0xD8, 0x96, 0x0, 0xB, 0x0, 0xE0, 0x96, 0x0, 0xB, 0x0, 0xE8, 0x96, 0x0, 0xB, 0x0, 0xF0, 0x96, 0x0, 0xB, 0x0, 0xF8, 0x96, 0x0, 0xB, 0x0, 0x0, 0x97, 0x0, 0xB, 0x0, 0x8, 0x97, 0x0, 0xB, 0x0, 0x10, 0x97, 0x0, 0xB, 0x0, 0x18, 0x97, 0x0, 0xB, 0x0, 0x20, 0x97, 0x0, 0xB, 0x0, 0x28, 0x97, 0x0, 0xB, 0x0, 0x30, 0x97, 0x0, 0xB, 0x0, 0x38, 0x97, 0x0, 0xB, 0x0, 0x40, 0x97, 0x0, 0xB, 0x0, 0x48, 0x97, 0x0, 0xB, 0x0, 0x50, 0x97, 0x0, 0xB, 0x0, 0x58, 0x97, 0x0, 0xB, 0x0, 0x60, 0x97, 0x0, 0xB, 0x0, 0x68, 0x97, 0x0, 0xB, 0x0, 0x70, 0x97, 0x0, 0xB, 0x0, 0x78, 0x97, 0x0, 0xB, 0x0, 0x80, 0x97, 0x0, 0xB, 0x0, 0x88, 0x97, 0x0, 0xB, 0x0, 0x90, 0x97, 0x0, 0xB, 0x0, 0x98, 0x97, 0x0, 0xB, 0x0, 0xA0, 0x97, 0x0, 0xB, 0x0, 0xA8, 0x97, 0x0, 0xB, 0x0, 0xB0, 0x97, 0x0, 0xB, 0x0, 0xB8, 0x97, 0x0, 0xB, 0x0, 0xC0, 0x97, 0x0, 0xB, 0x0, 0xC8, 0x97, 0x0, 0xB, 0x0, 0xD0, 0x97, 0x0, 0xB, 0x0, 0xD8, 0x97, 0x0, 0xB, 0x0, 0xE0, 0x97, 0x0, 0xB, 0x0, 0xE8, 0x97, 0x0, 0xB, 0x0, 0xF0, 0x97, 0x0, 0xB, 0x0, 0xF8, 0x97, 0x0, 0xB, 0x0, 0x0, 0x98, 0x0, 0xB, 0x0, 0x8, 0x98, 0x0, 0xB, 0x0, 0x10, 0x98, 0x0, 0xB, 0x0, 0x18, 0x98, 0x0, 0xB, 0x0, 0x20, 0x98, 0x0, 0xB, 0x0, 0x28, 0x98, 0x0, 0xB, 0x0, 0x30, 0x98, 0x0, 0xB, 0x0, 0x38, 0x98, 0x0, 0xB, 0x0, 0x40, 0x98, 0x0, 0xB, 0x0, 0x48, 0x98, 0x0, 0xB, 0x0, 0x50, 0x98, 0x0, 0xB, 0x0, 0x58, 0x98, 0x0, 0xB, 0x0, 0x60, 0x98, 0x0, 0xB, 0x0, 0x68, 0x98, 0x0, 0xB, 0x0, 0x70, 0x98, 0x0, 0xB, 0x0, 0x78, 0x98, 0x0, 0xB, 0x0, 0x80, 0x98, 0x0, 0xB, 0x0, 0x88, 0x98, 0x0, 0xB, 0x0, 0x90, 0x98, 0x0, 0xB, 0x0, 0x98, 0x98, 0x0, 0xB, 0x0, 0xA0, 0x98, 0x0, 0xB, 0x0, 0xA8, 0x98, 0x0, 0xB, 0x0, 0xB0, 0x98, 0x0, 0xB, 0x0, 0xB8, 0x98, 0x0, 0xB, 0x0, 0xC0, 0x98, 0x0, 0xB, 0x0, 0xC8, 0x98, 0x0, 0xB, 0x0, 0xD0, 0x98, 0x0, 0xB, 0x0, 0xD8, 0x98, 0x0, 0xB, 0x0, 0xE0, 0x98, 0x0, 0xB, 0x0, 0xE8, 0x98, 0x0, 0xB, 0x0, 0xF0, 0x98, 0x0, 0xB, 0x0, 0xF8, 0x98, 0x0, 0xB, 0x0, 0x0, 0x99, 0x0, 0xB, 0x0, 0x8, 0x99, 0x0, 0xB, 0x0, 0x10, 0x99, 0x0, 0xB, 0x0, 0x18, 0x99, 0x0, 0xB, 0x0, 0x20, 0x99, 0x0, 0xB, 0x0, 0x28, 0x99, 0x0, 0xB, 0x0, 0x30, 0x99, 0x0, 0xB, 0x0, 0x38, 0x99, 0x0, 0xB, 0x0, 0x40, 0x99, 0x0, 0xB, 0x0, 0x48, 0x99, 0x0, 0xB, 0x0, 0x50, 0x99, 0x0, 0xB, 0x0, 0x58, 0x99, 0x0, 0xB, 0x0, 0x60, 0x99, 0x0, 0xB, 0x0, 0x68, 0x99, 0x0, 0xB, 0x0, 0x70, 0x99, 0x0, 0xB, 0x0, 0x78, 0x99, 0x0, 0xB, 0x0, 0x80, 0x99, 0x0, 0xB, 0x0, 0x88, 0x99, 0x0, 0xB, 0x0, 0x90, 0x99, 0x0, 0xB, 0x0, 0x98, 0x99, 0x0, 0xB, 0x0, 0xA0, 0x99, 0x0, 0xB, 0x0, 0xA8, 0x99, 0x0, 0xB, 0x0, 0xB0, 0x99, 0x0, 0xB, 0x0, 0xB8, 0x99, 0x0, 0xB, 0x0, 0xC0, 0x99, 0x0, 0xB, 0x0, 0xC8, 0x99, 0x0, 0xB, 0x0, 0xD0, 0x99, 0x0, 0xB, 0x0, 0xD8, 0x99, 0x0, 0xB, 0x0, 0xE0, 0x99, 0x0, 0xB, 0x0, 0xE8, 0x99, 0x0, 0xB, 0x0, 0xF0, 0x99, 0x0, 0xB, 0x0, 0xF8, 0x99, 0x0, 0xB, 0x0, 0x0, 0x9A, 0x0, 0xB, 0x0, 0x8, 0x9A, 0x0, 0xB, 0x0, 0x10, 0x9A, 0x0, 0xB, 0x0, 0x18, 0x9A, 0x0, 0xB, 0x0, 0x20, 0x9A, 0x0, 0xB, 0x0, 0x28, 0x9A, 0x0, 0xB, 0x0, 0x30, 0x9A, 0x0, 0xB, 0x0, 0x38, 0x9A, 0x0, 0xB, 0x0, 0x40, 0x9A, 0x0, 0xB, 0x0, 0x48, 0x9A, 0x0, 0xB, 0x0, 0x50, 0x9A, 0x0, 0xB, 0x0, 0x58, 0x9A, 0x0, 0xB, 0x0, 0x60, 0x9A, 0x0, 0xB, 0x0, 0x68, 0x9A, 0x0, 0xB, 0x0, 0x70, 0x9A, 0x0, 0xB, 0x0, 0x78, 0x9A, 0x0, 0xB, 0x0, 0x80, 0x9A, 0x0, 0xB, 0x0, 0x88, 0x9A, 0x0, 0xB, 0x0, 0x90, 0x9A, 0x0, 0xB, 0x0, 0x98, 0x9A, 0x0, 0xB, 0x0, 0xA0, 0x9A, 0x0, 0xB, 0x0, 0xA8, 0x9A, 0x0, 0xB, 0x0, 0xB0, 0x9A, 0x0, 0xB, 0x0, 0xB8, 0x9A, 0x0, 0xB, 0x0, 0xC0, 0x9A, 0x0, 0xB, 0x0, 0xC8, 0x9A, 0x0, 0xB, 0x0, 0xD0, 0x9A, 0x0, 0xB, 0x0, 0xD8, 0x9A, 0x0, 0xB, 0x0, 0xE0, 0x9A, 0x0, 0xB, 0x0, 0xE8, 0x9A, 0x0, 0xB, 0x0, 0xF0, 0x9A, 0x0, 0xB, 0x0, 0xF8, 0x9A, 0x0, 0xB, 0x0, 0x0, 0x9B, 0x0, 0xB, 0x0, 0x8, 0x9B, 0x0, 0xB, 0x0, 0x10, 0x9B, 0x0, 0xB, 0x0, 0x18, 0x9B, 0x0, 0xB, 0x0, 0x20, 0x9B, 0x0, 0xB, 0x0, 0x28, 0x9B, 0x0, 0xB, 0x0, 0x30, 0x9B, 0x0, 0xB, 0x0, 0x38, 0x9B, 0x0, 0xB, 0x0, 0x40, 0x9B, 0x0, 0xB, 0x0, 0x48, 0x9B, 0x0, 0xB, 0x0, 0x50, 0x9B, 0x0, 0xB, 0x0, 0x58, 0x9B, 0x0, 0xB, 0x0, 0x60, 0x9B, 0x0, 0xB, 0x0, 0x68, 0x9B, 0x0, 0xB, 0x0, 0x70, 0x9B, 0x0, 0xB, 0x0, 0x78, 0x9B, 0x0, 0xB, 0x0, 0x80, 0x9B, 0x0, 0xB, 0x0, 0x88, 0x9B, 0x0, 0xB, 0x0, 0x90, 0x9B, 0x0, 0xB, 0x0, 0x98, 0x9B, 0x0, 0xB, 0x0, 0xA0, 0x9B, 0x0, 0xB, 0x0, 0xA8, 0x9B, 0x0, 0xB, 0x0, 0xB0, 0x9B, 0x0, 0xB, 0x0, 0xB8, 0x9B, 0x0, 0xB, 0x0, 0xC0, 0x9B, 0x0, 0xB, 0x0, 0xC8, 0x9B, 0x0, 0xB, 0x0, 0xD0, 0x9B, 0x0, 0xB, 0x0, 0xD8, 0x9B, 0x0, 0xB, 0x0, 0xE0, 0x9B, 0x0, 0xB, 0x0, 0xE8, 0x9B, 0x0, 0xB, 0x0, 0xF0, 0x9B, 0x0, 0xB, 0x0, 0xF8, 0x9B, 0x0, 0xB, 0x0, 0x0, 0x9C, 0x0, 0xB, 0x0, 0x8, 0x9C, 0x0, 0xB, 0x0, 0x10, 0x9C, 0x0, 0xB, 0x0, 0x18, 0x9C, 0x0, 0xB, 0x0, 0x20, 0x9C, 0x0, 0xB, 0x0, 0x28, 0x9C, 0x0, 0xB, 0x0, 0x30, 0x9C, 0x0, 0xB, 0x0, 0x38, 0x9C, 0x0, 0xB, 0x0, 0x40, 0x9C, 0x0, 0xB, 0x0, 0x48, 0x9C, 0x0, 0xB, 0x0, 0x50, 0x9C, 0x0, 0xB, 0x0, 0x58, 0x9C, 0x0, 0xB, 0x0, 0x60, 0x9C, 0x0, 0xB, 0x0, 0x68, 0x9C, 0x0, 0xB, 0x0, 0x70, 0x9C, 0x0, 0xB, 0x0, 0x78, 0x9C, 0x0, 0xB, 0x0, 0x80, 0x9C, 0x0, 0xB, 0x0, 0x88, 0x9C, 0x0, 0xB, 0x0, 0x90, 0x9C, 0x0, 0xB, 0x0, 0x98, 0x9C, 0x0, 0xB, 0x0, 0xA0, 0x9C, 0x0, 0xB, 0x0, 0xA8, 0x9C, 0x0, 0xB, 0x0, 0xB0, 0x9C, 0x0, 0xB, 0x0, 0xB8, 0x9C, 0x0, 0xB, 0x0, 0xC0, 0x9C, 0x0, 0xB, 0x0, 0xC8, 0x9C, 0x0, 0xB, 0x0, 0xD0, 0x9C, 0x0, 0xB, 0x0, 0xD8, 0x9C, 0x0, 0xB, 0x0, 0xE0, 0x9C, 0x0, 0xB, 0x0, 0xE8, 0x9C, 0x0, 0xB, 0x0, 0xF0, 0x9C, 0x0, 0xB, 0x0, 0xF8, 0x9C, 0x0, 0xB, 0x0, 0x0, 0x9D, 0x0, 0xB, 0x0, 0x8, 0x9D, 0x0, 0xB, 0x0, 0x10, 0x9D, 0x0, 0xB, 0x0, 0x18, 0x9D, 0x0, 0xB, 0x0, 0x20, 0x9D, 0x0, 0xB, 0x0, 0x28, 0x9D, 0x0, 0xB, 0x0, 0x30, 0x9D, 0x0, 0xB, 0x0, 0x38, 0x9D, 0x0, 0xB, 0x0, 0x40, 0x9D, 0x0, 0xB, 0x0, 0x48, 0x9D, 0x0, 0xB, 0x0, 0x50, 0x9D, 0x0, 0xB, 0x0, 0x58, 0x9D, 0x0, 0xB, 0x0, 0x60, 0x9D, 0x0, 0xB, 0x0, 0x68, 0x9D, 0x0, 0xB, 0x0, 0x70, 0x9D, 0x0, 0xB, 0x0, 0x78, 0x9D, 0x0, 0xB, 0x0, 0x80, 0x9D, 0x0, 0xB, 0x0, 0x88, 0x9D, 0x0, 0xB, 0x0, 0x90, 0x9D, 0x0, 0xB, 0x0, 0x98, 0x9D, 0x0, 0xB, 0x0, 0xA0, 0x9D, 0x0, 0xB, 0x0, 0xA8, 0x9D, 0x0, 0xB, 0x0, 0xB0, 0x9D, 0x0, 0xB, 0x0, 0xB8, 0x9D, 0x0, 0xB, 0x0, 0xC0, 0x9D, 0x0, 0xB, 0x0, 0xC8, 0x9D, 0x0, 0xB, 0x0, 0xD0, 0x9D, 0x0, 0xB, 0x0, 0xD8, 0x9D, 0x0, 0xB, 0x0, 0xE0, 0x9D, 0x0, 0xB, 0x0, 0xE8, 0x9D, 0x0, 0xB, 0x0, 0xF0, 0x9D, 0x0, 0xB, 0x0, 0xF8, 0x9D, 0x0, 0xB, 0x0, 0x0, 0x9E, 0x0, 0xB, 0x0, 0x8, 0x9E, 0x0, 0xB, 0x0, 0x10, 0x9E, 0x0, 0xB, 0x0, 0x18, 0x9E, 0x0, 0xB, 0x0, 0x20, 0x9E, 0x0, 0xB, 0x0, 0x28, 0x9E, 0x0, 0xB, 0x0, 0x30, 0x9E, 0x0, 0xB, 0x0, 0x38, 0x9E, 0x0, 0xB, 0x0, 0x40, 0x9E, 0x0, 0xB, 0x0, 0x48, 0x9E, 0x0, 0xB, 0x0, 0x50, 0x9E, 0x0, 0xB, 0x0, 0x58, 0x9E, 0x0, 0xB, 0x0, 0x60, 0x9E, 0x0, 0xB, 0x0, 0x68, 0x9E, 0x0, 0xB, 0x0, 0x70, 0x9E, 0x0, 0xB, 0x0, 0x78, 0x9E, 0x0, 0xB, 0x0, 0x80, 0x9E, 0x0, 0x2C, 0x7A, 0x2, 0x0, 0x0, 0x4C, 0x7A, 0x2, 0x0, 0x0, 0x6C, 0x7A, 0x2, 0x0, 0x0, 0x8C, 0x7A, 0x2, 0x0, 0x0, 0xAC, 0x7A, 0x2, 0x0, 0x0, 0xCC, 0x7A, 0x2, 0x0, 0x0, 0xEC, 0x7A, 0x2, 0x0, 0x0, 0xC, 0x7B, 0x2, 0x0, 0x0, 0x2C, 0x7B, 0x2, 0x0, 0x0, 0x4C, 0x7B, 0x2, 0x0, 0x0, 0x6C, 0x7B, 0x2, 0x0, 0x0, 0x8C, 0x7B, 0x2, 0x0, 0x0, 0xAC, 0x7B, 0x2, 0x0, 0x0, 0xCC, 0x7B, 0x2, 0x0, 0x0, 0xEC, 0x7B, 0x2, 0x0, 0x0, 0xC, 0x7C, 0x2, 0x0, 0x0, 0x2C, 0x7C, 0x2, 0x0, 0x0, 0x4C, 0x7C, 0x2, 0x0, 0x0, 0x6C, 0x7C, 0x2, 0x0, 0x0, 0x8C, 0x7C, 0x2, 0x0, 0x0, 0xAC, 0x7C, 0x2, 0x0, 0x0, 0xCC, 0x7C, 0x2, 0x0, 0x0, 0xEC, 0x7C, 0x2, 0x0, 0x0, 0xC, 0x7D, 0x2, 0x0, 0x0, 0x2C, 0x7D, 0x2, 0x0, 0x0, 0x4C, 0x7D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0x9F, 0x0, 0x8C, 0x7D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0x9F, 0x0, 0xCC, 0x7D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0x9F, 0x0, 0xC, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0x9F, 0x0, 0x4C, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0x9F, 0x0, 0x8C, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0x9F, 0x0, 0xCC, 0x7E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0x9F, 0x0, 0xC, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0x9F, 0x0, 0x4C, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0x9F, 0x0, 0x8C, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0x9F, 0x0, 0xCC, 0x7F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0x9F, 0x0, 0xC, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA0, 0x0, 0x4C, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA0, 0x0, 0x8C, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA0, 0x0, 0xCC, 0x80, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA0, 0x0, 0xC, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA0, 0x0, 0x4C, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA0, 0x0, 0x8C, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA0, 0x0, 0xCC, 0x81, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA0, 0x0, 0xC, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA0, 0x0, 0x4C, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA0, 0x0, 0x8C, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA0, 0x0, 0xCC, 0x82, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA0, 0x0, 0xC, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA0, 0x0, 0x4C, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA0, 0x0, 0x8C, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA0, 0x0, 0xCC, 0x83, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA0, 0x0, 0xC, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA1, 0x0, 0x4C, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA1, 0x0, 0x8C, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA1, 0x0, 0xCC, 0x84, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA1, 0x0, 0xC, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA1, 0x0, 0x4C, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA1, 0x0, 0x8C, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA1, 0x0, 0xCC, 0x85, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA1, 0x0, 0xC, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA1, 0x0, 0x4C, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA1, 0x0, 0x8C, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA1, 0x0, 0xCC, 0x86, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA1, 0x0, 0xC, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA1, 0x0, 0x4C, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA1, 0x0, 0x8C, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA1, 0x0, 0xCC, 0x87, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA1, 0x0, 0xC, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA2, 0x0, 0x4C, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA2, 0x0, 0x8C, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA2, 0x0, 0xCC, 0x88, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA2, 0x0, 0xC, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA2, 0x0, 0x4C, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA2, 0x0, 0x8C, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA2, 0x0, 0xCC, 0x89, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA2, 0x0, 0xC, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA2, 0x0, 0x4C, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA2, 0x0, 0x8C, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA2, 0x0, 0xCC, 0x8A, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA2, 0x0, 0xC, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA2, 0x0, 0x4C, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA2, 0x0, 0x8C, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA2, 0x0, 0xCC, 0x8B, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA2, 0x0, 0xC, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA3, 0x0, 0x4C, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA3, 0x0, 0x8C, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA3, 0x0, 0xCC, 0x8C, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA3, 0x0, 0xC, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA3, 0x0, 0x4C, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA3, 0x0, 0x8C, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x68, 0xA3, 0x0, 0xCC, 0x8D, 0x2, 0x0, 0x0, 0xC, 0x0, 0x78, 0xA3, 0x0, 0xC, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA3, 0x0, 0x4C, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0x98, 0xA3, 0x0, 0x8C, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA8, 0xA3, 0x0, 0xCC, 0x8E, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB8, 0xA3, 0x0, 0xC, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC8, 0xA3, 0x0, 0x4C, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD8, 0xA3, 0x0, 0x8C, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE8, 0xA3, 0x0, 0xCC, 0x8F, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF8, 0xA3, 0x0, 0xC, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA4, 0x0, 0x4C, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x18, 0xA4, 0x0, 0x8C, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x28, 0xA4, 0x0, 0xCC, 0x90, 0x2, 0x0, 0x0, 0xC, 0x0, 0x38, 0xA4, 0x0, 0xC, 0x91, 0x2, 0x0, 0x0, 0xC, 0x0, 0x48, 0xA4, 0x0, 0x4C, 0x91, 0x2, 0x0, 0x0, 0xC, 0x0, 0x58, 0xA4, 0x0, 0xC, 0x0, 0x60, 0xA4, 0x0, 0xC, 0x0, 0x68, 0xA4, 0x0, 0xC, 0x0, 0x70, 0xA4, 0x0, 0xC, 0x0, 0x78, 0xA4, 0x0, 0xC, 0x92, 0x2, 0x0, 0x0, 0xC, 0x0, 0x88, 0xA4, 0x0, 0xC, 0x0, 0x90, 0xA4, 0x0, 0xC, 0x0, 0x98, 0xA4, 0x0, 0xC, 0x0, 0xA0, 0xA4, 0x0, 0xC, 0x0, 0xA8, 0xA4, 0x0, 0xC, 0x0, 0xB0, 0xA4, 0x0, 0xC, 0x0, 0xB8, 0xA4, 0x0, 0xC, 0x0, 0xC0, 0xA4, 0x0, 0xC, 0x0, 0xC8, 0xA4, 0x0, 0xC, 0x0, 0xD0, 0xA4, 0x0, 0xC, 0x0, 0xD8, 0xA4, 0x0, 0xC, 0x0, 0xE0, 0xA4, 0x0, 0xC, 0x0, 0xE8, 0xA4, 0x0, 0xC, 0x0, 0xF0, 0xA4, 0x0, 0xC, 0x0, 0xF8, 0xA4, 0x0, 0xC, 0x0, 0x0, 0xA5, 0x0, 0xC, 0x0, 0x8, 0xA5, 0x0, 0xC, 0x0, 0x10, 0xA5, 0x0, 0xC, 0x0, 0x18, 0xA5, 0x0, 0xC, 0x0, 0x20, 0xA5, 0x0, 0xC, 0x0, 0x28, 0xA5, 0x0, 0xC, 0x0, 0x30, 0xA5, 0x0, 0xC, 0x0, 0x38, 0xA5, 0x0, 0xC, 0x0, 0x40, 0xA5, 0x0, 0xC, 0x0, 0x48, 0xA5, 0x0, 0xC, 0x0, 0x50, 0xA5, 0x0, 0xC, 0x0, 0x58, 0xA5, 0x0, 0xC, 0x0, 0x60, 0xA5, 0x0, 0xC, 0x0, 0x68, 0xA5, 0x0, 0xC, 0x0, 0x70, 0xA5, 0x0, 0xC, 0x0, 0x78, 0xA5, 0x0, 0xC, 0x0, 0x80, 0xA5, 0x0, 0xC, 0x0, 0x88, 0xA5, 0x0, 0xC, 0x0, 0x90, 0xA5, 0x0, 0xC, 0x0, 0x98, 0xA5, 0x0, 0xC, 0x0, 0xA0, 0xA5, 0x0, 0xC, 0x0, 0xA8, 0xA5, 0x0, 0xC, 0x0, 0xB0, 0xA5, 0x0, 0xC, 0x0, 0xB8, 0xA5, 0x0, 0xC, 0x0, 0xC0, 0xA5, 0x0, 0xC, 0x0, 0xC8, 0xA5, 0x0, 0xC, 0x0, 0xD0, 0xA5, 0x0, 0xC, 0x0, 0xD8, 0xA5, 0x0, 0xC, 0x0, 0xE0, 0xA5, 0x0, 0xC, 0x0, 0xE8, 0xA5, 0x0, 0xC, 0x0, 0xF0, 0xA5, 0x0, 0xC, 0x0, 0xF8, 0xA5, 0x0, 0xC, 0x98, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xA6, 0x0, 0xC, 0x0, 0x10, 0xA6, 0x0, 0xC, 0x0, 0x18, 0xA6, 0x0, 0xC, 0x0, 0x20, 0xA6, 0x0, 0xC, 0x0, 0x28, 0xA6, 0x0, 0xC, 0x0, 0x30, 0xA6, 0x0, 0xC, 0x0, 0x38, 0xA6, 0x0, 0xC, 0x0, 0x40, 0xA6, 0x0, 0xC, 0x0, 0x48, 0xA6, 0x0, 0xC, 0x0, 0x50, 0xA6, 0x0, 0xC, 0x0, 0x58, 0xA6, 0x0, 0xC, 0x0, 0x60, 0xA6, 0x0, 0xC, 0x0, 0x68, 0xA6, 0x0, 0xC, 0x0, 0x70, 0xA6, 0x0, 0xC, 0x0, 0x78, 0xA6, 0x0, 0xC, 0x0, 0x80, 0xA6, 0x0, 0xC, 0x0, 0x88, 0xA6, 0x0, 0xC, 0x0, 0x90, 0xA6, 0x0, 0xC, 0x0, 0x98, 0xA6, 0x0, 0xC, 0x0, 0xA0, 0xA6, 0x0, 0xC, 0x0, 0xA8, 0xA6, 0x0, 0xC, 0x0, 0xB0, 0xA6, 0x0, 0xC, 0x0, 0xB8, 0xA6, 0x0, 0xC, 0x0, 0xC0, 0xA6, 0x0, 0xC, 0x0, 0xC8, 0xA6, 0x0, 0xC, 0x0, 0xD0, 0xA6, 0x0, 0xC, 0x0, 0xD8, 0xA6, 0x0, 0xC, 0x0, 0xE0, 0xA6, 0x0, 0xC, 0x0, 0xE8, 0xA6, 0x0, 0xC, 0x0, 0xF0, 0xA6, 0x0, 0xC, 0x0, 0xF8, 0xA6, 0x0, 0xC, 0x0, 0x0, 0xA7, 0x0, 0xC, 0x0, 0x8, 0xA7, 0x0, 0xC, 0x0, 0x10, 0xA7, 0x0, 0xC, 0x0, 0x18, 0xA7, 0x0, 0xC, 0x0, 0x20, 0xA7, 0x0, 0xC, 0x0, 0x28, 0xA7, 0x0, 0xC, 0x0, 0x30, 0xA7, 0x0, 0xC, 0x0, 0x38, 0xA7, 0x0, 0xC, 0x0, 0x40, 0xA7, 0x0, 0xC, 0x0, 0x48, 0xA7, 0x0, 0xC, 0x0, 0x50, 0xA7, 0x0, 0xC, 0x0, 0x58, 0xA7, 0x0, 0xC, 0x0, 0x60, 0xA7, 0x0, 0xC, 0x0, 0x68, 0xA7, 0x0, 0xC, 0x0, 0x70, 0xA7, 0x0, 0xC, 0x0, 0x78, 0xA7, 0x0, 0xC, 0x0, 0x80, 0xA7, 0x0, 0xC, 0x0, 0x88, 0xA7, 0x0, 0xC, 0x0, 0x90, 0xA7, 0x0, 0xC, 0x0, 0x98, 0xA7, 0x0, 0xC, 0x0, 0xA0, 0xA7, 0x0, 0xC, 0x0, 0xA8, 0xA7, 0x0, 0xC, 0x0, 0xB0, 0xA7, 0x0, 0xC, 0x0, 0xB8, 0xA7, 0x0, 0xC, 0x0, 0xC0, 0xA7, 0x0, 0xC, 0x0, 0xC8, 0xA7, 0x0, 0xC, 0x0, 0xD0, 0xA7, 0x0, 0xC, 0x0, 0xD8, 0xA7, 0x0, 0xC, 0x0, 0xE0, 0xA7, 0x0, 0xC, 0x0, 0xE8, 0xA7, 0x0, 0xC, 0x0, 0xF0, 0xA7, 0x0, 0xC, 0x0, 0xF8, 0xA7, 0x0, 0xC, 0x0, 0x0, 0xA8, 0x0, 0xC, 0x0, 0x8, 0xA8, 0x0, 0xC, 0x0, 0x10, 0xA8, 0x0, 0xC, 0x0, 0x18, 0xA8, 0x0, 0xC, 0x0, 0x20, 0xA8, 0x0, 0xC, 0x0, 0x28, 0xA8, 0x0, 0xC, 0x0, 0x30, 0xA8, 0x0, 0xC, 0x0, 0x38, 0xA8, 0x0, 0xC, 0x0, 0x40, 0xA8, 0x0, 0xC, 0x0, 0x48, 0xA8, 0x0, 0xC, 0x0, 0x50, 0xA8, 0x0, 0xC, 0x0, 0x58, 0xA8, 0x0, 0xC, 0x0, 0x60, 0xA8, 0x0, 0xC, 0x0, 0x68, 0xA8, 0x0, 0xC, 0x0, 0x70, 0xA8, 0x0, 0xEC, 0xA1, 0x2, 0x0, 0x0, 0xC, 0x0, 0x80, 0xA8, 0x0, 0x2C, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0x90, 0xA8, 0x0, 0x6C, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA0, 0xA8, 0x0, 0xAC, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB0, 0xA8, 0x0, 0xEC, 0xA2, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC0, 0xA8, 0x0, 0x2C, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD0, 0xA8, 0x0, 0x6C, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE0, 0xA8, 0x0, 0xAC, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF0, 0xA8, 0x0, 0xEC, 0xA3, 0x2, 0x0, 0x0, 0xC, 0x0, 0x0, 0xA9, 0x0, 0x2C, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x10, 0xA9, 0x0, 0x6C, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x20, 0xA9, 0x0, 0xAC, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x30, 0xA9, 0x0, 0xEC, 0xA4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x40, 0xA9, 0x0, 0x2C, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x50, 0xA9, 0x0, 0x6C, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x60, 0xA9, 0x0, 0xAC, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x70, 0xA9, 0x0, 0xEC, 0xA5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x80, 0xA9, 0x0, 0x2C, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0x90, 0xA9, 0x0, 0x6C, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA0, 0xA9, 0x0, 0xAC, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB0, 0xA9, 0x0, 0xEC, 0xA6, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC0, 0xA9, 0x0, 0x2C, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD0, 0xA9, 0x0, 0x6C, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE0, 0xA9, 0x0, 0xAC, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF0, 0xA9, 0x0, 0xEC, 0xA7, 0x2, 0x0, 0x0, 0xC, 0x0, 0x0, 0xAA, 0x0, 0x2C, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x10, 0xAA, 0x0, 0x6C, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x20, 0xAA, 0x0, 0xAC, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x30, 0xAA, 0x0, 0xEC, 0xA8, 0x2, 0x0, 0x0, 0xC, 0x0, 0x40, 0xAA, 0x0, 0x2C, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x50, 0xAA, 0x0, 0x6C, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x60, 0xAA, 0x0, 0xAC, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x70, 0xAA, 0x0, 0xEC, 0xA9, 0x2, 0x0, 0x0, 0xC, 0x0, 0x80, 0xAA, 0x0, 0x2C, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0x90, 0xAA, 0x0, 0x6C, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0xA0, 0xAA, 0x0, 0xAC, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0xB0, 0xAA, 0x0, 0xEC, 0xAA, 0x2, 0x0, 0x0, 0xC, 0x0, 0xC0, 0xAA, 0x0, 0x2C, 0xAB, 0x2, 0x0, 0x0, 0xC, 0x0, 0xD0, 0xAA, 0x0, 0x6C, 0xAB, 0x2, 0x0, 0x0, 0xC, 0x0, 0xE0, 0xAA, 0x0, 0xAC, 0xAB, 0x2, 0x0, 0x0, 0xC, 0x0, 0xF0, 0xAA, 0x0, 0xC, 0x0, 0xF8, 0xAA, 0x0, 0xC, 0x0, 0x0, 0xAB, 0x0, 0xC, 0x0, 0x8, 0xAB, 0x0, 0xC, 0x0, 0x10, 0xAB, 0x0, 0xC, 0x0, 0x18, 0xAB, 0x0, 0xC, 0x0, 0x20, 0xAB, 0x0, 0xC, 0x0, 0x28, 0xAB, 0x0, 0xC, 0x0, 0x30, 0xAB, 0x0, 0xC, 0x0, 0x38, 0xAB, 0x0, 0xC, 0x0, 0x40, 0xAB, 0x0, 0xC, 0x0, 0x48, 0xAB, 0x0, 0xC, 0x0, 0x50, 0xAB, 0x0, 0xC, 0x0, 0x58, 0xAB, 0x0, 0xC, 0x0, 0x60, 0xAB, 0x0, 0xC, 0x0, 0x68, 0xAB, 0x0, 0xC, 0x0, 0x70, 0xAB, 0x0, 0xC, 0x0, 0x78, 0xAB, 0x0, 0xC, 0x0, 0x80, 0xAB, 0x0, 0xC, 0x0, 0x88, 0xAB, 0x0, 0xC, 0x0, 0x90, 0xAB, 0x0, 0xC, 0x0, 0x98, 0xAB, 0x0, 0xC, 0x0, 0xA0, 0xAB, 0x0, 0xC, 0x0, 0xA8, 0xAB, 0x0, 0xC, 0x0, 0xB0, 0xAB, 0x0, 0xC, 0x0, 0xB8, 0xAB, 0x0, 0xC, 0x0, 0xC0, 0xAB, 0x0, 0xC, 0x0, 0xC8, 0xAB, 0x0, 0xC, 0x0, 0xD0, 0xAB, 0x0, 0xC, 0x0, 0xD8, 0xAB, 0x0, 0xC, 0x0, 0xE0, 0xAB, 0x0, 0xC, 0x0, 0xE8, 0xAB, 0x0, 0xC, 0x0, 0xF0, 0xAB, 0x0, 0xC, 0x0, 0xF8, 0xAB, 0x0, 0xC, 0x0, 0x0, 0xAC, 0x0, 0xC, 0x0, 0x8, 0xAC, 0x0, 0xC, 0x0, 0x10, 0xAC, 0x0, 0xC, 0x0, 0x18, 0xAC, 0x0, 0xC, 0x0, 0x20, 0xAC, 0x0, 0xC, 0x0, 0x28, 0xAC, 0x0, 0xC, 0x0, 0x30, 0xAC, 0x0, 0xC, 0x0, 0x38, 0xAC, 0x0, 0xC, 0x0, 0x40, 0xAC, 0x0, 0xC, 0x0, 0x48, 0xAC, 0x0, 0xC, 0x0, 0x50, 0xAC, 0x0, 0xC, 0x0, 0x58, 0xAC, 0x0, 0xC, 0x0, 0x60, 0xAC, 0x0, 0xC, 0x0, 0x68, 0xAC, 0x0, 0xC, 0x0, 0x70, 0xAC, 0x0, 0xC, 0x0, 0x78, 0xAC, 0x0, 0xC, 0x0, 0x80, 0xAC, 0x0, 0xC, 0x0, 0x88, 0xAC, 0x0, 0xC, 0x0, 0x90, 0xAC, 0x0, 0xC, 0x0, 0x98, 0xAC, 0x0, 0xC, 0x0, 0xA0, 0xAC, 0x0, 0xC, 0x0, 0xA8, 0xAC, 0x0, 0xC, 0x0, 0xB0, 0xAC, 0x0, 0xC, 0x0, 0xB8, 0xAC, 0x0, 0xC, 0x0, 0xC0, 0xAC, 0x0, 0xC, 0x0, 0xC8, 0xAC, 0x0, 0xC, 0x0, 0xD0, 0xAC, 0x0, 0xC, 0x0, 0xD8, 0xAC, 0x0, 0xC, 0x0, 0xE0, 0xAC, 0x0, 0xC, 0x0, 0xE8, 0xAC, 0x0, 0xC, 0x0, 0xF0, 0xAC, 0x0, 0xC, 0x0, 0xF8, 0xAC, 0x0, 0xC, 0x0, 0x0, 0xAD, 0x0, 0xC, 0x0, 0x8, 0xAD, 0x0, 0xC, 0x0, 0x10, 0xAD, 0x0, 0xC, 0x0, 0x18, 0xAD, 0x0, 0xC, 0x0, 0x20, 0xAD, 0x0, 0xC, 0x0, 0x28, 0xAD, 0x0, 0xC, 0x0, 0x30, 0xAD, 0x0, 0xC, 0x0, 0x38, 0xAD, 0x0, 0xC, 0x0, 0x40, 0xAD, 0x0, 0xC, 0x0, 0x48, 0xAD, 0x0, 0xC, 0x0, 0x50, 0xAD, 0x0, 0x6C, 0xB5, 0x2, 0x0, 0x0, 0xC, 0x0, 0x60, 0xAD, 0x0, 0xC, 0x0, 0x68, 0xAD, 0x0, 0xC, 0x0, 0x70, 0xAD, 0x0, 0xC, 0x0, 0x78, 0xAD, 0x0, 0xC, 0x0, 0x80, 0xAD, 0x0, 0xC, 0x0, 0x88, 0xAD, 0x0, 0xC, 0x0, 0x90, 0xAD, 0x0, 0xC, 0x0, 0x98, 0xAD, 0x0, 0xC, 0x0, 0xA0, 0xAD, 0x0, 0xC, 0x0, 0xA8, 0xAD, 0x0, 0xC, 0x0, 0xB0, 0xAD, 0x0, 0xC, 0x0, 0xB8, 0xAD, 0x0, 0xC, 0x0, 0xC0, 0xAD, 0x0, 0xC, 0x0, 0xC8, 0xAD, 0x0, 0xC, 0x0, 0xD0, 0xAD, 0x0, 0xC, 0x0, 0xD8, 0xAD, 0x0, 0xC, 0x0, 0xE0, 0xAD, 0x0, 0xC, 0x0, 0xE8, 0xAD, 0x0, 0xC, 0x0, 0xF0, 0xAD, 0x0, 0xC, 0x0, 0xF8, 0xAD, 0x0, 0xC, 0x0, 0x0, 0xAE, 0x0, 0xC, 0x0, 0x8, 0xAE, 0x0, 0xC, 0x0, 0x10, 0xAE, 0x0, 0xC, 0x0, 0x18, 0xAE, 0x0, 0xC, 0x0, 0x20, 0xAE, 0x0, 0xC, 0x0, 0x28, 0xAE, 0x0, 0xC, 0x0, 0x30, 0xAE, 0x0, 0xC, 0x0, 0x38, 0xAE, 0x0, 0xC, 0x0, 0x40, 0xAE, 0x0, 0xC, 0x0, 0x48, 0xAE, 0x0, 0xC, 0x0, 0x50, 0xAE, 0x0, 0xC, 0x0, 0x58, 0xAE, 0x0, 0xC, 0x0, 0x60, 0xAE, 0x0, 0xC, 0x0, 0x68, 0xAE, 0x0, 0xC, 0x0, 0x70, 0xAE, 0x0, 0xC, 0x0, 0x78, 0xAE, 0x0, 0xC, 0x0, 0x80, 0xAE, 0x0, 0xC, 0x0, 0x88, 0xAE, 0x0, 0xC, 0x0, 0x90, 0xAE, 0x0, 0xC, 0x0, 0x98, 0xAE, 0x0, 0xC, 0x0, 0xA0, 0xAE, 0x0, 0xC, 0x0, 0xA8, 0xAE, 0x0, 0xC, 0x0, 0xB0, 0xAE, 0x0, 0xC, 0x0, 0xB8, 0xAE, 0x0, 0xC, 0x0, 0xC0, 0xAE, 0x0, 0xC, 0x0, 0xC8, 0xAE, 0x0, 0xC, 0x0, 0xD0, 0xAE, 0x0, 0xC, 0x0, 0xD8, 0xAE, 0x0, 0xC, 0x0, 0xE0, 0xAE, 0x0, 0xC, 0x0, 0xE8, 0xAE, 0x0, 0xC, 0x0, 0xF0, 0xAE, 0x0, 0xC, 0x0, 0xF8, 0xAE, 0x0, 0xC, 0x0, 0x0, 0xAF, 0x0, 0xC, 0x0, 0x8, 0xAF, 0x0, 0xC, 0x0, 0x10, 0xAF, 0x0, 0xC, 0x0, 0x18, 0xAF, 0x0, 0xC, 0x0, 0x20, 0xAF, 0x0, 0xC, 0x0, 0x28, 0xAF, 0x0, 0xC, 0x0, 0x30, 0xAF, 0x0, 0xC, 0x0, 0x38, 0xAF, 0x0, 0xC, 0x0, 0x40, 0xAF, 0x0, 0xC, 0x0, 0x48, 0xAF, 0x0, 0xC, 0x0, 0x50, 0xAF, 0x0, 0xC, 0x0, 0x58, 0xAF, 0x0, 0xC, 0x0, 0x60, 0xAF, 0x0, 0xC, 0x0, 0x68, 0xAF, 0x0, 0xC, 0x0, 0x70, 0xAF, 0x0, 0xC, 0x0, 0x78, 0xAF, 0x0, 0xC, 0x0, 0x80, 0xAF, 0x0, 0xC, 0x0, 0x88, 0xAF, 0x0, 0xC, 0x0, 0x90, 0xAF, 0x0, 0xC, 0x0, 0x98, 0xAF, 0x0, 0xC, 0x0, 0xA0, 0xAF, 0x0, 0xC, 0x0, 0xA8, 0xAF, 0x0, 0xC, 0x0, 0xB0, 0xAF, 0x0, 0xC, 0x0, 0xB8, 0xAF, 0x0, 0xC, 0x0, 0xC0, 0xAF, 0x0, 0xC, 0x0, 0xC8, 0xAF, 0x0, 0xC, 0x0, 0xD0, 0xAF, 0x0, 0xC, 0x0, 0xD8, 0xAF, 0x0, 0xC, 0x0, 0xE0, 0xAF, 0x0, 0xC, 0x0, 0xE8, 0xAF, 0x0, 0xC, 0x0, 0xF0, 0xAF, 0x0, 0xC, 0x0, 0xF8, 0xAF, 0x0, 0xC, 0x0, 0x0, 0xB0, 0x0, 0xC, 0x0, 0x8, 0xB0, 0x0, 0xC, 0x0, 0x10, 0xB0, 0x0, 0xC, 0x0, 0x18, 0xB0, 0x0, 0xC, 0x0, 0x20, 0xB0, 0x0, 0xC, 0x0, 0x28, 0xB0, 0x0, 0xC, 0x0, 0x30, 0xB0, 0x0, 0xC, 0x0, 0x38, 0xB0, 0x0, 0xC, 0x0, 0x40, 0xB0, 0x0, 0xC, 0x0, 0x48, 0xB0, 0x0, 0xC, 0x0, 0x50, 0xB0, 0x0, 0xC, 0x0, 0x58, 0xB0, 0x0, 0xC, 0x0, 0x60, 0xB0, 0x0, 0xC, 0x0, 0x68, 0xB0, 0x0, 0xC, 0x0, 0x70, 0xB0, 0x0, 0xC, 0x0, 0x78, 0xB0, 0x0, 0xC, 0xC2, 0x2, 0x0, 0x0, 0x2C, 0xC2, 0x2, 0x0, 0x0, 0x4C, 0xC2, 0x2, 0x0, 0x0, 0x6C, 0xC2, 0x2, 0x0, 0x0, 0x8C, 0xC2, 0x2, 0x0, 0x0, 0xAC, 0xC2, 0x2, 0x0, 0x0, 0xCC, 0xC2, 0x2, 0x0, 0x0, 0xEC, 0xC2, 0x2, 0x0, 0x0, 0xC, 0xC3, 0x2, 0x0, 0x0, 0x2C, 0xC3, 0x2, 0x0, 0x0, 0x4C, 0xC3, 0x2, 0x0, 0x0, 0x6C, 0xC3, 0x2, 0x0, 0x0, 0x8C, 0xC3, 0x2, 0x0, 0x0, 0xAC, 0xC3, 0x2, 0x0, 0x0, 0xCC, 0xC3, 0x2, 0x0, 0x0, 0xEC, 0xC3, 0x2, 0x0, 0x0, 0xC, 0xC4, 0x2, 0x0, 0x0, 0x2C, 0xC4, 0x2, 0x0, 0x0, 0x4C, 0xC4, 0x2, 0x0, 0x0, 0x6C, 0xC4, 0x2, 0x0, 0x0, 0x8C, 0xC4, 0x2, 0x0, 0x0, 0xAC, 0xC4, 0x2, 0x0, 0x0, 0xCC, 0xC4, 0x2, 0x0, 0x0, 0xEC, 0xC4, 0x2, 0x0, 0x0, 0xC, 0xC5, 0x2, 0x0, 0x0, 0x2C, 0xC5, 0x2, 0x0, 0x0, 0x4C, 0xC5, 0x2, 0x0, 0x0, 0x6C, 0xC5, 0x2, 0x0, 0x0, 0x8C, 0xC5, 0x2, 0x0, 0x0, 0xAC, 0xC5, 0x2, 0x0, 0x0, 0xCC, 0xC5, 0x2, 0x0, 0x0, 0xEC, 0xC5, 0x2, 0x0, 0x0, 0xC, 0xC6, 0x2, 0x0, 0x0, 0x2C, 0xC6, 0x2, 0x0, 0x0, 0x4C, 0xC6, 0x2, 0x0, 0x0, 0x6C, 0xC6, 0x2, 0x0, 0x0, 0x8C, 0xC6, 0x2, 0x0, 0x0, 0xAC, 0xC6, 0x2, 0x0, 0x0, 0xCC, 0xC6, 0x2, 0x0, 0x0, 0xEC, 0xC6, 0x2, 0x0, 0x0, 0xC, 0xC7, 0x2, 0x0, 0x0, 0x2C, 0xC7, 0x2, 0x0, 0x0, 0x4C, 0xC7, 0x2, 0x0, 0x0, 0x6C, 0xC7, 0x2, 0x0, 0x0, 0x8C, 0xC7, 0x2, 0x0, 0x0, 0xAC, 0xC7, 0x2, 0x0, 0x0, 0xCC, 0xC7, 0x2, 0x0, 0x0, 0xEC, 0xC7, 0x2, 0x0, 0x0, 0xC, 0xC8, 0x2, 0x0, 0x0, 0x2C, 0xC8, 0x2, 0x0, 0x0, 0x4C, 0xC8, 0x2, 0x0, 0x0, 0x6C, 0xC8, 0x2, 0x0, 0x0, 0x8C, 0xC8, 0x2, 0x0, 0x0, 0xAC, 0xC8, 0x2, 0x0, 0x0, 0xCC, 0xC8, 0x2, 0x0, 0x0, 0xEC, 0xC8, 0x2, 0x0, 0x0, 0xC, 0xC9, 0x2, 0x0, 0x0, 0x2C, 0xC9, 0x2, 0x0, 0x0, 0x4C, 0xC9, 0x2, 0x0, 0x0, 0x6C, 0xC9, 0x2, 0x0, 0x0, 0x8C, 0xC9, 0x2, 0x0, 0x0, 0xAC, 0xC9, 0x2, 0x0, 0x0, 0xCC, 0xC9, 0x2, 0x0, 0x0, 0xEC, 0xC9, 0x2, 0x0, 0x0, 0xC, 0xCA, 0x2, 0x0, 0x0, 0x2C, 0xCA, 0x2, 0x0, 0x0, 0x4C, 0xCA, 0x2, 0x0, 0x0, 0x6C, 0xCA, 0x2, 0x0, 0x0, 0x8C, 0xCA, 0x2, 0x0, 0x0, 0xAC, 0xCA, 0x2, 0x0, 0x0, 0xCC, 0xCA, 0x2, 0x0, 0x0, 0xEC, 0xCA, 0x2, 0x0, 0x0, 0xC, 0xCB, 0x2, 0x0, 0x0, 0x2C, 0xCB, 0x2, 0x0, 0x0, 0x4C, 0xCB, 0x2, 0x0, 0x0, 0x6C, 0xCB, 0x2, 0x0, 0x0, 0x8C, 0xCB, 0x2, 0x0, 0x0, 0xAC, 0xCB, 0x2, 0x0, 0x0, 0xCC, 0xCB, 0x2, 0x0, 0x0, 0xEC, 0xCB, 0x2, 0x0, 0x0, 0xC, 0xCC, 0x2, 0x0, 0x0, 0x2C, 0xCC, 0x2, 0x0, 0x0, 0x4C, 0xCC, 0x2, 0x0, 0x0, 0x6C, 0xCC, 0x2, 0x0, 0x0, 0x8C, 0xCC, 0x2, 0x0, 0x0, 0xAC, 0xCC, 0x2, 0x0, 0x0, 0xCC, 0xCC, 0x2, 0x0, 0x0, 0xEC, 0xCC, 0x2, 0x0, 0x0, 0xC, 0xCD, 0x2, 0x0, 0x0, 0x2C, 0xCD, 0x2, 0x0, 0x0, 0x4C, 0xCD, 0x2, 0x0, 0x0, 0x6C, 0xCD, 0x2, 0x0, 0x0, 0x8C, 0xCD, 0x2, 0x0, 0x0, 0xAC, 0xCD, 0x2, 0x0, 0x0, 0xCC, 0xCD, 0x2, 0x0, 0x0, 0xEC, 0xCD, 0x2, 0x0, 0x0, 0xC, 0xCE, 0x2, 0x0, 0x0, 0x2C, 0xCE, 0x2, 0x0, 0x0, 0x4C, 0xCE, 0x2, 0x0, 0x0, 0x6C, 0xCE, 0x2, 0x0, 0x0, 0x8C, 0xCE, 0x2, 0x0, 0x0, 0xAC, 0xCE, 0x2, 0x0, 0x0, 0xCC, 0xCE, 0x2, 0x0, 0x0, 0xEC, 0xCE, 0x2, 0x0, 0x0, 0xC, 0xCF, 0x2, 0x0, 0x0, 0x2C, 0xCF, 0x2, 0x0, 0x0, 0x4C, 0xCF, 0x2, 0x0, 0x0, 0x6C, 0xCF, 0x2, 0x0, 0x0, 0x8C, 0xCF, 0x2, 0x0, 0x0, 0xAC, 0xCF, 0x2, 0x0, 0x0, 0xCC, 0xCF, 0x2, 0x0, 0x0, 0xEC, 0xCF, 0x2, 0x0, 0x0, 0xC, 0xD0, 0x2, 0x0, 0x0, 0x2C, 0xD0, 0x2, 0x0, 0x0, 0x4C, 0xD0, 0x2, 0x0, 0x0, 0x6C, 0xD0, 0x2, 0x0, 0x0, 0x8C, 0xD0, 0x2, 0x0, 0x0, 0xAC, 0xD0, 0x2, 0x0, 0x0, 0xCC, 0xD0, 0x2, 0x0, 0x0, 0xEC, 0xD0, 0x2, 0x0, 0x0, 0xC, 0xD1, 0x2, 0x0, 0x0, 0x2C, 0xD1, 0x2, 0x0, 0x0, 0x4C, 0xD1, 0x2, 0x0, 0x0, 0x6C, 0xD1, 0x2, 0x0, 0x0, 0x8C, 0xD1, 0x2, 0x0, 0x0, 0xAC, 0xD1, 0x2, 0x0, 0x0, 0xCC, 0xD1, 0x2, 0x0, 0x0, 0xEC, 0xD1, 0x2, 0x0, 0x0, 0xC, 0xD2, 0x2, 0x0, 0x0, 0x2C, 0xD2, 0x2, 0x0, 0x0, 0x4C, 0xD2, 0x2, 0x0, 0x0, 0x6C, 0xD2, 0x2, 0x0, 0x0, 0x8C, 0xD2, 0x2, 0x0, 0x0, 0xAC, 0xD2, 0x2, 0x0, 0x0, 0xCC, 0xD2, 0x2, 0x0, 0x0, 0xEC, 0xD2, 0x2, 0x0, 0x0, 0xC, 0xD3, 0x2, 0x0, 0x0, 0x2C, 0xD3, 0x2, 0x0, 0x0, 0x4C, 0xD3, 0x2, 0x0, 0x0, 0x6C, 0xD3, 0x2, 0x0, 0x0, 0x8C, 0xD3, 0x2, 0x0, 0x0, 0xAC, 0xD3, 0x2, 0x0, 0x0, 0xCC, 0xD3, 0x2, 0x0, 0x0, 0xEC, 0xD3, 0x2, 0x0, 0x0, 0xC, 0xD4, 0xA, 0xB5, 0x0, 0x4C, 0xD4, 0x2, 0x0, 0x0, 0x6C, 0xD4, 0x2, 0x0, 0x0, 0x8C, 0xD4, 0x2, 0x0, 0x0, 0xAC, 0xD4, 0x2, 0x0, 0x0, 0xCC, 0xD4, 0x2, 0x0, 0x0, 0xEC, 0xD4, 0x2, 0x0, 0x0, 0xC, 0xD5, 0x2, 0x0, 0x0, 0x2C, 0xD5, 0x2, 0x0, 0x0, 0x4C, 0xD5, 0x2, 0x0, 0x0, 0x6C, 0xD5, 0x2, 0x0, 0x0, 0x8C, 0xD5, 0x2, 0x0, 0x0, 0xAC, 0xD5, 0x2, 0x0, 0x0, 0xCC, 0xD5, 0x2, 0x0, 0x0, 0xEC, 0xD5, 0x2, 0x0, 0x0, 0xC, 0xD6, 0x2, 0x0, 0x0, 0x2C, 0xD6, 0x2, 0x0, 0x0, 0x4C, 0xD6, 0x2, 0x0, 0x0, 0x6C, 0xD6, 0x2, 0x0, 0x0, 0x8C, 0xD6, 0x2, 0x0, 0x0, 0xAC, 0xD6, 0x2, 0x0, 0x0, 0xCC, 0xD6, 0x2, 0x0, 0x0, 0xEC, 0xD6, 0x2, 0x0, 0x0, 0xC, 0xD7, 0x2, 0x0, 0x0, 0x2C, 0xD7, 0x2, 0x0, 0x0, 0x4C, 0xD7, 0x2, 0x0, 0x0, 0x6C, 0xD7, 0x2, 0x0, 0x0, 0x8C, 0xD7, 0x2, 0x0, 0x0, 0xAC, 0xD7, 0x2, 0x0, 0x0, 0xCC, 0xD7, 0x2, 0x0, 0x0, 0xEC, 0xD7, 0x2, 0x0, 0x0, 0xC, 0xD8, 0x2, 0x0, 0x0, 0x2C, 0xD8, 0x2, 0x0, 0x0, 0x4C, 0xD8, 0x2, 0x0, 0x0, 0x6C, 0xD8, 0x2, 0x0, 0x0, 0x8C, 0xD8, 0x2, 0x0, 0x0, 0xAC, 0xD8, 0x2, 0x0, 0x0, 0xCC, 0xD8, 0x2, 0x0, 0x0, 0xEC, 0xD8, 0x2, 0x0, 0x0, 0xC, 0xD9, 0x2, 0x0, 0x0, 0x2C, 0xD9, 0x2, 0x0, 0x0, 0x4C, 0xD9, 0x2, 0x0, 0x0, 0x6C, 0xD9, 0x2, 0x0, 0x0, 0x8C, 0xD9, 0x2, 0x0, 0x0, 0xAC, 0xD9, 0x2, 0x0, 0x0, 0xCC, 0xD9, 0x2, 0x0, 0x0, 0xEC, 0xD9, 0x2, 0x0, 0x0, 0xC, 0xDA, 0x2, 0x0, 0x0, 0x2C, 0xDA, 0x2, 0x0, 0x0, 0x4C, 0xDA, 0x2, 0x0, 0x0, 0x6C, 0xDA, 0x2, 0x0, 0x0, 0x8C, 0xDA, 0x2, 0x0, 0x0, 0xAC, 0xDA, 0x2, 0x0, 0x0, 0xCC, 0xDA, 0x2, 0x0, 0x0, 0xEC, 0xDA, 0x2, 0x0, 0x0, 0xC, 0xDB, 0x2, 0x0, 0x0, 0x2C, 0xDB, 0x2, 0x0, 0x0, 0x4C, 0xDB, 0x2, 0x0, 0x0, 0x6C, 0xDB, 0x2, 0x0, 0x0, 0x8C, 0xDB, 0x2, 0x0, 0x0, 0xAC, 0xDB, 0x2, 0x0, 0x0, 0xCC, 0xDB, 0x2, 0x0, 0x0, 0xEC, 0xDB, 0x2, 0x0, 0x0, 0xC, 0xDC, 0x2, 0x0, 0x0, 0x2C, 0xDC, 0x2, 0x0, 0x0, 0x4C, 0xDC, 0x2, 0x0, 0x0, 0x6C, 0xDC, 0x2, 0x0, 0x0, 0x8C, 0xDC, 0x2, 0x0, 0x0, 0xAC, 0xDC, 0x2, 0x0, 0x0, 0xCC, 0xDC, 0x2, 0x0, 0x0, 0xEC, 0xDC, 0x2, 0x0, 0x0, 0xC, 0xDD, 0x2, 0x0, 0x0, 0x2C, 0xDD, 0x2, 0x0, 0x0, 0x4C, 0xDD, 0x2, 0x0, 0x0, 0x6C, 0xDD, 0x2, 0x0, 0x0, 0x8C, 0xDD, 0x2, 0x0, 0x0, 0xAC, 0xDD, 0x2, 0x0, 0x0, 0xCC, 0xDD, 0x2, 0x0, 0x0, 0xEC, 0xDD, 0x2, 0x0, 0x0, 0xC, 0xDE, 0x2, 0x0, 0x0, 0x2C, 0xDE, 0x2, 0x0, 0x0, 0x4C, 0xDE, 0x2, 0x0, 0x0, 0x6C, 0xDE, 0x2, 0x0, 0x0, 0x8C, 0xDE, 0x2, 0x0, 0x0, 0xAC, 0xDE, 0x2, 0x0, 0x0, 0xCC, 0xDE, 0x2, 0x0, 0x0, 0xEC, 0xDE, 0x2, 0x0, 0x0, 0xC, 0xDF, 0x2, 0x0, 0x0, 0x2C, 0xDF, 0x2, 0x0, 0x0, 0x4C, 0xDF, 0x2, 0x0, 0x0, 0x6C, 0xDF, 0x2, 0x0, 0x0, 0x8C, 0xDF, 0x2, 0x0, 0x0, 0xAC, 0xDF, 0x2, 0x0, 0x0, 0xCC, 0xDF, 0x2, 0x0, 0x0, 0xEC, 0xDF, 0x2, 0x0, 0x0, 0xC, 0xE0, 0x2, 0x0, 0x0, 0x2C, 0xE0, 0x2, 0x0, 0x0, 0x4C, 0xE0, 0x2, 0x0, 0x0, 0x6C, 0xE0, 0x2, 0x0, 0x0, 0x8C, 0xE0, 0x2, 0x0, 0x0, 0xAC, 0xE0, 0x2, 0x0, 0x0, 0xCC, 0xE0, 0x2, 0x0, 0x0, 0xEC, 0xE0, 0x2, 0x0, 0x0, 0xC, 0xE1, 0x2, 0x0, 0x0, 0x2C, 0xE1, 0x2, 0x0, 0x0, 0x4C, 0xE1, 0x2, 0x0, 0x0, 0x6C, 0xE1, 0x2, 0x0, 0x0, 0x8C, 0xE1, 0x2, 0x0, 0x0, 0xAC, 0xE1, 0x2, 0x0, 0x0, 0xCC, 0xE1, 0x2, 0x0, 0x0, 0xEC, 0xE1, 0x2, 0x0, 0x0, 0xC, 0xE2, 0x2, 0x0, 0x0, 0x2C, 0xE2, 0x2, 0x0, 0x0, 0x4C, 0xE2, 0x2, 0x0, 0x0, 0x6C, 0xE2, 0x2, 0x0, 0x0, 0x8C, 0xE2, 0x2, 0x0, 0x0, 0xAC, 0xE2, 0x2, 0x0, 0x0, 0xCC, 0xE2, 0x2, 0x0, 0x0, 0xEC, 0xE2, 0x2, 0x0, 0x0, 0xC, 0xE3, 0x2, 0x0, 0x0, 0x2C, 0xE3, 0x2, 0x0, 0x0, 0x4C, 0xE3, 0x2, 0x0, 0x0, 0x6C, 0xE3, 0x2, 0x0, 0x0, 0x8C, 0xE3, 0x2, 0x0, 0x0, 0xAC, 0xE3, 0x2, 0x0, 0x0, 0xCC, 0xE3, 0x2, 0x0, 0x0, 0xEC, 0xE3, 0x2, 0x0, 0x0, 0xC, 0xE4, 0x2, 0x0, 0x0, 0xC, 0x0, 0x8, 0xB9, 0x0, 0xC, 0x0, 0x10, 0xB9, 0x0, 0xC, 0x0, 0x18, 0xB9, 0x0, 0xC, 0x0, 0x20, 0xB9, 0x0, 0xC, 0x0, 0x28, 0xB9, 0x0, 0xC, 0x0, 0x30, 0xB9, 0x0, 0xC, 0x0, 0x38, 0xB9, 0x0, 0xC, 0x0, 0x40, 0xB9, 0x0, 0xC, 0x0, 0x48, 0xB9, 0x0, 0xC, 0x0, 0x50, 0xB9, 0x0, 0xC, 0x0, 0x58, 0xB9, 0x0, 0xC, 0x0, 0x60, 0xB9, 0x0, 0xC, 0x0, 0x68, 0xB9, 0x0, 0xC, 0x0, 0x70, 0xB9, 0x0, 0xC, 0x0, 0x78, 0xB9, 0x0, 0xC, 0x0, 0x80, 0xB9, 0x0, 0xC, 0x0, 0x88, 0xB9, 0x0, 0xC, 0x0, 0x90, 0xB9, 0x0, 0xC, 0x0, 0x98, 0xB9, 0x0, 0xC, 0x0, 0xA0, 0xB9, 0x0, 0xC, 0x0, 0xA8, 0xB9, 0x0, 0xC, 0x0, 0xB0, 0xB9, 0x0, 0xC, 0x0, 0xB8, 0xB9, 0x0, 0xC, 0x0, 0xC0, 0xB9, 0x0, 0xC, 0x0, 0xC8, 0xB9, 0x0, 0xC, 0x0, 0xD0, 0xB9, 0x0, 0xC, 0x0, 0xD8, 0xB9, 0x0, 0xC, 0x0, 0xE0, 0xB9, 0x0, 0xC, 0x0, 0xE8, 0xB9, 0x0, 0xC, 0x0, 0xF0, 0xB9, 0x0, 0xC, 0x0, 0xF8, 0xB9, 0x0, 0xC, 0x0, 0x0, 0xBA, 0x0, 0xC, 0x0, 0x8, 0xBA, 0x0, 0xC, 0x0, 0x10, 0xBA, 0x0, 0xC, 0x0, 0x18, 0xBA, 0x0, 0xC, 0x0, 0x20, 0xBA, 0x0, 0xC, 0x0, 0x28, 0xBA, 0x0, 0xC, 0x0, 0x30, 0xBA, 0x0, 0xC, 0x0, 0x38, 0xBA, 0x0, 0xC, 0x0, 0x40, 0xBA, 0x0, 0xC, 0x0, 0x48, 0xBA, 0x0, 0xC, 0x0, 0x50, 0xBA, 0x0, 0xC, 0x0, 0x58, 0xBA, 0x0, 0xC, 0x0, 0x60, 0xBA, 0x0, 0xC, 0x0, 0x68, 0xBA, 0x0, 0xC, 0x0, 0x70, 0xBA, 0x0, 0xC, 0x0, 0x78, 0xBA, 0x0, 0xC, 0x0, 0x80, 0xBA, 0x0, 0xC, 0x0, 0x88, 0xBA, 0x0, 0xC, 0x0, 0x90, 0xBA, 0x0, 0xC, 0x0, 0x98, 0xBA, 0x0, 0xC, 0x0, 0xA0, 0xBA, 0x0, 0xC, 0x0, 0xA8, 0xBA, 0x0, 0xC, 0x0, 0xB0, 0xBA, 0x0, 0xC, 0x0, 0xB8, 0xBA, 0x0, 0xC, 0x0, 0xC0, 0xBA, 0x0, 0xC, 0x0, 0xC8, 0xBA, 0x0, 0xC, 0x0, 0xD0, 0xBA, 0x0, 0xC, 0x0, 0xD8, 0xBA, 0x0, 0xC, 0x0, 0xE0, 0xBA, 0x0, 0xC, 0x0, 0xE8, 0xBA, 0x0, 0xC, 0x0, 0xF0, 0xBA, 0x0, 0xC, 0x0, 0xF8, 0xBA, 0x0, 0xC, 0x0, 0x0, 0xBB, 0x0, 0xC, 0x0, 0x8, 0xBB, 0x0, 0xC, 0x0, 0x10, 0xBB, 0x0, 0xC, 0x0, 0x18, 0xBB, 0x0, 0xC, 0x0, 0x20, 0xBB, 0x0, 0xC, 0x0, 0x28, 0xBB, 0x0, 0xC, 0x0, 0x30, 0xBB, 0x0, 0xC, 0x0, 0x38, 0xBB, 0x0, 0xC, 0x0, 0x40, 0xBB, 0x0, 0xC, 0x0, 0x48, 0xBB, 0x0, 0xC, 0x0, 0x50, 0xBB, 0x0, 0xC, 0x0, 0x58, 0xBB, 0x0, 0xC, 0x0, 0x60, 0xBB, 0x0, 0xC, 0x0, 0x68, 0xBB, 0x0, 0xC, 0x0, 0x70, 0xBB, 0x0, 0xC, 0x0, 0x78, 0xBB, 0x0, 0xC, 0x0, 0x80, 0xBB, 0x0, 0xC, 0x0, 0x88, 0xBB, 0x0, 0xC, 0x0, 0x90, 0xBB, 0x0, 0xC, 0x0, 0x98, 0xBB, 0x0, 0xC, 0x0, 0xA0, 0xBB, 0x0, 0xC, 0x0, 0xA8, 0xBB, 0x0, 0xC, 0x0, 0xB0, 0xBB, 0x0, 0xC, 0x0, 0xB8, 0xBB, 0x0, 0xC, 0x0, 0xC0, 0xBB, 0x0, 0xC, 0x0, 0xC8, 0xBB, 0x0, 0xC, 0x0, 0xD0, 0xBB, 0x0, 0xC, 0x0, 0xD8, 0xBB, 0x0, 0xC, 0x0, 0xE0, 0xBB, 0x0, 0xC, 0x0, 0xE8, 0xBB, 0x0, 0xC, 0x0, 0xF0, 0xBB, 0x0, 0xC, 0x0, 0xF8, 0xBB, 0x0, 0xC, 0x0, 0x0, 0xBC, 0x0, 0xC, 0x0, 0x8, 0xBC, 0x0, 0xC, 0x0, 0x10, 0xBC, 0x0, 0xC, 0x0, 0x18, 0xBC, 0x0, 0xC, 0x0, 0x20, 0xBC, 0x0, 0xC, 0x0, 0x28, 0xBC, 0x0, 0xC, 0x0, 0x30, 0xBC, 0x0, 0xC, 0x0, 0x38, 0xBC, 0x0, 0xC, 0x0, 0x40, 0xBC, 0x0, 0xC, 0x0, 0x48, 0xBC, 0x0, 0xC, 0x0, 0x50, 0xBC, 0x0, 0xC, 0x0, 0x58, 0xBC, 0x0, 0xC, 0x0, 0x60, 0xBC, 0x0, 0xC, 0x0, 0x68, 0xBC, 0x0, 0xC, 0x0, 0x70, 0xBC, 0x0, 0xC, 0x0, 0x78, 0xBC, 0x0, 0xC, 0x0, 0x80, 0xBC, 0x0, 0xC, 0x0, 0x88, 0xBC, 0x0, 0xC, 0x0, 0x90, 0xBC, 0x0, 0xC, 0x0, 0x98, 0xBC, 0x0, 0xC, 0x0, 0xA0, 0xBC, 0x0, 0xC, 0x0, 0xA8, 0xBC, 0x0, 0xC, 0x0, 0xB0, 0xBC, 0x0, 0xC, 0x0, 0xB8, 0xBC, 0x0, 0xC, 0x0, 0xC0, 0xBC, 0x0, 0xC, 0x0, 0xC8, 0xBC, 0x0, 0xC, 0x0, 0xD0, 0xBC, 0x0, 0xC, 0x0, 0xD8, 0xBC, 0x0, 0xC, 0x0, 0xE0, 0xBC, 0x0, 0xC, 0x0, 0xE8, 0xBC, 0x0, 0xC, 0x0, 0xF0, 0xBC, 0x0, 0xC, 0x0, 0xF8, 0xBC, 0x0, 0xC, 0x0, 0x0, 0xBD, 0x0, 0xC, 0x0, 0x8, 0xBD, 0x0, 0xC, 0x0, 0x10, 0xBD, 0x0, 0xC, 0x0, 0x18, 0xBD, 0x0, 0xC, 0x0, 0x20, 0xBD, 0x0, 0xC, 0x0, 0x28, 0xBD, 0x0, 0xC, 0x0, 0x30, 0xBD, 0x0, 0xC, 0x0, 0x38, 0xBD, 0x0, 0xC, 0x0, 0x40, 0xBD, 0x0, 0xC, 0x0, 0x48, 0xBD, 0x0, 0xC, 0x0, 0x50, 0xBD, 0x0, 0xC, 0x0, 0x58, 0xBD, 0x0, 0xC, 0x0, 0x60, 0xBD, 0x0, 0xC, 0x0, 0x68, 0xBD, 0x0, 0xC, 0x0, 0x70, 0xBD, 0x0, 0xC, 0x0, 0x78, 0xBD, 0x0, 0xC, 0x0, 0x80, 0xBD, 0x0, 0xC, 0x0, 0x88, 0xBD, 0x0, 0xC, 0x0, 0x90, 0xBD, 0x0, 0xC, 0x0, 0x98, 0xBD, 0x0, 0xC, 0x0, 0xA0, 0xBD, 0x0, 0xC, 0x0, 0xA8, 0xBD, 0x0, 0xC, 0x0, 0xB0, 0xBD, 0x0, 0xC, 0x0, 0xB8, 0xBD, 0x0, 0xC, 0x0, 0xC0, 0xBD, 0x0, 0xC, 0x0, 0xC8, 0xBD, 0x0, 0xC, 0x0, 0xD0, 0xBD, 0x0, 0xC, 0x0, 0xD8, 0xBD, 0x0, 0xC, 0x0, 0xE0, 0xBD, 0x0, 0xC, 0x0, 0xE8, 0xBD, 0x0, 0xC, 0x0, 0xF0, 0xBD, 0x0, 0xC, 0x0, 0xF8, 0xBD, 0x0, 0xC, 0x0, 0x0, 0xBE, 0x0, 0xC, 0x0, 0x8, 0xBE, 0x0, 0xC, 0x0, 0x10, 0xBE, 0x0, 0xC, 0x0, 0x18, 0xBE, 0x0, 0xC, 0x0, 0x20, 0xBE, 0x0, 0xC, 0x0, 0x28, 0xBE, 0x0, 0xC, 0x0, 0x30, 0xBE, 0x0, 0xC, 0x0, 0x38, 0xBE, 0x0, 0xC, 0x0, 0x40, 0xBE, 0x0, 0xC, 0x0, 0x48, 0xBE, 0x0, 0xC, 0x0, 0x50, 0xBE, 0x0, 0xC, 0x0, 0x58, 0xBE, 0x0, 0xC, 0x0, 0x60, 0xBE, 0x0, 0xC, 0x0, 0x68, 0xBE, 0x0, 0xC, 0x0, 0x70, 0xBE, 0x0, 0xC, 0x0, 0x78, 0xBE, 0x0, 0xC, 0x0, 0x80, 0xBE, 0x0, 0xC, 0x0, 0x88, 0xBE, 0x0, 0xC, 0x0, 0x90, 0xBE, 0x0, 0xC, 0x0, 0x98, 0xBE, 0x0, 0xC, 0x0, 0xA0, 0xBE, 0x0, 0xC, 0x0, 0xA8, 0xBE, 0x0, 0xC, 0x0, 0xB0, 0xBE, 0x0, 0xC, 0x0, 0xB8, 0xBE, 0x0, 0xC, 0x0, 0xC0, 0xBE, 0x0, 0xC, 0x0, 0xC8, 0xBE, 0x0, 0xC, 0x0, 0xD0, 0xBE, 0x0, 0xC, 0x0, 0xD8, 0xBE, 0x0, 0xC, 0x0, 0xE0, 0xBE, 0x0, 0xC, 0x0, 0xE8, 0xBE, 0x0, 0xC, 0x0, 0xF0, 0xBE, 0x0, 0xC, 0x0, 0xF8, 0xBE, 0x0, 0xC, 0x0, 0x0, 0xBF, 0x0, 0xC, 0x0, 0x8, 0xBF, 0x0, 0xC, 0x0, 0x10, 0xBF, 0x0, 0xC, 0x0, 0x18, 0xBF, 0x0, 0xC, 0x0, 0x20, 0xBF, 0x0, 0xC, 0x0, 0x28, 0xBF, 0x0, 0xC, 0x0, 0x30, 0xBF, 0x0, 0xC, 0x0, 0x38, 0xBF, 0x0, 0xC, 0x0, 0x40, 0xBF, 0x0, 0xC, 0x0, 0x48, 0xBF, 0x0, 0xC, 0x0, 0x50, 0xBF, 0x0, 0xC, 0x0, 0x58, 0xBF, 0x0, 0xC, 0x0, 0x60, 0xBF, 0x0, 0xC, 0x0, 0x68, 0xBF, 0x0, 0xC, 0x0, 0x70, 0xBF, 0x0, 0xC, 0x0, 0x78, 0xBF, 0x0, 0xC, 0x0, 0x80, 0xBF, 0x0, 0xC, 0x0, 0x88, 0xBF, 0x0, 0xC, 0x0, 0x90, 0xBF, 0x0, 0xC, 0x0, 0x98, 0xBF, 0x0, 0xC, 0x0, 0xA0, 0xBF, 0x0, 0xC, 0x0, 0xA8, 0xBF, 0x0, 0xC, 0x0, 0xB0, 0xBF, 0x0, 0xC, 0x0, 0xB8, 0xBF, 0x0, 0xC, 0x0, 0xC0, 0xBF, 0x0, 0xC, 0x0, 0xC8, 0xBF, 0x0, 0xC, 0x0, 0xD0, 0xBF, 0x0, 0xC, 0x0, 0xD8, 0xBF, 0x0, 0xC, 0x0, 0xE0, 0xBF, 0x0, 0xC, 0x0, 0xE8, 0xBF, 0x0, 0xC, 0x0, 0xF0, 0xBF, 0x0, 0xC, 0x0, 0xF8, 0xBF, 0x0, 0xC, 0x0, 0x0, 0xC0, 0x0, 0xC, 0x0, 0x8, 0xC0, 0x0, 0xC, 0x0, 0x10, 0xC0, 0x0, 0xC, 0x0, 0x18, 0xC0, 0x0, 0xC, 0x0, 0x20, 0xC0, 0x0, 0xC, 0x0, 0x28, 0xC0, 0x0, 0xC, 0x0, 0x30, 0xC0, 0x0, 0xC, 0x0, 0x38, 0xC0, 0x0, 0xC, 0x0, 0x40, 0xC0, 0x0, 0xC, 0x0, 0x48, 0xC0, 0x0, 0xC, 0x0, 0x50, 0xC0, 0x0, 0xC, 0x0, 0x58, 0xC0, 0x0, 0xC, 0x0, 0x60, 0xC0, 0x0, 0xC, 0x0, 0x68, 0xC0, 0x0, 0xC, 0x0, 0x70, 0xC0, 0x0, 0xC, 0x0, 0x78, 0xC0, 0x0, 0xC, 0x0, 0x80, 0xC0, 0x0, 0xC, 0x0, 0x88, 0xC0, 0x0, 0xC, 0x0, 0x90, 0xC0, 0x0, 0xC, 0x0, 0x98, 0xC0, 0x0, 0xC, 0x0, 0xA0, 0xC0, 0x0, 0xC, 0x0, 0xA8, 0xC0, 0x0, 0xC, 0x0, 0xB0, 0xC0, 0x0, 0xC, 0x0, 0xB8, 0xC0, 0x0, 0xC, 0x0, 0xC0, 0xC0, 0x0, 0xC, 0x0, 0xC8, 0xC0, 0x0, 0xC, 0x0, 0xD0, 0xC0, 0x0, 0xC, 0x0, 0xD8, 0xC0, 0x0, 0xC, 0x0, 0xE0, 0xC0, 0x0, 0xC, 0x0, 0xE8, 0xC0, 0x0, 0xC, 0x0, 0xF0, 0xC0, 0x0, 0xC, 0x0, 0xF8, 0xC0, 0x0, 0xC, 0x0, 0x0, 0xC1, 0x0, 0xC, 0x0, 0x8, 0xC1, 0x0, 0xC, 0x0, 0x10, 0xC1, 0x0, 0xC, 0x0, 0x18, 0xC1, 0x0, 0xC, 0x0, 0x20, 0xC1, 0x0, 0xC, 0x0, 0x28, 0xC1, 0x0, 0xC, 0x0, 0x30, 0xC1, 0x0, 0xC, 0x0, 0x38, 0xC1, 0x0, 0xC, 0x0, 0x40, 0xC1, 0x0, 0xC, 0x0, 0x48, 0xC1, 0x0, 0xC, 0x0, 0x50, 0xC1, 0x0, 0xC, 0x0, 0x58, 0xC1, 0x0, 0xC, 0x0, 0x60, 0xC1, 0x0, 0xC, 0x0, 0x68, 0xC1, 0x0, 0xC, 0x0, 0x70, 0xC1, 0x0, 0xC, 0x0, 0x78, 0xC1, 0x0, 0xC, 0x0, 0x80, 0xC1, 0x0, 0xC, 0x0, 0x88, 0xC1, 0x0, 0xC, 0x0, 0x90, 0xC1, 0x0, 0xC, 0x0, 0x98, 0xC1, 0x0, 0xC, 0x0, 0xA0, 0xC1, 0x0, 0xC, 0x0, 0xA8, 0xC1, 0x0, 0xC, 0x0, 0xB0, 0xC1, 0x0, 0xC, 0x0, 0xB8, 0xC1, 0x0, 0xC, 0x0, 0xC0, 0xC1, 0x0, 0xC, 0x0, 0xC8, 0xC1, 0x0, 0xC, 0x0, 0xD0, 0xC1, 0x0, 0xC, 0x0, 0xD8, 0xC1, 0x0, 0xC, 0x0, 0xE0, 0xC1, 0x0, 0xC, 0x0, 0xE8, 0xC1, 0x0, 0xC, 0x0, 0xF0, 0xC1, 0x0, 0xC, 0x0, 0xF8, 0xC1, 0x0, 0xC, 0x0, 0x0, 0xC2, 0x0, 0xC, 0x0, 0x8, 0xC2, 0x0, 0xC, 0x0, 0x10, 0xC2, 0x0, 0xC, 0x0, 0x18, 0xC2, 0x0, 0xC, 0x0, 0x20, 0xC2, 0x0, 0xC, 0x0, 0x28, 0xC2, 0x0, 0xC, 0x0, 0x30, 0xC2, 0x0, 0xC, 0x0, 0x38, 0xC2, 0x0, 0xC, 0x0, 0x40, 0xC2, 0x0, 0xC, 0x0, 0x48, 0xC2, 0x0, 0xC, 0x0, 0x50, 0xC2, 0x0, 0xC, 0x0, 0x58, 0xC2, 0x0, 0xC, 0x0, 0x60, 0xC2, 0x0, 0xC, 0x0, 0x68, 0xC2, 0x0, 0xC, 0x0, 0x70, 0xC2, 0x0, 0xC, 0x0, 0x78, 0xC2, 0x0, 0xC, 0x0, 0x80, 0xC2, 0x0, 0xC, 0x0, 0x88, 0xC2, 0x0, 0xC, 0x0, 0x90, 0xC2, 0x0, 0xC, 0x0, 0x98, 0xC2, 0x0, 0xC, 0x0, 0xA0, 0xC2, 0x0, 0xC, 0x0, 0xA8, 0xC2, 0x0, 0xC, 0x0, 0xB0, 0xC2, 0x0, 0xC, 0x0, 0xB8, 0xC2, 0x0, 0xC, 0x0, 0xC0, 0xC2, 0x0, 0xC, 0x0, 0xC8, 0xC2, 0x0, 0xC, 0x0, 0xD0, 0xC2, 0x0, 0xC, 0x0, 0xD8, 0xC2, 0x0, 0xC, 0x0, 0xE0, 0xC2, 0x0, 0xC, 0x0, 0xE8, 0xC2, 0x0, 0xC, 0x0, 0xF0, 0xC2, 0x0, 0xC, 0x0, 0xF8, 0xC2, 0x0, 0xC, 0x0, 0x0, 0xC3, 0x0, 0xC, 0x0, 0x8, 0xC3, 0x0, 0xC, 0x0, 0x10, 0xC3, 0x0, 0xC, 0x0, 0x18, 0xC3, 0x0, 0xC, 0x0, 0x20, 0xC3, 0x0, 0xC, 0x0, 0x28, 0xC3, 0x0, 0xC, 0x0, 0x30, 0xC3, 0x0, 0xC, 0x0, 0x38, 0xC3, 0x0, 0xC, 0x0, 0x40, 0xC3, 0x0, 0xC, 0x0, 0x48, 0xC3, 0x0, 0xC, 0x0, 0x50, 0xC3, 0x0, 0xC, 0x0, 0x58, 0xC3, 0x0, 0xC, 0x0, 0x60, 0xC3, 0x0, 0xC, 0x0, 0x68, 0xC3, 0x0, 0xC, 0x0, 0x70, 0xC3, 0x0, 0xC, 0x0, 0x78, 0xC3, 0x0, 0xC, 0x0, 0x80, 0xC3, 0x0, 0xC, 0x0, 0x88, 0xC3, 0x0, 0xC, 0x0, 0x90, 0xC3, 0x0, 0xC, 0x0, 0x98, 0xC3, 0x0, 0xC, 0x0, 0xA0, 0xC3, 0x0, 0xC, 0x0, 0xA8, 0xC3, 0x0, 0xC, 0x0, 0xB0, 0xC3, 0x0, 0xC, 0x0, 0xB8, 0xC3, 0x0, 0xC, 0x0, 0xC0, 0xC3, 0x0, 0xC, 0x0, 0xC8, 0xC3, 0x0, 0xC, 0x0, 0xD0, 0xC3, 0x0, 0xC, 0x0, 0xD8, 0xC3, 0x0, 0xC, 0x0, 0xE0, 0xC3, 0x0, 0xC, 0x0, 0xE8, 0xC3, 0x0, 0xC, 0x0, 0xF0, 0xC3, 0x0, 0xC, 0x0, 0xF8, 0xC3, 0x0, 0xC, 0x0, 0x0, 0xC4, 0x0, 0xC, 0x0, 0x8, 0xC4, 0x0, 0xC, 0x0, 0x10, 0xC4, 0x0, 0xC, 0x0, 0x18, 0xC4, 0x0, 0xC, 0x0, 0x20, 0xC4, 0x0, 0xC, 0x0, 0x28, 0xC4, 0x0, 0xC, 0x0, 0x30, 0xC4, 0x0, 0xC, 0x0, 0x38, 0xC4, 0x0, 0xC, 0x0, 0x40, 0xC4, 0x0, 0xC, 0x0, 0x48, 0xC4, 0x0, 0xC, 0x0, 0x50, 0xC4, 0x0, 0xC, 0x0, 0x58, 0xC4, 0x0, 0xC, 0x0, 0x60, 0xC4, 0x0, 0xC, 0x0, 0x68, 0xC4, 0x0, 0xC, 0x0, 0x70, 0xC4, 0x0, 0xC, 0x0, 0x78, 0xC4, 0x0, 0xC, 0x0, 0x80, 0xC4, 0x0, 0xC, 0x0, 0x88, 0xC4, 0x0, 0xC, 0x0, 0x90, 0xC4, 0x0, 0xC, 0x0, 0x98, 0xC4, 0x0, 0xC, 0x0, 0xA0, 0xC4, 0x0, 0xC, 0x0, 0xA8, 0xC4, 0x0, 0xC, 0x0, 0xB0, 0xC4, 0x0, 0xC, 0x0, 0xB8, 0xC4, 0x0, 0xC, 0x0, 0xC0, 0xC4, 0x0, 0xC, 0x0, 0xC8, 0xC4, 0x0, 0xC, 0x0, 0xD0, 0xC4, 0x0, 0xC, 0x0, 0xD8, 0xC4, 0x0, 0xC, 0x0, 0xE0, 0xC4, 0x0, 0xC, 0x0, 0xE8, 0xC4, 0x0, 0xC, 0x0, 0xF0, 0xC4, 0x0, 0xC, 0x0, 0xF8, 0xC4, 0x0, 0xC, 0x0, 0x0, 0xC5, 0x0, 0xC, 0x0, 0x8, 0xC5, 0x0, 0xC, 0x0, 0x10, 0xC5, 0x0, 0xC, 0x0, 0x18, 0xC5, 0x0, 0xC, 0x0, 0x20, 0xC5, 0x0, 0xC, 0x0, 0x28, 0xC5, 0x0, 0xC, 0x0, 0x30, 0xC5, 0x0, 0xC, 0x0, 0x38, 0xC5, 0x0, 0xC, 0x0, 0x40, 0xC5, 0x0, 0xC, 0x0, 0x48, 0xC5, 0x0, 0xC, 0x0, 0x50, 0xC5, 0x0, 0xC, 0x0, 0x58, 0xC5, 0x0, 0xC, 0x0, 0x60, 0xC5, 0x0, 0xC, 0x0, 0x68, 0xC5, 0x0, 0xC, 0x0, 0x70, 0xC5, 0x0, 0xC, 0x0, 0x78, 0xC5, 0x0, 0xC, 0x0, 0x80, 0xC5, 0x0, 0xC, 0x0, 0x88, 0xC5, 0x0, 0xC, 0x0, 0x90, 0xC5, 0x0, 0xC, 0x0, 0x98, 0xC5, 0x0, 0xC, 0x0, 0xA0, 0xC5, 0x0, 0xC, 0x0, 0xA8, 0xC5, 0x0, 0xC, 0x0, 0xB0, 0xC5, 0x0, 0xC, 0x0, 0xB8, 0xC5, 0x0, 0xC, 0x0, 0xC0, 0xC5, 0x0, 0xC, 0x0, 0xC8, 0xC5, 0x0, 0xC, 0x0, 0xD0, 0xC5, 0x0, 0xC, 0x0, 0xD8, 0xC5, 0x0, 0xC, 0x0, 0xE0, 0xC5, 0x0, 0xC, 0x0, 0xE8, 0xC5, 0x0, 0xC, 0x0, 0xF0, 0xC5, 0x0, 0xC, 0x0, 0xF8, 0xC5, 0x0, 0xC, 0x0, 0x0, 0xC6, 0x0, 0xC, 0x0, 0x8, 0xC6, 0x0, 0xC, 0x0, 0x10, 0xC6, 0x0, 0xC, 0x0, 0x18, 0xC6, 0x0, 0xC, 0x0, 0x20, 0xC6, 0x0, 0xC, 0x0, 0x28, 0xC6, 0x0, 0xC, 0x0, 0x30, 0xC6, 0x0, 0xC, 0x0, 0x38, 0xC6, 0x0, 0xC, 0x0, 0x40, 0xC6, 0x0, 0xC, 0x0, 0x48, 0xC6, 0x0, 0xC, 0x0, 0x50, 0xC6, 0x0, 0xC, 0x0, 0x58, 0xC6, 0x0, 0xC, 0x0, 0x60, 0xC6, 0x0, 0xC, 0x0, 0x68, 0xC6, 0x0, 0xC, 0x0, 0x70, 0xC6, 0x0, 0xC, 0x0, 0x78, 0xC6, 0x0, 0xC, 0x0, 0x80, 0xC6, 0x0, 0xC, 0x0, 0x88, 0xC6, 0x0, 0xC, 0x0, 0x90, 0xC6, 0x0, 0xC, 0x0, 0x98, 0xC6, 0x0, 0xC, 0x0, 0xA0, 0xC6, 0x0, 0xC, 0x0, 0xA8, 0xC6, 0x0, 0xC, 0x0, 0xB0, 0xC6, 0x0, 0xC, 0x0, 0xB8, 0xC6, 0x0, 0xC, 0x0, 0xC0, 0xC6, 0x0, 0xC, 0x0, 0xC8, 0xC6, 0x0, 0xC, 0x0, 0xD0, 0xC6, 0x0, 0xC, 0x0, 0xD8, 0xC6, 0x0, 0xC, 0x0, 0xE0, 0xC6, 0x0, 0xC, 0x0, 0xE8, 0xC6, 0x0, 0xC, 0x0, 0xF0, 0xC6, 0x0, 0xC, 0x0, 0xF8, 0xC6, 0x0, 0xC, 0x0, 0x0, 0xC7, 0x0, 0xC, 0x0, 0x8, 0xC7, 0x0, 0xC, 0x0, 0x10, 0xC7, 0x0, 0xC, 0x0, 0x18, 0xC7, 0x0, 0xC, 0x0, 0x20, 0xC7, 0x0, 0xC, 0x0, 0x28, 0xC7, 0x0, 0xC, 0x0, 0x30, 0xC7, 0x0, 0xC, 0x0, 0x38, 0xC7, 0x0, 0xC, 0x0, 0x40, 0xC7, 0x0, 0xC, 0x0, 0x48, 0xC7, 0x0, 0xC, 0x0, 0x50, 0xC7, 0x0, 0x6D, 0x1D, 0x3, 0x0, 0x0, 0x8D, 0x1D, 0x3, 0x0, 0x0, 0xAD, 0x1D, 0x3, 0x0, 0x0, 0xCD, 0x1D, 0x3, 0x0, 0x0, 0xED, 0x1D, 0x3, 0x0, 0x0, 0xD, 0x1E, 0x3, 0x0, 0x0, 0x2D, 0x1E, 0x3, 0x0, 0x0, 0x4D, 0x1E, 0x3, 0x0, 0x0, 0x6D, 0x1E, 0x3, 0x0, 0x0, 0x8D, 0x1E, 0x3, 0x0, 0x0, 0xAD, 0x1E, 0x3, 0x0, 0x0, 0xCD, 0x1E, 0x3, 0x0, 0x0, 0xED, 0x1E, 0x3, 0x0, 0x0, 0xD, 0x1F, 0x3, 0x0, 0x0, 0x2D, 0x1F, 0x3, 0x0, 0x0, 0x4D, 0x1F, 0x3, 0x0, 0x0, 0x6D, 0x1F, 0x3, 0x0, 0x0, 0x8D, 0x1F, 0x3, 0x0, 0x0, 0xAD, 0x1F, 0x3, 0x0, 0x0, 0xCD, 0x1F, 0x3, 0x0, 0x0, 0xED, 0x1F, 0x3, 0x0, 0x0, 0xD, 0x20, 0x3, 0x0, 0x0, 0x2D, 0x20, 0x3, 0x0, 0x0, 0x4D, 0x20, 0x3, 0x0, 0x0, 0x6D, 0x20, 0x3, 0x0, 0x0, 0x8D, 0x20, 0x3, 0x0, 0x0, 0xAD, 0x20, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xC8, 0x0, 0xED, 0x20, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xC8, 0x0, 0x2D, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xC8, 0x0, 0x6D, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xC8, 0x0, 0xAD, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xC8, 0x0, 0xED, 0x21, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xC8, 0x0, 0x2D, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xC8, 0x0, 0x6D, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xC8, 0x0, 0xAD, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xC8, 0x0, 0xED, 0x22, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xC8, 0x0, 0x2D, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xC8, 0x0, 0x6D, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xC8, 0x0, 0xAD, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xC8, 0x0, 0xED, 0x23, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xC9, 0x0, 0x2D, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xC9, 0x0, 0x6D, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xC9, 0x0, 0xAD, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xC9, 0x0, 0xED, 0x24, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xC9, 0x0, 0x2D, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xC9, 0x0, 0x6D, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xC9, 0x0, 0xAD, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xC9, 0x0, 0xED, 0x25, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xC9, 0x0, 0x2D, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xC9, 0x0, 0x6D, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xC9, 0x0, 0xAD, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xC9, 0x0, 0xED, 0x26, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xC9, 0x0, 0x2D, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xC9, 0x0, 0x6D, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xC9, 0x0, 0xAD, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xC9, 0x0, 0xED, 0x27, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCA, 0x0, 0x2D, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCA, 0x0, 0x6D, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCA, 0x0, 0xAD, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xCA, 0x0, 0xED, 0x28, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xCA, 0x0, 0x2D, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCA, 0x0, 0x6D, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCA, 0x0, 0xAD, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xCA, 0x0, 0xED, 0x29, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xCA, 0x0, 0x2D, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCA, 0x0, 0x6D, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xCA, 0x0, 0xAD, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCA, 0x0, 0xED, 0x2A, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCA, 0x0, 0x2D, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCA, 0x0, 0x6D, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCA, 0x0, 0xAD, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCA, 0x0, 0xED, 0x2B, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCB, 0x0, 0x2D, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCB, 0x0, 0x6D, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCB, 0x0, 0xAD, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xCB, 0x0, 0xED, 0x2C, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xCB, 0x0, 0x2D, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCB, 0x0, 0x6D, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCB, 0x0, 0xAD, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xCB, 0x0, 0xED, 0x2D, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xCB, 0x0, 0x2D, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCB, 0x0, 0x6D, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xCB, 0x0, 0xAD, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCB, 0x0, 0xED, 0x2E, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCB, 0x0, 0x2D, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCB, 0x0, 0x6D, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCB, 0x0, 0xAD, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCB, 0x0, 0xED, 0x2F, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCC, 0x0, 0x2D, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCC, 0x0, 0x6D, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCC, 0x0, 0xAD, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x30, 0xCC, 0x0, 0xED, 0x30, 0x3, 0x0, 0x0, 0xD, 0x0, 0x40, 0xCC, 0x0, 0x2D, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCC, 0x0, 0x6D, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCC, 0x0, 0xAD, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x70, 0xCC, 0x0, 0xED, 0x31, 0x3, 0x0, 0x0, 0xD, 0x0, 0x80, 0xCC, 0x0, 0x2D, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCC, 0x0, 0x6D, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0xA0, 0xCC, 0x0, 0xAD, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCC, 0x0, 0xED, 0x32, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCC, 0x0, 0x2D, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCC, 0x0, 0x6D, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCC, 0x0, 0xAD, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCC, 0x0, 0xED, 0x33, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCD, 0x0, 0x2D, 0x34, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCD, 0x0, 0x6D, 0x34, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCD, 0x0, 0xAD, 0x34, 0x3, 0x0, 0x0, 0xCD, 0x34, 0x3, 0x0, 0x0, 0xED, 0x34, 0x3, 0x0, 0x0, 0xD, 0x35, 0x3, 0x0, 0x0, 0x2D, 0x35, 0x3, 0x0, 0x0, 0xD, 0x0, 0x50, 0xCD, 0x0, 0x6D, 0x35, 0x3, 0x0, 0x0, 0xD, 0x0, 0x60, 0xCD, 0x0, 0xAD, 0x35, 0x3, 0x0, 0x0, 0xCD, 0x35, 0x3, 0x0, 0x0, 0xED, 0x35, 0x3, 0x0, 0x0, 0xD, 0x36, 0x3, 0x0, 0x0, 0x2D, 0x36, 0x3, 0x0, 0x0, 0x4D, 0x36, 0x3, 0x0, 0x0, 0x6D, 0x36, 0x3, 0x0, 0x0, 0x8D, 0x36, 0x3, 0x0, 0x0, 0xAD, 0x36, 0x3, 0x0, 0x0, 0xD, 0x0, 0xB0, 0xCD, 0x0, 0xED, 0x36, 0x3, 0x0, 0x0, 0xD, 0x0, 0xC0, 0xCD, 0x0, 0x2D, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCD, 0x0, 0x6D, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0xE0, 0xCD, 0x0, 0xAD, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0xF0, 0xCD, 0x0, 0xED, 0x37, 0x3, 0x0, 0x0, 0xD, 0x0, 0x0, 0xCE, 0x0, 0x2D, 0x38, 0x3, 0x0, 0x0, 0xD, 0x0, 0x10, 0xCE, 0x0, 0x6D, 0x38, 0x3, 0x0, 0x0, 0xD, 0x0, 0x20, 0xCE, 0x0, 0xAD, 0x38, 0x3, 0x0, 0x0, 0xCD, 0x38, 0x3, 0x0, 0x0, 0xED, 0x38, 0x3, 0x0, 0x0, 0xD, 0x39, 0x3, 0x0, 0x0, 0x2D, 0x39, 0x3, 0x0, 0x0, 0x4D, 0x39, 0x3, 0x0, 0x0, 0x6D, 0x39, 0x3, 0x0, 0x0, 0x8D, 0x39, 0x3, 0x0, 0x0, 0xAD, 0x39, 0x3, 0x0, 0x0, 0xCD, 0x39, 0x3, 0x0, 0x0, 0xED, 0x39, 0x3, 0x0, 0x0, 0xD, 0x3A, 0x3, 0x0, 0x0, 0x2D, 0x3A, 0x3, 0x0, 0x0, 0xD, 0x0, 0x90, 0xCE, 0x0, 0x6D, 0x3A, 0x3, 0x0, 0x0, 0x8D, 0x3A, 0x3, 0x0, 0x0, 0xAD, 0x3A, 0x3, 0x0, 0x0, 0xCD, 0x3A, 0x3, 0x0, 0x0, 0xED, 0x3A, 0x3, 0x0, 0x0, 0xD, 0x3B, 0x3, 0x0, 0x0, 0x2D, 0x3B, 0x3, 0x0, 0x0, 0xD, 0x0, 0xD0, 0xCE, 0x0, 0x6D, 0x3B, 0x3, 0x0, 0x0, 0x8D, 0x3B, 0x3, 0x0, 0x0, 0xAD, 0x3B, 0x3, 0x0, 0x0, 0xCD, 0x3B, 0x3, 0x0, 0x0, 0xED, 0x3B, 0x3, 0x0, 0x0, 0xD, 0x3C, 0x3, 0x0, 0x0, 0x2D, 0x3C, 0x3, 0x0, 0x0, 0x4D, 0x3C, 0x3, 0x0, 0x0, 0x6D, 0x3C, 0x3, 0x0, 0x0, 0x8D, 0x3C, 0x3, 0x0, 0x0, 0xAD, 0x3C, 0x3, 0x0, 0x0, 0xCD, 0x3C, 0x3, 0x0, 0x0, 0xED, 0x3C, 0x3, 0x0, 0x0, 0xD, 0x3D, 0x3, 0x0, 0x0, 0x2D, 0x3D, 0x3, 0x0, 0x0, 0x4D, 0x3D, 0x3, 0x0, 0x0, 0x6D, 0x3D, 0x3, 0x0, 0x0, 0x8D, 0x3D, 0x3, 0x0, 0x0, 0xAD, 0x3D, 0x3, 0x0, 0x0, 0xCD, 0x3D, 0x3, 0x0, 0x0, 0xED, 0x3D, 0x3, 0x0, 0x0, 0xD, 0x3E, 0x3, 0x0, 0x0, 0x2D, 0x3E, 0x3, 0x0, 0x0, 0x4D, 0x3E, 0x3, 0x0, 0x0, 0x6D, 0x3E, 0x3, 0x0, 0x0, 0x8D, 0x3E, 0x3, 0x0, 0x0, 0xAD, 0x3E, 0x3, 0x0, 0x0, 0xCD, 0x3E, 0x3, 0x0, 0x0, 0xED, 0x3E, 0x3, 0x0, 0x0, 0xD, 0x3F, 0x3, 0x0, 0x0, 0x2D, 0x3F, 0x3, 0x0, 0x0, 0x4D, 0x3F, 0x3, 0x0, 0x0, 0x6D, 0x3F, 0x3, 0x0, 0x0, 0x8D, 0x3F, 0x3, 0x0, 0x0, 0xAD, 0x3F, 0x3, 0x0, 0x0, 0xCD, 0x3F, 0x3, 0x0, 0x0, 0xED, 0x3F, 0x3, 0x0, 0x0, 0xD, 0x40, 0x3, 0x0, 0x0, 0x2D, 0x40, 0x3, 0x0, 0x0, 0x4D, 0x40, 0x3, 0x0, 0x0, 0x6D, 0x40, 0x3, 0x0, 0x0, 0x8D, 0x40, 0x3, 0x0, 0x0, 0xAD, 0x40, 0x3, 0x0, 0x0, 0xCD, 0x40, 0x3, 0x0, 0x0, 0xED, 0x40, 0x3, 0x0, 0x0, 0xD, 0x41, 0x3, 0x0, 0x0, 0x2D, 0x41, 0x3, 0x0, 0x0, 0x4D, 0x41, 0x3, 0x0, 0x0, 0x6D, 0x41, 0x3, 0x0, 0x0, 0x8D, 0x41, 0x3, 0x0, 0x0, 0xAD, 0x41, 0x3, 0x0, 0x0, 0xCD, 0x41, 0x3, 0x0, 0x0, 0xED, 0x41, 0x3, 0x0, 0x0, 0xD, 0x42, 0x3, 0x0, 0x0, 0x2D, 0x42, 0x3, 0x0, 0x0, 0x4D, 0x42, 0x3, 0x0, 0x0, 0x6D, 0x42, 0x3, 0x0, 0x0, 0x8D, 0x42, 0x3, 0x0, 0x0, 0xAD, 0x42, 0x3, 0x0, 0x0, 0xCD, 0x42, 0x3, 0x0, 0x0, 0xED, 0x42, 0x3, 0x0, 0x0, 0xD, 0x43, 0x3, 0x0, 0x0, 0x2D, 0x43, 0x3, 0x0, 0x0, 0x4D, 0x43, 0x3, 0x0, 0x0, 0x6D, 0x43, 0x3, 0x0, 0x0, 0x8D, 0x43, 0x3, 0x0, 0x0, 0xAD, 0x43, 0x3, 0x0, 0x0, 0xCD, 0x43, 0x3, 0x0, 0x0, 0xED, 0x43, 0x3, 0x0, 0x0, 0xD, 0x44, 0x3, 0x0, 0x0, 0x2D, 0x44, 0x3, 0x0, 0x0, 0x4D, 0x44, 0x3, 0x0, 0x0, 0x6D, 0x44, 0x3, 0x0, 0x0, 0x8D, 0x44, 0x3, 0x0, 0x0, 0xAD, 0x44, 0x3, 0x0, 0x0, 0xCD, 0x44, 0x3, 0x0, 0x0, 0xED, 0x44, 0x3, 0x0, 0x0, 0xD, 0x45, 0x4B, 0xD1, 0x0, 0x4D, 0x45, 0x5B, 0xD1, 0x0, 0x8D, 0x45, 0x6B, 0xD1, 0x0, 0xCD, 0x45, 0x7B, 0xD1, 0x0, 0xD, 0x46, 0x8B, 0xD1, 0x0, 0x4D, 0x46, 0x9B, 0xD1, 0x0, 0x8D, 0x46, 0xAB, 0xD1, 0x0, 0xCD, 0x46, 0xBB, 0xD1, 0x0, 0xD, 0x47, 0xCB, 0xD1, 0x0, 0x4D, 0x47, 0xDB, 0xD1, 0x0, 0x8D, 0x47, 0xEB, 0xD1, 0x0, 0xCD, 0x47, 0xFB, 0xD1, 0x0, 0xD, 0x48, 0xB, 0xD2, 0x0, 0x4D, 0x48, 0x1B, 0xD2, 0x0, 0x8D, 0x48, 0x2B, 0xD2, 0x0, 0xCD, 0x48, 0x3B, 0xD2, 0x0, 0xD, 0x49, 0x4B, 0xD2, 0x0, 0x4D, 0x49, 0x5B, 0xD2, 0x0, 0x8D, 0x49, 0x6B, 0xD2, 0x0, 0xCD, 0x49, 0x7B, 0xD2, 0x0, 0xD, 0x4A, 0x8B, 0xD2, 0x0, 0x4D, 0x4A, 0x9B, 0xD2, 0x0, 0x8D, 0x4A, 0xAB, 0xD2, 0x0, 0xCD, 0x4A, 0xBB, 0xD2, 0x0, 0xD, 0x4B, 0xCB, 0xD2, 0x0, 0x4D, 0x4B, 0xDB, 0xD2, 0x0, 0x8D, 0x4B, 0xEB, 0xD2, 0x0, 0xCD, 0x4B, 0xFB, 0xD2, 0x0, 0xD, 0x4C, 0xB, 0xD3, 0x0, 0x4D, 0x4C, 0x1B, 0xD3, 0x0, 0x8D, 0x4C, 0x2B, 0xD3, 0x0, 0xCD, 0x4C, 0x3B, 0xD3, 0x0, 0xD, 0x4D, 0x4B, 0xD3, 0x0, 0x4D, 0x4D, 0x5B, 0xD3, 0x0, 0x8D, 0x4D, 0x6B, 0xD3, 0x0, 0xCD, 0x4D, 0x7B, 0xD3, 0x0, 0xD, 0x4E, 0x8B, 0xD3, 0x0, 0x4D, 0x4E, 0x9B, 0xD3, 0x0, 0x8D, 0x4E, 0xAB, 0xD3, 0x0, 0xCD, 0x4E, 0xBB, 0xD3, 0x0, 0xD, 0x4F, 0x3, 0x0, 0x0, 0x2D, 0x4F, 0x3, 0x0, 0x0, 0x4D, 0x4F, 0x3, 0x0, 0x0, 0x6D, 0x4F, 0x3, 0x0, 0x0, 0x8D, 0x4F, 0x3, 0x0, 0x0, 0xAD, 0x4F, 0x3, 0x0, 0x0, 0xCD, 0x4F, 0x3, 0x0, 0x0, 0xED, 0x4F, 0x3, 0x0, 0x0, 0xD, 0x50, 0x3, 0x0, 0x0, 0x2D, 0x50, 0x3, 0x0, 0x0, 0x4D, 0x50, 0x3, 0x0, 0x0, 0x6D, 0x50, 0x3, 0x0, 0x0, 0x8D, 0x50, 0x3, 0x0, 0x0, 0xAD, 0x50, 0x3, 0x0, 0x0, 0xCD, 0x50, 0x3, 0x0, 0x0, 0xED, 0x50, 0x3, 0x0, 0x0, 0xD, 0x51, 0x3, 0x0, 0x0, 0x2D, 0x51, 0x3, 0x0, 0x0, 0x4D, 0x51, 0x3, 0x0, 0x0, 0x6D, 0x51, 0x3, 0x0, 0x0, 0x8D, 0x51, 0x3, 0x0, 0x0, 0xAD, 0x51, 0x3, 0x0, 0x0, 0xCD, 0x51, 0x3, 0x0, 0x0, 0xED, 0x51, 0x3, 0x0, 0x0, 0xD, 0x52, 0x3, 0x0, 0x0, 0x2D, 0x52, 0x3, 0x0, 0x0, 0x4D, 0x52, 0x3, 0x0, 0x0, 0x6D, 0x52, 0x3, 0x0, 0x0, 0x8D, 0x52, 0x3, 0x0, 0x0, 0xAD, 0x52, 0x3, 0x0, 0x0, 0xCD, 0x52, 0x3, 0x0, 0x0, 0xED, 0x52, 0x3, 0x0, 0x0, 0xD, 0x53, 0x3, 0x0, 0x0, 0x2D, 0x53, 0x3, 0x0, 0x0, 0x4D, 0x53, 0x3, 0x0, 0x0, 0x6D, 0x53, 0x3, 0x0, 0x0, 0x8D, 0x53, 0x3, 0x0, 0x0, 0xAD, 0x53, 0x3, 0x0, 0x0, 0xCD, 0x53, 0x3, 0x0, 0x0, 0xED, 0x53, 0x3, 0x0, 0x0, 0xD, 0x54, 0x3, 0x0, 0x0, 0x2D, 0x54, 0x3, 0x0, 0x0, 0x4D, 0x54, 0x3, 0x0, 0x0, 0x6D, 0x54, 0x3, 0x0, 0x0, 0x8D, 0x54, 0x3, 0x0, 0x0, 0xAD, 0x54, 0x3, 0x0, 0x0, 0xCD, 0x54, 0x3, 0x0, 0x0, 0xED, 0x54, 0x3, 0x0, 0x0, 0xD, 0x55, 0x3, 0x0, 0x0, 0x2D, 0x55, 0x3, 0x0, 0x0, 0x4D, 0x55, 0x3, 0x0, 0x0, 0x6D, 0x55, 0x3, 0x0, 0x0, 0x8D, 0x55, 0x3, 0x0, 0x0, 0xAD, 0x55, 0x73, 0xD5, 0x0, 0xED, 0x55, 0x83, 0xD5, 0x0, 0x2D, 0x56, 0x3, 0x0, 0x0, 0x4D, 0x56, 0x3, 0x0, 0x0, 0x6D, 0x56, 0xA3, 0xD5, 0x0, 0xAD, 0x56, 0xB3, 0xD5, 0x0, 0xED, 0x56, 0xC3, 0xD5, 0x0, 0x2D, 0x57, 0xD3, 0xD5, 0x0, 0x6D, 0x57, 0x3, 0x0, 0x0, 0x8D, 0x57, 0x3, 0x0, 0x0, 0xAD, 0x57, 0x3, 0x0, 0x0, 0xCD, 0x57, 0xFB, 0xD5, 0x0, 0xD, 0x58, 0xB, 0xD6, 0x0, 0x4D, 0x58, 0x1B, 0xD6, 0x0, 0x8D, 0x58, 0x2B, 0xD6, 0x0, 0xCD, 0x58, 0x3B, 0xD6, 0x0, 0xD, 0x59, 0x3, 0x0, 0x0, 0x2D, 0x59, 0x3, 0x0, 0x0, 0x4D, 0x59, 0x3, 0x0, 0x0, 0x6D, 0x59, 0x3, 0x0, 0x0, 0x8D, 0x59, 0x3, 0x0, 0x0, 0xAD, 0x59, 0x3, 0x0, 0x0, 0xCD, 0x59, 0x3, 0x0, 0x0, 0xED, 0x59, 0x3, 0x0, 0x0, 0xD, 0x5A, 0x3, 0x0, 0x0, 0x2D, 0x5A, 0x3, 0x0, 0x0, 0x4D, 0x5A, 0x3, 0x0, 0x0, 0x6D, 0x5A, 0x3, 0x0, 0x0, 0x8D, 0x5A, 0x3, 0x0, 0x0, 0xAD, 0x5A, 0x3, 0x0, 0x0, 0xCD, 0x5A, 0x3, 0x0, 0x0, 0xED, 0x5A, 0x3, 0x0, 0x0, 0xD, 0x5B, 0x3, 0x0, 0x0, 0x2D, 0x5B, 0x3, 0x0, 0x0, 0x4D, 0x5B, 0x3, 0x0, 0x0, 0x6D, 0x5B, 0x3, 0x0, 0x0, 0x8D, 0x5B, 0x3, 0x0, 0x0, 0xAD, 0x5B, 0x3, 0x0, 0x0, 0xCD, 0x5B, 0x3, 0x0, 0x0, 0xED, 0x5B, 0x3, 0x0, 0x0, 0xD, 0x5C, 0x3, 0x0, 0x0, 0x2D, 0x5C, 0x3, 0x0, 0x0, 0x4D, 0x5C, 0x3, 0x0, 0x0, 0x6D, 0x5C, 0x3, 0x0, 0x0, 0x8D, 0x5C, 0x3, 0x0, 0x0, 0xAD, 0x5C, 0x3, 0x0, 0x0, 0xCD, 0x5C, 0x3, 0x0, 0x0, 0xED, 0x5C, 0x3, 0x0, 0x0, 0xD, 0x5D, 0x3, 0x0, 0x0, 0x2D, 0x5D, 0x3, 0x0, 0x0, 0x4D, 0x5D, 0x3, 0x0, 0x0, 0x6D, 0x5D, 0x3, 0x0, 0x0, 0x8D, 0x5D, 0x3, 0x0, 0x0, 0xAD, 0x5D, 0x3, 0x0, 0x0, 0xCD, 0x5D, 0x3, 0x0, 0x0, 0xED, 0x5D, 0x3, 0x0, 0x0, 0xD, 0x5E, 0x3, 0x0, 0x0, 0x2D, 0x5E, 0x3, 0x0, 0x0, 0x4D, 0x5E, 0x3, 0x0, 0x0, 0x6D, 0x5E, 0x3, 0x0, 0x0, 0x8D, 0x5E, 0x3, 0x0, 0x0, 0xAD, 0x5E, 0x3, 0x0, 0x0, 0xCD, 0x5E, 0x3, 0x0, 0x0, 0xED, 0x5E, 0x3, 0x0, 0x0, 0xD, 0x5F, 0x3, 0x0, 0x0, 0x2D, 0x5F, 0x3, 0x0, 0x0, 0x4D, 0x5F, 0x3, 0x0, 0x0, 0x6D, 0x5F, 0x3, 0x0, 0x0, 0x8D, 0x5F, 0x3, 0x0, 0x0, 0xAD, 0x5F, 0x3, 0x0, 0x0, 0xCD, 0x5F, 0x3, 0x0, 0x0, 0xED, 0x5F, 0x3, 0x0, 0x0, 0xD, 0x60, 0x3, 0x0, 0x0, 0x2D, 0x60, 0x3, 0x0, 0x0, 0x4D, 0x60, 0x3, 0x0, 0x0, 0x6D, 0x60, 0x3, 0x0, 0x0, 0x8D, 0x60, 0x3, 0x0, 0x0, 0xAD, 0x60, 0x3, 0x0, 0x0, 0xCD, 0x60, 0x3, 0x0, 0x0, 0xED, 0x60, 0x3, 0x0, 0x0, 0xD, 0x61, 0x3, 0x0, 0x0, 0x2D, 0x61, 0x3, 0x0, 0x0, 0x4D, 0x61, 0x3, 0x0, 0x0, 0x6D, 0x61, 0x3, 0x0, 0x0, 0x8D, 0x61, 0x3, 0x0, 0x0, 0xAD, 0x61, 0x3, 0x0, 0x0, 0xCD, 0x61, 0x3, 0x0, 0x0, 0xED, 0x61, 0x3, 0x0, 0x0, 0xD, 0x62, 0x3, 0x0, 0x0, 0x2D, 0x62, 0x3, 0x0, 0x0, 0x4D, 0x62, 0x3, 0x0, 0x0, 0x6D, 0x62, 0x3, 0x0, 0x0, 0x8D, 0x62, 0x3, 0x0, 0x0, 0xAD, 0x62, 0x3, 0x0, 0x0, 0xCD, 0x62, 0x3, 0x0, 0x0, 0xED, 0x62, 0x3, 0x0, 0x0, 0xD, 0x63, 0x3, 0x0, 0x0, 0x2D, 0x63, 0x3, 0x0, 0x0, 0x4D, 0x63, 0x3, 0x0, 0x0, 0x6D, 0x63, 0x3, 0x0, 0x0, 0x8D, 0x63, 0x3, 0x0, 0x0, 0xAD, 0x63, 0x3, 0x0, 0x0, 0xCD, 0x63, 0x3, 0x0, 0x0, 0xED, 0x63, 0x3, 0x0, 0x0, 0xD, 0x64, 0x3, 0x0, 0x0, 0x2D, 0x64, 0x3, 0x0, 0x0, 0x4D, 0x64, 0x3, 0x0, 0x0, 0x6D, 0x64, 0x3, 0x0, 0x0, 0x8D, 0x64, 0x2B, 0xD9, 0x0, 0xCD, 0x64, 0x3B, 0xD9, 0x0, 0xD, 0x65, 0x4B, 0xD9, 0x0, 0xD, 0x0, 0x50, 0xD9, 0x0, 0xD, 0x0, 0x58, 0xD9, 0x0, 0xD, 0x0, 0x60, 0xD9, 0x0, 0xD, 0x0, 0x68, 0xD9, 0x0, 0xD, 0x0, 0x70, 0xD9, 0x0, 0xD, 0x0, 0x78, 0xD9, 0x0, 0xD, 0x0, 0x80, 0xD9, 0x0, 0xD, 0x0, 0x88, 0xD9, 0x0, 0xD, 0x0, 0x90, 0xD9, 0x0, 0xD, 0x0, 0x98, 0xD9, 0x0, 0xD, 0x0, 0xA0, 0xD9, 0x0, 0xD, 0x0, 0xA8, 0xD9, 0x0, 0xD, 0x0, 0xB0, 0xD9, 0x0, 0xD, 0x0, 0xB8, 0xD9, 0x0, 0xD, 0x0, 0xC0, 0xD9, 0x0, 0xD, 0x0, 0xC8, 0xD9, 0x0, 0xD, 0x0, 0xD0, 0xD9, 0x0, 0xD, 0x0, 0xD8, 0xD9, 0x0, 0xD, 0x0, 0xE0, 0xD9, 0x0, 0xD, 0x0, 0xE8, 0xD9, 0x0, 0xD, 0x0, 0xF0, 0xD9, 0x0, 0xD, 0x0, 0xF8, 0xD9, 0x0, 0xD, 0x0, 0x0, 0xDA, 0x0, 0xD, 0x0, 0x8, 0xDA, 0x0, 0xD, 0x0, 0x10, 0xDA, 0x0, 0xD, 0x0, 0x18, 0xDA, 0x0, 0xD, 0x0, 0x20, 0xDA, 0x0, 0xD, 0x0, 0x28, 0xDA, 0x0, 0xD, 0x0, 0x30, 0xDA, 0x0, 0xD, 0x0, 0x38, 0xDA, 0x0, 0xD, 0x0, 0x40, 0xDA, 0x0, 0xD, 0x0, 0x48, 0xDA, 0x0, 0xD, 0x0, 0x50, 0xDA, 0x0, 0xD, 0x0, 0x58, 0xDA, 0x0, 0xD, 0x0, 0x60, 0xDA, 0x0, 0xD, 0x0, 0x68, 0xDA, 0x0, 0xD, 0x0, 0x70, 0xDA, 0x0, 0xD, 0x0, 0x78, 0xDA, 0x0, 0xD, 0x0, 0x80, 0xDA, 0x0, 0xD, 0x0, 0x88, 0xDA, 0x0, 0xD, 0x0, 0x90, 0xDA, 0x0, 0xD, 0x0, 0x98, 0xDA, 0x0, 0xD, 0x0, 0xA0, 0xDA, 0x0, 0xD, 0x0, 0xA8, 0xDA, 0x0, 0xD, 0x0, 0xB0, 0xDA, 0x0, 0xD, 0x0, 0xB8, 0xDA, 0x0, 0xD, 0x0, 0xC0, 0xDA, 0x0, 0xD, 0x0, 0xC8, 0xDA, 0x0, 0xD, 0x0, 0xD0, 0xDA, 0x0, 0xD, 0x0, 0xD8, 0xDA, 0x0, 0xD, 0x0, 0xE0, 0xDA, 0x0, 0xD, 0x0, 0xE8, 0xDA, 0x0, 0xD, 0x0, 0xF0, 0xDA, 0x0, 0xD, 0x0, 0xF8, 0xDA, 0x0, 0xD, 0x0, 0x0, 0xDB, 0x0, 0xD, 0x0, 0x8, 0xDB, 0x0, 0xD, 0x0, 0x10, 0xDB, 0x0, 0xD, 0x0, 0x18, 0xDB, 0x0, 0xD, 0x0, 0x20, 0xDB, 0x0, 0xD, 0x0, 0x28, 0xDB, 0x0, 0xD, 0x0, 0x30, 0xDB, 0x0, 0xD, 0x0, 0x38, 0xDB, 0x0, 0xD, 0x0, 0x40, 0xDB, 0x0, 0xD, 0x0, 0x48, 0xDB, 0x0, 0xD, 0x0, 0x50, 0xDB, 0x0, 0xD, 0x0, 0x58, 0xDB, 0x0, 0xD, 0x0, 0x60, 0xDB, 0x0, 0xD, 0x0, 0x68, 0xDB, 0x0, 0xD, 0x0, 0x70, 0xDB, 0x0, 0xD, 0x0, 0x78, 0xDB, 0x0, 0xD, 0x0, 0x80, 0xDB, 0x0, 0xD, 0x0, 0x88, 0xDB, 0x0, 0xD, 0x0, 0x90, 0xDB, 0x0, 0xD, 0x0, 0x98, 0xDB, 0x0, 0xD, 0x0, 0xA0, 0xDB, 0x0, 0xD, 0x0, 0xA8, 0xDB, 0x0, 0xD, 0x0, 0xB0, 0xDB, 0x0, 0xD, 0x0, 0xB8, 0xDB, 0x0, 0xD, 0x0, 0xC0, 0xDB, 0x0, 0xD, 0x0, 0xC8, 0xDB, 0x0, 0xD, 0x0, 0xD0, 0xDB, 0x0, 0xD, 0x0, 0xD8, 0xDB, 0x0, 0xD, 0x0, 0xE0, 0xDB, 0x0, 0xD, 0x0, 0xE8, 0xDB, 0x0, 0xD, 0x0, 0xF0, 0xDB, 0x0, 0xD, 0x0, 0xF8, 0xDB, 0x0, 0xD, 0x0, 0x0, 0xDC, 0x0, 0xD, 0x0, 0x8, 0xDC, 0x0, 0xD, 0x0, 0x10, 0xDC, 0x0, 0xD, 0x0, 0x18, 0xDC, 0x0, 0xD, 0x0, 0x20, 0xDC, 0x0, 0xD, 0x0, 0x28, 0xDC, 0x0, 0xD, 0x0, 0x30, 0xDC, 0x0, 0xD, 0x0, 0x38, 0xDC, 0x0, 0xD, 0x0, 0x40, 0xDC, 0x0, 0xD, 0x0, 0x48, 0xDC, 0x0, 0xD, 0x0, 0x50, 0xDC, 0x0, 0xD, 0x0, 0x58, 0xDC, 0x0, 0xD, 0x0, 0x60, 0xDC, 0x0, 0xD, 0x0, 0x68, 0xDC, 0x0, 0xD, 0x0, 0x70, 0xDC, 0x0, 0xD, 0x0, 0x78, 0xDC, 0x0, 0xD, 0x0, 0x80, 0xDC, 0x0, 0xD, 0x0, 0x88, 0xDC, 0x0, 0xD, 0x0, 0x90, 0xDC, 0x0, 0xD, 0x0, 0x98, 0xDC, 0x0, 0xD, 0x0, 0xA0, 0xDC, 0x0, 0xD, 0x0, 0xA8, 0xDC, 0x0, 0xD, 0x0, 0xB0, 0xDC, 0x0, 0xD, 0x0, 0xB8, 0xDC, 0x0, 0xD, 0x0, 0xC0, 0xDC, 0x0, 0xD, 0x0, 0xC8, 0xDC, 0x0, 0xD, 0x0, 0xD0, 0xDC, 0x0, 0xD, 0x0, 0xD8, 0xDC, 0x0, 0xD, 0x0, 0xE0, 0xDC, 0x0, 0xD, 0x0, 0xE8, 0xDC, 0x0, 0xD, 0x0, 0xF0, 0xDC, 0x0, 0xD, 0x0, 0xF8, 0xDC, 0x0, 0xD, 0x0, 0x0, 0xDD, 0x0, 0xD, 0x0, 0x8, 0xDD, 0x0, 0xD, 0x0, 0x10, 0xDD, 0x0, 0xD, 0x0, 0x18, 0xDD, 0x0, 0xD, 0x0, 0x20, 0xDD, 0x0, 0xD, 0x0, 0x28, 0xDD, 0x0, 0xD, 0x0, 0x30, 0xDD, 0x0, 0xD, 0x0, 0x38, 0xDD, 0x0, 0xD, 0x0, 0x40, 0xDD, 0x0, 0xD, 0x0, 0x48, 0xDD, 0x0, 0xD, 0x0, 0x50, 0xDD, 0x0, 0xD, 0x0, 0x58, 0xDD, 0x0, 0xD, 0x0, 0x60, 0xDD, 0x0, 0xD, 0x0, 0x68, 0xDD, 0x0, 0xD, 0x0, 0x70, 0xDD, 0x0, 0xD, 0x0, 0x78, 0xDD, 0x0, 0xD, 0x0, 0x80, 0xDD, 0x0, 0xD, 0x0, 0x88, 0xDD, 0x0, 0xD, 0x0, 0x90, 0xDD, 0x0, 0xD, 0x0, 0x98, 0xDD, 0x0, 0xD, 0x0, 0xA0, 0xDD, 0x0, 0xD, 0x0, 0xA8, 0xDD, 0x0, 0xD, 0x0, 0xB0, 0xDD, 0x0, 0xD, 0x0, 0xB8, 0xDD, 0x0, 0xD, 0x0, 0xC0, 0xDD, 0x0, 0xD, 0x0, 0xC8, 0xDD, 0x0, 0xD, 0x0, 0xD0, 0xDD, 0x0, 0xD, 0x0, 0xD8, 0xDD, 0x0, 0xD, 0x0, 0xE0, 0xDD, 0x0, 0xD, 0x0, 0xE8, 0xDD, 0x0, 0xD, 0x0, 0xF0, 0xDD, 0x0, 0xD, 0x0, 0xF8, 0xDD, 0x0, 0xD, 0x0, 0x0, 0xDE, 0x0, 0xD, 0x0, 0x8, 0xDE, 0x0, 0xD, 0x0, 0x10, 0xDE, 0x0, 0xD, 0x0, 0x18, 0xDE, 0x0, 0xD, 0x0, 0x20, 0xDE, 0x0, 0xD, 0x0, 0x28, 0xDE, 0x0, 0xD, 0x0, 0x30, 0xDE, 0x0, 0xD, 0x0, 0x38, 0xDE, 0x0, 0xD, 0x0, 0x40, 0xDE, 0x0, 0xD, 0x0, 0x48, 0xDE, 0x0, 0xD, 0x0, 0x50, 0xDE, 0x0, 0xD, 0x0, 0x58, 0xDE, 0x0, 0xD, 0x0, 0x60, 0xDE, 0x0, 0xD, 0x0, 0x68, 0xDE, 0x0, 0xD, 0x0, 0x70, 0xDE, 0x0, 0xD, 0x0, 0x78, 0xDE, 0x0, 0xD, 0x0, 0x80, 0xDE, 0x0, 0xD, 0x0, 0x88, 0xDE, 0x0, 0xD, 0x0, 0x90, 0xDE, 0x0, 0xD, 0x0, 0x98, 0xDE, 0x0, 0xD, 0x0, 0xA0, 0xDE, 0x0, 0xD, 0x0, 0xA8, 0xDE, 0x0, 0xD, 0x0, 0xB0, 0xDE, 0x0, 0xD, 0x0, 0xB8, 0xDE, 0x0, 0xD, 0x0, 0xC0, 0xDE, 0x0, 0xD, 0x0, 0xC8, 0xDE, 0x0, 0xD, 0x0, 0xD0, 0xDE, 0x0, 0xD, 0x0, 0xD8, 0xDE, 0x0, 0xD, 0x0, 0xE0, 0xDE, 0x0, 0xD, 0x0, 0xE8, 0xDE, 0x0, 0xD, 0x0, 0xF0, 0xDE, 0x0, 0xD, 0x0, 0xF8, 0xDE, 0x0, 0xD, 0x0, 0x0, 0xDF, 0x0, 0xD, 0x0, 0x8, 0xDF, 0x0, 0xD, 0x0, 0x10, 0xDF, 0x0, 0xD, 0x0, 0x18, 0xDF, 0x0, 0xD, 0x0, 0x20, 0xDF, 0x0, 0xD, 0x0, 0x28, 0xDF, 0x0, 0xD, 0x0, 0x30, 0xDF, 0x0, 0xD, 0x0, 0x38, 0xDF, 0x0, 0xD, 0x0, 0x40, 0xDF, 0x0, 0xD, 0x0, 0x48, 0xDF, 0x0, 0xD, 0x0, 0x50, 0xDF, 0x0, 0xD, 0x0, 0x58, 0xDF, 0x0, 0xD, 0x0, 0x60, 0xDF, 0x0, 0xD, 0x0, 0x68, 0xDF, 0x0, 0xD, 0x0, 0x70, 0xDF, 0x0, 0xD, 0x0, 0x78, 0xDF, 0x0, 0xD, 0x0, 0x80, 0xDF, 0x0, 0xD, 0x0, 0x88, 0xDF, 0x0, 0xD, 0x0, 0x90, 0xDF, 0x0, 0xD, 0x0, 0x98, 0xDF, 0x0, 0xD, 0x0, 0xA0, 0xDF, 0x0, 0xD, 0x0, 0xA8, 0xDF, 0x0, 0xD, 0x0, 0xB0, 0xDF, 0x0, 0xD, 0x0, 0xB8, 0xDF, 0x0, 0xD, 0x0, 0xC0, 0xDF, 0x0, 0xD, 0x0, 0xC8, 0xDF, 0x0, 0xD, 0x0, 0xD0, 0xDF, 0x0, 0xD, 0x0, 0xD8, 0xDF, 0x0, 0xD, 0x0, 0xE0, 0xDF, 0x0, 0xD, 0x0, 0xE8, 0xDF, 0x0, 0xD, 0x0, 0xF0, 0xDF, 0x0, 0xD, 0x0, 0xF8, 0xDF, 0x0, 0xD, 0x0, 0x0, 0xE0, 0x0, 0xD, 0x0, 0x8, 0xE0, 0x0, 0xD, 0x0, 0x10, 0xE0, 0x0, 0xD, 0x0, 0x18, 0xE0, 0x0, 0xD, 0x0, 0x20, 0xE0, 0x0, 0xD, 0x0, 0x28, 0xE0, 0x0, 0xD, 0x0, 0x30, 0xE0, 0x0, 0xD, 0x0, 0x38, 0xE0, 0x0, 0xD, 0x0, 0x40, 0xE0, 0x0, 0xD, 0x0, 0x48, 0xE0, 0x0, 0xD, 0x0, 0x50, 0xE0, 0x0, 0xD, 0x0, 0x58, 0xE0, 0x0, 0xD, 0x0, 0x60, 0xE0, 0x0, 0xD, 0x0, 0x68, 0xE0, 0x0, 0xD, 0x0, 0x70, 0xE0, 0x0, 0xD, 0x0, 0x78, 0xE0, 0x0, 0xD, 0x0, 0x80, 0xE0, 0x0, 0xD, 0x0, 0x88, 0xE0, 0x0, 0xD, 0x0, 0x90, 0xE0, 0x0, 0xD, 0x0, 0x98, 0xE0, 0x0, 0xD, 0x0, 0xA0, 0xE0, 0x0, 0xD, 0x0, 0xA8, 0xE0, 0x0, 0xD, 0x0, 0xB0, 0xE0, 0x0, 0xD, 0x0, 0xB8, 0xE0, 0x0, 0xD, 0x0, 0xC0, 0xE0, 0x0, 0xD, 0x0, 0xC8, 0xE0, 0x0, 0xD, 0x0, 0xD0, 0xE0, 0x0, 0xD, 0x0, 0xD8, 0xE0, 0x0, 0xD, 0x0, 0xE0, 0xE0, 0x0, 0xD, 0x0, 0xE8, 0xE0, 0x0, 0xD, 0x0, 0xF0, 0xE0, 0x0, 0xD, 0x0, 0xF8, 0xE0, 0x0, 0xD, 0x0, 0x0, 0xE1, 0x0, 0xD, 0x0, 0x8, 0xE1, 0x0, 0xD, 0x0, 0x10, 0xE1, 0x0, 0xD, 0x0, 0x18, 0xE1, 0x0, 0xD, 0x0, 0x20, 0xE1, 0x0, 0xD, 0x0, 0x28, 0xE1, 0x0, 0xD, 0x0, 0x30, 0xE1, 0x0, 0xD, 0x0, 0x38, 0xE1, 0x0, 0xD, 0x0, 0x40, 0xE1, 0x0, 0xD, 0x0, 0x48, 0xE1, 0x0, 0xD, 0x0, 0x50, 0xE1, 0x0, 0xD, 0x0, 0x58, 0xE1, 0x0, 0xD, 0x0, 0x60, 0xE1, 0x0, 0xD, 0x0, 0x68, 0xE1, 0x0, 0xD, 0x0, 0x70, 0xE1, 0x0, 0xD, 0x0, 0x78, 0xE1, 0x0, 0xD, 0x0, 0x80, 0xE1, 0x0, 0xD, 0x0, 0x88, 0xE1, 0x0, 0xD, 0x0, 0x90, 0xE1, 0x0, 0xD, 0x0, 0x98, 0xE1, 0x0, 0xD, 0x0, 0xA0, 0xE1, 0x0, 0xD, 0x0, 0xA8, 0xE1, 0x0, 0xD, 0x0, 0xB0, 0xE1, 0x0, 0xD, 0x0, 0xB8, 0xE1, 0x0, 0xD, 0x0, 0xC0, 0xE1, 0x0, 0xD, 0x0, 0xC8, 0xE1, 0x0, 0xD, 0x0, 0xD0, 0xE1, 0x0, 0xD, 0x0, 0xD8, 0xE1, 0x0, 0xD, 0x0, 0xE0, 0xE1, 0x0, 0xD, 0x0, 0xE8, 0xE1, 0x0, 0xD, 0x0, 0xF0, 0xE1, 0x0, 0xD, 0x0, 0xF8, 0xE1, 0x0, 0xD, 0x0, 0x0, 0xE2, 0x0, 0xD, 0x0, 0x8, 0xE2, 0x0, 0xD, 0x0, 0x10, 0xE2, 0x0, 0xD, 0x0, 0x18, 0xE2, 0x0, 0xD, 0x0, 0x20, 0xE2, 0x0, 0xD, 0x0, 0x28, 0xE2, 0x0, 0xD, 0x0, 0x30, 0xE2, 0x0, 0xD, 0x0, 0x38, 0xE2, 0x0, 0xD, 0x0, 0x40, 0xE2, 0x0, 0xD, 0x0, 0x48, 0xE2, 0x0, 0xD, 0x0, 0x50, 0xE2, 0x0, 0xD, 0x0, 0x58, 0xE2, 0x0, 0xD, 0x0, 0x60, 0xE2, 0x0, 0xD, 0x0, 0x68, 0xE2, 0x0, 0xD, 0x0, 0x70, 0xE2, 0x0, 0xD, 0x0, 0x78, 0xE2, 0x0, 0xD, 0x0, 0x80, 0xE2, 0x0, 0xD, 0x0, 0x88, 0xE2, 0x0, 0xD, 0x0, 0x90, 0xE2, 0x0, 0xD, 0x0, 0x98, 0xE2, 0x0, 0xD, 0x0, 0xA0, 0xE2, 0x0, 0xD, 0x0, 0xA8, 0xE2, 0x0, 0xD, 0x0, 0xB0, 0xE2, 0x0, 0xD, 0x0, 0xB8, 0xE2, 0x0, 0xD, 0x0, 0xC0, 0xE2, 0x0, 0xD, 0x0, 0xC8, 0xE2, 0x0, 0xD, 0x0, 0xD0, 0xE2, 0x0, 0xD, 0x0, 0xD8, 0xE2, 0x0, 0xD, 0x0, 0xE0, 0xE2, 0x0, 0xD, 0x0, 0xE8, 0xE2, 0x0, 0xD, 0x0, 0xF0, 0xE2, 0x0, 0xD, 0x0, 0xF8, 0xE2, 0x0, 0xD, 0x0, 0x0, 0xE3, 0x0, 0xD, 0x0, 0x8, 0xE3, 0x0, 0xD, 0x0, 0x10, 0xE3, 0x0, 0xD, 0x0, 0x18, 0xE3, 0x0, 0xD, 0x0, 0x20, 0xE3, 0x0, 0xD, 0x0, 0x28, 0xE3, 0x0, 0xD, 0x0, 0x30, 0xE3, 0x0, 0xD, 0x0, 0x38, 0xE3, 0x0, 0xD, 0x0, 0x40, 0xE3, 0x0, 0xD, 0x0, 0x48, 0xE3, 0x0, 0xD, 0x0, 0x50, 0xE3, 0x0, 0xD, 0x0, 0x58, 0xE3, 0x0, 0xD, 0x0, 0x60, 0xE3, 0x0, 0xD, 0x0, 0x68, 0xE3, 0x0, 0xD, 0x0, 0x70, 0xE3, 0x0, 0xD, 0x0, 0x78, 0xE3, 0x0, 0xD, 0x0, 0x80, 0xE3, 0x0, 0xD, 0x0, 0x88, 0xE3, 0x0, 0xD, 0x0, 0x90, 0xE3, 0x0, 0xD, 0x0, 0x98, 0xE3, 0x0, 0xD, 0x0, 0xA0, 0xE3, 0x0, 0xD, 0x0, 0xA8, 0xE3, 0x0, 0xD, 0x0, 0xB0, 0xE3, 0x0, 0xD, 0x0, 0xB8, 0xE3, 0x0, 0xD, 0x0, 0xC0, 0xE3, 0x0, 0xD, 0x0, 0xC8, 0xE3, 0x0, 0xD, 0x0, 0xD0, 0xE3, 0x0, 0xD, 0x0, 0xD8, 0xE3, 0x0, 0xD, 0x0, 0xE0, 0xE3, 0x0, 0xD, 0x0, 0xE8, 0xE3, 0x0, 0xD, 0x0, 0xF0, 0xE3, 0x0, 0xD, 0x0, 0xF8, 0xE3, 0x0, 0xD, 0x0, 0x0, 0xE4, 0x0, 0xD, 0x0, 0x8, 0xE4, 0x0, 0xD, 0x0, 0x10, 0xE4, 0x0, 0xD, 0x0, 0x18, 0xE4, 0x0, 0xD, 0x0, 0x20, 0xE4, 0x0, 0xD, 0x0, 0x28, 0xE4, 0x0, 0xD, 0x0, 0x30, 0xE4, 0x0, 0xD, 0x0, 0x38, 0xE4, 0x0, 0xD, 0x0, 0x40, 0xE4, 0x0, 0xD, 0x0, 0x48, 0xE4, 0x0, 0xD, 0x0, 0x50, 0xE4, 0x0, 0xD, 0x0, 0x58, 0xE4, 0x0, 0xD, 0x0, 0x60, 0xE4, 0x0, 0xD, 0x0, 0x68, 0xE4, 0x0, 0xD, 0x0, 0x70, 0xE4, 0x0, 0xD, 0x0, 0x78, 0xE4, 0x0, 0xD, 0x0, 0x80, 0xE4, 0x0, 0xD, 0x0, 0x88, 0xE4, 0x0, 0xD, 0x0, 0x90, 0xE4, 0x0, 0xD, 0x0, 0x98, 0xE4, 0x0, 0xD, 0x0, 0xA0, 0xE4, 0x0, 0xD, 0x0, 0xA8, 0xE4, 0x0, 0xD, 0x0, 0xB0, 0xE4, 0x0, 0xD, 0x0, 0xB8, 0xE4, 0x0, 0xD, 0x0, 0xC0, 0xE4, 0x0, 0xD, 0x0, 0xC8, 0xE4, 0x0, 0xD, 0x0, 0xD0, 0xE4, 0x0, 0xD, 0x0, 0xD8, 0xE4, 0x0, 0xD, 0x0, 0xE0, 0xE4, 0x0, 0xD, 0x0, 0xE8, 0xE4, 0x0, 0xD, 0x0, 0xF0, 0xE4, 0x0, 0xD, 0x0, 0xF8, 0xE4, 0x0, 0xD, 0x0, 0x0, 0xE5, 0x0, 0xD, 0x0, 0x8, 0xE5, 0x0, 0xD, 0x0, 0x10, 0xE5, 0x0, 0xD, 0x0, 0x18, 0xE5, 0x0, 0xD, 0x0, 0x20, 0xE5, 0x0, 0xD, 0x0, 0x28, 0xE5, 0x0, 0xD, 0x0, 0x30, 0xE5, 0x0, 0xD, 0x0, 0x38, 0xE5, 0x0, 0xD, 0x0, 0x40, 0xE5, 0x0, 0xD, 0x0, 0x48, 0xE5, 0x0, 0xD, 0x0, 0x50, 0xE5, 0x0, 0xD, 0x0, 0x58, 0xE5, 0x0, 0xD, 0x0, 0x60, 0xE5, 0x0, 0xD, 0x0, 0x68, 0xE5, 0x0, 0xD, 0x0, 0x70, 0xE5, 0x0, 0xD, 0x0, 0x78, 0xE5, 0x0, 0xD, 0x0, 0x80, 0xE5, 0x0, 0xD, 0x0, 0x88, 0xE5, 0x0, 0xD, 0x0, 0x90, 0xE5, 0x0, 0xD, 0x0, 0x98, 0xE5, 0x0, 0xD, 0x0, 0xA0, 0xE5, 0x0, 0xD, 0x0, 0xA8, 0xE5, 0x0, 0xD, 0x0, 0xB0, 0xE5, 0x0, 0xD, 0x0, 0xB8, 0xE5, 0x0, 0xD, 0x0, 0xC0, 0xE5, 0x0, 0xD, 0x0, 0xC8, 0xE5, 0x0, 0xD, 0x0, 0xD0, 0xE5, 0x0, 0xD, 0x0, 0xD8, 0xE5, 0x0, 0xD, 0x0, 0xE0, 0xE5, 0x0, 0xD, 0x0, 0xE8, 0xE5, 0x0, 0xD, 0x0, 0xF0, 0xE5, 0x0, 0xD, 0x0, 0xF8, 0xE5, 0x0, 0xD, 0x0, 0x0, 0xE6, 0x0, 0xD, 0x0, 0x8, 0xE6, 0x0, 0xD, 0x0, 0x10, 0xE6, 0x0, 0xD, 0x0, 0x18, 0xE6, 0x0, 0xD, 0x0, 0x20, 0xE6, 0x0, 0xD, 0x0, 0x28, 0xE6, 0x0, 0xD, 0x0, 0x30, 0xE6, 0x0, 0xD, 0x0, 0x38, 0xE6, 0x0, 0xD, 0x0, 0x40, 0xE6, 0x0, 0xD, 0x0, 0x48, 0xE6, 0x0, 0xD, 0x0, 0x50, 0xE6, 0x0, 0xD, 0x0, 0x58, 0xE6, 0x0, 0xD, 0x0, 0x60, 0xE6, 0x0, 0xD, 0x0, 0x68, 0xE6, 0x0, 0xD, 0x0, 0x70, 0xE6, 0x0, 0xD, 0x0, 0x78, 0xE6, 0x0, 0xD, 0x0, 0x80, 0xE6, 0x0, 0xD, 0x0, 0x88, 0xE6, 0x0, 0xD, 0x0, 0x90, 0xE6, 0x0, 0xD, 0x0, 0x98, 0xE6, 0x0, 0xD, 0x0, 0xA0, 0xE6, 0x0, 0xD, 0x0, 0xA8, 0xE6, 0x0, 0xD, 0x0, 0xB0, 0xE6, 0x0, 0xD, 0x0, 0xB8, 0xE6, 0x0, 0xD, 0x0, 0xC0, 0xE6, 0x0, 0xD, 0x0, 0xC8, 0xE6, 0x0, 0xD, 0x0, 0xD0, 0xE6, 0x0, 0xD, 0x0, 0xD8, 0xE6, 0x0, 0xD, 0x0, 0xE0, 0xE6, 0x0, 0xD, 0x0, 0xE8, 0xE6, 0x0, 0xD, 0x0, 0xF0, 0xE6, 0x0, 0xD, 0x0, 0xF8, 0xE6, 0x0, 0xD, 0x0, 0x0, 0xE7, 0x0, 0xD, 0x0, 0x8, 0xE7, 0x0, 0xD, 0x0, 0x10, 0xE7, 0x0, 0xD, 0x0, 0x18, 0xE7, 0x0, 0xD, 0x0, 0x20, 0xE7, 0x0, 0xD, 0x0, 0x28, 0xE7, 0x0, 0xD, 0x0, 0x30, 0xE7, 0x0, 0xD, 0x0, 0x38, 0xE7, 0x0, 0xD, 0x0, 0x40, 0xE7, 0x0, 0xD, 0x0, 0x48, 0xE7, 0x0, 0xD, 0x0, 0x50, 0xE7, 0x0, 0xD, 0x0, 0x58, 0xE7, 0x0, 0xD, 0x0, 0x60, 0xE7, 0x0, 0xD, 0x0, 0x68, 0xE7, 0x0, 0xD, 0x0, 0x70, 0xE7, 0x0, 0xD, 0x0, 0x78, 0xE7, 0x0, 0xD, 0x0, 0x80, 0xE7, 0x0, 0xD, 0x0, 0x88, 0xE7, 0x0, 0xD, 0x0, 0x90, 0xE7, 0x0, 0xD, 0x0, 0x98, 0xE7, 0x0, 0xD, 0x0, 0xA0, 0xE7, 0x0, 0xD, 0x0, 0xA8, 0xE7, 0x0, 0xD, 0x0, 0xB0, 0xE7, 0x0, 0xD, 0x0, 0xB8, 0xE7, 0x0, 0xD, 0x0, 0xC0, 0xE7, 0x0, 0xD, 0x0, 0xC8, 0xE7, 0x0, 0xD, 0x0, 0xD0, 0xE7, 0x0, 0xD, 0x0, 0xD8, 0xE7, 0x0, 0xD, 0x0, 0xE0, 0xE7, 0x0, 0xD, 0x0, 0xE8, 0xE7, 0x0, 0xD, 0x0, 0xF0, 0xE7, 0x0, 0xD, 0x0, 0xF8, 0xE7, 0x0, 0xD, 0x0, 0x0, 0xE8, 0x0, 0xD, 0x0, 0x8, 0xE8, 0x0, 0xD, 0x0, 0x10, 0xE8, 0x0, 0xD, 0x0, 0x18, 0xE8, 0x0, 0xD, 0x0, 0x20, 0xE8, 0x0, 0xD, 0x0, 0x28, 0xE8, 0x0, 0xD, 0x0, 0x30, 0xE8, 0x0, 0xD, 0x0, 0x38, 0xE8, 0x0, 0xD, 0x0, 0x40, 0xE8, 0x0, 0xD, 0x0, 0x48, 0xE8, 0x0, 0xD, 0x0, 0x50, 0xE8, 0x0, 0xD, 0x0, 0x58, 0xE8, 0x0, 0xD, 0x0, 0x60, 0xE8, 0x0, 0xD, 0x0, 0x68, 0xE8, 0x0, 0xD, 0x0, 0x70, 0xE8, 0x0, 0xD, 0x0, 0x78, 0xE8, 0x0, 0xD, 0x0, 0x80, 0xE8, 0x0, 0xD, 0x0, 0x88, 0xE8, 0x0, 0xD, 0x0, 0x90, 0xE8, 0x0, 0xD, 0x0, 0x98, 0xE8, 0x0, 0xD, 0x0, 0xA0, 0xE8, 0x0, 0xD, 0x0, 0xA8, 0xE8, 0x0, 0xD, 0x0, 0xB0, 0xE8, 0x0, 0xD, 0x0, 0xB8, 0xE8, 0x0, 0xD, 0x0, 0xC0, 0xE8, 0x0, 0xD, 0x0, 0xC8, 0xE8, 0x0, 0xD, 0x0, 0xD0, 0xE8, 0x0, 0xD, 0x0, 0xD8, 0xE8, 0x0, 0xD, 0x0, 0xE0, 0xE8, 0x0, 0xD, 0x0, 0xE8, 0xE8, 0x0, 0xD, 0x0, 0xF0, 0xE8, 0x0, 0xD, 0x0, 0xF8, 0xE8, 0x0, 0xD, 0x0, 0x0, 0xE9, 0x0, 0xD, 0x0, 0x8, 0xE9, 0x0, 0xD, 0x0, 0x10, 0xE9, 0x0, 0xD, 0x0, 0x18, 0xE9, 0x0, 0xD, 0x0, 0x20, 0xE9, 0x0, 0xD, 0x0, 0x28, 0xE9, 0x0, 0xD, 0x0, 0x30, 0xE9, 0x0, 0xD, 0x0, 0x38, 0xE9, 0x0, 0xD, 0x0, 0x40, 0xE9, 0x0, 0xD, 0x0, 0x48, 0xE9, 0x0, 0xD, 0x0, 0x50, 0xE9, 0x0, 0xD, 0x0, 0x58, 0xE9, 0x0, 0xD, 0x0, 0x60, 0xE9, 0x0, 0xD, 0x0, 0x68, 0xE9, 0x0, 0xD, 0x0, 0x70, 0xE9, 0x0, 0xD, 0x0, 0x78, 0xE9, 0x0, 0xD, 0x0, 0x80, 0xE9, 0x0, 0xD, 0x0, 0x88, 0xE9, 0x0, 0xD, 0x0, 0x90, 0xE9, 0x0, 0xD, 0x0, 0x98, 0xE9, 0x0, 0xD, 0x0, 0xA0, 0xE9, 0x0, 0xD, 0x0, 0xA8, 0xE9, 0x0, 0xD, 0x0, 0xB0, 0xE9, 0x0, 0xD, 0x0, 0xB8, 0xE9, 0x0, 0xD, 0x0, 0xC0, 0xE9, 0x0, 0xD, 0x0, 0xC8, 0xE9, 0x0, 0xD, 0x0, 0xD0, 0xE9, 0x0, 0xD, 0x0, 0xD8, 0xE9, 0x0, 0xD, 0x0, 0xE0, 0xE9, 0x0, 0xD, 0x0, 0xE8, 0xE9, 0x0, 0xD, 0x0, 0xF0, 0xE9, 0x0, 0xD, 0x0, 0xF8, 0xE9, 0x0, 0xD, 0x0, 0x0, 0xEA, 0x0, 0xD, 0x0, 0x8, 0xEA, 0x0, 0xD, 0x0, 0x10, 0xEA, 0x0, 0xD, 0x0, 0x18, 0xEA, 0x0, 0xD, 0x0, 0x20, 0xEA, 0x0, 0xD, 0x0, 0x28, 0xEA, 0x0, 0xD, 0x0, 0x30, 0xEA, 0x0, 0xD, 0x0, 0x38, 0xEA, 0x0, 0xD, 0x0, 0x40, 0xEA, 0x0, 0xD, 0x0, 0x48, 0xEA, 0x0, 0xD, 0x0, 0x50, 0xEA, 0x0, 0xD, 0x0, 0x58, 0xEA, 0x0, 0xD, 0x0, 0x60, 0xEA, 0x0, 0xD, 0x0, 0x68, 0xEA, 0x0, 0xD, 0x0, 0x70, 0xEA, 0x0, 0xD, 0x0, 0x78, 0xEA, 0x0, 0xD, 0x0, 0x80, 0xEA, 0x0, 0xD, 0x0, 0x88, 0xEA, 0x0, 0xD, 0x0, 0x90, 0xEA, 0x0, 0xD, 0x0, 0x98, 0xEA, 0x0, 0xD, 0x0, 0xA0, 0xEA, 0x0, 0xD, 0x0, 0xA8, 0xEA, 0x0, 0xD, 0x0, 0xB0, 0xEA, 0x0, 0xD, 0x0, 0xB8, 0xEA, 0x0, 0xD, 0x0, 0xC0, 0xEA, 0x0, 0xD, 0x0, 0xC8, 0xEA, 0x0, 0xD, 0x0, 0xD0, 0xEA, 0x0, 0xD, 0x0, 0xD8, 0xEA, 0x0, 0xD, 0x0, 0xE0, 0xEA, 0x0, 0xD, 0x0, 0xE8, 0xEA, 0x0, 0xD, 0x0, 0xF0, 0xEA, 0x0, 0xD, 0x0, 0xF8, 0xEA, 0x0, 0xD, 0x0, 0x0, 0xEB, 0x0, 0xD, 0x0, 0x8, 0xEB, 0x0, 0xD, 0x0, 0x10, 0xEB, 0x0, 0xD, 0x0, 0x18, 0xEB, 0x0, 0xD, 0x0, 0x20, 0xEB, 0x0, 0xD, 0x0, 0x28, 0xEB, 0x0, 0xD, 0x0, 0x30, 0xEB, 0x0, 0xD, 0x0, 0x38, 0xEB, 0x0, 0xD, 0x0, 0x40, 0xEB, 0x0, 0xD, 0x0, 0x48, 0xEB, 0x0, 0xD, 0x0, 0x50, 0xEB, 0x0, 0xD, 0x0, 0x58, 0xEB, 0x0, 0xD, 0x0, 0x60, 0xEB, 0x0, 0xD, 0x0, 0x68, 0xEB, 0x0, 0xD, 0x0, 0x70, 0xEB, 0x0, 0xD, 0x0, 0x78, 0xEB, 0x0, 0xD, 0x0, 0x80, 0xEB, 0x0, 0xD, 0x0, 0x88, 0xEB, 0x0, 0xD, 0x0, 0x90, 0xEB, 0x0, 0xD, 0x0, 0x98, 0xEB, 0x0, 0xD, 0x0, 0xA0, 0xEB, 0x0, 0xD, 0x0, 0xA8, 0xEB, 0x0, 0xD, 0x0, 0xB0, 0xEB, 0x0, 0xD, 0x0, 0xB8, 0xEB, 0x0, 0xD, 0x0, 0xC0, 0xEB, 0x0, 0xD, 0x0, 0xC8, 0xEB, 0x0, 0xD, 0x0, 0xD0, 0xEB, 0x0, 0xD, 0x0, 0xD8, 0xEB, 0x0, 0xD, 0x0, 0xE0, 0xEB, 0x0, 0xD, 0x0, 0xE8, 0xEB, 0x0, 0xD, 0x0, 0xF0, 0xEB, 0x0, 0xD, 0x0, 0xF8, 0xEB, 0x0, 0xD, 0x0, 0x0, 0xEC, 0x0, 0xD, 0x0, 0x8, 0xEC, 0x0, 0xD, 0x0, 0x10, 0xEC, 0x0, 0xD, 0x0, 0x18, 0xEC, 0x0, 0xD, 0x0, 0x20, 0xEC, 0x0, 0xD, 0x0, 0x28, 0xEC, 0x0, 0xD, 0x0, 0x30, 0xEC, 0x0, 0xD, 0x0, 0x38, 0xEC, 0x0, 0xD, 0x0, 0x40, 0xEC, 0x0, 0xD, 0x0, 0x48, 0xEC, 0x0, 0xD, 0x0, 0x50, 0xEC, 0x0, 0xD, 0x0, 0x58, 0xEC, 0x0, 0xD, 0x0, 0x60, 0xEC, 0x0, 0xD, 0x0, 0x68, 0xEC, 0x0, 0xD, 0x0, 0x70, 0xEC, 0x0, 0xD, 0x0, 0x78, 0xEC, 0x0, 0xD, 0x0, 0x80, 0xEC, 0x0, 0xD, 0x0, 0x88, 0xEC, 0x0, 0xD, 0x0, 0x90, 0xEC, 0x0, 0xD, 0x0, 0x98, 0xEC, 0x0, 0xD, 0x0, 0xA0, 0xEC, 0x0, 0xD, 0x0, 0xA8, 0xEC, 0x0, 0xD, 0x0, 0xB0, 0xEC, 0x0, 0xD, 0x0, 0xB8, 0xEC, 0x0, 0xD, 0x0, 0xC0, 0xEC, 0x0, 0xD, 0x0, 0xC8, 0xEC, 0x0, 0xD, 0x0, 0xD0, 0xEC, 0x0, 0xD, 0x0, 0xD8, 0xEC, 0x0, 0xD, 0x0, 0xE0, 0xEC, 0x0, 0xD, 0x0, 0xE8, 0xEC, 0x0, 0xD, 0x0, 0xF0, 0xEC, 0x0, 0xD, 0x0, 0xF8, 0xEC, 0x0, 0xD, 0x0, 0x0, 0xED, 0x0, 0xD, 0x0, 0x8, 0xED, 0x0, 0xD, 0x0, 0x10, 0xED, 0x0, 0xD, 0x0, 0x18, 0xED, 0x0, 0xD, 0x0, 0x20, 0xED, 0x0, 0xD, 0x0, 0x28, 0xED, 0x0, 0xD, 0x0, 0x30, 0xED, 0x0, 0xD, 0x0, 0x38, 0xED, 0x0, 0xD, 0x0, 0x40, 0xED, 0x0, 0xD, 0x0, 0x48, 0xED, 0x0, 0xD, 0x0, 0x50, 0xED, 0x0, 0xD, 0x0, 0x58, 0xED, 0x0, 0xD, 0x0, 0x60, 0xED, 0x0, 0xD, 0x0, 0x68, 0xED, 0x0, 0xD, 0x0, 0x70, 0xED, 0x0, 0xD, 0x0, 0x78, 0xED, 0x0, 0xD, 0x0, 0x80, 0xED, 0x0, 0xD, 0x0, 0x88, 0xED, 0x0, 0xD, 0x0, 0x90, 0xED, 0x0, 0xD, 0x0, 0x98, 0xED, 0x0, 0xD, 0x0, 0xA0, 0xED, 0x0, 0xD, 0x0, 0xA8, 0xED, 0x0, 0xD, 0x0, 0xB0, 0xED, 0x0, 0xD, 0x0, 0xB8, 0xED, 0x0, 0xD, 0x0, 0xC0, 0xED, 0x0, 0xD, 0x0, 0xC8, 0xED, 0x0, 0xD, 0x0, 0xD0, 0xED, 0x0, 0xD, 0x0, 0xD8, 0xED, 0x0, 0xD, 0x0, 0xE0, 0xED, 0x0, 0xD, 0x0, 0xE8, 0xED, 0x0, 0xD, 0x0, 0xF0, 0xED, 0x0, 0xD, 0x0, 0xF8, 0xED, 0x0, 0xD, 0x0, 0x0, 0xEE, 0x0, 0xD, 0x0, 0x8, 0xEE, 0x0, 0xD, 0x0, 0x10, 0xEE, 0x0, 0xD, 0x0, 0x18, 0xEE, 0x0, 0xD, 0x0, 0x20, 0xEE, 0x0, 0xD, 0x0, 0x28, 0xEE, 0x0, 0xD, 0x0, 0x30, 0xEE, 0x0, 0xD, 0x0, 0x38, 0xEE, 0x0, 0xD, 0x0, 0x40, 0xEE, 0x0, 0xD, 0x0, 0x48, 0xEE, 0x0, 0xD, 0x0, 0x50, 0xEE, 0x0, 0xD, 0x0, 0x58, 0xEE, 0x0, 0xD, 0x0, 0x60, 0xEE, 0x0, 0xD, 0x0, 0x68, 0xEE, 0x0, 0xD, 0x0, 0x70, 0xEE, 0x0, 0xD, 0x0, 0x78, 0xEE, 0x0, 0xD, 0x0, 0x80, 0xEE, 0x0, 0xD, 0x0, 0x88, 0xEE, 0x0, 0xD, 0x0, 0x90, 0xEE, 0x0, 0xD, 0x0, 0x98, 0xEE, 0x0, 0xD, 0x0, 0xA0, 0xEE, 0x0, 0xD, 0x0, 0xA8, 0xEE, 0x0, 0xD, 0x0, 0xB0, 0xEE, 0x0, 0xD, 0x0, 0xB8, 0xEE, 0x0, 0xD, 0x0, 0xC0, 0xEE, 0x0, 0xD, 0x0, 0xC8, 0xEE, 0x0, 0xD, 0x0, 0xD0, 0xEE, 0x0, 0xD, 0x0, 0xD8, 0xEE, 0x0, 0xD, 0x0, 0xE0, 0xEE, 0x0, 0xD, 0x0, 0xE8, 0xEE, 0x0, 0xD, 0x0, 0xF0, 0xEE, 0x0, 0xD, 0x0, 0xF8, 0xEE, 0x0, 0xD, 0x0, 0x0, 0xEF, 0x0, 0xD, 0x0, 0x8, 0xEF, 0x0, 0xD, 0x0, 0x10, 0xEF, 0x0, 0xD, 0x0, 0x18, 0xEF, 0x0, 0xD, 0x0, 0x20, 0xEF, 0x0, 0xD, 0x0, 0x28, 0xEF, 0x0, 0xD, 0x0, 0x30, 0xEF, 0x0, 0xD, 0x0, 0x38, 0xEF, 0x0, 0xD, 0x0, 0x40, 0xEF, 0x0, 0xD, 0x0, 0x48, 0xEF, 0x0, 0xD, 0x0, 0x50, 0xEF, 0x0, 0xD, 0x0, 0x58, 0xEF, 0x0, 0xD, 0x0, 0x60, 0xEF, 0x0, 0xD, 0x0, 0x68, 0xEF, 0x0, 0xD, 0x0, 0x70, 0xEF, 0x0, 0xD, 0x0, 0x78, 0xEF, 0x0, 0xD, 0x0, 0x80, 0xEF, 0x0, 0xD, 0x0, 0x88, 0xEF, 0x0, 0xD, 0x0, 0x90, 0xEF, 0x0, 0xD, 0x0, 0x98, 0xEF, 0x0, 0xD, 0x0, 0xA0, 0xEF, 0x0, 0xD, 0x0, 0xA8, 0xEF, 0x0, 0xD, 0x0, 0xB0, 0xEF, 0x0, 0xD, 0x0, 0xB8, 0xEF, 0x0, 0xD, 0x0, 0xC0, 0xEF, 0x0, 0xD, 0x0, 0xC8, 0xEF, 0x0, 0xD, 0x0, 0xD0, 0xEF, 0x0, 0xD, 0x0, 0xD8, 0xEF, 0x0, 0xD, 0x0, 0xE0, 0xEF, 0x0, 0xD, 0x0, 0xE8, 0xEF, 0x0, 0xD, 0x0, 0xF0, 0xEF, 0x0, 0xD, 0x0, 0xF8, 0xEF, 0x0, 0xD, 0x0, 0x0, 0xF0, 0x0, 0xD, 0x0, 0x8, 0xF0, 0x0, 0xD, 0x0, 0x10, 0xF0, 0x0, 0xD, 0x0, 0x18, 0xF0, 0x0, 0x8E, 0xC0, 0x3, 0x0, 0x0, 0xAE, 0xC0, 0x3, 0x0, 0x0, 0xCE, 0xC0, 0x3, 0x0, 0x0, 0xEE, 0xC0, 0x3, 0x0, 0x0, 0xE, 0xC1, 0x3, 0x0, 0x0, 0x2E, 0xC1, 0x3, 0x0, 0x0, 0x4E, 0xC1, 0x3, 0x0, 0x0, 0x6E, 0xC1, 0x3, 0x0, 0x0, 0x8E, 0xC1, 0x3, 0x0, 0x0, 0xAE, 0xC1, 0x3, 0x0, 0x0, 0xCE, 0xC1, 0x3, 0x0, 0x0, 0xEE, 0xC1, 0x3, 0x0, 0x0, 0xE, 0xC2, 0x3, 0x0, 0x0, 0x2E, 0xC2, 0x3, 0x0, 0x0, 0x4E, 0xC2, 0x3, 0x0, 0x0, 0x6E, 0xC2, 0x3, 0x0, 0x0, 0x8E, 0xC2, 0x3, 0x0, 0x0, 0xAE, 0xC2, 0x3, 0x0, 0x0, 0xCE, 0xC2, 0x3, 0x0, 0x0, 0xEE, 0xC2, 0x3, 0x0, 0x0, 0xE, 0xC3, 0x3, 0x0, 0x0, 0x2E, 0xC3, 0x3, 0x0, 0x0, 0x4E, 0xC3, 0x3, 0x0, 0x0, 0x6E, 0xC3, 0x3, 0x0, 0x0, 0x8E, 0xC3, 0x3, 0x0, 0x0, 0xAE, 0xC3, 0x3, 0x0, 0x0, 0xE, 0x0, 0xF0, 0xF0, 0x0, 0xE, 0x0, 0xF8, 0xF0, 0x0, 0xE, 0x0, 0x0, 0xF1, 0x0, 0xE, 0x0, 0x8, 0xF1, 0x0, 0xE, 0x0, 0x10, 0xF1, 0x0, 0xE, 0x0, 0x18, 0xF1, 0x0, 0xE, 0x0, 0x20, 0xF1, 0x0, 0xE, 0x0, 0x28, 0xF1, 0x0, 0xE, 0x0, 0x30, 0xF1, 0x0, 0xE, 0x0, 0x38, 0xF1, 0x0, 0xE, 0x0, 0x40, 0xF1, 0x0, 0xE, 0x0, 0x48, 0xF1, 0x0, 0xE, 0x0, 0x50, 0xF1, 0x0, 0xE, 0x0, 0x58, 0xF1, 0x0, 0xE, 0x0, 0x60, 0xF1, 0x0, 0xE, 0x0, 0x68, 0xF1, 0x0, 0xE, 0x0, 0x70, 0xF1, 0x0, 0xE, 0x0, 0x78, 0xF1, 0x0, 0xE, 0x0, 0x80, 0xF1, 0x0, 0xE, 0x0, 0x88, 0xF1, 0x0, 0xE, 0x0, 0x90, 0xF1, 0x0, 0xE, 0x0, 0x98, 0xF1, 0x0, 0xE, 0x0, 0xA0, 0xF1, 0x0, 0xE, 0x0, 0xA8, 0xF1, 0x0, 0xE, 0x0, 0xB0, 0xF1, 0x0, 0xE, 0x0, 0xB8, 0xF1, 0x0, 0xE, 0x0, 0xC0, 0xF1, 0x0, 0xE, 0x0, 0xC8, 0xF1, 0x0, 0xE, 0x0, 0xD0, 0xF1, 0x0, 0xE, 0x0, 0xD8, 0xF1, 0x0, 0xE, 0x0, 0xE0, 0xF1, 0x0, 0xE, 0x0, 0xE8, 0xF1, 0x0, 0xE, 0x0, 0xF0, 0xF1, 0x0, 0xE, 0x0, 0xF8, 0xF1, 0x0, 0xE, 0x0, 0x0, 0xF2, 0x0, 0xE, 0x0, 0x8, 0xF2, 0x0, 0xE, 0x0, 0x10, 0xF2, 0x0, 0xE, 0x0, 0x18, 0xF2, 0x0, 0xE, 0x0, 0x20, 0xF2, 0x0, 0xE, 0x0, 0x28, 0xF2, 0x0, 0xE, 0x0, 0x30, 0xF2, 0x0, 0xE, 0x0, 0x38, 0xF2, 0x0, 0xE, 0x0, 0x40, 0xF2, 0x0, 0xE, 0x0, 0x48, 0xF2, 0x0, 0xE, 0x0, 0x50, 0xF2, 0x0, 0xE, 0x0, 0x58, 0xF2, 0x0, 0xE, 0x0, 0x60, 0xF2, 0x0, 0xE, 0x0, 0x68, 0xF2, 0x0, 0xE, 0x0, 0x70, 0xF2, 0x0, 0xE, 0x0, 0x78, 0xF2, 0x0, 0xE, 0x0, 0x80, 0xF2, 0x0, 0xE, 0x0, 0x88, 0xF2, 0x0, 0xE, 0x0, 0x90, 0xF2, 0x0, 0xE, 0x0, 0x98, 0xF2, 0x0, 0xE, 0x0, 0xA0, 0xF2, 0x0, 0xE, 0x0, 0xA8, 0xF2, 0x0, 0xE, 0x0, 0xB0, 0xF2, 0x0, 0xE, 0x0, 0xB8, 0xF2, 0x0, 0xE, 0x0, 0xC0, 0xF2, 0x0, 0xE, 0x0, 0xC8, 0xF2, 0x0, 0xE, 0x0, 0xD0, 0xF2, 0x0, 0xE, 0x0, 0xD8, 0xF2, 0x0, 0xE, 0x0, 0xE0, 0xF2, 0x0, 0xE, 0x0, 0xE8, 0xF2, 0x0, 0xE, 0x0, 0xF0, 0xF2, 0x0, 0xE, 0x0, 0xF8, 0xF2, 0x0, 0xE, 0x0, 0x0, 0xF3, 0x0, 0xE, 0x0, 0x8, 0xF3, 0x0, 0xE, 0x0, 0x10, 0xF3, 0x0, 0xE, 0x0, 0x18, 0xF3, 0x0, 0xE, 0x0, 0x20, 0xF3, 0x0, 0xE, 0x0, 0x28, 0xF3, 0x0, 0xE, 0x0, 0x30, 0xF3, 0x0, 0xE, 0x0, 0x38, 0xF3, 0x0, 0xE, 0x0, 0x40, 0xF3, 0x0, 0xE, 0x0, 0x48, 0xF3, 0x0, 0xE, 0x0, 0x50, 0xF3, 0x0, 0xE, 0x0, 0x58, 0xF3, 0x0, 0xE, 0x0, 0x60, 0xF3, 0x0, 0xE, 0x0, 0x68, 0xF3, 0x0, 0xE, 0x0, 0x70, 0xF3, 0x0, 0xE, 0x0, 0x78, 0xF3, 0x0, 0xE, 0x0, 0x80, 0xF3, 0x0, 0xE, 0x0, 0x88, 0xF3, 0x0, 0xE, 0x0, 0x90, 0xF3, 0x0, 0xE, 0x0, 0x98, 0xF3, 0x0, 0xE, 0x0, 0xA0, 0xF3, 0x0, 0xE, 0x0, 0xA8, 0xF3, 0x0, 0xE, 0x0, 0xB0, 0xF3, 0x0, 0xE, 0x0, 0xB8, 0xF3, 0x0, 0xE, 0x0, 0xC0, 0xF3, 0x0, 0xE, 0x0, 0xC8, 0xF3, 0x0, 0xE, 0x0, 0xD0, 0xF3, 0x0, 0xE, 0x0, 0xD8, 0xF3, 0x0, 0xE, 0x0, 0xE0, 0xF3, 0x0, 0xE, 0x0, 0xE8, 0xF3, 0x0, 0xE, 0x0, 0xF0, 0xF3, 0x0, 0xE, 0x0, 0xF8, 0xF3, 0x0, 0xE, 0x0, 0x0, 0xF4, 0x0, 0xE, 0x0, 0x8, 0xF4, 0x0, 0xE, 0x0, 0x10, 0xF4, 0x0, 0xE, 0x0, 0x18, 0xF4, 0x0, 0xE, 0x0, 0x20, 0xF4, 0x0, 0xE, 0x0, 0x28, 0xF4, 0x0, 0xE, 0x0, 0x30, 0xF4, 0x0, 0xE, 0x0, 0x38, 0xF4, 0x0, 0xE, 0x0, 0x40, 0xF4, 0x0, 0xE, 0x0, 0x48, 0xF4, 0x0, 0xE, 0x0, 0x50, 0xF4, 0x0, 0xE, 0x0, 0x58, 0xF4, 0x0, 0xE, 0x0, 0x60, 0xF4, 0x0, 0xE, 0x0, 0x68, 0xF4, 0x0, 0xE, 0x0, 0x70, 0xF4, 0x0, 0xE, 0x0, 0x78, 0xF4, 0x0, 0xE, 0x0, 0x80, 0xF4, 0x0, 0xE, 0x0, 0x88, 0xF4, 0x0, 0xE, 0x0, 0x90, 0xF4, 0x0, 0xE, 0x0, 0x98, 0xF4, 0x0, 0xE, 0x0, 0xA0, 0xF4, 0x0, 0xE, 0x0, 0xA8, 0xF4, 0x0, 0xE, 0x0, 0xB0, 0xF4, 0x0, 0xE, 0x0, 0xB8, 0xF4, 0x0, 0xE, 0x0, 0xC0, 0xF4, 0x0, 0xE, 0x0, 0xC8, 0xF4, 0x0, 0xE, 0x0, 0xD0, 0xF4, 0x0, 0xE, 0x0, 0xD8, 0xF4, 0x0, 0xE, 0x0, 0xE0, 0xF4, 0x0, 0xE, 0x0, 0xE8, 0xF4, 0x0, 0xE, 0x0, 0xF0, 0xF4, 0x0, 0xE, 0x0, 0xF8, 0xF4, 0x0, 0xE, 0x0, 0x0, 0xF5, 0x0, 0xE, 0x0, 0x8, 0xF5, 0x0, 0xE, 0x0, 0x10, 0xF5, 0x0, 0xE, 0x0, 0x18, 0xF5, 0x0, 0xE, 0x0, 0x20, 0xF5, 0x0, 0xE, 0x0, 0x28, 0xF5, 0x0, 0xE, 0x0, 0x30, 0xF5, 0x0, 0xE, 0x0, 0x38, 0xF5, 0x0, 0xE, 0x0, 0x40, 0xF5, 0x0, 0xE, 0x0, 0x48, 0xF5, 0x0, 0xE, 0x0, 0x50, 0xF5, 0x0, 0xE, 0x0, 0x58, 0xF5, 0x0, 0xE, 0x0, 0x60, 0xF5, 0x0, 0xE, 0x0, 0x68, 0xF5, 0x0, 0xE, 0x0, 0x70, 0xF5, 0x0, 0xE, 0x0, 0x78, 0xF5, 0x0, 0xE, 0x0, 0x80, 0xF5, 0x0, 0xE, 0x0, 0x88, 0xF5, 0x0, 0xE, 0x0, 0x90, 0xF5, 0x0, 0xE, 0x0, 0x98, 0xF5, 0x0, 0xE, 0x0, 0xA0, 0xF5, 0x0, 0xE, 0x0, 0xA8, 0xF5, 0x0, 0xE, 0x0, 0xB0, 0xF5, 0x0, 0xE, 0x0, 0xB8, 0xF5, 0x0, 0xE, 0x0, 0xC0, 0xF5, 0x0, 0xE, 0x0, 0xC8, 0xF5, 0x0, 0xE, 0x0, 0xD0, 0xF5, 0x0, 0xE, 0x0, 0xD8, 0xF5, 0x0, 0xE, 0x0, 0xE0, 0xF5, 0x0, 0xE, 0x0, 0xE8, 0xF5, 0x0, 0xE, 0x0, 0xF0, 0xF5, 0x0, 0xE, 0x0, 0xF8, 0xF5, 0x0, 0xE, 0x0, 0x0, 0xF6, 0x0, 0xE, 0x0, 0x8, 0xF6, 0x0, 0xE, 0x0, 0x10, 0xF6, 0x0, 0xE, 0x0, 0x18, 0xF6, 0x0, 0xE, 0x0, 0x20, 0xF6, 0x0, 0xE, 0x0, 0x28, 0xF6, 0x0, 0xE, 0x0, 0x30, 0xF6, 0x0, 0xE, 0x0, 0x38, 0xF6, 0x0, 0xE, 0x0, 0x40, 0xF6, 0x0, 0xE, 0x0, 0x48, 0xF6, 0x0, 0xE, 0x0, 0x50, 0xF6, 0x0, 0xE, 0x0, 0x58, 0xF6, 0x0, 0xE, 0x0, 0x60, 0xF6, 0x0, 0xE, 0x0, 0x68, 0xF6, 0x0, 0xE, 0x0, 0x70, 0xF6, 0x0, 0xE, 0x0, 0x78, 0xF6, 0x0, 0xE, 0x0, 0x80, 0xF6, 0x0, 0xE, 0x0, 0x88, 0xF6, 0x0, 0xE, 0x0, 0x90, 0xF6, 0x0, 0xE, 0x0, 0x98, 0xF6, 0x0, 0xE, 0x0, 0xA0, 0xF6, 0x0, 0xE, 0x0, 0xA8, 0xF6, 0x0, 0xE, 0x0, 0xB0, 0xF6, 0x0, 0xE, 0x0, 0xB8, 0xF6, 0x0, 0xE, 0x0, 0xC0, 0xF6, 0x0, 0xE, 0x0, 0xC8, 0xF6, 0x0, 0xE, 0x0, 0xD0, 0xF6, 0x0, 0xE, 0x0, 0xD8, 0xF6, 0x0, 0xE, 0x0, 0xE0, 0xF6, 0x0, 0xE, 0x0, 0xE8, 0xF6, 0x0, 0xE, 0x0, 0xF0, 0xF6, 0x0, 0xE, 0x0, 0xF8, 0xF6, 0x0, 0xE, 0x0, 0x0, 0xF7, 0x0, 0xE, 0x0, 0x8, 0xF7, 0x0, 0xE, 0x0, 0x10, 0xF7, 0x0, 0xE, 0x0, 0x18, 0xF7, 0x0, 0xE, 0x0, 0x20, 0xF7, 0x0, 0xE, 0x0, 0x28, 0xF7, 0x0, 0xE, 0x0, 0x30, 0xF7, 0x0, 0xE, 0x0, 0x38, 0xF7, 0x0, 0xE, 0x0, 0x40, 0xF7, 0x0, 0xE, 0x0, 0x48, 0xF7, 0x0, 0xE, 0x0, 0x50, 0xF7, 0x0, 0xE, 0x0, 0x58, 0xF7, 0x0, 0xE, 0x0, 0x60, 0xF7, 0x0, 0xE, 0x0, 0x68, 0xF7, 0x0, 0xE, 0x0, 0x70, 0xF7, 0x0, 0xE, 0x0, 0x78, 0xF7, 0x0, 0xE, 0x0, 0x80, 0xF7, 0x0, 0xE, 0x0, 0x88, 0xF7, 0x0, 0xE, 0x0, 0x90, 0xF7, 0x0, 0xE, 0x0, 0x98, 0xF7, 0x0, 0xE, 0x0, 0xA0, 0xF7, 0x0, 0xE, 0x0, 0xA8, 0xF7, 0x0, 0xE, 0x0, 0xB0, 0xF7, 0x0, 0xE, 0x0, 0xB8, 0xF7, 0x0, 0xE, 0x0, 0xC0, 0xF7, 0x0, 0xE, 0x0, 0xC8, 0xF7, 0x0, 0xE, 0x0, 0xD0, 0xF7, 0x0, 0xE, 0x0, 0xD8, 0xF7, 0x0, 0xE, 0x0, 0xE0, 0xF7, 0x0, 0xE, 0x0, 0xE8, 0xF7, 0x0, 0xE, 0x0, 0xF0, 0xF7, 0x0, 0xE, 0x0, 0xF8, 0xF7, 0x0, 0xE, 0x0, 0x0, 0xF8, 0x0, 0xE, 0x0, 0x8, 0xF8, 0x0, 0xE, 0x0, 0x10, 0xF8, 0x0, 0xE, 0x0, 0x18, 0xF8, 0x0, 0xE, 0x0, 0x20, 0xF8, 0x0, 0xE, 0x0, 0x28, 0xF8, 0x0, 0xE, 0x0, 0x30, 0xF8, 0x0, 0xE, 0x0, 0x38, 0xF8, 0x0, 0xE, 0x0, 0x40, 0xF8, 0x0, 0xE, 0x0, 0x48, 0xF8, 0x0, 0xE, 0x0, 0x50, 0xF8, 0x0, 0xE, 0x0, 0x58, 0xF8, 0x0, 0xE, 0x0, 0x60, 0xF8, 0x0, 0xE, 0x0, 0x68, 0xF8, 0x0, 0xE, 0x0, 0x70, 0xF8, 0x0, 0xE, 0x0, 0x78, 0xF8, 0x0, 0xE, 0x0, 0x80, 0xF8, 0x0, 0xE, 0x0, 0x88, 0xF8, 0x0, 0xE, 0x0, 0x90, 0xF8, 0x0, 0xE, 0x0, 0x98, 0xF8, 0x0, 0xE, 0x0, 0xA0, 0xF8, 0x0, 0xE, 0x0, 0xA8, 0xF8, 0x0, 0xE, 0x0, 0xB0, 0xF8, 0x0, 0xE, 0x0, 0xB8, 0xF8, 0x0, 0xE, 0x0, 0xC0, 0xF8, 0x0, 0xE, 0x0, 0xC8, 0xF8, 0x0, 0xE, 0x0, 0xD0, 0xF8, 0x0, 0xE, 0x0, 0xD8, 0xF8, 0x0, 0xE, 0x0, 0xE0, 0xF8, 0x0, 0xE, 0x0, 0xE8, 0xF8, 0x0, 0xE, 0x0, 0xF0, 0xF8, 0x0, 0xE, 0x0, 0xF8, 0xF8, 0x0, 0xE, 0x0, 0x0, 0xF9, 0x0, 0xE, 0x0, 0x8, 0xF9, 0x0, 0xE, 0x0, 0x10, 0xF9, 0x0, 0xE, 0x0, 0x18, 0xF9, 0x0, 0xE, 0x0, 0x20, 0xF9, 0x0, 0xE, 0x0, 0x28, 0xF9, 0x0, 0xE, 0x0, 0x30, 0xF9, 0x0, 0xE, 0x0, 0x38, 0xF9, 0x0, 0xE, 0x0, 0x40, 0xF9, 0x0, 0xE, 0x0, 0x48, 0xF9, 0x0, 0xE, 0x0, 0x50, 0xF9, 0x0, 0xE, 0x0, 0x58, 0xF9, 0x0, 0xE, 0x0, 0x60, 0xF9, 0x0, 0xE, 0x0, 0x68, 0xF9, 0x0, 0xE, 0x0, 0x70, 0xF9, 0x0, 0xE, 0x0, 0x78, 0xF9, 0x0, 0xE, 0x0, 0x80, 0xF9, 0x0, 0xE, 0x0, 0x88, 0xF9, 0x0, 0xE, 0x0, 0x90, 0xF9, 0x0, 0xE, 0x0, 0x98, 0xF9, 0x0, 0xE, 0x0, 0xA0, 0xF9, 0x0, 0xE, 0x0, 0xA8, 0xF9, 0x0, 0xE, 0x0, 0xB0, 0xF9, 0x0, 0xE, 0x0, 0xB8, 0xF9, 0x0, 0xE, 0x0, 0xC0, 0xF9, 0x0, 0xE, 0x0, 0xC8, 0xF9, 0x0, 0xE, 0x0, 0xD0, 0xF9, 0x0, 0xE, 0x0, 0xD8, 0xF9, 0x0, 0xE, 0x0, 0xE0, 0xF9, 0x0, 0xE, 0x0, 0xE8, 0xF9, 0x0, 0xE, 0x0, 0xF0, 0xF9, 0x0, 0xE, 0x0, 0xF8, 0xF9, 0x0, 0xE, 0x0, 0x0, 0xFA, 0x0, 0xE, 0x0, 0x8, 0xFA, 0x0, 0xE, 0x0, 0x10, 0xFA, 0x0, 0xE, 0x0, 0x18, 0xFA, 0x0, 0xE, 0x0, 0x20, 0xFA, 0x0, 0xE, 0x0, 0x28, 0xFA, 0x0, 0xE, 0x0, 0x30, 0xFA, 0x0, 0xE, 0x0, 0x38, 0xFA, 0x0, 0xE, 0x0, 0x40, 0xFA, 0x0, 0xE, 0x0, 0x48, 0xFA, 0x0, 0xE, 0x0, 0x50, 0xFA, 0x0, 0xE, 0x0, 0x58, 0xFA, 0x0, 0xE, 0x0, 0x60, 0xFA, 0x0, 0xE, 0x0, 0x68, 0xFA, 0x0, 0xE, 0x0, 0x70, 0xFA, 0x0, 0xE, 0x0, 0x78, 0xFA, 0x0, 0xE, 0x0, 0x80, 0xFA, 0x0, 0xE, 0x0, 0x88, 0xFA, 0x0, 0xE, 0x0, 0x90, 0xFA, 0x0, 0xE, 0x0, 0x98, 0xFA, 0x0, 0xE, 0x0, 0xA0, 0xFA, 0x0, 0xE, 0x0, 0xA8, 0xFA, 0x0, 0xE, 0x0, 0xB0, 0xFA, 0x0, 0xE, 0x0, 0xB8, 0xFA, 0x0, 0xE, 0x0, 0xC0, 0xFA, 0x0, 0xE, 0x0, 0xC8, 0xFA, 0x0, 0xE, 0x0, 0xD0, 0xFA, 0x0, 0xE, 0x0, 0xD8, 0xFA, 0x0, 0xE, 0x0, 0xE0, 0xFA, 0x0, 0xE, 0x0, 0xE8, 0xFA, 0x0, 0xE, 0x0, 0xF0, 0xFA, 0x0, 0xE, 0x0, 0xF8, 0xFA, 0x0, 0xE, 0x0, 0x0, 0xFB, 0x0, 0xE, 0x0, 0x8, 0xFB, 0x0, 0xE, 0x0, 0x10, 0xFB, 0x0, 0xE, 0x0, 0x18, 0xFB, 0x0, 0xE, 0x0, 0x20, 0xFB, 0x0, 0xE, 0x0, 0x28, 0xFB, 0x0, 0xE, 0x0, 0x30, 0xFB, 0x0, 0xE, 0x0, 0x38, 0xFB, 0x0, 0xE, 0x0, 0x40, 0xFB, 0x0, 0xE, 0x0, 0x48, 0xFB, 0x0, 0xE, 0x0, 0x50, 0xFB, 0x0, 0xE, 0x0, 0x58, 0xFB, 0x0, 0xE, 0x0, 0x60, 0xFB, 0x0, 0xE, 0x0, 0x68, 0xFB, 0x0, 0xE, 0x0, 0x70, 0xFB, 0x0, 0xE, 0x0, 0x78, 0xFB, 0x0, 0xE, 0x0, 0x80, 0xFB, 0x0, 0xE, 0x0, 0x88, 0xFB, 0x0, 0xE, 0x0, 0x90, 0xFB, 0x0, 0xE, 0x0, 0x98, 0xFB, 0x0, 0xE, 0x0, 0xA0, 0xFB, 0x0, 0xE, 0x0, 0xA8, 0xFB, 0x0, 0xE, 0x0, 0xB0, 0xFB, 0x0, 0xE, 0x0, 0xB8, 0xFB, 0x0, 0xE, 0x0, 0xC0, 0xFB, 0x0, 0xE, 0x0, 0xC8, 0xFB, 0x0, 0xE, 0x0, 0xD0, 0xFB, 0x0, 0xE, 0x0, 0xD8, 0xFB, 0x0, 0xE, 0x0, 0xE0, 0xFB, 0x0, 0xE, 0x0, 0xE8, 0xFB, 0x0, 0xE, 0x0, 0xF0, 0xFB, 0x0, 0xE, 0x0, 0xF8, 0xFB, 0x0, 0xE, 0x0, 0x0, 0xFC, 0x0, 0xE, 0x0, 0x8, 0xFC, 0x0, 0xE, 0x0, 0x10, 0xFC, 0x0, 0xE, 0x0, 0x18, 0xFC, 0x0, 0xE, 0x0, 0x20, 0xFC, 0x0, 0xE, 0x0, 0x28, 0xFC, 0x0, 0xE, 0x0, 0x30, 0xFC, 0x0, 0xE, 0x0, 0x38, 0xFC, 0x0, 0xE, 0x0, 0x40, 0xFC, 0x0, 0xE, 0x0, 0x48, 0xFC, 0x0, 0xE, 0x0, 0x50, 0xFC, 0x0, 0xE, 0x0, 0x58, 0xFC, 0x0, 0xE, 0x0, 0x60, 0xFC, 0x0, 0xE, 0x0, 0x68, 0xFC, 0x0, 0xE, 0x0, 0x70, 0xFC, 0x0, 0xE, 0x0, 0x78, 0xFC, 0x0, 0xE, 0x0, 0x80, 0xFC, 0x0, 0xE, 0x0, 0x88, 0xFC, 0x0, 0xE, 0x0, 0x90, 0xFC, 0x0, 0xE, 0x0, 0x98, 0xFC, 0x0, 0xE, 0x0, 0xA0, 0xFC, 0x0, 0xE, 0x0, 0xA8, 0xFC, 0x0, 0xE, 0x0, 0xB0, 0xFC, 0x0, 0xE, 0x0, 0xB8, 0xFC, 0x0, 0xE, 0x0, 0xC0, 0xFC, 0x0, 0xE, 0x0, 0xC8, 0xFC, 0x0, 0xE, 0x0, 0xD0, 0xFC, 0x0, 0xE, 0x0, 0xD8, 0xFC, 0x0, 0xE, 0x0, 0xE0, 0xFC, 0x0, 0xE, 0x0, 0xE8, 0xFC, 0x0, 0xE, 0x0, 0xF0, 0xFC, 0x0, 0xE, 0x0, 0xF8, 0xFC, 0x0, 0xE, 0x0, 0x0, 0xFD, 0x0, 0xE, 0x0, 0x8, 0xFD, 0x0, 0xE, 0x0, 0x10, 0xFD, 0x0, 0xE, 0x0, 0x18, 0xFD, 0x0, 0xE, 0x0, 0x20, 0xFD, 0x0, 0xE, 0x0, 0x28, 0xFD, 0x0, 0xE, 0x0, 0x30, 0xFD, 0x0, 0xE, 0x0, 0x38, 0xFD, 0x0, 0xE, 0x0, 0x40, 0xFD, 0x0, 0xE, 0x0, 0x48, 0xFD, 0x0, 0xE, 0x0, 0x50, 0xFD, 0x0, 0xE, 0x0, 0x58, 0xFD, 0x0, 0xE, 0x0, 0x60, 0xFD, 0x0, 0xE, 0x0, 0x68, 0xFD, 0x0, 0xE, 0x0, 0x70, 0xFD, 0x0, 0xE, 0x0, 0x78, 0xFD, 0x0, 0xE, 0x0, 0x80, 0xFD, 0x0, 0xE, 0x0, 0x88, 0xFD, 0x0, 0xE, 0x0, 0x90, 0xFD, 0x0, 0xE, 0x0, 0x98, 0xFD, 0x0, 0xE, 0x0, 0xA0, 0xFD, 0x0, 0xE, 0x0, 0xA8, 0xFD, 0x0, 0xE, 0x0, 0xB0, 0xFD, 0x0, 0xE, 0x0, 0xB8, 0xFD, 0x0, 0xE, 0x0, 0xC0, 0xFD, 0x0, 0xE, 0x0, 0xC8, 0xFD, 0x0, 0xE, 0x0, 0xD0, 0xFD, 0x0, 0xE, 0x0, 0xD8, 0xFD, 0x0, 0xE, 0x0, 0xE0, 0xFD, 0x0, 0xE, 0x0, 0xE8, 0xFD, 0x0, 0xE, 0x0, 0xF0, 0xFD, 0x0, 0xE, 0x0, 0xF8, 0xFD, 0x0, 0xE, 0x0, 0x0, 0xFE, 0x0, 0xE, 0x0, 0x8, 0xFE, 0x0, 0xE, 0x0, 0x10, 0xFE, 0x0, 0xE, 0x0, 0x18, 0xFE, 0x0, 0xE, 0x0, 0x20, 0xFE, 0x0, 0xE, 0x0, 0x28, 0xFE, 0x0, 0xE, 0x0, 0x30, 0xFE, 0x0, 0xE, 0x0, 0x38, 0xFE, 0x0, 0xE, 0x0, 0x40, 0xFE, 0x0, 0xE, 0x0, 0x48, 0xFE, 0x0, 0xE, 0x0, 0x50, 0xFE, 0x0, 0xE, 0x0, 0x58, 0xFE, 0x0, 0xE, 0x0, 0x60, 0xFE, 0x0, 0xE, 0x0, 0x68, 0xFE, 0x0, 0xE, 0x0, 0x70, 0xFE, 0x0, 0xE, 0x0, 0x78, 0xFE, 0x0, 0xE, 0x0, 0x80, 0xFE, 0x0, 0xE, 0x0, 0x88, 0xFE, 0x0, 0xE, 0x0, 0x90, 0xFE, 0x0, 0xE, 0x0, 0x98, 0xFE, 0x0, 0xE, 0x0, 0xA0, 0xFE, 0x0, 0xE, 0x0, 0xA8, 0xFE, 0x0, 0xE, 0x0, 0xB0, 0xFE, 0x0, 0xE, 0x0, 0xB8, 0xFE, 0x0, 0xE, 0x0, 0xC0, 0xFE, 0x0, 0xE, 0x0, 0xC8, 0xFE, 0x0, 0xE, 0x0, 0xD0, 0xFE, 0x0, 0xE, 0x0, 0xD8, 0xFE, 0x0, 0xE, 0x0, 0xE0, 0xFE, 0x0, 0xE, 0x0, 0xE8, 0xFE, 0x0, 0xE, 0x0, 0xF0, 0xFE, 0x0, 0xE, 0x0, 0xF8, 0xFE, 0x0, 0xE, 0x0, 0x0, 0xFF, 0x0, 0xE, 0x0, 0x8, 0xFF, 0x0, 0xE, 0x0, 0x10, 0xFF, 0x0, 0xE, 0x0, 0x18, 0xFF, 0x0, 0xE, 0x0, 0x20, 0xFF, 0x0, 0xE, 0x0, 0x28, 0xFF, 0x0, 0xE, 0x0, 0x30, 0xFF, 0x0, 0xE, 0x0, 0x38, 0xFF, 0x0, 0xE, 0x0, 0x40, 0xFF, 0x0, 0xE, 0x0, 0x48, 0xFF, 0x0, 0xE, 0x0, 0x50, 0xFF, 0x0, 0xE, 0x0, 0x58, 0xFF, 0x0, 0xE, 0x0, 0x60, 0xFF, 0x0, 0xE, 0x0, 0x68, 0xFF, 0x0, 0xE, 0x0, 0x70, 0xFF, 0x0, 0xE, 0x0, 0x78, 0xFF, 0x0, 0xE, 0x0, 0x80, 0xFF, 0x0, 0xE, 0x0, 0x88, 0xFF, 0x0, 0xE, 0x0, 0x90, 0xFF, 0x0, 0xE, 0x0, 0x98, 0xFF, 0x0, 0xE, 0x0, 0xA0, 0xFF, 0x0, 0xE, 0x0, 0xA8, 0xFF, 0x0, 0xE, 0x0, 0xB0, 0xFF, 0x0, 0xE, 0x0, 0xB8, 0xFF, 0x0, 0xE, 0x0, 0xC0, 0xFF, 0x0, 0xE, 0x0, 0xC8, 0xFF, 0x0, 0xE, 0x0, 0xD0, 0xFF, 0x0, 0xE, 0x0, 0xD8, 0xFF, 0x0, 0xE, 0x0, 0xE0, 0xFF, 0x0, 0xE, 0x0, 0xE8, 0xFF, 0x0, 0xE, 0x0, 0xF0, 0xFF, 0x0, 0xE, 0x0, 0xF8, 0xFF, 0x0, 0xE, 0x0, 0x0, 0x0, 0x1, 0xE, 0x0, 0x8, 0x0, 0x1, 0xE, 0x0, 0x10, 0x0, 0x1, 0xE, 0x0, 0x18, 0x0, 0x1, 0xE, 0x0, 0x20, 0x0, 0x1, 0xE, 0x0, 0x28, 0x0, 0x1, 0xE, 0x0, 0x30, 0x0, 0x1, 0xE, 0x0, 0x38, 0x0, 0x1, 0xE, 0x0, 0x40, 0x0, 0x1, 0xE, 0x0, 0x48, 0x0, 0x1, 0xE, 0x0, 0x50, 0x0, 0x1, 0xE, 0x0, 0x58, 0x0, 0x1, 0xE, 0x0, 0x60, 0x0, 0x1, 0xE, 0x0, 0x68, 0x0, 0x1, 0xE, 0x0, 0x70, 0x0, 0x1, 0xE, 0x0, 0x78, 0x0, 0x1, 0xE, 0x0, 0x80, 0x0, 0x1, 0xE, 0x0, 0x88, 0x0, 0x1, 0xE, 0x0, 0x90, 0x0, 0x1, 0xE, 0x0, 0x98, 0x0, 0x1, 0xE, 0x0, 0xA0, 0x0, 0x1, 0xE, 0x0, 0xA8, 0x0, 0x1, 0xE, 0x0, 0xB0, 0x0, 0x1, 0xE, 0x0, 0xB8, 0x0, 0x1, 0xE, 0x0, 0xC0, 0x0, 0x1, 0xE, 0x0, 0xC8, 0x0, 0x1, 0xE, 0x0, 0xD0, 0x0, 0x1, 0xE, 0x0, 0xD8, 0x0, 0x1, 0xE, 0x0, 0xE0, 0x0, 0x1, 0xE, 0x0, 0xE8, 0x0, 0x1, 0xE, 0x0, 0xF0, 0x0, 0x1, 0xE, 0x0, 0xF8, 0x0, 0x1, 0xE, 0x0, 0x0, 0x1, 0x1, 0xE, 0x0, 0x8, 0x1, 0x1, 0xE, 0x0, 0x10, 0x1, 0x1, 0xE, 0x0, 0x18, 0x1, 0x1, 0xE, 0x0, 0x20, 0x1, 0x1, 0xE, 0x0, 0x28, 0x1, 0x1, 0xE, 0x0, 0x30, 0x1, 0x1, 0xE, 0x0, 0x38, 0x1, 0x1, 0xE, 0x0, 0x40, 0x1, 0x1, 0xE, 0x0, 0x48, 0x1, 0x1, 0xE, 0x0, 0x50, 0x1, 0x1, 0xE, 0x0, 0x58, 0x1, 0x1, 0xE, 0x0, 0x60, 0x1, 0x1, 0xE, 0x0, 0x68, 0x1, 0x1, 0xE, 0x0, 0x70, 0x1, 0x1, 0xE, 0x0, 0x78, 0x1, 0x1, 0xE, 0x0, 0x80, 0x1, 0x1, 0xE, 0x0, 0x88, 0x1, 0x1, 0xE, 0x0, 0x90, 0x1, 0x1, 0xE, 0x0, 0x98, 0x1, 0x1, 0xE, 0x0, 0xA0, 0x1, 0x1, 0xE, 0x0, 0xA8, 0x1, 0x1, 0xE, 0x0, 0xB0, 0x1, 0x1, 0xE, 0x0, 0xB8, 0x1, 0x1, 0xE, 0x0, 0xC0, 0x1, 0x1, 0xE, 0x0, 0xC8, 0x1, 0x1, 0xE, 0x0, 0xD0, 0x1, 0x1, 0xE, 0x0, 0xD8, 0x1, 0x1, 0xE, 0x0, 0xE0, 0x1, 0x1, 0xE, 0x0, 0xE8, 0x1, 0x1, 0xE, 0x0, 0xF0, 0x1, 0x1, 0xE, 0x0, 0xF8, 0x1, 0x1, 0xE, 0x0, 0x0, 0x2, 0x1, 0xE, 0x0, 0x8, 0x2, 0x1, 0xE, 0x0, 0x10, 0x2, 0x1, 0xE, 0x0, 0x18, 0x2, 0x1, 0xE, 0x0, 0x20, 0x2, 0x1, 0xE, 0x0, 0x28, 0x2, 0x1, 0xE, 0x0, 0x30, 0x2, 0x1, 0xE, 0x0, 0x38, 0x2, 0x1, 0xE, 0x0, 0x40, 0x2, 0x1, 0xE, 0x0, 0x48, 0x2, 0x1, 0xE, 0x0, 0x50, 0x2, 0x1, 0xE, 0x0, 0x58, 0x2, 0x1, 0xE, 0x0, 0x60, 0x2, 0x1, 0xE, 0x0, 0x68, 0x2, 0x1, 0xE, 0x0, 0x70, 0x2, 0x1, 0xE, 0x0, 0x78, 0x2, 0x1, 0xE, 0x0, 0x80, 0x2, 0x1, 0xE, 0x0, 0x88, 0x2, 0x1, 0xE, 0x0, 0x90, 0x2, 0x1, 0xE, 0x0, 0x98, 0x2, 0x1, 0xE, 0x0, 0xA0, 0x2, 0x1, 0xE, 0x0, 0xA8, 0x2, 0x1, 0xE, 0x0, 0xB0, 0x2, 0x1, 0xE, 0x0, 0xB8, 0x2, 0x1, 0xE, 0x0, 0xC0, 0x2, 0x1, 0xE, 0x0, 0xC8, 0x2, 0x1, 0xE, 0x0, 0xD0, 0x2, 0x1, 0xE, 0x0, 0xD8, 0x2, 0x1, 0xE, 0x0, 0xE0, 0x2, 0x1, 0xE, 0x0, 0xE8, 0x2, 0x1, 0xE, 0x0, 0xF0, 0x2, 0x1, 0xE, 0x0, 0xF8, 0x2, 0x1, 0xE, 0x0, 0x0, 0x3, 0x1, 0xE, 0x0, 0x8, 0x3, 0x1, 0xE, 0x0, 0x10, 0x3, 0x1, 0xE, 0x0, 0x18, 0x3, 0x1, 0xE, 0x0, 0x20, 0x3, 0x1, 0xE, 0x0, 0x28, 0x3, 0x1, 0xE, 0x0, 0x30, 0x3, 0x1, 0xE, 0x0, 0x38, 0x3, 0x1, 0xE, 0x0, 0x40, 0x3, 0x1, 0xE, 0x0, 0x48, 0x3, 0x1, 0xE, 0x0, 0x50, 0x3, 0x1, 0xE, 0x0, 0x58, 0x3, 0x1, 0xE, 0x0, 0x60, 0x3, 0x1, 0xE, 0x0, 0x68, 0x3, 0x1, 0xE, 0x0, 0x70, 0x3, 0x1, 0xE, 0x0, 0x78, 0x3, 0x1, 0xE, 0x0, 0x80, 0x3, 0x1, 0xE, 0x0, 0x88, 0x3, 0x1, 0xE, 0x0, 0x90, 0x3, 0x1, 0xE, 0x0, 0x98, 0x3, 0x1, 0xE, 0x0, 0xA0, 0x3, 0x1, 0xE, 0x0, 0xA8, 0x3, 0x1, 0xE, 0x0, 0xB0, 0x3, 0x1, 0xE, 0x0, 0xB8, 0x3, 0x1, 0xE, 0x0, 0xC0, 0x3, 0x1, 0xE, 0x0, 0xC8, 0x3, 0x1, 0xE, 0x0, 0xD0, 0x3, 0x1, 0xE, 0x0, 0xD8, 0x3, 0x1, 0xE, 0x0, 0xE0, 0x3, 0x1, 0xE, 0x0, 0xE8, 0x3, 0x1, 0xE, 0x0, 0xF0, 0x3, 0x1, 0xE, 0x0, 0xF8, 0x3, 0x1, 0xE, 0x0, 0x0, 0x4, 0x1, 0xE, 0x0, 0x8, 0x4, 0x1, 0xE, 0x0, 0x10, 0x4, 0x1, 0xE, 0x0, 0x18, 0x4, 0x1, 0xE, 0x0, 0x20, 0x4, 0x1, 0xE, 0x0, 0x28, 0x4, 0x1, 0xE, 0x0, 0x30, 0x4, 0x1, 0xE, 0x0, 0x38, 0x4, 0x1, 0xE, 0x0, 0x40, 0x4, 0x1, 0xE, 0x0, 0x48, 0x4, 0x1, 0xE, 0x0, 0x50, 0x4, 0x1, 0xE, 0x0, 0x58, 0x4, 0x1, 0xE, 0x0, 0x60, 0x4, 0x1, 0xE, 0x0, 0x68, 0x4, 0x1, 0xE, 0x0, 0x70, 0x4, 0x1, 0xE, 0x0, 0x78, 0x4, 0x1, 0xE, 0x0, 0x80, 0x4, 0x1, 0xE, 0x0, 0x88, 0x4, 0x1, 0xE, 0x0, 0x90, 0x4, 0x1, 0xE, 0x0, 0x98, 0x4, 0x1, 0xE, 0x0, 0xA0, 0x4, 0x1, 0xE, 0x0, 0xA8, 0x4, 0x1, 0xE, 0x0, 0xB0, 0x4, 0x1, 0xE, 0x0, 0xB8, 0x4, 0x1, 0xE, 0x0, 0xC0, 0x4, 0x1, 0xE, 0x0, 0xC8, 0x4, 0x1, 0xE, 0x0, 0xD0, 0x4, 0x1, 0xE, 0x0, 0xD8, 0x4, 0x1, 0xE, 0x0, 0xE0, 0x4, 0x1, 0xE, 0x0, 0xE8, 0x4, 0x1, 0xE, 0x0, 0xF0, 0x4, 0x1, 0xE, 0x0, 0xF8, 0x4, 0x1, 0xE, 0x0, 0x0, 0x5, 0x1, 0xE, 0x0, 0x8, 0x5, 0x1, 0xE, 0x0, 0x10, 0x5, 0x1, 0xE, 0x0, 0x18, 0x5, 0x1, 0xE, 0x0, 0x20, 0x5, 0x1, 0xE, 0x0, 0x28, 0x5, 0x1, 0xE, 0x0, 0x30, 0x5, 0x1, 0xE, 0x0, 0x38, 0x5, 0x1, 0xE, 0x0, 0x40, 0x5, 0x1, 0xE, 0x0, 0x48, 0x5, 0x1, 0xE, 0x0, 0x50, 0x5, 0x1, 0xE, 0x0, 0x58, 0x5, 0x1, 0xE, 0x0, 0x60, 0x5, 0x1, 0xE, 0x0, 0x68, 0x5, 0x1, 0xE, 0x0, 0x70, 0x5, 0x1, 0xE, 0x0, 0x78, 0x5, 0x1, 0xE, 0x0, 0x80, 0x5, 0x1, 0xE, 0x0, 0x88, 0x5, 0x1, 0xE, 0x0, 0x90, 0x5, 0x1, 0xE, 0x0, 0x98, 0x5, 0x1, 0xE, 0x0, 0xA0, 0x5, 0x1, 0xE, 0x0, 0xA8, 0x5, 0x1, 0xE, 0x0, 0xB0, 0x5, 0x1, 0xE, 0x0, 0xB8, 0x5, 0x1, 0xE, 0x0, 0xC0, 0x5, 0x1, 0xE, 0x0, 0xC8, 0x5, 0x1, 0xE, 0x0, 0xD0, 0x5, 0x1, 0xE, 0x0, 0xD8, 0x5, 0x1, 0xE, 0x0, 0xE0, 0x5, 0x1, 0xE, 0x0, 0xE8, 0x5, 0x1, 0xE, 0x0, 0xF0, 0x5, 0x1, 0xE, 0x0, 0xF8, 0x5, 0x1, 0xE, 0x0, 0x0, 0x6, 0x1, 0xE, 0x0, 0x8, 0x6, 0x1, 0xE, 0x0, 0x10, 0x6, 0x1, 0xE, 0x0, 0x18, 0x6, 0x1, 0xE, 0x0, 0x20, 0x6, 0x1, 0xE, 0x0, 0x28, 0x6, 0x1, 0xE, 0x0, 0x30, 0x6, 0x1, 0xE, 0x0, 0x38, 0x6, 0x1, 0xE, 0x0, 0x40, 0x6, 0x1, 0xE, 0x0, 0x48, 0x6, 0x1, 0xE, 0x0, 0x50, 0x6, 0x1, 0xE, 0x0, 0x58, 0x6, 0x1, 0xE, 0x0, 0x60, 0x6, 0x1, 0xE, 0x0, 0x68, 0x6, 0x1, 0xE, 0x0, 0x70, 0x6, 0x1, 0xE, 0x0, 0x78, 0x6, 0x1, 0xE, 0x0, 0x80, 0x6, 0x1, 0xE, 0x0, 0x88, 0x6, 0x1, 0xE, 0x0, 0x90, 0x6, 0x1, 0xE, 0x0, 0x98, 0x6, 0x1, 0xE, 0x0, 0xA0, 0x6, 0x1, 0xE, 0x0, 0xA8, 0x6, 0x1, 0xE, 0x0, 0xB0, 0x6, 0x1, 0xE, 0x0, 0xB8, 0x6, 0x1, 0xE, 0x0, 0xC0, 0x6, 0x1, 0xE, 0x0, 0xC8, 0x6, 0x1, 0xE, 0x0, 0xD0, 0x6, 0x1, 0xE, 0x0, 0xD8, 0x6, 0x1, 0xE, 0x0, 0xE0, 0x6, 0x1, 0xE, 0x0, 0xE8, 0x6, 0x1, 0xE, 0x0, 0xF0, 0x6, 0x1, 0xE, 0x0, 0xF8, 0x6, 0x1, 0xE, 0x0, 0x0, 0x7, 0x1, 0xE, 0x0, 0x8, 0x7, 0x1, 0xE, 0x0, 0x10, 0x7, 0x1, 0xE, 0x0, 0x18, 0x7, 0x1, 0xE, 0x0, 0x20, 0x7, 0x1, 0xE, 0x0, 0x28, 0x7, 0x1, 0xE, 0x0, 0x30, 0x7, 0x1, 0xE, 0x0, 0x38, 0x7, 0x1, 0xE, 0x0, 0x40, 0x7, 0x1, 0xE, 0x0, 0x48, 0x7, 0x1, 0xE, 0x0, 0x50, 0x7, 0x1, 0xE, 0x0, 0x58, 0x7, 0x1, 0xE, 0x0, 0x60, 0x7, 0x1, 0xE, 0x0, 0x68, 0x7, 0x1, 0xE, 0x0, 0x70, 0x7, 0x1, 0xE, 0x0, 0x78, 0x7, 0x1, 0xE, 0x0, 0x80, 0x7, 0x1, 0xE, 0x0, 0x88, 0x7, 0x1, 0xE, 0x0, 0x90, 0x7, 0x1, 0xE, 0x0, 0x98, 0x7, 0x1, 0xE, 0x0, 0xA0, 0x7, 0x1, 0xE, 0x0, 0xA8, 0x7, 0x1, 0xE, 0x0, 0xB0, 0x7, 0x1, 0xE, 0x0, 0xB8, 0x7, 0x1, 0xE, 0x0, 0xC0, 0x7, 0x1, 0xE, 0x0, 0xC8, 0x7, 0x1, 0xE, 0x0, 0xD0, 0x7, 0x1, 0xE, 0x0, 0xD8, 0x7, 0x1, 0xE, 0x0, 0xE0, 0x7, 0x1, 0xE, 0x0, 0xE8, 0x7, 0x1, 0xE, 0x0, 0xF0, 0x7, 0x1, 0xE, 0x0, 0xF8, 0x7, 0x1, 0xE, 0x0, 0x0, 0x8, 0x1, 0xE, 0x0, 0x8, 0x8, 0x1, 0xE, 0x0, 0x10, 0x8, 0x1, 0xE, 0x0, 0x18, 0x8, 0x1, 0xE, 0x0, 0x20, 0x8, 0x1, 0xE, 0x0, 0x28, 0x8, 0x1, 0xE, 0x0, 0x30, 0x8, 0x1, 0xE, 0x0, 0x38, 0x8, 0x1, 0xE, 0x0, 0x40, 0x8, 0x1, 0xE, 0x0, 0x48, 0x8, 0x1, 0xE, 0x0, 0x50, 0x8, 0x1, 0xE, 0x0, 0x58, 0x8, 0x1, 0xE, 0x0, 0x60, 0x8, 0x1, 0xE, 0x0, 0x68, 0x8, 0x1, 0xE, 0x0, 0x70, 0x8, 0x1, 0xE, 0x0, 0x78, 0x8, 0x1, 0xE, 0x0, 0x80, 0x8, 0x1, 0xE, 0x0, 0x88, 0x8, 0x1, 0xE, 0x0, 0x90, 0x8, 0x1, 0xE, 0x0, 0x98, 0x8, 0x1, 0xE, 0x0, 0xA0, 0x8, 0x1, 0xE, 0x0, 0xA8, 0x8, 0x1, 0xE, 0x0, 0xB0, 0x8, 0x1, 0xE, 0x0, 0xB8, 0x8, 0x1, 0xE, 0x0, 0xC0, 0x8, 0x1, 0xE, 0x0, 0xC8, 0x8, 0x1, 0xE, 0x0, 0xD0, 0x8, 0x1, 0xE, 0x0, 0xD8, 0x8, 0x1, 0xE, 0x0, 0xE0, 0x8, 0x1, 0xE, 0x0, 0xE8, 0x8, 0x1, 0xE, 0x0, 0xF0, 0x8, 0x1, 0xE, 0x0, 0xF8, 0x8, 0x1, 0xE, 0x0, 0x0, 0x9, 0x1, 0xE, 0x0, 0x8, 0x9, 0x1, 0xE, 0x0, 0x10, 0x9, 0x1, 0xE, 0x0, 0x18, 0x9, 0x1, 0xE, 0x0, 0x20, 0x9, 0x1, 0xE, 0x0, 0x28, 0x9, 0x1, 0xE, 0x0, 0x30, 0x9, 0x1, 0xE, 0x0, 0x38, 0x9, 0x1, 0xE, 0x0, 0x40, 0x9, 0x1, 0xE, 0x0, 0x48, 0x9, 0x1, 0xE, 0x0, 0x50, 0x9, 0x1, 0xE, 0x0, 0x58, 0x9, 0x1, 0xE, 0x0, 0x60, 0x9, 0x1, 0xE, 0x0, 0x68, 0x9, 0x1, 0xE, 0x0, 0x70, 0x9, 0x1, 0xE, 0x0, 0x78, 0x9, 0x1, 0xE, 0x0, 0x80, 0x9, 0x1, 0xE, 0x0, 0x88, 0x9, 0x1, 0xE, 0x0, 0x90, 0x9, 0x1, 0xE, 0x0, 0x98, 0x9, 0x1, 0xE, 0x0, 0xA0, 0x9, 0x1, 0xE, 0x0, 0xA8, 0x9, 0x1, 0xE, 0x0, 0xB0, 0x9, 0x1, 0xE, 0x0, 0xB8, 0x9, 0x1, 0xE, 0x0, 0xC0, 0x9, 0x1, 0xE, 0x0, 0xC8, 0x9, 0x1, 0xE, 0x0, 0xD0, 0x9, 0x1, 0xE, 0x0, 0xD8, 0x9, 0x1, 0xE, 0x0, 0xE0, 0x9, 0x1, 0xE, 0x0, 0xE8, 0x9, 0x1, 0xE, 0x0, 0xF0, 0x9, 0x1, 0xE, 0x0, 0xF8, 0x9, 0x1, 0xE, 0x0, 0x0, 0xA, 0x1, 0xE, 0x0, 0x8, 0xA, 0x1, 0xE, 0x0, 0x10, 0xA, 0x1, 0xE, 0x0, 0x18, 0xA, 0x1, 0xE, 0x0, 0x20, 0xA, 0x1, 0xE, 0x0, 0x28, 0xA, 0x1, 0xE, 0x0, 0x30, 0xA, 0x1, 0xE, 0x0, 0x38, 0xA, 0x1, 0xE, 0x0, 0x40, 0xA, 0x1, 0xE, 0x0, 0x48, 0xA, 0x1, 0xE, 0x0, 0x50, 0xA, 0x1, 0xE, 0x0, 0x58, 0xA, 0x1, 0xE, 0x0, 0x60, 0xA, 0x1, 0xE, 0x0, 0x68, 0xA, 0x1, 0xE, 0x0, 0x70, 0xA, 0x1, 0xE, 0x0, 0x78, 0xA, 0x1, 0xE, 0x0, 0x80, 0xA, 0x1, 0xE, 0x0, 0x88, 0xA, 0x1, 0xE, 0x0, 0x90, 0xA, 0x1, 0xE, 0x0, 0x98, 0xA, 0x1, 0xE, 0x0, 0xA0, 0xA, 0x1, 0xE, 0x0, 0xA8, 0xA, 0x1, 0xE, 0x0, 0xB0, 0xA, 0x1, 0xE, 0x0, 0xB8, 0xA, 0x1, 0xE, 0x0, 0xC0, 0xA, 0x1, 0xE, 0x0, 0xC8, 0xA, 0x1, 0xE, 0x0, 0xD0, 0xA, 0x1, 0xE, 0x0, 0xD8, 0xA, 0x1, 0xE, 0x0, 0xE0, 0xA, 0x1, 0xE, 0x0, 0xE8, 0xA, 0x1, 0xE, 0x0, 0xF0, 0xA, 0x1, 0xE, 0x0, 0xF8, 0xA, 0x1, 0xE, 0x0, 0x0, 0xB, 0x1, 0xE, 0x0, 0x8, 0xB, 0x1, 0xE, 0x0, 0x10, 0xB, 0x1, 0xE, 0x0, 0x18, 0xB, 0x1, 0xE, 0x0, 0x20, 0xB, 0x1, 0xE, 0x0, 0x28, 0xB, 0x1, 0xE, 0x0, 0x30, 0xB, 0x1, 0xE, 0x0, 0x38, 0xB, 0x1, 0xE, 0x0, 0x40, 0xB, 0x1, 0xE, 0x0, 0x48, 0xB, 0x1, 0xE, 0x0, 0x50, 0xB, 0x1, 0xE, 0x0, 0x58, 0xB, 0x1, 0xE, 0x0, 0x60, 0xB, 0x1, 0xE, 0x0, 0x68, 0xB, 0x1, 0xE, 0x0, 0x70, 0xB, 0x1, 0xE, 0x0, 0x78, 0xB, 0x1, 0xE, 0x0, 0x80, 0xB, 0x1, 0xE, 0x0, 0x88, 0xB, 0x1, 0xE, 0x0, 0x90, 0xB, 0x1, 0xE, 0x0, 0x98, 0xB, 0x1, 0xE, 0x0, 0xA0, 0xB, 0x1, 0xE, 0x0, 0xA8, 0xB, 0x1, 0xE, 0x0, 0xB0, 0xB, 0x1, 0xE, 0x0, 0xB8, 0xB, 0x1, 0xE, 0x0, 0xC0, 0xB, 0x1, 0xE, 0x0, 0xC8, 0xB, 0x1, 0xE, 0x0, 0xD0, 0xB, 0x1, 0xE, 0x0, 0xD8, 0xB, 0x1, 0xE, 0x0, 0xE0, 0xB, 0x1, 0xE, 0x0, 0xE8, 0xB, 0x1, 0xE, 0x0, 0xF0, 0xB, 0x1, 0xE, 0x0, 0xF8, 0xB, 0x1, 0xE, 0x0, 0x0, 0xC, 0x1, 0xE, 0x0, 0x8, 0xC, 0x1, 0xE, 0x0, 0x10, 0xC, 0x1, 0xE, 0x0, 0x18, 0xC, 0x1, 0xE, 0x0, 0x20, 0xC, 0x1, 0xE, 0x0, 0x28, 0xC, 0x1, 0xE, 0x0, 0x30, 0xC, 0x1, 0xE, 0x0, 0x38, 0xC, 0x1, 0xE, 0x0, 0x40, 0xC, 0x1, 0xE, 0x0, 0x48, 0xC, 0x1, 0xE, 0x0, 0x50, 0xC, 0x1, 0xE, 0x0, 0x58, 0xC, 0x1, 0xE, 0x0, 0x60, 0xC, 0x1, 0xE, 0x0, 0x68, 0xC, 0x1, 0xE, 0x0, 0x70, 0xC, 0x1, 0xE, 0x0, 0x78, 0xC, 0x1, 0xE, 0x0, 0x80, 0xC, 0x1, 0xE, 0x0, 0x88, 0xC, 0x1, 0xE, 0x0, 0x90, 0xC, 0x1, 0xE, 0x0, 0x98, 0xC, 0x1, 0xE, 0x0, 0xA0, 0xC, 0x1, 0xE, 0x0, 0xA8, 0xC, 0x1, 0xE, 0x0, 0xB0, 0xC, 0x1, 0xE, 0x0, 0xB8, 0xC, 0x1, 0xE, 0x0, 0xC0, 0xC, 0x1, 0xE, 0x0, 0xC8, 0xC, 0x1, 0xE, 0x0, 0xD0, 0xC, 0x1, 0xE, 0x0, 0xD8, 0xC, 0x1, 0xE, 0x0, 0xE0, 0xC, 0x1, 0xE, 0x0, 0xE8, 0xC, 0x1, 0xE, 0x0, 0xF0, 0xC, 0x1, 0xE, 0x0, 0xF8, 0xC, 0x1, 0xE, 0x0, 0x0, 0xD, 0x1, 0xE, 0x0, 0x8, 0xD, 0x1, 0xE, 0x0, 0x10, 0xD, 0x1, 0xE, 0x0, 0x18, 0xD, 0x1, 0xE, 0x0, 0x20, 0xD, 0x1, 0xE, 0x0, 0x28, 0xD, 0x1, 0xE, 0x0, 0x30, 0xD, 0x1, 0xE, 0x0, 0x38, 0xD, 0x1, 0xE, 0x0, 0x40, 0xD, 0x1, 0xE, 0x0, 0x48, 0xD, 0x1, 0xE, 0x0, 0x50, 0xD, 0x1, 0xE, 0x0, 0x58, 0xD, 0x1, 0xE, 0x0, 0x60, 0xD, 0x1, 0xE, 0x0, 0x68, 0xD, 0x1, 0xE, 0x0, 0x70, 0xD, 0x1, 0xE, 0x0, 0x78, 0xD, 0x1, 0xE, 0x0, 0x80, 0xD, 0x1, 0xE, 0x0, 0x88, 0xD, 0x1, 0xE, 0x0, 0x90, 0xD, 0x1, 0xE, 0x0, 0x98, 0xD, 0x1, 0xE, 0x0, 0xA0, 0xD, 0x1, 0xE, 0x0, 0xA8, 0xD, 0x1, 0xE, 0x0, 0xB0, 0xD, 0x1, 0xE, 0x0, 0xB8, 0xD, 0x1, 0xE, 0x0, 0xC0, 0xD, 0x1, 0xE, 0x0, 0xC8, 0xD, 0x1, 0xE, 0x0, 0xD0, 0xD, 0x1, 0xE, 0x0, 0xD8, 0xD, 0x1, 0xE, 0x0, 0xE0, 0xD, 0x1, 0xE, 0x0, 0xE8, 0xD, 0x1, 0xE, 0x0, 0xF0, 0xD, 0x1, 0xE, 0x0, 0xF8, 0xD, 0x1, 0xE, 0x0, 0x0, 0xE, 0x1, 0xE, 0x0, 0x8, 0xE, 0x1, 0xE, 0x0, 0x10, 0xE, 0x1, 0xE, 0x0, 0x18, 0xE, 0x1, 0xE, 0x0, 0x20, 0xE, 0x1, 0xE, 0x0, 0x28, 0xE, 0x1, 0xE, 0x0, 0x30, 0xE, 0x1, 0xE, 0x0, 0x38, 0xE, 0x1, 0xE, 0x0, 0x40, 0xE, 0x1, 0xE, 0x0, 0x48, 0xE, 0x1, 0xE, 0x0, 0x50, 0xE, 0x1, 0xE, 0x0, 0x58, 0xE, 0x1, 0xE, 0x0, 0x60, 0xE, 0x1, 0xE, 0x0, 0x68, 0xE, 0x1, 0xE, 0x0, 0x70, 0xE, 0x1, 0xE, 0x0, 0x78, 0xE, 0x1, 0xE, 0x0, 0x80, 0xE, 0x1, 0xE, 0x0, 0x88, 0xE, 0x1, 0xE, 0x0, 0x90, 0xE, 0x1, 0xE, 0x0, 0x98, 0xE, 0x1, 0xE, 0x0, 0xA0, 0xE, 0x1, 0xE, 0x0, 0xA8, 0xE, 0x1, 0xE, 0x0, 0xB0, 0xE, 0x1, 0xE, 0x0, 0xB8, 0xE, 0x1, 0xE, 0x0, 0xC0, 0xE, 0x1, 0xE, 0x0, 0xC8, 0xE, 0x1, 0xE, 0x0, 0xD0, 0xE, 0x1, 0xE, 0x0, 0xD8, 0xE, 0x1, 0xE, 0x0, 0xE0, 0xE, 0x1, 0xE, 0x0, 0xE8, 0xE, 0x1, 0xE, 0x0, 0xF0, 0xE, 0x1, 0xE, 0x0, 0xF8, 0xE, 0x1, 0xE, 0x0, 0x0, 0xF, 0x1, 0xE, 0x0, 0x8, 0xF, 0x1, 0xE, 0x0, 0x10, 0xF, 0x1, 0xE, 0x0, 0x18, 0xF, 0x1, 0xE, 0x0, 0x20, 0xF, 0x1, 0xE, 0x0, 0x28, 0xF, 0x1, 0xE, 0x0, 0x30, 0xF, 0x1, 0xE, 0x0, 0x38, 0xF, 0x1, 0xE, 0x0, 0x40, 0xF, 0x1, 0xE, 0x0, 0x48, 0xF, 0x1, 0xE, 0x0, 0x50, 0xF, 0x1, 0xE, 0x0, 0x58, 0xF, 0x1, 0xE, 0x0, 0x60, 0xF, 0x1, 0xE, 0x0, 0x68, 0xF, 0x1, 0xE, 0x0, 0x70, 0xF, 0x1, 0xE, 0x0, 0x78, 0xF, 0x1, 0xE, 0x0, 0x80, 0xF, 0x1, 0xE, 0x0, 0x88, 0xF, 0x1, 0xE, 0x0, 0x90, 0xF, 0x1, 0xE, 0x0, 0x98, 0xF, 0x1, 0xE, 0x0, 0xA0, 0xF, 0x1, 0xE, 0x0, 0xA8, 0xF, 0x1, 0xE, 0x0, 0xB0, 0xF, 0x1, 0xE, 0x0, 0xB8, 0xF, 0x1, 0xE, 0x0, 0xC0, 0xF, 0x1, 0xE, 0x0, 0xC8, 0xF, 0x1, 0xE, 0x0, 0xD0, 0xF, 0x1, 0xE, 0x0, 0xD8, 0xF, 0x1, 0xE, 0x0, 0xE0, 0xF, 0x1, 0xE, 0x0, 0xE8, 0xF, 0x1, 0xE, 0x0, 0xF0, 0xF, 0x1, 0xE, 0x0, 0xF8, 0xF, 0x1, 0xE, 0x0, 0x0, 0x10, 0x1, 0xE, 0x0, 0x8, 0x10, 0x1, 0xE, 0x0, 0x10, 0x10, 0x1, 0xE, 0x0, 0x18, 0x10, 0x1, 0xE, 0x0, 0x20, 0x10, 0x1, 0xE, 0x0, 0x28, 0x10, 0x1, 0xE, 0x0, 0x30, 0x10, 0x1, 0xE, 0x0, 0x38, 0x10, 0x1, 0xE, 0x0, 0x40, 0x10, 0x1, 0xE, 0x0, 0x48, 0x10, 0x1, 0xE, 0x0, 0x50, 0x10, 0x1, 0xE, 0x0, 0x58, 0x10, 0x1, 0xE, 0x0, 0x60, 0x10, 0x1, 0xE, 0x0, 0x68, 0x10, 0x1, 0xE, 0x0, 0x70, 0x10, 0x1, 0xE, 0x0, 0x78, 0x10, 0x1, 0xE, 0x0, 0x80, 0x10, 0x1, 0xE, 0x0, 0x88, 0x10, 0x1, 0xE, 0x0, 0x90, 0x10, 0x1, 0xE, 0x0, 0x98, 0x10, 0x1, 0xE, 0x0, 0xA0, 0x10, 0x1, 0xE, 0x0, 0xA8, 0x10, 0x1, 0xE, 0x0, 0xB0, 0x10, 0x1, 0xE, 0x0, 0xB8, 0x10, 0x1, 0xE, 0x0, 0xC0, 0x10, 0x1, 0xE, 0x0, 0xC8, 0x10, 0x1, 0xE, 0x0, 0xD0, 0x10, 0x1, 0xE, 0x0, 0xD8, 0x10, 0x1, 0xE, 0x0, 0xE0, 0x10, 0x1, 0xE, 0x0, 0xE8, 0x10, 0x1, 0xE, 0x0, 0xF0, 0x10, 0x1, 0xE, 0x0, 0xF8, 0x10, 0x1, 0xE, 0x0, 0x0, 0x11, 0x1, 0xE, 0x0, 0x8, 0x11, 0x1, 0xE, 0x0, 0x10, 0x11, 0x1, 0xE, 0x0, 0x18, 0x11, 0x1, 0xE, 0x0, 0x20, 0x11, 0x1, 0xE, 0x0, 0x28, 0x11, 0x1, 0xE, 0x0, 0x30, 0x11, 0x1, 0xE, 0x0, 0x38, 0x11, 0x1, 0xE, 0x0, 0x40, 0x11, 0x1, 0xE, 0x0, 0x48, 0x11, 0x1, 0xE, 0x0, 0x50, 0x11, 0x1, 0xE, 0x0, 0x58, 0x11, 0x1, 0xE, 0x0, 0x60, 0x11, 0x1, 0xE, 0x0, 0x68, 0x11, 0x1, 0xE, 0x0, 0x70, 0x11, 0x1, 0xE, 0x0, 0x78, 0x11, 0x1, 0xE, 0x0, 0x80, 0x11, 0x1, 0xE, 0x0, 0x88, 0x11, 0x1, 0xE, 0x0, 0x90, 0x11, 0x1, 0xE, 0x0, 0x98, 0x11, 0x1, 0xE, 0x0, 0xA0, 0x11, 0x1, 0xE, 0x0, 0xA8, 0x11, 0x1, 0xE, 0x0, 0xB0, 0x11, 0x1, 0xE, 0x0, 0xB8, 0x11, 0x1, 0xE, 0x0, 0xC0, 0x11, 0x1, 0xE, 0x0, 0xC8, 0x11, 0x1, 0xE, 0x0, 0xD0, 0x11, 0x1, 0xE, 0x0, 0xD8, 0x11, 0x1, 0xE, 0x0, 0xE0, 0x11, 0x1, 0xE, 0x0, 0xE8, 0x11, 0x1, 0xE, 0x0, 0xF0, 0x11, 0x1, 0xE, 0x0, 0xF8, 0x11, 0x1, 0xE, 0x0, 0x0, 0x12, 0x1, 0xE, 0x0, 0x8, 0x12, 0x1, 0xE, 0x0, 0x10, 0x12, 0x1, 0xE, 0x0, 0x18, 0x12, 0x1, 0xE, 0x0, 0x20, 0x12, 0x1, 0xE, 0x0, 0x28, 0x12, 0x1, 0xE, 0x0, 0x30, 0x12, 0x1, 0xE, 0x0, 0x38, 0x12, 0x1, 0xE, 0x0, 0x40, 0x12, 0x1, 0xE, 0x0, 0x48, 0x12, 0x1, 0xE, 0x0, 0x50, 0x12, 0x1, 0xE, 0x0, 0x58, 0x12, 0x1, 0xE, 0x0, 0x60, 0x12, 0x1, 0xE, 0x0, 0x68, 0x12, 0x1, 0xE, 0x0, 0x70, 0x12, 0x1, 0xE, 0x0, 0x78, 0x12, 0x1, 0xE, 0x0, 0x80, 0x12, 0x1, 0xE, 0x0, 0x88, 0x12, 0x1, 0xE, 0x0, 0x90, 0x12, 0x1, 0xE, 0x0, 0x98, 0x12, 0x1, 0xE, 0x0, 0xA0, 0x12, 0x1, 0xE, 0x0, 0xA8, 0x12, 0x1, 0xE, 0x0, 0xB0, 0x12, 0x1, 0xE, 0x0, 0xB8, 0x12, 0x1, 0xE, 0x0, 0xC0, 0x12, 0x1, 0xE, 0x0, 0xC8, 0x12, 0x1, 0xE, 0x0, 0xD0, 0x12, 0x1, 0xE, 0x0, 0xD8, 0x12, 0x1, 0xE, 0x0, 0xE0, 0x12, 0x1, 0xE, 0x0, 0xE8, 0x12, 0x1, 0xE, 0x0, 0xF0, 0x12, 0x1, 0xE, 0x0, 0xF8, 0x12, 0x1, 0xE, 0x0, 0x0, 0x13, 0x1, 0xE, 0x0, 0x8, 0x13, 0x1, 0xE, 0x0, 0x10, 0x13, 0x1, 0xE, 0x0, 0x18, 0x13, 0x1, 0xE, 0x0, 0x20, 0x13, 0x1, 0xE, 0x0, 0x28, 0x13, 0x1, 0xE, 0x0, 0x30, 0x13, 0x1, 0xE, 0x0, 0x38, 0x13, 0x1, 0xE, 0x0, 0x40, 0x13, 0x1, 0xE, 0x0, 0x48, 0x13, 0x1, 0xE, 0x0, 0x50, 0x13, 0x1, 0xE, 0x0, 0x58, 0x13, 0x1, 0xE, 0x0, 0x60, 0x13, 0x1, 0xE, 0x0, 0x68, 0x13, 0x1, 0xE, 0x0, 0x70, 0x13, 0x1, 0xE, 0x0, 0x78, 0x13, 0x1, 0xE, 0x0, 0x80, 0x13, 0x1, 0xE, 0x0, 0x88, 0x13, 0x1, 0xE, 0x0, 0x90, 0x13, 0x1, 0xE, 0x0, 0x98, 0x13, 0x1, 0xE, 0x0, 0xA0, 0x13, 0x1, 0xE, 0x0, 0xA8, 0x13, 0x1, 0xE, 0x0, 0xB0, 0x13, 0x1, 0xE, 0x0, 0xB8, 0x13, 0x1, 0xE, 0x0, 0xC0, 0x13, 0x1, 0xE, 0x0, 0xC8, 0x13, 0x1, 0xE, 0x0, 0xD0, 0x13, 0x1, 0xE, 0x0, 0xD8, 0x13, 0x1, 0xE, 0x0, 0xE0, 0x13, 0x1, 0xE, 0x0, 0xE8, 0x13, 0x1, 0xE, 0x0, 0xF0, 0x13, 0x1, 0xE, 0x0, 0xF8, 0x13, 0x1, 0xE, 0x0, 0x0, 0x14, 0x1, 0xE, 0x0, 0x8, 0x14, 0x1, 0xE, 0x0, 0x10, 0x14, 0x1, 0xE, 0x0, 0x18, 0x14, 0x1, 0xE, 0x0, 0x20, 0x14, 0x1, 0xE, 0x0, 0x28, 0x14, 0x1, 0xE, 0x0, 0x30, 0x14, 0x1, 0xE, 0x0, 0x38, 0x14, 0x1, 0xE, 0x0, 0x40, 0x14, 0x1, 0xE, 0x0, 0x48, 0x14, 0x1, 0xE, 0x0, 0x50, 0x14, 0x1, 0xE, 0x0, 0x58, 0x14, 0x1, 0xE, 0x0, 0x60, 0x14, 0x1, 0xE, 0x0, 0x68, 0x14, 0x1, 0xE, 0x0, 0x70, 0x14, 0x1, 0xE, 0x0, 0x78, 0x14, 0x1, 0xE, 0x0, 0x80, 0x14, 0x1, 0xE, 0x0, 0x88, 0x14, 0x1, 0xE, 0x0, 0x90, 0x14, 0x1, 0xE, 0x0, 0x98, 0x14, 0x1, 0xE, 0x0, 0xA0, 0x14, 0x1, 0xE, 0x0, 0xA8, 0x14, 0x1, 0xE, 0x0, 0xB0, 0x14, 0x1, 0xE, 0x0, 0xB8, 0x14, 0x1, 0xE, 0x0, 0xC0, 0x14, 0x1, 0xE, 0x0, 0xC8, 0x14, 0x1, 0xE, 0x0, 0xD0, 0x14, 0x1, 0xE, 0x0, 0xD8, 0x14, 0x1, 0xE, 0x0, 0xE0, 0x14, 0x1, 0xE, 0x0, 0xE8, 0x14, 0x1, 0xE, 0x0, 0xF0, 0x14, 0x1, 0xE, 0x0, 0xF8, 0x14, 0x1, 0xE, 0x0, 0x0, 0x15, 0x1, 0xE, 0x0, 0x8, 0x15, 0x1, 0xE, 0x0, 0x10, 0x15, 0x1, 0xE, 0x0, 0x18, 0x15, 0x1, 0xE, 0x0, 0x20, 0x15, 0x1, 0xE, 0x0, 0x28, 0x15, 0x1, 0xE, 0x0, 0x30, 0x15, 0x1, 0xE, 0x0, 0x38, 0x15, 0x1, 0xE, 0x0, 0x40, 0x15, 0x1, 0xE, 0x0, 0x48, 0x15, 0x1, 0xE, 0x0, 0x50, 0x15, 0x1, 0xE, 0x0, 0x58, 0x15, 0x1, 0xE, 0x0, 0x60, 0x15, 0x1, 0xE, 0x0, 0x68, 0x15, 0x1, 0xE, 0x0, 0x70, 0x15, 0x1, 0xE, 0x0, 0x78, 0x15, 0x1, 0xE, 0x0, 0x80, 0x15, 0x1, 0xE, 0x0, 0x88, 0x15, 0x1, 0xE, 0x0, 0x90, 0x15, 0x1, 0xE, 0x0, 0x98, 0x15, 0x1, 0xE, 0x0, 0xA0, 0x15, 0x1, 0xE, 0x0, 0xA8, 0x15, 0x1, 0xE, 0x0, 0xB0, 0x15, 0x1, 0xE, 0x0, 0xB8, 0x15, 0x1, 0xE, 0x0, 0xC0, 0x15, 0x1, 0xE, 0x0, 0xC8, 0x15, 0x1, 0xE, 0x0, 0xD0, 0x15, 0x1, 0xE, 0x0, 0xD8, 0x15, 0x1, 0xE, 0x0, 0xE0, 0x15, 0x1, 0xE, 0x0, 0xE8, 0x15, 0x1, 0xE, 0x0, 0xF0, 0x15, 0x1, 0xE, 0x0, 0xF8, 0x15, 0x1, 0xE, 0x0, 0x0, 0x16, 0x1, 0xE, 0x0, 0x8, 0x16, 0x1, 0xE, 0x0, 0x10, 0x16, 0x1, 0xE, 0x0, 0x18, 0x16, 0x1, 0xE, 0x0, 0x20, 0x16, 0x1, 0xE, 0x0, 0x28, 0x16, 0x1, 0xE, 0x0, 0x30, 0x16, 0x1, 0xE, 0x0, 0x38, 0x16, 0x1, 0xE, 0x0, 0x40, 0x16, 0x1, 0xE, 0x0, 0x48, 0x16, 0x1, 0xE, 0x0, 0x50, 0x16, 0x1, 0xE, 0x0, 0x58, 0x16, 0x1, 0xE, 0x0, 0x60, 0x16, 0x1, 0xE, 0x0, 0x68, 0x16, 0x1, 0xE, 0x0, 0x70, 0x16, 0x1, 0xE, 0x0, 0x78, 0x16, 0x1, 0xE, 0x0, 0x80, 0x16, 0x1, 0xE, 0x0, 0x88, 0x16, 0x1, 0xE, 0x0, 0x90, 0x16, 0x1, 0xE, 0x0, 0x98, 0x16, 0x1, 0xE, 0x0, 0xA0, 0x16, 0x1, 0xE, 0x0, 0xA8, 0x16, 0x1, 0xE, 0x0, 0xB0, 0x16, 0x1, 0xE, 0x0, 0xB8, 0x16, 0x1, 0xE, 0x0, 0xC0, 0x16, 0x1, 0xE, 0x0, 0xC8, 0x16, 0x1, 0xE, 0x0, 0xD0, 0x16, 0x1, 0xE, 0x0, 0xD8, 0x16, 0x1, 0xE, 0x0, 0xE0, 0x16, 0x1, 0xE, 0x0, 0xE8, 0x16, 0x1, 0xE, 0x0, 0xF0, 0x16, 0x1, 0xE, 0x0, 0xF8, 0x16, 0x1, 0xE, 0x0, 0x0, 0x17, 0x1, 0xE, 0x0, 0x8, 0x17, 0x1, 0xE, 0x0, 0x10, 0x17, 0x1, 0xE, 0x0, 0x18, 0x17, 0x1, 0xE, 0x0, 0x20, 0x17, 0x1, 0xE, 0x0, 0x28, 0x17, 0x1, 0xE, 0x0, 0x30, 0x17, 0x1, 0xEF, 0x5C, 0x4, 0x0, 0x0, 0xF, 0x5D, 0x4, 0x0, 0x0, 0x2F, 0x5D, 0x4, 0x0, 0x0, 0x4F, 0x5D, 0x4, 0x0, 0x0, 0x6F, 0x5D, 0x4, 0x0, 0x0, 0x8F, 0x5D, 0x4, 0x0, 0x0, 0xAF, 0x5D, 0x4, 0x0, 0x0, 0xCF, 0x5D, 0x4, 0x0, 0x0, 0xEF, 0x5D, 0x4, 0x0, 0x0, 0xF, 0x5E, 0x4, 0x0, 0x0, 0x2F, 0x5E, 0x4, 0x0, 0x0, 0x4F, 0x5E, 0x4, 0x0, 0x0, 0x6F, 0x5E, 0x4, 0x0, 0x0, 0x8F, 0x5E, 0x4, 0x0, 0x0, 0xAF, 0x5E, 0x4, 0x0, 0x0, 0xCF, 0x5E, 0x4, 0x0, 0x0, 0xEF, 0x5E, 0x4, 0x0, 0x0, 0xF, 0x5F, 0x4, 0x0, 0x0, 0x2F, 0x5F, 0x4, 0x0, 0x0, 0x4F, 0x5F, 0x4, 0x0, 0x0, 0x6F, 0x5F, 0x4, 0x0, 0x0, 0x8F, 0x5F, 0x4, 0x0, 0x0, 0xAF, 0x5F, 0x4, 0x0, 0x0, 0xCF, 0x5F, 0x4, 0x0, 0x0, 0xEF, 0x5F, 0x4, 0x0, 0x0, 0xF, 0x60, 0x4, 0x0, 0x0, 0x2F, 0x60, 0x14, 0x18, 0x1, 0x6F, 0x60, 0x24, 0x18, 0x1, 0xAF, 0x60, 0x34, 0x18, 0x1, 0xEF, 0x60, 0x44, 0x18, 0x1, 0x2F, 0x61, 0x54, 0x18, 0x1, 0x6F, 0x61, 0x64, 0x18, 0x1, 0xAF, 0x61, 0x74, 0x18, 0x1, 0xEF, 0x61, 0x84, 0x18, 0x1, 0x2F, 0x62, 0x94, 0x18, 0x1, 0x6F, 0x62, 0xA4, 0x18, 0x1, 0xAF, 0x62, 0xB4, 0x18, 0x1, 0xEF, 0x62, 0xC4, 0x18, 0x1, 0x2F, 0x63, 0xD4, 0x18, 0x1, 0x6F, 0x63, 0xE4, 0x18, 0x1, 0xAF, 0x63, 0xF4, 0x18, 0x1, 0xEF, 0x63, 0x4, 0x19, 0x1, 0x2F, 0x64, 0x14, 0x19, 0x1, 0x6F, 0x64, 0x24, 0x19, 0x1, 0xAF, 0x64, 0x34, 0x19, 0x1, 0xEF, 0x64, 0x44, 0x19, 0x1, 0x2F, 0x65, 0x54, 0x19, 0x1, 0x6F, 0x65, 0x64, 0x19, 0x1, 0xAF, 0x65, 0x74, 0x19, 0x1, 0xEF, 0x65, 0x84, 0x19, 0x1, 0x2F, 0x66, 0x94, 0x19, 0x1, 0x6F, 0x66, 0xA4, 0x19, 0x1, 0xAF, 0x66, 0xB4, 0x19, 0x1, 0xEF, 0x66, 0xC4, 0x19, 0x1, 0x2F, 0x67, 0xD4, 0x19, 0x1, 0x6F, 0x67, 0xE4, 0x19, 0x1, 0xAF, 0x67, 0xF4, 0x19, 0x1, 0xEF, 0x67, 0x4, 0x1A, 0x1, 0x2F, 0x68, 0x14, 0x1A, 0x1, 0x6F, 0x68, 0x24, 0x1A, 0x1, 0xAF, 0x68, 0x34, 0x1A, 0x1, 0xEF, 0x68, 0x44, 0x1A, 0x1, 0x2F, 0x69, 0x54, 0x1A, 0x1, 0x6F, 0x69, 0x64, 0x1A, 0x1, 0xAF, 0x69, 0x74, 0x1A, 0x1, 0xEF, 0x69, 0x84, 0x1A, 0x1, 0x2F, 0x6A, 0x94, 0x1A, 0x1, 0x6F, 0x6A, 0xA4, 0x1A, 0x1, 0xAF, 0x6A, 0xB4, 0x1A, 0x1, 0xEF, 0x6A, 0xC4, 0x1A, 0x1, 0x2F, 0x6B, 0xD4, 0x1A, 0x1, 0x6F, 0x6B, 0xE4, 0x1A, 0x1, 0xAF, 0x6B, 0xF4, 0x1A, 0x1, 0xEF, 0x6B, 0x4, 0x1B, 0x1, 0x2F, 0x6C, 0x14, 0x1B, 0x1, 0x6F, 0x6C, 0x24, 0x1B, 0x1, 0xAF, 0x6C, 0x34, 0x1B, 0x1, 0xEF, 0x6C, 0x44, 0x1B, 0x1, 0x2F, 0x6D, 0x54, 0x1B, 0x1, 0x6F, 0x6D, 0x64, 0x1B, 0x1, 0xAF, 0x6D, 0x74, 0x1B, 0x1, 0xEF, 0x6D, 0x84, 0x1B, 0x1, 0x2F, 0x6E, 0x94, 0x1B, 0x1, 0x6F, 0x6E, 0xA4, 0x1B, 0x1, 0xAF, 0x6E, 0xB4, 0x1B, 0x1, 0xEF, 0x6E, 0xC4, 0x1B, 0x1, 0x2F, 0x6F, 0xD4, 0x1B, 0x1, 0x6F, 0x6F, 0xE4, 0x1B, 0x1, 0xAF, 0x6F, 0xF4, 0x1B, 0x1, 0xEF, 0x6F, 0x4, 0x1C, 0x1, 0x2F, 0x70, 0x14, 0x1C, 0x1, 0x6F, 0x70, 0x24, 0x1C, 0x1, 0xAF, 0x70, 0x34, 0x1C, 0x1, 0xEF, 0x70, 0x44, 0x1C, 0x1, 0x2F, 0x71, 0x54, 0x1C, 0x1, 0x6F, 0x71, 0x64, 0x1C, 0x1, 0xAF, 0x71, 0x74, 0x1C, 0x1, 0xEF, 0x71, 0x84, 0x1C, 0x1, 0x2F, 0x72, 0x94, 0x1C, 0x1, 0x6F, 0x72, 0xA4, 0x1C, 0x1, 0xAF, 0x72, 0xB4, 0x1C, 0x1, 0xEF, 0x72, 0xC4, 0x1C, 0x1, 0x2F, 0x73, 0xD4, 0x1C, 0x1, 0x6F, 0x73, 0xE4, 0x1C, 0x1, 0xAF, 0x73, 0xF4, 0x1C, 0x1, 0xEF, 0x73, 0x4, 0x1D, 0x1, 0x2F, 0x74, 0x4, 0x0, 0x0, 0x4F, 0x74, 0x4, 0x0, 0x0, 0x6F, 0x74, 0x4, 0x0, 0x0, 0x8F, 0x74, 0x4, 0x0, 0x0, 0xAF, 0x74, 0x34, 0x1D, 0x1, 0xEF, 0x74, 0x44, 0x1D, 0x1, 0x2F, 0x75, 0x4, 0x0, 0x0, 0x4F, 0x75, 0x4, 0x0, 0x0, 0x6F, 0x75, 0x4, 0x0, 0x0, 0x8F, 0x75, 0x4, 0x0, 0x0, 0xAF, 0x75, 0x4, 0x0, 0x0, 0xCF, 0x75, 0x4, 0x0, 0x0, 0xEF, 0x75, 0x4, 0x0, 0x0, 0xF, 0x76, 0x4, 0x0, 0x0, 0x2F, 0x76, 0x94, 0x1D, 0x1, 0x6F, 0x76, 0xA4, 0x1D, 0x1, 0xAF, 0x76, 0xB4, 0x1D, 0x1, 0xEF, 0x76, 0xC4, 0x1D, 0x1, 0x2F, 0x77, 0xD4, 0x1D, 0x1, 0x6F, 0x77, 0xE4, 0x1D, 0x1, 0xAF, 0x77, 0xF4, 0x1D, 0x1, 0xEF, 0x77, 0x4, 0x1E, 0x1, 0x2F, 0x78, 0x4, 0x0, 0x0, 0x4F, 0x78, 0x4, 0x0, 0x0, 0x6F, 0x78, 0x4, 0x0, 0x0, 0x8F, 0x78, 0x4, 0x0, 0x0, 0xAF, 0x78, 0x4, 0x0, 0x0, 0xCF, 0x78, 0x4, 0x0, 0x0, 0xEF, 0x78, 0x4, 0x0, 0x0, 0xF, 0x79, 0x4, 0x0, 0x0, 0x2F, 0x79, 0x4, 0x0, 0x0, 0x4F, 0x79, 0x4, 0x0, 0x0, 0x6F, 0x79, 0x4, 0x0, 0x0, 0x8F, 0x79, 0x4, 0x0, 0x0, 0xAF, 0x79, 0x74, 0x1E, 0x1, 0xEF, 0x79, 0x4, 0x0, 0x0, 0xF, 0x7A, 0x4, 0x0, 0x0, 0x2F, 0x7A, 0x4, 0x0, 0x0, 0x4F, 0x7A, 0x4, 0x0, 0x0, 0x6F, 0x7A, 0x4, 0x0, 0x0, 0x8F, 0x7A, 0x4, 0x0, 0x0, 0xAF, 0x7A, 0xB4, 0x1E, 0x1, 0xEF, 0x7A, 0x4, 0x0, 0x0, 0xF, 0x7B, 0x4, 0x0, 0x0, 0x2F, 0x7B, 0x4, 0x0, 0x0, 0x4F, 0x7B, 0x4, 0x0, 0x0, 0x6F, 0x7B, 0x4, 0x0, 0x0, 0x8F, 0x7B, 0x4, 0x0, 0x0, 0xAF, 0x7B, 0x4, 0x0, 0x0, 0xCF, 0x7B, 0x4, 0x0, 0x0, 0xEF, 0x7B, 0x4, 0x0, 0x0, 0xF, 0x7C, 0x4, 0x0, 0x0, 0x2F, 0x7C, 0x4, 0x0, 0x0, 0x4F, 0x7C, 0x4, 0x0, 0x0, 0x6F, 0x7C, 0x4, 0x0, 0x0, 0x8F, 0x7C, 0x4, 0x0, 0x0, 0xAF, 0x7C, 0x4, 0x0, 0x0, 0xCF, 0x7C, 0x4, 0x0, 0x0, 0xEF, 0x7C, 0x4, 0x0, 0x0, 0xF, 0x7D, 0x4, 0x0, 0x0, 0x2F, 0x7D, 0x4, 0x0, 0x0, 0x4F, 0x7D, 0x4, 0x0, 0x0, 0x6F, 0x7D, 0x4, 0x0, 0x0, 0x8F, 0x7D, 0x4, 0x0, 0x0, 0xAF, 0x7D, 0x4, 0x0, 0x0, 0xCF, 0x7D, 0x4, 0x0, 0x0, 0xEF, 0x7D, 0x4, 0x0, 0x0, 0xF, 0x7E, 0x4, 0x0, 0x0, 0x2F, 0x7E, 0x4, 0x0, 0x0, 0x4F, 0x7E, 0x4, 0x0, 0x0, 0x6F, 0x7E, 0x4, 0x0, 0x0, 0x8F, 0x7E, 0x4, 0x0, 0x0, 0xAF, 0x7E, 0x4, 0x0, 0x0, 0xCF, 0x7E, 0x4, 0x0, 0x0, 0xEF, 0x7E, 0x4, 0x0, 0x0, 0xF, 0x7F, 0x4, 0x0, 0x0, 0x2F, 0x7F, 0x4, 0x0, 0x0, 0x4F, 0x7F, 0x4, 0x0, 0x0, 0x6F, 0x7F, 0x4, 0x0, 0x0, 0x8F, 0x7F, 0x4, 0x0, 0x0, 0xAF, 0x7F, 0x4, 0x0, 0x0, 0xCF, 0x7F, 0x4, 0x0, 0x0, 0xEF, 0x7F, 0x4, 0x0, 0x0, 0xF, 0x80, 0x4, 0x0, 0x0, 0x2F, 0x80, 0x4, 0x0, 0x0, 0x4F, 0x80, 0x4, 0x0, 0x0, 0x6F, 0x80, 0x4, 0x0, 0x0, 0x8F, 0x80, 0x4, 0x0, 0x0, 0xAF, 0x80, 0x4, 0x0, 0x0, 0xCF, 0x80, 0x4, 0x0, 0x0, 0xEF, 0x80, 0x4, 0x0, 0x0, 0xF, 0x81, 0x4, 0x0, 0x0, 0x2F, 0x81, 0x4, 0x0, 0x0, 0x4F, 0x81, 0x4, 0x0, 0x0, 0x6F, 0x81, 0x4, 0x0, 0x0, 0x8F, 0x81, 0x4, 0x0, 0x0, 0xAF, 0x81, 0x4, 0x0, 0x0, 0xCF, 0x81, 0x4, 0x0, 0x0, 0xEF, 0x81, 0x4, 0x0, 0x0, 0xF, 0x82, 0x4, 0x0, 0x0, 0x2F, 0x82, 0x4, 0x0, 0x0, 0x4F, 0x82, 0x4, 0x0, 0x0, 0x6F, 0x82, 0x4, 0x0, 0x0, 0x8F, 0x82, 0x4, 0x0, 0x0, 0xAF, 0x82, 0x4, 0x0, 0x0, 0xCF, 0x82, 0x4, 0x0, 0x0, 0xEF, 0x82, 0x4, 0x0, 0x0, 0xF, 0x83, 0x4, 0x0, 0x0, 0x2F, 0x83, 0x4, 0x0, 0x0, 0x4F, 0x83, 0x4, 0x0, 0x0, 0x6F, 0x83, 0x4, 0x0, 0x0, 0x8F, 0x83, 0x4, 0x0, 0x0, 0xAF, 0x83, 0x4, 0x0, 0x0, 0xCF, 0x83, 0x4, 0x0, 0x0, 0xEF, 0x83, 0x4, 0x0, 0x0, 0xF, 0x84, 0x4, 0x0, 0x0, 0x2F, 0x84, 0x4, 0x0, 0x0, 0x4F, 0x84, 0x4, 0x0, 0x0, 0x6F, 0x84, 0x4, 0x0, 0x0, 0xF, 0x0, 0x20, 0x21, 0x1, 0xF, 0x0, 0x28, 0x21, 0x1, 0xF, 0x0, 0x30, 0x21, 0x1, 0xF, 0x0, 0x38, 0x21, 0x1, 0xF, 0x0, 0x40, 0x21, 0x1, 0xF, 0x0, 0x48, 0x21, 0x1, 0xF, 0x0, 0x50, 0x21, 0x1, 0xF, 0x0, 0x58, 0x21, 0x1, 0xF, 0x0, 0x60, 0x21, 0x1, 0xF, 0x0, 0x68, 0x21, 0x1, 0xF, 0x0, 0x70, 0x21, 0x1, 0xF, 0x0, 0x78, 0x21, 0x1, 0xF, 0x0, 0x80, 0x21, 0x1, 0xF, 0x0, 0x88, 0x21, 0x1, 0xF, 0x0, 0x90, 0x21, 0x1, 0xF, 0x0, 0x98, 0x21, 0x1, 0xF, 0x0, 0xA0, 0x21, 0x1, 0xF, 0x0, 0xA8, 0x21, 0x1, 0xF, 0x0, 0xB0, 0x21, 0x1, 0xF, 0x0, 0xB8, 0x21, 0x1, 0xF, 0x0, 0xC0, 0x21, 0x1, 0xF, 0x0, 0xC8, 0x21, 0x1, 0xF, 0x0, 0xD0, 0x21, 0x1, 0xF, 0x0, 0xD8, 0x21, 0x1, 0xF, 0x0, 0xE0, 0x21, 0x1, 0xF, 0x0, 0xE8, 0x21, 0x1, 0xF, 0x0, 0xF0, 0x21, 0x1, 0xF, 0x0, 0xF8, 0x21, 0x1, 0xF, 0x0, 0x0, 0x22, 0x1, 0xF, 0x0, 0x8, 0x22, 0x1, 0xF, 0x0, 0x10, 0x22, 0x1, 0xF, 0x0, 0x18, 0x22, 0x1, 0xF, 0x0, 0x20, 0x22, 0x1, 0xF, 0x0, 0x28, 0x22, 0x1, 0xF, 0x0, 0x30, 0x22, 0x1, 0xF, 0x0, 0x38, 0x22, 0x1, 0xF, 0x0, 0x40, 0x22, 0x1, 0xF, 0x0, 0x48, 0x22, 0x1, 0xF, 0x0, 0x50, 0x22, 0x1, 0xF, 0x0, 0x58, 0x22, 0x1, 0xF, 0x0, 0x60, 0x22, 0x1, 0xF, 0x0, 0x68, 0x22, 0x1, 0xF, 0x0, 0x70, 0x22, 0x1, 0xF, 0x0, 0x78, 0x22, 0x1, 0xF, 0x0, 0x80, 0x22, 0x1, 0xF, 0x0, 0x88, 0x22, 0x1, 0xF, 0x0, 0x90, 0x22, 0x1, 0xF, 0x0, 0x98, 0x22, 0x1, 0xF, 0x0, 0xA0, 0x22, 0x1, 0xF, 0x0, 0xA8, 0x22, 0x1, 0xF, 0x0, 0xB0, 0x22, 0x1, 0xF, 0x0, 0xB8, 0x22, 0x1, 0xF, 0x0, 0xC0, 0x22, 0x1, 0xF, 0x0, 0xC8, 0x22, 0x1, 0xF, 0x0, 0xD0, 0x22, 0x1, 0xF, 0x0, 0xD8, 0x22, 0x1, 0xF, 0x0, 0xE0, 0x22, 0x1, 0xF, 0x0, 0xE8, 0x22, 0x1, 0xF, 0x0, 0xF0, 0x22, 0x1, 0xF, 0x0, 0xF8, 0x22, 0x1, 0xF, 0x0, 0x0, 0x23, 0x1, 0xF, 0x0, 0x8, 0x23, 0x1, 0xF, 0x0, 0x10, 0x23, 0x1, 0xF, 0x0, 0x18, 0x23, 0x1, 0xF, 0x0, 0x20, 0x23, 0x1, 0xF, 0x0, 0x28, 0x23, 0x1, 0xF, 0x0, 0x30, 0x23, 0x1, 0xF, 0x0, 0x38, 0x23, 0x1, 0xF, 0x0, 0x40, 0x23, 0x1, 0xF, 0x0, 0x48, 0x23, 0x1, 0xF, 0x0, 0x50, 0x23, 0x1, 0xF, 0x0, 0x58, 0x23, 0x1, 0xF, 0x0, 0x60, 0x23, 0x1, 0xF, 0x0, 0x68, 0x23, 0x1, 0xF, 0x0, 0x70, 0x23, 0x1, 0xF, 0x0, 0x78, 0x23, 0x1, 0xF, 0x0, 0x80, 0x23, 0x1, 0xF, 0x0, 0x88, 0x23, 0x1, 0xF, 0x0, 0x90, 0x23, 0x1, 0xF, 0x0, 0x98, 0x23, 0x1, 0xF, 0x0, 0xA0, 0x23, 0x1, 0xF, 0x0, 0xA8, 0x23, 0x1, 0xF, 0x0, 0xB0, 0x23, 0x1, 0xF, 0x0, 0xB8, 0x23, 0x1, 0xF, 0x0, 0xC0, 0x23, 0x1, 0xF, 0x0, 0xC8, 0x23, 0x1, 0xF, 0x0, 0xD0, 0x23, 0x1, 0xF, 0x0, 0xD8, 0x23, 0x1, 0xF, 0x0, 0xE0, 0x23, 0x1, 0xF, 0x0, 0xE8, 0x23, 0x1, 0xF, 0x0, 0xF0, 0x23, 0x1, 0xF, 0x0, 0xF8, 0x23, 0x1, 0xF, 0x0, 0x0, 0x24, 0x1, 0xF, 0x0, 0x8, 0x24, 0x1, 0xF, 0x0, 0x10, 0x24, 0x1, 0xF, 0x0, 0x18, 0x24, 0x1, 0xF, 0x0, 0x20, 0x24, 0x1, 0xF, 0x0, 0x28, 0x24, 0x1, 0xF, 0x0, 0x30, 0x24, 0x1, 0xF, 0x0, 0x38, 0x24, 0x1, 0xF, 0x0, 0x40, 0x24, 0x1, 0xF, 0x0, 0x48, 0x24, 0x1, 0xF, 0x0, 0x50, 0x24, 0x1, 0xF, 0x0, 0x58, 0x24, 0x1, 0xF, 0x0, 0x60, 0x24, 0x1, 0xF, 0x0, 0x68, 0x24, 0x1, 0xF, 0x0, 0x70, 0x24, 0x1, 0xF, 0x0, 0x78, 0x24, 0x1, 0xF, 0x0, 0x80, 0x24, 0x1, 0xF, 0x0, 0x88, 0x24, 0x1, 0xF, 0x0, 0x90, 0x24, 0x1, 0xF, 0x0, 0x98, 0x24, 0x1, 0xF, 0x0, 0xA0, 0x24, 0x1, 0xF, 0x0, 0xA8, 0x24, 0x1, 0xF, 0x0, 0xB0, 0x24, 0x1, 0xF, 0x0, 0xB8, 0x24, 0x1, 0xF, 0x0, 0xC0, 0x24, 0x1, 0xF, 0x0, 0xC8, 0x24, 0x1, 0xF, 0x0, 0xD0, 0x24, 0x1, 0xF, 0x0, 0xD8, 0x24, 0x1, 0xF, 0x0, 0xE0, 0x24, 0x1, 0xF, 0x0, 0xE8, 0x24, 0x1, 0xF, 0x0, 0xF0, 0x24, 0x1, 0xF, 0x0, 0xF8, 0x24, 0x1, 0xF, 0x0, 0x0, 0x25, 0x1, 0xF, 0x0, 0x8, 0x25, 0x1, 0xF, 0x0, 0x10, 0x25, 0x1, 0xF, 0x0, 0x18, 0x25, 0x1, 0xF, 0x0, 0x20, 0x25, 0x1, 0xF, 0x0, 0x28, 0x25, 0x1, 0xF, 0x0, 0x30, 0x25, 0x1, 0xF, 0x0, 0x38, 0x25, 0x1, 0xF, 0x0, 0x40, 0x25, 0x1, 0xF, 0x0, 0x48, 0x25, 0x1, 0xF, 0x0, 0x50, 0x25, 0x1, 0xF, 0x0, 0x58, 0x25, 0x1, 0xF, 0x0, 0x60, 0x25, 0x1, 0xF, 0x0, 0x68, 0x25, 0x1, 0xF, 0x0, 0x70, 0x25, 0x1, 0xF, 0x0, 0x78, 0x25, 0x1, 0xF, 0x0, 0x80, 0x25, 0x1, 0xF, 0x0, 0x88, 0x25, 0x1, 0xF, 0x0, 0x90, 0x25, 0x1, 0xF, 0x0, 0x98, 0x25, 0x1, 0xF, 0x0, 0xA0, 0x25, 0x1, 0xF, 0x0, 0xA8, 0x25, 0x1, 0xF, 0x0, 0xB0, 0x25, 0x1, 0xF, 0x0, 0xB8, 0x25, 0x1, 0xF, 0x0, 0xC0, 0x25, 0x1, 0xF, 0x0, 0xC8, 0x25, 0x1, 0xF, 0x0, 0xD0, 0x25, 0x1, 0xF, 0x0, 0xD8, 0x25, 0x1, 0xF, 0x0, 0xE0, 0x25, 0x1, 0xF, 0x0, 0xE8, 0x25, 0x1, 0xF, 0x0, 0xF0, 0x25, 0x1, 0xF, 0x0, 0xF8, 0x25, 0x1, 0xF, 0x0, 0x0, 0x26, 0x1, 0xF, 0x0, 0x8, 0x26, 0x1, 0xF, 0x0, 0x10, 0x26, 0x1, 0xF, 0x0, 0x18, 0x26, 0x1, 0xF, 0x0, 0x20, 0x26, 0x1, 0xF, 0x0, 0x28, 0x26, 0x1, 0xF, 0x0, 0x30, 0x26, 0x1, 0xF, 0x0, 0x38, 0x26, 0x1, 0xF, 0x0, 0x40, 0x26, 0x1, 0xF, 0x0, 0x48, 0x26, 0x1, 0xF, 0x0, 0x50, 0x26, 0x1, 0xF, 0x0, 0x58, 0x26, 0x1, 0xF, 0x0, 0x60, 0x26, 0x1, 0xF, 0x0, 0x68, 0x26, 0x1, 0xF, 0x0, 0x70, 0x26, 0x1, 0xF, 0x0, 0x78, 0x26, 0x1, 0xF, 0x0, 0x80, 0x26, 0x1, 0xF, 0x0, 0x88, 0x26, 0x1, 0xF, 0x0, 0x90, 0x26, 0x1, 0xF, 0x0, 0x98, 0x26, 0x1, 0xF, 0x0, 0xA0, 0x26, 0x1, 0xF, 0x0, 0xA8, 0x26, 0x1, 0xF, 0x0, 0xB0, 0x26, 0x1, 0xF, 0x0, 0xB8, 0x26, 0x1, 0xF, 0x0, 0xC0, 0x26, 0x1, 0xF, 0x0, 0xC8, 0x26, 0x1, 0xF, 0x0, 0xD0, 0x26, 0x1, 0xF, 0x0, 0xD8, 0x26, 0x1, 0xF, 0x0, 0xE0, 0x26, 0x1, 0xF, 0x0, 0xE8, 0x26, 0x1, 0xF, 0x0, 0xF0, 0x26, 0x1, 0xF, 0x0, 0xF8, 0x26, 0x1, 0xF, 0x0, 0x0, 0x27, 0x1, 0xF, 0x0, 0x8, 0x27, 0x1, 0xF, 0x0, 0x10, 0x27, 0x1, 0xF, 0x0, 0x18, 0x27, 0x1, 0xF, 0x0, 0x20, 0x27, 0x1, 0xF, 0x0, 0x28, 0x27, 0x1, 0xF, 0x0, 0x30, 0x27, 0x1, 0xF, 0x0, 0x38, 0x27, 0x1, 0xF, 0x0, 0x40, 0x27, 0x1, 0xF, 0x0, 0x48, 0x27, 0x1, 0xF, 0x0, 0x50, 0x27, 0x1, 0xF, 0x0, 0x58, 0x27, 0x1, 0xF, 0x0, 0x60, 0x27, 0x1, 0xF, 0x0, 0x68, 0x27, 0x1, 0xF, 0x0, 0x70, 0x27, 0x1, 0xF, 0x0, 0x78, 0x27, 0x1, 0xF, 0x0, 0x80, 0x27, 0x1, 0xF, 0x0, 0x88, 0x27, 0x1, 0xF, 0x0, 0x90, 0x27, 0x1, 0xF, 0x0, 0x98, 0x27, 0x1, 0xF, 0x0, 0xA0, 0x27, 0x1, 0xF, 0x0, 0xA8, 0x27, 0x1, 0xF, 0x0, 0xB0, 0x27, 0x1, 0xF, 0x0, 0xB8, 0x27, 0x1, 0xF, 0x0, 0xC0, 0x27, 0x1, 0xF, 0x0, 0xC8, 0x27, 0x1, 0xF, 0x0, 0xD0, 0x27, 0x1, 0xF, 0x0, 0xD8, 0x27, 0x1, 0xF, 0x0, 0xE0, 0x27, 0x1, 0xF, 0x0, 0xE8, 0x27, 0x1, 0xF, 0x0, 0xF0, 0x27, 0x1, 0xF, 0x0, 0xF8, 0x27, 0x1, 0xF, 0x0, 0x0, 0x28, 0x1, 0xF, 0x0, 0x8, 0x28, 0x1, 0xF, 0x0, 0x10, 0x28, 0x1, 0xF, 0x0, 0x18, 0x28, 0x1, 0xF, 0x0, 0x20, 0x28, 0x1, 0xF, 0x0, 0x28, 0x28, 0x1, 0xF, 0x0, 0x30, 0x28, 0x1, 0xF, 0x0, 0x38, 0x28, 0x1, 0xF, 0x0, 0x40, 0x28, 0x1, 0xF, 0x0, 0x48, 0x28, 0x1, 0xF, 0x0, 0x50, 0x28, 0x1, 0xF, 0x0, 0x58, 0x28, 0x1, 0xF, 0x0, 0x60, 0x28, 0x1, 0xF, 0x0, 0x68, 0x28, 0x1, 0xF, 0x0, 0x70, 0x28, 0x1, 0xF, 0x0, 0x78, 0x28, 0x1, 0xF, 0x0, 0x80, 0x28, 0x1, 0xF, 0x0, 0x88, 0x28, 0x1, 0xF, 0x0, 0x90, 0x28, 0x1, 0xF, 0x0, 0x98, 0x28, 0x1, 0xF, 0x0, 0xA0, 0x28, 0x1, 0xF, 0x0, 0xA8, 0x28, 0x1, 0xF, 0x0, 0xB0, 0x28, 0x1, 0xF, 0x0, 0xB8, 0x28, 0x1, 0xF, 0x0, 0xC0, 0x28, 0x1, 0xF, 0x0, 0xC8, 0x28, 0x1, 0xF, 0x0, 0xD0, 0x28, 0x1, 0xF, 0x0, 0xD8, 0x28, 0x1, 0xF, 0x0, 0xE0, 0x28, 0x1, 0xF, 0x0, 0xE8, 0x28, 0x1, 0xF, 0x0, 0xF0, 0x28, 0x1, 0xF, 0x0, 0xF8, 0x28, 0x1, 0xF, 0x0, 0x0, 0x29, 0x1, 0xF, 0x0, 0x8, 0x29, 0x1, 0xF, 0x0, 0x10, 0x29, 0x1, 0xF, 0x0, 0x18, 0x29, 0x1, 0xF, 0x0, 0x20, 0x29, 0x1, 0xF, 0x0, 0x28, 0x29, 0x1, 0xF, 0x0, 0x30, 0x29, 0x1, 0xF, 0x0, 0x38, 0x29, 0x1, 0xF, 0x0, 0x40, 0x29, 0x1, 0xF, 0x0, 0x48, 0x29, 0x1, 0xF, 0x0, 0x50, 0x29, 0x1, 0xF, 0x0, 0x58, 0x29, 0x1, 0xF, 0x0, 0x60, 0x29, 0x1, 0xF, 0x0, 0x68, 0x29, 0x1, 0xF, 0x0, 0x70, 0x29, 0x1, 0xF, 0x0, 0x78, 0x29, 0x1, 0xF, 0x0, 0x80, 0x29, 0x1, 0xF, 0x0, 0x88, 0x29, 0x1, 0xF, 0x0, 0x90, 0x29, 0x1, 0xF, 0x0, 0x98, 0x29, 0x1, 0xF, 0x0, 0xA0, 0x29, 0x1, 0xF, 0x0, 0xA8, 0x29, 0x1, 0xF, 0x0, 0xB0, 0x29, 0x1, 0xF, 0x0, 0xB8, 0x29, 0x1, 0xF, 0x0, 0xC0, 0x29, 0x1, 0xF, 0x0, 0xC8, 0x29, 0x1, 0xF, 0x0, 0xD0, 0x29, 0x1, 0xF, 0x0, 0xD8, 0x29, 0x1, 0xF, 0x0, 0xE0, 0x29, 0x1, 0xF, 0x0, 0xE8, 0x29, 0x1, 0xF, 0x0, 0xF0, 0x29, 0x1, 0xF, 0x0, 0xF8, 0x29, 0x1, 0xF, 0x0, 0x0, 0x2A, 0x1, 0xF, 0x0, 0x8, 0x2A, 0x1, 0xF, 0x0, 0x10, 0x2A, 0x1, 0xF, 0x0, 0x18, 0x2A, 0x1, 0xF, 0x0, 0x20, 0x2A, 0x1, 0xF, 0x0, 0x28, 0x2A, 0x1, 0xF, 0x0, 0x30, 0x2A, 0x1, 0xF, 0x0, 0x38, 0x2A, 0x1, 0xF, 0x0, 0x40, 0x2A, 0x1, 0xF, 0x0, 0x48, 0x2A, 0x1, 0xF, 0x0, 0x50, 0x2A, 0x1, 0xF, 0x0, 0x58, 0x2A, 0x1, 0xF, 0x0, 0x60, 0x2A, 0x1, 0xF, 0x0, 0x68, 0x2A, 0x1, 0xF, 0x0, 0x70, 0x2A, 0x1, 0xF, 0x0, 0x78, 0x2A, 0x1, 0xF, 0x0, 0x80, 0x2A, 0x1, 0xF, 0x0, 0x88, 0x2A, 0x1, 0xF, 0x0, 0x90, 0x2A, 0x1, 0xF, 0x0, 0x98, 0x2A, 0x1, 0xF, 0x0, 0xA0, 0x2A, 0x1, 0xF, 0x0, 0xA8, 0x2A, 0x1, 0xF, 0x0, 0xB0, 0x2A, 0x1, 0xF, 0x0, 0xB8, 0x2A, 0x1, 0xF, 0x0, 0xC0, 0x2A, 0x1, 0xF, 0x0, 0xC8, 0x2A, 0x1, 0xF, 0x0, 0xD0, 0x2A, 0x1, 0xF, 0x0, 0xD8, 0x2A, 0x1, 0xF, 0x0, 0xE0, 0x2A, 0x1, 0xF, 0x0, 0xE8, 0x2A, 0x1, 0xF, 0x0, 0xF0, 0x2A, 0x1, 0xF, 0x0, 0xF8, 0x2A, 0x1, 0xF, 0x0, 0x0, 0x2B, 0x1, 0xF, 0x0, 0x8, 0x2B, 0x1, 0xF, 0x0, 0x10, 0x2B, 0x1, 0xF, 0x0, 0x18, 0x2B, 0x1, 0xF, 0x0, 0x20, 0x2B, 0x1, 0xF, 0x0, 0x28, 0x2B, 0x1, 0xF, 0x0, 0x30, 0x2B, 0x1, 0xF, 0x0, 0x38, 0x2B, 0x1, 0xF, 0x0, 0x40, 0x2B, 0x1, 0xF, 0x0, 0x48, 0x2B, 0x1, 0xF, 0x0, 0x50, 0x2B, 0x1, 0xF, 0x0, 0x58, 0x2B, 0x1, 0xF, 0x0, 0x60, 0x2B, 0x1, 0xF, 0x0, 0x68, 0x2B, 0x1, 0xF, 0x0, 0x70, 0x2B, 0x1, 0xF, 0x0, 0x78, 0x2B, 0x1, 0xF, 0x0, 0x80, 0x2B, 0x1, 0xF, 0x0, 0x88, 0x2B, 0x1, 0xF, 0x0, 0x90, 0x2B, 0x1, 0xF, 0x0, 0x98, 0x2B, 0x1, 0xF, 0x0, 0xA0, 0x2B, 0x1, 0xF, 0x0, 0xA8, 0x2B, 0x1, 0xF, 0x0, 0xB0, 0x2B, 0x1, 0xF, 0x0, 0xB8, 0x2B, 0x1, 0xF, 0x0, 0xC0, 0x2B, 0x1, 0xF, 0x0, 0xC8, 0x2B, 0x1, 0xF, 0x0, 0xD0, 0x2B, 0x1, 0xF, 0x0, 0xD8, 0x2B, 0x1, 0xF, 0x0, 0xE0, 0x2B, 0x1, 0xF, 0x0, 0xE8, 0x2B, 0x1, 0xF, 0x0, 0xF0, 0x2B, 0x1, 0xF, 0x0, 0xF8, 0x2B, 0x1, 0xF, 0x0, 0x0, 0x2C, 0x1, 0xF, 0x0, 0x8, 0x2C, 0x1, 0xF, 0x0, 0x10, 0x2C, 0x1, 0xF, 0x0, 0x18, 0x2C, 0x1, 0xF, 0x0, 0x20, 0x2C, 0x1, 0xF, 0x0, 0x28, 0x2C, 0x1, 0xF, 0x0, 0x30, 0x2C, 0x1, 0xF, 0x0, 0x38, 0x2C, 0x1, 0xF, 0x0, 0x40, 0x2C, 0x1, 0xF, 0x0, 0x48, 0x2C, 0x1, 0xF, 0x0, 0x50, 0x2C, 0x1, 0xF, 0x0, 0x58, 0x2C, 0x1, 0xF, 0x0, 0x60, 0x2C, 0x1, 0xF, 0x0, 0x68, 0x2C, 0x1, 0xF, 0x0, 0x70, 0x2C, 0x1, 0xF, 0x0, 0x78, 0x2C, 0x1, 0xF, 0x0, 0x80, 0x2C, 0x1, 0xF, 0x0, 0x88, 0x2C, 0x1, 0xF, 0x0, 0x90, 0x2C, 0x1, 0xF, 0x0, 0x98, 0x2C, 0x1, 0xF, 0x0, 0xA0, 0x2C, 0x1, 0xF, 0x0, 0xA8, 0x2C, 0x1, 0xF, 0x0, 0xB0, 0x2C, 0x1, 0xF, 0x0, 0xB8, 0x2C, 0x1, 0xF, 0x0, 0xC0, 0x2C, 0x1, 0xF, 0x0, 0xC8, 0x2C, 0x1, 0xF, 0x0, 0xD0, 0x2C, 0x1, 0xF, 0x0, 0xD8, 0x2C, 0x1, 0xF, 0x0, 0xE0, 0x2C, 0x1, 0xF, 0x0, 0xE8, 0x2C, 0x1, 0xF, 0x0, 0xF0, 0x2C, 0x1, 0xF, 0x0, 0xF8, 0x2C, 0x1, 0xF, 0x0, 0x0, 0x2D, 0x1, 0xF, 0x0, 0x8, 0x2D, 0x1, 0xF, 0x0, 0x10, 0x2D, 0x1, 0xF, 0x0, 0x18, 0x2D, 0x1, 0xF, 0x0, 0x20, 0x2D, 0x1, 0xF, 0x0, 0x28, 0x2D, 0x1, 0xF, 0x0, 0x30, 0x2D, 0x1, 0xF, 0x0, 0x38, 0x2D, 0x1, 0xF, 0x0, 0x40, 0x2D, 0x1, 0xF, 0x0, 0x48, 0x2D, 0x1, 0xF, 0x0, 0x50, 0x2D, 0x1, 0xF, 0x0, 0x58, 0x2D, 0x1, 0xF, 0x0, 0x60, 0x2D, 0x1, 0xF, 0x0, 0x68, 0x2D, 0x1, 0xF, 0x0, 0x70, 0x2D, 0x1, 0xF, 0x0, 0x78, 0x2D, 0x1, 0xF, 0x0, 0x80, 0x2D, 0x1, 0xF, 0x0, 0x88, 0x2D, 0x1, 0xF, 0x0, 0x90, 0x2D, 0x1, 0xF, 0x0, 0x98, 0x2D, 0x1, 0xF, 0x0, 0xA0, 0x2D, 0x1, 0xF, 0x0, 0xA8, 0x2D, 0x1, 0xF, 0x0, 0xB0, 0x2D, 0x1, 0xF, 0x0, 0xB8, 0x2D, 0x1, 0xF, 0x0, 0xC0, 0x2D, 0x1, 0xF, 0x0, 0xC8, 0x2D, 0x1, 0xF, 0x0, 0xD0, 0x2D, 0x1, 0xF, 0x0, 0xD8, 0x2D, 0x1, 0xF, 0x0, 0xE0, 0x2D, 0x1, 0xF, 0x0, 0xE8, 0x2D, 0x1, 0xF, 0x0, 0xF0, 0x2D, 0x1, 0xF, 0x0, 0xF8, 0x2D, 0x1, 0xF, 0x0, 0x0, 0x2E, 0x1, 0xF, 0x0, 0x8, 0x2E, 0x1, 0xF, 0x0, 0x10, 0x2E, 0x1, 0xF, 0x0, 0x18, 0x2E, 0x1, 0xF, 0x0, 0x20, 0x2E, 0x1, 0xF, 0x0, 0x28, 0x2E, 0x1, 0xF, 0x0, 0x30, 0x2E, 0x1, 0xF, 0x0, 0x38, 0x2E, 0x1, 0xF, 0x0, 0x40, 0x2E, 0x1, 0xF, 0x0, 0x48, 0x2E, 0x1, 0xF, 0x0, 0x50, 0x2E, 0x1, 0xF, 0x0, 0x58, 0x2E, 0x1, 0xF, 0x0, 0x60, 0x2E, 0x1, 0xF, 0x0, 0x68, 0x2E, 0x1, 0xF, 0x0, 0x70, 0x2E, 0x1, 0xF, 0x0, 0x78, 0x2E, 0x1, 0xF, 0x0, 0x80, 0x2E, 0x1, 0xF, 0x0, 0x88, 0x2E, 0x1, 0xF, 0x0, 0x90, 0x2E, 0x1, 0xF, 0x0, 0x98, 0x2E, 0x1, 0xF, 0x0, 0xA0, 0x2E, 0x1, 0xF, 0x0, 0xA8, 0x2E, 0x1, 0xF, 0x0, 0xB0, 0x2E, 0x1, 0xF, 0x0, 0xB8, 0x2E, 0x1, 0xF, 0x0, 0xC0, 0x2E, 0x1, 0xF, 0x0, 0xC8, 0x2E, 0x1, 0xF, 0x0, 0xD0, 0x2E, 0x1, 0xF, 0x0, 0xD8, 0x2E, 0x1, 0xF, 0x0, 0xE0, 0x2E, 0x1, 0xF, 0x0, 0xE8, 0x2E, 0x1, 0xF, 0x0, 0xF0, 0x2E, 0x1, 0xF, 0x0, 0xF8, 0x2E, 0x1, 0xF, 0x0, 0x0, 0x2F, 0x1, 0xF, 0x0, 0x8, 0x2F, 0x1, 0xF, 0x0, 0x10, 0x2F, 0x1, 0xF, 0x0, 0x18, 0x2F, 0x1, 0xF, 0x0, 0x20, 0x2F, 0x1, 0xF, 0x0, 0x28, 0x2F, 0x1, 0xF, 0x0, 0x30, 0x2F, 0x1, 0xF, 0x0, 0x38, 0x2F, 0x1, 0xF, 0x0, 0x40, 0x2F, 0x1, 0xF, 0x0, 0x48, 0x2F, 0x1, 0xF, 0x0, 0x50, 0x2F, 0x1, 0xF, 0x0, 0x58, 0x2F, 0x1, 0xF, 0x0, 0x60, 0x2F, 0x1, 0xF, 0x0, 0x68, 0x2F, 0x1, 0xF, 0x0, 0x70, 0x2F, 0x1, 0xF, 0x0, 0x78, 0x2F, 0x1, 0xF, 0x0, 0x80, 0x2F, 0x1, 0xF, 0x0, 0x88, 0x2F, 0x1, 0xF, 0x0, 0x90, 0x2F, 0x1, 0xF, 0x0, 0x98, 0x2F, 0x1, 0xF, 0x0, 0xA0, 0x2F, 0x1, 0xF, 0x0, 0xA8, 0x2F, 0x1, 0xF, 0x0, 0xB0, 0x2F, 0x1, 0xF, 0x0, 0xB8, 0x2F, 0x1, 0xF, 0x0, 0xC0, 0x2F, 0x1, 0xF, 0x0, 0xC8, 0x2F, 0x1, 0xF, 0x0, 0xD0, 0x2F, 0x1, 0xF, 0x0, 0xD8, 0x2F, 0x1, 0xF, 0x0, 0xE0, 0x2F, 0x1, 0xF, 0x0, 0xE8, 0x2F, 0x1, 0xF, 0x0, 0xF0, 0x2F, 0x1, 0xF, 0x0, 0xF8, 0x2F, 0x1, 0xF, 0x0, 0x0, 0x30, 0x1, 0xF, 0x0, 0x8, 0x30, 0x1, 0xF, 0x0, 0x10, 0x30, 0x1, 0xF, 0x0, 0x18, 0x30, 0x1, 0xF, 0x0, 0x20, 0x30, 0x1, 0xF, 0x0, 0x28, 0x30, 0x1, 0xF, 0x0, 0x30, 0x30, 0x1, 0xF, 0x0, 0x38, 0x30, 0x1, 0xF, 0x0, 0x40, 0x30, 0x1, 0xF, 0x0, 0x48, 0x30, 0x1, 0xF, 0x0, 0x50, 0x30, 0x1, 0xF, 0x0, 0x58, 0x30, 0x1, 0xF, 0x0, 0x60, 0x30, 0x1, 0xF, 0x0, 0x68, 0x30, 0x1, 0xF, 0x0, 0x70, 0x30, 0x1, 0xF, 0x0, 0x78, 0x30, 0x1, 0xF, 0x0, 0x80, 0x30, 0x1, 0xF, 0x0, 0x88, 0x30, 0x1, 0xF, 0x0, 0x90, 0x30, 0x1, 0xF, 0x0, 0x98, 0x30, 0x1, 0xF, 0x0, 0xA0, 0x30, 0x1, 0xF, 0x0, 0xA8, 0x30, 0x1, 0xF, 0x0, 0xB0, 0x30, 0x1, 0xF, 0x0, 0xB8, 0x30, 0x1, 0xF, 0x0, 0xC0, 0x30, 0x1, 0xF, 0x0, 0xC8, 0x30, 0x1, 0xF, 0x0, 0xD0, 0x30, 0x1, 0xF, 0x0, 0xD8, 0x30, 0x1, 0xF, 0x0, 0xE0, 0x30, 0x1, 0xF, 0x0, 0xE8, 0x30, 0x1, 0xF, 0x0, 0xF0, 0x30, 0x1, 0xF, 0x0, 0xF8, 0x30, 0x1, 0xF, 0x0, 0x0, 0x31, 0x1, 0xF, 0x0, 0x8, 0x31, 0x1, 0xF, 0x0, 0x10, 0x31, 0x1, 0xF, 0x0, 0x18, 0x31, 0x1, 0xF, 0x0, 0x20, 0x31, 0x1, 0xF, 0x0, 0x28, 0x31, 0x1, 0xF, 0x0, 0x30, 0x31, 0x1, 0xF, 0x0, 0x38, 0x31, 0x1, 0xF, 0x0, 0x40, 0x31, 0x1, 0xF, 0x0, 0x48, 0x31, 0x1, 0xF, 0x0, 0x50, 0x31, 0x1, 0xF, 0x0, 0x58, 0x31, 0x1, 0xF, 0x0, 0x60, 0x31, 0x1, 0xF, 0x0, 0x68, 0x31, 0x1, 0xF, 0x0, 0x70, 0x31, 0x1, 0xF, 0x0, 0x78, 0x31, 0x1, 0xF, 0x0, 0x80, 0x31, 0x1, 0xF, 0x0, 0x88, 0x31, 0x1, 0xF, 0x0, 0x90, 0x31, 0x1, 0xF, 0x0, 0x98, 0x31, 0x1, 0xF, 0x0, 0xA0, 0x31, 0x1, 0xF, 0x0, 0xA8, 0x31, 0x1, 0xF, 0x0, 0xB0, 0x31, 0x1, 0xF, 0x0, 0xB8, 0x31, 0x1, 0xF, 0x0, 0xC0, 0x31, 0x1, 0xF, 0x0, 0xC8, 0x31, 0x1, 0xF, 0x0, 0xD0, 0x31, 0x1, 0xF, 0x0, 0xD8, 0x31, 0x1, 0xF, 0x0, 0xE0, 0x31, 0x1, 0xF, 0x0, 0xE8, 0x31, 0x1, 0xF, 0x0, 0xF0, 0x31, 0x1, 0xF, 0x0, 0xF8, 0x31, 0x1, 0xF, 0x0, 0x0, 0x32, 0x1, 0xF, 0x0, 0x8, 0x32, 0x1, 0xF, 0x0, 0x10, 0x32, 0x1, 0xF, 0x0, 0x18, 0x32, 0x1, 0xF, 0x0, 0x20, 0x32, 0x1, 0xF, 0x0, 0x28, 0x32, 0x1, 0xF, 0x0, 0x30, 0x32, 0x1, 0xF, 0x0, 0x38, 0x32, 0x1, 0xF, 0x0, 0x40, 0x32, 0x1, 0xF, 0x0, 0x48, 0x32, 0x1, 0xF, 0x0, 0x50, 0x32, 0x1, 0xF, 0x0, 0x58, 0x32, 0x1, 0xF, 0x0, 0x60, 0x32, 0x1, 0xF, 0x0, 0x68, 0x32, 0x1, 0xF, 0x0, 0x70, 0x32, 0x1, 0xF, 0x0, 0x78, 0x32, 0x1, 0xF, 0x0, 0x80, 0x32, 0x1, 0xF, 0x0, 0x88, 0x32, 0x1, 0xF, 0x0, 0x90, 0x32, 0x1, 0xF, 0x0, 0x98, 0x32, 0x1, 0xF, 0x0, 0xA0, 0x32, 0x1, 0xF, 0x0, 0xA8, 0x32, 0x1, 0xF, 0x0, 0xB0, 0x32, 0x1, 0xF, 0x0, 0xB8, 0x32, 0x1, 0xF, 0x0, 0xC0, 0x32, 0x1, 0xF, 0x0, 0xC8, 0x32, 0x1, 0xF, 0x0, 0xD0, 0x32, 0x1, 0xF, 0x0, 0xD8, 0x32, 0x1, 0xF, 0x0, 0xE0, 0x32, 0x1, 0xF, 0x0, 0xE8, 0x32, 0x1, 0xF, 0x0, 0xF0, 0x32, 0x1, 0xF, 0x0, 0xF8, 0x32, 0x1, 0xF, 0x0, 0x0, 0x33, 0x1, 0xF, 0x0, 0x8, 0x33, 0x1, 0xF, 0x0, 0x10, 0x33, 0x1, 0xF, 0x0, 0x18, 0x33, 0x1, 0xF, 0x0, 0x20, 0x33, 0x1, 0xF, 0x0, 0x28, 0x33, 0x1, 0xF, 0x0, 0x30, 0x33, 0x1, 0xF, 0x0, 0x38, 0x33, 0x1, 0xF, 0x0, 0x40, 0x33, 0x1, 0xF, 0x0, 0x48, 0x33, 0x1, 0xF, 0x0, 0x50, 0x33, 0x1, 0xF, 0x0, 0x58, 0x33, 0x1, 0xF, 0x0, 0x60, 0x33, 0x1, 0xF, 0x0, 0x68, 0x33, 0x1, 0xF, 0x0, 0x70, 0x33, 0x1, 0xF, 0x0, 0x78, 0x33, 0x1, 0xF, 0x0, 0x80, 0x33, 0x1, 0xF, 0x0, 0x88, 0x33, 0x1, 0xF, 0x0, 0x90, 0x33, 0x1, 0xF, 0x0, 0x98, 0x33, 0x1, 0xF, 0x0, 0xA0, 0x33, 0x1, 0xF, 0x0, 0xA8, 0x33, 0x1, 0xF, 0x0, 0xB0, 0x33, 0x1, 0xF, 0x0, 0xB8, 0x33, 0x1, 0xF, 0x0, 0xC0, 0x33, 0x1, 0xF, 0x0, 0xC8, 0x33, 0x1, 0xF, 0x0, 0xD0, 0x33, 0x1, 0xF, 0x0, 0xD8, 0x33, 0x1, 0xF, 0x0, 0xE0, 0x33, 0x1, 0xF, 0x0, 0xE8, 0x33, 0x1, 0xF, 0x0, 0xF0, 0x33, 0x1, 0xF, 0x0, 0xF8, 0x33, 0x1, 0xF, 0x0, 0x0, 0x34, 0x1, 0xF, 0x0, 0x8, 0x34, 0x1, 0xF, 0x0, 0x10, 0x34, 0x1, 0xF, 0x0, 0x18, 0x34, 0x1, 0xF, 0x0, 0x20, 0x34, 0x1, 0xF, 0x0, 0x28, 0x34, 0x1, 0xF, 0x0, 0x30, 0x34, 0x1, 0xF, 0x0, 0x38, 0x34, 0x1, 0xF, 0x0, 0x40, 0x34, 0x1, 0xF, 0x0, 0x48, 0x34, 0x1, 0xF, 0x0, 0x50, 0x34, 0x1, 0xF, 0x0, 0x58, 0x34, 0x1, 0xF, 0x0, 0x60, 0x34, 0x1, 0xF, 0x0, 0x68, 0x34, 0x1, 0xF, 0x0, 0x70, 0x34, 0x1, 0xF, 0x0, 0x78, 0x34, 0x1, 0xF, 0x0, 0x80, 0x34, 0x1, 0xF, 0x0, 0x88, 0x34, 0x1, 0xF, 0x0, 0x90, 0x34, 0x1, 0xF, 0x0, 0x98, 0x34, 0x1, 0xF, 0x0, 0xA0, 0x34, 0x1, 0xF, 0x0, 0xA8, 0x34, 0x1, 0xF, 0x0, 0xB0, 0x34, 0x1, 0xF, 0x0, 0xB8, 0x34, 0x1, 0xF, 0x0, 0xC0, 0x34, 0x1, 0xF, 0x0, 0xC8, 0x34, 0x1, 0xF, 0x0, 0xD0, 0x34, 0x1, 0xF, 0x0, 0xD8, 0x34, 0x1, 0xF, 0x0, 0xE0, 0x34, 0x1, 0xF, 0x0, 0xE8, 0x34, 0x1, 0xF, 0x0, 0xF0, 0x34, 0x1, 0xF, 0x0, 0xF8, 0x34, 0x1, 0xF, 0x0, 0x0, 0x35, 0x1, 0xF, 0x0, 0x8, 0x35, 0x1, 0xF, 0x0, 0x10, 0x35, 0x1, 0xF, 0x0, 0x18, 0x35, 0x1, 0xF, 0x0, 0x20, 0x35, 0x1, 0xF, 0x0, 0x28, 0x35, 0x1, 0xF, 0x0, 0x30, 0x35, 0x1, 0xF, 0x0, 0x38, 0x35, 0x1, 0xF, 0x0, 0x40, 0x35, 0x1, 0xF, 0x0, 0x48, 0x35, 0x1, 0xF, 0x0, 0x50, 0x35, 0x1, 0xF, 0x0, 0x58, 0x35, 0x1, 0xF, 0x0, 0x60, 0x35, 0x1, 0xF, 0x0, 0x68, 0x35, 0x1, 0xF, 0x0, 0x70, 0x35, 0x1, 0xF, 0x0, 0x78, 0x35, 0x1, 0xF, 0x0, 0x80, 0x35, 0x1, 0xF, 0x0, 0x88, 0x35, 0x1, 0xF, 0x0, 0x90, 0x35, 0x1, 0xF, 0x0, 0x98, 0x35, 0x1, 0xF, 0x0, 0xA0, 0x35, 0x1, 0xF, 0x0, 0xA8, 0x35, 0x1, 0xF, 0x0, 0xB0, 0x35, 0x1, 0xF, 0x0, 0xB8, 0x35, 0x1, 0xF, 0x0, 0xC0, 0x35, 0x1, 0xF, 0x0, 0xC8, 0x35, 0x1, 0xF, 0x0, 0xD0, 0x35, 0x1, 0xF, 0x0, 0xD8, 0x35, 0x1, 0xF, 0x0, 0xE0, 0x35, 0x1, 0xF, 0x0, 0xE8, 0x35, 0x1, 0xF, 0x0, 0xF0, 0x35, 0x1, 0xF, 0x0, 0xF8, 0x35, 0x1, 0xF, 0x0, 0x0, 0x36, 0x1, 0xF, 0x0, 0x8, 0x36, 0x1, 0xF, 0x0, 0x10, 0x36, 0x1, 0xF, 0x0, 0x18, 0x36, 0x1, 0xF, 0x0, 0x20, 0x36, 0x1, 0xF, 0x0, 0x28, 0x36, 0x1, 0xF, 0x0, 0x30, 0x36, 0x1, 0xF, 0x0, 0x38, 0x36, 0x1, 0xF, 0x0, 0x40, 0x36, 0x1, 0xF, 0x0, 0x48, 0x36, 0x1, 0xF, 0x0, 0x50, 0x36, 0x1, 0xF, 0x0, 0x58, 0x36, 0x1, 0xF, 0x0, 0x60, 0x36, 0x1, 0xF, 0x0, 0x68, 0x36, 0x1, 0xF, 0x0, 0x70, 0x36, 0x1, 0xF, 0x0, 0x78, 0x36, 0x1, 0xF, 0x0, 0x80, 0x36, 0x1, 0xF, 0x0, 0x88, 0x36, 0x1, 0xF, 0x0, 0x90, 0x36, 0x1, 0xF, 0x0, 0x98, 0x36, 0x1, 0xF, 0x0, 0xA0, 0x36, 0x1, 0xF, 0x0, 0xA8, 0x36, 0x1, 0xF, 0x0, 0xB0, 0x36, 0x1, 0xF, 0x0, 0xB8, 0x36, 0x1, 0xF, 0x0, 0xC0, 0x36, 0x1, 0xF, 0x0, 0xC8, 0x36, 0x1, 0xF, 0x0, 0xD0, 0x36, 0x1, 0xF, 0x0, 0xD8, 0x36, 0x1, 0xF, 0x0, 0xE0, 0x36, 0x1, 0xF, 0x0, 0xE8, 0x36, 0x1, 0xF, 0x0, 0xF0, 0x36, 0x1, 0xF, 0x0, 0xF8, 0x36, 0x1, 0xF, 0x0, 0x0, 0x37, 0x1, 0xF, 0x0, 0x8, 0x37, 0x1, 0xF, 0x0, 0x10, 0x37, 0x1, 0xF, 0x0, 0x18, 0x37, 0x1, 0xF, 0x0, 0x20, 0x37, 0x1, 0xF, 0x0, 0x28, 0x37, 0x1, 0xF, 0x0, 0x30, 0x37, 0x1, 0xF, 0x0, 0x38, 0x37, 0x1, 0xF, 0x0, 0x40, 0x37, 0x1, 0xF, 0x0, 0x48, 0x37, 0x1, 0xF, 0x0, 0x50, 0x37, 0x1, 0xF, 0x0, 0x58, 0x37, 0x1, 0xF, 0x0, 0x60, 0x37, 0x1, 0xF, 0x0, 0x68, 0x37, 0x1, 0xF, 0x0, 0x70, 0x37, 0x1, 0xF, 0x0, 0x78, 0x37, 0x1, 0xF, 0x0, 0x80, 0x37, 0x1, 0xF, 0x0, 0x88, 0x37, 0x1, 0xF, 0x0, 0x90, 0x37, 0x1, 0xF, 0x0, 0x98, 0x37, 0x1, 0xF, 0x0, 0xA0, 0x37, 0x1, 0xF, 0x0, 0xA8, 0x37, 0x1, 0xF, 0x0, 0xB0, 0x37, 0x1, 0xF, 0x0, 0xB8, 0x37, 0x1, 0xF, 0x0, 0xC0, 0x37, 0x1, 0xF, 0x0, 0xC8, 0x37, 0x1, 0xF, 0x0, 0xD0, 0x37, 0x1, 0xF, 0x0, 0xD8, 0x37, 0x1, 0xF, 0x0, 0xE0, 0x37, 0x1, 0xF, 0x0, 0xE8, 0x37, 0x1, 0xF, 0x0, 0xF0, 0x37, 0x1, 0xF, 0x0, 0xF8, 0x37, 0x1, 0xF, 0x0, 0x0, 0x38, 0x1, 0xF, 0x0, 0x8, 0x38, 0x1, 0xF, 0x0, 0x10, 0x38, 0x1, 0xF, 0x0, 0x18, 0x38, 0x1, 0xF, 0x0, 0x20, 0x38, 0x1, 0xF, 0x0, 0x28, 0x38, 0x1, 0xF, 0x0, 0x30, 0x38, 0x1, 0xF, 0x0, 0x38, 0x38, 0x1, 0xF, 0x0, 0x40, 0x38, 0x1, 0xF, 0x0, 0x48, 0x38, 0x1, 0xF, 0x0, 0x50, 0x38, 0x1, 0xF, 0x0, 0x58, 0x38, 0x1, 0xF, 0x0, 0x60, 0x38, 0x1, 0xF, 0x0, 0x68, 0x38, 0x1, 0xF, 0x0, 0x70, 0x38, 0x1, 0xF, 0x0, 0x78, 0x38, 0x1, 0xF, 0x0, 0x80, 0x38, 0x1, 0xF, 0x0, 0x88, 0x38, 0x1, 0xF, 0x0, 0x90, 0x38, 0x1, 0xF, 0x0, 0x98, 0x38, 0x1, 0xF, 0x0, 0xA0, 0x38, 0x1, 0xF, 0x0, 0xA8, 0x38, 0x1, 0xF, 0x0, 0xB0, 0x38, 0x1, 0xF, 0x0, 0xB8, 0x38, 0x1, 0xF, 0x0, 0xC0, 0x38, 0x1, 0xF, 0x0, 0xC8, 0x38, 0x1, 0xF, 0x0, 0xD0, 0x38, 0x1, 0xF, 0x0, 0xD8, 0x38, 0x1, 0xF, 0x0, 0xE0, 0x38, 0x1, 0xF, 0x0, 0xE8, 0x38, 0x1, 0xF, 0x0, 0xF0, 0x38, 0x1, 0xF, 0x0, 0xF8, 0x38, 0x1, 0xF, 0x0, 0x0, 0x39, 0x1, 0xF, 0x0, 0x8, 0x39, 0x1, 0xF, 0x0, 0x10, 0x39, 0x1, 0xF, 0x0, 0x18, 0x39, 0x1, 0xF, 0x0, 0x20, 0x39, 0x1, 0xF, 0x0, 0x28, 0x39, 0x1, 0xF, 0x0, 0x30, 0x39, 0x1, 0xF, 0x0, 0x38, 0x39, 0x1, 0xF, 0x0, 0x40, 0x39, 0x1, 0xF, 0x0, 0x48, 0x39, 0x1, 0xF, 0x0, 0x50, 0x39, 0x1, 0xF, 0x0, 0x58, 0x39, 0x1, 0xF, 0x0, 0x60, 0x39, 0x1, 0xF, 0x0, 0x68, 0x39, 0x1, 0xF, 0x0, 0x70, 0x39, 0x1, 0xF, 0x0, 0x78, 0x39, 0x1, 0xF, 0x0, 0x80, 0x39, 0x1, 0xF, 0x0, 0x88, 0x39, 0x1, 0xF, 0x0, 0x90, 0x39, 0x1, 0xF, 0x0, 0x98, 0x39, 0x1, 0xF, 0x0, 0xA0, 0x39, 0x1, 0xF, 0x0, 0xA8, 0x39, 0x1, 0xF, 0x0, 0xB0, 0x39, 0x1, 0xF, 0x0, 0xB8, 0x39, 0x1, 0xF, 0x0, 0xC0, 0x39, 0x1, 0xF, 0x0, 0xC8, 0x39, 0x1, 0xF, 0x0, 0xD0, 0x39, 0x1, 0xF, 0x0, 0xD8, 0x39, 0x1, 0xF, 0x0, 0xE0, 0x39, 0x1, 0xF, 0x0, 0xE8, 0x39, 0x1, 0xF, 0x0, 0xF0, 0x39, 0x1, 0xF, 0x0, 0xF8, 0x39, 0x1, 0xF, 0x0, 0x0, 0x3A, 0x1, 0xF, 0x0, 0x8, 0x3A, 0x1, 0xF, 0x0, 0x10, 0x3A, 0x1, 0xF, 0x0, 0x18, 0x3A, 0x1, 0xF, 0x0, 0x20, 0x3A, 0x1, 0xF, 0x0, 0x28, 0x3A, 0x1, 0xF, 0x0, 0x30, 0x3A, 0x1, 0xF, 0x0, 0x38, 0x3A, 0x1, 0xF, 0x0, 0x40, 0x3A, 0x1, 0xF, 0x0, 0x48, 0x3A, 0x1, 0xF, 0x0, 0x50, 0x3A, 0x1, 0xF, 0x0, 0x58, 0x3A, 0x1, 0xF, 0x0, 0x60, 0x3A, 0x1, 0xF, 0x0, 0x68, 0x3A, 0x1, 0xF, 0x0, 0x70, 0x3A, 0x1, 0xF, 0x0, 0x78, 0x3A, 0x1, 0xF, 0x0, 0x80, 0x3A, 0x1, 0xF, 0x0, 0x88, 0x3A, 0x1, 0xF, 0x0, 0x90, 0x3A, 0x1, 0xF, 0x0, 0x98, 0x3A, 0x1, 0xF, 0x0, 0xA0, 0x3A, 0x1, 0xF, 0x0, 0xA8, 0x3A, 0x1, 0xF, 0x0, 0xB0, 0x3A, 0x1, 0xF, 0x0, 0xB8, 0x3A, 0x1, 0xF, 0x0, 0xC0, 0x3A, 0x1, 0xF, 0x0, 0xC8, 0x3A, 0x1, 0xF, 0x0, 0xD0, 0x3A, 0x1, 0xF, 0x0, 0xD8, 0x3A, 0x1, 0xF, 0x0, 0xE0, 0x3A, 0x1, 0xF, 0x0, 0xE8, 0x3A, 0x1, 0xF, 0x0, 0xF0, 0x3A, 0x1, 0xF, 0x0, 0xF8, 0x3A, 0x1, 0xF, 0x0, 0x0, 0x3B, 0x1, 0xF, 0x0, 0x8, 0x3B, 0x1, 0xF, 0x0, 0x10, 0x3B, 0x1, 0xF, 0x0, 0x18, 0x3B, 0x1, 0xF, 0x0, 0x20, 0x3B, 0x1, 0xF, 0x0, 0x28, 0x3B, 0x1, 0xF, 0x0, 0x30, 0x3B, 0x1, 0xF, 0x0, 0x38, 0x3B, 0x1, 0xF, 0x0, 0x40, 0x3B, 0x1, 0xF, 0x0, 0x48, 0x3B, 0x1, 0xF, 0x0, 0x50, 0x3B, 0x1, 0xF, 0x0, 0x58, 0x3B, 0x1, 0xF, 0x0, 0x60, 0x3B, 0x1, 0xF, 0x0, 0x68, 0x3B, 0x1, 0xF, 0x0, 0x70, 0x3B, 0x1, 0xF, 0x0, 0x78, 0x3B, 0x1, 0xF, 0x0, 0x80, 0x3B, 0x1, 0xF, 0x0, 0x88, 0x3B, 0x1, 0xF, 0x0, 0x90, 0x3B, 0x1, 0xF, 0x0, 0x98, 0x3B, 0x1, 0xF, 0x0, 0xA0, 0x3B, 0x1, 0xF, 0x0, 0xA8, 0x3B, 0x1, 0xF, 0x0, 0xB0, 0x3B, 0x1, 0xF, 0x0, 0xB8, 0x3B, 0x1, 0xF, 0x0, 0xC0, 0x3B, 0x1, 0xF, 0x0, 0xC8, 0x3B, 0x1, 0xF, 0x0, 0xD0, 0x3B, 0x1, 0xF, 0x0, 0xD8, 0x3B, 0x1, 0xF, 0x0, 0xE0, 0x3B, 0x1, 0xF, 0x0, 0xE8, 0x3B, 0x1, 0xF, 0x0, 0xF0, 0x3B, 0x1, 0xF, 0x0, 0xF8, 0x3B, 0x1, 0xF, 0x0, 0x0, 0x3C, 0x1, 0xF, 0x0, 0x8, 0x3C, 0x1, 0xF, 0x0, 0x10, 0x3C, 0x1, 0xF, 0x0, 0x18, 0x3C, 0x1, 0xF, 0x0, 0x20, 0x3C, 0x1, 0xF, 0x0, 0x28, 0x3C, 0x1, 0xF, 0x0, 0x30, 0x3C, 0x1, 0xF, 0x0, 0x38, 0x3C, 0x1, 0xF, 0x0, 0x40, 0x3C, 0x1, 0xF, 0x0, 0x48, 0x3C, 0x1, 0xF, 0x0, 0x50, 0x3C, 0x1, 0xF, 0x0, 0x58, 0x3C, 0x1, 0xF, 0x0, 0x60, 0x3C, 0x1, 0xF, 0x0, 0x68, 0x3C, 0x1, 0xF, 0x0, 0x70, 0x3C, 0x1, 0xF, 0x0, 0x78, 0x3C, 0x1, 0xF, 0x0, 0x80, 0x3C, 0x1, 0xF, 0x0, 0x88, 0x3C, 0x1, 0xF, 0x0, 0x90, 0x3C, 0x1, 0xF, 0x0, 0x98, 0x3C, 0x1, 0xF, 0x0, 0xA0, 0x3C, 0x1, 0xF, 0x0, 0xA8, 0x3C, 0x1, 0xF, 0x0, 0xB0, 0x3C, 0x1, 0xF, 0x0, 0xB8, 0x3C, 0x1, 0xF, 0x0, 0xC0, 0x3C, 0x1, 0xF, 0x0, 0xC8, 0x3C, 0x1, 0xF, 0x0, 0xD0, 0x3C, 0x1, 0xF, 0x0, 0xD8, 0x3C, 0x1, 0xF, 0x0, 0xE0, 0x3C, 0x1, 0xF, 0x0, 0xE8, 0x3C, 0x1, 0xF, 0x0, 0xF0, 0x3C, 0x1, 0xF, 0x0, 0xF8, 0x3C, 0x1, 0xF, 0x0, 0x0, 0x3D, 0x1, 0xF, 0x0, 0x8, 0x3D, 0x1, 0xF, 0x0, 0x10, 0x3D, 0x1, 0xF, 0x0, 0x18, 0x3D, 0x1, 0xF, 0x0, 0x20, 0x3D, 0x1, 0xF, 0x0, 0x28, 0x3D, 0x1, 0xF, 0x0, 0x30, 0x3D, 0x1, 0xF, 0x0, 0x38, 0x3D, 0x1, 0xF, 0x0, 0x40, 0x3D, 0x1, 0xF, 0x0, 0x48, 0x3D, 0x1, 0xF, 0x0, 0x50, 0x3D, 0x1, 0xF, 0x0, 0x58, 0x3D, 0x1, 0xF, 0x0, 0x60, 0x3D, 0x1, 0xF, 0x0, 0x68, 0x3D, 0x1, 0xF, 0x0, 0x70, 0x3D, 0x1, 0xF, 0x0, 0x78, 0x3D, 0x1, 0xF, 0x0, 0x80, 0x3D, 0x1, 0xF, 0x0, 0x88, 0x3D, 0x1, 0xF, 0x0, 0x90, 0x3D, 0x1, 0xF, 0x0, 0x98, 0x3D, 0x1, 0xF, 0x0, 0xA0, 0x3D, 0x1, 0xF, 0x0, 0xA8, 0x3D, 0x1, 0xF, 0x0, 0xB0, 0x3D, 0x1, 0xF, 0x0, 0xB8, 0x3D, 0x1, 0xF, 0x0, 0xC0, 0x3D, 0x1, 0xF, 0x0, 0xC8, 0x3D, 0x1, 0xF, 0x0, 0xD0, 0x3D, 0x1, 0xF, 0x0, 0xD8, 0x3D, 0x1, 0xF, 0x0, 0xE0, 0x3D, 0x1, 0xF, 0x0, 0xE8, 0x3D, 0x1, 0xF, 0x0, 0xF0, 0x3D, 0x1, 0xF, 0x0, 0xF8, 0x3D, 0x1, 0xF, 0x0, 0x0, 0x3E, 0x1, 0xF, 0x0, 0x8, 0x3E, 0x1, 0xF, 0x0, 0x10, 0x3E, 0x1, 0xF, 0x0, 0x18, 0x3E, 0x1, 0xF, 0x0, 0x20, 0x3E, 0x1, 0xF, 0x0, 0x28, 0x3E, 0x1, 0xF, 0x0, 0x30, 0x3E, 0x1, 0xF, 0x0, 0x38, 0x3E, 0x1, 0xF, 0x0, 0x40, 0x3E, 0x1, 0xF, 0x0, 0x48, 0x3E, 0x1, 0x10, 0x0, 0x50, 0x3E, 0x1, 0x70, 0xF9, 0x64, 0x3E, 0x1, 0xB0, 0xF9, 0x74, 0x3E, 0x1, 0xF0, 0xF9, 0x84, 0x3E, 0x1, 0x30, 0xFA, 0x94, 0x3E, 0x1, 0x70, 0xFA, 0xA4, 0x3E, 0x1, 0xB0, 0xFA, 0xB4, 0x3E, 0x1, 0xF0, 0xFA, 0xC4, 0x3E, 0x1, 0x30, 0xFB, 0xD4, 0x3E, 0x1, 0x70, 0xFB, 0xE4, 0x3E, 0x1, 0xB0, 0xFB, 0xF4, 0x3E, 0x1, 0xF0, 0xFB, 0x4, 0x3F, 0x1, 0x30, 0xFC, 0x14, 0x3F, 0x1, 0x70, 0xFC, 0x4, 0x0, 0x0, 0x90, 0xFC, 0x2C, 0x3F, 0x1, 0xD0, 0xFC, 0x3C, 0x3F, 0x1, 0x10, 0xFD, 0x4C, 0x3F, 0x1, 0x50, 0xFD, 0x5C, 0x3F, 0x1, 0x90, 0xFD, 0x6C, 0x3F, 0x1, 0xD0, 0xFD, 0x7C, 0x3F, 0x1, 0x10, 0xFE, 0x8C, 0x3F, 0x1, 0x50, 0xFE, 0x9C, 0x3F, 0x1, 0x90, 0xFE, 0xAC, 0x3F, 0x1, 0xD0, 0xFE, 0xBC, 0x3F, 0x1, 0x10, 0xFF, 0xCC, 0x3F, 0x1, 0x50, 0xFF, 0xDC, 0x3F, 0x1, 0x90, 0xFF, 0xEC, 0x3F, 0x1, 0xD0, 0xFF, 0xFC, 0x3F, 0x1, 0x10, 0x0, 0xD, 0x40, 0x1, 0x50, 0x0, 0x1D, 0x40, 0x1, 0x90, 0x0, 0x2D, 0x40, 0x1, 0xD0, 0x0, 0x3D, 0x40, 0x1, 0x10, 0x1, 0x4D, 0x40, 0x1, 0x50, 0x1, 0x5D, 0x40, 0x1, 0x90, 0x1, 0x6D, 0x40, 0x1, 0xD0, 0x1, 0x7D, 0x40, 0x1, 0x10, 0x2, 0x8D, 0x40, 0x1, 0x50, 0x2, 0x9D, 0x40, 0x1, 0x90, 0x2, 0xAD, 0x40, 0x1, 0xD0, 0x2, 0xBD, 0x40, 0x1, 0x10, 0x3, 0xCD, 0x40, 0x1, 0x50, 0x3, 0xDD, 0x40, 0x1, 0x90, 0x3, 0xED, 0x40, 0x1, 0xD0, 0x3, 0xFD, 0x40, 0x1, 0x10, 0x4, 0xD, 0x41, 0x1, 0x50, 0x4, 0x1D, 0x41, 0x1, 0x90, 0x4, 0x2D, 0x41, 0x1, 0xD0, 0x4, 0x3D, 0x41, 0x1, 0x10, 0x5, 0x4D, 0x41, 0x1, 0x50, 0x5, 0x5D, 0x41, 0x1, 0x90, 0x5, 0x6D, 0x41, 0x1, 0xD0, 0x5, 0x7D, 0x41, 0x1, 0x10, 0x6, 0x8D, 0x41, 0x1, 0x50, 0x6, 0x9D, 0x41, 0x1, 0x90, 0x6, 0x5, 0x0, 0x0, 0x10, 0x0, 0xA8, 0x41, 0x1, 0xB0, 0x6, 0x5, 0x0, 0x0, 0x10, 0x0, 0xB0, 0x41, 0x1, 0xD0, 0x6, 0xBD, 0x41, 0x1, 0xF0, 0x6, 0xC5, 0x41, 0x1, 0x30, 0x7, 0xD5, 0x41, 0x1, 0x90, 0x6, 0x15, 0x42, 0x1, 0x70, 0x8, 0x25, 0x42, 0x1, 0x10, 0x0, 0x28, 0x42, 0x1, 0xD0, 0x8, 0x3D, 0x42, 0x1, 0x10, 0x9, 0x4D, 0x42, 0x1, 0x10, 0x0, 0xD0, 0x41, 0x1, 0xD0, 0xA, 0xBD, 0x42, 0x1, 0xF0, 0xA, 0x5, 0x0, 0x0, 0xB0, 0xB, 0xF5, 0x42, 0x1, 0xD0, 0xB, 0xFD, 0x42, 0x1, 0xF0, 0xB, 0x5, 0x0, 0x0, 0x70, 0x15, 0x5, 0x0, 0x0, 0x90, 0x15, 0x5, 0x0, 0x0, 0xB0, 0x15, 0x75, 0x45, 0x1, 0xF0, 0x15, 0x85, 0x45, 0x1, 0x30, 0x16, 0x95, 0x45, 0x1, 0x70, 0x16, 0xA5, 0x45, 0x1, 0xB0, 0x16, 0xB5, 0x45, 0x1, 0xF0, 0x16, 0xC5, 0x45, 0x1, 0x30, 0x17, 0xD5, 0x45, 0x1, 0x70, 0x17, 0xE5, 0x45, 0x1, 0xB0, 0x17, 0xF5, 0x45, 0x1, 0xF0, 0x17, 0x5, 0x46, 0x1, 0x30, 0x18, 0x15, 0x46, 0x1, 0x70, 0x18, 0x25, 0x46, 0x1, 0xB0, 0x18, 0x35, 0x46, 0x1, 0xF0, 0x18, 0x45, 0x46, 0x1, 0x30, 0x19, 0x55, 0x46, 0x1, 0x70, 0x19, 0x65, 0x46, 0x1, 0xB0, 0x19, 0x75, 0x46, 0x1, 0xF0, 0x19, 0x85, 0x46, 0x1, 0x30, 0x1A, 0x95, 0x46, 0x1, 0x10, 0x0, 0xA0, 0x46, 0x1, 0x90, 0x1A, 0xAD, 0x46, 0x1, 0xB0, 0x1A, 0x5, 0x0, 0x0, 0x10, 0x21, 0x4D, 0x48, 0x1, 0x10, 0x0, 0x50, 0x48, 0x1, 0x50, 0x21, 0x5, 0x0, 0x0, 0x10, 0x0, 0x60, 0x48, 0x1, 0xB0, 0x21, 0x75, 0x48, 0x1, 0xF0, 0x21, 0x85, 0x48, 0x1, 0x10, 0x22, 0x8D, 0x48, 0x1, 0x30, 0x22, 0x95, 0x48, 0x1, 0x50, 0x22, 0x9D, 0x48, 0x1, 0x90, 0x22, 0xAD, 0x48, 0x1, 0xD0, 0x22, 0xBD, 0x48, 0x1, 0x10, 0x0, 0xC8, 0x48, 0x1, 0x50, 0x23, 0xDD, 0x48, 0x1, 0x90, 0x23, 0xED, 0x48, 0x1, 0xD0, 0x23, 0xFD, 0x48, 0x1, 0x10, 0x24, 0xD, 0x49, 0x1, 0x50, 0x24, 0x1D, 0x49, 0x1, 0x90, 0x24, 0x2D, 0x49, 0x1, 0xD0, 0x24, 0x3D, 0x49, 0x1, 0x10, 0x25, 0x4D, 0x49, 0x1, 0x50, 0x25, 0x5D, 0x49, 0x1, 0x90, 0x25, 0x6D, 0x49, 0x1, 0xD0, 0x25, 0x7D, 0x49, 0x1, 0x10, 0x26, 0x8D, 0x49, 0x1, 0x50, 0x26, 0x9D, 0x49, 0x1, 0x90, 0x26, 0xAD, 0x49, 0x1, 0xD0, 0x26, 0xBD, 0x49, 0x1, 0x10, 0x27, 0xCD, 0x49, 0x1, 0x50, 0x27, 0xDD, 0x49, 0x1, 0x90, 0x27, 0xED, 0x49, 0x1, 0xD0, 0x27, 0xFD, 0x49, 0x1, 0x10, 0x28, 0xD, 0x4A, 0x1, 0x50, 0x28, 0x1D, 0x4A, 0x1, 0x90, 0x28, 0x2D, 0x4A, 0x1, 0xD0, 0x28, 0x3D, 0x4A, 0x1, 0x10, 0x29, 0x4D, 0x4A, 0x1, 0x50, 0x29, 0x5D, 0x4A, 0x1, 0x90, 0x29, 0x6D, 0x4A, 0x1, 0xD0, 0x29, 0x7D, 0x4A, 0x1, 0x10, 0x2A, 0x8D, 0x4A, 0x1, 0x50, 0x2A, 0x9D, 0x4A, 0x1, 0x90, 0x2A, 0xAD, 0x4A, 0x1, 0xD0, 0x2A, 0xBD, 0x4A, 0x1, 0x10, 0x2B, 0xCD, 0x4A, 0x1, 0x50, 0x2B, 0xDD, 0x4A, 0x1, 0x90, 0x2B, 0xED, 0x4A, 0x1, 0xD0, 0x2B, 0xFD, 0x4A, 0x1, 0x10, 0x2C, 0xD, 0x4B, 0x1, 0x10, 0x0, 0x10, 0x4B, 0x1, 0x50, 0x2C, 0x5, 0x0, 0x0, 0x70, 0x2C, 0x25, 0x4B, 0x1, 0xB0, 0x2C, 0x35, 0x4B, 0x1, 0xF0, 0x2C, 0x45, 0x4B, 0x1, 0x30, 0x2D, 0x55, 0x4B, 0x1, 0x70, 0x2D, 0x65, 0x4B, 0x1, 0xB0, 0x2D, 0x75, 0x4B, 0x1, 0xF0, 0x2D, 0x85, 0x4B, 0x1, 0x30, 0x2E, 0x95, 0x4B, 0x1, 0x10, 0x0, 0x98, 0x4B, 0x1, 0x90, 0x2E, 0xAD, 0x4B, 0x1, 0x10, 0x0, 0xB0, 0x4B, 0x1, 0x10, 0x0, 0xB8, 0x4B, 0x1, 0x10, 0x2F, 0xCD, 0x4B, 0x1, 0x50, 0x2F, 0xDD, 0x4B, 0x1, 0xF0, 0x2E, 0x5, 0x0, 0x0, 0x10, 0x0, 0xE0, 0x4B, 0x1, 0xB0, 0x2F, 0xF5, 0x4B, 0x1, 0xF0, 0x2F, 0x5, 0x4C, 0x1, 0x90, 0x2F, 0x5, 0x0, 0x0, 0x30, 0x30, 0x15, 0x4C, 0x1, 0x70, 0x30, 0x25, 0x4C, 0x1, 0x10, 0x0, 0x28, 0x4C, 0x1, 0xD0, 0x30, 0x3D, 0x4C, 0x1, 0x10, 0x31, 0x4D, 0x4C, 0x1, 0xB0, 0x30, 0x5, 0x0, 0x0, 0x10, 0x0, 0x50, 0x4C, 0x1, 0x70, 0x31, 0x65, 0x4C, 0x1, 0xB0, 0x31, 0x75, 0x4C, 0x1, 0x50, 0x31, 0x5, 0x0, 0x0, 0xF0, 0x31, 0x85, 0x4C, 0x1, 0x30, 0x32, 0x95, 0x4C, 0x1, 0x70, 0x32, 0xA5, 0x4C, 0x1, 0xB0, 0x32, 0xB5, 0x4C, 0x1, 0xF0, 0x32, 0xC5, 0x4C, 0x1, 0x30, 0x33, 0xD5, 0x4C, 0x1, 0x70, 0x33, 0xE5, 0x4C, 0x1, 0xB0, 0x33, 0xF5, 0x4C, 0x1, 0xF0, 0x33, 0x5, 0x4D, 0x1, 0x30, 0x34, 0x15, 0x4D, 0x1, 0x70, 0x34, 0x25, 0x4D, 0x1, 0xB0, 0x34, 0x35, 0x4D, 0x1, 0xF0, 0x34, 0x45, 0x4D, 0x1, 0x30, 0x35, 0x55, 0x4D, 0x1, 0x70, 0x35, 0x65, 0x4D, 0x1, 0xB0, 0x35, 0x75, 0x4D, 0x1, 0xF0, 0x35, 0x5, 0x0, 0x0, 0x10, 0x36, 0x5, 0x0, 0x0, 0x30, 0x36, 0x5, 0x0, 0x0, 0x50, 0x36, 0x5, 0x0, 0x0, 0x70, 0x36, 0xA5, 0x4D, 0x1, 0xB0, 0x36, 0xB5, 0x4D, 0x1, 0xF0, 0x36, 0xC5, 0x4D, 0x1, 0x30, 0x37, 0xD5, 0x4D, 0x1, 0x70, 0x37, 0xE5, 0x4D, 0x1, 0xB0, 0x37, 0xF5, 0x4D, 0x1, 0xF0, 0x37, 0x5, 0x4E, 0x1, 0x30, 0x38, 0x15, 0x4E, 0x1, 0x70, 0x38, 0x25, 0x4E, 0x1, 0xB0, 0x38, 0x35, 0x4E, 0x1, 0xF0, 0x38, 0x45, 0x4E, 0x1, 0x30, 0x39, 0x55, 0x4E, 0x1, 0x70, 0x39, 0x65, 0x4E, 0x1, 0xB0, 0x39, 0x75, 0x4E, 0x1, 0xF0, 0x39, 0x85, 0x4E, 0x1, 0x30, 0x3A, 0x95, 0x4E, 0x1, 0x70, 0x3A, 0xA5, 0x4E, 0x1, 0xB0, 0x3A, 0xB5, 0x4E, 0x1, 0x10, 0x0, 0x38, 0x50, 0x1, 0x10, 0x0, 0xC0, 0x41, 0x1, 0xD0, 0x22, 0x5, 0x0, 0x0, 0xB0, 0xB, 0x5, 0x0, 0x0, 0x70, 0x4A, 0xA5, 0x52, 0x1, 0xB0, 0x4A, 0x5, 0x0, 0x0, 0x10, 0x0, 0xB0, 0x52, 0x1, 0xF0, 0x4A, 0xC5, 0x52, 0x1, 0x30, 0x4B, 0xD5, 0x52, 0x1, 0x70, 0x4B, 0xE5, 0x52, 0x1, 0xB0, 0x4B, 0xF5, 0x52, 0x1, 0xF0, 0x4B, 0x5, 0x53, 0x1, 0x30, 0x4C, 0x15, 0x53, 0x1, 0x70, 0x4C, 0x25, 0x53, 0x1, 0xB0, 0x4C, 0x35, 0x53, 0x1, 0xF0, 0x4C, 0x45, 0x53, 0x1, 0x30, 0x4D, 0x55, 0x53, 0x1, 0x70, 0x4D, 0x65, 0x53, 0x1, 0xB0, 0x4D, 0x75, 0x53, 0x1, 0xF0, 0x4D, 0x85, 0x53, 0x1, 0x30, 0x4E, 0x95, 0x53, 0x1, 0x70, 0x4E, 0xA5, 0x53, 0x1, 0xB0, 0x4E, 0xB5, 0x53, 0x1, 0xF0, 0x4E, 0xC5, 0x53, 0x1, 0x30, 0x4F, 0xD5, 0x53, 0x1, 0x70, 0x4F, 0xE5, 0x53, 0x1, 0xB0, 0x4F, 0xF5, 0x53, 0x1, 0xF0, 0x4F, 0x5, 0x54, 0x1, 0x30, 0x50, 0x15, 0x54, 0x1, 0x70, 0x50, 0x25, 0x54, 0x1, 0xB0, 0x50, 0x35, 0x54, 0x1, 0x10, 0x0, 0x38, 0x54, 0x1, 0x10, 0x51, 0x4D, 0x54, 0x1, 0x50, 0x51, 0x5D, 0x54, 0x1, 0x90, 0x51, 0x6D, 0x54, 0x1, 0xD0, 0x51, 0x7D, 0x54, 0x1, 0x10, 0x52, 0x8D, 0x54, 0x1, 0x50, 0x52, 0x9D, 0x54, 0x1, 0x90, 0x52, 0xAD, 0x54, 0x1, 0xD0, 0x52, 0xBD, 0x54, 0x1, 0x10, 0x53, 0xCD, 0x54, 0x1, 0x50, 0x53, 0xDD, 0x54, 0x1, 0x90, 0x53, 0xED, 0x54, 0x1, 0xD0, 0x53, 0xFD, 0x54, 0x1, 0x10, 0x54, 0xD, 0x55, 0x1, 0x50, 0x54, 0x1D, 0x55, 0x1, 0x90, 0x54, 0x2D, 0x55, 0x1, 0xD0, 0x54, 0x3D, 0x55, 0x1, 0x10, 0x55, 0x4D, 0x55, 0x1, 0x50, 0x55, 0x5D, 0x55, 0x1, 0x90, 0x55, 0x5, 0x0, 0x0, 0xB0, 0x5B, 0xF5, 0x56, 0x1, 0xD0, 0x5B, 0xFD, 0x56, 0x1, 0xF0, 0x5B, 0x5, 0x57, 0x1, 0x10, 0x5C, 0xD, 0x57, 0x1, 0x30, 0x5C, 0x15, 0x57, 0x1, 0x50, 0x5C, 0x1D, 0x57, 0x1, 0x70, 0x5C, 0x25, 0x57, 0x1, 0x90, 0x5C, 0xED, 0x56, 0x1, 0x30, 0x62, 0x95, 0x58, 0x1, 0x70, 0x62, 0xA5, 0x58, 0x1, 0xB0, 0x62, 0xB5, 0x58, 0x1, 0xF0, 0x62, 0xC5, 0x58, 0x1, 0x30, 0x63, 0xD5, 0x58, 0x1, 0x70, 0x63, 0xE5, 0x58, 0x1, 0xB0, 0x63, 0xF5, 0x58, 0x1, 0xF0, 0x63, 0x5, 0x59, 0x1, 0x30, 0x64, 0x15, 0x59, 0x1, 0x70, 0x64, 0x25, 0x59, 0x1, 0xB0, 0x64, 0x35, 0x59, 0x1, 0xF0, 0x64, 0x45, 0x59, 0x1, 0x30, 0x65, 0x55, 0x59, 0x1, 0x70, 0x65, 0x65, 0x59, 0x1, 0xB0, 0x65, 0x75, 0x59, 0x1, 0xF0, 0x65, 0x85, 0x59, 0x1, 0x30, 0x66, 0x95, 0x59, 0x1, 0x70, 0x66, 0xA5, 0x59, 0x1, 0xB0, 0x66, 0xB5, 0x59, 0x1, 0xF0, 0x66, 0xC5, 0x59, 0x1, 0x30, 0x67, 0xD5, 0x59, 0x1, 0x70, 0x67, 0xE5, 0x59, 0x1, 0xB0, 0x67, 0xF5, 0x59, 0x1, 0xF0, 0x67, 0x5, 0x5A, 0x1, 0x30, 0x68, 0x15, 0x5A, 0x1, 0x70, 0x68, 0x5, 0x0, 0x0, 0xB0, 0x68, 0x35, 0x5A, 0x1, 0xD0, 0x68, 0x5, 0x0, 0x0, 0x10, 0x0, 0x38, 0x5A, 0x1, 0x10, 0x69, 0x2D, 0x5A, 0x1, 0xB0, 0x6A, 0x5, 0x0, 0x0, 0xB0, 0x6A, 0xB5, 0x5A, 0x1, 0xF0, 0x6A, 0xC5, 0x5A, 0x1, 0x30, 0x6B, 0xD5, 0x5A, 0x1, 0xD0, 0x2E, 0xDD, 0x5A, 0x1, 0x90, 0x6B, 0xED, 0x5A, 0x1, 0xD0, 0x6B, 0xFD, 0x5A, 0x1, 0x10, 0x6C, 0x5, 0x0, 0x0, 0x30, 0x6C, 0x15, 0x5B, 0x1, 0x70, 0x6C, 0x25, 0x5B, 0x1, 0xB0, 0x6C, 0x35, 0x5B, 0x1, 0xF0, 0x6C, 0x45, 0x5B, 0x1, 0x30, 0x6D, 0x3D, 0x5A, 0x1, 0x50, 0x6D, 0x5D, 0x5B, 0x1, 0x90, 0x6D, 0x6D, 0x5B, 0x1, 0xD0, 0x6D, 0x7D, 0x5B, 0x1, 0x10, 0x6E, 0x5, 0x0, 0x0, 0x30, 0x6E, 0x95, 0x5B, 0x1, 0x70, 0x6E, 0xA5, 0x5B, 0x1, 0xD0, 0x6A, 0xBD, 0x5A, 0x1, 0x10, 0x0, 0xC0, 0x5A, 0x1, 0x10, 0x0, 0x88, 0x5B, 0x1, 0x50, 0x6E, 0x9D, 0x5B, 0x1, 0x10, 0x0, 0xA0, 0x5B, 0x1, 0x10, 0x69, 0x5, 0x0, 0x0, 0x10, 0x0, 0x20, 0x42, 0x1, 0x50, 0x8, 0x5, 0x0, 0x0, 0x10, 0x0, 0xC0, 0x5B, 0x1, 0x10, 0x0, 0xC8, 0x5B, 0x1, 0x50, 0x6F, 0xDD, 0x5B, 0x1, 0x90, 0x6F, 0xED, 0x5B, 0x1, 0x70, 0x8, 0x5, 0x0, 0x0, 0xD0, 0x6F, 0xCD, 0x41, 0x1, 0x10, 0x0, 0xF8, 0x5B, 0x1, 0xB0, 0x22, 0x5, 0x0, 0x0, 0x10, 0x70, 0x5, 0x0, 0x0, 0x10, 0x0, 0x8, 0x5C, 0x1, 0xD0, 0x21, 0x5, 0x0, 0x0, 0x50, 0x70, 0x5, 0x0, 0x0, 0x10, 0x0, 0x30, 0x42, 0x1, 0xF0, 0x22, 0x2D, 0x42, 0x1, 0x70, 0x70, 0x25, 0x5C, 0x1, 0x10, 0x0, 0x48, 0x42, 0x1, 0xD0, 0xA, 0x5, 0x0, 0x0, 0xB0, 0x70, 0x5, 0x0, 0x0, 0xF0, 0x8, 0x35, 0x5C, 0x1, 0x10, 0x0, 0x40, 0x42, 0x1, 0xF0, 0x70, 0x5, 0x0, 0x0, 0x10, 0x71, 0x5, 0x0, 0x0, 0x30, 0x71, 0x55, 0x5C, 0x1, 0x10, 0x0, 0x58, 0x5C, 0x1, 0x90, 0x71, 0x65, 0x48, 0x1, 0xF0, 0x21, 0x6D, 0x48, 0x1, 0x30, 0x6F, 0xE5, 0x5B, 0x1, 0x50, 0x72, 0x9D, 0x5C, 0x1, 0x70, 0x72, 0x45, 0x48, 0x1, 0x30, 0x21, 0x9D, 0x48, 0x1, 0x90, 0x72, 0xAD, 0x5C, 0x1, 0xB0, 0x72, 0xA5, 0x48, 0x1, 0x10, 0x0, 0xF8, 0x5C, 0x1, 0x90, 0x76, 0xAD, 0x5D, 0x1, 0xF0, 0x76, 0x5, 0x0, 0x0, 0x30, 0x78, 0x15, 0x5E, 0x1, 0x50, 0x78, 0x1D, 0x5E, 0x1, 0x70, 0x78, 0x25, 0x5E, 0x1, 0x90, 0x78, 0x2D, 0x5E, 0x1, 0xB0, 0x78, 0x35, 0x5E, 0x1, 0xD0, 0x78, 0x3D, 0x5E, 0x1, 0xF0, 0x78, 0x45, 0x5E, 0x1, 0x10, 0x79, 0x4D, 0x5E, 0x1, 0x30, 0x79, 0x55, 0x5E, 0x1, 0x70, 0x79, 0x65, 0x5E, 0x1, 0x90, 0x76, 0x5, 0x0, 0x0, 0x10, 0x6F, 0x7D, 0x5E, 0x1, 0xF0, 0x79, 0x85, 0x5E, 0x1, 0x10, 0x7A, 0xD5, 0x5B, 0x1, 0x70, 0x6F, 0x8D, 0x5E, 0x1, 0x30, 0x7A, 0xED, 0x5B, 0x1, 0xD0, 0x6F, 0x9D, 0x5E, 0x1, 0x70, 0x7A, 0xFD, 0x5B, 0x1, 0x10, 0x70, 0xFD, 0x5C, 0x1, 0x30, 0x70, 0x15, 0x5C, 0x1, 0x10, 0x0, 0xA0, 0x5C, 0x1, 0x90, 0x70, 0x1D, 0x5C, 0x1, 0xB0, 0x76, 0x2D, 0x5C, 0x1, 0xD0, 0x70, 0xC5, 0x5E, 0x1, 0x10, 0x7B, 0x3D, 0x5C, 0x1, 0x10, 0x71, 0xD, 0x5E, 0x1, 0x10, 0x0, 0xC8, 0x5E, 0x1, 0x30, 0x7B, 0x4D, 0x5C, 0x1, 0x50, 0x71, 0xD5, 0x5E, 0x1, 0x50, 0x7B, 0x5D, 0x5C, 0x1, 0x90, 0x71, 0x95, 0x5C, 0x1, 0x10, 0x0, 0xE8, 0x5E, 0x1, 0xB0, 0x7B, 0xF5, 0x5E, 0x1, 0xD0, 0x7B, 0xFD, 0x5E, 0x1, 0xF0, 0x7B, 0x5, 0x5F, 0x1, 0x10, 0x0, 0xC0, 0x5F, 0x1, 0x10, 0x7F, 0xCD, 0x5F, 0x1, 0x30, 0x7F, 0xD5, 0x5F, 0x1, 0x50, 0x7F, 0xDD, 0x5F, 0x1, 0x70, 0x7F, 0xE5, 0x5F, 0x1, 0x90, 0x7F, 0xED, 0x5F, 0x1, 0xB0, 0x7F, 0xF5, 0x5F, 0x1, 0xD0, 0x7F, 0xFD, 0x5F, 0x1, 0xF0, 0x7F, 0x5, 0x0, 0x0, 0x10, 0x0, 0x18, 0x60, 0x1, 0x10, 0x7C, 0xE5, 0x60, 0x1, 0xB0, 0x83, 0xF5, 0x60, 0x1, 0xF0, 0x83, 0x5, 0x61, 0x1, 0x30, 0x84, 0x15, 0x61, 0x1, 0x10, 0x0, 0x18, 0x61, 0x1, 0x90, 0x84, 0x2D, 0x61, 0x1, 0xD0, 0x84, 0x3D, 0x61, 0x1, 0x10, 0x85, 0x4D, 0x61, 0x1, 0x50, 0x85, 0x5D, 0x61, 0x1, 0x90, 0x85, 0x6D, 0x61, 0x1, 0xD0, 0x85, 0x7D, 0x61, 0x1, 0x10, 0x86, 0x8D, 0x61, 0x1, 0x50, 0x86, 0x9D, 0x61, 0x1, 0x90, 0x2E, 0xA5, 0x61, 0x1, 0xB0, 0x86, 0xB5, 0x61, 0x1, 0xF0, 0x86, 0xC5, 0x61, 0x1, 0xF0, 0x40, 0xE5, 0x60, 0x1, 0x10, 0x0, 0xC8, 0x61, 0x1, 0x50, 0x87, 0xDD, 0x61, 0x1, 0x90, 0x87, 0xED, 0x61, 0x1, 0xD0, 0x87, 0xFD, 0x61, 0x1, 0x10, 0x88, 0xD, 0x62, 0x1, 0x50, 0x88, 0x1D, 0x62, 0x1, 0x90, 0x88, 0x2D, 0x62, 0x1, 0xD0, 0x88, 0x3D, 0x62, 0x1, 0xB0, 0x2E, 0x45, 0x62, 0x1, 0x70, 0x80, 0x4D, 0x62, 0x1, 0x50, 0x89, 0x5D, 0x62, 0x1, 0x90, 0x89, 0x6D, 0x62, 0x1, 0xD0, 0x89, 0x7D, 0x62, 0x1, 0x10, 0x8A, 0x5, 0x0, 0x0, 0x31, 0x8A, 0x95, 0x62, 0x1, 0x71, 0x8A, 0xA5, 0x62, 0x1, 0xB1, 0x8A, 0xB5, 0x62, 0x1, 0xF1, 0x8A, 0xC5, 0x62, 0x1, 0x31, 0x8B, 0xD5, 0x62, 0x1, 0x71, 0x8B, 0xE5, 0x62, 0x1, 0xB1, 0x8B, 0xF5, 0x62, 0x1, 0xF1, 0x8B, 0x5, 0x63, 0x1, 0x31, 0x8C, 0x15, 0x63, 0x1, 0x71, 0x8C, 0x25, 0x63, 0x1, 0xB1, 0x8C, 0x35, 0x63, 0x1, 0xF1, 0x8C, 0x45, 0x63, 0x1, 0x31, 0x8D, 0x55, 0x63, 0x1, 0x71, 0x8D, 0x65, 0x63, 0x1, 0xB1, 0x8D, 0x75, 0x63, 0x1, 0xF1, 0x8D, 0x85, 0x63, 0x1, 0x31, 0x8E, 0x95, 0x63, 0x1, 0x71, 0x8E, 0xA5, 0x63, 0x1, 0xB1, 0x8E, 0xB5, 0x63, 0x1, 0xF1, 0x8E, 0xC5, 0x63, 0x1, 0x31, 0x8F, 0xD5, 0x63, 0x1, 0x71, 0x8F, 0xE5, 0x63, 0x1, 0xB1, 0x8F, 0xF5, 0x63, 0x1, 0xF1, 0x8F, 0x5, 0x64, 0x1, 0x31, 0x90, 0x15, 0x64, 0x1, 0x71, 0x90, 0x25, 0x64, 0x1, 0xB1, 0x90, 0x35, 0x64, 0x1, 0xF1, 0x90, 0x5, 0x0, 0x0, 0x11, 0x91, 0x4D, 0x64, 0x1, 0x51, 0x91, 0x5D, 0x64, 0x1, 0x91, 0x91, 0x6D, 0x64, 0x1, 0x71, 0x7, 0x5, 0x0, 0x0, 0x91, 0x7, 0xED, 0x41, 0x1, 0xD1, 0x7, 0xFD, 0x41, 0x1, 0x11, 0x8, 0xD, 0x42, 0x1, 0xD1, 0x91, 0x7D, 0x64, 0x1, 0x11, 0x92, 0x8D, 0x64, 0x1, 0x51, 0x92, 0x55, 0x42, 0x1, 0x71, 0x9, 0x65, 0x42, 0x1, 0xB1, 0x9, 0x75, 0x42, 0x1, 0xF1, 0x9, 0x85, 0x42, 0x1, 0x31, 0xA, 0x95, 0x42, 0x1, 0x71, 0xA, 0x9D, 0x64, 0x1, 0x91, 0xA, 0xAD, 0x42, 0x1, 0x11, 0x0, 0xA0, 0x64, 0x1, 0xB1, 0x92, 0x5, 0x0, 0x0, 0x11, 0xB, 0xCD, 0x42, 0x1, 0x51, 0xB, 0xDD, 0x42, 0x1, 0x91, 0xB, 0xB5, 0x64, 0x1, 0xF1, 0x92, 0xC5, 0x64, 0x1, 0x11, 0xC, 0xD, 0x43, 0x1, 0x51, 0xC, 0x1D, 0x43, 0x1, 0x91, 0xC, 0x2D, 0x43, 0x1, 0xD1, 0xC, 0x3D, 0x43, 0x1, 0x11, 0xD, 0x4D, 0x43, 0x1, 0x51, 0xD, 0x5D, 0x43, 0x1, 0x91, 0xD, 0x6D, 0x43, 0x1, 0xD1, 0xD, 0x7D, 0x43, 0x1, 0x11, 0xE, 0x8D, 0x43, 0x1, 0x51, 0xE, 0x9D, 0x43, 0x1, 0x91, 0xE, 0xAD, 0x43, 0x1, 0xD1, 0xE, 0xBD, 0x43, 0x1, 0x11, 0xF, 0xCD, 0x43, 0x1, 0x51, 0xF, 0xDD, 0x43, 0x1, 0x91, 0xF, 0xED, 0x43, 0x1, 0xD1, 0xF, 0x5, 0x0, 0x0, 0xF1, 0xF, 0x5, 0x44, 0x1, 0x31, 0x10, 0x15, 0x44, 0x1, 0x71, 0x10, 0x25, 0x44, 0x1, 0xB1, 0x10, 0x5, 0x0, 0x0, 0xD1, 0x10, 0x3D, 0x44, 0x1, 0x11, 0x11, 0x4D, 0x44, 0x1, 0x51, 0x11, 0x5D, 0x44, 0x1, 0x91, 0x11, 0x6D, 0x44, 0x1, 0xD1, 0x11, 0x7D, 0x44, 0x1, 0x11, 0x12, 0x8D, 0x44, 0x1, 0x51, 0x12, 0x9D, 0x44, 0x1, 0x11, 0x0, 0xA0, 0x44, 0x1, 0xB1, 0x12, 0xB5, 0x44, 0x1, 0xF1, 0x12, 0xC5, 0x44, 0x1, 0x31, 0x13, 0xD5, 0x44, 0x1, 0x71, 0x13, 0xE5, 0x44, 0x1, 0xB1, 0x13, 0xF5, 0x44, 0x1, 0xF1, 0x13, 0x5, 0x45, 0x1, 0x31, 0x14, 0x15, 0x45, 0x1, 0x71, 0x14, 0x25, 0x45, 0x1, 0xB1, 0x14, 0x35, 0x45, 0x1, 0xF1, 0x14, 0x45, 0x45, 0x1, 0x31, 0x15, 0x55, 0x45, 0x1, 0x11, 0x0, 0xC8, 0x64, 0x1, 0x51, 0x93, 0xDD, 0x64, 0x1, 0x91, 0x93, 0xED, 0x64, 0x1, 0xD1, 0x93, 0xFD, 0x64, 0x1, 0x11, 0x94, 0xD, 0x65, 0x1, 0x51, 0x94, 0x1D, 0x65, 0x1, 0x91, 0x94, 0x2D, 0x65, 0x1, 0xD1, 0x94, 0x3D, 0x65, 0x1, 0x11, 0x95, 0x4D, 0x65, 0x1, 0x51, 0x95, 0x5D, 0x65, 0x1, 0x91, 0x95, 0x6D, 0x65, 0x1, 0x71, 0x1A, 0x5, 0x0, 0x0, 0xD1, 0x95, 0x7D, 0x65, 0x1, 0x11, 0x96, 0x5, 0x0, 0x0, 0xD1, 0x1A, 0xBD, 0x46, 0x1, 0x11, 0x1B, 0xCD, 0x46, 0x1, 0x51, 0x1B, 0xDD, 0x46, 0x1, 0x91, 0x1B, 0xED, 0x46, 0x1, 0xD1, 0x1B, 0xFD, 0x46, 0x1, 0x11, 0x1C, 0xD, 0x47, 0x1, 0x51, 0x1C, 0x1D, 0x47, 0x1, 0x91, 0x1C, 0x2D, 0x47, 0x1, 0xD1, 0x1C, 0x3D, 0x47, 0x1, 0x11, 0x1D, 0x4D, 0x47, 0x1, 0x51, 0x1D, 0x5D, 0x47, 0x1, 0x91, 0x1D, 0x6D, 0x47, 0x1, 0xD1, 0x1D, 0x7D, 0x47, 0x1, 0x11, 0x1E, 0x8D, 0x47, 0x1, 0x51, 0x1E, 0x9D, 0x47, 0x1, 0x91, 0x1E, 0xAD, 0x47, 0x1, 0xD1, 0x1E, 0xBD, 0x47, 0x1, 0x11, 0x1F, 0xCD, 0x47, 0x1, 0x51, 0x1F, 0xDD, 0x47, 0x1, 0x91, 0x1F, 0xED, 0x47, 0x1, 0xD1, 0x1F, 0xFD, 0x47, 0x1, 0x11, 0x20, 0xD, 0x48, 0x1, 0x51, 0x20, 0x1D, 0x48, 0x1, 0x91, 0x20, 0x2D, 0x48, 0x1, 0xD1, 0x20, 0x3D, 0x48, 0x1, 0x31, 0x96, 0x5, 0x0, 0x0, 0x51, 0x96, 0x9D, 0x65, 0x1, 0x71, 0x21, 0xA5, 0x65, 0x1, 0xB1, 0x96, 0xB5, 0x65, 0x1, 0xF1, 0x96, 0xC5, 0x65, 0x1, 0x31, 0x97, 0xD5, 0x65, 0x1, 0x71, 0x97, 0xC5, 0x48, 0x1, 0x91, 0x97, 0xED, 0x65, 0x1, 0xD1, 0x97, 0xFD, 0x65, 0x1, 0x11, 0x98, 0xD, 0x66, 0x1, 0x51, 0x98, 0x1D, 0x66, 0x1, 0x91, 0x98, 0x2D, 0x66, 0x1, 0xD1, 0x98, 0x3D, 0x66, 0x1, 0x11, 0x99, 0x4D, 0x66, 0x1, 0x51, 0x99, 0x5D, 0x66, 0x1, 0x91, 0x99, 0x6D, 0x66, 0x1, 0xD1, 0x99, 0x7D, 0x66, 0x1, 0x11, 0x9A, 0x8D, 0x66, 0x1, 0x51, 0x9A, 0x9D, 0x66, 0x1, 0x11, 0x0, 0xA0, 0x66, 0x1, 0xB1, 0x9A, 0xB5, 0x66, 0x1, 0xF1, 0x9A, 0xC5, 0x66, 0x1, 0x31, 0x9B, 0xD5, 0x66, 0x1, 0x71, 0x9B, 0xE5, 0x66, 0x1, 0xB1, 0x9B, 0xF5, 0x66, 0x1, 0xF1, 0x9B, 0x5, 0x67, 0x1, 0x91, 0x9A, 0xAD, 0x66, 0x1, 0xD1, 0x9A, 0xBD, 0x66, 0x1, 0x11, 0x9B, 0xCD, 0x66, 0x1, 0x51, 0x9B, 0xDD, 0x66, 0x1, 0x91, 0x9B, 0xED, 0x66, 0x1, 0xD1, 0x9B, 0xFD, 0x66, 0x1, 0x11, 0x9C, 0x5, 0x0, 0x0, 0x11, 0x0, 0x8, 0x67, 0x1, 0x51, 0x9C, 0x5, 0x0, 0x0, 0x71, 0x9C, 0x25, 0x67, 0x1, 0xB1, 0x9C, 0x35, 0x67, 0x1, 0xF1, 0x9C, 0x45, 0x67, 0x1, 0x31, 0x9D, 0x55, 0x67, 0x1, 0x71, 0x9D, 0x5, 0x0, 0x0, 0x91, 0x9D, 0x5, 0x0, 0x0, 0xB1, 0x9D, 0x5, 0x0, 0x0, 0x11, 0x0, 0x70, 0x67, 0x1, 0xF1, 0x9D, 0x85, 0x67, 0x1, 0x31, 0x9E, 0x5, 0x0, 0x0, 0x11, 0x0, 0x90, 0x67, 0x1, 0x71, 0x9E, 0xA5, 0x67, 0x1, 0x11, 0x0, 0xA8, 0x67, 0x1, 0x11, 0x0, 0xA0, 0x67, 0x1, 0xD1, 0x9E, 0xBD, 0x67, 0x1, 0x11, 0x0, 0xB8, 0x67, 0x1, 0x11, 0x0, 0xC0, 0x67, 0x1, 0x31, 0x9F, 0xD5, 0x67, 0x1, 0x71, 0x9F, 0x5, 0x0, 0x0, 0x11, 0x0, 0xE0, 0x67, 0x1, 0xB1, 0x9F, 0xF5, 0x67, 0x1, 0xF1, 0x9F, 0xF5, 0x67, 0x1, 0x11, 0xA0, 0xD, 0x68, 0x1, 0x51, 0xA0, 0x1D, 0x68, 0x1, 0x91, 0xA0, 0x2D, 0x68, 0x1, 0xD1, 0xA0, 0x3D, 0x68, 0x1, 0x11, 0xA1, 0x4D, 0x68, 0x1, 0x51, 0xA1, 0x5D, 0x68, 0x1, 0x11, 0x0, 0x78, 0x67, 0x1, 0x71, 0x9E, 0x85, 0x67, 0x1, 0xD1, 0x9E, 0xCD, 0x67, 0x1, 0x51, 0x9F, 0xED, 0x67, 0x1, 0x91, 0xA1, 0x6D, 0x68, 0x1, 0xD1, 0xA1, 0x7D, 0x68, 0x1, 0x11, 0xA2, 0x8D, 0x68, 0x1, 0x51, 0xA2, 0x9D, 0x68, 0x1, 0x11, 0x0, 0xA0, 0x68, 0x1, 0xB1, 0xA2, 0xB5, 0x68, 0x1, 0xF1, 0xA2, 0xC5, 0x68, 0x1, 0x31, 0xA3, 0xD5, 0x68, 0x1, 0x71, 0xA3, 0xE5, 0x68, 0x1, 0xB1, 0xA3, 0xF5, 0x68, 0x1, 0x11, 0x0, 0xF8, 0x68, 0x1, 0x11, 0xA4, 0xD, 0x69, 0x1, 0x51, 0xA4, 0x1D, 0x69, 0x1, 0x91, 0xA4, 0x2D, 0x69, 0x1, 0xF1, 0x3A, 0xC5, 0x4E, 0x1, 0x31, 0x3B, 0xD5, 0x4E, 0x1, 0x71, 0x3B, 0xE5, 0x4E, 0x1, 0xB1, 0x3B, 0xF5, 0x4E, 0x1, 0xF1, 0x3B, 0x5, 0x4F, 0x1, 0x31, 0x3C, 0x15, 0x4F, 0x1, 0x71, 0x3C, 0x25, 0x4F, 0x1, 0xB1, 0x3C, 0x35, 0x4F, 0x1, 0xF1, 0x3C, 0x45, 0x4F, 0x1, 0x31, 0x3D, 0x55, 0x4F, 0x1, 0x71, 0x3D, 0x65, 0x4F, 0x1, 0xB1, 0x3D, 0x75, 0x4F, 0x1, 0xF1, 0x3D, 0x85, 0x4F, 0x1, 0x31, 0x3E, 0x95, 0x4F, 0x1, 0x71, 0x3E, 0xA5, 0x4F, 0x1, 0xB1, 0x3E, 0xB5, 0x4F, 0x1, 0xF1, 0x3E, 0xC5, 0x4F, 0x1, 0x31, 0x3F, 0xD5, 0x4F, 0x1, 0x71, 0x3F, 0xE5, 0x4F, 0x1, 0xB1, 0x3F, 0xF5, 0x4F, 0x1, 0xF1, 0x3F, 0x5, 0x50, 0x1, 0x31, 0x40, 0x15, 0x50, 0x1, 0x71, 0x40, 0x25, 0x50, 0x1, 0xB1, 0x40, 0x35, 0x50, 0x1, 0xD1, 0xA4, 0x5, 0x0, 0x0, 0x11, 0x0, 0x40, 0x50, 0x1, 0x31, 0x41, 0x55, 0x50, 0x1, 0x71, 0x41, 0x65, 0x50, 0x1, 0xB1, 0x41, 0x75, 0x50, 0x1, 0xF1, 0x41, 0x85, 0x50, 0x1, 0x31, 0x42, 0x95, 0x50, 0x1, 0x71, 0x42, 0xA5, 0x50, 0x1, 0xB1, 0x42, 0xB5, 0x50, 0x1, 0xF1, 0x42, 0xC5, 0x50, 0x1, 0x31, 0x43, 0xD5, 0x50, 0x1, 0x71, 0x43, 0xE5, 0x50, 0x1, 0xB1, 0x43, 0xF5, 0x50, 0x1, 0xF1, 0x43, 0x5, 0x51, 0x1, 0x31, 0x44, 0x15, 0x51, 0x1, 0x71, 0x44, 0x25, 0x51, 0x1, 0xB1, 0x44, 0x35, 0x51, 0x1, 0xF1, 0x44, 0x45, 0x51, 0x1, 0x31, 0x45, 0x55, 0x51, 0x1, 0x71, 0x45, 0x65, 0x51, 0x1, 0xB1, 0x45, 0x75, 0x51, 0x1, 0xF1, 0x45, 0x85, 0x51, 0x1, 0x31, 0x46, 0x95, 0x51, 0x1, 0x71, 0x46, 0xA5, 0x51, 0x1, 0xB1, 0x46, 0xB5, 0x51, 0x1, 0xF1, 0x46, 0xC5, 0x51, 0x1, 0x31, 0x47, 0xD5, 0x51, 0x1, 0x71, 0x47, 0xE5, 0x51, 0x1, 0xB1, 0x47, 0xF5, 0x51, 0x1, 0xF1, 0x47, 0x5, 0x52, 0x1, 0x31, 0x48, 0x15, 0x52, 0x1, 0x71, 0x48, 0x25, 0x52, 0x1, 0xB1, 0x48, 0x35, 0x52, 0x1, 0xF1, 0x48, 0x45, 0x52, 0x1, 0x31, 0x49, 0x55, 0x52, 0x1, 0x71, 0x49, 0x65, 0x52, 0x1, 0xB1, 0x49, 0x75, 0x52, 0x1, 0xF1, 0x49, 0x85, 0x52, 0x1, 0x31, 0x4A, 0x95, 0x52, 0x1, 0xF1, 0xA4, 0x5, 0x0, 0x0, 0x11, 0x0, 0x40, 0x69, 0x1, 0x11, 0x0, 0x48, 0x69, 0x1, 0x51, 0xA5, 0x5D, 0x69, 0x1, 0x91, 0xA5, 0x6D, 0x69, 0x1, 0xD1, 0xA5, 0x7D, 0x69, 0x1, 0x11, 0xA6, 0x8D, 0x69, 0x1, 0x51, 0xA6, 0x9D, 0x69, 0x1, 0x91, 0xA6, 0xAD, 0x69, 0x1, 0xD1, 0xA6, 0xBD, 0x69, 0x1, 0x11, 0xA7, 0xCD, 0x69, 0x1, 0x51, 0xA7, 0xDD, 0x69, 0x1, 0x91, 0xA7, 0xED, 0x69, 0x1, 0xD1, 0xA7, 0xFD, 0x69, 0x1, 0x11, 0xA8, 0xD, 0x6A, 0x1, 0x11, 0x0, 0x10, 0x6A, 0x1, 0x71, 0xA8, 0x25, 0x6A, 0x1, 0xB1, 0xA8, 0x35, 0x6A, 0x1, 0xF1, 0xA8, 0x45, 0x6A, 0x1, 0x31, 0xA9, 0x55, 0x6A, 0x1, 0x71, 0xA9, 0x65, 0x6A, 0x1, 0xB1, 0xA9, 0x75, 0x6A, 0x1, 0xF1, 0xA9, 0x85, 0x6A, 0x1, 0x31, 0xAA, 0x95, 0x6A, 0x1, 0x71, 0xAA, 0xA5, 0x6A, 0x1, 0xB1, 0xAA, 0xB5, 0x6A, 0x1, 0xF1, 0xAA, 0xC5, 0x6A, 0x1, 0xB1, 0x55, 0x75, 0x55, 0x1, 0xF1, 0x55, 0x85, 0x55, 0x1, 0x31, 0x56, 0x95, 0x55, 0x1, 0x71, 0x56, 0xA5, 0x55, 0x1, 0xB1, 0x56, 0xB5, 0x55, 0x1, 0xF1, 0x56, 0xC5, 0x55, 0x1, 0x31, 0x57, 0xD5, 0x55, 0x1, 0x71, 0x57, 0xE5, 0x55, 0x1, 0xB1, 0x57, 0xF5, 0x55, 0x1, 0xF1, 0x57, 0x5, 0x56, 0x1, 0x31, 0x58, 0x15, 0x56, 0x1, 0x71, 0x58, 0x25, 0x56, 0x1, 0xB1, 0x58, 0x35, 0x56, 0x1, 0xF1, 0x58, 0x45, 0x56, 0x1, 0x31, 0x59, 0x55, 0x56, 0x1, 0x71, 0x59, 0x65, 0x56, 0x1, 0xB1, 0x59, 0x75, 0x56, 0x1, 0xF1, 0x59, 0x85, 0x56, 0x1, 0x31, 0x5A, 0x95, 0x56, 0x1, 0x71, 0x5A, 0xA5, 0x56, 0x1, 0xB1, 0x5A, 0xB5, 0x56, 0x1, 0xF1, 0x5A, 0xC5, 0x56, 0x1, 0x31, 0x5B, 0xD5, 0x56, 0x1, 0x71, 0x5B, 0xE5, 0x56, 0x1, 0x31, 0xAB, 0xD5, 0x6A, 0x1, 0x71, 0xAB, 0xE5, 0x6A, 0x1, 0xB1, 0xAB, 0xF5, 0x6A, 0x1, 0xF1, 0xAB, 0x5, 0x6B, 0x1, 0xB1, 0x5C, 0x35, 0x57, 0x1, 0xF1, 0x5C, 0x45, 0x57, 0x1, 0x31, 0x5D, 0x55, 0x57, 0x1, 0x71, 0x5D, 0x65, 0x57, 0x1, 0xB1, 0x5D, 0x75, 0x57, 0x1, 0xF1, 0x5D, 0x85, 0x57, 0x1, 0x31, 0x5E, 0x95, 0x57, 0x1, 0x71, 0x5E, 0xA5, 0x57, 0x1, 0xB1, 0x5E, 0xB5, 0x57, 0x1, 0xF1, 0x5E, 0xC5, 0x57, 0x1, 0x31, 0x5F, 0xD5, 0x57, 0x1, 0x71, 0x5F, 0xE5, 0x57, 0x1, 0xB1, 0x5F, 0xF5, 0x57, 0x1, 0xF1, 0x5F, 0x5, 0x0, 0x0, 0x11, 0x0, 0x0, 0x58, 0x1, 0x31, 0x60, 0x15, 0x58, 0x1, 0x71, 0x60, 0x25, 0x58, 0x1, 0xB1, 0x60, 0x35, 0x58, 0x1, 0xF1, 0x60, 0x45, 0x58, 0x1, 0x31, 0x61, 0x55, 0x58, 0x1, 0x71, 0x61, 0x65, 0x58, 0x1, 0xB1, 0x61, 0x75, 0x58, 0x1, 0xF1, 0x61, 0x85, 0x58, 0x1, 0x31, 0xAC, 0x15, 0x6B, 0x1, 0x71, 0xAC, 0x25, 0x6B, 0x1, 0xB1, 0xAC, 0x35, 0x6B, 0x1, 0xF1, 0xAC, 0x45, 0x6B, 0x1, 0x31, 0xAD, 0x55, 0x6B, 0x1, 0x71, 0xAD, 0x65, 0x6B, 0x1, 0xB1, 0xAD, 0x75, 0x6B, 0x1, 0xF1, 0xAD, 0x85, 0x6B, 0x1, 0x31, 0xAE, 0x95, 0x6B, 0x1, 0x71, 0xAE, 0xA5, 0x6B, 0x1, 0xB1, 0xAE, 0xB5, 0x6B, 0x1, 0xF1, 0xAE, 0xC5, 0x6B, 0x1, 0x31, 0xAF, 0xD5, 0x6B, 0x1, 0x91, 0x68, 0xDD, 0x6B, 0x1, 0x91, 0xAF, 0xED, 0x6B, 0x1, 0xD1, 0xAF, 0x5, 0x0, 0x0, 0x31, 0x69, 0x55, 0x5A, 0x1, 0x71, 0x69, 0x65, 0x5A, 0x1, 0xB1, 0x69, 0x75, 0x5A, 0x1, 0xF1, 0x69, 0x85, 0x5A, 0x1, 0x31, 0x6A, 0x95, 0x5A, 0x1, 0x71, 0x6A, 0xA5, 0x5A, 0x1, 0xF1, 0xAF, 0x5, 0x0, 0x0, 0x11, 0xB0, 0xD, 0x6C, 0x1, 0x51, 0xB0, 0x1D, 0x6C, 0x1, 0x91, 0xB0, 0x2D, 0x6C, 0x1, 0xD1, 0xB0, 0x3D, 0x6C, 0x1, 0x11, 0xB1, 0x4D, 0x6C, 0x1, 0x51, 0xB1, 0x5D, 0x6C, 0x1, 0x91, 0xB1, 0x6D, 0x6C, 0x1, 0xD1, 0xB1, 0x7D, 0x6C, 0x1, 0x11, 0xB2, 0x8D, 0x6C, 0x1, 0x51, 0xB2, 0x9D, 0x6C, 0x1, 0x91, 0xB2, 0xAD, 0x6C, 0x1, 0xD1, 0xB2, 0x5, 0x0, 0x0, 0xF1, 0xB2, 0xCD, 0x6B, 0x1, 0x51, 0xAF, 0x5, 0x0, 0x0, 0xB1, 0x6E, 0x5, 0x0, 0x0, 0xD1, 0x6E, 0xBD, 0x5B, 0x1, 0x11, 0xB3, 0xCD, 0x6C, 0x1, 0x51, 0xB3, 0x5, 0x0, 0x0, 0x11, 0x0, 0xD8, 0x6C, 0x1, 0x91, 0xB3, 0xED, 0x6C, 0x1, 0xD1, 0xB3, 0x5, 0x0, 0x0, 0xF1, 0xB3, 0x5, 0x6D, 0x1, 0x11, 0x0, 0x8, 0x6D, 0x1, 0x11, 0x0, 0x10, 0x6D, 0x1, 0x71, 0xB4, 0x25, 0x6D, 0x1, 0xB1, 0xB4, 0x35, 0x6D, 0x1, 0xF1, 0xB4, 0x45, 0x6D, 0x1, 0x31, 0xB5, 0x55, 0x6D, 0x1, 0x71, 0xB5, 0x65, 0x6D, 0x1, 0x11, 0x0, 0x68, 0x6D, 0x1, 0xD1, 0xB5, 0x7D, 0x6D, 0x1, 0x11, 0xB6, 0x8D, 0x6D, 0x1, 0x51, 0xB6, 0x9D, 0x6D, 0x1, 0xB1, 0x71, 0x75, 0x5C, 0x1, 0xF1, 0x71, 0x85, 0x5C, 0x1, 0x31, 0x72, 0xA5, 0x6D, 0x1, 0xB1, 0xB6, 0xB5, 0x6D, 0x1, 0xF1, 0xB6, 0xC5, 0x6D, 0x1, 0x31, 0xB7, 0x5, 0x0, 0x0, 0xD1, 0x72, 0xBD, 0x5C, 0x1, 0x11, 0x73, 0xCD, 0x5C, 0x1, 0x51, 0x73, 0xDD, 0x5C, 0x1, 0x91, 0x73, 0xED, 0x5C, 0x1, 0xD1, 0x73, 0xD5, 0x6D, 0x1, 0x11, 0x74, 0xD, 0x5D, 0x1, 0x51, 0x74, 0x1D, 0x5D, 0x1, 0x91, 0x74, 0x2D, 0x5D, 0x1, 0xD1, 0x74, 0x3D, 0x5D, 0x1, 0x11, 0x75, 0x4D, 0x5D, 0x1, 0x51, 0x75, 0x5D, 0x5D, 0x1, 0x91, 0x75, 0x6D, 0x5D, 0x1, 0xD1, 0x75, 0x7D, 0x5D, 0x1, 0x11, 0x76, 0x8D, 0x5D, 0x1, 0x51, 0x76, 0x9D, 0x5D, 0x1, 0x71, 0xB7, 0xB5, 0x5D, 0x1, 0xF1, 0x76, 0xE5, 0x6D, 0x1, 0x11, 0x77, 0xCD, 0x5D, 0x1, 0x51, 0x77, 0xDD, 0x5D, 0x1, 0x91, 0x77, 0xED, 0x5D, 0x1, 0xD1, 0x77, 0xFD, 0x5D, 0x1, 0x11, 0x78, 0xED, 0x6D, 0x1, 0xD1, 0xB7, 0xFD, 0x6D, 0x1, 0x11, 0xB8, 0xD, 0x6E, 0x1, 0x51, 0xB8, 0x1D, 0x6E, 0x1, 0x91, 0xB8, 0x2D, 0x6E, 0x1, 0x51, 0x79, 0x5D, 0x5E, 0x1, 0xD1, 0xB8, 0x65, 0x5E, 0x1, 0xF1, 0xB8, 0x6D, 0x5E, 0x1, 0x11, 0x0, 0x70, 0x5E, 0x1, 0x11, 0xB9, 0x4D, 0x6E, 0x1, 0x51, 0xB9, 0x5D, 0x6E, 0x1, 0x91, 0xB9, 0x95, 0x5E, 0x1, 0x11, 0x0, 0x68, 0x6E, 0x1, 0xD1, 0xB9, 0xA5, 0x5E, 0x1, 0xB1, 0x7A, 0xB5, 0x5E, 0x1, 0xF1, 0xB9, 0x85, 0x6E, 0x1, 0x31, 0xBA, 0xBD, 0x5E, 0x1, 0x51, 0xBA, 0x9D, 0x6E, 0x1, 0x91, 0xBA, 0xAD, 0x6E, 0x1, 0xD1, 0xBA, 0xBD, 0x6E, 0x1, 0x11, 0xBB, 0xCD, 0x6E, 0x1, 0x51, 0xBB, 0xDD, 0x5E, 0x1, 0x91, 0x7B, 0xDD, 0x6E, 0x1, 0x91, 0xBB, 0xED, 0x6E, 0x1, 0xD1, 0xBB, 0xFD, 0x6E, 0x1, 0x31, 0x7C, 0x15, 0x5F, 0x1, 0x71, 0x7C, 0x25, 0x5F, 0x1, 0xB1, 0x7C, 0x35, 0x5F, 0x1, 0xF1, 0x7C, 0x45, 0x5F, 0x1, 0x31, 0x7D, 0x55, 0x5F, 0x1, 0x71, 0x7D, 0x65, 0x5F, 0x1, 0xB1, 0x7D, 0x75, 0x5F, 0x1, 0xF1, 0x7D, 0x85, 0x5F, 0x1, 0x31, 0x7E, 0x95, 0x5F, 0x1, 0x71, 0x7E, 0xA5, 0x5F, 0x1, 0xB1, 0x7E, 0xB5, 0x5F, 0x1, 0xF1, 0x7E, 0x5, 0x6F, 0x1, 0x31, 0xBC, 0x15, 0x6F, 0x1, 0x71, 0xBC, 0x25, 0x6F, 0x1, 0xB1, 0xBC, 0x35, 0x6F, 0x1, 0xF1, 0xBC, 0x45, 0x6F, 0x1, 0x11, 0x80, 0xD, 0x60, 0x1, 0x51, 0x80, 0x4D, 0x6F, 0x1, 0x91, 0x80, 0x2D, 0x60, 0x1, 0xD1, 0x80, 0x3D, 0x60, 0x1, 0x11, 0x81, 0x4D, 0x60, 0x1, 0x51, 0x81, 0x5D, 0x60, 0x1, 0x91, 0x81, 0x6D, 0x60, 0x1, 0xD1, 0x81, 0x7D, 0x60, 0x1, 0x11, 0x82, 0x8D, 0x60, 0x1, 0x51, 0x82, 0x9D, 0x60, 0x1, 0x91, 0x82, 0xAD, 0x60, 0x1, 0xD1, 0x82, 0xBD, 0x60, 0x1, 0x11, 0x83, 0xCD, 0x60, 0x1, 0x51, 0x83, 0xDD, 0x60, 0x1, 0x51, 0xBD, 0x5D, 0x6F, 0x1, 0x91, 0xBD, 0x6D, 0x6F, 0x1, 0xD1, 0xBD, 0x7D, 0x6F, 0x1, 0x11, 0xBE, 0x8D, 0x6F, 0x1, 0x51, 0xBE, 0x9D, 0x6F, 0x1, 0x91, 0xBE, 0xAD, 0x6F, 0x1, 0xD1, 0xBE, 0xBD, 0x6F, 0x1, 0x11, 0xBF, 0xCD, 0x6F, 0x1, 0x51, 0xBF, 0x5D, 0x6F, 0x1, 0x71, 0xBF, 0xE5, 0x6F, 0x1, 0xB1, 0xBF, 0xF5, 0x6F, 0x1, 0xF1, 0xBF, 0x5, 0x70, 0x1, 0x31, 0xC0, 0x15, 0x70, 0x1, 0x71, 0xC0, 0x25, 0x70, 0x1, 0xB1, 0xC0, 0x35, 0x70, 0x1, 0xF1, 0xC0, 0x45, 0x70, 0x1, 0x12, 0x0, 0x48, 0x70, 0x1, 0x52, 0xC1, 0x5D, 0x70, 0x1, 0x92, 0xC1, 0x6D, 0x70, 0x1, 0xD2, 0xC1, 0x7D, 0x70, 0x1, 0x12, 0xC2, 0x8D, 0x70, 0x1, 0x52, 0xC2, 0x9D, 0x70, 0x1, 0x92, 0xC2, 0xAD, 0x70, 0x1, 0xD2, 0xC2, 0xBD, 0x70, 0x1, 0x12, 0xC3, 0xCD, 0x70, 0x1, 0x52, 0xC3, 0xDD, 0x70, 0x1, 0x92, 0xC3, 0xED, 0x70, 0x1, 0xD2, 0xC3, 0xFD, 0x70, 0x1, 0x12, 0xC4, 0xD, 0x71, 0x1, 0x52, 0xC4, 0x1D, 0x71, 0x1, 0x12, 0x0, 0x20, 0x71, 0x1, 0xB2, 0xC4, 0x5, 0x0, 0x0, 0x12, 0x0, 0x30, 0x71, 0x1, 0xF2, 0xC4, 0x45, 0x71, 0x1, 0x32, 0xC5, 0x55, 0x71, 0x1, 0x72, 0xC5, 0x65, 0x71, 0x1, 0xB2, 0xC5, 0x75, 0x71, 0x1, 0xF2, 0xC5, 0x85, 0x71, 0x1, 0x32, 0xC6, 0x95, 0x71, 0x1, 0x72, 0xC6, 0xA5, 0x71, 0x1, 0xB2, 0xC6, 0xB5, 0x71, 0x1, 0xF2, 0xC6, 0xC5, 0x71, 0x1, 0x32, 0xC7, 0xD5, 0x71, 0x1, 0x72, 0xC7, 0xE5, 0x71, 0x1, 0xB2, 0xC7, 0xF5, 0x71, 0x1, 0xF2, 0xC7, 0x5, 0x72, 0x1, 0x32, 0xC8, 0x15, 0x72, 0x1, 0x72, 0xC8, 0x25, 0x72, 0x1, 0xB2, 0xC8, 0x35, 0x72, 0x1, 0xF2, 0xC8, 0x45, 0x72, 0x1, 0x32, 0xC9, 0x55, 0x72, 0x1, 0x72, 0xC9, 0x65, 0x72, 0x1, 0xB2, 0xC9, 0x75, 0x72, 0x1, 0x12, 0x0, 0x78, 0x72, 0x1, 0x12, 0xCA, 0x8D, 0x72, 0x1, 0x52, 0xCA, 0x9D, 0x72, 0x1, 0x92, 0xCA, 0xAD, 0x72, 0x1, 0xD2, 0xCA, 0xBD, 0x72, 0x1, 0x12, 0xCB, 0xCD, 0x72, 0x1, 0x52, 0xCB, 0xDD, 0x72, 0x1, 0x92, 0xCB, 0xED, 0x72, 0x1, 0xD2, 0xCB, 0xFD, 0x72, 0x1, 0x12, 0xCC, 0xD, 0x73, 0x1, 0x52, 0xCC, 0x5, 0x0, 0x0, 0x72, 0xCC, 0x25, 0x73, 0x1, 0xB2, 0xCC, 0x35, 0x73, 0x1, 0xF2, 0xCC, 0x45, 0x73, 0x1, 0x32, 0xCD, 0x55, 0x73, 0x1, 0x72, 0xCD, 0x65, 0x73, 0x1, 0x12, 0x0, 0x68, 0x73, 0x1, 0xD2, 0xCD, 0x7D, 0x73, 0x1, 0x12, 0x0, 0x80, 0x73, 0x1, 0x32, 0xCE, 0x95, 0x73, 0x1, 0x72, 0xCE, 0xA5, 0x73, 0x1, 0xB2, 0xCE, 0xB5, 0x73, 0x1, 0xF2, 0xCE, 0xC5, 0x73, 0x1, 0x32, 0xCF, 0xD5, 0x73, 0x1, 0x72, 0xCF, 0xE5, 0x73, 0x1, 0xB2, 0xCF, 0xF5, 0x73, 0x1, 0xF2, 0xCF, 0x5, 0x74, 0x1, 0x32, 0xD0, 0x15, 0x74, 0x1, 0x72, 0xD0, 0x25, 0x74, 0x1, 0xB2, 0xD0, 0x35, 0x74, 0x1, 0xF2, 0xD0, 0x45, 0x74, 0x1, 0x32, 0xD1, 0x5, 0x0, 0x0, 0x52, 0xD1, 0x5D, 0x74, 0x1, 0x92, 0xD1, 0x6D, 0x74, 0x1, 0xD2, 0xD1, 0x7D, 0x74, 0x1, 0x12, 0xD2, 0x8D, 0x74, 0x1, 0x52, 0xD2, 0x9D, 0x74, 0x1, 0x92, 0xD2, 0xAD, 0x74, 0x1, 0xD2, 0xD2, 0xBD, 0x74, 0x1, 0x12, 0xD3, 0xCD, 0x74, 0x1, 0x52, 0xD3, 0xDD, 0x74, 0x1, 0x12, 0x0, 0xE0, 0x74, 0x1, 0xB2, 0xD3, 0xF5, 0x74, 0x1, 0xF2, 0xD3, 0x5, 0x75, 0x1, 0x32, 0xD4, 0x15, 0x75, 0x1, 0x72, 0xD4, 0x25, 0x75, 0x1, 0xB2, 0xD4, 0x35, 0x75, 0x1, 0xF2, 0xD4, 0x45, 0x75, 0x1, 0x32, 0xD5, 0x5, 0x0, 0x0, 0x52, 0xD5, 0x5D, 0x75, 0x1, 0x92, 0xD5, 0x6D, 0x75, 0x1, 0xD2, 0xD5, 0x7D, 0x75, 0x1, 0x12, 0xD6, 0x5, 0x0, 0x0, 0x12, 0x0, 0x80, 0x75, 0x1, 0x12, 0x0, 0x88, 0x75, 0x1, 0x52, 0xD6, 0x5, 0x0, 0x0, 0x72, 0xD6, 0xA5, 0x75, 0x1, 0x12, 0x0, 0xA8, 0x75, 0x1, 0xD2, 0xD6, 0xBD, 0x75, 0x1, 0x12, 0xD7, 0xCD, 0x75, 0x1, 0x12, 0x0, 0xD0, 0x75, 0x1, 0x12, 0x0, 0xD8, 0x75, 0x1, 0x92, 0xD7, 0xED, 0x75, 0x1, 0x12, 0x0, 0xF0, 0x75, 0x1, 0xF2, 0xD7, 0x5, 0x76, 0x1, 0x12, 0x0, 0x8, 0x76, 0x1, 0x52, 0xD8, 0x1D, 0x76, 0x1, 0x92, 0xD8, 0x2D, 0x76, 0x1, 0xD2, 0xD8, 0x3D, 0x76, 0x1, 0x12, 0xD9, 0x4D, 0x76, 0x1, 0x52, 0xD9, 0x5D, 0x76, 0x1, 0x92, 0xD9, 0x6D, 0x76, 0x1, 0xD2, 0xD9, 0x7D, 0x76, 0x1, 0x12, 0xDA, 0x8D, 0x76, 0x1, 0x52, 0xDA, 0x9D, 0x76, 0x1, 0x92, 0xDA, 0xAD, 0x76, 0x1, 0xD2, 0xDA, 0xBD, 0x76, 0x1, 0x12, 0xDB, 0xCD, 0x76, 0x1, 0x52, 0xDB, 0xDD, 0x76, 0x1, 0x92, 0xDB, 0xED, 0x76, 0x1, 0xD2, 0xDB, 0xFD, 0x76, 0x1, 0x12, 0xDC, 0xD, 0x77, 0x1, 0x52, 0xDC, 0x1D, 0x77, 0x1, 0x92, 0xDC, 0x2D, 0x77, 0x1, 0xD2, 0xDC, 0x3D, 0x77, 0x1, 0x12, 0xDD, 0x4D, 0x77, 0x1, 0x52, 0xDD, 0x5D, 0x77, 0x1, 0x92, 0xDD, 0x6D, 0x77, 0x1, 0xD2, 0xDD, 0x7D, 0x77, 0x1, 0x12, 0xDE, 0x8D, 0x77, 0x1, 0x52, 0xDE, 0x5, 0x0, 0x0, 0x72, 0xDE, 0xA5, 0x77, 0x1, 0xB2, 0xDE, 0xB5, 0x77, 0x1, 0xF2, 0xDE, 0xC5, 0x77, 0x1, 0x32, 0xDF, 0xD5, 0x77, 0x1, 0x72, 0xDF, 0xE5, 0x77, 0x1, 0xB2, 0xDF, 0xF5, 0x77, 0x1, 0xF2, 0xDF, 0x5, 0x78, 0x1, 0x32, 0xE0, 0x15, 0x78, 0x1, 0x72, 0xE0, 0x25, 0x78, 0x1, 0xB2, 0xE0, 0x35, 0x78, 0x1, 0xF2, 0xE0, 0x45, 0x78, 0x1, 0x32, 0xE1, 0x55, 0x78, 0x1, 0x72, 0xE1, 0x65, 0x78, 0x1, 0xB2, 0xE1, 0x75, 0x78, 0x1, 0xF2, 0xE1, 0x85, 0x78, 0x1, 0x32, 0xE2, 0x95, 0x78, 0x1, 0x72, 0xE2, 0xA5, 0x78, 0x1, 0xB2, 0xE2, 0xB5, 0x78, 0x1, 0xF2, 0xE2, 0xC5, 0x78, 0x1, 0x32, 0xE3, 0x5, 0x0, 0x0, 0x52, 0xE3, 0xDD, 0x78, 0x1, 0x92, 0xE3, 0xED, 0x78, 0x1, 0xD2, 0xE3, 0xFD, 0x78, 0x1, 0x12, 0xE4, 0xD, 0x79, 0x1, 0x52, 0xE4, 0x1D, 0x79, 0x1, 0x92, 0xE4, 0x2D, 0x79, 0x1, 0xD2, 0xE4, 0x3D, 0x79, 0x1, 0x12, 0xE5, 0x4D, 0x79, 0x1, 0x52, 0xE5, 0x5D, 0x79, 0x1, 0x92, 0xE5, 0x6D, 0x79, 0x1, 0xD2, 0xE5, 0x7D, 0x79, 0x1, 0x12, 0xE6, 0x8D, 0x79, 0x1, 0x52, 0xE6, 0x9D, 0x79, 0x1, 0x92, 0xE6, 0xAD, 0x79, 0x1, 0xD2, 0xE6, 0xBD, 0x79, 0x1, 0x12, 0xE7, 0xCD, 0x79, 0x1, 0x52, 0xE7, 0xDD, 0x79, 0x1, 0x92, 0xE7, 0xED, 0x79, 0x1, 0xD2, 0xE7, 0xFD, 0x79, 0x1, 0x12, 0xE8, 0xD, 0x7A, 0x1, 0x52, 0xE8, 0x1D, 0x7A, 0x1, 0x92, 0xE8, 0x2D, 0x7A, 0x1, 0xD2, 0xE8, 0x3D, 0x7A, 0x1, 0x12, 0xE9, 0x4D, 0x7A, 0x1, 0x52, 0xE9, 0x5D, 0x7A, 0x1, 0x92, 0xE9, 0x6D, 0x7A, 0x1, 0xD2, 0xE9, 0x7D, 0x7A, 0x1, 0x12, 0xEA, 0x8D, 0x7A, 0x1, 0x52, 0xEA, 0x9D, 0x7A, 0x1, 0x92, 0xEA, 0xAD, 0x7A, 0x1, 0xD2, 0xEA, 0xBD, 0x7A, 0x1, 0x12, 0xEB, 0xCD, 0x7A, 0x1, 0x52, 0xEB, 0xDD, 0x7A, 0x1, 0x92, 0xEB, 0xED, 0x7A, 0x1, 0x12, 0x0, 0xF0, 0x7A, 0x1, 0xF2, 0xEB, 0x5, 0x7B, 0x1, 0x32, 0xEC, 0x15, 0x7B, 0x1, 0x72, 0xEC, 0x25, 0x7B, 0x1, 0xB2, 0xEC, 0x35, 0x7B, 0x1, 0xF2, 0xEC, 0x45, 0x7B, 0x1, 0x32, 0xED, 0x55, 0x7B, 0x1, 0x72, 0xED, 0x65, 0x7B, 0x1, 0xB2, 0xED, 0x75, 0x7B, 0x1, 0xF2, 0xED, 0x85, 0x7B, 0x1, 0x32, 0xEE, 0x95, 0x7B, 0x1, 0x72, 0xEE, 0xA5, 0x7B, 0x1, 0xB2, 0xEE, 0xB5, 0x7B, 0x1, 0xF2, 0xEE, 0xC5, 0x7B, 0x1, 0x32, 0xEF, 0xD5, 0x7B, 0x1, 0x72, 0xEF, 0xE5, 0x7B, 0x1, 0xB2, 0xEF, 0x5, 0x0, 0x0, 0xD2, 0xEF, 0xFD, 0x7B, 0x1, 0x12, 0xF0, 0xD, 0x7C, 0x1, 0x52, 0xF0, 0x1D, 0x7C, 0x1, 0x92, 0xF0, 0x2D, 0x7C, 0x1, 0xD2, 0xF0, 0xFD, 0x7B, 0x1, 0xF2, 0xF0, 0x45, 0x7C, 0x1, 0x32, 0xF1, 0x5, 0x0, 0x0, 0x52, 0xF1, 0x5D, 0x7C, 0x1, 0x92, 0xF1, 0x6D, 0x7C, 0x1, 0xD2, 0xF1, 0x5, 0x0, 0x0, 0x12, 0x0, 0x78, 0x7C, 0x1, 0x12, 0xF2, 0x8D, 0x7C, 0x1, 0x52, 0xF2, 0x9D, 0x7C, 0x1, 0x92, 0xF2, 0x5, 0x0, 0x0, 0xB2, 0xF2, 0xB5, 0x7C, 0x1, 0xF2, 0xF2, 0xC5, 0x7C, 0x1, 0x32, 0xF3, 0xD5, 0x7C, 0x1, 0x72, 0xF3, 0xE5, 0x7C, 0x1, 0xB2, 0xF3, 0xF5, 0x7C, 0x1, 0xF2, 0xF3, 0x5, 0x7D, 0x1, 0x32, 0xF4, 0x15, 0x7D, 0x1, 0x72, 0xF4, 0x25, 0x7D, 0x1, 0x12, 0x0, 0x28, 0x7D, 0x1, 0xD2, 0xF4, 0x3D, 0x7D, 0x1, 0x12, 0xF5, 0x4D, 0x7D, 0x1, 0x52, 0xF5, 0x5D, 0x7D, 0x1, 0x92, 0xF5, 0x6D, 0x7D, 0x1, 0xD2, 0xF5, 0x7D, 0x7D, 0x1, 0x12, 0xF6, 0x8D, 0x7D, 0x1, 0x52, 0xF6, 0x9D, 0x7D, 0x1, 0x92, 0xF6, 0xAD, 0x7D, 0x1, 0xD2, 0xF6, 0xBD, 0x7D, 0x1, 0x12, 0xF7, 0xCD, 0x7D, 0x1, 0x52, 0xF7, 0xDD, 0x7D, 0x1, 0x92, 0xF7, 0xED, 0x7D, 0x1, 0xD2, 0xF7, 0xFD, 0x7D, 0x1, 0x12, 0xF8, 0x5, 0x0, 0x0, 0x32, 0xF8, 0x15, 0x7E, 0x1, 0x72, 0xF8, 0x25, 0x7E, 0x1, 0xB2, 0xF8, 0x35, 0x7E, 0x1, 0xF2, 0xF8, 0x45, 0x7E, 0x1, 0x32, 0xF9, 0x55, 0x7E, 0x1, 0x72, 0xF9, 0x65, 0x7E, 0x1, 0xB2, 0xF9, 0x75, 0x7E, 0x1, 0xF2, 0xF9, 0x85, 0x7E, 0x1, 0x32, 0xFA, 0x95, 0x7E, 0x1, 0x72, 0xFA, 0xA5, 0x7E, 0x1, 0xB2, 0xFA, 0xB5, 0x7E, 0x1, 0xF2, 0xFA, 0xC5, 0x7E, 0x1, 0x32, 0xFB, 0xD5, 0x7E, 0x1, 0x72, 0xFB, 0xE5, 0x7E, 0x1, 0xB2, 0xFB, 0xF5, 0x7E, 0x1, 0xF2, 0xFB, 0x5, 0x7F, 0x1, 0x32, 0xFC, 0x15, 0x7F, 0x1, 0x72, 0xFC, 0x25, 0x7F, 0x1, 0xB2, 0xFC, 0x35, 0x7F, 0x1, 0xF2, 0xFC, 0x45, 0x7F, 0x1, 0x32, 0xFD, 0x55, 0x7F, 0x1, 0x72, 0xFD, 0x65, 0x7F, 0x1, 0xB2, 0xFD, 0x75, 0x7F, 0x1, 0xF2, 0xFD, 0x85, 0x7F, 0x1, 0x32, 0xFE, 0x95, 0x7F, 0x1, 0x72, 0xFE, 0xA5, 0x7F, 0x1, 0xB2, 0xFE, 0xB5, 0x7F, 0x1, 0xF2, 0xFE, 0xC5, 0x7F, 0x1, 0x32, 0xFF, 0x95, 0x7F, 0x1, 0x12, 0x0, 0xD0, 0x7F, 0x1, 0x72, 0xFF, 0xE5, 0x7F, 0x1, 0xB2, 0xFF, 0xF5, 0x7F, 0x1, 0xF2, 0xFF, 0x5, 0x80, 0x1, 0x33, 0x0, 0x16, 0x80, 0x1, 0x73, 0x0, 0x26, 0x80, 0x1, 0xB3, 0x0, 0x36, 0x80, 0x1, 0xF3, 0x0, 0x46, 0x80, 0x1, 0x33, 0x1, 0x56, 0x80, 0x1, 0x73, 0x1, 0x66, 0x80, 0x1, 0xB3, 0x1, 0x76, 0x80, 0x1, 0x13, 0x0, 0x78, 0x80, 0x1, 0x13, 0x0, 0x80, 0x80, 0x1, 0x33, 0x2, 0x96, 0x80, 0x1, 0x73, 0x2, 0xA6, 0x80, 0x1, 0xB3, 0x2, 0xB6, 0x80, 0x1, 0xF3, 0x2, 0xC6, 0x80, 0x1, 0x33, 0x3, 0xD6, 0x80, 0x1, 0x73, 0x3, 0x6, 0x0, 0x0, 0x93, 0x3, 0xEE, 0x80, 0x1, 0xD3, 0x3, 0xFE, 0x80, 0x1, 0x13, 0x4, 0xE, 0x81, 0x1, 0x53, 0x4, 0x1E, 0x81, 0x1, 0x93, 0x4, 0x2E, 0x81, 0x1, 0xD3, 0x4, 0x3E, 0x81, 0x1, 0x13, 0x5, 0x4E, 0x81, 0x1, 0x53, 0x5, 0x5E, 0x81, 0x1, 0x93, 0x5, 0x6E, 0x81, 0x1, 0xD3, 0x5, 0x7E, 0x81, 0x1, 0x13, 0x6, 0x8E, 0x81, 0x1, 0x53, 0x6, 0x9E, 0x81, 0x1, 0x93, 0x6, 0xAE, 0x81, 0x1, 0x13, 0x0, 0xB0, 0x81, 0x1, 0xF3, 0x6, 0xC6, 0x81, 0x1, 0x33, 0x7, 0xD6, 0x81, 0x1, 0x73, 0x7, 0xE6, 0x81, 0x1, 0xB3, 0x7, 0xF6, 0x81, 0x1, 0xF3, 0x7, 0x6, 0x82, 0x1, 0x33, 0x8, 0x16, 0x82, 0x1, 0x73, 0x8, 0x26, 0x82, 0x1, 0xB3, 0x8, 0x36, 0x82, 0x1, 0xF3, 0x8, 0x46, 0x82, 0x1, 0x33, 0x9, 0x56, 0x82, 0x1, 0x73, 0x9, 0x66, 0x82, 0x1, 0xB3, 0x9, 0x76, 0x82, 0x1, 0xF3, 0x9, 0x86, 0x82, 0x1, 0x33, 0xA, 0x96, 0x82, 0x1, 0x73, 0xA, 0xA6, 0x82, 0x1, 0xB3, 0xA, 0xB6, 0x82, 0x1, 0x13, 0x0, 0xB8, 0x82, 0x1, 0x13, 0xB, 0xCE, 0x82, 0x1, 0x53, 0xB, 0x6, 0x0, 0x0, 0x13, 0x0, 0xD8, 0x82, 0x1, 0x93, 0xB, 0xEE, 0x82, 0x1, 0xD3, 0xB, 0xFE, 0x82, 0x1, 0x13, 0xC, 0xE, 0x83, 0x1, 0x53, 0xC, 0x1E, 0x83, 0x1, 0x93, 0xC, 0x2E, 0x83, 0x1, 0xD3, 0xC, 0x3E, 0x83, 0x1, 0x73, 0xD, 0x66, 0x83, 0x1, 0x93, 0xE, 0xAE, 0x83, 0x1, 0xD3, 0xE, 0xBE, 0x83, 0x1, 0x13, 0xF, 0xCE, 0x83, 0x1, 0x53, 0xF, 0xDE, 0x83, 0x1, 0x93, 0xF, 0xEE, 0x83, 0x1, 0xD3, 0xF, 0xFE, 0x83, 0x1, 0x13, 0x10, 0xE, 0x84, 0x1, 0x53, 0x10, 0x1E, 0x84, 0x1, 0x93, 0x10, 0x2E, 0x84, 0x1, 0xD3, 0x10, 0x3E, 0x84, 0x1, 0x13, 0x11, 0x4E, 0x84, 0x1, 0x53, 0x11, 0x5E, 0x84, 0x1, 0x93, 0x11, 0x6E, 0x84, 0x1, 0xD3, 0x11, 0x7E, 0x84, 0x1, 0x13, 0x12, 0x8E, 0x84, 0x1, 0x53, 0x12, 0x9E, 0x84, 0x1, 0x93, 0x12, 0x6, 0x0, 0x0, 0xB3, 0x12, 0x6, 0x0, 0x0, 0xD3, 0x12, 0xBE, 0x84, 0x1, 0x13, 0x13, 0xCE, 0x84, 0x1, 0x53, 0x13, 0xDE, 0x84, 0x1, 0x13, 0x0, 0xE8, 0x84, 0x1, 0xD3, 0x13, 0xFE, 0x84, 0x1, 0x13, 0x14, 0xE, 0x85, 0x1, 0x53, 0x14, 0x1E, 0x85, 0x1, 0x93, 0x14, 0x2E, 0x85, 0x1, 0xD3, 0x14, 0x3E, 0x85, 0x1, 0x13, 0x15, 0x4E, 0x85, 0x1, 0x53, 0x15, 0x5E, 0x85, 0x1, 0x93, 0x15, 0x6E, 0x85, 0x1, 0xD3, 0x15, 0x7E, 0x85, 0x1, 0x13, 0x16, 0x8E, 0x85, 0x1, 0x53, 0x16, 0x9E, 0x85, 0x1, 0x93, 0x16, 0xAE, 0x85, 0x1, 0xD3, 0x16, 0xBE, 0x85, 0x1, 0x13, 0x17, 0xCE, 0x85, 0x1, 0x53, 0x17, 0xDE, 0x85, 0x1, 0x93, 0x17, 0xEE, 0x85, 0x1, 0xD3, 0x17, 0xFE, 0x85, 0x1, 0x13, 0x18, 0xE, 0x86, 0x1, 0x53, 0x18, 0x1E, 0x86, 0x1, 0x93, 0x18, 0x2E, 0x86, 0x1, 0xD3, 0x18, 0x3E, 0x86, 0x1, 0x13, 0x19, 0x4E, 0x86, 0x1, 0x53, 0x19, 0x5E, 0x86, 0x1, 0x93, 0x19, 0x4E, 0x86, 0x1, 0xB3, 0x19, 0x76, 0x86, 0x1, 0xF3, 0x19, 0x86, 0x86, 0x1, 0x33, 0x1A, 0x96, 0x86, 0x1, 0x73, 0x1A, 0xA6, 0x86, 0x1, 0xB3, 0x1A, 0xB6, 0x86, 0x1, 0xF3, 0x1A, 0xC6, 0x86, 0x1, 0x33, 0x1B, 0xD6, 0x86, 0x1, 0x73, 0x1B, 0xE6, 0x86, 0x1, 0xB3, 0x1B, 0xF6, 0x86, 0x1, 0xF3, 0x1B, 0x6, 0x87, 0x1, 0x33, 0x1C, 0x16, 0x87, 0x1, 0x73, 0x1C, 0x26, 0x87, 0x1, 0xB3, 0x1C, 0x36, 0x87, 0x1, 0xF3, 0x1C, 0x46, 0x87, 0x1, 0x33, 0x1D, 0x56, 0x87, 0x1, 0x73, 0x1D, 0x66, 0x87, 0x1, 0xB3, 0x1D, 0x76, 0x87, 0x1, 0xF3, 0x1D, 0x86, 0x87, 0x1, 0x33, 0x1E, 0x96, 0x87, 0x1, 0x73, 0x1E, 0xA6, 0x87, 0x1, 0xB3, 0x1E, 0xB6, 0x87, 0x1, 0xF3, 0x1E, 0xC6, 0x87, 0x1, 0x33, 0x1F, 0xD6, 0x87, 0x1, 0x73, 0x1F, 0xE6, 0x87, 0x1, 0xB3, 0x1F, 0xF6, 0x87, 0x1, 0xF3, 0x1F, 0x6, 0x88, 0x1, 0x33, 0x20, 0x16, 0x88, 0x1, 0x73, 0x20, 0x26, 0x88, 0x1, 0xB3, 0x20, 0x36, 0x88, 0x1, 0xF3, 0x20, 0x46, 0x88, 0x1, 0x33, 0x21, 0x36, 0x88, 0x1, 0x53, 0x21, 0x5E, 0x88, 0x1, 0x93, 0x21, 0x6E, 0x88, 0x1, 0xD4, 0x21, 0x7E, 0x88, 0x1, 0x14, 0x22, 0x8E, 0x88, 0x1, 0x54, 0x22, 0x9E, 0x88, 0x1, 0x94, 0x22, 0x6, 0x0, 0x0, 0xB4, 0x22, 0x6, 0x0, 0x0, 0xD4, 0x22, 0x6, 0x0, 0x0, 0x14, 0x0, 0xB8, 0x88, 0x1, 0x14, 0x23, 0xCE, 0x88, 0x1, 0x54, 0x23, 0xDE, 0x88, 0x1, 0x94, 0x23, 0xEE, 0x88, 0x1, 0xD4, 0x23, 0xFE, 0x88, 0x1, 0x14, 0x24, 0xE, 0x89, 0x1, 0x54, 0x24, 0x1E, 0x89, 0x1, 0x14, 0x0, 0x20, 0x89, 0x1, 0xB4, 0x24, 0x36, 0x89, 0x1, 0x14, 0x0, 0x38, 0x89, 0x1, 0x14, 0x25, 0x4E, 0x89, 0x1, 0x54, 0x25, 0x5E, 0x89, 0x1, 0x94, 0x25, 0x6E, 0x89, 0x1, 0xD4, 0x25, 0x7E, 0x89, 0x1, 0x14, 0x26, 0x8E, 0x89, 0x1, 0x54, 0x26, 0x9E, 0x89, 0x1, 0x94, 0x26, 0xAE, 0x89, 0x1, 0xD4, 0x26, 0xA6, 0x89, 0x1, 0xB4, 0x26, 0xB6, 0x89, 0x1, 0x14, 0x0, 0xB8, 0x89, 0x1, 0x14, 0x27, 0xCE, 0x89, 0x1, 0x54, 0x27, 0x6, 0x0, 0x0, 0x14, 0x0, 0xD8, 0x89, 0x1, 0x14, 0x0, 0xE8, 0x89, 0x1, 0xD4, 0x27, 0xFE, 0x89, 0x1, 0x14, 0x28, 0xE, 0x8A, 0x1, 0x54, 0x28, 0x1E, 0x8A, 0x1, 0x94, 0x28, 0x46, 0x83, 0x1, 0x34, 0xD, 0x56, 0x83, 0x1, 0xB4, 0x28, 0x6E, 0x83, 0x1, 0xD4, 0xD, 0x7E, 0x83, 0x1, 0x14, 0xE, 0x8E, 0x83, 0x1, 0x54, 0xE, 0x9E, 0x83, 0x1, 0xD4, 0x28, 0x3E, 0x8A, 0x1, 0x14, 0x29, 0x4E, 0x8A, 0x1, 0x54, 0x29, 0x5E, 0x8A, 0x1, 0x94, 0x29, 0x6E, 0x8A, 0x1, 0xD4, 0x29, 0x7E, 0x8A, 0x1, 0x14, 0x2A, 0x8E, 0x8A, 0x1, 0x54, 0x2A, 0x9E, 0x8A, 0x1, 0x94, 0x2A, 0xAE, 0x8A, 0x1, 0x14, 0x0, 0xB0, 0x8A, 0x1, 0xF4, 0x2A, 0x6, 0x0, 0x0, 0x14, 0x2B, 0xCE, 0x8A, 0x1, 0x54, 0x2B, 0x6, 0x0, 0x0, 0x94, 0x13, 0x86, 0x88, 0x1, 0x34, 0x22, 0x96, 0x88, 0x1, 0x74, 0x22, 0xA6, 0x88, 0x1, 0x54, 0x2B, 0x3E, 0x89, 0x1, 0x14, 0x0, 0xD8, 0x8A, 0x1, 0x94, 0x2B, 0xEE, 0x8A, 0x1, 0x74, 0x2B, 0xE6, 0x8A, 0x1, 0xB4, 0x2B, 0xF6, 0x8A, 0x1, 0xF4, 0x2B, 0x6, 0x8B, 0x1, 0x34, 0x2C, 0x16, 0x8B, 0x1, 0x74, 0x2C, 0x26, 0x8B, 0x1, 0xB4, 0x2C, 0x36, 0x8B, 0x1, 0xF4, 0x2C, 0x46, 0x8B, 0x1, 0x34, 0x2D, 0x56, 0x8B, 0x1, 0x74, 0x2D, 0x66, 0x8B, 0x1, 0xB4, 0x2D, 0x66, 0x8B, 0x1, 0xB4, 0x2D, 0x5E, 0x8B, 0x1, 0xD4, 0x2D, 0x7E, 0x8B, 0x1, 0x14, 0x2E, 0x8E, 0x8B, 0x1, 0x54, 0x2E, 0x9E, 0x8B, 0x1, 0x54, 0x2E, 0xA6, 0x8B, 0x1, 0xB4, 0x2E, 0x6, 0x0, 0x0, 0xD4, 0x2E, 0xBE, 0x8B, 0x1, 0x14, 0x2F, 0xCE, 0x8B, 0x1, 0x54, 0x2F, 0xDE, 0x8B, 0x1, 0x94, 0x2F, 0xEE, 0x8B, 0x1, 0xD4, 0x2F, 0xFE, 0x8B, 0x1, 0x14, 0x30, 0xE, 0x8C, 0x1, 0x54, 0x30, 0x1E, 0x8C, 0x1, 0x94, 0x30, 0x2E, 0x8C, 0x1, 0xD4, 0x30, 0x3E, 0x8C, 0x1, 0x14, 0x31, 0x4E, 0x8C, 0x1, 0x54, 0x31, 0x5E, 0x8C, 0x1, 0x94, 0x31, 0x6E, 0x8C, 0x1, 0xD4, 0x31, 0x7E, 0x8C, 0x1, 0x14, 0x32, 0x8E, 0x8C, 0x1, 0x54, 0x32, 0x8E, 0x8C, 0x1, 0x74, 0x32, 0xA6, 0x8C, 0x1, 0x15, 0x0, 0xA8, 0x8C, 0x1, 0xB5, 0x32, 0x6, 0x0, 0x0, 0xD5, 0x32, 0xBE, 0x8C, 0x1, 0x15, 0x33, 0xCE, 0x8C, 0x1, 0x55, 0x33, 0xDE, 0x8C, 0x1, 0x95, 0x33, 0xEE, 0x8C, 0x1, 0xD5, 0x33, 0xFE, 0x8C, 0x1, 0x15, 0x34, 0x6, 0x0, 0x0, 0x15, 0x0, 0x8, 0x8D, 0x1, 0x55, 0x34, 0x1E, 0x8D, 0x1, 0x95, 0x34, 0x2E, 0x8D, 0x1, 0xD5, 0x34, 0x3E, 0x8D, 0x1, 0x15, 0x35, 0x4E, 0x8D, 0x1, 0x55, 0x35, 0x5E, 0x8D, 0x1, 0x95, 0x35, 0x6E, 0x8D, 0x1, 0xD5, 0x35, 0x7E, 0x8D, 0x1, 0x15, 0x36, 0x6, 0x0, 0x0, 0x15, 0x0, 0x88, 0x8D, 0x1, 0x95, 0x27, 0x96, 0x8D, 0x1, 0x75, 0x36, 0x6, 0x0, 0x0, 0x95, 0x36, 0xAE, 0x8D, 0x1, 0xD5, 0x36, 0xBE, 0x8D, 0x1, 0x15, 0x37, 0xCE, 0x8D, 0x1, 0x55, 0x37, 0xDE, 0x8D, 0x1, 0x95, 0x37, 0xEE, 0x8D, 0x1, 0xD5, 0x37, 0xFE, 0x8D, 0x1, 0x15, 0x38, 0xE, 0x8E, 0x1, 0x55, 0x38, 0x1E, 0x8E, 0x1, 0x15, 0x0, 0x20, 0x8E, 0x1, 0xB5, 0x38, 0x6, 0x0, 0x0, 0xD5, 0x38, 0x3E, 0x8E, 0x1, 0x15, 0x39, 0x4E, 0x8E, 0x1, 0x55, 0x39, 0x6, 0x0, 0x0, 0xD5, 0x38, 0x5E, 0x8E, 0x1, 0xB5, 0x34, 0x6, 0x0, 0x0, 0x15, 0x0, 0x60, 0x8E, 0x1, 0xB5, 0x39, 0x76, 0x8E, 0x1, 0xF5, 0x39, 0x86, 0x8E, 0x1, 0x35, 0x3A, 0x96, 0x8E, 0x1, 0x75, 0x3A, 0xA6, 0x8E, 0x1, 0xB5, 0x3A, 0xB6, 0x8E, 0x1, 0xF5, 0x3A, 0xC6, 0x8E, 0x1, 0x35, 0x3B, 0xD6, 0x8E, 0x1, 0x75, 0x3B, 0xE6, 0x8E, 0x1, 0xB5, 0x3B, 0x6, 0x0, 0x0, 0x15, 0x0, 0xF0, 0x8E, 0x1, 0xF5, 0x3B, 0x6, 0x8F, 0x1, 0x35, 0x3C, 0x16, 0x8F, 0x1, 0x75, 0x3C, 0x26, 0x8F, 0x1, 0xB5, 0x3C, 0x36, 0x8F, 0x1, 0xF5, 0x3C, 0x46, 0x8F, 0x1, 0x35, 0x3D, 0x56, 0x8F, 0x1, 0x75, 0x3D, 0x66, 0x8F, 0x1, 0xD6, 0x3D, 0x7E, 0x8F, 0x1, 0x16, 0x0, 0x80, 0x8F, 0x1, 0x36, 0x3E, 0x6, 0x0, 0x0, 0x56, 0x3E, 0x9E, 0x8F, 0x1, 0x96, 0x3E, 0xAE, 0x8F, 0x1, 0x16, 0x0, 0xB0, 0x8F, 0x1, 0xF6, 0x3E, 0x6, 0x0, 0x0, 0x16, 0x0, 0xC0, 0x8F, 0x1, 0x36, 0x3F, 0xD6, 0x8F, 0x1, 0x76, 0x3F, 0xE6, 0x8F, 0x1, 0xB6, 0x3F, 0xF6, 0x8F, 0x1, 0x16, 0x0, 0xF8, 0x8F, 0x1, 0x16, 0x40, 0xE, 0x90, 0x1, 0x56, 0x40, 0x1E, 0x90, 0x1, 0x96, 0x40, 0x2E, 0x90, 0x1, 0xD6, 0x40, 0x3E, 0x90, 0x1, 0x16, 0x41, 0x4E, 0x90, 0x1, 0x16, 0x0, 0x50, 0x90, 0x1, 0x76, 0x41, 0x6, 0x0, 0x0, 0x16, 0x0, 0x60, 0x90, 0x1, 0xB6, 0x41, 0x76, 0x90, 0x1, 0xF6, 0x41, 0x86, 0x90, 0x1, 0x16, 0x0, 0x88, 0x90, 0x1, 0x56, 0x42, 0x9E, 0x90, 0x1, 0x96, 0x42, 0xAE, 0x90, 0x1, 0xD6, 0x42, 0xBE, 0x90, 0x1, 0x16, 0x43, 0xCE, 0x90, 0x1, 0x56, 0x43, 0x6, 0x0, 0x0, 0x16, 0x0, 0xD8, 0x90, 0x1, 0x96, 0x43, 0xEE, 0x90, 0x1, 0xD6, 0x43, 0xFE, 0x90, 0x1, 0x16, 0x44, 0xE, 0x91, 0x1, 0x56, 0x44, 0x6, 0x0, 0x0, 0xB6, 0x3D, 0x6, 0x0, 0x0, 0x17, 0x0, 0x18, 0x91, 0x1, 0x97, 0x44, 0x2E, 0x91, 0x1, 0xD7, 0x44, 0x3E, 0x91, 0x1, 0x17, 0x45, 0x4E, 0x91, 0x1, 0x17, 0x0, 0x50, 0x91, 0x1, 0x77, 0x45, 0x66, 0x91, 0x1, 0xB7, 0x45, 0x6, 0x0, 0x0, 0xD7, 0x45, 0x7E, 0x91, 0x1, 0x17, 0x46, 0x8E, 0x91, 0x1, 0x57, 0x46, 0x9E, 0x91, 0x1, 0x97, 0x46, 0xAE, 0x91, 0x1, 0xD7, 0x46, 0x6, 0x0, 0x0, 0xF7, 0x46, 0x6, 0x0, 0x0, 0x17, 0x47, 0x6, 0x0, 0x0, 0x37, 0x47, 0xD6, 0x91, 0x1, 0x77, 0x47, 0xE6, 0x91, 0x1, 0xB7, 0x47, 0xF6, 0x91, 0x1, 0xF7, 0x47, 0x6, 0x92, 0x1, 0x37, 0x48, 0x16, 0x92, 0x1, 0x77, 0x48, 0x26, 0x92, 0x1, 0xB8, 0x48, 0x6, 0x0, 0x0, 0xD8, 0x48, 0x6, 0x0, 0x0, 0xF8, 0x48, 0x46, 0x92, 0x1, 0x38, 0x49, 0x56, 0x92, 0x1, 0x18, 0x0, 0x58, 0x92, 0x1, 0x98, 0x49, 0x6, 0x0, 0x0, 0xB8, 0x49, 0x76, 0x92, 0x1, 0xF8, 0x49, 0x86, 0x92, 0x1, 0x38, 0x4A, 0x6, 0x0, 0x0, 0x18, 0x0, 0x90, 0x92, 0x1, 0x78, 0x4A, 0xA6, 0x92, 0x1, 0xB8, 0x4A, 0xB6, 0x92, 0x1, 0xF8, 0x4A, 0xC6, 0x92, 0x1, 0x39, 0x4B, 0x6, 0x0, 0x0, 0x59, 0x4B, 0x6, 0x0, 0x0, 0x79, 0x4B, 0x6, 0x0, 0x0, 0x19, 0x0, 0xE0, 0x92, 0x1, 0x19, 0x0, 0xE8, 0x92, 0x1, 0x19, 0x0, 0xF0, 0x92, 0x1, 0xF9, 0x4B, 0x6, 0x93, 0x1, 0x39, 0x4C, 0x16, 0x93, 0x1, 0x19, 0x0, 0x18, 0x93, 0x1, 0x99, 0x4C, 0x2E, 0x93, 0x1, 0xDA, 0x4C, 0x6, 0x0, 0x0, 0x1A, 0x0, 0x38, 0x93, 0x1, 0x1A, 0x4D, 0x6, 0x0, 0x0, 0x3A, 0x4D, 0x6, 0x0, 0x0, 0x5A, 0x4D, 0x5E, 0x93, 0x1, 0x9A, 0x4D, 0x6, 0x0, 0x0, 0x1A, 0x0, 0x68, 0x93, 0x1, 0xDA, 0x4D, 0x7E, 0x93, 0x1, 0x1B, 0x4E, 0x6, 0x0, 0x0, 0x3B, 0x4E, 0x96, 0x93, 0x1, 0x7B, 0x4E, 0xA6, 0x93, 0x1, 0xBB, 0x4E, 0xB6, 0x93, 0x1, 0x1B, 0x0, 0xB8, 0x93, 0x1, 0x1C, 0x4F, 0x6, 0x0, 0x0, 0x1C, 0x0, 0xC8, 0x93, 0x1, 0x1C, 0x0, 0xD0, 0x93, 0x1, 0x7C, 0x4F, 0xE6, 0x93, 0x1, 0xBD, 0x4F, 0x6, 0x0, 0x0, 0xDD, 0x4F, 0x6, 0x0, 0x0, 0xFD, 0x4F, 0x6, 0x94, 0x1, 0x3E, 0x50, 0x16, 0x94, 0x1, 0x1E, 0x0, 0x18, 0x94, 0x1, 0x9F, 0x50, 0x2E, 0x94, 0x1, }; - } -} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelationGenerator.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelationGenerator.cs deleted file mode 100644 index d6d56521ece18..0000000000000 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseRelationGenerator.cs +++ /dev/null @@ -1,98 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; - -namespace System.Text.RegularExpressions.Symbolic.Unicode -{ -#if DEBUG - [ExcludeFromCodeCoverage] - internal static class IgnoreCaseRelationGenerator - { - private const string DefaultCultureName = "en-US"; - - public static void Generate(string namespacename, string classname, string path) - { - Debug.Assert(namespacename != null); - Debug.Assert(classname != null); - Debug.Assert(path != null); - - using StreamWriter sw = new StreamWriter($"{Path.Combine(path, classname)}.cs"); - sw.WriteLine( -$@"// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -// This is a programmatically generated file from Regex.GenerateUnicodeTables. -// It provides serialized BDD Unicode category definitions for System.Environment.Version = {Environment.Version} - -namespace {namespacename} -{{ - internal static class {classname} - {{"); - WriteIgnoreCaseBDD(sw); - sw.WriteLine($@" }} -}}"); - } - - private static void WriteIgnoreCaseBDD(StreamWriter sw) - { - sw.WriteLine(" /// Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture."); - - CharSetSolver solver = CharSetSolver.Instance; - List ignoreCaseEquivalenceClasses = ComputeIgnoreCaseEquivalenceClasses(solver, new CultureInfo(DefaultCultureName)); - BDD ignorecase = solver.False; - foreach (EquivalenceClass ec in ignoreCaseEquivalenceClasses) - { - // Create the Cartesian product of ec._set with itself - BDD crossproduct = solver.And(solver.ShiftLeft(ec._set, 16), ec._set); - // Add the product into the overall lookup table - ignorecase = solver.Or(ignorecase, crossproduct); - } - - sw.Write(" public static readonly byte[] IgnoreCaseEnUsSerializedBDD = "); - GeneratorHelper.WriteByteArrayInitSyntax(sw, ignorecase.SerializeToBytes()); - sw.WriteLine(";"); - } - - private static List ComputeIgnoreCaseEquivalenceClasses(CharSetSolver solver, CultureInfo culture) - { - var ignoreCase = new Dictionary(); - var sets = new List(); - - for (uint i = 65; i <= 0xFFFF; i++) - { - char C = (char)i; - char c = char.ToLower(C, culture); - - if (c == C) - { - continue; - } - - EquivalenceClass? ec; - if (!ignoreCase.TryGetValue(c, out ec)) - { - ec = new EquivalenceClass(solver.CharConstraint(c)); - ignoreCase[c] = ec; - sets.Add(ec); - } - ec._set = solver.Or(ec._set, solver.CharConstraint(C)); - } - return sets; - } - - private sealed class EquivalenceClass - { - public BDD _set; - public EquivalenceClass(BDD set) - { - _set = set; - } - } - }; -#endif -} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseTransformer.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseTransformer.cs deleted file mode 100644 index 945fdeae5cffa..0000000000000 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/IgnoreCaseTransformer.cs +++ /dev/null @@ -1,237 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Threading; - -namespace System.Text.RegularExpressions.Symbolic.Unicode -{ - internal sealed class IgnoreCaseTransformer - { - private const char Turkish_I_WithDot = '\u0130'; - private const char Turkish_i_WithoutDot = '\u0131'; - private const char KelvinSign = '\u212A'; - - private readonly CharSetSolver _solver; - private readonly BDD _i_Invariant; - private readonly BDD _i_Default; - private readonly BDD _i_Turkish; - private readonly BDD _I_Turkish; - - private volatile IgnoreCaseRelation? _relationDefault; - private volatile IgnoreCaseRelation? _relationInvariant; - private volatile IgnoreCaseRelation? _relationTurkish; - - /// Maps each char c to the case-insensitive set of c that is culture-independent (for non-null entries). - private readonly BDD?[] _cultureIndependentChars = new BDD[char.MaxValue + 1]; - - private sealed class IgnoreCaseRelation - { - public IgnoreCaseRelation(BDD instance, BDD instanceDomain) - { - Instance = instance; - InstanceDomain = instanceDomain; - } - - public BDD Instance { get; } - public BDD InstanceDomain { get; } - } - - public IgnoreCaseTransformer(CharSetSolver solver) - { - _solver = solver; - _i_Invariant = solver.Or(_solver.CharConstraint('i'), solver.CharConstraint('I')); - _i_Default = solver.Or(_i_Invariant, solver.CharConstraint(Turkish_I_WithDot)); - _i_Turkish = solver.Or(solver.CharConstraint('i'), solver.CharConstraint(Turkish_I_WithDot)); - _I_Turkish = solver.Or(solver.CharConstraint('I'), solver.CharConstraint(Turkish_i_WithoutDot)); - } - - /// - /// Get the set of CI-equivalent characters to c. - /// This operation depends on culture for i, I, '\u0130', and '\u0131'; - /// culture="" means InvariantCulture while culture=null means to use the current culture. - /// - public BDD Apply(char c, string? culture = null) - { - if (Volatile.Read(ref _cultureIndependentChars[c]) is BDD bdd) - { - return bdd; - } - - culture ??= CultureInfo.CurrentCulture.Name; - switch (c) - { - // Do not cache in _cultureIndependentChars values that are culture-dependent - - case 'i': - return - culture == string.Empty ? _i_Invariant : - IsTurkishAlphabet(culture) ? _i_Turkish : - _i_Default; // for all other cultures, case-sensitivity is the same as for en-US - - case 'I': - return - culture == string.Empty ? _i_Invariant : - IsTurkishAlphabet(culture) ? _I_Turkish : // different from 'i' above - _i_Default; - - case Turkish_I_WithDot: - return - culture == string.Empty ? _solver.CharConstraint(Turkish_I_WithDot) : - IsTurkishAlphabet(culture) ? _i_Turkish : - _i_Default; - - case Turkish_i_WithoutDot: - return - IsTurkishAlphabet(culture) ? _I_Turkish : - _solver.CharConstraint(Turkish_i_WithoutDot); - - case 'k': - case 'K': - case KelvinSign: - Volatile.Write(ref _cultureIndependentChars[c], _solver.Or(_solver.Or(_solver.CharConstraint('k'), _solver.CharConstraint('K')), _solver.CharConstraint(KelvinSign))); - return _cultureIndependentChars[c]!; - - // Cache in _cultureIndependentChars entries that are culture-independent. - // BDDs are idempotent, so while we use volatile to ensure proper adherence - // to ECMA's memory model, we don't need Interlocked.CompareExchange. - - case <= '\x7F': - // For ASCII range other than letters i, I, k, and K, the case-conversion is independent of culture and does - // not include case-insensitive-equivalent non-ASCII. - Volatile.Write(ref _cultureIndependentChars[c], _solver.Or(_solver.CharConstraint(char.ToLower(c)), _solver.CharConstraint(char.ToUpper(c)))); - return _cultureIndependentChars[c]!; - - default: - // Bring in the full transfomation relation, but here it does not actually depend on culture - // so it is safe to store the result for c. - Volatile.Write(ref _cultureIndependentChars[c], Apply(_solver.CharConstraint(c))); - return _cultureIndependentChars[c]!; - } - } - - /// - /// For all letters in the bdd add their lower and upper case equivalents. - /// This operation depends on culture for i, I, '\u0130', and '\u0131'; - /// culture="" means InvariantCulture while culture=null means to use the current culture. - /// - public BDD Apply(BDD bdd, string? culture = null) - { - // First get the culture specific relation - IgnoreCaseRelation relation = GetIgnoreCaseRelation(culture); - - if (_solver.And(relation.InstanceDomain, bdd).IsEmpty) - { - // No elements need to be added - return bdd; - } - - // Compute the set of all characters that are equivalent to some element in bdd. - // restr is the relation restricted to the relevant characters in bdd. - // This conjunction works because bdd is unspecified for bits > 15. - BDD restr = _solver.And(bdd, relation.Instance); - - // ShiftRight essentially produces the LHS of the relation (char X char) that restr represents. - BDD ignorecase = _solver.ShiftRight(restr, 16); - - // The final set is the union of all the characters. - return _solver.Or(ignorecase, bdd); - } - - /// Gets the transformation relation based on the current culture. - /// culture == "" means InvariantCulture. culture == null means to use the current culture. - private IgnoreCaseRelation GetIgnoreCaseRelation(string? culture = null) - { - culture ??= CultureInfo.CurrentCulture.Name; - - if (culture == string.Empty) - { - return _relationInvariant ?? CreateIgnoreCaseRelationInvariant(); - } - - if (IsTurkishAlphabet(culture)) - { - return _relationTurkish ?? CreateIgnoreCaseRelationTurkish(); - } - - // All other cultures are equivalent to the default culture wrt case-sensitivity. - return _relationDefault ?? EnsureDefault(); - } - - [MemberNotNull(nameof(_relationDefault))] - private IgnoreCaseRelation EnsureDefault() - { - // Deserialize the table for the default culture. - if (_relationDefault is null) - { - BDD instance = BDD.Deserialize(Unicode.IgnoreCaseRelation.IgnoreCaseEnUsSerializedBDD, _solver); - BDD instanceDomain = _solver.ShiftRight(instance, 16); // represents the set of all case-sensitive characters in the default culture. - _relationDefault = new IgnoreCaseRelation(instance, instanceDomain); - } - - return _relationDefault; - } - - private IgnoreCaseRelation CreateIgnoreCaseRelationInvariant() - { - EnsureDefault(); - - // Compute the invariant table based off of default. - // In the default (en-US) culture: Turkish_I_withDot = i = I - // In the invariant culture: i = I, while Turkish_I_withDot is case-insensitive - BDD tr_I_withdot_BDD = _solver.CharConstraint(Turkish_I_WithDot); - - // Since Turkish_I_withDot is case-insensitive in invariant culture, remove it from the default (en-US culture) table. - BDD inv_table = _solver.And(_relationDefault.Instance, _solver.Not(tr_I_withdot_BDD)); - - // Next, remove Turkish_I_withDot from the RHS of the relation. - // This also effectively removes Turkish_I_withDot from the equivalence sets of 'i' and 'I'. - BDD instance = _solver.And(inv_table, _solver.Not(_solver.ShiftLeft(tr_I_withdot_BDD, 16))); - - // Remove Turkish_I_withDot from the domain of casesensitive characters in the default case - BDD instanceDomain = _solver.And(instance, _solver.Not(tr_I_withdot_BDD)); - - _relationInvariant = new IgnoreCaseRelation(instance, instanceDomain); - return _relationInvariant; - } - - private IgnoreCaseRelation CreateIgnoreCaseRelationTurkish() - { - EnsureDefault(); - - // Compute the tr table based off of default. - // In the default (en-US) culture: Turkish_I_withDot = i = I - // In the tr culture: i = Turkish_I_withDot, I = Turkish_i_withoutDot - BDD tr_I_withdot_BDD = _solver.CharConstraint(Turkish_I_WithDot); - BDD tr_i_withoutdot_BDD = _solver.CharConstraint(Turkish_i_WithoutDot); - BDD i_BDD = _solver.CharConstraint('i'); - BDD I_BDD = _solver.CharConstraint('I'); - - // First remove all i's from the default table from the LHS and from the RHS. - // Note that Turkish_i_withoutDot is not in the default table because it is case-insensitive in the en-US culture. - BDD iDefault = _solver.Or(i_BDD, _solver.Or(I_BDD, tr_I_withdot_BDD)); - BDD tr_table = _solver.And(_relationDefault.Instance, _solver.Not(iDefault)); - tr_table = _solver.And(tr_table, _solver.Not(_solver.ShiftLeft(iDefault, 16))); - - BDD i_tr = _solver.Or(i_BDD, tr_I_withdot_BDD); - BDD I_tr = _solver.Or(I_BDD, tr_i_withoutdot_BDD); - - // The Cartesian product i_tr X i_tr. - BDD i_trXi_tr = _solver.And(_solver.ShiftLeft(i_tr, 16), i_tr); - - // The Cartesian product I_tr X I_tr. - BDD I_trXI_tr = _solver.And(_solver.ShiftLeft(I_tr, 16), I_tr); - - // Update the table with the new entries, and add Turkish_i_withoutDot also into the domain of case-sensitive characters. - BDD instance = _solver.Or(tr_table, _solver.Or(i_trXi_tr, I_trXI_tr)); - BDD instanceDomain = _solver.Or(_relationDefault.InstanceDomain, tr_i_withoutdot_BDD); - - _relationTurkish = new IgnoreCaseRelation(instance, instanceDomain); - return _relationTurkish; - } - - private static bool IsTurkishAlphabet(string culture) => - culture is "az" or "az-Cyrl" or "az-Cyrl-AZ" or "az-Latn" or "az-Latn-AZ" or "tr" or "tr-CY" or "tr-TR"; - } -} diff --git a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/UnicodeCategoryRangesGenerator.cs b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/UnicodeCategoryRangesGenerator.cs index e518212451ea7..366562f3ca1a6 100644 --- a/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/UnicodeCategoryRangesGenerator.cs +++ b/src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Symbolic/Unicode/UnicodeCategoryRangesGenerator.cs @@ -76,7 +76,7 @@ private static void WriteSerializedBDDs(StreamWriter sw) { sw.WriteLine(" // {0}({1}):", (UnicodeCategory)i, i); sw.Write(" "); - GeneratorHelper.WriteByteArrayInitSyntax(sw, catBDDs[i].SerializeToBytes()); + WriteByteArrayInitSyntax(sw, catBDDs[i].SerializeToBytes()); sw.WriteLine(","); } sw.WriteLine(" };"); @@ -84,9 +84,29 @@ private static void WriteSerializedBDDs(StreamWriter sw) sw.WriteLine(" /// Serialized BDD representation of the set of all whitespace characters."); sw.Write($" public static readonly byte[] WhitespaceSerializedBDD = "); - GeneratorHelper.WriteByteArrayInitSyntax(sw, whitespaceBdd.SerializeToBytes()); + WriteByteArrayInitSyntax(sw, whitespaceBdd.SerializeToBytes()); sw.WriteLine(";"); } + + public static void WriteInt64ArrayInitSyntax(StreamWriter sw, long[] values) + { + sw.Write("new long[] {"); + for (int i = 0; i < values.Length; i++) + { + sw.Write($" 0x{values[i]:X}, "); + } + sw.Write("}"); + } + + public static void WriteByteArrayInitSyntax(StreamWriter sw, byte[] values) + { + sw.Write("new byte[] {"); + for (int i = 0; i < values.Length; i++) + { + sw.Write($" 0x{values[i]:X}, "); + } + sw.Write("}"); + } } /// Used internally for creating a collection of ranges for serialization. diff --git a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexCultureTests.cs b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexCultureTests.cs index effbebde0ca15..ded3d230d7643 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexCultureTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexCultureTests.cs @@ -117,12 +117,17 @@ public void TurkishI_Is_Differently_LowerUpperCased_In_Turkish_Culture(int lengt // same input and regex does match so far so good Assert.All(cultInvariantRegex, rex => Assert.True(rex.IsMatch(input))); - - // [ActiveIssue("https://github.com/dotnet/runtime/issues/58958")] - // when the Regex was created with a turkish locale the lower cased turkish version will - // no longer match the input string which contains upper and lower case iiiis hence even the input string - // will no longer match - Assert.All(turkishRegex, rex => Assert.False(rex.IsMatch(input))); + if (PlatformDetection.IsNetFramework) + { + // If running in .NET Framework, when the Regex was created with a turkish locale the lower cased turkish version will + // no longer match the input string which contains upper and lower case iiiis hence even the input string + // will no longer match. For more info, check https://github.com/dotnet/runtime/issues/58958 + Assert.All(turkishRegex, rex => Assert.False(rex.IsMatch(input))); + } + else + { + Assert.All(turkishRegex, rex => Assert.True(rex.IsMatch(input))); + } // Now comes the tricky part depending on the use locale in ToUpper the results differ // Hence the regular expression will not match if different locales were used @@ -208,10 +213,6 @@ public static IEnumerable TurkishCulture_MatchesWordChar_MemberData() { yield return new object[] { engine, "I\u0131\u0130i", RegexOptions.None, "I\u0131\u0130i" }; yield return new object[] { engine, "I\u0131\u0130i", RegexOptions.IgnoreCase, "I\u0131\u0130i" }; - if (!RegexHelpers.IsNonBacktracking(engine)) - { - yield return new object[] { engine, "I\u0131\u0130i", RegexOptions.IgnoreCase | RegexOptions.ECMAScript, "" }; - } } } @@ -347,7 +348,6 @@ public void Match_InvariantCulture_None_vs_Compiled() private const char Turkish_I_withDot = '\u0130'; private const char Turkish_i_withoutDot = '\u0131'; - private const char Kelvin_sign = '\u212A'; /// /// This test is to make sure that the generated IgnoreCaseRelation table for NonBacktracking does not need to be updated. diff --git a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexIgnoreCaseTests.cs b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexIgnoreCaseTests.cs new file mode 100644 index 0000000000000..d1b676af5a60d --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexIgnoreCaseTests.cs @@ -0,0 +1,224 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Tests; +using System.Threading.Tasks; +using Xunit; + +namespace System.Text.RegularExpressions.Tests +{ + public class RegexIgnoreCaseTests + { + public static bool IsIcuGlobalization = PlatformDetection.IsIcuGlobalization; + + public static IEnumerable<(string, string)> CharactersWithSameLowercase() + { + return new (string, string)[] + { + new("\u0130", "\u0049"), // Both lowercase to \u0069 + new("\u01C5", "\u01C4"), // Both lowercase to \u01C6 + new("\u01C8", "\u01C7"), // Both lowercase to \u01C9 + new("\u01CB", "\u01CA"), // Both lowercase to \u01CC + new("\u01F2", "\u01F1"), // Both lowercase to \u01F3 + new("\u03F4", "\u0398"), // Both lowercase to \u03B8 + new("\u2126", "\u03A9"), // Both lowercase to \u03C9 + new("\u212A", "\u004B"), // Both lowercase to \u006B + new("\u212B", "\u00C5"), // Both lowercase to \u00E5 + }; + } + + public static IEnumerable Characters_With_Common_Lowercase_Match_Data() + { + foreach (string culture in new[] { "", "en-us", "tr-TR" }) + { + if (PlatformDetection.IsBrowser && culture != "") // Browser runs in Invariant mode, so only test Invariant in that case. + continue; + + foreach ((string pattern, string input) in CharactersWithSameLowercase()) + { + if (culture != "en-us" && pattern == "\u0130" && input == "\u0049") // This mapping doesn't exist in invariant or turkish cultures. + continue; + + foreach (RegexEngine engine in RegexHelpers.AvailableEngines) + { + yield return new object[] { engine, pattern, input, culture }; + } + } + } + } + + public static IEnumerable Characters_With_Common_Lowercase_Match_Backreference_Data() + { + foreach (string culture in new[] { "", "en-us", "tr-TR" }) + { + // Browser runs in Invariant mode, so only test Invariant in that case. + if (PlatformDetection.IsBrowser && culture != "") + continue; + + // NLS globalization uses different mappings for invariant culture for some characters so we skip that for now. + // https://github.com/dotnet/runtime/issues/67624 + if (PlatformDetection.IsNlsGlobalization && culture == "") + continue; + + foreach ((string firstChar, string secondChar) in CharactersWithSameLowercase()) + { + if (culture != "en-us" && firstChar == "\u0130" && secondChar == "\u0049") // This mapping doesn't exist in invariant or turkish cultures. + continue; + + foreach (RegexEngine engine in RegexHelpers.AvailableEngines) + { + if (engine == RegexEngine.NonBacktracking) // Backreferences are not yet supported by the NonBacktracking engine + continue; + + yield return new object[] { engine, @"(.)\1", firstChar, secondChar, culture }; + } + } + } + } + + [Theory] + [MemberData(nameof(Characters_With_Common_Lowercase_Match_Data))] + public async Task Characters_With_Common_Lowercase_Match(RegexEngine engine, string pattern, string input, string culture) + { + using var _ = new ThreadCultureChange(culture); + Regex regex = await RegexHelpers.GetRegexAsync(engine, pattern, RegexOptions.IgnoreCase); + Assert.True(regex.IsMatch(input)); + } + + public static IEnumerable EnginesThatSupportBackreferences() + { + foreach(RegexEngine engine in RegexHelpers.AvailableEngines) + { + if (engine == RegexEngine.NonBacktracking) // Nonbacktracking engine doesn't yet support backreferences. + continue; + yield return new object[] { engine }; + } + } + + [Theory] + [MemberData(nameof(EnginesThatSupportBackreferences))] + public async Task IgnoreCase_Behavior_Is_Constant(RegexEngine engine) + { + Regex regex; + using (new ThreadCultureChange("en-US")) + { + regex = await RegexHelpers.GetRegexAsync(engine, @"(i)\1", RegexOptions.IgnoreCase); + } + + using (new ThreadCultureChange("tr-TR")) + { + // tr-TR culture doesn't consider 'I' and 'i' to be equal in ignore case, but en-US culture does. + // This test will validate that the backreference will use en-US culture even when current culture is + // set to tr-TR + Assert.True(regex.IsMatch("Ii")); + } + } + + [Theory] + [MemberData(nameof(Characters_With_Common_Lowercase_Match_Backreference_Data))] + public async Task Characters_With_Common_Lowercase_Match_Backreference(RegexEngine engine, string pattern, string firstChar, string secondChar, string culture) + { + using var _ = new ThreadCultureChange(culture); + Regex regex = await RegexHelpers.GetRegexAsync(engine, pattern, RegexOptions.IgnoreCase); + Assert.True(regex.IsMatch($"{firstChar}{secondChar}")); + Assert.True(regex.IsMatch($"{secondChar}{firstChar}")); + } + + [Theory] + [MemberData(nameof(EnginesThatSupportBackreferences))] + public async Task Ensure_CultureInvariant_Option_Is_Used_For_Backreferences(RegexEngine engine) + { + using var _ = new ThreadCultureChange("tr-TR"); + Regex regex = await RegexHelpers.GetRegexAsync(engine, @"(.)\1", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); + // There is no mapping between 'i' and 'I' in tr-TR culture, so this test is validating that when passing CultureInvariant + // option, we will use InvariantCulture mappings for backreferences. + Assert.True(regex.IsMatch("iI")); + } + + [Fact] + // This test creates a source generated engine for each of the ~870 cultures and ensures the result compiles. This test alone takes around 30 + // seconds on a fast machine, so marking as OuterLoop. + [OuterLoop] + public async Task SourceGenerator_Supports_All_Cultures() + { + foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.AllCultures)) + { + using (new ThreadCultureChange(culture)) + { + // This test will try to emit code that looks like: textInfo = CultureInfo.GetCultureInfo(CurrentCulture.Name).TextInfo + // so we will validate in this test that we are able to do that for all cultures and that GetCultureInfo returns a valid Culture. + Regex r = await RegexHelpers.GetRegexAsync(RegexEngine.SourceGenerated, @"(.)\1", RegexOptions.IgnoreCase); + Assert.True(r.IsMatch("Aa")); + } + } + } + + // This test takes a long time to run since it needs to compute all possible lowercase mappings across + // 3 different cultures and then creates Regex matches for all of our engines for each mapping. + [OuterLoop] + // Disabling test in NLS-globalization systems due to https://github.com/dotnet/runtime/issues/67624 + [ConditionalTheory(nameof(IsIcuGlobalization))] + [MemberData(nameof(Unicode_IgnoreCase_TestData))] + public async Task Unicode_IgnoreCase_Tests(RegexEngine engine, string culture, RegexOptions options) + { + IEnumerable<(string, string)> testCases = GetPatternAndInputsForCulture(culture); + + foreach ((string c, string lowerC) in testCases) + { + using (ThreadCultureChange cultureChange = (options & RegexOptions.CultureInvariant) == 0 ? + new ThreadCultureChange(culture) : null) + { + // We validate that there is no case where c.ToLower() == lowerC and c.ToLower() != lowerC.ToLower() + // given this would create inconsistencies with the way we handle case-insensitive backreference comparisons. + Assert.Equal(CultureInfo.GetCultureInfo(culture).TextInfo.ToLower(lowerC), lowerC); + await ValidateMatch(c, lowerC); + await ValidateMatch(lowerC, c); + } + } + + return; + + async Task ValidateMatch(string pattern, string input) + { + Regex regex = await RegexHelpers.GetRegexAsync(engine, pattern, options | RegexOptions.IgnoreCase); + Assert.True(regex.IsMatch(input)); + } + + static IEnumerable<(string, string)> GetPatternAndInputsForCulture(string culture) + { + TextInfo textInfo = string.IsNullOrEmpty(culture) ? CultureInfo.InvariantCulture.TextInfo + : CultureInfo.GetCultureInfo(culture).TextInfo; + + for (int i = 0; i <= char.MaxValue; i++) + { + char c = (char)i; + char lowerC = textInfo.ToLower(c); + if (c != lowerC) + { + yield return ($"{c}", $"{lowerC}"); + } + } + } + } + + public static IEnumerable Unicode_IgnoreCase_TestData() + { + foreach (string culture in new[] { "", "EN-US", "tr-TR", "AZ" }) + { + foreach (RegexEngine engine in RegexHelpers.AvailableEngines) + { + yield return new object[] { engine, culture, RegexOptions.None}; + if (string.IsNullOrEmpty(culture)) + { + // For the Invariant culture equivalences also test to get the same behavior with RegexOptions.CultureInvariant. + yield return new object[] { engine, culture, RegexOptions.CultureInvariant }; + } + } + } + } + } +} diff --git a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/System.Text.RegularExpressions.Tests.csproj b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/System.Text.RegularExpressions.Tests.csproj index 4162d7b75fd26..4be0e31a2c509 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/System.Text.RegularExpressions.Tests.csproj +++ b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/System.Text.RegularExpressions.Tests.csproj @@ -47,6 +47,7 @@ + diff --git a/src/libraries/System.Text.RegularExpressions/tests/UnitTests/RegexFindOptimizationsTests.cs b/src/libraries/System.Text.RegularExpressions/tests/UnitTests/RegexFindOptimizationsTests.cs index eb4a4ffa74d96..15e83bc2c3d87 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/UnitTests/RegexFindOptimizationsTests.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/UnitTests/RegexFindOptimizationsTests.cs @@ -58,8 +58,8 @@ public void LeadingAnchor_LeftToRight(string pattern, RegexOptions options, int [InlineData(@"abc\z", RegexOptions.None, (int)FindNextStartingPositionMode.TrailingAnchor_FixedLength_LeftToRight_End, 3, (int)RegexNodeKind.End)] [InlineData(@"abc\Z", RegexOptions.None, (int)FindNextStartingPositionMode.TrailingAnchor_FixedLength_LeftToRight_EndZ, 3, (int)RegexNodeKind.EndZ)] [InlineData(@"abc$", RegexOptions.None, (int)FindNextStartingPositionMode.TrailingAnchor_FixedLength_LeftToRight_EndZ, 3, (int)RegexNodeKind.EndZ)] - [InlineData(@"a{4,10}$", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, 10, (int)RegexNodeKind.EndZ)] - [InlineData(@"(abc|defg){1,2}\z", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, 8, (int)RegexNodeKind.End)] + [InlineData(@"a{4,10}$", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, 10, (int)RegexNodeKind.EndZ)] + [InlineData(@"(abc|defg){1,2}\z", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, 8, (int)RegexNodeKind.End)] public void TrailingAnchor(string pattern, RegexOptions options, int expectedMode, int expectedLength, int trailingAnchor) { RegexFindOptimizations opts = ComputeOptimizations(pattern, options); @@ -69,44 +69,44 @@ public void TrailingAnchor(string pattern, RegexOptions options, int expectedMod } [Theory] - [InlineData(@"ab", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")] - [InlineData(@"ab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")] - [InlineData(@"(a)(bc)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "abc")] - [InlineData(@"(a)(bc)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "bc")] - [InlineData(@"a{10}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "aaaaaaaaaa")] - [InlineData(@"a{10}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "aaaaaaaaaa")] - [InlineData(@"(?>a{10,20})", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "aaaaaaaaaa")] - [InlineData(@"(?>a{10,20})", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "aaaaaaaaaa")] - [InlineData(@"a{3,5}?", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "aaa")] - [InlineData(@"a{3,5}?", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "aaa")] - [InlineData(@"ab{5}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "abbbbb")] - [InlineData(@"ab{5}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "abbbbb")] - [InlineData(@"ab\w", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")] - [InlineData(@"\wab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")] - [InlineData(@"(ab){3}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ababab")] - [InlineData(@"(ab){3}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")] - [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "abab")] - [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "de")] - [InlineData(@"ab|(abc)|(abcd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")] - [InlineData(@"ab|(abc)|(abcd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")] - [InlineData(@"ab(?=cd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight_CaseSensitive, "ab")] - [InlineData(@"ab(?=cd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft_CaseSensitive, "ab")] + [InlineData(@"ab", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")] + [InlineData(@"ab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")] + [InlineData(@"(a)(bc)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "abc")] + [InlineData(@"(a)(bc)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "bc")] + [InlineData(@"a{10}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "aaaaaaaaaa")] + [InlineData(@"a{10}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "aaaaaaaaaa")] + [InlineData(@"(?>a{10,20})", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "aaaaaaaaaa")] + [InlineData(@"(?>a{10,20})", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "aaaaaaaaaa")] + [InlineData(@"a{3,5}?", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "aaa")] + [InlineData(@"a{3,5}?", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "aaa")] + [InlineData(@"ab{5}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "abbbbb")] + [InlineData(@"ab{5}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "abbbbb")] + [InlineData(@"ab\w", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")] + [InlineData(@"\wab", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")] + [InlineData(@"(ab){3}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ababab")] + [InlineData(@"(ab){3}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")] + [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "abab")] + [InlineData(@"(ab){2,4}(de){4,}", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "de")] + [InlineData(@"ab|(abc)|(abcd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")] + [InlineData(@"ab|(abc)|(abcd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")] + [InlineData(@"ab(?=cd)", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingPrefix_LeftToRight, "ab")] + [InlineData(@"ab(?=cd)", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingPrefix_RightToLeft, "ab")] public void LeadingPrefix(string pattern, RegexOptions options, int expectedMode, string expectedPrefix) { RegexFindOptimizations opts = ComputeOptimizations(pattern, options); Assert.Equal((FindNextStartingPositionMode)expectedMode, opts.FindMode); - Assert.Equal(expectedPrefix, opts.LeadingCaseSensitivePrefix); + Assert.Equal(expectedPrefix, opts.LeadingPrefix); } [Theory] - [InlineData(@"[ab]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "ab")] - [InlineData(@"[Aa]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "Aa")] - [InlineData(@"a", RegexOptions.IgnoreCase, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "Aa")] - [InlineData(@"ab|cd|ef|gh", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight_CaseSensitive, "aceg")] - [InlineData(@"[ab]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "ab")] - [InlineData(@"[Aa]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "Aa")] - [InlineData(@"a", RegexOptions.IgnoreCase | RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "Aa")] - [InlineData(@"ab|cd|ef|gh", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft_CaseSensitive, "bdfh")] + [InlineData(@"[ab]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "ab")] + [InlineData(@"[Aa]", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "Aa")] + [InlineData(@"a", RegexOptions.IgnoreCase, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "Aa")] + [InlineData(@"ab|cd|ef|gh", RegexOptions.None, (int)FindNextStartingPositionMode.LeadingSet_LeftToRight, "aceg")] + [InlineData(@"[ab]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "ab")] + [InlineData(@"[Aa]", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "Aa")] + [InlineData(@"a", RegexOptions.IgnoreCase | RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "Aa")] + [InlineData(@"ab|cd|ef|gh", RegexOptions.RightToLeft, (int)FindNextStartingPositionMode.LeadingSet_RightToLeft, "bdfh")] public void LeadingSet(string pattern, RegexOptions options, int expectedMode, string expectedChars) { RegexFindOptimizations opts = ComputeOptimizations(pattern, options); @@ -117,8 +117,8 @@ public void LeadingSet(string pattern, RegexOptions options, int expectedMode, s } [Theory] - [InlineData(@"\d*a", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive, null, 'a')] - [InlineData(@"\d*abc", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight_CaseSensitive, "abc", 0)] + [InlineData(@"\d*a", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight, null, 'a')] + [InlineData(@"\d*abc", RegexOptions.None, (int)FindNextStartingPositionMode.LiteralAfterLoop_LeftToRight, "abc", 0)] public void LiteralAfterLoop(string pattern, RegexOptions options, int expectedMode, string? expectedString, char expectedChar) { RegexFindOptimizations opts = ComputeOptimizations(pattern, options); @@ -131,7 +131,7 @@ public void LiteralAfterLoop(string pattern, RegexOptions options, int expectedM private static RegexFindOptimizations ComputeOptimizations(string pattern, RegexOptions options) { RegexTree tree = RegexParser.Parse(pattern, options, CultureInfo.InvariantCulture); - return new RegexFindOptimizations(tree.Root, options, CultureInfo.InvariantCulture); + return new RegexFindOptimizations(tree.Root, options); } } } diff --git a/src/libraries/System.Text.RegularExpressions/tests/UnitTests/System.Text.RegularExpressions.Unit.Tests.csproj b/src/libraries/System.Text.RegularExpressions/tests/UnitTests/System.Text.RegularExpressions.Unit.Tests.csproj index a8b4ea21ee1e0..62ba696370e87 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/UnitTests/System.Text.RegularExpressions.Unit.Tests.csproj +++ b/src/libraries/System.Text.RegularExpressions/tests/UnitTests/System.Text.RegularExpressions.Unit.Tests.csproj @@ -24,8 +24,10 @@ + + + - diff --git a/src/libraries/System.Text.RegularExpressions/tools/DataTable.cs b/src/libraries/System.Text.RegularExpressions/tools/DataTable.cs new file mode 100644 index 0000000000000..7185e4a62e7e6 --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/DataTable.cs @@ -0,0 +1,225 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; + +namespace GenerateRegexCasingTable +{ + /// + /// Class which holds both the equivalence map and values for all of the UnicodeData.txt Lowercase + /// mappings + /// + public class DataTable + { + private Dictionary _map; + private Dictionary> _values; + private Dictionary _mapAndValueMapping; + + public DataTable(Dictionary equivalenceMap, Dictionary> equivalenceValues) + { + _map = equivalenceMap; + _values = equivalenceValues; + _mapAndValueMapping = new(); + } + + /// + /// Generates the Regex case equivalence table with partitions + /// and saves it at . + /// + /// Number of partitions for the First-level lookup table. + /// Filename for the output file that will be generated. + public void GenerateDataTableWithPartitions(int numberOfPartitions, string outputFilePath) + { + byte[] unicodesThatParticipateInCasing = CalculateCharactersThatParticipateInCasing(); + int charactersPerRange = 0x1_0000 / numberOfPartitions; + byte[] rangesWithData = CalculateRangesWithData(); + + using (StreamWriter writer = File.CreateText(outputFilePath)) + { + EmitFileHeadersAndUsings(writer); + + writer.Write("namespace System.Text.RegularExpressions\n"); + writer.Write("{\n"); + + writer.Write(" internal static partial class RegexCaseEquivalences\n {\n"); + + writer.Write(" // THE FOLLOWING DATA IS AUTO GENERATED BY GenerateRegexCasingTable program UNDER THE TOOLS FOLDER\n"); + writer.Write(" // PLEASE DON'T MODIFY BY HAND\n"); + writer.Write(" // IF YOU NEED TO UPDATE UNICODE VERSION FOLLOW THE GUIDE AT src/libraries/System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md\n\n"); + + EmitValuesArray(writer); + + writer.Write("\n"); + + EmitFirstLevelLookupTable(writer); + + writer.Write("\n"); + + EmitMapArray(writer); + + writer.Write(" }\n}\n"); + } + + return; + + byte[] CalculateRangesWithData() + { + byte[] result = new byte[numberOfPartitions]; + for (int i = 0; i < numberOfPartitions; i++) + { + byte rangeHasData = 0; + for (int x = 0; x < charactersPerRange; x++) + { + if (unicodesThatParticipateInCasing[(i * charactersPerRange) + x] == 1) + { + rangeHasData = 1; + break; + } + } + result[i] = rangeHasData; + } + + return result; + } + + byte[] CalculateCharactersThatParticipateInCasing() + { + byte[] result = new byte[0x1_0000]; + for (int i = 0; i < 0x1_0000; i++) + { + if (_map.ContainsKey((char)i)) + { + result[i] = 1; + } + else + { + result[i] = 0; + } + } + + return result; + } + + void EmitFileHeadersAndUsings(StreamWriter writer) + { + writer.Write("// Licensed to the .NET Foundation under one or more agreements.\n"); + writer.Write("// The .NET Foundation licenses this file to you under the MIT license.\n\n"); + } + + void EmitFirstLevelLookupTable(StreamWriter writer) + { + var firstLevelLookupTable = FlattenFirstLevelLookupTable(); + writer.Write(" private static ushort[] EquivalenceFirstLevelLookup { get; } = new ushort[" + firstLevelLookupTable.Count + "]\n {\n"); + + writer.Write(" 0x{0:x4}", firstLevelLookupTable[0]); + for (var i = 1; i < firstLevelLookupTable.Count; i++) + { + writer.Write(i % 16 == 0 ? ",\n " : ", "); + writer.Write("0x{0:x4}", firstLevelLookupTable[i]); + } + writer.Write("\n };\n"); + } + + List FlattenFirstLevelLookupTable() + { + List result = new(); + int indexesWithRanges = 0; + + for (int i = 0; i < numberOfPartitions; i++) + { + if (rangesWithData[i] == 0) + { + result.Add(0xFFFF); + } + else + { + Debug.Assert((indexesWithRanges * charactersPerRange) < 0xFFFF); + result.Add((ushort)(indexesWithRanges * charactersPerRange)); + indexesWithRanges++; + } + } + + return result; + } + + void EmitMapArray(StreamWriter writer) + { + var flattenedMap = FlattenMapDictionary(); + writer.Write(" private static ushort[] EquivalenceCasingMap { get; } = new ushort[" + flattenedMap.Count + "]\n {\n"); + + writer.Write(" 0x{0:x4}", flattenedMap[0]); + for (var i = 1; i < flattenedMap.Count; i++) + { + writer.Write(i % 16 == 0 ? $",\n " : ", "); + writer.Write("0x{0:x4}", flattenedMap[i]); + } + writer.Write("\n };\n"); + } + + List FlattenMapDictionary() + { + List result = new(); + + for (int i = 0; i <= 0xFFFF; i++) + { + // If this character belongs to a range that has no data, then don't add it to the list. + int index = (i / charactersPerRange) < numberOfPartitions ? i / charactersPerRange : numberOfPartitions - 1; + if (rangesWithData[index] == 0) + continue; + + if (_map.TryGetValue((char)i, out int valueMap)) + { + int mapping = _mapAndValueMapping[valueMap]; + Debug.Assert(mapping < 0x1FFF); // Ensure the index will not need the 3 most significant bits. + Debug.Assert(_values[valueMap].Count < 0x07); // Ensure the count will not need more than 3 bits. + int mappingValue = mapping | (_values[valueMap].Count << 13); // store the count as the 3 highest significant bits. + Debug.Assert(mappingValue < 0xFFFF); + result.Add((ushort)mappingValue); + } + else + { + result.Add(0xFFFF); + } + } + + return result; + } + + void EmitValuesArray(StreamWriter writer) + { + var flattenedValues = FlattenValuesDictionary(); + writer.Write(" private static char[] EquivalenceCasingValues { get; } = new char[" + flattenedValues.Count + "]\n {\n"); + + writer.Write(" \'\\u{0:X4}\'", flattenedValues[0]); + for (var i = 1; i < flattenedValues.Count; i++) + { + writer.Write(i % 16 == 0 ? ",\n " : ", "); + writer.Write("\'\\u{0:X4}\'", flattenedValues[i]); + } + writer.Write("\n };\n"); + } + + List FlattenValuesDictionary() + { + List values = new List(); + int valuesSize = 0; + + for (int i = 0; i < _values.Count; i++) + { + // Add a mapping that we will later use to match a character to the position of the values list + _mapAndValueMapping.Add(i, valuesSize); + foreach(char value in _values[i]) + { + Debug.Assert(value < 0xFFFF); + values.Add(value); + valuesSize++; + } + } + + return values; + } + } + } +} diff --git a/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.props b/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.props new file mode 100644 index 0000000000000..cfbf29e03372e --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.props @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.targets b/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.targets new file mode 100644 index 0000000000000..cfbf29e03372e --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/Directory.Build.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/libraries/System.Text.RegularExpressions/tools/GenerateRegexCasingTable.csproj b/src/libraries/System.Text.RegularExpressions/tools/GenerateRegexCasingTable.csproj new file mode 100644 index 0000000000000..26b5733684c3f --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/GenerateRegexCasingTable.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + latest + enable + + + diff --git a/src/libraries/System.Text.RegularExpressions/tools/Program.cs b/src/libraries/System.Text.RegularExpressions/tools/Program.cs new file mode 100644 index 0000000000000..5ca1f5538ceab --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/Program.cs @@ -0,0 +1,153 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; + +namespace GenerateRegexCasingTable +{ + /// + /// Program that takes a parameter pointing to UnicodeData.txt and generates a file to be used + /// as the Regex case equivalence table to be used for matching when using RegexOptions.IgnoreCase + /// + public partial class Program + { + public static void Main(string[] args) + { + if (args.Length < 1 || !File.Exists(args[0])) + Console.WriteLine("Error: Please pass in the full path to UnicodeData.txt so that the files can be generated."); + + string unicodeTxtFilePath = args[0]; + + // Flip this boolean to true if you want to test the generated table against invariantCulture.ToLower()/invariantCulture.ToUpper() + bool testCompat = false; + bool generateTable = true; + + Dictionary lowerCasingTable = UnicodeDataCasingParser.Parse(unicodeTxtFilePath, upperCase: false); + Dictionary upperCasingTable = UnicodeDataCasingParser.Parse(unicodeTxtFilePath, upperCase: true); + + (Dictionary? equivalenceMap, Dictionary>? equivalenceValues) = GenerateMapAndValuesFromCasingTable(lowerCasingTable, upperCasingTable); + + if (testCompat) + { + var textInfo = CultureInfo.InvariantCulture.TextInfo; + // Ensure that all of the calculated equivalences are not introducing new changes to existing Regex behavior. + foreach (KeyValuePair equivalenceMapEntry in equivalenceMap) + { + foreach (char equivalence in equivalenceValues[equivalenceMapEntry.Value]) + { + if (equivalenceMapEntry.Key != equivalence) + { + if (textInfo.ToLower(equivalenceMapEntry.Key) != equivalence && + textInfo.ToUpper(equivalenceMapEntry.Key) != equivalence && + textInfo.ToLower(equivalence) != equivalenceMapEntry.Key && + textInfo.ToUpper(equivalence) != equivalenceMapEntry.Key) + { + Console.WriteLine($"There shouldn't be a mapping between \\u{((ushort)equivalenceMapEntry.Key).ToString("X4")} and \\u{((ushort)equivalence).ToString("X4")}"); + } + } + } + } + } + + if (generateTable) + { + DataTable dataTable = new(equivalenceMap, equivalenceValues); + var fileName = "RegexCaseFolding.Data.cs"; + Console.WriteLine("Generating Regex case folding table..."); + dataTable.GenerateDataTableWithPartitions(64, fileName); + Console.WriteLine($"Regex case folding table file was generated at: {Path.Combine(Directory.GetCurrentDirectory(), fileName)}"); + Console.WriteLine("Please use it to replace the existing one at src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/ directory."); + } + } + + /// + /// Takes a , and generates a character map and values to be used for finding equivalence classes + /// for each unicode character. + /// + /// The lower casing table to use to generate the equivalence classes. + /// The upper casing table to use to generate the equivalence classes. + /// A pair containing the map and value dictionaries with the equivalence classes. + public static (Dictionary, Dictionary>) GenerateMapAndValuesFromCasingTable(Dictionary lowerCasingTable, Dictionary upperCasingTable) + { + Dictionary map = new Dictionary(); + Dictionary> values = new Dictionary>(); + int equivalenceValueCount = 0; + + // Fill the equivalence Map and values Dictinaries using Invariant.ToLower + foreach (var lowerCaseMapping in lowerCasingTable) + { + AddMapping(lowerCaseMapping); + } + + // Uncomment the following 3 lines if we also want to consider the ToUpper() mappings + //foreach (var upperCaseMapping in upperCasingTable) + //{ + // AddMapping(upperCaseMapping); + //} + + return (map, values); + + void AddMapping(KeyValuePair caseMapping) + { + int mapIndex = -1; + + char originalChar = caseMapping.Key; + char lowerCase = caseMapping.Value; + + if (!map.ContainsKey(originalChar) && !map.ContainsKey(lowerCase)) + { + mapIndex = equivalenceValueCount++; + map.Add(originalChar, mapIndex); + map.Add(lowerCase, mapIndex); + } + else if (!map.ContainsKey(originalChar)) + { + mapIndex = map[lowerCase]; + map.Add(originalChar, mapIndex); + } + else if (!map.ContainsKey(lowerCase)) + { + mapIndex = map[originalChar]; + map.Add(lowerCase, mapIndex); + } + else + { + Debug.Assert(map[originalChar] == map[lowerCase]); + return; + } + + if (!values.TryGetValue(mapIndex, out SortedSet? value)) + { + values.Add(mapIndex, new SortedSet(new CharComparer())); + } + + if (!values[mapIndex].Contains(originalChar)) + values[mapIndex].Add(originalChar); + if (!values[mapIndex].Contains(lowerCase)) + values[mapIndex].Add(lowerCase); + } + } + } + + /// + /// In order to be able to use the table in an optimum fashion in Regex, we need the + /// values for the equivalences to be sorted by char value number. This comparer will + /// keep the inner lists sorted. + /// + public class CharComparer : IComparer + { + public int Compare(char x, char y) + { + if ((int)x == (int)y) + return 0; + else if ((int)x > (int)y) + return 1; + else + return -1; + } + } +} diff --git a/src/libraries/System.Text.RegularExpressions/tools/Readme.md b/src/libraries/System.Text.RegularExpressions/tools/Readme.md new file mode 100644 index 0000000000000..1f181ffe62a26 --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/Readme.md @@ -0,0 +1,16 @@ +# GenerateRegexCasingTable Tool + +## Overview + +This tool is used for generating RegexCaseFolding.Data.cs which contains the three tables that will be used for performing matching operations when using RegexOptions.IgnoreCase. This tool will need to be used every time that we are ingesting a new version of Unicode in the repo. The current table contains the Unicode data from version 14.0.0. + +## Updating the version of Unicode used + +For instructions on how to update Unicode version on the whole repo, you find the instructions [here](../../System.Private.CoreLib/Tools/GenUnicodeProp/Updating-Unicode-Versions.md). + +These are the steps to follow in order to update the Regex case equivalence table: + +1. Download UnicodeData.txt from the version of Unicode that you are updating to from unicode.org. For example, for version 14.0.0, you can find that file [here](https://www.unicode.org/Public/14.0.0/ucd/UnicodeData.txt). +2. Once you have that file locally, run the following command from the command line: `dotnet run -- `. +3. A file named `RegexCaseFolding.Data.cs` will be created in this directory. Use it to replace the one at `src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/`. +4. Update this Readme Unicode version mentioned in the overview section to point to the version that was used to produce the table. diff --git a/src/libraries/System.Text.RegularExpressions/tools/UnicodeDataCasingParser.cs b/src/libraries/System.Text.RegularExpressions/tools/UnicodeDataCasingParser.cs new file mode 100644 index 0000000000000..12b565ef27da6 --- /dev/null +++ b/src/libraries/System.Text.RegularExpressions/tools/UnicodeDataCasingParser.cs @@ -0,0 +1,70 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; + +namespace GenerateRegexCasingTable +{ + /// + /// Class that parses UnicodeData.txt file and generates a casing table using lowercase values. + /// + public class UnicodeDataCasingParser + { + /// + /// Parses UnicodeData.txt file in path and returns a Dictionary map + /// with all of the lower-casing info + /// + /// The full path to UnicodeData.txt + /// A Dictionary map of chars with lowercasing data parsed from UnicodeData.txt + public static Dictionary Parse(string unicodeDataTxtFilePath, bool upperCase) + { + using FileStream fs = File.OpenRead(unicodeDataTxtFilePath); + using StreamReader reader = new StreamReader(fs); + + Dictionary result = new Dictionary(); + + string? line; + // Parse each line. The format has one line per character, with semicolon separated properties. The only + // values we care about is the one in position 0 which is the hex representation of the character, and the + // property at position 13 which is the lowercase mapping with a hex value pointing to the lower case character. + while((line = reader.ReadLine()) != null) + { + string[] split = line.Split(';'); + Debug.Assert(split.Length == 15); + + uint codepoint = uint.Parse(split[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture); + + if (codepoint > 0xFFFF) + break; + + if (upperCase) + { + // Skip special cases where string.Compare invariantCultureIgnoreCase returns false + if (codepoint == 0x0131) + continue; + + if (int.TryParse(split[12], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int upperCaseCodePoint)) + { + result.Add((char)codepoint, (char)upperCaseCodePoint); + } + } + else + { + // Skip special cases where string.Compare invariantCultureIgnoreCase returns false + if (codepoint == 0x0130) + continue; + + if (int.TryParse(split[13], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int lowerCaseCodePoint)) + { + result.Add((char)codepoint, (char)lowerCaseCodePoint); + } + } + } + + return result; + } + } +}