diff --git a/docs/workflow/ci/disabling-tests.md b/docs/workflow/ci/disabling-tests.md
index 1d649dd377600f..3cef8ce84ca313 100644
--- a/docs/workflow/ci/disabling-tests.md
+++ b/docs/workflow/ci/disabling-tests.md
@@ -72,7 +72,11 @@ Some test configurations must be disabled by editing the `.csproj` or `.ilproj`
and inserting a property in a ``, as follows:
- Prevent a test from running when testing unloadability: add `true`
-- Prevent a test from running when testing ildasm/ilasm round-tripping: add `true`
+- Prevent a test from running when testing ildasm/ilasm round-tripping: add `true`. This also disables managed ilasm round-tripping.
+ - Shared-library projects do not need process isolation for this property; merged runners skip their marked assemblies individually.
+- Prevent a test from running only when testing round-tripping with managed ilasm: add `true`
+ - These are temporary workarounds for bugs that must be fixed before we can ship managed ilasm.
+ - Shared-library projects do not need process isolation for this property; merged runners skip their marked assemblies individually.
- Prevent a test assembly from being passed to the Mono AOT compiler: add `true`
- Prevent a test from being passed to CrossGen2: add `false`
- Prevent a test from running in ReadyToRun (R2R) test legs: add `true`
diff --git a/docs/workflow/testing/coreclr/requiresprocessisolation.md b/docs/workflow/testing/coreclr/requiresprocessisolation.md
index 249a141cfae70a..0bbf895914c726 100644
--- a/docs/workflow/testing/coreclr/requiresprocessisolation.md
+++ b/docs/workflow/testing/coreclr/requiresprocessisolation.md
@@ -1,9 +1,10 @@
# When to Set `true`
`RequiresProcessIsolation` prevents a test project from being merged into a shared
-test runner process. When set, the test is built as a standalone executable and
-executed in its own process. A test project must set this property when any of the
-rules below apply.
+test runner process. Runnable tests are built as standalone executables and executed
+in their own processes. When set on a shared-library project, it excludes that library
+from merged runner output folders. A runnable test project must set this property when
+any of the rules below apply.
## Rules
@@ -55,9 +56,14 @@ min-opts, or tiered compilation are active. The skip check is per-process.
The test is skipped during SuperPMI collection runs. The skip check is per-process.
-### 9. Project sets `true`
+### 9. Project sets an IL round-trip incompatibility property
-The test is skipped during IL round-trip validation runs. The skip check is per-process.
+`IlasmRoundTripIncompatible` skips the test during all IL round-trip validation runs and
+implies `ManagedIlasmRoundTripIncompatible`. `ManagedIlasmRoundTripIncompatible` skips
+the test only when managed ilasm performs the round trip. Runnable tests need process
+isolation because their skip checks are per-process. Shared-library projects do not need
+process isolation for either property; merged runners skip their marked assemblies
+individually.
### 10. Project sets `true`
@@ -203,6 +209,7 @@ If the project file contains **any** of the following MSBuild properties or item
| `JitOptimizationSensitive` | Per-process skip check |
| `SuperPMICollectIncompatible` | Per-process skip check |
| `IlasmRoundTripIncompatible` | Per-process skip check |
+| `ManagedIlasmRoundTripIncompatible` | Per-process skip check |
| `UnloadabilityIncompatible` | Per-process skip check |
| `IsLongRunningGCTest` | Per-process skip pre-command |
| `CLRTestExecutionArguments` (non-empty) | Per-process invocation arguments |
diff --git a/docs/workflow/testing/coreclr/test-configuration.md b/docs/workflow/testing/coreclr/test-configuration.md
index 1a4980e8a23dbf..55f8f28b5917aa 100644
--- a/docs/workflow/testing/coreclr/test-configuration.md
+++ b/docs/workflow/testing/coreclr/test-configuration.md
@@ -53,8 +53,10 @@ Therefore the managed portion of each test **must not contain**:
* `true`
* Exclude test from NativeAOT runs runs by adding the following to the csproj:
* `true`
-* Exclude the test from ilasm round trip testing by adding the following to the csproj
+* Exclude the test from all ilasm round-trip testing by adding the following to the csproj. This also implies `ManagedIlasmRoundTripIncompatible`.
* `true`
+* Exclude the test only when round-trip testing with managed ilasm by adding the following to the csproj:
+ * `true`
* Exclude the test for unloadability (collectible assemblies) testing
* `true`
* If the test is specific for testing crossgen2, and should be compiled as such in all test modes
@@ -142,4 +144,3 @@ Unless tests are manually run on the command line to repro a problem, these para
`testFilterString` is any string other that `-stripe`. The only filters supported today are the simple form supported in 'dotnet test --filter' (substrings of the test's fully qualified name).
Either the -stripe parameter can be used or the TEST_HARNESS_STRIPE_TO_EXECUTE environment variable may be used to control striping. The TEST_HARNESS_STRIPE_TO_EXECUTE environment variable must be set to a string of the form `..` if it is used. `` is a 0 based index into the count of stripes, `` is the total number of stripes.
-
diff --git a/eng/pipelines/common/templates/runtimes/run-test-job.yml b/eng/pipelines/common/templates/runtimes/run-test-job.yml
index 706c8f1200495e..9c9f4b07fb2f11 100644
--- a/eng/pipelines/common/templates/runtimes/run-test-job.yml
+++ b/eng/pipelines/common/templates/runtimes/run-test-job.yml
@@ -548,6 +548,7 @@ jobs:
${{ if in(parameters.testGroup, 'ilasm') }}:
scenarios:
- ilasmroundtrip
+ - managedilasmroundtrip
########################################################################################################
#
diff --git a/src/coreclr/tools/aot/AotCompilerCommon.props b/src/coreclr/tools/aot/AotCompilerCommon.props
index 827d2d3fc94ec0..ac23d0a3feb81e 100644
--- a/src/coreclr/tools/aot/AotCompilerCommon.props
+++ b/src/coreclr/tools/aot/AotCompilerCommon.props
@@ -1,15 +1,5 @@
-
- true
- false
- true
- Speed
- Guard
- true
- false
- false
- true
-
+
<_LibPrefix Condition="'$(CrossHostArch)' == 'true'">$(LibPrefix)
diff --git a/src/coreclr/tools/aot/NativeAotToolRuntimeSettings.props b/src/coreclr/tools/aot/NativeAotToolRuntimeSettings.props
new file mode 100644
index 00000000000000..0ac115fda90811
--- /dev/null
+++ b/src/coreclr/tools/aot/NativeAotToolRuntimeSettings.props
@@ -0,0 +1,13 @@
+
+
+ true
+ false
+ true
+ Speed
+ Guard
+ true
+ false
+ false
+ true
+
+
diff --git a/src/tests/Common/CLRTest.Execute.Bash.targets b/src/tests/Common/CLRTest.Execute.Bash.targets
index b6e5b625928611..ced580d5e7352a 100644
--- a/src/tests/Common/CLRTest.Execute.Bash.targets
+++ b/src/tests/Common/CLRTest.Execute.Bash.targets
@@ -122,6 +122,14 @@ if [ ! -z "$RunningIlasmRoundTrip" ]
then
echo SKIPPING EXECUTION BECAUSE RunningIlasmRoundTrip IS SET
exit $(IncompatibleTestBashScriptExitCode)
+fi
+ ]]>
+
+
+
+ true
+
diff --git a/src/tests/Common/CLRTest.Jit.targets b/src/tests/Common/CLRTest.Jit.targets
index f00d9f4fd6b1d2..034a69bdd480fd 100644
--- a/src/tests/Common/CLRTest.Jit.targets
+++ b/src/tests/Common/CLRTest.Jit.targets
@@ -336,7 +336,8 @@ def is_managed_exe_assembly(file):
print("")
print("ILASM RoundTrips")
-if os.environ.get("IlasmRoundTripUseManagedIlasm") == "1":
+use_managed_ilasm = os.environ.get("IlasmRoundTripUseManagedIlasm") == "1"
+if use_managed_ilasm:
ilasm_path = os.path.join(os.environ["CORE_ROOT"], "managed-ilasm", "ilasm")
else:
ilasm_path = os.path.join(os.environ["CORE_ROOT"], "ilasm")
@@ -345,6 +346,17 @@ if not os.path.exists("IL-RT"):
os.mkdir("IL-RT")
for inputAssemblyName in glob.glob("*.dll"):
+ assemblyNameWithoutExtension = os.path.splitext(inputAssemblyName)[0]
+ ilasm_incompatible_marker = assemblyNameWithoutExtension + ".IlasmRoundTripIncompatible"
+ if os.path.isfile(ilasm_incompatible_marker):
+ print("Skipping ILASM round trip for " + inputAssemblyName)
+ continue
+
+ managed_ilasm_incompatible_marker = assemblyNameWithoutExtension + ".ManagedIlasmRoundTripIncompatible"
+ if use_managed_ilasm and os.path.isfile(managed_ilasm_incompatible_marker):
+ print("Skipping managed ILASM round trip for " + inputAssemblyName)
+ continue
+
if is_managed_assembly(inputAssemblyName):
print("ILASM RoundTrip for " + inputAssemblyName)
diff --git a/src/tests/Directory.Build.targets b/src/tests/Directory.Build.targets
index ed125eb60b15cf..c58e0a21aa2f4c 100644
--- a/src/tests/Directory.Build.targets
+++ b/src/tests/Directory.Build.targets
@@ -442,6 +442,12 @@
XHarnessNoRunner
+
+ IlasmRoundTripIncompatible
+
+
+ ManagedIlasmRoundTripIncompatible
+
NoMonoAot
diff --git a/src/tests/JIT/Directed/Directed_d.csproj b/src/tests/JIT/Directed/Directed_d.csproj
index fc2213d756ad44..65944a198ae2fc 100644
--- a/src/tests/JIT/Directed/Directed_d.csproj
+++ b/src/tests/JIT/Directed/Directed_d.csproj
@@ -3,6 +3,8 @@
Full
False
true
+
+ true
diff --git a/src/tests/JIT/Directed/Directed_do.csproj b/src/tests/JIT/Directed/Directed_do.csproj
index 9ef81e4ada860d..02b48ccea5742e 100644
--- a/src/tests/JIT/Directed/Directed_do.csproj
+++ b/src/tests/JIT/Directed/Directed_do.csproj
@@ -3,6 +3,8 @@
Full
True
true
+
+ true
<_UseOutOfProcessPhysicalPromotionTests Condition="'$(TargetsMobile)' != 'true' or ('$(TargetsBrowser)' == 'true' and '$(RuntimeFlavor)' == 'coreclr')">true
diff --git a/src/tests/JIT/Directed/Directed_r.csproj b/src/tests/JIT/Directed/Directed_r.csproj
index ad30659efe933c..3fc2ffd54012c9 100644
--- a/src/tests/JIT/Directed/Directed_r.csproj
+++ b/src/tests/JIT/Directed/Directed_r.csproj
@@ -3,6 +3,8 @@
None
False
true
+
+ true
diff --git a/src/tests/JIT/Directed/Directed_ro.csproj b/src/tests/JIT/Directed/Directed_ro.csproj
index 2a45dcf6270529..662ad48e6a69d7 100644
--- a/src/tests/JIT/Directed/Directed_ro.csproj
+++ b/src/tests/JIT/Directed/Directed_ro.csproj
@@ -3,6 +3,8 @@
None
True
true
+
+ true
diff --git a/src/tests/JIT/Directed/tls/mutualrecurthd-tls.ilproj b/src/tests/JIT/Directed/tls/mutualrecurthd-tls.ilproj
index 4e6ca1703622a4..0af68ac18370b5 100644
--- a/src/tests/JIT/Directed/tls/mutualrecurthd-tls.ilproj
+++ b/src/tests/JIT/Directed/tls/mutualrecurthd-tls.ilproj
@@ -3,6 +3,8 @@
1
true
+
+ true
PdbOnly
diff --git a/src/tests/JIT/Directed/tls/test-tls.ilproj b/src/tests/JIT/Directed/tls/test-tls.ilproj
index 0853bde29add51..a66cf3965d4510 100644
--- a/src/tests/JIT/Directed/tls/test-tls.ilproj
+++ b/src/tests/JIT/Directed/tls/test-tls.ilproj
@@ -3,6 +3,8 @@
1
true
+
+ true
PdbOnly
diff --git a/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_r.csproj b/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_r.csproj
index aed29001c5e8e8..1885d5ef329133 100644
--- a/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_r.csproj
+++ b/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_r.csproj
@@ -4,6 +4,9 @@
true
+
+ true
+
true
diff --git a/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_ro.csproj b/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_ro.csproj
index 7e0006c3cec031..4aa7b1f941c03a 100644
--- a/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_ro.csproj
+++ b/src/tests/JIT/HardwareIntrinsics/HardwareIntrinsics_Arm_ro.csproj
@@ -4,6 +4,9 @@
true
+
+ true
+
true
diff --git a/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_r.csproj b/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_r.csproj
index f71813ac20c237..7dfd49ab54e66e 100644
--- a/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_r.csproj
+++ b/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_r.csproj
@@ -2,6 +2,8 @@
X86_Avx512F_r
true
+
+ true
Embedded
diff --git a/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_ro.csproj b/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_ro.csproj
index 93c7658d728a7c..5d4779a30ab13c 100644
--- a/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_ro.csproj
+++ b/src/tests/JIT/HardwareIntrinsics/X86_Avx512/Avx512F/Avx512F_ro.csproj
@@ -2,6 +2,8 @@
X86_Avx512F_ro
true
+
+ true
Embedded
diff --git a/src/tests/JIT/Regression/CLR-x86-EJIT/v1-m10/b07847/b07847.ilproj b/src/tests/JIT/Regression/CLR-x86-EJIT/v1-m10/b07847/b07847.ilproj
index 54ef21cb720bb9..2e350a4fb8ee56 100644
--- a/src/tests/JIT/Regression/CLR-x86-EJIT/v1-m10/b07847/b07847.ilproj
+++ b/src/tests/JIT/Regression/CLR-x86-EJIT/v1-m10/b07847/b07847.ilproj
@@ -3,6 +3,8 @@
1
true
+
+ true
PdbOnly
diff --git a/src/tests/JIT/Regression/CLR-x86-JIT/V1.2-M01/b03689/b03689.ilproj b/src/tests/JIT/Regression/CLR-x86-JIT/V1.2-M01/b03689/b03689.ilproj
index 54ef21cb720bb9..2e350a4fb8ee56 100644
--- a/src/tests/JIT/Regression/CLR-x86-JIT/V1.2-M01/b03689/b03689.ilproj
+++ b/src/tests/JIT/Regression/CLR-x86-JIT/V1.2-M01/b03689/b03689.ilproj
@@ -3,6 +3,8 @@
1
true
+
+ true
PdbOnly
diff --git a/src/tests/JIT/jit64/opt/cse/HugeArray1.csproj b/src/tests/JIT/jit64/opt/cse/HugeArray1.csproj
index 1015fcfda8755e..475424b7e8e7d3 100644
--- a/src/tests/JIT/jit64/opt/cse/HugeArray1.csproj
+++ b/src/tests/JIT/jit64/opt/cse/HugeArray1.csproj
@@ -2,6 +2,8 @@
Full
False
+
+ true
true
diff --git a/src/tests/JIT/jit64/opt/cse/HugeField1.csproj b/src/tests/JIT/jit64/opt/cse/HugeField1.csproj
index 58467b877d729c..5c1f3f2ea0dfc0 100644
--- a/src/tests/JIT/jit64/opt/cse/HugeField1.csproj
+++ b/src/tests/JIT/jit64/opt/cse/HugeField1.csproj
@@ -2,6 +2,8 @@
Full
False
+
+ true
diff --git a/src/tests/JIT/jit64/opt/cse/HugeField2.csproj b/src/tests/JIT/jit64/opt/cse/HugeField2.csproj
index c98953ec035a69..ce96c76a55ddff 100644
--- a/src/tests/JIT/jit64/opt/cse/HugeField2.csproj
+++ b/src/tests/JIT/jit64/opt/cse/HugeField2.csproj
@@ -5,6 +5,8 @@
Full
False
+
+ true
diff --git a/src/tests/JIT/jit64/opt/cse/hugeSimpleExpr1.csproj b/src/tests/JIT/jit64/opt/cse/hugeSimpleExpr1.csproj
index dae88dfe2ff587..3d532636c72dbc 100644
--- a/src/tests/JIT/jit64/opt/cse/hugeSimpleExpr1.csproj
+++ b/src/tests/JIT/jit64/opt/cse/hugeSimpleExpr1.csproj
@@ -2,6 +2,8 @@
Full
True
+
+ true
diff --git a/src/tests/Loader/classloader/regressions/dev10_403582/genmeth.ilproj b/src/tests/Loader/classloader/regressions/dev10_403582/genmeth.ilproj
index b567c94322dcef..436f21de9db0b3 100644
--- a/src/tests/Loader/classloader/regressions/dev10_403582/genmeth.ilproj
+++ b/src/tests/Loader/classloader/regressions/dev10_403582/genmeth.ilproj
@@ -3,6 +3,8 @@
true
+
+ true
Library
SharedLibrary
diff --git a/src/tests/Loader/classloader/regressions/dev10_403582/gentype.ilproj b/src/tests/Loader/classloader/regressions/dev10_403582/gentype.ilproj
index 4e461dba0f043d..85ebd52c637133 100644
--- a/src/tests/Loader/classloader/regressions/dev10_403582/gentype.ilproj
+++ b/src/tests/Loader/classloader/regressions/dev10_403582/gentype.ilproj
@@ -1,5 +1,6 @@
+ true
Library
diff --git a/src/tools/ilasm/KNOWN-ISSUES.md b/src/tools/ilasm/KNOWN-ISSUES.md
index b64137c73014fb..665b1f93b02731 100644
--- a/src/tools/ilasm/KNOWN-ISSUES.md
+++ b/src/tools/ilasm/KNOWN-ISSUES.md
@@ -24,3 +24,8 @@ Currently managed ilasm does not do any optimizations of the IL written by the u
## -FOLD is a no-op
Currently managed ilasm does not fold identical IL bodies from different methods into the same blob.
+
+## ARM32 target images are not supported
+
+Managed ilasm does not support generating ARM32 (AArch32) machine images. The native `/ARM`
+switch is rejected.
diff --git a/src/tools/ilasm/MANAGED-ILASM-FIXES.md b/src/tools/ilasm/MANAGED-ILASM-FIXES.md
new file mode 100644
index 00000000000000..5be91064a86349
--- /dev/null
+++ b/src/tools/ilasm/MANAGED-ILASM-FIXES.md
@@ -0,0 +1,32 @@
+# Managed IL Assembler - Fixed Issues
+
+| Fixed issue | ilasm behavior | Managed ILASM behavior |
+| --- | --- | --- |
+| `FloatingPointInstruction_ByteForms_EmitExpectedConstants` | Rejects the `bytearray` operand for floating-point constants. | Accepts byte-array forms for floating-point instruction constants. |
+| `LabelBasedFilterRegion_EmitsExactExceptionRegionBounds` | Rejects the label-based filter region as undefined or structurally separated. | Emits the label-based filter region with the requested bounds. |
+| `Ldtoken_NumericTokenEmittedCorrectly` | Rejects a numeric metadata token as an `ldtoken` operand. | Accepts and emits a numeric metadata token operand for `ldtoken`. |
+| `ValidKeyFile_EmbedsPublicKeyAndSetsAssemblyFlag` | Reports that full signing is unsupported. | Embeds the full-signing key and sets the assembly flag. |
+| `CustomAttribute_ObjectArrayWithNestedArrays_DecodesProperly` | Rejects nested attribute-array forms including `float32('a')`. | Accepts and decodes the nested attribute arrays. |
+| `Typedef_CustomAttributeWithOwner_AssemblyUsePreservesOwner` | Crashes without a diagnostic. | Resolves the custom-attribute typedef and preserves its explicit assembly owner. |
+| `Typedef_FieldAndCustomAttributeForms_EmitResolvableMetadata` | Crashes without a diagnostic. | Resolves the field and custom-attribute typedef forms and emits resolvable metadata. |
+| `FieldAttributes_EmitExpectedFlagsAndNullConstant` | Rejects the tested `volatile` field modifier form. | Accepts the form and emits the expected field flags. |
+| Native unmanaged method bodies | Refuses to compile the tested `native unmanaged` method bodies. | Accepts the method bodies and applies the tested pseudoattribute updates. |
+| `DataLabelReference_MissingTarget_ReportsDiagnosticAndOmitsRelocation` | Fails without producing an output image. | Reports the missing target and emits a recoverable image without the relocation. |
+| `ExportDirective_WithoutVTableFixup_DoesNotEmitNativeExportArtifacts` | Emits `.sdata`, vtable-fixup, and export directories for the unmatched `.export`. | Ignores the unmatched `.export` and omits native export artifacts. |
+| `ExportOrdinal_MaxValueAsBase_EmitsSingleEntry` | Crashes without a diagnostic for an export at ordinal `int.MaxValue`. | Emits one export whose base ordinal is `int.MaxValue`. |
+| `ExportOrdinal_NonPositive_ReportsDiagnosticAndOmitsExport` | Emits invalid artifacts for ordinals 0 and -1 and crashes on `int.MinValue`. | Reports non-positive ordinals and omits their exports. |
+| `ExportStub_TargetMachine_IsExecutableAndRelocatable` | Rejects ARM64 exports and emits different stub layouts on supported targets. | Emits the expected executable, relocatable, target-specific export stubs. |
+| `VTableFixupAndExport_UseDeclaredWritableDataAndExecutableStubs` | Places a later sparse-ordinal export stub in writable, non-executable `.sdata`. | Places every export stub in executable, non-writable `.text`, independent of ordinal gaps. |
+| `Export_InvalidVTableReference_ReportsDiagnosticAndOmitsExport` | Emits fixup or export artifacts without diagnosing invalid entry or slot references. | Reports the invalid reference and omits the export. |
+| `VTableEntry_InvalidAssociationWithoutExport_ReportsDiagnostic` | Emits vtable fixups without diagnosing invalid associations. | Reports the invalid associations and leaves the affected slot empty. |
+| Adjacent typed data items | Rejects the second typed item in a `.data` declaration. | Accepts adjacent typed values in a `.data` declaration. |
+| `VTableFixup_InsufficientDataLabelStorage_ReportsDiagnosticAndOmitsFixup` | Emits a fixup that exceeds its backing data without a diagnostic. | Reports the undersized backing storage and omits the fixup. |
+| `VTableFixup_InvalidSlotCount_ReportsDiagnosticAndOmitsFixup` | Truncates or wraps invalid slot counts into emitted fixups. | Reports invalid slot counts and omits the fixup. |
+| `VTableFixup_InvalidWidthForTarget_ReportsDiagnostic` | Emits a fixup with an invalid target width without a diagnostic. | Reports the invalid width and omits the fixup. |
+| `VTableFixup_MissingDataLabel_ReportsDiagnosticAndOmitsFixup` | Fails without producing an output image. | Reports the missing data label and emits a recoverable image without the fixup. |
+| `GenericParameterCount_OutsideMetadataIndexRange_RequiresErrorTolerant` | Silently emits more than 65,536 generic parameters and wraps their 16-bit metadata ordinals back to 0. | Reports that the generic parameter count exceeds the metadata encoding limit; only error-tolerant mode emits the wrapped metadata. |
+| Generic parameter constraint owner outside the metadata index range | Silently emits a constraint owned by a generic parameter whose 16-bit metadata ordinal has wrapped. | Reports that the constraint owner index cannot be encoded; error-tolerant mode preserves the constraint for inspection. |
+| `MethodGenericParameterAndConstraintDirectives_AttachCustomAttributes` | Reports an out-of-range generic parameter and a missing owner or index. | Resolves method generic parameter and constraint directives by name. |
+| `MethodReferenceForms_EmitResolvableCallTokensAndMethodSpecification` | Treats the unqualified in-type call as an unresolved global reference. | Resolves the call to the method in the containing type. |
+| `TypelistMscorlibAndSemicolonControls_EmitExpectedMetadata` | Leaves the implicit `System.Object` base unresolved. | Resolves the implicit object base through `mscorlib`. |
+| Compiler-controlled scope disambiguator | Strips the `$PST` token-specific disambiguator from anywhere within a symbol that it is present. | Strips the `$PST` disambiguator only from the end of a symbol name, the only place ildasm adds it. |
diff --git a/src/tools/ilasm/src/ILAssembler/Diagnostic.cs b/src/tools/ilasm/src/ILAssembler/Diagnostic.cs
index c6452095749b45..a00d7860f6bd43 100644
--- a/src/tools/ilasm/src/ILAssembler/Diagnostic.cs
+++ b/src/tools/ilasm/src/ILAssembler/Diagnostic.cs
@@ -52,6 +52,16 @@ public static class DiagnosticIds
public const string KeyFileError = "ILA0032";
public const string TooManyGenericParameters = "ILA0033";
public const string UnsupportedTlsData = "ILA0034";
+ public const string GenericParameterConstraintOwnerOutOfRange = "ILA0035";
+ public const string InvalidExportOrdinal = "ILA0036";
+ public const string ExportOrdinalRangeTooLarge = "ILA0037";
+ public const string InvalidVTableSlotCount = "ILA0038";
+ public const string InvalidVTableExport = "ILA0039";
+ public const string InsufficientVTableData = "ILA0040";
+ public const string UnsupportedNativeExportMachine = "ILA0041";
+ public const string InvalidVTableWidth = "ILA0042";
+ public const string InvalidVTableEntry = "ILA0043";
+ public const string DuplicateExportOrdinal = "ILA0044";
}
internal static class DiagnosticMessageTemplates
@@ -89,4 +99,15 @@ internal static class DiagnosticMessageTemplates
public const string MissingExportedTypeImplementation = "Undefined implementation in ExportedType '{0}' -- ExportedType not emitted";
public const string TooManyGenericParameters = "Generic parameter count {0} exceeds the maximum of {1}";
public const string UnsupportedTlsData = "TLS RVA data declarations are not supported";
+ public const string GenericParameterConstraintOwnerOutOfRange = "Generic parameter constraint owner index {0} exceeds the maximum encodable generic parameter index of {1}";
+ public const string InvalidExportOrdinal = "Export ordinal {0} must be positive";
+ public const string ExportOrdinalRangeTooLarge = "Export ordinal {0} is too far from base ordinal {1}; the export address table index must not exceed {2}";
+ public const string InvalidVTableSlotCount = "VTable fixup slot count {0} must be between 0 and {1}";
+ public const string InvalidVTableExport = "Export '{0}' does not have a valid VTable entry association";
+ public const string InsufficientVTableData = "Data label '{0}' has {1} bytes available, but its VTable fixup requires {2} bytes";
+ public const string UnsupportedNativeExportMachine = "Native exports are not supported for target machine '{0}'";
+ public const string InvalidVTableWidth = "VTable fixup width flags 0x{0:X} do not match target machine '{1}'; expected exactly '{2}'";
+ public const string InvalidVTableEntry = "Method '{0}' references invalid VTable entry {1}";
+ public const string InvalidVTableSlot = "Method '{0}' references invalid VTable slot {1}; VTable entry {2} contains {3} slots";
+ public const string DuplicateExportOrdinal = "Export '{0}' uses ordinal {1}, which is already assigned to a different VTable target";
}
diff --git a/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs b/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs
index 48fd4a7e237736..c35dde3c0dc697 100644
--- a/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs
+++ b/src/tools/ilasm/src/ILAssembler/DocumentCompiler.cs
@@ -6,6 +6,7 @@
using System.IO;
using System.Linq;
using Antlr4.Runtime;
+using Antlr4.Runtime.Tree;
namespace ILAssembler;
public sealed class DocumentCompiler
@@ -58,13 +59,16 @@ public sealed class DocumentCompiler
CILParser parser = new(new CommonTokenStream(preprocessor));
parser.RemoveErrorListeners();
var parserDiagnostics = ImmutableArray.CreateBuilder();
- parser.AddErrorListener(new ParserErrorListener(parserDiagnostics, loadedDocuments));
+ ParserErrorListener parserErrorListener = new(parserDiagnostics, loadedDocuments);
+ parser.AddErrorListener(parserErrorListener);
var result = parser.decls();
+ parserErrorListener.AddErrorNodeContexts(result);
// Add parser diagnostics to the main list
diagnostics.AddRange(parserDiagnostics);
visitor ??= new GrammarVisitor(loadedDocuments, options, resourceLocator);
+ visitor.BeginDocument(parserErrorListener.ErrorContexts);
_ = result.Accept(visitor);
@@ -94,6 +98,7 @@ internal sealed class ParserErrorListener : Antlr4.Runtime.IAntlrErrorListener.Builder _diagnostics;
private readonly Dictionary _loadedDocuments;
+ public HashSet ErrorContexts { get; } = [];
public ParserErrorListener(ImmutableArray.Builder diagnostics, Dictionary loadedDocuments)
{
@@ -103,6 +108,11 @@ public ParserErrorListener(ImmutableArray.Builder diagnostics, Dicti
public void SyntaxError(TextWriter output, IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
+ if (recognizer is Parser { Context: { } context })
+ {
+ AddContextAndAncestors(context);
+ }
+
var sourceName = offendingSymbol?.TokenSource?.SourceName ?? "";
var span = new SourceSpan(offendingSymbol?.StartIndex ?? 0, offendingSymbol is null ? 0 : offendingSymbol.StopIndex - offendingSymbol.StartIndex + 1);
if (_loadedDocuments.TryGetValue(sourceName, out var sourceText))
@@ -114,4 +124,27 @@ public void SyntaxError(TextWriter output, IRecognizer recognizer, IToken offend
_diagnostics.Add(new Diagnostic("Parser", DiagnosticSeverity.Error, $"line {line}:{charPositionInLine} {msg}", new Location(span, new SourceText("", sourceName))));
}
}
+
+ public void AddErrorNodeContexts(IParseTree tree)
+ {
+ if (tree is IErrorNode)
+ {
+ AddContextAndAncestors(tree.Parent as ParserRuleContext);
+ return;
+ }
+
+ for (int i = 0; i < tree.ChildCount; i++)
+ {
+ AddErrorNodeContexts(tree.GetChild(i));
+ }
+ }
+
+ private void AddContextAndAncestors(ParserRuleContext? context)
+ {
+ while (context is not null)
+ {
+ ErrorContexts.Add(context);
+ context = context.Parent as ParserRuleContext;
+ }
+ }
}
diff --git a/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs b/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs
index 5b30aa0af590bb..fa87d9c393e6dd 100644
--- a/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs
+++ b/src/tools/ilasm/src/ILAssembler/EntityRegistry.cs
@@ -190,10 +190,6 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (GenericParameterEntity genericParam in allGenericParams)
{
- // GenericParam index is stored as a 2-byte value; skip params beyond the limit
- if (genericParam.Index > ushort.MaxValue)
- continue;
-
RecordEntityInTable(TableIndex.GenericParam, genericParam);
}
@@ -319,7 +315,9 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
}
builder.AddFieldDefinition(
fieldAttributes,
- builder.GetOrAddString(fieldDef.Name),
+ builder.GetOrAddString((fieldAttributes & FieldAttributes.FieldAccessMask) == FieldAttributes.PrivateScope
+ ? NameHelpers.GetPrivateScopeMetadataName(fieldDef.Name, isMethod: false)
+ : fieldDef.Name),
fieldDef.Signature!.Count == 0 ? default : builder.GetOrAddBlob(RewriteSignatureBlob(fieldDef.Signature, signatureRewriter)));
if (fieldDef.Offset is not null)
@@ -376,13 +374,32 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
StandaloneSignatureHandle localsSigHandle = methodDef.LocalsSignature is not null
? (StandaloneSignatureHandle)methodDef.LocalsSignature.Handle
: default;
+ MethodBodyAttributes bodyAttributes = methodDef.BodyAttributes;
+ if (methodDef.MaxStack < 8
+ && methodDef.MethodBody.CodeBuilder.Count < 64
+ && localsSigHandle.IsNil
+ && methodDef.ExceptionRegions.Count == 0)
+ {
+ // COMPAT: Native ilasm preserves maxstack values below 8 by forcing a fat
+ // header via InitLocals for methods that would otherwise qualify for a tiny
+ // header. InitLocals has no other effect because tiny-header methods have no
+ // locals.
+ bodyAttributes |= MethodBodyAttributes.InitLocals;
+ }
+
+ bool requiresFatHeaderWhenExceptionRegionsAreOmitted =
+ (methodDef.MaxStack < 8 || bodyAttributes.HasFlag(MethodBodyAttributes.InitLocals))
+ && methodDef.MethodBody.CodeBuilder.Count < 64
+ && localsSigHandle.IsNil;
+
try
{
bodyOffset = bodyStreamEncoder.AddMethodBody(
methodDef.MethodBody,
methodDef.MaxStack,
localsSigHandle,
- methodDef.BodyAttributes);
+ bodyAttributes,
+ hasDynamicStackAllocation: true);
}
catch (InvalidOperationException)
{
@@ -394,8 +411,9 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
methodDef.MaxStack,
exceptionRegionCount: 0,
hasSmallExceptionRegions: true,
- localsSigHandle,
- methodDef.BodyAttributes);
+ requiresFatHeaderWhenExceptionRegionsAreOmitted ? GetOrCreateEmptyLocalsSignature() : localsSigHandle,
+ bodyAttributes,
+ hasDynamicStackAllocation: true);
bodyOffset = fallbackBody.Offset;
var writer1 = new BlobWriter(fallbackBody.Instructions);
methodDef.MethodBody.CodeBuilder.WriteContentTo(ref writer1);
@@ -405,13 +423,15 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
// Exception handler regions have invalid ranges (e.g., from parse
// errors that produced malformed control flow). Emit the IL in a
// minimal valid method body and omit exception regions in fallback.
+ // TODO-COMPAT: Emit the invalid exception regions manually
var fallbackBody = bodyStreamEncoder.AddMethodBody(
methodDef.MethodBody.CodeBuilder.Count,
methodDef.MaxStack,
exceptionRegionCount: 0,
hasSmallExceptionRegions: true,
- localsSigHandle,
- methodDef.BodyAttributes);
+ requiresFatHeaderWhenExceptionRegionsAreOmitted ? GetOrCreateEmptyLocalsSignature() : localsSigHandle,
+ bodyAttributes,
+ hasDynamicStackAllocation: true);
bodyOffset = fallbackBody.Offset;
var writer2 = new BlobWriter(fallbackBody.Instructions);
methodDef.MethodBody.CodeBuilder.WriteContentTo(ref writer2);
@@ -426,7 +446,9 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
builder.AddMethodDefinition(
methodAttributes,
methodDef.ImplementationAttributes,
- builder.GetOrAddString(methodDef.Name),
+ builder.GetOrAddString((methodAttributes & MethodAttributes.MemberAccessMask) == MethodAttributes.PrivateScope
+ ? NameHelpers.GetPrivateScopeMetadataName(methodDef.Name, isMethod: true)
+ : methodDef.Name),
builder.GetOrAddBlob(RewriteSignatureBlob(methodDef.MethodSignature!, signatureRewriter)),
bodyOffset,
GetParameterHandleForList(methodDef.Parameters, GetSeenEntities(TableIndex.MethodDef), method => ((MethodDefinitionEntity)method).Parameters, i));
@@ -478,7 +500,7 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (MethodImplementationEntity impl in GetSeenEntities(TableIndex.MethodImpl))
{
builder.AddMethodImplementation(
- (TypeDefinitionHandle)impl.MethodBody.ContainingType.Handle,
+ (TypeDefinitionHandle)impl.Type.Handle,
impl.MethodBody.Handle,
impl.MethodDeclaration.Handle);
}
@@ -490,9 +512,20 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
{
continue;
}
+
+ string name = memberRef.Name;
+ if (memberRef.Parent.Handle.Kind == HandleKind.MethodDefinition)
+ {
+ var method = (MethodDefinitionEntity)GetSeenEntities(TableIndex.MethodDef)[MetadataTokens.GetRowNumber(memberRef.Parent.Handle) - 1];
+ if ((method.MethodAttributes & MethodAttributes.MemberAccessMask) == MethodAttributes.PrivateScope)
+ {
+ name = NameHelpers.GetPrivateScopeMetadataName(name, isMethod: true);
+ }
+ }
+
builder.AddMemberReference(
memberRef.Parent.Handle,
- builder.GetOrAddString(memberRef.Name),
+ builder.GetOrAddString(name),
builder.GetOrAddBlob(RewriteSignatureBlob(memberRef.Signature, signatureRewriter)));
}
@@ -506,6 +539,12 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (CustomAttributeEntity customAttr in GetSeenEntities(TableIndex.CustomAttribute))
{
+ if (customAttr.Owner is null
+ || customAttr.Constructor.Handle.IsNil)
+ {
+ continue;
+ }
+
EntityHandle parent = customAttr.Owner switch
{
AssemblyEntity => EntityHandle.AssemblyDefinition,
@@ -530,7 +569,7 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
builder.AddEvent(
evt.Attributes,
builder.GetOrAddString(evt.Name),
- evt.Type.Handle);
+ evt.Type?.Handle ?? (EntityHandle)default(TypeDefinitionHandle));
foreach (var accessor in evt.Accessors)
{
@@ -636,14 +675,13 @@ public Blob WriteContentTo(MetadataBuilder builder, BlobBuilder ilStream, IReadO
foreach (GenericParameterEntity genericParam in GetSeenEntities(TableIndex.GenericParam))
{
- // GenericParam index is stored as a 2-byte value; skip params beyond the limit
- if (genericParam.Index > ushort.MaxValue)
- continue;
+ // Error-tolerant output preserves rows past the encodable index range by
+ // wrapping the value to the GenericParam table's 2-byte Number column.
builder.AddGenericParameter(
genericParam.Owner!.Handle,
genericParam.Attributes,
builder.GetOrAddString(genericParam.Name),
- genericParam.Index);
+ unchecked((ushort)genericParam.Index));
}
foreach (GenericParameterConstraintEntity constraint in GetSeenEntities(TableIndex.GenericParamConstraint))
@@ -888,7 +926,17 @@ public TypeReferenceEntity GetOrCreateTypeReference(EntityBase resolutionContext
// COMPAT: When the resolution scope is a corelib assembly ref (mscorlib, System.Runtime, etc.),
// redirect to the preferred corelib assembly ref to match native ilasm behavior.
// Native ilasm always uses the preferred corelib for well-known types.
- if (resolutionContext is AssemblyReferenceEntity asmRefScope && IsCoreLibAssemblyName(asmRefScope.Name))
+ bool isWellKnownCoreLibType = false;
+ if (name.ContainingTypeName is null)
+ {
+ var (typeNamespace, typeName) = NameHelpers.SplitDottedNameToNamespaceAndName(name.DottedName);
+ isWellKnownCoreLibType = typeNamespace == "System"
+ && typeName is "String" or "Object" or "ValueType" or "Enum";
+ }
+
+ if (isWellKnownCoreLibType
+ && resolutionContext is AssemblyReferenceEntity asmRefScope
+ && IsCoreLibAssemblyName(asmRefScope.Name))
{
var preferredCoreLib = GetCoreLibAssemblyReference();
if (preferredCoreLib != asmRefScope)
@@ -1369,17 +1417,20 @@ private static BlobBuilder RewriteMethodSignatureBlob(byte[] bytes, SignatureRew
var sig = decoder.DecodeMethodSignature(ref reader);
var newBlob = new BlobBuilder();
- var encoder = new BlobEncoder(newBlob);
- encoder.MethodSignature(sig.Header.CallingConvention, sig.GenericParameterCount, sig.Header.Attributes.HasFlag(SignatureAttributes.Instance))
- .Parameters(sig.ParameterTypes.Length, out var retBuilder, out var paramsBuilder);
- sig.ReturnType.WriteBlobTo(retBuilder.Builder);
+ newBlob.WriteByte(bytes[0]);
+ if (sig.Header.IsGeneric)
+ {
+ newBlob.WriteCompressedInteger(sig.GenericParameterCount);
+ }
+ newBlob.WriteCompressedInteger(sig.ParameterTypes.Length);
+ sig.ReturnType.WriteBlobTo(newBlob);
for (int i = 0; i < sig.ParameterTypes.Length; i++)
{
if (sig.RequiredParameterCount != sig.ParameterTypes.Length && i == sig.RequiredParameterCount)
{
- paramsBuilder.StartVarArgs();
+ newBlob.WriteByte((byte)SignatureTypeCode.Sentinel);
}
- sig.ParameterTypes[i].WriteBlobTo(paramsBuilder.AddParameter().Builder);
+ sig.ParameterTypes[i].WriteBlobTo(newBlob);
}
return newBlob;
}
@@ -1460,6 +1511,11 @@ private void ResolveAndRecordMemberReference(MemberReferenceEntity memberRef)
// - This produces compat with the existing ILASM, which always resolves local field references to FieldDef tokens
var signature = memberRef.Signature.ToArray();
+ if (signature.Length == 0)
+ {
+ return;
+ }
+
SignatureHeader header = new(signature[0]);
if (header.Kind == SignatureKind.Method)
{
@@ -1531,7 +1587,7 @@ private bool TryResolveFieldReference(MemberReferenceEntity memberRef)
private void UpdateMemberRefForVarargSignatures(MemberReferenceEntity memberRef, byte[] signature)
{
var decoder = new SignatureDecoder(new SignatureRewriter(), null!, default);
- BlobEncoder methodDefSig = new(new BlobBuilder());
+ BlobBuilder methodDefSig = new();
bool hasVarargParameters = false;
// TODO-SRM: Propose a public API to construct a blob reader over a byte array or ReadOnlyMemory
// to avoid the unsafe block.
@@ -1549,12 +1605,16 @@ private void UpdateMemberRefForVarargSignatures(MemberReferenceEntity memberRef,
{
hasVarargParameters = true;
- methodDefSig.MethodSignature(methodSignature.Header.CallingConvention, methodSignature.GenericParameterCount, methodSignature.Header.Attributes.HasFlag(SignatureAttributes.Instance))
- .Parameters(methodSignature.RequiredParameterCount, out var retTypeBuilder, out var parametersEncoder);
- methodSignature.ReturnType.WriteBlobTo(retTypeBuilder.Builder);
+ methodDefSig.WriteByte(signature[0]);
+ if (methodSignature.Header.IsGeneric)
+ {
+ methodDefSig.WriteCompressedInteger(methodSignature.GenericParameterCount);
+ }
+ methodDefSig.WriteCompressedInteger(methodSignature.RequiredParameterCount);
+ methodSignature.ReturnType.WriteBlobTo(methodDefSig);
for (int i = 0; i < methodSignature.RequiredParameterCount; i++)
{
- methodSignature.ParameterTypes[i].WriteBlobTo(parametersEncoder.AddParameter().Builder);
+ methodSignature.ParameterTypes[i].WriteBlobTo(methodDefSig);
}
}
}
@@ -1571,12 +1631,11 @@ private void UpdateMemberRefForVarargSignatures(MemberReferenceEntity memberRef,
// If the method has vararg parameters, then this needs to be a MemberRef whose parent is a reference to the method with the signature without any vararg parameters.
if (hasVarargParameters)
{
- var methodRef = new MemberReferenceEntity(memberRef.Parent, memberRef.Name, methodDefSig.Builder);
- ResolveAndRecordMemberReference(methodRef);
- // Only reparent the call-site MemberRef if the base method resolved to a MethodDef.
- // MemberRef is not a valid MemberRefParent in the coded index, so we can only
- // reparent when the inner ref resolved to MethodDef.
- if (methodRef.Handle.Kind == HandleKind.MethodDefinition)
+ var methodRef = new MemberReferenceEntity(memberRef.Parent, memberRef.Name, methodDefSig);
+ // Native ilasm only creates a MethodDef-parented MemberRef when the fixed
+ // signature resolves to a local method. Recording an unresolved helper
+ // MemberRef would create an unused row and shift every subsequent token.
+ if (TryResolveMethodReference(methodRef))
{
memberRef.SetMemberRefParent(methodRef);
}
@@ -1598,6 +1657,13 @@ public StandaloneSignatureEntity GetOrCreateStandaloneSignature(BlobBuilder sign
return GetOrCreateEntity(signature, TableIndex.StandAloneSig, _seenStandaloneSignatures, (sig) => new(sig), _ => { });
}
+ private StandaloneSignatureHandle GetOrCreateEmptyLocalsSignature()
+ {
+ BlobBuilder signature = new();
+ new BlobEncoder(signature).LocalVariableSignature(0);
+ return (StandaloneSignatureHandle)GetOrCreateStandaloneSignature(signature).Handle;
+ }
+
public DeclarativeSecurityAttributeEntity CreateDeclarativeSecurityAttribute(DeclarativeSecurityAction action, BlobBuilder permissionSet)
{
var entity = new DeclarativeSecurityAttributeEntity(action, permissionSet);
@@ -1614,7 +1680,12 @@ public CustomAttributeEntity CreateCustomAttribute(EntityBase constructor, BlobB
public static MethodImplementationEntity CreateUnrecordedMethodImplementation(MethodDefinitionEntity methodBody, MemberReferenceEntity methodDeclaration)
{
- return new MethodImplementationEntity(methodBody, methodDeclaration);
+ return new MethodImplementationEntity(methodBody.ContainingType, methodBody, methodDeclaration);
+ }
+
+ public static MethodImplementationEntity CreateUnrecordedMethodImplementation(TypeDefinitionEntity type, MemberReferenceEntity methodBody, MemberReferenceEntity methodDeclaration)
+ {
+ return new MethodImplementationEntity(type, methodBody, methodDeclaration);
}
public FileEntity GetOrCreateFile(string name, bool hasMetadata, BlobBuilder? hash)
@@ -1919,7 +1990,7 @@ public sealed class MethodDefinitionEntity(TypeDefinitionEntity containingType,
///
public List ExceptionRegions { get; } = new();
- public int MaxStack { get; set; }
+ public int MaxStack { get; set; } = 8;
public (ModuleReferenceEntity ModuleName, string? EntryPointName, MethodImportAttributes Attributes)? MethodImportInformation { get; set; }
public MethodImplAttributes ImplementationAttributes { get; set; }
@@ -2019,9 +2090,10 @@ public sealed class CustomAttributeEntity(EntityBase constructor, BlobBuilder va
public BlobBuilder Value { get; } = value;
}
- public sealed class MethodImplementationEntity(MethodDefinitionEntity methodBody, MemberReferenceEntity methodDeclaration) : EntityBase
+ public sealed class MethodImplementationEntity(TypeDefinitionEntity type, EntityBase methodBody, MemberReferenceEntity methodDeclaration) : EntityBase
{
- public MethodDefinitionEntity MethodBody { get; } = methodBody;
+ public TypeDefinitionEntity Type { get; } = type;
+ public EntityBase MethodBody { get; } = methodBody;
public MemberReferenceEntity MethodDeclaration { get; } = methodDeclaration;
}
@@ -2049,10 +2121,10 @@ public sealed class InterfaceImplementationEntity(TypeDefinitionEntity type, Typ
public TypeEntity InterfaceType { get; } = interfaceType;
}
- public sealed class EventEntity(EventAttributes attributes, TypeEntity type, string name) : EntityBase
+ public sealed class EventEntity(EventAttributes attributes, TypeEntity? type, string name) : EntityBase
{
public EventAttributes Attributes { get; } = attributes;
- public TypeEntity Type { get; } = type;
+ public TypeEntity? Type { get; } = type;
public string Name { get; } = name;
public List<(MethodSemanticsAttributes Semantic, EntityBase Method)> Accessors { get; } = new();
diff --git a/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs b/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs
index d71779f35a6557..7ca2a2c919023e 100644
--- a/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs
+++ b/src/tools/ilasm/src/ILAssembler/GrammarVisitor.cs
@@ -76,6 +76,7 @@ public Flag(T value, T groupMask)
#pragma warning disable CA1822 // Mark members as static
internal sealed class GrammarVisitor : ICILVisitor
{
+ private const int MaximumGenericParameterCount = ushort.MaxValue + 1;
private const string NodeShouldNeverBeDirectlyVisited = "This node should never be directly visited. It should be directly processed by its parent node.";
private readonly ImmutableArray.Builder _diagnostics = ImmutableArray.CreateBuilder();
private readonly EntityRegistry _entityRegistry = new();
@@ -83,11 +84,12 @@ internal sealed class GrammarVisitor : ICILVisitor
private readonly Options _options;
private readonly MetadataBuilder _metadataBuilder = new();
private readonly Func _resourceLocator;
+ private IReadOnlySet _parserErrorContexts = new HashSet();
// Record the mapped field data directly into the blob to ensure we preserve ordering
private readonly BlobBuilder _mappedFieldData = new();
private readonly Dictionary _mappedFieldDataNames = new();
- private readonly Dictionary> _mappedFieldDataReferenceFixups = new();
+ private readonly List _mappedFieldDataReferenceFixups = new();
private readonly BlobBuilder _manifestResources = new();
// Typedef aliases - maps alias name to the resolved entity
@@ -101,8 +103,9 @@ internal sealed class GrammarVisitor : ICILVisitor
private readonly Dictionary _documentHandles = new();
private readonly MetadataBuilder _pdbBuilder = new();
- // VTable fixup tracking - uses types from VTableFixupSupport
- private readonly List _vtableFixups = new();
+ private readonly List _vtableFixups = new();
+ private readonly Dictionary _exportDirectiveContexts = new();
+ private readonly Dictionary _vtableEntryDirectiveContexts = new();
public GrammarVisitor(IReadOnlyDictionary documents, Options options, Func resourceLocator)
{
@@ -110,6 +113,13 @@ public GrammarVisitor(IReadOnlyDictionary documents, Options
_options = options;
_resourceLocator = resourceLocator;
}
+
+ internal void BeginDocument(IReadOnlySet parserErrorContexts)
+ {
+ _currentDocumentPath = null;
+ _parserErrorContexts = parserErrorContexts;
+ }
+
///
/// Represents a typedef alias entry.
///
@@ -118,9 +128,36 @@ private abstract record TypedefEntry
public sealed record Type(EntityRegistry.TypeEntity Entity) : TypedefEntry;
public sealed record TypeBlob(BlobBuilder Blob) : TypedefEntry;
public sealed record Member(EntityRegistry.EntityBase Entity) : TypedefEntry;
- public sealed record CustomAttribute(EntityRegistry.EntityBase Constructor, BlobBuilder Value) : TypedefEntry;
+ public sealed record CustomAttribute(
+ EntityRegistry.EntityBase Constructor,
+ BlobBuilder Value,
+ EntityRegistry.EntityBase? Owner) : TypedefEntry;
}
+ private sealed record VTableFixupDeclaration(
+ VTableFixupSupport.VTableFixupEntry Entry,
+ CILParser.VtfixupDeclContext Context,
+ bool HasValidSlotCount);
+
+ private sealed record DataLabelReference(
+ string TargetLabel,
+ int DataOffset,
+ int PointerSize,
+ CILParser.DdItemContext Context);
+
+ private readonly record struct ValidatedVTableFixup(
+ int OriginalIndex,
+ VTableFixupSupport.VTableFixupEntry Entry,
+ int DataOffset);
+
+ private readonly record struct ValidatedVTableAssociation(
+ EntityRegistry.MethodDefinitionEntity Method,
+ int VTableEntryIndex);
+
+ private readonly record struct ValidatedExport(
+ EntityRegistry.MethodDefinitionEntity Method,
+ int VTableEntryIndex);
+
private void ReportDiagnostic(DiagnosticSeverity severity, string id, string message, Antlr4.Runtime.ParserRuleContext context)
{
var location = Location.From(context.Start, _documents);
@@ -130,6 +167,38 @@ private void ReportDiagnostic(DiagnosticSeverity severity, string id, string mes
private void ReportError(string id, string message, Antlr4.Runtime.ParserRuleContext context)
=> ReportDiagnostic(DiagnosticSeverity.Error, id, message, context);
+ private void ReportGenericParameterEncodingErrors(CILParser.TyparContext[] genericParameters)
+ {
+ if (genericParameters.Length <= MaximumGenericParameterCount)
+ {
+ return;
+ }
+
+ ReportError(
+ DiagnosticIds.TooManyGenericParameters,
+ string.Format(
+ DiagnosticMessageTemplates.TooManyGenericParameters,
+ genericParameters.Length,
+ MaximumGenericParameterCount),
+ genericParameters[MaximumGenericParameterCount]);
+
+ for (int i = MaximumGenericParameterCount; i < genericParameters.Length; i++)
+ {
+ if (genericParameters[i].tyBound() is not CILParser.TyBoundContext constraint)
+ {
+ continue;
+ }
+
+ ReportError(
+ DiagnosticIds.GenericParameterConstraintOwnerOutOfRange,
+ string.Format(
+ DiagnosticMessageTemplates.GenericParameterConstraintOwnerOutOfRange,
+ i,
+ ushort.MaxValue),
+ constraint);
+ }
+ }
+
private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleContext context)
=> ReportDiagnostic(DiagnosticSeverity.Warning, id, message, context);
@@ -149,6 +218,16 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
ApplyDebuggableAttribute();
}
+ Machine machine = VTableFixupSupport.GetEffectiveMachine(_options.Machine ?? Machine.I386);
+ ImmutableArray validatedVTableFixups =
+ ValidateVTableFixups(machine);
+ ImmutableArray validatedVTableAssociations =
+ ValidateVTableAssociations(validatedVTableFixups);
+ ImmutableArray validatedDataLabelFixups =
+ ValidateDataLabelFixups();
+ ImmutableArray validatedExports =
+ ValidateExports(validatedVTableAssociations, machine);
+
// Return early if there are structural errors that prevent building valid metadata.
// However, allow errors in method bodies (ILA0016-0019) to pass through so we can
// emit the assembly with the errors reported.
@@ -159,29 +238,17 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
return (_diagnostics.ToImmutable(), null);
}
- // Check for vtable fixups and exports - collect export info
- var exports = ImmutableArray.CreateBuilder();
- foreach (var entity in _entityRegistry.GetSeenEntities(TableIndex.MethodDef))
- {
- if (entity is EntityRegistry.MethodDefinitionEntity method && method.ExportOrdinal >= 0)
- {
- exports.Add(new VTableExportPEBuilder.ExportInfo(
- method.ExportOrdinal,
- method.ExportAlias ?? method.Name,
- MetadataTokens.GetToken(method.Handle),
- method.VTableEntry,
- method.VTableSlot));
- }
- }
-
BlobBuilder ilStream = new();
Blob mvidFixup = _entityRegistry.WriteContentTo(_metadataBuilder, ilStream, _mappedFieldDataNames, _options.Deterministic);
- MetadataRootBuilder rootBuilder = new(_metadataBuilder, _options.MetadataVersion);
-
- // Compute metadata size from the MetadataSizes
- // We need this for data label fixup RVA calculations
- var sizes = rootBuilder.Sizes;
- int metadataSize = ComputeMetadataSize(sizes);
+ // MetadataRootBuilder only supports module-wide validation suppression, which is
+ // required because wrapped GenericParam numbers intentionally violate table ordering.
+ bool suppressMetadataValidation =
+ _options.ErrorTolerant &&
+ _diagnostics.Any(diagnostic => diagnostic.Id == DiagnosticIds.TooManyGenericParameters);
+ MetadataRootBuilder rootBuilder = new(
+ _metadataBuilder,
+ _options.MetadataVersion,
+ suppressValidation: suppressMetadataValidation);
// Apply command-line overrides
Subsystem subsystem = _options.Subsystem ?? _subsystem;
@@ -189,14 +256,10 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
long imageBase = _options.ImageBase ?? _imageBase;
ushort majorSubsystemVersion = _options.SubsystemVersion?.Major ?? 4;
ushort minorSubsystemVersion = _options.SubsystemVersion?.Minor ?? 0;
- Machine machine = _options.Machine ?? Machine.I386;
- Characteristics imageCharacteristics = Characteristics.ExecutableImage |
- (machine is Machine.Amd64 or Machine.IA64 or Machine.Arm64 or Machine.LoongArch64 or Machine.RiscV64
- ? Characteristics.LargeAddressAware
- : Characteristics.Bit32Machine);
- if (_options.IsDll)
+
+ if (machine == Machine.ArmThumb2)
{
- imageCharacteristics |= Characteristics.Dll;
+ throw new PlatformNotSupportedException("ARM32 target images are not supported.");
}
// Build DllCharacteristics from options
@@ -214,6 +277,20 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
dllCharacteristics &= ~DllCharacteristics.DynamicBase;
}
+ Characteristics imageCharacteristics = Characteristics.ExecutableImage;
+ if (_options.Dll)
+ {
+ imageCharacteristics |= Characteristics.Dll;
+ }
+ if (machine == Machine.I386)
+ {
+ imageCharacteristics |= Characteristics.Bit32Machine;
+ }
+ else if (machine is Machine.Amd64 or Machine.IA64 or Machine.Arm64 or Machine.LoongArch64 or Machine.RiscV64)
+ {
+ imageCharacteristics |= Characteristics.LargeAddressAware;
+ }
+
// Compute stack reserve: command-line option overrides directive, which overrides default
ulong sizeOfStackReserve = (ulong)(_options.StackReserve ?? (_stackReserve != 0 ? _stackReserve : 0x00100000));
@@ -235,16 +312,23 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
}
// Build debug directory if we have any debug info
- DebugDirectoryBuilder? debugDirectoryBuilder = BuildDebugDirectory(entryPoint, out int debugDataSize);
+ DebugDirectoryBuilder? debugDirectoryBuilder = BuildDebugDirectory(entryPoint, out _);
Func, BlobContentId>? deterministicIdProvider = _options.Deterministic
? GetDeterministicContentId
: null;
// Use custom PE builder if we have vtable fixups, exports, or data label reference fixups
- if (_vtableFixups.Count > 0 || exports.Count > 0 || _mappedFieldDataReferenceFixups.Count > 0)
+ if (validatedVTableFixups.Length > 0 ||
+ validatedExports.Length > 0 ||
+ validatedDataLabelFixups.Length > 0)
{
- var vtableFixupInfos = BuildVTableFixupInfos();
+ ImmutableArray vtableFixupInfos =
+ BuildVTableFixupInfos(
+ validatedVTableFixups,
+ validatedVTableAssociations);
+ ImmutableArray exports =
+ BuildExportInfos(validatedExports);
// Apply CorFlags from options or directive
CorFlags corFlags = _options.CorFlags ?? _corflags;
@@ -264,11 +348,8 @@ private void ReportWarning(string id, string message, Antlr4.Runtime.ParserRuleC
flags: corFlags,
deterministicIdProvider: deterministicIdProvider,
vtableFixups: vtableFixupInfos,
- exports: exports.ToImmutable(),
- mappedFieldDataOffsets: _mappedFieldDataNames,
- dataLabelFixups: _mappedFieldDataReferenceFixups,
- metadataSize: metadataSize,
- debugDataSize: debugDataSize);
+ exports: exports,
+ dataLabelFixups: validatedDataLabelFixups);
return (_diagnostics.ToImmutable(), new CompilationResult(peBuilder, mvidFixup));
}
@@ -305,44 +386,346 @@ private static BlobContentId GetDeterministicContentId(IEnumerable content
return BlobContentId.FromHash(hash.GetHashAndReset());
}
- private ImmutableArray BuildVTableFixupInfos()
+ private ImmutableArray ValidateVTableFixups(Machine machine)
{
if (_vtableFixups.Count == 0)
- return ImmutableArray.Empty;
+ {
+ return ImmutableArray.Empty;
+ }
- var builder = ImmutableArray.CreateBuilder(_vtableFixups.Count);
+ var builder = ImmutableArray.CreateBuilder(_vtableFixups.Count);
- for (int entryIndex = 0; entryIndex < _vtableFixups.Count; entryIndex++)
+ for (int i = 0; i < _vtableFixups.Count; i++)
{
- var vtf = _vtableFixups[entryIndex];
- var methodTokens = ImmutableArray.CreateBuilder(vtf.SlotCount);
+ VTableFixupDeclaration declaration = _vtableFixups[i];
+ if (!declaration.HasValidSlotCount)
+ {
+ continue;
+ }
+
+ VTableFixupSupport.VTableFixupEntry entry = declaration.Entry;
+ const ushort WidthMask =
+ VTableFixupSupport.COR_VTABLE_32BIT |
+ VTableFixupSupport.COR_VTABLE_64BIT;
+ ushort width = (ushort)(entry.Flags & WidthMask);
+ ushort expectedWidth = VTableFixupSupport.GetPointerSize(machine) == sizeof(long)
+ ? VTableFixupSupport.COR_VTABLE_64BIT
+ : VTableFixupSupport.COR_VTABLE_32BIT;
+ if (width != expectedWidth)
+ {
+ ReportError(
+ DiagnosticIds.InvalidVTableWidth,
+ string.Format(
+ DiagnosticMessageTemplates.InvalidVTableWidth,
+ width,
+ machine,
+ expectedWidth == VTableFixupSupport.COR_VTABLE_64BIT
+ ? "int64"
+ : "int32"),
+ declaration.Context);
+ continue;
+ }
+
+ if (!_mappedFieldDataNames.TryGetValue(entry.DataLabel, out int dataOffset))
+ {
+ ReportError(
+ DiagnosticIds.LabelNotFound,
+ string.Format(DiagnosticMessageTemplates.LabelNotFound, entry.DataLabel),
+ declaration.Context.id());
+ continue;
+ }
- // Initialize with zeros
- for (int i = 0; i < vtf.SlotCount; i++)
+ int availableBytes = GetAvailableMappedFieldDataBytes(dataOffset);
+ int requiredBytes = checked(
+ entry.SlotCount * VTableFixupSupport.GetSlotSize(entry.Flags));
+ if (requiredBytes > availableBytes)
{
- methodTokens.Add(0);
+ ReportError(
+ DiagnosticIds.InsufficientVTableData,
+ string.Format(
+ DiagnosticMessageTemplates.InsufficientVTableData,
+ entry.DataLabel,
+ availableBytes,
+ requiredBytes),
+ declaration.Context.id());
+ continue;
}
- // Find methods that reference this vtable entry
- foreach (var entity in _entityRegistry.GetSeenEntities(TableIndex.MethodDef))
+ builder.Add(new ValidatedVTableFixup(i + 1, entry, dataOffset));
+ }
+
+ return builder.ToImmutable();
+ }
+
+ private int GetAvailableMappedFieldDataBytes(int dataOffset)
+ {
+ int endOffset = _mappedFieldData.Count;
+ foreach (int otherOffset in _mappedFieldDataNames.Values)
+ {
+ if (otherOffset > dataOffset && otherOffset < endOffset)
{
- if (entity is EntityRegistry.MethodDefinitionEntity method &&
- method.VTableEntry == entryIndex + 1 && // 1-based
- method.VTableSlot > 0 &&
- method.VTableSlot <= vtf.SlotCount)
+ endOffset = otherOffset;
+ }
+ }
+
+ return endOffset - dataOffset;
+ }
+
+ private ImmutableArray ValidateDataLabelFixups()
+ {
+ var builder =
+ ImmutableArray.CreateBuilder(
+ _mappedFieldDataReferenceFixups.Count);
+
+ foreach (DataLabelReference reference in _mappedFieldDataReferenceFixups)
+ {
+ if (!_mappedFieldDataNames.TryGetValue(reference.TargetLabel, out int targetOffset))
+ {
+ ReportError(
+ DiagnosticIds.LabelNotFound,
+ string.Format(
+ DiagnosticMessageTemplates.LabelNotFound,
+ reference.TargetLabel),
+ reference.Context);
+ continue;
+ }
+
+ builder.Add(new VTableExportPEBuilder.DataLabelFixup(
+ reference.DataOffset,
+ targetOffset,
+ reference.PointerSize));
+ }
+
+ return builder.ToImmutable();
+ }
+
+ private ImmutableArray ValidateVTableAssociations(
+ ImmutableArray validatedVTableFixups)
+ {
+ var fixupsByOriginalIndex = new Dictionary(
+ validatedVTableFixups.Length);
+ for (int i = 0; i < validatedVTableFixups.Length; i++)
+ {
+ fixupsByOriginalIndex.Add(
+ validatedVTableFixups[i].OriginalIndex,
+ (i + 1, validatedVTableFixups[i]));
+ }
+
+ var builder = ImmutableArray.CreateBuilder();
+ foreach (EntityRegistry.MethodDefinitionEntity method in GetParsedMethods())
+ {
+ if (!_vtableEntryDirectiveContexts.TryGetValue(method, out ParserRuleContext? context))
+ {
+ continue;
+ }
+
+ if (!fixupsByOriginalIndex.TryGetValue(
+ method.VTableEntry,
+ out (int SerializedIndex, ValidatedVTableFixup Fixup) fixup))
+ {
+ ReportError(
+ DiagnosticIds.InvalidVTableEntry,
+ string.Format(
+ DiagnosticMessageTemplates.InvalidVTableEntry,
+ method.Name,
+ method.VTableEntry),
+ context);
+ continue;
+ }
+
+ if (method.VTableSlot <= 0 || method.VTableSlot > fixup.Fixup.Entry.SlotCount)
+ {
+ ReportError(
+ DiagnosticIds.InvalidVTableEntry,
+ string.Format(
+ DiagnosticMessageTemplates.InvalidVTableSlot,
+ method.Name,
+ method.VTableSlot,
+ method.VTableEntry,
+ fixup.Fixup.Entry.SlotCount),
+ context);
+ continue;
+ }
+
+ builder.Add(new ValidatedVTableAssociation(method, fixup.SerializedIndex));
+ }
+
+ return builder.ToImmutable();
+ }
+
+ private ImmutableArray ValidateExports(
+ ImmutableArray validatedVTableAssociations,
+ Machine machine)
+ {
+ if (_vtableFixups.Count == 0)
+ {
+ return ImmutableArray.Empty;
+ }
+
+ var associationsByMethod =
+ new Dictionary(
+ validatedVTableAssociations.Length);
+ foreach (ValidatedVTableAssociation association in validatedVTableAssociations)
+ {
+ associationsByMethod.Add(association.Method, association);
+ }
+
+ var candidates = ImmutableArray.CreateBuilder();
+ foreach (EntityRegistry.MethodDefinitionEntity method in GetParsedMethods())
+ {
+ if (method.ExportOrdinal < 0)
+ {
+ continue;
+ }
+
+ ParserRuleContext context = _exportDirectiveContexts[method];
+ string exportName = method.ExportAlias ?? method.Name;
+ if (!VTableExportPEBuilder.IsExportMachineSupported(machine))
+ {
+ ReportError(
+ DiagnosticIds.UnsupportedNativeExportMachine,
+ string.Format(
+ DiagnosticMessageTemplates.UnsupportedNativeExportMachine,
+ machine),
+ context);
+ continue;
+ }
+
+ if (!associationsByMethod.TryGetValue(
+ method,
+ out ValidatedVTableAssociation association))
+ {
+ if (!_vtableEntryDirectiveContexts.ContainsKey(method))
{
- methodTokens[method.VTableSlot - 1] = MetadataTokens.GetToken(method.Handle);
+ ReportError(
+ DiagnosticIds.InvalidVTableExport,
+ string.Format(
+ DiagnosticMessageTemplates.InvalidVTableExport,
+ exportName),
+ context);
+ }
+
+ continue;
+ }
+
+ candidates.Add(new ValidatedExport(method, association.VTableEntryIndex));
+ }
+
+ if (candidates.Count == 0)
+ {
+ return ImmutableArray.Empty;
+ }
+
+ var exportsByOrdinal = new Dictionary();
+ var nonConflictingExports = ImmutableArray.CreateBuilder(candidates.Count);
+ foreach (ValidatedExport export in candidates)
+ {
+ if (exportsByOrdinal.TryGetValue(
+ export.Method.ExportOrdinal,
+ out ValidatedExport existingExport) &&
+ (existingExport.VTableEntryIndex != export.VTableEntryIndex ||
+ existingExport.Method.VTableSlot != export.Method.VTableSlot))
+ {
+ ReportError(
+ DiagnosticIds.DuplicateExportOrdinal,
+ string.Format(
+ DiagnosticMessageTemplates.DuplicateExportOrdinal,
+ export.Method.ExportAlias ?? export.Method.Name,
+ export.Method.ExportOrdinal),
+ _exportDirectiveContexts[export.Method]);
+ continue;
+ }
+
+ exportsByOrdinal.TryAdd(export.Method.ExportOrdinal, export);
+ nonConflictingExports.Add(export);
+ }
+
+ int baseOrdinal = nonConflictingExports.Min(export => export.Method.ExportOrdinal);
+ var validatedExports =
+ ImmutableArray.CreateBuilder(nonConflictingExports.Count);
+ foreach (ValidatedExport export in nonConflictingExports)
+ {
+ long ordinalIndex = (long)export.Method.ExportOrdinal - baseOrdinal;
+ if (ordinalIndex > ushort.MaxValue)
+ {
+ ReportError(
+ DiagnosticIds.ExportOrdinalRangeTooLarge,
+ string.Format(
+ DiagnosticMessageTemplates.ExportOrdinalRangeTooLarge,
+ export.Method.ExportOrdinal,
+ baseOrdinal,
+ ushort.MaxValue),
+ _exportDirectiveContexts[export.Method]);
+ continue;
+ }
+
+ validatedExports.Add(export);
+ }
+
+ return validatedExports.ToImmutable();
+ }
+
+ private ImmutableArray BuildVTableFixupInfos(
+ ImmutableArray validatedVTableFixups,
+ ImmutableArray validatedVTableAssociations)
+ {
+ var builder =
+ ImmutableArray.CreateBuilder(
+ validatedVTableFixups.Length);
+
+ for (int i = 0; i < validatedVTableFixups.Length; i++)
+ {
+ ValidatedVTableFixup fixup = validatedVTableFixups[i];
+ var methodTokens = ImmutableArray.CreateBuilder(fixup.Entry.SlotCount);
+ methodTokens.Count = fixup.Entry.SlotCount;
+
+ foreach (ValidatedVTableAssociation association in validatedVTableAssociations)
+ {
+ if (association.VTableEntryIndex == i + 1)
+ {
+ methodTokens[association.Method.VTableSlot - 1] =
+ MetadataTokens.GetToken(association.Method.Handle);
}
}
builder.Add(new VTableExportPEBuilder.VTableFixupInfo(
- vtf.DataLabel,
- vtf.SlotCount,
- vtf.Flags,
- methodTokens.ToImmutable()));
+ fixup.DataOffset,
+ fixup.Entry.SlotCount,
+ fixup.Entry.Flags,
+ methodTokens.MoveToImmutable()));
}
- return builder.ToImmutable();
+ return builder.MoveToImmutable();
+ }
+
+ private static ImmutableArray BuildExportInfos(
+ ImmutableArray validatedExports)
+ {
+ var builder =
+ ImmutableArray.CreateBuilder(
+ validatedExports.Length);
+
+ foreach (ValidatedExport export in validatedExports)
+ {
+ builder.Add(new VTableExportPEBuilder.ExportInfo(
+ export.Method.ExportOrdinal,
+ export.Method.ExportAlias ?? export.Method.Name,
+ export.VTableEntryIndex,
+ export.Method.VTableSlot));
+ }
+
+ return builder.MoveToImmutable();
+ }
+
+ private IEnumerable GetParsedMethods()
+ {
+ foreach (EntityRegistry.TypeDefinitionEntity type in _entityRegistry.GetSeenEntities(TableIndex.TypeDef))
+ {
+ foreach (EntityRegistry.MethodDefinitionEntity method in type.Methods)
+ {
+ yield return method;
+ }
+ }
}
private DebugDirectoryBuilder? BuildDebugDirectory(MethodDefinitionHandle entryPoint, out int debugDataSize)
@@ -468,8 +851,8 @@ private static BlobBuilder EncodeSequencePoints(List tree.Accept(this);
@@ -595,16 +977,26 @@ public GrammarResult VisitAsmOrRefDecl(CILParser.AsmOrRefDeclContext context)
if (context.customAttrDecl() is { } attr)
{
var customAttr = VisitCustomAttrDecl(attr).Value;
- customAttr?.Owner = _currentAssemblyOrRef;
+ if (customAttr is not null)
+ {
+ customAttr.Owner ??= _currentAssemblyOrRef;
+ }
return GrammarResult.SentinelValue.Result;
}
string decl = context.GetChild(0).GetText();
- if (decl == ".publicKey")
+ if (decl == ".publickey")
{
BlobBuilder blob = new();
blob.WriteBytes(VisitBytes(context.bytes()).Value);
- _currentAssemblyOrRef!.PublicKeyOrToken = blob;
+ // COMPAT: Native ilasm gives a public key token precedence regardless of declaration order.
+ if (_currentAssemblyOrRef is not EntityRegistry.AssemblyReferenceEntity assemblyReference
+ || assemblyReference.PublicKeyOrToken is null
+ || assemblyReference.Flags.HasFlag(AssemblyFlags.PublicKey))
+ {
+ _currentAssemblyOrRef!.PublicKeyOrToken = blob;
+ _currentAssemblyOrRef.Flags |= AssemblyFlags.PublicKey;
+ }
}
else if (decl == ".ver")
{
@@ -778,6 +1170,7 @@ public GrammarResult VisitAssemblyRefDecl(CILParser.AssemblyRefDeclContext conte
var blob = new BlobBuilder();
blob.WriteBytes(VisitBytes(context.bytes()).Value);
_currentAssemblyOrRef!.PublicKeyOrToken = blob;
+ _currentAssemblyOrRef.Flags &= ~AssemblyFlags.PublicKey;
}
return GrammarResult.SentinelValue.Result;
}
@@ -877,7 +1270,9 @@ public GrammarResult.Literal VisitCallConv(CILParser.CallConvContext conte
}
else if (context.EXPLICIT() is not null)
{
- return new((byte)(VisitCallConv(context.callConv()).Value | (byte)SignatureAttributes.ExplicitThis));
+ return new((byte)(
+ VisitCallConv(context.callConv()).Value |
+ (byte)(SignatureAttributes.ExplicitThis | SignatureAttributes.Instance)));
}
return new(0);
}
@@ -1087,19 +1482,49 @@ public CurrentMethodContext(EntityRegistry.MethodDefinitionEntity definition)
}
private CurrentMethodContext? _currentMethod;
+ private EntityRegistry.EntityBase? _pendingClassCustomAttributeOwner;
public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
+ bool isStandaloneCustomAttribute =
+ context.customAttrDecl().Length == 1 &&
+ context.PARAM() is null;
+ if (!isStandaloneCustomAttribute)
+ {
+ _pendingClassCustomAttributeOwner = null;
+ }
+
+ bool hasNestedDeclarations =
+ context.classHead() is not null
+ || context.methodHead() is not null;
+ if (!hasNestedDeclarations && ContainsParserError(context))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
if (context.classHead() is CILParser.ClassHeadContext classHead)
{
+ if (ContainsParserError(classHead)
+ || context.classDecls() is not CILParser.ClassDeclsContext classDecls)
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
_currentTypeDefinition.Push(VisitClassHead(classHead).Value);
- VisitClassDecls(context.classDecls());
+ VisitClassDecls(classDecls);
_currentTypeDefinition.Pop();
+ _pendingClassCustomAttributeOwner = null;
}
else if (context.methodHead() is CILParser.MethodHeadContext methodHead)
{
+ if (ContainsParserError(methodHead)
+ || context.methodDecls() is not CILParser.MethodDeclsContext methodDecls)
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
_currentMethod = new(VisitMethodHead(methodHead).Value);
- VisitMethodDecls(context.methodDecls());
+ VisitMethodDecls(methodDecls);
// Build the locals signature from parsed local variable declarations
if (_currentMethod.AllLocals.Count > 0)
{
@@ -1121,10 +1546,112 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
var declarativeSecurity = VisitSecDecl(secDecl).Value;
declarativeSecurity?.Parent = _currentTypeDefinition.PeekOrDefault();
}
+ else if (context.TYPE() is not null &&
+ context.typeSpec().Length == 1 &&
+ context.customDescr() is { } interfaceAttribute)
+ {
+ var currentType = _currentTypeDefinition.PeekOrDefault();
+ if (currentType is not null)
+ {
+ EntityRegistry.TypeEntity interfaceType = VisitTypeSpec(context.typeSpec()[0]).Value;
+ EntityRegistry.InterfaceImplementationEntity? implementation =
+ currentType.InterfaceImplementations.FirstOrDefault(
+ candidate => candidate.InterfaceType == interfaceType);
+ if (implementation is null)
+ {
+ implementation =
+ EntityRegistry.CreateUnrecordedInterfaceImplementation(currentType, interfaceType);
+ currentType.InterfaceImplementations.Add(implementation);
+ }
+
+ VisitCustomDescr(interfaceAttribute).Value.Owner = implementation;
+ }
+ }
else if (context.fieldDecl() is {} fieldDecl)
{
_ = VisitFieldDecl(fieldDecl);
}
+ else if (context.dataDecl() is { } dataDecl)
+ {
+ _ = VisitDataDecl(dataDecl);
+ }
+ else if (context.extSourceSpec() is { } extSourceSpec)
+ {
+ _ = VisitExtSourceSpec(extSourceSpec);
+ }
+ else if (context.languageDecl() is { } languageDecl)
+ {
+ _ = VisitLanguageDecl(languageDecl);
+ }
+ else if (context.OVERRIDE() is not null)
+ {
+ var currentType = _currentTypeDefinition.PeekOrDefault();
+ if (currentType is not null)
+ {
+ var typeSpecs = context.typeSpec();
+ var methodNames = context.methodName();
+ var callConventions = context.callConv();
+ var returnTypes = context.type();
+ var signatureArguments = context.sigArgs();
+ var genericArities = context.genArity();
+
+ int bodySignatureIndex = context.METHOD().Length == 0 ? 0 : 1;
+ BlobBuilder declarationSignature = BuildMethodReferenceSignature(
+ callConventions[0],
+ returnTypes[0],
+ signatureArguments[0],
+ genericArities.Length > 0 ? VisitGenArity(genericArities[0]).Value : 0);
+ BlobBuilder bodySignature = context.METHOD().Length == 0
+ ? declarationSignature
+ : BuildMethodReferenceSignature(
+ callConventions[bodySignatureIndex],
+ returnTypes[bodySignatureIndex],
+ signatureArguments[bodySignatureIndex],
+ genericArities.Length > bodySignatureIndex
+ ? VisitGenArity(genericArities[bodySignatureIndex]).Value
+ : 0);
+
+ EntityRegistry.TypeEntity bodyOwner = VisitTypeSpec(typeSpecs[1]).Value;
+ string bodyName = VisitMethodName(methodNames[1]).Value;
+ EntityRegistry.MemberReferenceEntity declaration =
+ _entityRegistry.CreateLazilyRecordedMemberReference(
+ VisitTypeSpec(typeSpecs[0]).Value,
+ VisitMethodName(methodNames[0]).Value,
+ declarationSignature);
+
+ if (ReferenceEquals(bodyOwner, currentType))
+ {
+ EntityRegistry.MethodDefinitionEntity[] bodyMethods = currentType.Methods
+ .Where(method =>
+ method.Name == bodyName &&
+ method.MethodSignature is not null &&
+ method.MethodSignature.ContentEquals(bodySignature))
+ .Take(2)
+ .ToArray();
+ if (bodyMethods.Length != 1)
+ {
+ ReportError(
+ DiagnosticIds.InvalidMetadataToken,
+ $"Override body method '{bodyName}' could not be resolved uniquely",
+ context);
+ return GrammarResult.SentinelValue.Result;
+ }
+
+ currentType.MethodImplementations.Add(
+ EntityRegistry.CreateUnrecordedMethodImplementation(bodyMethods[0], declaration));
+ }
+ else
+ {
+ EntityRegistry.MemberReferenceEntity body =
+ _entityRegistry.CreateLazilyRecordedMemberReference(
+ bodyOwner,
+ bodyName,
+ bodySignature);
+ currentType.MethodImplementations.Add(
+ EntityRegistry.CreateUnrecordedMethodImplementation(currentType, body, declaration));
+ }
+ }
+ }
else if (context.int32() is {} int32)
{
// .pack or .size
@@ -1157,7 +1684,7 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
var customAttr = VisitCustomAttrDecl(customAttrDecl).Value;
if (customAttr is not null)
{
- customAttr.Owner = property;
+ customAttr.Owner ??= property;
}
}
else if (VisitPropDecl(propDecl).Value is { } accessor)
@@ -1181,7 +1708,7 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
var customAttr = VisitCustomAttrDecl(customAttrDecl).Value;
if (customAttr is not null)
{
- customAttr.Owner = evt;
+ customAttr.Owner ??= evt;
}
}
else if (VisitEventDecl(eventDecl).Value is { } accessor)
@@ -1191,12 +1718,55 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
}
}
}
- else if (context.customAttrDecl().Length == 1 && context.PARAM() is null)
+ else if (context.OVERRIDE() is not null)
+ {
+ var currentType = _currentTypeDefinition.PeekOrDefault();
+ if (currentType is null)
+ {
+ throw new UnreachableException();
+ }
+
+ CILParser.CallConvContext[] callConvs = context.callConv();
+ CILParser.TypeContext[] returnTypes = context.type();
+ CILParser.TypeSpecContext[] owners = context.typeSpec();
+ CILParser.MethodNameContext[] methodNames = context.methodName();
+ CILParser.GenArityContext[] genericArities = context.genArity();
+ CILParser.SigArgsContext[] parameterLists = context.sigArgs();
+
+ EntityRegistry.MemberReferenceEntity declaration;
+ EntityRegistry.MemberReferenceEntity body;
+ if (callConvs.Length == 2)
+ {
+ declaration = CreateExplicitMethodReference(
+ callConvs[0], returnTypes[0], owners[0], methodNames[0], genericArities[0], parameterLists[0]);
+ body = CreateExplicitMethodReference(
+ callConvs[1], returnTypes[1], owners[1], methodNames[1], genericArities[1], parameterLists[1]);
+ }
+ else
+ {
+ EntityRegistry.TypeEntity declarationOwner = VisitTypeSpec(owners[0]).Value;
+ string declarationName = VisitMethodName(methodNames[0]).Value;
+ EntityRegistry.TypeEntity bodyOwner = VisitTypeSpec(owners[1]).Value;
+ string bodyName = VisitMethodName(methodNames[1]).Value;
+ BlobBuilder bodySignature = CreateExplicitMethodSignature(
+ callConvs[0], returnTypes[0], genericArity: null, parameterLists[0]);
+ BlobBuilder declarationSignature = new();
+ bodySignature.WriteContentTo(declarationSignature);
+ declaration = _entityRegistry.CreateLazilyRecordedMemberReference(
+ declarationOwner, declarationName, declarationSignature);
+ body = _entityRegistry.CreateLazilyRecordedMemberReference(
+ bodyOwner, bodyName, bodySignature);
+ }
+
+ currentType.MethodImplementations.Add(EntityRegistry.CreateUnrecordedMethodImplementation(currentType, body, declaration));
+ }
+ else if (isStandaloneCustomAttribute)
{
- // Custom attribute directly on the type
if (VisitCustomAttrDecl(context.customAttrDecl()[0]).Value is { } customAttr)
{
- customAttr.Owner = _currentTypeDefinition.PeekOrDefault();
+ customAttr.Owner ??=
+ _pendingClassCustomAttributeOwner ??
+ _currentTypeDefinition.PeekOrDefault();
}
}
else if (context.PARAM() is not null)
@@ -1213,6 +1783,13 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
param = currentType.GenericParameters[index];
}
+ else
+ {
+ ReportError(
+ DiagnosticIds.GenericParameterIndexOutOfRange,
+ string.Format(DiagnosticMessageTemplates.GenericParameterIndexOutOfRange, index),
+ context);
+ }
}
else if (context.dottedName() is { } dn)
{
@@ -1231,8 +1808,12 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
foreach (var attr in customAttrDeclarations ?? Array.Empty())
{
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
- customAttrDecl?.Owner = param;
+ if (customAttrDecl is not null)
+ {
+ customAttrDecl.Owner ??= param;
+ }
}
+ _pendingClassCustomAttributeOwner = param;
}
}
else if (currentType is not null && context.CONSTRAINT() is not null)
@@ -1245,6 +1826,13 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
param = currentType.GenericParameters[index];
}
+ else
+ {
+ ReportError(
+ DiagnosticIds.GenericParameterIndexOutOfRange,
+ string.Format(DiagnosticMessageTemplates.GenericParameterIndexOutOfRange, index),
+ context);
+ }
}
else if (context.dottedName() is { } dn)
{
@@ -1261,22 +1849,86 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
if (param is not null)
{
var baseType = VisitTypeSpec(context.typeSpec()[0]).Value;
- var constraint = new EntityRegistry.GenericParameterConstraintEntity(baseType);
- constraint.Owner = param;
- param.Constraints.Add(constraint);
- currentType.GenericParameterConstraints.Add(constraint);
+ EntityRegistry.GenericParameterConstraintEntity? constraint =
+ param.Constraints.FirstOrDefault(entity => entity.BaseType == baseType);
+ if (constraint is null)
+ {
+ constraint = EntityRegistry.CreateGenericConstraint(baseType);
+ constraint.Owner = param;
+ param.Constraints.Add(constraint);
+ currentType.GenericParameterConstraints.Add(constraint);
+ }
foreach (var attr in customAttrDeclarations ?? Array.Empty())
{
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
- customAttrDecl?.Owner = constraint;
+ if (customAttrDecl is not null)
+ {
+ customAttrDecl.Owner ??= constraint;
+ }
}
+ _pendingClassCustomAttributeOwner = constraint;
}
}
}
return GrammarResult.SentinelValue.Result;
}
- public GrammarResult VisitClassDecls(CILParser.ClassDeclsContext context) => VisitChildren(context);
+
+ private BlobBuilder BuildMethodReferenceSignature(
+ CILParser.CallConvContext callConvention,
+ CILParser.TypeContext returnType,
+ CILParser.SigArgsContext signatureArguments,
+ int genericArity)
+ {
+ var signature = new BlobBuilder();
+ byte header = VisitCallConv(callConvention).Value;
+ if (genericArity > 0)
+ {
+ header |= (byte)SignatureAttributes.Generic;
+ }
+
+ signature.WriteByte(header);
+ if (genericArity > 0)
+ {
+ signature.WriteCompressedInteger(genericArity);
+ }
+
+ ImmutableArray arguments = VisitSigArgs(signatureArguments).Value;
+ signature.WriteCompressedInteger(arguments.Count(argument => !argument.IsSentinel));
+ VisitType(returnType).Value.WriteContentTo(signature);
+ foreach (SignatureArg argument in arguments)
+ {
+ argument.SignatureBlob.WriteContentTo(signature);
+ }
+
+ return signature;
+ }
+
+ public GrammarResult VisitClassDecls(CILParser.ClassDeclsContext context)
+ {
+ CILParser.ClassDeclContext[] declarations = context.classDecl();
+ foreach (CILParser.ClassDeclContext declaration in declarations)
+ {
+ if (declaration.OVERRIDE() is null)
+ {
+ VisitClassDecl(declaration);
+ }
+ else
+ {
+ _pendingClassCustomAttributeOwner = null;
+ }
+ }
+
+ foreach (CILParser.ClassDeclContext declaration in declarations)
+ {
+ if (declaration.OVERRIDE() is not null)
+ {
+ VisitClassDecl(declaration);
+ }
+ }
+
+ return GrammarResult.SentinelValue.Result;
+ }
GrammarResult ICILVisitor.VisitClassHead(CILParser.ClassHeadContext context) => VisitClassHead(context);
@@ -1361,12 +2013,7 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
// Two-pass generic parameter processing:
// Pass 1: Register all parameter names (without resolving constraints)
var typarContexts = context.typarsClause()?.typars()?.typar() ?? Array.Empty();
- if (typarContexts.Length > ushort.MaxValue)
- {
- ReportError(DiagnosticIds.TooManyGenericParameters,
- string.Format(DiagnosticMessageTemplates.TooManyGenericParameters, typarContexts.Length, ushort.MaxValue),
- context.typarsClause());
- }
+ ReportGenericParameterEncodingErrors(typarContexts);
for (int i = 0; i < typarContexts.Length; i++)
{
var attributes = VisitTyparAttribs(typarContexts[i].typarAttribs()).Value;
@@ -1450,12 +2097,7 @@ public GrammarResult VisitClassDecl(CILParser.ClassDeclContext context)
{
// Two-pass generic parameter processing for forward-referenced types
var typarContexts = context.typarsClause()?.typars()?.typar() ?? Array.Empty();
- if (typarContexts.Length > ushort.MaxValue)
- {
- ReportError(DiagnosticIds.TooManyGenericParameters,
- string.Format(DiagnosticMessageTemplates.TooManyGenericParameters, typarContexts.Length, ushort.MaxValue),
- context.typarsClause());
- }
+ ReportGenericParameterEncodingErrors(typarContexts);
for (int i = 0; i < typarContexts.Length; i++)
{
var attributes = VisitTyparAttribs(typarContexts[i].typarAttribs()).Value;
@@ -1650,11 +2292,10 @@ EntityRegistry.TypeEntity ResolveTypeDef()
GrammarResult ICILVisitor.VisitClassSeq(CILParser.ClassSeqContext context) => VisitClassSeq(context);
public GrammarResult.FormattedBlob VisitClassSeq(CILParser.ClassSeqContext context)
{
- // We're going to add all of the elements in the sequence as prefix blobs to this blob.
BlobBuilder objSeqBlob = new(0);
foreach (var item in context.classSeqElement())
{
- objSeqBlob.LinkPrefix(VisitClassSeqElement(item).Value);
+ objSeqBlob.LinkSuffix(VisitClassSeqElement(item).Value);
}
return new(objSeqBlob);
}
@@ -1677,7 +2318,10 @@ public GrammarResult.FormattedBlob VisitClassSeqElement(CILParser.ClassSeqElemen
return new(blob);
}
- blob.WriteSerializedString(context.SQSTRING()?.Symbol.Text);
+ blob.WriteSerializedString(
+ context.SQSTRING() is { } stringNode
+ ? StringHelpers.ParseQuotedString(stringNode.Symbol.Text)
+ : null);
return new(blob);
}
public GrammarResult VisitCompControl(CILParser.CompControlContext context)
@@ -1709,6 +2353,11 @@ private static GrammarResult.String VisitCompQstring(CILParser.CompQstringContex
GrammarResult ICILVisitor.VisitCustomAttrDecl(CILParser.CustomAttrDeclContext context) => VisitCustomAttrDecl(context);
public GrammarResult.Literal VisitCustomAttrDecl(CILParser.CustomAttrDeclContext context)
{
+ if (ContainsParserError(context))
+ {
+ return new(null);
+ }
+
if (context.dottedName() is { } dottedName)
{
// This is a typedef reference for a custom attribute
@@ -1716,7 +2365,10 @@ private static GrammarResult.String VisitCompQstring(CILParser.CompQstringContex
var resolved = TryResolveTypedefAsCustomAttribute(alias);
if (resolved is not null)
{
- return new(_entityRegistry.CreateCustomAttribute(resolved.Value.Constructor, resolved.Value.Value));
+ EntityRegistry.CustomAttributeEntity attribute =
+ _entityRegistry.CreateCustomAttribute(resolved.Value.Constructor, resolved.Value.Value);
+ attribute.Owner = resolved.Value.Owner;
+ return new(attribute);
}
// Typedef not found - could report diagnostic here
return new(null);
@@ -1828,7 +2480,9 @@ public GrammarResult.FormattedBlob VisitCustomBlobNVPairs(CILParser.CustomBlobNV
}
else
{
- throw new UnreachableException();
+ value = new();
+ value.WriteUInt16(CustomAttributeBlobFormatVersion);
+ value.WriteUInt16(0);
}
return new(_entityRegistry.CreateCustomAttribute(ctor, value));
@@ -1857,7 +2511,9 @@ public GrammarResult.FormattedBlob VisitCustomBlobNVPairs(CILParser.CustomBlobNV
}
else
{
- throw new UnreachableException();
+ value = new();
+ value.WriteUInt16(CustomAttributeBlobFormatVersion);
+ value.WriteUInt16(0);
}
var attr = _entityRegistry.CreateCustomAttribute(ctor, value);
@@ -1872,6 +2528,11 @@ public GrammarResult.FormattedBlob VisitCustomBlobNVPairs(CILParser.CustomBlobNV
public GrammarResult VisitDataDecl(CILParser.DataDeclContext context)
{
+ if (ContainsParserError(context))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
_ = VisitDdHead(context.ddHead());
_ = VisitDdBody(context.ddBody());
return GrammarResult.SentinelValue.Result;
@@ -1914,16 +2575,15 @@ public GrammarResult VisitDdItem(CILParser.DdItemContext context)
}
else if (context.id() is CILParser.IdContext id)
{
- // Reference to another data label - this will be patched with the target's RVA
- // during PE serialization by VTableExportPEBuilder.ApplyDataLabelFixups()
string name = VisitId(id).Value;
- if (!_mappedFieldDataReferenceFixups.TryGetValue(name, out var fixups))
- {
- _mappedFieldDataReferenceFixups[name] = fixups = new();
- }
-
- // Reserve 4 bytes for the RVA that will be patched later
- fixups.Add(_mappedFieldData.ReserveBytes(4));
+ int pointerSize = VTableFixupSupport.GetPointerSize(
+ _options.Machine ?? Machine.I386);
+ _mappedFieldDataReferenceFixups.Add(new DataLabelReference(
+ name,
+ _mappedFieldData.Count,
+ pointerSize,
+ context));
+ _mappedFieldData.ReserveBytes(pointerSize);
return GrammarResult.SentinelValue.Result;
}
else if (context.bytes() is CILParser.BytesContext bytes)
@@ -1992,26 +2652,67 @@ public GrammarResult VisitDdItemList(CILParser.DdItemListContext context)
public GrammarResult VisitDecl(CILParser.DeclContext context)
{
+ if (context.fieldDecl() is null && context.customAttrDecl() is null)
+ {
+ _pendingClassCustomAttributeOwner = null;
+ }
+
+ bool hasNestedDeclarations =
+ context.nameSpaceHead() is not null
+ || context.classHead() is not null
+ || context.methodHead() is not null;
+ if (!hasNestedDeclarations && ContainsParserError(context))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
if (context.nameSpaceHead() is CILParser.NameSpaceHeadContext ns)
{
+ if (ContainsParserError(ns))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
string namespaceName = VisitNameSpaceHead(ns).Value;
string? outer = _currentNamespace.PeekOrDefault();
_currentNamespace.Push(string.IsNullOrEmpty(outer) ? namespaceName : $"{outer}.{namespaceName}");
VisitDecls(context.decls());
_currentNamespace.Pop();
+ _pendingClassCustomAttributeOwner = null;
return GrammarResult.SentinelValue.Result;
}
if (context.classHead() is CILParser.ClassHeadContext classHead)
{
+ if (ContainsParserError(classHead))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
+ if (context.classDecls() is not CILParser.ClassDeclsContext classDecls)
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
_currentTypeDefinition.Push(VisitClassHead(classHead).Value);
- VisitClassDecls(context.classDecls());
+ VisitClassDecls(classDecls);
_currentTypeDefinition.Pop();
+ _pendingClassCustomAttributeOwner = null;
return GrammarResult.SentinelValue.Result;
}
if (context.methodHead() is CILParser.MethodHeadContext methodHead)
{
+ if (ContainsParserError(methodHead))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
+ if (context.methodDecls() is not CILParser.MethodDeclsContext methodDecls)
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
_currentMethod = new(VisitMethodHead(methodHead).Value);
- VisitMethodDecls(context.methodDecls());
+ VisitMethodDecls(methodDecls);
if (_currentMethod.AllLocals.Count > 0)
{
var localsSig = new BlobBuilder();
@@ -2091,7 +2792,7 @@ public GrammarResult VisitDecl(CILParser.DeclContext context)
});
foreach (var attr in customAttrs)
{
- attr.Owner = exp;
+ attr.Owner ??= exp;
}
return GrammarResult.SentinelValue.Result;
}
@@ -2121,7 +2822,7 @@ public GrammarResult VisitDecl(CILParser.DeclContext context)
res.Implementation = implementation;
foreach (var attr in attrs)
{
- attr.Owner = res;
+ attr.Owner ??= res;
}
return GrammarResult.SentinelValue.Result;
}
@@ -2171,7 +2872,7 @@ public GrammarResult VisitDecl(CILParser.DeclContext context)
// Top-level custom attribute owned by the module (matching native ilasm behavior)
if (VisitCustomAttrDecl(topLevelCustomAttr).Value is { } customAttr)
{
- customAttr.Owner = _entityRegistry.Module;
+ customAttr.Owner ??= (EntityRegistry.EntityBase?)_pendingClassCustomAttributeOwner ?? _entityRegistry.Module;
}
}
if (context.secDecl() is { } topSecDecl)
@@ -2468,7 +3169,10 @@ public GrammarResult.Flag VisitEventAttr(CILParser.EventAttrCon
{
string name = VisitDottedName(context.dottedName()).Value;
EventAttributes eventAttributes = context.eventAttr().Select(attr => VisitEventAttr(attr).Value).Aggregate((EventAttributes)0, (a, b) => a | b);
- return new(new EntityRegistry.EventEntity(eventAttributes, VisitTypeSpec(context.typeSpec()).Value, name));
+ EntityRegistry.TypeEntity? eventType = context.typeSpec() is { } typeSpec
+ ? VisitTypeSpec(typeSpec).Value
+ : null;
+ return new(new EntityRegistry.EventEntity(eventAttributes, eventType, name));
}
public GrammarResult VisitExportHead(CILParser.ExportHeadContext context) => throw new NotImplementedException("Obsolete syntax");
@@ -2707,13 +3411,36 @@ public GrammarResult VisitExtSourceSpec(CILParser.ExtSourceSpecContext context)
// 0xFEEFEE indicates a hidden sequence point
if (startLine == 0xFEEFEE)
{
- _currentMethod.Definition.DebugInfo.SequencePoints.Add(
- EntityRegistry.SequencePoint.Hidden(ilOffset));
+ AddSequencePoint(EntityRegistry.SequencePoint.Hidden(ilOffset));
}
else
{
- _currentMethod.Definition.DebugInfo.SequencePoints.Add(
- new EntityRegistry.SequencePoint(ilOffset, startLine, startColumn, endLine, endColumn));
+ if (endLine == startLine && endColumn == startColumn)
+ {
+ endColumn++;
+ }
+
+ AddSequencePoint(
+ new EntityRegistry.SequencePoint(
+ ilOffset,
+ startLine,
+ startColumn,
+ endLine,
+ endColumn));
+ }
+
+ void AddSequencePoint(EntityRegistry.SequencePoint sequencePoint)
+ {
+ List sequencePoints =
+ _currentMethod.Definition.DebugInfo.SequencePoints;
+ if (sequencePoints.Count > 0 && sequencePoints[^1].ILOffset == ilOffset)
+ {
+ sequencePoints[^1] = sequencePoint;
+ }
+ else
+ {
+ sequencePoints.Add(sequencePoint);
+ }
}
}
@@ -2723,9 +3450,9 @@ public GrammarResult VisitExtSourceSpec(CILParser.ExtSourceSpecContext context)
GrammarResult ICILVisitor.VisitF32seq(CILParser.F32seqContext context) => VisitF32seq(context);
public GrammarResult.FormattedBlob VisitF32seq(CILParser.F32seqContext context)
{
- var builder = ImmutableArray.CreateBuilder();
+ var builder = ImmutableArray.CreateBuilder(context.ChildCount);
- foreach (var item in context.children)
+ foreach (var item in context.children ?? [])
{
builder.Add((float)(item switch
{
@@ -2739,9 +3466,9 @@ public GrammarResult.FormattedBlob VisitF32seq(CILParser.F32seqContext context)
GrammarResult ICILVisitor.VisitF64seq(CILParser.F64seqContext context) => VisitF64seq(context);
public GrammarResult.FormattedBlob VisitF64seq(CILParser.F64seqContext context)
{
- var builder = ImmutableArray.CreateBuilder();
+ var builder = ImmutableArray.CreateBuilder(context.ChildCount);
- foreach (var item in context.children)
+ foreach (var item in context.children ?? [])
{
builder.Add((double)(item switch
{
@@ -2787,6 +3514,11 @@ public GrammarResult.Flag VisitFieldAttr(CILParser.FieldAttrCon
GrammarResult ICILVisitor.VisitFieldDecl(CILParser.FieldDeclContext context) => VisitFieldDecl(context);
public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
{
+ if (ContainsParserError(context))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
var fieldAttrs = context.fieldAttr().Select(VisitFieldAttr).Aggregate((FieldAttributes)0, (a, b) => a | b);
// COMPAT: Native ilasm implicitly adds SpecialName when RTSpecialName is set
if (fieldAttrs.HasFlag(FieldAttributes.RTSpecialName))
@@ -2796,7 +3528,7 @@ public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
var fieldType = VisitType(context.type()).Value;
var marshalBlobs = context.marshalBlob();
var marshalBlob = marshalBlobs.Length > 0 ? VisitMarshalBlob(marshalBlobs[marshalBlobs.Length - 1]).Value : null;
- var name = VisitDottedName(context.dottedName()).Value;
+ string name = VisitDottedName(context.dottedName()).Value;
var rvaOffset = VisitAtOpt(context.atOpt()).Value;
var fieldOffset = VisitRepeatOpt(context.repeatOpt()).Value;
var constantValue = VisitInitOpt(context.initOpt()).Value;
@@ -2806,6 +3538,7 @@ public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
fieldType.WriteContentTo(signature.Builder);
var field = EntityRegistry.CreateUnrecordedFieldDefinition(fieldAttrs, _currentTypeDefinition.PeekOrDefault() ?? _entityRegistry.ModuleType, name, signature.Builder);
+ _pendingClassCustomAttributeOwner = field;
if (field is not null)
{
@@ -2947,13 +3680,13 @@ public GrammarResult VisitFieldDecl(CILParser.FieldDeclContext context)
}
var fieldTypeSig = VisitType(type).Value;
- EntityRegistry.TypeEntity definingType = _currentTypeDefinition.PeekOrDefault() ?? _entityRegistry.ModuleType;
+ EntityRegistry.TypeEntity definingType = _entityRegistry.ModuleType;
if (context.typeSpec() is CILParser.TypeSpecContext typeSpec)
{
definingType = VisitTypeSpec(typeSpec).Value;
}
- var name = VisitDottedName(context.dottedName()).Value;
+ string name = VisitDottedName(context.dottedName()).Value;
var fieldSig = new BlobBuilder(fieldTypeSig.Count + 1);
fieldSig.WriteByte((byte)SignatureKind.Field);
@@ -2980,7 +3713,13 @@ public GrammarResult.FormattedBlob VisitFieldSerInit(CILParser.FieldSerInitConte
}
builder = new BlobBuilder(CommonMaxBlobLength);
- int tokenType = ((ITerminalNode)context.GetChild(0)).Symbol.Type;
+ if (ContainsParserError(context)
+ || context.GetChild(0) is not ITerminalNode typeNode)
+ {
+ return new(builder);
+ }
+
+ int tokenType = typeNode.Symbol.Type;
builder.WriteByte((byte)GetTypeCodeForToken(tokenType));
@@ -3010,7 +3749,18 @@ public GrammarResult.FormattedBlob VisitFieldSerInit(CILParser.FieldSerInitConte
{
if (context.float64() is CILParser.Float64Context float64)
{
- builder.WriteSingle((float)VisitFloat64(float64).Value);
+ string text = float64.GetText();
+ if (!text.Contains('.') &&
+ text.IndexOf('e') < 0 &&
+ text.IndexOf('E') < 0 &&
+ ParseIntegerValue(text.AsSpan(), out long rawValue))
+ {
+ builder.WriteSingle(BitConverter.Int32BitsToSingle((int)rawValue));
+ }
+ else
+ {
+ builder.WriteSingle((float)VisitFloat64(float64).Value);
+ }
}
if (context.int32() is CILParser.Int32Context int32)
{
@@ -3019,11 +3769,22 @@ public GrammarResult.FormattedBlob VisitFieldSerInit(CILParser.FieldSerInitConte
}
break;
}
- case CILParser.FLOAT64:
+ case CILParser.FLOAT64_:
{
if (context.float64() is CILParser.Float64Context float64)
{
- builder.WriteDouble(VisitFloat64(float64).Value);
+ string text = float64.GetText();
+ if (!text.Contains('.') &&
+ text.IndexOf('e') < 0 &&
+ text.IndexOf('E') < 0 &&
+ ParseIntegerValue(text.AsSpan(), out long rawValue))
+ {
+ builder.WriteDouble(BitConverter.Int64BitsToDouble(rawValue));
+ }
+ else
+ {
+ builder.WriteDouble(VisitFloat64(float64).Value);
+ }
}
if (context.int64() is CILParser.Int64Context int64)
{
@@ -3048,8 +3809,8 @@ public GrammarResult.Literal VisitFileAttr(CILParser.FileAttrContext conte
var hashBlob = hash is not null ? new BlobBuilder() : null;
hashBlob?.WriteBytes(hash!.Value);
- bool hasMetadata = context.fileAttr().Aggregate(true, (acc, attr) => acc || VisitFileAttr(attr).Value);
- bool isEntrypoint = context.fileEntry().Aggregate(true, (acc, attr) => acc || VisitFileEntry(attr).Value);
+ bool hasMetadata = context.fileAttr().Aggregate(true, (acc, attr) => acc && VisitFileAttr(attr).Value);
+ bool isEntrypoint = context.fileEntry().Aggregate(false, (acc, attr) => acc || VisitFileEntry(attr).Value);
var entity = _entityRegistry.GetOrCreateFile(dottedName, hasMetadata, hashBlob);
if (isEntrypoint)
{
@@ -3102,11 +3863,21 @@ public GrammarResult.Literal VisitFloat64(CILParser.Float64Context conte
}
else if (context.int32() is CILParser.Int32Context int32)
{
- int intValue = VisitInt32(int32).Value;
+ IToken node = int32.INT32().Symbol;
+ if (!ParseIntegerValue(node.Text.AsSpan(), out long intValue))
+ {
+ _diagnostics.Add(new Diagnostic(
+ DiagnosticIds.LiteralOutOfRange,
+ DiagnosticSeverity.Error,
+ string.Format(DiagnosticMessageTemplates.LiteralOutOfRange, node.Text),
+ Location.From(node, _documents)));
+ intValue = 0;
+ }
+
if (context.FLOAT32() is not null)
{
// FLOAT32 '(' int32 ')': hex bits reinterpreted as float32
- return new(BitConverter.Int32BitsToSingle(intValue));
+ return new(BitConverter.Int32BitsToSingle((int)intValue));
}
// int32 or int32 '.': plain integer or trailing-dot float
return new((double)intValue);
@@ -3310,6 +4081,11 @@ private NoConstantSentinel() { }
public GrammarResult VisitInstr(CILParser.InstrContext context)
{
+ if (ContainsParserError(context))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
var instrContext = context.GetRuleContext(0);
ILOpCode opcode = ((GrammarResult.Literal)instrContext.Accept(this)).Value;
switch (instrContext.RuleIndex)
@@ -3335,9 +4111,15 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
if (argument is CILParser.Int32Context int32)
{
int offset = VisitInt32(int32).Value;
- LabelHandle label = _currentMethod!.Definition.MethodBody.DefineLabel();
- _currentMethod.Definition.MethodBody.Branch(opcode, label);
- _currentMethod.Definition.MethodBody.MarkLabel(label, _currentMethod.Definition.MethodBody.Offset + offset);
+ _currentMethod!.Definition.MethodBody.OpCode(opcode);
+ if (opcode.GetBranchOperandSize() == 1)
+ {
+ _currentMethod.Definition.MethodBody.CodeBuilder.WriteSByte(unchecked((sbyte)offset));
+ }
+ else
+ {
+ _currentMethod.Definition.MethodBody.CodeBuilder.WriteInt32(offset);
+ }
}
}
break;
@@ -3425,7 +4207,7 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
else if (argument is CILParser.Int64Context int64)
{
long intValue = VisitInt64(int64).Value;
- value = BitConverter.Int64BitsToDouble(intValue);
+ value = intValue;
}
else if (argument is CILParser.BytesContext bytesContext)
{
@@ -3460,11 +4242,12 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
break;
case CILParser.RULE_instr_sig:
{
+ Debug.Assert(opcode == ILOpCode.Calli);
BlobBuilder signature = new();
byte callConv = VisitCallConv(context.callConv()).Value;
signature.WriteByte(callConv);
var args = VisitSigArgs(context.sigArgs()).Value;
- signature.WriteCompressedInteger(args.Length);
+ signature.WriteCompressedInteger(args.Count(arg => !arg.IsSentinel));
// Write return type
VisitType(context.type()).Value.WriteContentTo(signature);
// Write arg signatures
@@ -3472,6 +4255,7 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
{
arg.SignatureBlob.WriteContentTo(signature);
}
+ _currentMethod!.Definition.MethodBody.OpCode(opcode);
_currentMethod!.Definition.MethodBody.Token(_entityRegistry.GetOrCreateStandaloneSignature(signature).Handle);
}
break;
@@ -3503,7 +4287,7 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
// so we can emit this as UTF-8 bytes.
int byteCount = Encoding.UTF8.GetByteCount(str);
// Ensure we have an even number of bytes.
- if ((byteCount % 1) != 0)
+ if ((byteCount % 2) != 0)
{
byteCount++;
}
@@ -3571,12 +4355,22 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
}
break;
case CILParser.RULE_instr_tok:
- var tok = VisitOwnerType(context.ownerType()).Value;
_currentMethod!.Definition.MethodBody.OpCode(opcode);
+ if (context.int32() is { } tokenValue)
+ {
+ _currentMethod.Definition.MethodBody.CodeBuilder.WriteInt32(VisitInt32(tokenValue).Value);
+ break;
+ }
+
+ var tok = VisitOwnerType(context.ownerType()).Value;
if (tok is EntityRegistry.TypeReferenceEntity tokTypeRef)
{
tokTypeRef.RecordBlobToWriteResolvedToken(_currentMethod.Definition.MethodBody.CodeBuilder.ReserveBytes(4));
}
+ else if (tok is EntityRegistry.MemberReferenceEntity tokMemberRef)
+ {
+ tokMemberRef.RecordBlobToWriteResolvedHandle(_currentMethod.Definition.MethodBody.CodeBuilder.ReserveBytes(4));
+ }
else
{
_currentMethod.Definition.MethodBody.Token(tok.Handle);
@@ -3685,6 +4479,12 @@ public GrammarResult VisitInstr(CILParser.InstrContext context)
private static ILOpCode ParseOpCodeFromToken(IToken token)
{
string text = token.Text.TrimEnd('.');
+ if (text == "unused")
+ {
+ // Native ilasm's keyword index uses the last matching opcode.def entry, CEE_UNUSED70.
+ return ILOpCode.Unused;
+ }
+
string normalized = text.Replace('.', '_');
// Handle instruction aliases that don't directly map to ILOpCode enum names
@@ -3895,11 +4695,7 @@ public GrammarResult VisitLanguageDecl(CILParser.LanguageDeclContext context)
GrammarResult ICILVisitor.VisitLanguageString(CILParser.LanguageStringContext context) => VisitLanguageString(context);
public GrammarResult.String VisitLanguageString(CILParser.LanguageStringContext context)
{
- if (context.SQSTRING() is not null)
- {
- return new(StringHelpers.ParseQuotedString(context.SQSTRING().GetText()));
- }
- return new(StringHelpers.ParseQuotedString(context.QSTRING().GetText()));
+ return new(StringHelpers.ParseQuotedString(context.SQSTRING().GetText()));
}
public GrammarResult VisitManifestResDecl(CILParser.ManifestResDeclContext context) => throw new UnreachableException(NodeShouldNeverBeDirectlyVisited);
@@ -3973,6 +4769,11 @@ public GrammarResult.Flag VisitManresAttr(CILParser.
GrammarResult ICILVisitor.VisitMarshalBlob(CILParser.MarshalBlobContext context) => VisitMarshalBlob(context);
public GrammarResult.FormattedBlob VisitMarshalBlob(CILParser.MarshalBlobContext context)
{
+ if (ContainsParserError(context))
+ {
+ return new(new BlobBuilder());
+ }
+
var hexBytes = context.hexbyte();
if (hexBytes.Length > 0)
{
@@ -3984,7 +4785,9 @@ public GrammarResult.FormattedBlob VisitMarshalBlob(CILParser.MarshalBlobContext
return new(blob);
}
- return VisitNativeType(context.nativeType());
+ return context.nativeType() is CILParser.NativeTypeContext nativeType
+ ? VisitNativeType(nativeType)
+ : new(new BlobBuilder());
}
GrammarResult ICILVisitor.VisitMarshalClause(CILParser.MarshalClauseContext context) => VisitMarshalClause(context);
@@ -4060,6 +4863,11 @@ public GrammarResult VisitMethodDecl(CILParser.MethodDeclContext context)
Debug.Assert(_currentMethod is not null);
var currentMethod = _currentMethod!;
+ if (ContainsParserError(context))
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
if (context.EMITBYTE() is not null)
{
currentMethod.Definition.MethodBody.CodeBuilder.WriteByte((byte)VisitInt32(context.GetChild(0)).Value);
@@ -4126,20 +4934,50 @@ public GrammarResult VisitMethodDecl(CILParser.MethodDeclContext context)
else if (context.EXPORT() is not null)
{
// .export [ordinal] or .export [ordinal] as alias
+ currentMethod.Definition.ExportOrdinal = -1;
+ currentMethod.Definition.ExportAlias = null;
+ _exportDirectiveContexts.Remove(currentMethod.Definition);
+
+ int diagnosticCount = _diagnostics.Count;
int ordinal = VisitInt32(context.int32()[0]).Value;
string? alias = context.id() is { } aliasId ? VisitId(aliasId).Value : null;
+ if (_diagnostics.Count != diagnosticCount)
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
+
+ if (ordinal <= 0)
+ {
+ ReportError(
+ DiagnosticIds.InvalidExportOrdinal,
+ string.Format(DiagnosticMessageTemplates.InvalidExportOrdinal, ordinal),
+ context);
+ return GrammarResult.SentinelValue.Result;
+ }
+
currentMethod.Definition.ExportOrdinal = ordinal;
currentMethod.Definition.ExportAlias = alias;
+ _exportDirectiveContexts[currentMethod.Definition] = context;
}
else if (context.VTENTRY() is not null)
{
// .vtentry vtableIndex : slotIndex
+ currentMethod.Definition.VTableEntry = 0;
+ currentMethod.Definition.VTableSlot = 0;
+ _vtableEntryDirectiveContexts.Remove(currentMethod.Definition);
+
+ int diagnosticCount = _diagnostics.Count;
int vtableEntry = VisitInt32(context.int32()[0]).Value;
int vtableSlot = VisitInt32(context.int32()[1]).Value;
+ if (_diagnostics.Count != diagnosticCount)
+ {
+ return GrammarResult.SentinelValue.Result;
+ }
currentMethod.Definition.VTableEntry = vtableEntry;
currentMethod.Definition.VTableSlot = vtableSlot;
+ _vtableEntryDirectiveContexts[currentMethod.Definition] = context;
}
else if (context.OVERRIDE() is not null)
{
@@ -4218,7 +5056,10 @@ public GrammarResult VisitMethodDecl(CILParser.MethodDeclContext context)
foreach (var attr in customAttrDeclarations ?? Array.Empty())
{
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
- customAttrDecl?.Owner = param;
+ if (customAttrDecl is not null)
+ {
+ customAttrDecl.Owner ??= param;
+ }
}
}
else if (context.CONSTRAINT() is not null)
@@ -4276,7 +5117,10 @@ public GrammarResult VisitMethodDecl(CILParser.MethodDeclContext context)
foreach (var attr in customAttrDeclarations ?? Array.Empty())
{
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
- customAttrDecl?.Owner = constraint;
+ if (customAttrDecl is not null)
+ {
+ customAttrDecl.Owner ??= constraint;
+ }
}
}
else
@@ -4304,7 +5148,7 @@ public GrammarResult VisitMethodDecl(CILParser.MethodDeclContext context)
var customAttrDecl = VisitCustomAttrDecl(attr).Value;
if (customAttrDecl is not null)
{
- customAttrDecl.Owner = param;
+ customAttrDecl.Owner ??= param;
param.HasCustomAttributes = true;
}
}
@@ -4320,7 +5164,7 @@ public GrammarResult VisitMethodDecl(CILParser.MethodDeclContext context)
var customAttr = VisitCustomDescrInMethodBody(customDescrInMethod).Value;
if (customAttr is not null)
{
- customAttr.Owner = currentMethod.Definition;
+ customAttr.Owner ??= currentMethod.Definition;
}
}
else if (context.GetChild(0) is CILParser.InstrContext instr)
@@ -4360,12 +5204,7 @@ public GrammarResult VisitMethodDecls(CILParser.MethodDeclsContext context)
// Pass 1: Register all parameter names (without resolving constraints)
_currentMethod = new(methodDefinition);
var typarContexts = context.typarsClause()?.typars()?.typar() ?? Array.Empty();
- if (typarContexts.Length > ushort.MaxValue)
- {
- ReportError(DiagnosticIds.TooManyGenericParameters,
- string.Format(DiagnosticMessageTemplates.TooManyGenericParameters, typarContexts.Length, ushort.MaxValue),
- context.typarsClause());
- }
+ ReportGenericParameterEncodingErrors(typarContexts);
for (int i = 0; i < typarContexts.Length; i++)
{
var attributes = VisitTyparAttribs(typarContexts[i].typarAttribs()).Value;
@@ -4409,7 +5248,7 @@ public GrammarResult VisitMethodDecls(CILParser.MethodDeclsContext context)
pInvokeInfo);
continue;
}
- pInvokeInformation = (_entityRegistry.GetOrCreateModuleReference(moduleName, _ => { }), entryPoint, attributes);
+ pInvokeInformation = (_entityRegistry.GetOrCreateModuleReference(moduleName, _ => { }), entryPoint ?? name, attributes);
}
methodDefinition.MethodImportInformation = pInvokeInformation;
@@ -4524,7 +5363,7 @@ public GrammarResult.String VisitMethodName(CILParser.MethodNameContext context)
return new(_entityRegistry.CreateLazilyRecordedMemberReference(_entityRegistry.ModuleType, "", methodRefSignature));
}
byte callConv = VisitCallConv(callConvCtx).Value;
- EntityRegistry.TypeEntity owner = _currentTypeDefinition.PeekOrDefault() ?? _entityRegistry.ModuleType;
+ EntityRegistry.TypeEntity owner = _entityRegistry.ModuleType;
if (context.typeSpec() is CILParser.TypeSpecContext typeSpec)
{
owner = VisitTypeSpec(typeSpec).Value;
@@ -4582,6 +5421,54 @@ public GrammarResult.String VisitMethodName(CILParser.MethodNameContext context)
return new(memberRef);
}
+
+ private EntityRegistry.MemberReferenceEntity CreateExplicitMethodReference(
+ CILParser.CallConvContext callConv,
+ CILParser.TypeContext returnType,
+ CILParser.TypeSpecContext owner,
+ CILParser.MethodNameContext methodName,
+ CILParser.GenArityContext? genericArity,
+ CILParser.SigArgsContext parameterList)
+ {
+ EntityRegistry.TypeEntity ownerType = VisitTypeSpec(owner).Value;
+ string name = VisitMethodName(methodName).Value;
+ return _entityRegistry.CreateLazilyRecordedMemberReference(
+ ownerType,
+ name,
+ CreateExplicitMethodSignature(callConv, returnType, genericArity, parameterList));
+ }
+
+ private BlobBuilder CreateExplicitMethodSignature(
+ CILParser.CallConvContext callConv,
+ CILParser.TypeContext returnType,
+ CILParser.GenArityContext? genericArity,
+ CILParser.SigArgsContext parameterList)
+ {
+ BlobBuilder signature = new();
+ byte signatureHeader = VisitCallConv(callConv).Value;
+ int arity = genericArity is null ? 0 : VisitGenArity(genericArity).Value;
+ if (arity != 0)
+ {
+ signatureHeader |= (byte)SignatureAttributes.Generic;
+ }
+
+ signature.WriteByte(signatureHeader);
+ if (arity != 0)
+ {
+ signature.WriteCompressedInteger(arity);
+ }
+
+ ImmutableArray parameters = VisitSigArgs(parameterList).Value;
+ signature.WriteCompressedInteger(parameters.Count(parameter => !parameter.IsSentinel));
+ VisitType(returnType).Value.WriteContentTo(signature);
+ foreach (SignatureArg parameter in parameters)
+ {
+ parameter.SignatureBlob.WriteContentTo(signature);
+ }
+
+ return signature;
+ }
+
public GrammarResult VisitModuleHead(CILParser.ModuleHeadContext context)
{
if (context.ChildCount > 2)
@@ -4590,7 +5477,10 @@ public GrammarResult VisitModuleHead(CILParser.ModuleHeadContext context)
return GrammarResult.SentinelValue.Result;
}
- _entityRegistry.Module.Name = VisitDottedName(context.dottedName()).Value;
+ if (context.dottedName() is { } moduleName)
+ {
+ _entityRegistry.Module.Name = VisitDottedName(moduleName).Value;
+ }
return GrammarResult.SentinelValue.Result;
}
@@ -4615,12 +5505,18 @@ public GrammarResult.Literal> VisitNameValPair
GrammarResult ICILVisitor.VisitNativeType(CILParser.NativeTypeContext context) => VisitNativeType(context);
public GrammarResult.FormattedBlob VisitNativeType(CILParser.NativeTypeContext context)
{
- if (context.nativeTypeArrayPointerInfo() is not CILParser.NativeTypeArrayPointerInfoContext[] arrayPointerInfo)
+ if (context.nativeTypeElement() is not CILParser.NativeTypeElementContext element)
+ {
+ return new(new BlobBuilder());
+ }
+
+ CILParser.NativeTypeArrayPointerInfoContext[] arrayPointerInfo = context.nativeTypeArrayPointerInfo();
+ if (arrayPointerInfo.Length == 0)
{
- return VisitNativeTypeElement(context.nativeTypeElement());
+ return VisitNativeTypeElement(element);
}
var prefix = new BlobBuilder(arrayPointerInfo.Length);
- var elementType = VisitNativeTypeElement(context.nativeTypeElement()).Value;
+ var elementType = VisitNativeTypeElement(element).Value;
var suffix = new BlobBuilder();
for (int i = arrayPointerInfo.Length - 1; i >= 0; i--)
@@ -4650,20 +5546,20 @@ public GrammarResult.FormattedBlob VisitNativeType(CILParser.NativeTypeContext c
{
if (arrayPointerInfo[i] is CILParser.PointerArrayTypeSizeContext size)
{
+ suffix.WriteCompressedInteger(0);
suffix.WriteCompressedInteger(VisitInt32(size.int32()).Value);
+ suffix.WriteCompressedInteger(0);
}
else if (arrayPointerInfo[i] is CILParser.PointerArrayTypeSizeParamIndexContext sizeParamIndex)
{
var ints = sizeParamIndex.int32();
suffix.WriteCompressedInteger(VisitInt32(ints[1]).Value);
- suffix.WriteCompressedInteger(VisitInt32(ints[2]).Value);
+ suffix.WriteCompressedInteger(VisitInt32(ints[0]).Value);
suffix.WriteCompressedInteger(1); // Write that the paramIndex parameter was specified
}
else if (arrayPointerInfo[i] is CILParser.PointerArrayTypeParamIndexContext paramIndex)
{
- suffix.WriteCompressedInteger(0);
suffix.WriteCompressedInteger(VisitInt32(paramIndex.int32()).Value);
- suffix.WriteCompressedInteger(0); // Write that the paramIndex parameter was not specified
}
}
@@ -4675,7 +5571,7 @@ public GrammarResult.FormattedBlob VisitNativeType(CILParser.NativeTypeContext c
GrammarResult ICILVisitor.VisitNativeTypeElement(CILParser.NativeTypeElementContext context) => VisitNativeTypeElement(context);
public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeElementContext context)
{
- var blob = new BlobBuilder(5);
+ var blob = new BlobBuilder();
if (context.dottedName() is CILParser.DottedNameContext typedef)
{
// Native type typedefs are not yet fully supported
@@ -4687,6 +5583,21 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
if (context.marshalType is null)
{
+ if (context.marshalBool is not null)
+ {
+ blob.WriteByte((byte)UnmanagedType.VariantBool);
+ }
+ else if (context.unsignedMarshalType is not null)
+ {
+ blob.WriteByte(context.unsignedMarshalType.Type switch
+ {
+ CILParser.INT8 => (byte)UnmanagedType.U1,
+ CILParser.INT16 => (byte)UnmanagedType.U2,
+ CILParser.INT32_ => (byte)UnmanagedType.U4,
+ CILParser.INT64_ => (byte)UnmanagedType.U8,
+ _ => throw new UnreachableException(),
+ });
+ }
return new(blob);
}
@@ -4723,7 +5634,7 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
case CILParser.ARRAY:
blob.WriteByte((byte)UnmanagedType.ByValArray);
blob.WriteCompressedInteger(VisitInt32(context.int32()).Value);
- blob.LinkSuffix(VisitNativeType(context.nativeType()).Value);
+ VisitNativeType(context.nativeType()).Value.WriteContentTo(blob);
break;
case CILParser.VARIANT:
ReportWarning(DiagnosticIds.DeprecatedNativeType,
@@ -4752,15 +5663,7 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
blob.WriteByte(NATIVE_TYPE_VOID);
break;
case CILParser.BOOL:
- // Distinguish 'variant bool' (VariantBool) from plain 'bool' (Bool)
- if (context.marshalBool is not null)
- {
- blob.WriteByte((byte)UnmanagedType.VariantBool);
- }
- else
- {
- blob.WriteByte((byte)UnmanagedType.Bool);
- }
+ blob.WriteByte((byte)UnmanagedType.Bool);
break;
case CILParser.INT8:
blob.WriteByte((byte)UnmanagedType.I1);
@@ -4926,11 +5829,21 @@ public GrammarResult.FormattedBlob VisitNativeTypeElement(CILParser.NativeTypeEl
GrammarResult ICILVisitor.VisitObjSeq(CILParser.ObjSeqContext context) => VisitObjSeq(context);
public GrammarResult.FormattedBlob VisitObjSeq(CILParser.ObjSeqContext context)
{
- // We're going to add all of the elements in the sequence as prefix blobs to this blob.
- BlobBuilder objSeqBlob = new(0);
+ BlobBuilder objSeqBlob = new();
foreach (var item in context.serInit())
{
- objSeqBlob.LinkPrefix(VisitSerInit(item).Value);
+ // Each element in object[] is encoded as FieldOrPropType + value,
+ // where FieldOrPropType is the concrete type (bool, int32, string, etc.),
+ // NOT TaggedObject (0x51). The object(...) wrapper is used to explicitly
+ // box a value but does not change the element's concrete type in the encoding.
+ // Unwrap any object(...) wrappers to get the actual typed inner element.
+ CILParser.SerInitContext actualItem = item;
+ while (actualItem.serInit() is { } inner)
+ {
+ actualItem = inner;
+ }
+ WriteCustomAttributeFieldOrPropType(objSeqBlob, actualItem);
+ objSeqBlob.LinkSuffix(VisitSerInit(actualItem).Value);
}
return new(objSeqBlob);
}
@@ -5171,6 +6084,11 @@ public GrammarResult.FormattedBlob VisitSecAttrSetBlob(CILParser.SecAttrSetBlobC
GrammarResult ICILVisitor.VisitSecDecl(CILParser.SecDeclContext context) => VisitSecDecl(context);
public GrammarResult.Literal VisitSecDecl(CILParser.SecDeclContext context)
{
+ if (ContainsParserError(context))
+ {
+ return new(null);
+ }
+
if (context.PERMISSION() is not null)
{
ReportError(DiagnosticIds.UnsupportedSecurityDeclaration,
@@ -5202,6 +6120,9 @@ public GrammarResult.FormattedBlob VisitSecAttrSetBlob(CILParser.SecAttrSetBlobC
return new(_entityRegistry.CreateDeclarativeSecurityAttribute(action, value));
}
+ private bool ContainsParserError(ParserRuleContext context)
+ => _parserErrorContexts.Contains(context);
+
internal abstract record ExceptionClause(LabelHandle Start, LabelHandle End)
{
internal sealed record Catch(EntityRegistry.TypeEntity Type, LabelHandle Start, LabelHandle End) : ExceptionClause(Start, End);
@@ -5241,6 +6162,12 @@ public GrammarResult VisitSehBlock(CILParser.SehBlockContext context)
GrammarResult ICILVisitor.VisitSehClause(CILParser.SehClauseContext context) => VisitSehClause(context);
public GrammarResult.Literal VisitSehClause(CILParser.SehClauseContext context)
{
+ EntityRegistry.TypeEntity? catchType = context.catchClause() is { } catchClause
+ ? VisitCatchClause(catchClause).Value
+ : null;
+ LabelHandle? filterStart = context.filterClause() is { } filterClause
+ ? VisitFilterClause(filterClause).Value
+ : null;
var (start, end) = VisitHandlerBlock(context.handlerBlock()).Value;
if (context.finallyClause() is not null)
@@ -5251,13 +6178,13 @@ public GrammarResult.Literal VisitSehClause(CILParser.SehClause
{
return new(new ExceptionClause.Fault(start, end));
}
- if (context.catchClause() is CILParser.CatchClauseContext catchClause)
+ if (catchType is not null)
{
- return new(new ExceptionClause.Catch(VisitCatchClause(catchClause).Value, start, end));
+ return new(new ExceptionClause.Catch(catchType, start, end));
}
- if (context.filterClause() is CILParser.FilterClauseContext filterClause)
+ if (filterStart is not null)
{
- return new(new ExceptionClause.Filter(VisitFilterClause(filterClause).Value, start, end));
+ return new(new ExceptionClause.Filter(filterStart.Value, start, end));
}
throw new UnreachableException();
@@ -5312,7 +6239,7 @@ public GrammarResult.FormattedBlob VisitSerializTypeElement(CILParser.SerializTy
blob.WriteByte((byte)SerializationTypeCode.Enum);
if (context.SQSTRING() is ITerminalNode sqString)
{
- blob.WriteSerializedString(sqString.GetText());
+ blob.WriteSerializedString(StringHelpers.ParseQuotedString(sqString.GetText()));
}
else
{
@@ -5329,46 +6256,79 @@ public GrammarResult.FormattedBlob VisitSerInit(CILParser.SerInitContext context
{
if (context.fieldSerInit() is CILParser.FieldSerInitContext fieldSerInit)
{
- return VisitFieldSerInit(fieldSerInit);
+ if (fieldSerInit.bytes() is not null)
+ {
+ ReportError(
+ DiagnosticIds.InvalidMetadataToken,
+ "bytearray is not a valid structured custom attribute value",
+ context);
+ var invalidValue = new BlobBuilder();
+ invalidValue.WriteSerializedString(null);
+ return new(invalidValue);
+ }
+
+ ImmutableArray encodedValue = VisitFieldSerInit(fieldSerInit).Value.ToImmutableArray();
+ var value = new BlobBuilder(Math.Max(0, encodedValue.Length - 1));
+ if (encodedValue.Length > 1)
+ {
+ value.WriteBytes(encodedValue.AsSpan().Slice(1).ToArray());
+ }
+ return new(value);
}
if (context.serInit() is CILParser.SerInitContext serInit)
{
Debug.Assert(context.OBJECT() is not null);
- BlobBuilder taggedObjectBlob = new(1);
- taggedObjectBlob.WriteByte((byte)SerializationTypeCode.TaggedObject);
+ BlobBuilder taggedObjectBlob = new();
+ WriteCustomAttributeFieldOrPropType(taggedObjectBlob, serInit);
taggedObjectBlob.LinkSuffix(VisitSerInit(serInit).Value);
return new(taggedObjectBlob);
}
if (context.int32() is not CILParser.Int32Context arrLength)
{
- // The only cases where there is no int32 node is when the value is a string or type.
BlobBuilder blob = new();
- blob.WriteByte((byte)GetTypeCodeForToken(((ITerminalNode)context.GetChild(0)).Symbol.Type));
if (context.className() is CILParser.ClassNameContext className)
{
blob.WriteSerializedString(VisitClassName(className).Value is EntityRegistry.IHasReflectionNotation reflection ? reflection.ReflectionNotation : string.Empty);
}
else
{
- blob.WriteSerializedString(context.SQSTRING()?.Symbol.Text);
+ blob.WriteSerializedString(
+ context.SQSTRING() is { } stringNode
+ ? StringHelpers.ParseQuotedString(stringNode.Symbol.Text)
+ : null);
}
return new(blob);
}
- int tokenType = ((ITerminalNode)context.GetChild(0)).Symbol.Type;
-
- // 1 byte for ELEMENT_TYPE_SZARRAY, 1 byte for the array element type, 4 bytes for the length.
- BlobBuilder arrayHeader = new(6);
- arrayHeader.WriteByte((byte)SerializationTypeCode.SZArray);
- arrayHeader.WriteByte((byte)GetTypeCodeForToken(tokenType));
+ BlobBuilder arrayHeader = new(sizeof(int));
arrayHeader.WriteInt32(VisitInt32(arrLength).Value);
var sequenceResult = (GrammarResult.FormattedBlob)Visit(context.GetRuleContext(1));
arrayHeader.LinkSuffix(sequenceResult.Value);
return new(arrayHeader);
}
+ private static void WriteCustomAttributeFieldOrPropType(
+ BlobBuilder builder,
+ CILParser.SerInitContext context)
+ {
+ int tokenType = context.fieldSerInit() is { } fieldSerInit
+ ? ((ITerminalNode)fieldSerInit.GetChild(0)).Symbol.Type
+ : ((ITerminalNode)context.GetChild(0)).Symbol.Type;
+ if (context.fieldSerInit()?.bytes() is not null)
+ {
+ builder.WriteByte((byte)SerializationTypeCode.String);
+ return;
+ }
+ if (context.int32() is not null)
+ {
+ builder.WriteByte((byte)SerializationTypeCode.SZArray);
+ }
+
+ builder.WriteByte((byte)GetTypeCodeForToken(tokenType));
+ }
+
private static SerializationTypeCode GetTypeCodeForToken(int tokenType)
{
return tokenType switch
@@ -5516,18 +6476,18 @@ public static GrammarResult.Literal VisitSlashedName(CILParser.Slashed
public static GrammarResult.FormattedBlob VisitSqstringSeq(CILParser.SqstringSeqContext context)
{
var strings = ImmutableArray.CreateBuilder(context.ChildCount);
- foreach (var child in context.children)
+ foreach (var child in context.children ?? [])
{
string? str = null;
if (child is ITerminalNode { Symbol: { Type: CILParser.SQSTRING, Text: string stringValue } })
{
- str = stringValue;
+ str = StringHelpers.ParseQuotedString(stringValue);
}
strings.Add(str);
}
- return new(strings.ToImmutable().SerializeSequence());
+ return new(strings.MoveToImmutable().SerializeSequence());
}
GrammarResult ICILVisitor.VisitStackreserve(CILParser.StackreserveContext context) => VisitStackreserve(context);
@@ -5802,7 +6762,7 @@ public GrammarResult VisitTypedefDecl(CILParser.TypedefDeclContext context)
var attr = VisitCustomDescr(customDescr).Value;
if (attr is not null)
{
- _typedefs[alias] = new TypedefEntry.CustomAttribute(attr.Constructor, attr.Value);
+ _typedefs[alias] = new TypedefEntry.CustomAttribute(attr.Constructor, attr.Value, Owner: null);
}
}
else if (context.customDescrWithOwner() is CILParser.CustomDescrWithOwnerContext customDescrWithOwner)
@@ -5811,7 +6771,9 @@ public GrammarResult VisitTypedefDecl(CILParser.TypedefDeclContext context)
var attr = VisitCustomDescrWithOwner(customDescrWithOwner).Value;
if (attr is not null)
{
- _typedefs[alias] = new TypedefEntry.CustomAttribute(attr.Constructor, attr.Value);
+ EntityRegistry.EntityBase? owner = attr.Owner;
+ attr.Owner = null;
+ _typedefs[alias] = new TypedefEntry.CustomAttribute(attr.Constructor, attr.Value, owner);
}
}
@@ -5868,11 +6830,11 @@ public GrammarResult VisitTypedefDecl(CILParser.TypedefDeclContext context)
///
/// Tries to resolve a typedef alias to a custom attribute.
///
- private (EntityRegistry.EntityBase Constructor, BlobBuilder Value)? TryResolveTypedefAsCustomAttribute(string alias)
+ private (EntityRegistry.EntityBase Constructor, BlobBuilder Value, EntityRegistry.EntityBase? Owner)? TryResolveTypedefAsCustomAttribute(string alias)
{
if (_typedefs.TryGetValue(alias, out var entry) && entry is TypedefEntry.CustomAttribute attrEntry)
{
- return (attrEntry.Constructor, attrEntry.Value);
+ return (attrEntry.Constructor, attrEntry.Value, attrEntry.Owner);
}
return null;
}
@@ -5941,7 +6903,12 @@ public GrammarResult VisitTypelist(CILParser.TypelistContext context)
GrammarResult ICILVisitor.VisitVariantType(CILParser.VariantTypeContext context) => VisitVariantType(context);
public GrammarResult.Literal VisitVariantType(CILParser.VariantTypeContext context)
{
- VarEnum variant = VisitVariantTypeElement(context.variantTypeElement()).Value;
+ if (context.variantTypeElement() is not CILParser.VariantTypeElementContext element)
+ {
+ return new(VarEnum.VT_EMPTY);
+ }
+
+ VarEnum variant = VisitVariantTypeElement(element).Value;
// The 0th child is the variant element type.
for (int i = 1; i < context.ChildCount; i++)
{
@@ -6037,12 +7004,6 @@ public GrammarResult.Literal VisitVtfixupAttr(CILParser.VtfixupAttrConte
};
}
- // Default to 32-bit if neither 32 nor 64 is specified
- if ((flags & (VTableFixupSupport.COR_VTABLE_32BIT | VTableFixupSupport.COR_VTABLE_64BIT)) == 0)
- {
- flags |= VTableFixupSupport.COR_VTABLE_32BIT;
- }
-
return new(flags);
}
@@ -6050,96 +7011,30 @@ public GrammarResult.Literal VisitVtfixupAttr(CILParser.VtfixupAttrConte
public GrammarResult VisitVtfixupDecl(CILParser.VtfixupDeclContext context)
{
// vtfixupDecl: '.vtfixup' '[' int32 ']' vtfixupAttr 'at' id;
+ int diagnosticCount = _diagnostics.Count;
int slotCount = VisitInt32(context.int32()).Value;
ushort flags = VisitVtfixupAttr(context.vtfixupAttr()).Value;
string dataLabel = VisitId(context.id()).Value;
+ bool hasValidSlotCount = _diagnostics.Count == diagnosticCount;
- _vtableFixups.Add(new VTableFixupSupport.VTableFixupEntry(slotCount, flags, dataLabel));
+ if (hasValidSlotCount && (uint)slotCount > ushort.MaxValue)
+ {
+ ReportError(
+ DiagnosticIds.InvalidVTableSlotCount,
+ string.Format(
+ DiagnosticMessageTemplates.InvalidVTableSlotCount,
+ slotCount,
+ ushort.MaxValue),
+ context.int32());
+ hasValidSlotCount = false;
+ }
- return GrammarResult.SentinelValue.Result;
- }
+ _vtableFixups.Add(new VTableFixupDeclaration(
+ new VTableFixupSupport.VTableFixupEntry(slotCount, flags, dataLabel),
+ context,
+ hasValidSlotCount));
- ///
- /// Computes the total metadata size from MetadataSizes.
- /// This replicates the internal MetadataSizes.MetadataSize calculation.
- ///
- private static int ComputeMetadataSize(MetadataSizes sizes)
- {
- // Metadata header size (fixed structure):
- // - signature (4)
- // - major/minor version (4)
- // - reserved (4)
- // - version string length (4)
- // - version string padded to 4 bytes ("v4.0.30319" = 12 bytes padded)
- // - storage header (4)
- // - 5 stream headers (#~, #Strings, #US, #GUID, #Blob) = 76 bytes
- // Total header: ~108 bytes
- const int metadataHeaderSize = 108;
-
- // Stream storage: heaps (#Strings, #US, #GUID, #Blob) - we can get aligned sizes
- int heapStorageSize = 0;
- heapStorageSize += sizes.GetAlignedHeapSize(HeapIndex.String);
- heapStorageSize += sizes.GetAlignedHeapSize(HeapIndex.UserString);
- heapStorageSize += sizes.GetAlignedHeapSize(HeapIndex.Guid);
- heapStorageSize += sizes.GetAlignedHeapSize(HeapIndex.Blob);
-
- // Table stream (#~): header + table data
- // Header: Reserved(4) + Version(2) + HeapSizes(1) + RowIdBitWidth(1) + ValidMask(8) + SortedMask(8)
- // + 4 bytes per present table for row counts
- int tableStreamSize = 24; // base header
- var rowCounts = sizes.RowCounts;
-
- // Count present tables and add 4 bytes each for row count
- for (int i = 0; i < rowCounts.Length; i++)
- {
- if (rowCounts[i] > 0)
- {
- tableStreamSize += 4;
- }
- }
-
- // Add table data size with estimated row sizes
- // Row sizes depend on index sizes (2 or 4 bytes) which we don't have access to
- // For small assemblies, all indexes are 2 bytes
- tableStreamSize += rowCounts[(int)TableIndex.Module] * 10; // 2+2+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.TypeRef] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.TypeDef] * 14; // 4+2+2+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.Field] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.MethodDef] * 14; // 4+2+2+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.Param] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.InterfaceImpl] * 4; // 2+2
- tableStreamSize += rowCounts[(int)TableIndex.MemberRef] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.Constant] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.CustomAttribute] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.FieldMarshal] * 4; // 2+2
- tableStreamSize += rowCounts[(int)TableIndex.DeclSecurity] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.ClassLayout] * 8; // 2+4+2
- tableStreamSize += rowCounts[(int)TableIndex.FieldLayout] * 6; // 4+2
- tableStreamSize += rowCounts[(int)TableIndex.StandAloneSig] * 2; // 2
- tableStreamSize += rowCounts[(int)TableIndex.EventMap] * 4; // 2+2
- tableStreamSize += rowCounts[(int)TableIndex.Event] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.PropertyMap] * 4; // 2+2
- tableStreamSize += rowCounts[(int)TableIndex.Property] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.MethodSemantics] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.MethodImpl] * 6; // 2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.ModuleRef] * 2; // 2
- tableStreamSize += rowCounts[(int)TableIndex.TypeSpec] * 2; // 2
- tableStreamSize += rowCounts[(int)TableIndex.ImplMap] * 8; // 2+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.FieldRva] * 6; // 4+2
- tableStreamSize += rowCounts[(int)TableIndex.Assembly] * 22; // 16+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.AssemblyRef] * 20; // 12+2+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.File] * 8; // 4+2+2
- tableStreamSize += rowCounts[(int)TableIndex.ExportedType] * 14; // 8+2+2+2
- tableStreamSize += rowCounts[(int)TableIndex.ManifestResource] * 12; // 8+2+2
- tableStreamSize += rowCounts[(int)TableIndex.NestedClass] * 4; // 2+2
- tableStreamSize += rowCounts[(int)TableIndex.GenericParam] * 8; // 4+2+2
- tableStreamSize += rowCounts[(int)TableIndex.MethodSpec] * 4; // 2+2
- tableStreamSize += rowCounts[(int)TableIndex.GenericParamConstraint] * 4; // 2+2
-
- // Align table stream to 4 bytes (includes +1 for terminating 0 byte)
- tableStreamSize = ((tableStreamSize + 1) + 3) & ~3;
-
- return metadataHeaderSize + heapStorageSize + tableStreamSize;
+ return GrammarResult.SentinelValue.Result;
}
GrammarResult ICILVisitor.VisitOptionalModifier(CILParser.OptionalModifierContext context) => throw new UnreachableException(NodeShouldNeverBeDirectlyVisited);
diff --git a/src/tools/ilasm/src/ILAssembler/Location.cs b/src/tools/ilasm/src/ILAssembler/Location.cs
index b3f829f06f396c..db5b1b8e64f918 100644
--- a/src/tools/ilasm/src/ILAssembler/Location.cs
+++ b/src/tools/ilasm/src/ILAssembler/Location.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
namespace ILAssembler;
@@ -10,7 +11,21 @@ public record Location(SourceSpan Span, SourceText Source)
{
internal static Location From(Antlr4.Runtime.IToken token, IReadOnlyDictionary sourceDocuments)
{
- SourceSpan span = new(token.StartIndex, token.StopIndex - token.StartIndex + 1);
- return new Location(span, sourceDocuments[token.TokenSource.InputStream.SourceName]);
+ return new Location(GetSourceSpan(token), sourceDocuments[token.TokenSource.InputStream.SourceName]);
+ }
+
+ internal static SourceSpan GetSourceSpan(Antlr4.Runtime.IToken? token)
+ {
+ if (token is null)
+ {
+ return new SourceSpan(0, 0);
+ }
+
+ int start = Math.Max(token.StartIndex, 0);
+ int stop = Math.Max(token.StopIndex, start - 1);
+ int length = stop < start
+ ? 0
+ : (int)Math.Min((long)stop - start + 1, int.MaxValue);
+ return new SourceSpan(start, length);
}
}
diff --git a/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs b/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs
index adcd25f1104cc4..3b3fd4321988dc 100644
--- a/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs
+++ b/src/tools/ilasm/src/ILAssembler/MetadataExtensions.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Reflection;
+using System.Reflection.Metadata;
namespace ILAssembler;
@@ -28,4 +29,9 @@ internal static class MetadataExtensions
public static AssemblyFlags NoPlatform => (AssemblyFlags)0x70;
public static AssemblyFlags ArchitectureMask => (AssemblyFlags)0xF0;
}
+
+ extension(ILOpCode)
+ {
+ public static ILOpCode Unused => (ILOpCode)0xFE22;
+ }
}
diff --git a/src/tools/ilasm/src/ILAssembler/NameHelpers.cs b/src/tools/ilasm/src/ILAssembler/NameHelpers.cs
index 3e8c04a0de40bb..1800c8e4abfecf 100644
--- a/src/tools/ilasm/src/ILAssembler/NameHelpers.cs
+++ b/src/tools/ilasm/src/ILAssembler/NameHelpers.cs
@@ -1,10 +1,46 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
namespace ILAssembler
{
internal static class NameHelpers
{
+ public static string GetPrivateScopeMetadataName(string name, bool isMethod)
+ {
+ const int TokenLength = 8;
+ const string PrivateScopeMarker = "$PST";
+ int markerIndex = name.Length - PrivateScopeMarker.Length - TokenLength;
+ if (markerIndex < 0)
+ {
+ return name;
+ }
+
+ ReadOnlySpan token = name.AsSpan(markerIndex + PrivateScopeMarker.Length);
+ if (!name.AsSpan(markerIndex, PrivateScopeMarker.Length).SequenceEqual(PrivateScopeMarker)
+ || !token.StartsWith(isMethod ? "06" : "04")
+ || !IsHexToken(token))
+ {
+ return name;
+ }
+
+ return name.Substring(0, markerIndex);
+
+ static bool IsHexToken(ReadOnlySpan token)
+ {
+ foreach (char c in token)
+ {
+ if (!char.IsAsciiHexDigit(c))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+
public static (string Namespace, string Name) SplitDottedNameToNamespaceAndName(string dottedName)
{
int lastDotIndex = dottedName.LastIndexOf('.');
diff --git a/src/tools/ilasm/src/ILAssembler/Options.cs b/src/tools/ilasm/src/ILAssembler/Options.cs
index 7551579e7eea6d..30a8ff661899bc 100644
--- a/src/tools/ilasm/src/ILAssembler/Options.cs
+++ b/src/tools/ilasm/src/ILAssembler/Options.cs
@@ -61,10 +61,15 @@ public sealed class Options
public CorFlags? CorFlags { get; set; }
///
- /// Target machine type (x64, arm, arm64).
+ /// Target machine type (x64, arm64).
///
public Machine? Machine { get; set; }
+ ///
+ /// Produce a DLL image instead of an executable.
+ ///
+ public bool Dll { get; set; }
+
///
/// Create an AppContainer exe or dll.
///
@@ -138,11 +143,6 @@ public sealed class Options
///
public string? OutputFileName { get; set; }
- ///
- /// Gets or sets a value that indicates whether the output is a DLL.
- ///
- public bool IsDll { get; set; }
-
///
/// Try to create output file despite errors (results may be invalid).
///
diff --git a/src/tools/ilasm/src/ILAssembler/PreprocessedTokenSource.cs b/src/tools/ilasm/src/ILAssembler/PreprocessedTokenSource.cs
index 1f12f22b54a862..bc091d28192776 100644
--- a/src/tools/ilasm/src/ILAssembler/PreprocessedTokenSource.cs
+++ b/src/tools/ilasm/src/ILAssembler/PreprocessedTokenSource.cs
@@ -82,11 +82,15 @@ public string SourceName
private IToken NextTokenWithoutNestedEof(bool errorOnEof = false)
{
- IToken nextToken = CurrentTokenSource.NextToken();
-
- if (nextToken.Type == CILLexer.Eof)
+ while (true)
{
- // Skip the nested file EOF token.
+ IToken nextToken = CurrentTokenSource.NextToken();
+ if (nextToken.Type != CILLexer.Eof)
+ {
+ return nextToken;
+ }
+
+ // Skip nested file EOF tokens until reaching a parent with more input.
// Native ILASM only failed to parse across include file boundaries for the following cases:
// - A comment tries to cross the file boundary.
// - The included file does not have at least one fully parsable rule.
@@ -96,15 +100,27 @@ private IToken NextTokenWithoutNestedEof(bool errorOnEof = false)
{
ReportPreprocessorSyntaxError(nextToken);
}
- _includeSourceStack.Pop();
- if (_includeSourceStack.Count == 0)
+
+ if (_includeSourceStack.Count == 1)
{
// If we hit EOF of our entry file, return the EOF token.
return nextToken;
}
- nextToken = CurrentTokenSource.NextToken();
+
+ int activeIfDefBlocks = ActiveIfDefBlocksInCurrentSource;
+ if (activeIfDefBlocks != 0 && !errorOnEof)
+ {
+ ReportPreprocessorSyntaxError(nextToken);
+ }
+
+ for (int i = 0; i < activeIfDefBlocks; i++)
+ {
+ _activeIfDefBlocks.Pop();
+ }
+
+ _includeSourceStack.Pop();
+ errorOnEof = ActiveIfDefBlocksInCurrentSource != 0;
}
- return nextToken;
}
// Stack of tokens produced by macro expansion re-lexing
@@ -141,6 +157,12 @@ public IToken NextToken()
IToken valueMaybe = NextTokenWithoutNestedEof(errorOnEof: ActiveIfDefBlocksInCurrentSource != 0);
if (valueMaybe.Type == CILLexer.QSTRING)
{
+ if (valueMaybe.Text.Contains("\\\"", StringComparison.Ordinal))
+ {
+ ReportPreprocessorSyntaxError(valueMaybe);
+ return NextToken();
+ }
+
_definedVars.Add(identifier.Text, StringHelpers.ParseQuotedString(valueMaybe.Text));
return NextToken();
}
@@ -316,7 +338,8 @@ private void ReportPreprocessorSyntaxError(IToken token)
{
string text = token.TokenSource.InputStream.GetText(Interval.Of(token.StartIndex, token.TokenSource.InputStream.Index));
string msg = "preprocessor syntax error at: '" + GetErrorDisplay(text) + "'";
- OnPreprocessorSyntaxError?.Invoke(token.TokenSource.SourceName, token.StartIndex, token.StopIndex - token.StartIndex, msg);
+ SourceSpan span = Location.GetSourceSpan(token);
+ OnPreprocessorSyntaxError?.Invoke(token.TokenSource.SourceName, span.Start, span.Length, msg);
}
private static string GetErrorDisplay(string s)
diff --git a/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs b/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs
index b59c2c7f44eb37..c9ba5e371aa10f 100644
--- a/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs
+++ b/src/tools/ilasm/src/ILAssembler/VTableExportPEBuilder.cs
@@ -2,8 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Buffers.Binary;
using System.Collections.Generic;
using System.Collections.Immutable;
+using System.Diagnostics;
+using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
@@ -12,75 +15,59 @@
namespace ILAssembler;
///
-/// A PE builder that extends ManagedPEBuilder to support VTable fixups, unmanaged exports,
-/// and data label reference fixups.
+/// A PE builder that extends with VTable fixups,
+/// unmanaged exports, and data label reference fixups.
///
-///
-/// This builder extends ManagedPEBuilder with additional features:
-/// 1. VTable fixups - adds an .sdata section containing VTableFixups directory and slot data
-/// 2. Export stubs - jump thunks that indirect through vtable slots
-/// 3. PE Export Directory - for native callers to find exported methods
-/// 4. Data label fixups - patches references from one .data label to another with correct RVAs
-///
-/// For VTable fixups:
-/// - The runtime patches the token slots with actual method addresses at load time
-///
-/// For exports:
-/// - Export stubs are small pieces of machine code that jump through vtable slots
-/// - The PE Export Directory lists the exports by name and ordinal
-/// - Native code calls the export stubs, which redirect through the vtable
-///
-/// For data label fixups:
-/// - When .data contains a reference like `&Label`, the reference is patched with the
-/// correct RVA of the target label in the mapped field data section.
-///
internal sealed class VTableExportPEBuilder : ManagedPEBuilder
{
- private const string TextSectionName = ".text";
+ private const string RelocationSectionName = ".reloc";
private const string SDataSectionName = ".sdata";
+ private const string TextSectionName = ".text";
+ private const int ExportDirectoryHeaderSize = 40;
+ private const int RelocationPageSize = 0x1000;
+ private const ushort ImageRelBasedAbsolute = 0;
+ private const ushort ImageRelBasedHighLow = 3;
+ private const ushort ImageRelBasedDir64 = 10;
private readonly ImmutableArray _vtableFixups;
private readonly ImmutableArray _exports;
- private readonly Dictionary _mappedFieldDataOffsets;
private readonly BlobBuilder? _mappedFieldData;
- private readonly IReadOnlyDictionary>? _dataLabelFixups;
+ private readonly ImmutableArray _dataLabelFixups;
private readonly string _dllName;
+ private readonly bool _moveMappedFieldDataToSData;
+ private readonly List _exportStubs = new();
- // Sizes needed to calculate mapped field data RVA
- private readonly int _ilStreamSize;
- private readonly int _metadataSize;
- private readonly int _managedResourcesSize;
- private readonly int _strongNameSignatureSize;
- private readonly int _debugDataSize;
-
- // Calculated during serialization
- private int _sdataRva;
- private int _sdataSize;
private BlobBuilder? _textSectionBuilder;
private int _textSectionRva;
-
- // Export-related state
+ private int _managedTextSize;
+ private int _mappedFieldDataRva;
+ private int _vtableFixupsRva;
+ private int _vtableFixupsSize;
private int _exportDirectoryRva;
private int _exportDirectorySize;
+ private int _relocationDirectoryRva;
+ private int _relocationDirectorySize;
- ///
- /// Information about a VTable fixup entry.
- ///
public readonly record struct VTableFixupInfo(
- string DataLabel,
+ int DataOffset,
int SlotCount,
ushort Flags,
ImmutableArray MethodTokens);
- ///
- /// Information about an unmanaged export.
- ///
public readonly record struct ExportInfo(
int Ordinal,
string Name,
- int MethodToken,
- int VTableEntryIndex, // 1-based
- int VTableSlotIndex); // 1-based
+ int VTableEntryIndex,
+ int VTableSlotIndex);
+
+ public readonly record struct DataLabelFixup(
+ int DataOffset,
+ int TargetOffset,
+ int PointerSize);
+
+ private readonly record struct ExportStubInfo(int StubRva, int AddressRva, Blob AddressFixup);
+
+ private readonly record struct BaseRelocation(int Rva, ushort Type);
public VTableExportPEBuilder(
PEHeaderBuilder header,
@@ -96,533 +83,598 @@ public VTableExportPEBuilder(
Func, BlobContentId>? deterministicIdProvider = null,
ImmutableArray vtableFixups = default,
ImmutableArray exports = default,
- Dictionary? mappedFieldDataOffsets = null,
- IReadOnlyDictionary>? dataLabelFixups = null,
- int metadataSize = 0,
- int debugDataSize = 0,
+ ImmutableArray dataLabelFixups = default,
string? dllName = null)
- : base(header, metadataRootBuilder, ilStream, mappedFieldData, managedResources,
- nativeResources, debugDirectoryBuilder, strongNameSignatureSize, entryPoint,
- // Clear ILOnly flag if we have vtable fixups - mixed mode assembly
- vtableFixups.IsDefaultOrEmpty ? flags : (flags & ~CorFlags.ILOnly),
- deterministicIdProvider)
+ : base(
+ header,
+ metadataRootBuilder,
+ ilStream,
+ mappedFieldData: vtableFixups.IsDefaultOrEmpty ? mappedFieldData : null,
+ managedResources,
+ nativeResources,
+ debugDirectoryBuilder,
+ strongNameSignatureSize,
+ entryPoint,
+ vtableFixups.IsDefaultOrEmpty && dataLabelFixups.IsDefaultOrEmpty
+ ? flags
+ : (flags & ~CorFlags.ILOnly),
+ deterministicIdProvider)
{
_vtableFixups = vtableFixups.IsDefault ? ImmutableArray.Empty : vtableFixups;
_exports = exports.IsDefault ? ImmutableArray.Empty : exports;
- _mappedFieldDataOffsets = mappedFieldDataOffsets ?? new Dictionary();
_mappedFieldData = mappedFieldData;
- _dataLabelFixups = dataLabelFixups;
+ _dataLabelFixups = dataLabelFixups.IsDefault
+ ? ImmutableArray.Empty
+ : dataLabelFixups;
_dllName = dllName ?? "output.dll";
-
- // Store sizes needed for RVA calculation
- _ilStreamSize = ilStream.Count;
- _metadataSize = metadataSize;
- _managedResourcesSize = managedResources?.Count ?? 0;
- _strongNameSignatureSize = strongNameSignatureSize;
- _debugDataSize = debugDataSize;
+ _moveMappedFieldDataToSData = !_vtableFixups.IsEmpty;
}
+ internal static bool IsExportMachineSupported(Machine machine) =>
+ VTableFixupSupport.GetEffectiveMachine(machine) is
+ Machine.I386 or
+ Machine.Amd64 or
+ Machine.Arm64;
+
protected override ImmutableArray CreateSections()
{
- var baseSections = base.CreateSections();
+ ImmutableArray baseSections = base.CreateSections();
+ bool hasRelocationSection = false;
+ var builder = ImmutableArray.CreateBuilder(baseSections.Length + 2);
- // If we have vtable fixups, add .sdata section
- if (_vtableFixups.Length > 0)
+ for (int i = 0; i < baseSections.Length; i++)
{
- var builder = ImmutableArray.CreateBuilder(baseSections.Length + 1);
-
- // Add .text section first
- builder.Add(baseSections[0]);
+ Section section = baseSections[i];
+ builder.Add(section);
- // Add .sdata section for VTable fixup data (must be read/write for runtime patching)
- builder.Add(new Section(SDataSectionName,
- SectionCharacteristics.MemRead |
- SectionCharacteristics.MemWrite |
- SectionCharacteristics.ContainsInitializedData));
-
- // Add remaining sections
- for (int i = 1; i < baseSections.Length; i++)
+ if (i == 0 && _moveMappedFieldDataToSData)
{
- builder.Add(baseSections[i]);
+ builder.Add(new Section(
+ SDataSectionName,
+ SectionCharacteristics.MemRead |
+ SectionCharacteristics.MemWrite |
+ SectionCharacteristics.ContainsInitializedData));
}
- return builder.ToImmutable();
+ hasRelocationSection |= section.Name == RelocationSectionName;
+ }
+
+ if ((_exports.Length > 0 || !_dataLabelFixups.IsEmpty) && !hasRelocationSection)
+ {
+ builder.Add(new Section(
+ RelocationSectionName,
+ SectionCharacteristics.MemRead |
+ SectionCharacteristics.MemDiscardable |
+ SectionCharacteristics.ContainsInitializedData));
}
- return baseSections;
+ return builder.ToImmutable();
}
protected override BlobBuilder SerializeSection(string name, SectionLocation location)
{
- if (name == TextSectionName)
+ switch (name)
{
- // Apply data label fixups before serializing the text section
- ApplyDataLabelFixups(location);
+ case TextSectionName:
+ BlobBuilder textBuilder = base.SerializeSection(name, location);
+ _textSectionBuilder = textBuilder;
+ _textSectionRva = location.RelativeVirtualAddress;
+ _managedTextSize = textBuilder.Count;
+ if (!_moveMappedFieldDataToSData && (_mappedFieldData?.Count ?? 0) > 0)
+ {
+ _mappedFieldDataRva =
+ location.RelativeVirtualAddress +
+ textBuilder.Count -
+ _mappedFieldData!.Count;
+ ApplyDataLabelFixups(
+ textBuilder,
+ _mappedFieldDataRva - location.RelativeVirtualAddress);
+ }
- // Serialize the text section
- var builder = base.SerializeSection(name, location);
+ SerializeExportStubs(textBuilder, location.RelativeVirtualAddress);
+ return textBuilder;
- // Store for later patching
- _textSectionBuilder = builder;
- _textSectionRva = location.RelativeVirtualAddress;
+ case SDataSectionName:
+ return SerializeSDataSection(location);
- return builder;
+ case RelocationSectionName:
+ return SerializeRelocationSection(location);
+
+ default:
+ return base.SerializeSection(name, location);
}
+ }
+
+ protected override PEDirectoriesBuilder GetDirectories()
+ {
+ PEDirectoriesBuilder directories = base.GetDirectories();
- if (name == SDataSectionName)
+ if (_exportDirectoryRva != 0 && _exportDirectorySize != 0)
{
- var builder = SerializeSDataSection(location);
+ directories.ExportTable = new DirectoryEntry(_exportDirectoryRva, _exportDirectorySize);
+ }
+
+ if (_relocationDirectoryRva != 0 && _relocationDirectorySize != 0)
+ {
+ directories.BaseRelocationTable = new DirectoryEntry(
+ _relocationDirectoryRva,
+ _relocationDirectorySize);
+ }
- // Now that we have the .sdata RVA, patch the COR header's VTableFixups directory
- if (_textSectionBuilder is not null && _vtableFixups.Length > 0)
+ return directories;
+ }
+
+ private void SerializeExportStubs(BlobBuilder builder, int textSectionRva)
+ {
+ Machine machine = VTableFixupSupport.GetEffectiveMachine(Header.Machine);
+
+ foreach (ExportInfo _ in _exports)
+ {
+ (int addressOffset, int addressSize, int addressAlignment) = machine switch
+ {
+ Machine.I386 => (2, sizeof(uint), 16),
+ Machine.Amd64 => (2, sizeof(ulong), 4),
+ Machine.Arm64 => (16, sizeof(ulong), 8),
+ _ => throw new UnreachableException(),
+ };
+
+ int addressMisalignment = (builder.Count + addressOffset) & (addressAlignment - 1);
+ if (addressMisalignment != 0)
{
- PatchCorHeaderVTableFixups(_textSectionBuilder, _textSectionRva);
+ builder.WriteBytes(0, addressAlignment - addressMisalignment);
}
- return builder;
- }
+ int stubRva = textSectionRva + builder.Count;
+ Blob addressFixup;
+ switch (machine)
+ {
+ case Machine.I386:
+ builder.WriteByte(0xFF);
+ builder.WriteByte(0x25);
+ addressFixup = builder.ReserveBytes(addressSize);
+ break;
+
+ case Machine.Amd64:
+ builder.WriteByte(0x48);
+ builder.WriteByte(0xA1);
+ addressFixup = builder.ReserveBytes(addressSize);
+ builder.WriteByte(0xFF);
+ builder.WriteByte(0xE0);
+ break;
+
+ case Machine.Arm64:
+ // ldr x16, #16; ldr x16, [x16]; br x16; nop; .quad vtableSlotAddress
+ builder.WriteUInt32(0x58000090);
+ builder.WriteUInt32(0xF9400210);
+ builder.WriteUInt32(0xD61F0200);
+ builder.WriteUInt32(0xD503201F);
+ addressFixup = builder.ReserveBytes(addressSize);
+ break;
+
+ default:
+ throw new UnreachableException();
+ }
- return base.SerializeSection(name, location);
+ _exportStubs.Add(new ExportStubInfo(
+ stubRva,
+ stubRva + addressOffset,
+ addressFixup));
+ }
}
- ///
- /// Patches the COR header's VTableFixups directory entry in the already-serialized text section.
- ///
- private void PatchCorHeaderVTableFixups(BlobBuilder textSection, int _)
+ private BlobBuilder SerializeSDataSection(SectionLocation location)
{
- // The COR header is at offset SizeOfImportAddressTable in the text section
- // VTableFixups directory is at offset 52 within the COR header (after CodeManagerTable at 44)
- bool is32Bit = Header.Machine == Machine.I386 || Header.Machine == 0;
- int sizeOfImportAddressTable = (is32Bit || Header.Machine == 0) ? 8 : 0;
+ var builder = new BlobBuilder();
+ int vtableDirectorySize = checked(_vtableFixups.Length * 8);
+ int mappedFieldDataOffset = Align(vtableDirectorySize, ManagedPEBuilder.MappedFieldDataAlignment);
+ _mappedFieldDataRva = location.RelativeVirtualAddress + mappedFieldDataOffset;
- // COR header offset in text section
- int corHeaderOffset = sizeOfImportAddressTable;
+ if (_vtableFixups.Length > 0)
+ {
+ _vtableFixupsRva = location.RelativeVirtualAddress;
+ _vtableFixupsSize = vtableDirectorySize;
- // VTableFixups directory entry is at offset 52 within COR header
- const int vtableFixupsOffset = 52;
- int patchOffset = corHeaderOffset + vtableFixupsOffset;
+ foreach (VTableFixupInfo fixup in _vtableFixups)
+ {
+ builder.WriteInt32(_mappedFieldDataRva + fixup.DataOffset);
+ builder.WriteUInt16((ushort)fixup.SlotCount);
+ builder.WriteUInt16(fixup.Flags);
+ }
+ }
- // Find the blob containing this offset and patch it
- int currentOffset = 0;
- foreach (var blob in textSection.GetBlobs())
+ if (_mappedFieldData is not null)
{
- int blobEnd = currentOffset + blob.Length;
- if (patchOffset >= currentOffset && patchOffset + 8 <= blobEnd)
+ if (_mappedFieldData.Count > 0)
{
- // Patch within this blob
- var bytes = blob.GetBytes();
- int relativeOffset = patchOffset - currentOffset;
-
- // Write VTableFixups RVA (4 bytes)
- bytes.Array![bytes.Offset + relativeOffset + 0] = (byte)(_sdataRva & 0xFF);
- bytes.Array[bytes.Offset + relativeOffset + 1] = (byte)((_sdataRva >> 8) & 0xFF);
- bytes.Array[bytes.Offset + relativeOffset + 2] = (byte)((_sdataRva >> 16) & 0xFF);
- bytes.Array[bytes.Offset + relativeOffset + 3] = (byte)((_sdataRva >> 24) & 0xFF);
-
- // Write VTableFixups size (4 bytes)
- bytes.Array[bytes.Offset + relativeOffset + 4] = (byte)(_sdataSize & 0xFF);
- bytes.Array[bytes.Offset + relativeOffset + 5] = (byte)((_sdataSize >> 8) & 0xFF);
- bytes.Array[bytes.Offset + relativeOffset + 6] = (byte)((_sdataSize >> 16) & 0xFF);
- bytes.Array[bytes.Offset + relativeOffset + 7] = (byte)((_sdataSize >> 24) & 0xFF);
-
- return;
+ builder.Align(ManagedPEBuilder.MappedFieldDataAlignment);
+ Debug.Assert(builder.Count == mappedFieldDataOffset);
+
+ ApplyDataLabelFixups(_mappedFieldData, dataOffset: 0);
+ byte[] mappedFieldData = _mappedFieldData.ToArray();
+ ApplyVTableTokens(mappedFieldData);
+ builder.WriteBytes(mappedFieldData);
}
- currentOffset = blobEnd;
+
+ PatchMappedFieldRvas();
}
- }
- ///
- /// Override to add export directory entry if we have exports.
- ///
- protected override PEDirectoriesBuilder GetDirectories()
- {
- var directories = base.GetDirectories();
+ PatchExportStubAddresses();
- // Add export directory if we have exports
- if (_exportDirectoryRva != 0 && _exportDirectorySize != 0)
+ if (_exports.Length > 0)
{
- directories.ExportTable = new DirectoryEntry(_exportDirectoryRva, _exportDirectorySize);
+ builder.Align(sizeof(int));
+ SerializeExportDirectory(builder, location.RelativeVirtualAddress);
}
- return directories;
+ PatchCorHeaderVTableFixups();
+ return builder;
}
- ///
- /// Applies fixups for data label references (e.g., .data Ptr = &Label).
- ///
- private void ApplyDataLabelFixups(SectionLocation textSectionLocation)
+ private void ApplyDataLabelFixups(BlobBuilder builder, int dataOffset)
{
- if (_dataLabelFixups is null || _dataLabelFixups.Count == 0 || _mappedFieldData is null)
+ if (_dataLabelFixups.IsEmpty)
{
return;
}
- // Calculate the RVA of the mapped field data within the text section
- int mappedFieldDataOffset = CalculateMappedFieldDataOffset();
- int mappedFieldDataRva = textSectionLocation.RelativeVirtualAddress + mappedFieldDataOffset;
-
- // Apply each fixup
- foreach (var (labelName, fixupBlobs) in _dataLabelFixups)
+ foreach (DataLabelFixup fixup in _dataLabelFixups)
{
- if (!_mappedFieldDataOffsets.TryGetValue(labelName, out int labelOffset))
+ int targetRva = _mappedFieldDataRva + fixup.TargetOffset;
+ ulong targetAddress = Header.ImageBase + (uint)targetRva;
+ if (fixup.PointerSize == sizeof(long))
{
- // Label not found - skip (should have been caught during parsing)
- continue;
+ WriteUInt64AtOffset(
+ builder,
+ dataOffset + fixup.DataOffset,
+ targetAddress);
}
-
- int targetRva = mappedFieldDataRva + labelOffset;
-
- foreach (var fixupBlob in fixupBlobs)
+ else
{
- // Write the target RVA to the reserved fixup location
- var writer = new BlobWriter(fixupBlob);
- writer.WriteInt32(targetRva);
+ WriteInt32AtOffset(
+ builder,
+ dataOffset + fixup.DataOffset,
+ unchecked((int)(uint)targetAddress));
}
}
}
- ///
- /// Calculates the offset to mapped field data within the text section.
- ///
- ///
- /// The text section layout is:
- /// - Import Address Table (8 bytes for 32-bit, 16 for 64-bit, or 0 if not needed)
- /// - COR Header (72 bytes)
- /// - IL Stream (aligned to 4)
- /// - Metadata
- /// - Managed Resources
- /// - Strong Name Signature
- /// - Debug Data
- /// - Import Table + Name Table + Runtime Startup Stub (if needed)
- /// - Mapped Field Data (aligned to 8)
- ///
- private int CalculateMappedFieldDataOffset()
+ private void ApplyVTableTokens(Span mappedFieldData)
{
- bool is32Bit = Header.Machine == Machine.I386 || Header.Machine == 0;
- bool requiresStartupStub = is32Bit || Header.Machine == 0;
-
- // Import Address Table size
- int sizeOfImportAddressTable = requiresStartupStub ? (is32Bit ? 8 : 16) : 0;
-
- // COR Header size (fixed at 72 bytes)
- const int corHeaderSize = 72;
-
- // Offset to IL stream
- int offset = sizeOfImportAddressTable + corHeaderSize;
-
- // IL stream (aligned to 4)
- offset += Align(_ilStreamSize, 4);
-
- // Metadata
- offset += _metadataSize;
-
- // Managed resources
- offset += _managedResourcesSize;
-
- // Strong name signature
- offset += _strongNameSignatureSize;
-
- // Debug data
- offset += _debugDataSize;
-
- // Import table, name table, and startup stub (if needed)
- if (requiresStartupStub)
+ foreach (VTableFixupInfo fixup in _vtableFixups)
{
- // Import table size (matches ManagedTextSection.SizeOfImportTable)
- // 32-bit: 4+4+4+4+4+20+12+2+11+1 = 66
- // 64-bit: 4+4+4+4+4+20+16+2+11+1 = 70
- int sizeOfImportTable = is32Bit ? 66 : 70;
-
- // Name table size: "mscoree.dll" + NUL + hint = 11+1+2 = 14 bytes
- const int sizeOfNameTable = 14;
-
- offset += sizeOfImportTable + sizeOfNameTable;
-
- // Align for startup stub
- offset = Align(offset, is32Bit ? 4 : 8);
+ int slotSize = VTableFixupSupport.GetSlotSize(fixup.Flags);
+ for (int slotIndex = 0; slotIndex < fixup.SlotCount; slotIndex++)
+ {
+ int slotOffset = fixup.DataOffset + (slotIndex * slotSize);
+ int token = fixup.MethodTokens[slotIndex];
+ if (token == 0)
+ {
+ continue;
+ }
- // Startup stub size
- int startupStubSize = is32Bit ? 8 : 16;
- offset += startupStubSize;
+ if (slotSize == sizeof(long))
+ {
+ BinaryPrimitives.WriteInt64LittleEndian(
+ mappedFieldData.Slice(slotOffset, sizeof(long)),
+ token);
+ }
+ else
+ {
+ BinaryPrimitives.WriteInt32LittleEndian(
+ mappedFieldData.Slice(slotOffset, sizeof(int)),
+ token);
+ }
+ }
}
+ }
- // Align for mapped field data (if present)
- if (_mappedFieldData is not null && _mappedFieldData.Count > 0)
+ private void PatchMappedFieldRvas()
+ {
+ Debug.Assert(_textSectionBuilder is not null);
+
+ int corHeaderOffset = GetCorHeaderOffset();
+ int metadataRva = ReadInt32AtOffset(_textSectionBuilder, corHeaderOffset + 8);
+ int metadataSize = ReadInt32AtOffset(_textSectionBuilder, corHeaderOffset + 12);
+ int metadataOffset = metadataRva - _textSectionRva;
+ byte[] metadata = ReadBytes(_textSectionBuilder, metadataOffset, metadataSize);
+
+ using MetadataReaderProvider provider =
+ MetadataReaderProvider.FromMetadataImage(ImmutableArray.Create(metadata));
+ MetadataReader reader = provider.GetMetadataReader();
+ int rowCount = reader.GetTableRowCount(TableIndex.FieldRva);
+ if (rowCount == 0)
{
- offset = Align(offset, 8);
+ return;
}
- return offset;
- }
+ int tableOffset = reader.GetTableMetadataOffset(TableIndex.FieldRva);
+ int rowSize = reader.GetTableRowSize(TableIndex.FieldRva);
+ int assumedMappedFieldDataRva = _textSectionRva + _managedTextSize;
+ int rvaDelta = _mappedFieldDataRva - assumedMappedFieldDataRva;
- private static int Align(int value, int alignment)
- {
- return (value + alignment - 1) & ~(alignment - 1);
+ for (int row = 0; row < rowCount; row++)
+ {
+ int rvaOffset = metadataOffset + tableOffset + (row * rowSize);
+ int currentRva = ReadInt32AtOffset(_textSectionBuilder, rvaOffset);
+ WriteInt32AtOffset(_textSectionBuilder, rvaOffset, checked(currentRva + rvaDelta));
+ }
}
- private BlobBuilder SerializeSDataSection(SectionLocation location)
+ private void PatchExportStubAddresses()
{
- var builder = new BlobBuilder();
+ Debug.Assert(_exportStubs.Count == _exports.Length);
- if (_vtableFixups.IsEmpty)
+ for (int i = 0; i < _exports.Length; i++)
{
- return builder;
+ ExportInfo export = _exports[i];
+ VTableFixupInfo fixup = _vtableFixups[export.VTableEntryIndex - 1];
+ int slotSize = VTableFixupSupport.GetSlotSize(fixup.Flags);
+ int slotRva =
+ _mappedFieldDataRva +
+ fixup.DataOffset +
+ ((export.VTableSlotIndex - 1) * slotSize);
+ ulong absoluteAddress = Header.ImageBase + (uint)slotRva;
+ var writer = new BlobWriter(_exportStubs[i].AddressFixup);
+
+ if (_exportStubs[i].AddressFixup.Length == sizeof(ulong))
+ {
+ writer.WriteUInt64(absoluteAddress);
+ }
+ else
+ {
+ writer.WriteUInt32(unchecked((uint)absoluteAddress));
+ }
}
+ }
- _sdataRva = location.RelativeVirtualAddress;
-
- // Calculate sizes for VTableFixups directory
- int vtfDirSize = _vtableFixups.Length * 8; // 8 bytes per IMAGE_COR_VTABLEFIXUP entry
+ private void SerializeExportDirectory(BlobBuilder builder, int sectionRva)
+ {
+ int baseOrdinal = _exports.Min(export => export.Ordinal);
+ int maxOrdinal = _exports.Max(export => export.Ordinal);
+ int numberOfFunctions = checked((int)((long)maxOrdinal - baseOrdinal + 1));
+ Debug.Assert(numberOfFunctions <= ushort.MaxValue + 1);
- // Calculate slot data size and build slot offset map
- var slotOffsets = new Dictionary<(int EntryIndex, int SlotIndex), int>();
- int slotDataOffset = vtfDirSize;
+ ExportInfo[] sortedExports = _exports.ToArray();
+ Array.Sort(sortedExports, static (left, right) => string.CompareOrdinal(left.Name, right.Name));
- for (int entryIndex = 0; entryIndex < _vtableFixups.Length; entryIndex++)
+ int nameTableSize = 0;
+ foreach (ExportInfo export in sortedExports)
{
- var vtf = _vtableFixups[entryIndex];
- bool is64Bit = (vtf.Flags & VTableFixupSupport.COR_VTABLE_64BIT) != 0;
- int slotSize = is64Bit ? 8 : 4;
+ nameTableSize = checked(nameTableSize + Encoding.ASCII.GetByteCount(export.Name) + 1);
+ }
- for (int slotIndex = 0; slotIndex < vtf.SlotCount; slotIndex++)
+ int dllNameSize = checked(Encoding.ASCII.GetByteCount(_dllName) + 1);
+ int exportDirectoryOffset = builder.Count;
+ int addressTableOffset = checked(exportDirectoryOffset + ExportDirectoryHeaderSize);
+ int namePointerTableOffset = checked(addressTableOffset + (numberOfFunctions * sizeof(int)));
+ int ordinalTableOffset = checked(namePointerTableOffset + (_exports.Length * sizeof(int)));
+ int exportNamesOffset = checked(ordinalTableOffset + (_exports.Length * sizeof(ushort)));
+ int dllNameOffset = checked(exportNamesOffset + nameTableSize);
+
+ _exportDirectoryRva = sectionRva + exportDirectoryOffset;
+
+ builder.WriteUInt32(0);
+ builder.WriteUInt32(0);
+ builder.WriteUInt16(0);
+ builder.WriteUInt16(0);
+ builder.WriteInt32(sectionRva + dllNameOffset);
+ builder.WriteInt32(baseOrdinal);
+ builder.WriteInt32(numberOfFunctions);
+ builder.WriteInt32(_exports.Length);
+ builder.WriteInt32(sectionRva + addressTableOffset);
+ builder.WriteInt32(sectionRva + namePointerTableOffset);
+ builder.WriteInt32(sectionRva + ordinalTableOffset);
+
+ var functionRvas = new int[numberOfFunctions];
+ for (int i = 0; i < _exports.Length; i++)
+ {
+ int functionIndex = _exports[i].Ordinal - baseOrdinal;
+ if (functionRvas[functionIndex] == 0)
{
- slotOffsets[(entryIndex + 1, slotIndex + 1)] = slotDataOffset + slotIndex * slotSize;
+ functionRvas[functionIndex] = _exportStubs[i].StubRva;
}
- slotDataOffset += vtf.SlotCount * slotSize;
}
- int slotDataEndOffset = slotDataOffset;
-
- // Calculate export-related sizes
- int exportStubsOffset = slotDataEndOffset;
- int numExports = _exports.Length;
- int exportStubSize = GetExportStubSize();
- int exportStubsTotalSize = numExports * exportStubSize;
-
- // Export directory comes after export stubs
- int exportDirOffset = Align(exportStubsOffset + exportStubsTotalSize, 4);
-
- // Export directory structure:
- // - IMAGE_EXPORT_DIRECTORY (40 bytes)
- // - Export Address Table (4 bytes per export)
- // - Export Name Pointer Table (4 bytes per export)
- // - Export Ordinal Table (2 bytes per export)
- // - Export names (null-terminated strings)
- // - DLL name (null-terminated string)
- int exportAddrTableOffset = exportDirOffset + 40;
- int exportNamePtrTableOffset = exportAddrTableOffset + numExports * 4;
- int exportOrdinalTableOffset = exportNamePtrTableOffset + numExports * 4;
-
- // Calculate name table size
- int nameTableSize = 0;
- foreach (var export in _exports)
+ foreach (int functionRva in functionRvas)
{
- nameTableSize += Encoding.ASCII.GetByteCount(export.Name) + 1;
+ builder.WriteInt32(functionRva);
}
- int dllNameSize = Encoding.ASCII.GetByteCount(_dllName) + 1;
-
- int exportNamesOffset = exportOrdinalTableOffset + numExports * 2;
- int dllNameOffset = exportNamesOffset + nameTableSize;
- int exportDirTotalSize = numExports > 0 ? (dllNameOffset + dllNameSize - exportDirOffset) : 0;
- // Store total size for COR header patching (only vtfixup directory, not stubs/exports)
- _sdataSize = vtfDirSize;
+ int nameRva = sectionRva + exportNamesOffset;
+ foreach (ExportInfo export in sortedExports)
+ {
+ builder.WriteInt32(nameRva);
+ nameRva += Encoding.ASCII.GetByteCount(export.Name) + 1;
+ }
- // Write VTableFixups directory (array of IMAGE_COR_VTABLEFIXUP structures)
- int currentSlotDataOffset = vtfDirSize;
- foreach (var vtf in _vtableFixups)
+ foreach (ExportInfo export in sortedExports)
{
- int slotDataRva = location.RelativeVirtualAddress + currentSlotDataOffset;
- builder.WriteInt32(slotDataRva); // RVA to slot data
- builder.WriteUInt16((ushort)vtf.SlotCount); // Count
- builder.WriteUInt16(vtf.Flags); // Type/Flags
-
- bool is64Bit = (vtf.Flags & VTableFixupSupport.COR_VTABLE_64BIT) != 0;
- int slotSize = is64Bit ? 8 : 4;
- currentSlotDataOffset += vtf.SlotCount * slotSize;
+ builder.WriteUInt16(checked((ushort)(export.Ordinal - baseOrdinal)));
}
- // Write slot data (method tokens that get patched by the runtime)
- foreach (var vtf in _vtableFixups)
+ foreach (ExportInfo export in sortedExports)
{
- bool is64Bit = (vtf.Flags & VTableFixupSupport.COR_VTABLE_64BIT) != 0;
+ builder.WriteBytes(Encoding.ASCII.GetBytes(export.Name));
+ builder.WriteByte(0);
+ }
+
+ builder.WriteBytes(Encoding.ASCII.GetBytes(_dllName));
+ builder.WriteByte(0);
+ Debug.Assert(builder.Count == dllNameOffset + dllNameSize);
+
+ _exportDirectorySize = builder.Count - exportDirectoryOffset;
+ }
- for (int i = 0; i < vtf.SlotCount; i++)
+ private BlobBuilder SerializeRelocationSection(SectionLocation location)
+ {
+ Machine machine = VTableFixupSupport.GetEffectiveMachine(Header.Machine);
+ ushort exportRelocationType = machine is Machine.Amd64 or Machine.Arm64
+ ? ImageRelBasedDir64
+ : ImageRelBasedHighLow;
+ var relocations = new List(
+ _exportStubs.Count + _dataLabelFixups.Length + 1);
+
+ if (machine == Machine.I386)
+ {
+ int entryPointRva = base.GetDirectories().AddressOfEntryPoint;
+ if (entryPointRva != 0)
{
- int token = i < vtf.MethodTokens.Length ? vtf.MethodTokens[i] : 0;
- if (is64Bit)
- {
- builder.WriteInt64(token);
- }
- else
- {
- builder.WriteInt32(token);
- }
+ relocations.Add(new BaseRelocation(entryPointRva + 2, ImageRelBasedHighLow));
}
}
- // Write export stubs if we have exports
- if (numExports > 0)
+ foreach (ExportStubInfo stub in _exportStubs)
{
- var exportStubRvas = new int[numExports];
-
- for (int i = 0; i < numExports; i++)
- {
- var export = _exports[i];
+ relocations.Add(new BaseRelocation(stub.AddressRva, exportRelocationType));
+ }
- // Find the vtable slot address for this export
- if (!slotOffsets.TryGetValue((export.VTableEntryIndex, export.VTableSlotIndex), out int slotOffset))
- {
- // Export doesn't have a valid vtable reference, skip
- continue;
- }
+ foreach (DataLabelFixup fixup in _dataLabelFixups)
+ {
+ relocations.Add(new BaseRelocation(
+ _mappedFieldDataRva + fixup.DataOffset,
+ fixup.PointerSize == sizeof(long)
+ ? ImageRelBasedDir64
+ : ImageRelBasedHighLow));
+ }
- int slotRva = location.RelativeVirtualAddress + slotOffset;
- exportStubRvas[i] = location.RelativeVirtualAddress + exportStubsOffset + i * exportStubSize;
+ relocations.Sort(static (left, right) => left.Rva.CompareTo(right.Rva));
- // Write the export stub
- WriteExportStub(builder, slotRva);
+ var builder = new BlobBuilder();
+ int firstRelocation = 0;
+ while (firstRelocation < relocations.Count)
+ {
+ int pageRva = relocations[firstRelocation].Rva & ~(RelocationPageSize - 1);
+ int lastRelocation = firstRelocation + 1;
+ while (lastRelocation < relocations.Count &&
+ (relocations[lastRelocation].Rva & ~(RelocationPageSize - 1)) == pageRva)
+ {
+ lastRelocation++;
}
- // Align for export directory
- builder.Align(4);
+ int relocationCount = lastRelocation - firstRelocation;
+ int paddedRelocationCount = (relocationCount + 1) & ~1;
+ int blockSize = 8 + (paddedRelocationCount * sizeof(ushort));
+ builder.WriteInt32(pageRva);
+ builder.WriteInt32(blockSize);
- // Record export directory location
- _exportDirectoryRva = location.RelativeVirtualAddress + builder.Count;
-
- // Write IMAGE_EXPORT_DIRECTORY
- int baseOrdinal = int.MaxValue;
- int maxOrdinal = 0;
- foreach (var export in _exports)
- {
- if (export.Ordinal < baseOrdinal) baseOrdinal = export.Ordinal;
- if (export.Ordinal > maxOrdinal) maxOrdinal = export.Ordinal;
- }
- if (baseOrdinal == int.MaxValue) baseOrdinal = 1;
- int numFunctions = maxOrdinal - baseOrdinal + 1;
-
- int exportDirStart = builder.Count;
-
- builder.WriteUInt32(0); // Characteristics
- builder.WriteUInt32(0); // TimeDateStamp (filled later or 0)
- builder.WriteUInt16(0); // MajorVersion
- builder.WriteUInt16(0); // MinorVersion
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 +
- numExports * 4 + numExports * 4 + numExports * 2 + nameTableSize); // Name RVA (DLL name)
- builder.WriteInt32(baseOrdinal); // Base
- builder.WriteInt32(numExports); // NumberOfFunctions
- builder.WriteInt32(numExports); // NumberOfNames
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40); // AddressOfFunctions
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 + numExports * 4); // AddressOfNames
- builder.WriteInt32(location.RelativeVirtualAddress + exportDirStart + 40 + numExports * 4 * 2); // AddressOfNameOrdinals
-
- // Sort exports by name for binary search
- var sortedExports = _exports.AsSpan().ToArray();
- Array.Sort(sortedExports, (a, b) => string.CompareOrdinal(a.Name, b.Name));
-
- // Write Export Address Table (RVAs to stubs)
- var exportsArray = _exports.AsSpan().ToArray();
- foreach (var export in sortedExports)
+ for (int i = firstRelocation; i < lastRelocation; i++)
{
- int stubIndex = Array.FindIndex(exportsArray, e => e.Ordinal == export.Ordinal);
- builder.WriteInt32(exportStubRvas[stubIndex]);
+ BaseRelocation relocation = relocations[i];
+ int pageOffset = relocation.Rva - pageRva;
+ builder.WriteUInt16((ushort)((relocation.Type << 12) | pageOffset));
}
- // Write Export Name Pointer Table (RVAs to names)
- int nameOffset = location.RelativeVirtualAddress + exportDirStart + 40 +
- numExports * 4 + numExports * 4 + numExports * 2;
- foreach (var export in sortedExports)
+ if (paddedRelocationCount != relocationCount)
{
- builder.WriteInt32(nameOffset);
- nameOffset += Encoding.ASCII.GetByteCount(export.Name) + 1;
+ builder.WriteUInt16(ImageRelBasedAbsolute);
}
- // Write Export Ordinal Table
- for (int i = 0; i < numExports; i++)
- {
- builder.WriteUInt16((ushort)(sortedExports[i].Ordinal - baseOrdinal));
- }
+ firstRelocation = lastRelocation;
+ }
- // Write export names
- foreach (var export in sortedExports)
+ _relocationDirectoryRva = location.RelativeVirtualAddress;
+ _relocationDirectorySize = builder.Count;
+ return builder;
+ }
+
+ private void PatchCorHeaderVTableFixups()
+ {
+ if (_vtableFixups.Length == 0)
+ {
+ return;
+ }
+
+ Debug.Assert(_textSectionBuilder is not null);
+
+ const int VTableFixupsOffset = 48;
+ int patchOffset = GetCorHeaderOffset() + VTableFixupsOffset;
+ WriteInt32AtOffset(_textSectionBuilder, patchOffset, _vtableFixupsRva);
+ WriteInt32AtOffset(_textSectionBuilder, patchOffset + sizeof(int), _vtableFixupsSize);
+ }
+
+ private int GetCorHeaderOffset()
+ {
+ // ManagedTextSection places SizeOfImportAddressTable bytes before the COR header.
+ // Keep this machine check synchronized with ManagedTextSection.RequiresStartupStub
+ // and ManagedTextSection.SizeOfImportAddressTable in System.Reflection.Metadata.
+ return VTableFixupSupport.GetEffectiveMachine(Header.Machine) == Machine.I386
+ ? 2 * sizeof(int)
+ : 0;
+ }
+
+ private static int Align(int value, int alignment) =>
+ checked((value + alignment - 1) & ~(alignment - 1));
+
+ private static int ReadInt32AtOffset(BlobBuilder builder, int offset) =>
+ BinaryPrimitives.ReadInt32LittleEndian(ReadBytes(builder, offset, sizeof(int)));
+
+ private static byte[] ReadBytes(BlobBuilder builder, int offset, int count)
+ {
+ var result = new byte[count];
+ int builderOffset = 0;
+ int resultOffset = 0;
+
+ foreach (Blob blob in builder.GetBlobs())
+ {
+ int blobEnd = builderOffset + blob.Length;
+ if (offset < blobEnd && offset + count > builderOffset)
{
- byte[] nameBytes = Encoding.ASCII.GetBytes(export.Name);
- builder.WriteBytes(nameBytes);
- builder.WriteByte(0); // null terminator
+ int sourceOffset = Math.Max(offset - builderOffset, 0);
+ int copyLength = Math.Min(blob.Length - sourceOffset, count - resultOffset);
+ blob.GetBytes().AsSpan(sourceOffset, copyLength)
+ .CopyTo(result.AsSpan(resultOffset, copyLength));
+ resultOffset += copyLength;
+ if (resultOffset == count)
+ {
+ return result;
+ }
}
- // Write DLL name
- byte[] dllNameBytes = Encoding.ASCII.GetBytes(_dllName);
- builder.WriteBytes(dllNameBytes);
- builder.WriteByte(0); // null terminator
-
- _exportDirectorySize = builder.Count - exportDirStart;
+ builderOffset = blobEnd;
}
- return builder;
+ throw new ArgumentOutOfRangeException(nameof(offset));
}
- ///
- /// Gets the size of an export stub for the current machine type.
- ///
- private int GetExportStubSize()
+ private static void WriteInt32AtOffset(BlobBuilder builder, int offset, int value)
{
- var machine = Header.Machine == 0 ? Machine.I386 : Header.Machine;
- int size = VTableFixupSupport.GetExportStubSize(machine);
- // VTableFixupSupport returns 12 for ARM64 but we need 16 for our implementation
- return machine == Machine.Arm64 ? 16 : (size == 0 ? 6 : size);
+ Span bytes = stackalloc byte[sizeof(int)];
+ BinaryPrimitives.WriteInt32LittleEndian(bytes, value);
+ WriteBytesAtOffset(builder, offset, bytes);
}
- ///
- /// Writes an export stub that jumps through a vtable slot.
- ///
- private void WriteExportStub(BlobBuilder builder, int vtableSlotRva)
+ private static void WriteUInt64AtOffset(BlobBuilder builder, int offset, ulong value)
{
- // Calculate absolute address (RVA + ImageBase)
- long absoluteAddress = (long)Header.ImageBase + vtableSlotRva;
+ Span bytes = stackalloc byte[sizeof(ulong)];
+ BinaryPrimitives.WriteUInt64LittleEndian(bytes, value);
+ WriteBytesAtOffset(builder, offset, bytes);
+ }
- switch (Header.Machine)
+ private static void WriteBytesAtOffset(BlobBuilder builder, int offset, ReadOnlySpan value)
+ {
+ int builderOffset = 0;
+ int valueOffset = 0;
+
+ foreach (Blob blob in builder.GetBlobs())
{
- case Machine.Amd64:
- VTableFixupSupport.WriteExportStubAmd64(builder, absoluteAddress);
- break;
-
- case Machine.I386:
- case 0: // Default to x86
- VTableFixupSupport.WriteExportStubX86(builder, (int)absoluteAddress);
- break;
-
- case Machine.Arm:
- VTableFixupSupport.WriteExportStubArm(builder, (int)absoluteAddress);
- break;
-
- case Machine.Arm64:
- // ARM64 is more complex - use inline implementation
- // ldr x16, [literal]; br x16
- builder.WriteUInt32(0x58000050); // ldr x16, #8
- builder.WriteUInt32(0xD61F0200); // br x16
- builder.WriteInt64(absoluteAddress);
- break;
+ int blobEnd = builderOffset + blob.Length;
+ if (offset < blobEnd && offset + value.Length > builderOffset)
+ {
+ int destinationOffset = Math.Max(offset - builderOffset, 0);
+ int copyLength = Math.Min(blob.Length - destinationOffset, value.Length - valueOffset);
+ value.Slice(valueOffset, copyLength)
+ .CopyTo(blob.GetBytes().AsSpan(destinationOffset, copyLength));
+ valueOffset += copyLength;
+ if (valueOffset == value.Length)
+ {
+ return;
+ }
+ }
+
+ builderOffset = blobEnd;
}
+
+ throw new ArgumentOutOfRangeException(nameof(offset));
}
- ///
- /// Gets the RVA of the VTableFixups directory after serialization.
- ///
- public int VTableFixupsRva => _sdataRva;
-
- ///
- /// Gets the size of the VTableFixups directory.
- ///
- public int VTableFixupsSize => _sdataSize;
-
- ///
- /// Gets the RVA of the export directory after serialization.
- ///
- public int ExportDirectoryRva => _exportDirectoryRva;
-
- ///
- /// Gets the size of the export directory.
- ///
- public int ExportDirectorySize => _exportDirectorySize;
}
diff --git a/src/tools/ilasm/src/ILAssembler/VTableFixupSupport.cs b/src/tools/ilasm/src/ILAssembler/VTableFixupSupport.cs
index fd2a5d99c76376..6aeed3bdf3df1d 100644
--- a/src/tools/ilasm/src/ILAssembler/VTableFixupSupport.cs
+++ b/src/tools/ilasm/src/ILAssembler/VTableFixupSupport.cs
@@ -1,9 +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;
-using System.Collections.Immutable;
-using System.Reflection.Metadata;
+using System.Diagnostics;
using System.Reflection.PortableExecutable;
namespace ILAssembler;
@@ -11,20 +9,6 @@ namespace ILAssembler;
///
/// Support for VTable fixups and native exports in IL assembly.
///
-///
-/// VTable fixups allow managed methods to be exported as unmanaged entry points
-/// that can be called from native code. This is used for:
-/// - DllExport functionality (exporting managed methods from a DLL)
-/// - COM interop with custom vtables
-/// - Reverse P/Invoke scenarios
-///
-/// The implementation requires:
-/// 1. VTableFixups directory in the CLR header - points to an array of VTableFixup entries
-/// 2. Each VTableFixup entry contains: RVA to slot data, slot count, and flags
-/// 3. The slot data contains method tokens that the runtime patches with method addresses
-/// 4. For exports, jump stubs in the text section that indirect through the vtable slots
-/// 5. PE Export directory pointing to the jump stubs
-///
internal static class VTableFixupSupport
{
// COR_VTABLE_* flags from corhdr.h
@@ -35,204 +19,29 @@ internal static class VTableFixupSupport
public const ushort COR_VTABLE_CALL_MOST_DERIVED = 0x10;
///
- /// Represents a VTable fixup entry parsed from .vtfixup directive.
+ /// Represents a VTable fixup entry parsed from a .vtfixup directive.
///
/// Number of slots in this VTable.
/// COR_VTABLE_* flags.
- /// Label name in the data section where method tokens are stored.
+ /// Label in mapped field data where method tokens are stored.
public readonly record struct VTableFixupEntry(int SlotCount, ushort Flags, string DataLabel);
- ///
- /// Represents a method export from .export directive.
- ///
- /// Export ordinal number.
- /// Export name (method name or alias).
- /// Method definition token.
- /// 1-based index of the VTable fixup entry.
- /// 1-based slot index within the VTable entry.
- public readonly record struct MethodExport(int Ordinal, string Name, int MethodToken, int VTableEntryIndex, int VTableSlotIndex);
-
- ///
- /// Checks if any VTable fixups or exports are defined.
- ///
- public static bool HasVTableFixupsOrExports(
- ImmutableArray vtableFixups,
- ImmutableArray exports)
- {
- return !vtableFixups.IsDefaultOrEmpty || !exports.IsDefaultOrEmpty;
- }
-
- ///
- /// Validates that exports have corresponding vtable entries.
- ///
- public static void ValidateExports(
- ImmutableArray vtableFixups,
- ImmutableArray exports,
- Action reportError)
- {
- if (exports.IsDefaultOrEmpty)
- return;
-
- foreach (var export in exports)
- {
- if (export.VTableEntryIndex <= 0 || export.VTableEntryIndex > vtableFixups.Length)
- {
- reportError($"Export '{export.Name}' references invalid VTable entry index {export.VTableEntryIndex}");
- continue;
- }
-
- var vtfEntry = vtableFixups[export.VTableEntryIndex - 1];
- if (export.VTableSlotIndex <= 0 || export.VTableSlotIndex > vtfEntry.SlotCount)
- {
- reportError($"Export '{export.Name}' references invalid VTable slot {export.VTableSlotIndex} (entry has {vtfEntry.SlotCount} slots)");
- }
- }
- }
-
- ///
- /// Calculates the size of the VTableFixups directory data.
- ///
- ///
- /// The VTableFixups directory is an array of IMAGE_COR_VTABLEFIXUP structures:
- /// struct IMAGE_COR_VTABLEFIXUP {
- /// DWORD RVA; // RVA of the vtable slot data
- /// WORD Count; // Number of entries
- /// WORD Type; // COR_VTABLE_* flags
- /// };
- /// Total: 8 bytes per entry
- ///
- public static int CalculateVTableFixupsDirectorySize(ImmutableArray vtableFixups)
- {
- if (vtableFixups.IsDefaultOrEmpty)
- return 0;
-
- return vtableFixups.Length * 8; // 8 bytes per entry
- }
-
- ///
- /// Calculates the size of the vtable slot data (method tokens).
- ///
- public static int CalculateVTableSlotDataSize(ImmutableArray vtableFixups)
- {
- if (vtableFixups.IsDefaultOrEmpty)
- return 0;
-
- int totalSize = 0;
- foreach (var entry in vtableFixups)
- {
- int slotSize = (entry.Flags & COR_VTABLE_64BIT) != 0 ? 8 : 4;
- totalSize += entry.SlotCount * slotSize;
- }
-
- return totalSize;
- }
+ public static int GetSlotSize(ushort flags) =>
+ (flags & COR_VTABLE_64BIT) != 0 ? sizeof(long) : sizeof(int);
- ///
- /// Gets the size of an export stub for the given machine type.
- ///
- public static int GetExportStubSize(Machine machine)
- {
- return machine switch
+ public static Machine GetEffectiveMachine(Machine machine) =>
+ machine switch
{
- Machine.Amd64 => 12, // mov rax, [addr]; jmp rax
- Machine.I386 => 6, // jmp [addr]
- Machine.Arm => 8, // ldr pc, [pc, #0]; addr
- Machine.Arm64 => 12, // adrp x16, addr; ldr x16, [x16]; br x16
- _ => 0
+ Machine.Unknown => Machine.I386,
+ _ => machine,
};
- }
-
- ///
- /// Writes the VTableFixups directory entries to a blob.
- ///
- /// The blob builder to write to.
- /// The vtable fixup entries.
- /// RVAs of the slot data for each entry.
- public static void WriteVTableFixupsDirectory(
- BlobBuilder builder,
- ImmutableArray vtableFixups,
- ReadOnlySpan slotDataRvas)
- {
- if (vtableFixups.IsDefaultOrEmpty)
- return;
- for (int i = 0; i < vtableFixups.Length; i++)
+ public static int GetPointerSize(Machine machine) =>
+ GetEffectiveMachine(machine) switch
{
- var entry = vtableFixups[i];
- builder.WriteInt32(slotDataRvas[i]); // RVA
- builder.WriteUInt16((ushort)entry.SlotCount); // Count
- builder.WriteUInt16(entry.Flags); // Type
- }
- }
-
- ///
- /// Writes the vtable slot data (method tokens) to a blob.
- ///
- /// The blob builder to write to.
- /// The vtable fixup entries.
- /// Function to get method token for a given vtable entry and slot.
- public static void WriteVTableSlotData(
- BlobBuilder builder,
- ImmutableArray vtableFixups,
- Func getMethodToken)
- {
- if (vtableFixups.IsDefaultOrEmpty)
- return;
-
- for (int entryIndex = 0; entryIndex < vtableFixups.Length; entryIndex++)
- {
- var entry = vtableFixups[entryIndex];
- bool is64Bit = (entry.Flags & COR_VTABLE_64BIT) != 0;
-
- for (int slotIndex = 0; slotIndex < entry.SlotCount; slotIndex++)
- {
- int token = getMethodToken(entryIndex + 1, slotIndex + 1);
- if (is64Bit)
- {
- builder.WriteInt64(token);
- }
- else
- {
- builder.WriteInt32(token);
- }
- }
- }
- }
-
- ///
- /// Writes an export stub for AMD64.
- ///
- public static void WriteExportStubAmd64(BlobBuilder builder, long vtableSlotAddress)
- {
- // mov rax, [vtableSlotAddress]
- builder.WriteByte(0x48); // REX.W
- builder.WriteByte(0xA1); // mov rax, moffs64
- builder.WriteInt64(vtableSlotAddress);
- // jmp rax
- builder.WriteByte(0xFF);
- builder.WriteByte(0xE0);
- }
-
- ///
- /// Writes an export stub for x86.
- ///
- public static void WriteExportStubX86(BlobBuilder builder, int vtableSlotAddress)
- {
- // jmp [vtableSlotAddress]
- builder.WriteByte(0xFF);
- builder.WriteByte(0x25);
- builder.WriteInt32(vtableSlotAddress);
- }
-
- ///
- /// Writes an export stub for ARM (Thumb-2).
- ///
- public static void WriteExportStubArm(BlobBuilder builder, int vtableSlotAddress)
- {
- // ldr pc, [pc, #0]
- builder.WriteUInt16(0xF8DF);
- builder.WriteUInt16(0xF000);
- // address
- builder.WriteInt32(vtableSlotAddress);
- }
+ Machine.I386 => sizeof(int),
+ Machine.Amd64 or
+ Machine.Arm64 => sizeof(long),
+ _ => throw new UnreachableException($"VTable fixups are not supported for architecture {machine}"),
+ };
}
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CIL.g4 b/src/tools/ilasm/src/ILAssembler/gen/CIL.g4
index 91ac09581a2eb7..23ae4bfa51855c 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CIL.g4
+++ b/src/tools/ilasm/src/ILAssembler/gen/CIL.g4
@@ -41,7 +41,7 @@ VOID: 'void';
ENUM: 'enum';
CUSTOM: 'custom';
FIXED: 'fixed';
-SYSSTRING: 'systring';
+SYSSTRING: 'sysstring';
ARRAY: 'array';
VARIANT: 'variant';
CURRENCY: 'currency';
@@ -122,6 +122,7 @@ MRESOURCE: '.mresource';
// For example, "ldc.r8" must be recognized as INSTR_R token, not as DOTTEDNAME
INSTR_NONE:
'nop'
+ | 'unused'
| 'break'
| 'ldarg.0'
| 'ldarg.1'
@@ -404,11 +405,10 @@ id:
| 'aggressiveoptimization'
| 'async'
| 'extended'
- | VALUE
| INSTANCE
| SQSTRING;
-dottedName: DOTTEDNAME | ((dottedNamePart '.')* dottedNamePart);
-dottedNamePart: ID | VALUE | INSTANCE | SQSTRING;
+dottedName: DOTTEDNAME | ((dottedNamePart '.')* dottedNamePart) | SQSTRING;
+dottedNamePart: ID | INSTANCE | SQSTRING | DOTTEDNAME | 'volatile';
compQstring: (QSTRING PLUS)* QSTRING;
@@ -466,7 +466,7 @@ languageDecl:
| '.language' languageString ',' languageString
| '.language' languageString ',' languageString ',' languageString;
-languageString: SQSTRING | QSTRING;
+languageString: SQSTRING;
typelist: '.typelist' '{' (className)* '}';
@@ -619,11 +619,7 @@ extSourceSpec:
| esHead int32 ',' int32 ':' int32
| esHead int32 ',' int32 ':' int32 ',' int32 SQSTRING
| esHead int32 ',' int32 ':' int32 ',' int32
- | esHead int32 QSTRING
- | esHead int32 ':' int32 QSTRING
- | esHead int32 ':' int32 ',' int32 QSTRING
- | esHead int32 ',' int32 ':' int32 QSTRING
- | esHead int32 ',' int32 ':' int32 ',' int32 QSTRING;
+ | esHead int32 QSTRING;
/* Manifest declarations */
fileDecl:
@@ -695,6 +691,7 @@ instr:
| instr_string 'bytearray' '(' bytes ')'
| instr_sig callConv type sigArgs
| instr_tok ownerType /* ownerType ::= memberRef | typeSpec */
+ | instr_tok int32
| instr_switch '(' labels ')'
| instr_switch '()';
@@ -787,6 +784,10 @@ nativeTypeElement:
| marshalType=SAFEARRAY variantType ',' compQstring
| marshalType=INT
| marshalType=UINT
+ | 'unsigned' unsignedMarshalType=INT8
+ | 'unsigned' unsignedMarshalType=INT16
+ | 'unsigned' unsignedMarshalType=INT32_
+ | 'unsigned' unsignedMarshalType=INT64_
| 'nested' marshalType=STRUCT
| marshalType=BYVALSTR
| ANSI marshalType=BSTR
@@ -915,6 +916,7 @@ secDecl:
| PERMISSION secAction typeSpec '=' '{' customBlobDescr '}'
| PERMISSION secAction typeSpec
| PERMISSIONSET secAction '=' 'bytearray'? '(' bytes ')'
+ | PERMISSIONSET secAction 'bytearray' '(' bytes ')'
| PERMISSIONSET secAction compQstring
| PERMISSIONSET secAction '=' '{' secAttrSetBlob '}';
@@ -1379,7 +1381,7 @@ customAttrDecl:
/* Assembly References */
asmOrRefDecl:
- '.publicKey' '=' '(' bytes ')'
+ '.publickey' '=' '(' bytes ')'
| '.ver' intOrWildcard ':' intOrWildcard ':' intOrWildcard ':' intOrWildcard
| '.locale' compQstring
| '.locale' '=' '(' bytes ')'
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CIL.interp b/src/tools/ilasm/src/ILAssembler/gen/CIL.interp
index aa8166cd7c5fe6..b6fd2f72c76018 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CIL.interp
+++ b/src/tools/ilasm/src/ILAssembler/gen/CIL.interp
@@ -15,6 +15,7 @@ null
'aggressiveoptimization'
'async'
'extended'
+'volatile'
'{'
'}'
'.subsystem'
@@ -88,11 +89,11 @@ null
'>'
'/'
'algorithm'
+'unsigned'
'iidparam'
'pinned'
'modreq'
'modopt'
-'unsigned'
'true'
'false'
'request'
@@ -126,7 +127,6 @@ null
'privatescope'
'literal'
'notserialized'
-'volatile'
'.event'
'.addon'
'.removeon'
@@ -166,7 +166,7 @@ null
'handler'
'.data'
'tls'
-'.publicKey'
+'.publickey'
'.ver'
'.locale'
'.publickeytoken'
@@ -203,7 +203,7 @@ null
'enum'
'custom'
'fixed'
-'systring'
+'sysstring'
'array'
'variant'
'currency'
@@ -801,4 +801,4 @@ manifestResDecl
atn:
-[4, 1, 304, 2889, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 377, 8, 1, 10, 1, 12, 1, 380, 9, 1, 1, 1, 3, 1, 383, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 5, 3, 389, 8, 3, 10, 3, 12, 3, 392, 9, 3, 1, 3, 1, 3, 1, 4, 5, 4, 397, 8, 4, 10, 4, 12, 4, 400, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 452, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 493, 8, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 500, 8, 15, 10, 15, 12, 15, 503, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 526, 8, 18, 1, 19, 1, 19, 3, 19, 530, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 548, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 575, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 598, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 634, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 640, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 5, 27, 647, 8, 27, 10, 27, 12, 27, 650, 9, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 659, 8, 28, 10, 28, 12, 28, 662, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 668, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 679, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 687, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 708, 8, 34, 10, 34, 12, 34, 711, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 5, 37, 724, 8, 37, 10, 37, 12, 37, 727, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 771, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 776, 8, 39, 1, 40, 1, 40, 1, 40, 3, 40, 781, 8, 40, 1, 41, 5, 41, 784, 8, 41, 10, 41, 12, 41, 787, 9, 41, 1, 42, 1, 42, 1, 42, 5, 42, 792, 8, 42, 10, 42, 12, 42, 795, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 904, 8, 44, 1, 45, 1, 45, 5, 45, 908, 8, 45, 10, 45, 12, 45, 911, 9, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 924, 8, 45, 10, 45, 12, 45, 927, 9, 45, 1, 45, 1, 45, 1, 45, 3, 45, 932, 8, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 938, 8, 47, 1, 48, 1, 48, 1, 49, 5, 49, 943, 8, 49, 10, 49, 12, 49, 946, 9, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1053, 8, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1058, 8, 64, 1, 64, 1, 64, 5, 64, 1062, 8, 64, 10, 64, 12, 64, 1065, 9, 64, 1, 64, 1, 64, 3, 64, 1069, 8, 64, 3, 64, 1071, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1077, 8, 65, 10, 65, 12, 65, 1080, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 5, 66, 1089, 8, 66, 10, 66, 12, 66, 1092, 9, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1101, 8, 67, 10, 67, 12, 67, 1104, 9, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1110, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1117, 8, 68, 3, 68, 1119, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1146, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1151, 8, 70, 10, 70, 12, 70, 1154, 9, 70, 1, 70, 1, 70, 1, 71, 5, 71, 1159, 8, 71, 10, 71, 12, 71, 1162, 9, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1169, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1182, 8, 73, 1, 74, 1, 74, 1, 74, 5, 74, 1187, 8, 74, 10, 74, 12, 74, 1190, 9, 74, 3, 74, 1192, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1211, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1297, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1306, 8, 77, 1, 78, 1, 78, 1, 78, 5, 78, 1311, 8, 78, 10, 78, 12, 78, 1314, 9, 78, 3, 78, 1316, 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 5, 80, 1322, 8, 80, 10, 80, 12, 80, 1325, 9, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1345, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 1377, 8, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1400, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1412, 8, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1421, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1446, 8, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1463, 8, 87, 1, 88, 1, 88, 1, 88, 1, 88, 5, 88, 1469, 8, 88, 10, 88, 12, 88, 1472, 9, 88, 1, 88, 3, 88, 1475, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 3, 89, 1490, 8, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1495, 8, 90, 10, 90, 12, 90, 1498, 9, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1542, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1552, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1568, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1580, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1592, 8, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 1606, 8, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 1618, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 1629, 8, 100, 1, 101, 1, 101, 1, 101, 5, 101, 1634, 8, 101, 10, 101, 12, 101, 1637, 9, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1646, 8, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1659, 8, 103, 1, 104, 5, 104, 1662, 8, 104, 10, 104, 12, 104, 1665, 9, 104, 1, 105, 1, 105, 3, 105, 1669, 8, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1676, 8, 106, 10, 106, 12, 106, 1679, 9, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 3, 108, 1689, 8, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1770, 8, 110, 10, 110, 12, 110, 1773, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1779, 8, 110, 10, 110, 12, 110, 1782, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1792, 8, 110, 10, 110, 12, 110, 1795, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1803, 8, 110, 10, 110, 12, 110, 1806, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 1813, 8, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1823, 8, 111, 10, 111, 12, 111, 1826, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1852, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 3, 113, 1859, 8, 113, 1, 114, 1, 114, 1, 114, 3, 114, 1864, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1871, 8, 115, 1, 116, 1, 116, 5, 116, 1875, 8, 116, 10, 116, 12, 116, 1878, 9, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1885, 8, 116, 10, 116, 12, 116, 1888, 9, 116, 1, 116, 3, 116, 1891, 8, 116, 1, 117, 1, 117, 1, 118, 5, 118, 1896, 8, 118, 10, 118, 12, 118, 1899, 9, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 3, 119, 1913, 8, 119, 1, 120, 1, 120, 5, 120, 1917, 8, 120, 10, 120, 12, 120, 1920, 9, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 5, 122, 1931, 8, 122, 10, 122, 12, 122, 1934, 9, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 1946, 8, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 1954, 8, 124, 1, 125, 1, 125, 1, 125, 4, 125, 1959, 8, 125, 11, 125, 12, 125, 1960, 1, 125, 1, 125, 3, 125, 1965, 8, 125, 1, 126, 5, 126, 1968, 8, 126, 10, 126, 12, 126, 1971, 9, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 3, 127, 1986, 8, 127, 1, 128, 1, 128, 1, 128, 5, 128, 1991, 8, 128, 10, 128, 12, 128, 1994, 9, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 5, 128, 2004, 8, 128, 10, 128, 12, 128, 2007, 9, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 3, 129, 2032, 8, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2039, 8, 130, 3, 130, 2041, 8, 130, 1, 130, 5, 130, 2044, 8, 130, 10, 130, 12, 130, 2047, 9, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2052, 8, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 2081, 8, 131, 1, 132, 1, 132, 1, 132, 3, 132, 2086, 8, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 3, 133, 2109, 8, 133, 1, 134, 5, 134, 2112, 8, 134, 10, 134, 12, 134, 2115, 9, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2176, 8, 135, 10, 135, 12, 135, 2179, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2185, 8, 135, 10, 135, 12, 135, 2188, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2198, 8, 135, 10, 135, 12, 135, 2201, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2209, 8, 135, 10, 135, 12, 135, 2212, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2220, 8, 135, 10, 135, 12, 135, 2223, 9, 135, 3, 135, 2225, 8, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 3, 137, 2232, 8, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 140, 4, 140, 2242, 8, 140, 11, 140, 12, 140, 2243, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 3, 141, 2258, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 2272, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 3, 143, 2280, 8, 143, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 2300, 8, 147, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 2312, 8, 149, 1, 150, 1, 150, 1, 150, 3, 150, 2317, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 4, 151, 2324, 8, 151, 11, 151, 12, 151, 2325, 3, 151, 2328, 8, 151, 1, 152, 1, 152, 1, 152, 5, 152, 2333, 8, 152, 10, 152, 12, 152, 2336, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 3, 153, 2345, 8, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 3, 154, 2413, 8, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 3, 155, 2490, 8, 155, 1, 156, 5, 156, 2493, 8, 156, 10, 156, 12, 156, 2496, 9, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 3, 158, 2503, 8, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 3, 159, 2653, 8, 159, 1, 160, 1, 160, 5, 160, 2657, 8, 160, 10, 160, 12, 160, 2660, 9, 160, 1, 161, 1, 161, 5, 161, 2664, 8, 161, 10, 161, 12, 161, 2667, 9, 161, 1, 162, 5, 162, 2670, 8, 162, 10, 162, 12, 162, 2673, 9, 162, 1, 163, 5, 163, 2676, 8, 163, 10, 163, 12, 163, 2679, 9, 163, 1, 164, 5, 164, 2682, 8, 164, 10, 164, 12, 164, 2685, 9, 164, 1, 165, 5, 165, 2688, 8, 165, 10, 165, 12, 165, 2691, 9, 165, 1, 166, 5, 166, 2694, 8, 166, 10, 166, 12, 166, 2697, 9, 166, 1, 167, 5, 167, 2700, 8, 167, 10, 167, 12, 167, 2703, 9, 167, 1, 168, 5, 168, 2706, 8, 168, 10, 168, 12, 168, 2709, 9, 168, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 2715, 8, 169, 1, 170, 5, 170, 2718, 8, 170, 10, 170, 12, 170, 2721, 9, 170, 1, 171, 1, 171, 1, 171, 3, 171, 2726, 8, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 2753, 8, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 3, 173, 2767, 8, 173, 1, 174, 5, 174, 2770, 8, 174, 10, 174, 12, 174, 2773, 9, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 3, 175, 2789, 8, 175, 1, 176, 1, 176, 1, 176, 5, 176, 2794, 8, 176, 10, 176, 12, 176, 2797, 9, 176, 1, 176, 1, 176, 1, 177, 1, 177, 5, 177, 2803, 8, 177, 10, 177, 12, 177, 2806, 9, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 3, 178, 2825, 8, 178, 1, 179, 5, 179, 2828, 8, 179, 10, 179, 12, 179, 2831, 9, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 3, 180, 2846, 8, 180, 1, 181, 1, 181, 5, 181, 2850, 8, 181, 10, 181, 12, 181, 2853, 9, 181, 1, 181, 1, 181, 1, 181, 5, 181, 2858, 8, 181, 10, 181, 12, 181, 2861, 9, 181, 1, 181, 1, 181, 1, 181, 1, 181, 3, 181, 2867, 8, 181, 1, 182, 1, 182, 1, 183, 5, 183, 2872, 8, 183, 10, 183, 12, 183, 2875, 9, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 2887, 8, 184, 1, 184, 0, 1, 68, 185, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 0, 15, 6, 0, 1, 15, 198, 198, 242, 242, 246, 246, 263, 263, 288, 288, 4, 0, 198, 198, 242, 242, 263, 263, 288, 288, 1, 0, 262, 263, 1, 0, 172, 173, 1, 0, 36, 37, 1, 0, 72, 73, 3, 0, 2, 2, 60, 60, 76, 82, 2, 0, 228, 228, 259, 260, 9, 0, 177, 177, 182, 194, 200, 200, 206, 207, 209, 214, 217, 218, 221, 221, 229, 241, 261, 261, 1, 0, 94, 95, 1, 0, 96, 110, 1, 0, 67, 68, 2, 0, 172, 172, 288, 289, 2, 0, 178, 178, 263, 263, 1, 0, 50, 51, 3299, 0, 370, 1, 0, 0, 0, 2, 382, 1, 0, 0, 0, 4, 384, 1, 0, 0, 0, 6, 390, 1, 0, 0, 0, 8, 398, 1, 0, 0, 0, 10, 451, 1, 0, 0, 0, 12, 453, 1, 0, 0, 0, 14, 456, 1, 0, 0, 0, 16, 459, 1, 0, 0, 0, 18, 463, 1, 0, 0, 0, 20, 466, 1, 0, 0, 0, 22, 469, 1, 0, 0, 0, 24, 476, 1, 0, 0, 0, 26, 492, 1, 0, 0, 0, 28, 494, 1, 0, 0, 0, 30, 496, 1, 0, 0, 0, 32, 506, 1, 0, 0, 0, 34, 508, 1, 0, 0, 0, 36, 525, 1, 0, 0, 0, 38, 529, 1, 0, 0, 0, 40, 547, 1, 0, 0, 0, 42, 574, 1, 0, 0, 0, 44, 597, 1, 0, 0, 0, 46, 633, 1, 0, 0, 0, 48, 635, 1, 0, 0, 0, 50, 639, 1, 0, 0, 0, 52, 641, 1, 0, 0, 0, 54, 648, 1, 0, 0, 0, 56, 660, 1, 0, 0, 0, 58, 663, 1, 0, 0, 0, 60, 665, 1, 0, 0, 0, 62, 678, 1, 0, 0, 0, 64, 686, 1, 0, 0, 0, 66, 688, 1, 0, 0, 0, 68, 696, 1, 0, 0, 0, 70, 712, 1, 0, 0, 0, 72, 718, 1, 0, 0, 0, 74, 721, 1, 0, 0, 0, 76, 770, 1, 0, 0, 0, 78, 775, 1, 0, 0, 0, 80, 780, 1, 0, 0, 0, 82, 785, 1, 0, 0, 0, 84, 793, 1, 0, 0, 0, 86, 798, 1, 0, 0, 0, 88, 903, 1, 0, 0, 0, 90, 931, 1, 0, 0, 0, 92, 933, 1, 0, 0, 0, 94, 937, 1, 0, 0, 0, 96, 939, 1, 0, 0, 0, 98, 944, 1, 0, 0, 0, 100, 947, 1, 0, 0, 0, 102, 949, 1, 0, 0, 0, 104, 951, 1, 0, 0, 0, 106, 953, 1, 0, 0, 0, 108, 955, 1, 0, 0, 0, 110, 957, 1, 0, 0, 0, 112, 959, 1, 0, 0, 0, 114, 961, 1, 0, 0, 0, 116, 963, 1, 0, 0, 0, 118, 965, 1, 0, 0, 0, 120, 967, 1, 0, 0, 0, 122, 969, 1, 0, 0, 0, 124, 971, 1, 0, 0, 0, 126, 1052, 1, 0, 0, 0, 128, 1070, 1, 0, 0, 0, 130, 1072, 1, 0, 0, 0, 132, 1084, 1, 0, 0, 0, 134, 1109, 1, 0, 0, 0, 136, 1118, 1, 0, 0, 0, 138, 1145, 1, 0, 0, 0, 140, 1152, 1, 0, 0, 0, 142, 1160, 1, 0, 0, 0, 144, 1168, 1, 0, 0, 0, 146, 1181, 1, 0, 0, 0, 148, 1191, 1, 0, 0, 0, 150, 1210, 1, 0, 0, 0, 152, 1296, 1, 0, 0, 0, 154, 1305, 1, 0, 0, 0, 156, 1315, 1, 0, 0, 0, 158, 1317, 1, 0, 0, 0, 160, 1319, 1, 0, 0, 0, 162, 1344, 1, 0, 0, 0, 164, 1376, 1, 0, 0, 0, 166, 1399, 1, 0, 0, 0, 168, 1411, 1, 0, 0, 0, 170, 1413, 1, 0, 0, 0, 172, 1416, 1, 0, 0, 0, 174, 1462, 1, 0, 0, 0, 176, 1474, 1, 0, 0, 0, 178, 1489, 1, 0, 0, 0, 180, 1496, 1, 0, 0, 0, 182, 1501, 1, 0, 0, 0, 184, 1505, 1, 0, 0, 0, 186, 1541, 1, 0, 0, 0, 188, 1543, 1, 0, 0, 0, 190, 1579, 1, 0, 0, 0, 192, 1591, 1, 0, 0, 0, 194, 1605, 1, 0, 0, 0, 196, 1607, 1, 0, 0, 0, 198, 1617, 1, 0, 0, 0, 200, 1628, 1, 0, 0, 0, 202, 1635, 1, 0, 0, 0, 204, 1645, 1, 0, 0, 0, 206, 1658, 1, 0, 0, 0, 208, 1663, 1, 0, 0, 0, 210, 1666, 1, 0, 0, 0, 212, 1677, 1, 0, 0, 0, 214, 1682, 1, 0, 0, 0, 216, 1688, 1, 0, 0, 0, 218, 1690, 1, 0, 0, 0, 220, 1812, 1, 0, 0, 0, 222, 1814, 1, 0, 0, 0, 224, 1851, 1, 0, 0, 0, 226, 1858, 1, 0, 0, 0, 228, 1863, 1, 0, 0, 0, 230, 1870, 1, 0, 0, 0, 232, 1890, 1, 0, 0, 0, 234, 1892, 1, 0, 0, 0, 236, 1897, 1, 0, 0, 0, 238, 1912, 1, 0, 0, 0, 240, 1914, 1, 0, 0, 0, 242, 1927, 1, 0, 0, 0, 244, 1932, 1, 0, 0, 0, 246, 1945, 1, 0, 0, 0, 248, 1953, 1, 0, 0, 0, 250, 1964, 1, 0, 0, 0, 252, 1969, 1, 0, 0, 0, 254, 1985, 1, 0, 0, 0, 256, 1987, 1, 0, 0, 0, 258, 2031, 1, 0, 0, 0, 260, 2051, 1, 0, 0, 0, 262, 2080, 1, 0, 0, 0, 264, 2085, 1, 0, 0, 0, 266, 2108, 1, 0, 0, 0, 268, 2113, 1, 0, 0, 0, 270, 2224, 1, 0, 0, 0, 272, 2226, 1, 0, 0, 0, 274, 2231, 1, 0, 0, 0, 276, 2233, 1, 0, 0, 0, 278, 2237, 1, 0, 0, 0, 280, 2241, 1, 0, 0, 0, 282, 2257, 1, 0, 0, 0, 284, 2271, 1, 0, 0, 0, 286, 2279, 1, 0, 0, 0, 288, 2281, 1, 0, 0, 0, 290, 2284, 1, 0, 0, 0, 292, 2286, 1, 0, 0, 0, 294, 2299, 1, 0, 0, 0, 296, 2301, 1, 0, 0, 0, 298, 2311, 1, 0, 0, 0, 300, 2316, 1, 0, 0, 0, 302, 2327, 1, 0, 0, 0, 304, 2334, 1, 0, 0, 0, 306, 2344, 1, 0, 0, 0, 308, 2412, 1, 0, 0, 0, 310, 2489, 1, 0, 0, 0, 312, 2494, 1, 0, 0, 0, 314, 2497, 1, 0, 0, 0, 316, 2502, 1, 0, 0, 0, 318, 2652, 1, 0, 0, 0, 320, 2658, 1, 0, 0, 0, 322, 2665, 1, 0, 0, 0, 324, 2671, 1, 0, 0, 0, 326, 2677, 1, 0, 0, 0, 328, 2683, 1, 0, 0, 0, 330, 2689, 1, 0, 0, 0, 332, 2695, 1, 0, 0, 0, 334, 2701, 1, 0, 0, 0, 336, 2707, 1, 0, 0, 0, 338, 2714, 1, 0, 0, 0, 340, 2719, 1, 0, 0, 0, 342, 2725, 1, 0, 0, 0, 344, 2752, 1, 0, 0, 0, 346, 2766, 1, 0, 0, 0, 348, 2771, 1, 0, 0, 0, 350, 2788, 1, 0, 0, 0, 352, 2790, 1, 0, 0, 0, 354, 2800, 1, 0, 0, 0, 356, 2824, 1, 0, 0, 0, 358, 2829, 1, 0, 0, 0, 360, 2845, 1, 0, 0, 0, 362, 2866, 1, 0, 0, 0, 364, 2868, 1, 0, 0, 0, 366, 2873, 1, 0, 0, 0, 368, 2886, 1, 0, 0, 0, 370, 371, 7, 0, 0, 0, 371, 1, 1, 0, 0, 0, 372, 383, 5, 287, 0, 0, 373, 374, 3, 4, 2, 0, 374, 375, 5, 264, 0, 0, 375, 377, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 381, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 381, 383, 3, 4, 2, 0, 382, 372, 1, 0, 0, 0, 382, 378, 1, 0, 0, 0, 383, 3, 1, 0, 0, 0, 384, 385, 7, 1, 0, 0, 385, 5, 1, 0, 0, 0, 386, 387, 5, 262, 0, 0, 387, 389, 5, 265, 0, 0, 388, 386, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 393, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 394, 5, 262, 0, 0, 394, 7, 1, 0, 0, 0, 395, 397, 3, 10, 5, 0, 396, 395, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 9, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 402, 3, 74, 37, 0, 402, 403, 5, 16, 0, 0, 403, 404, 3, 82, 41, 0, 404, 405, 5, 17, 0, 0, 405, 452, 1, 0, 0, 0, 406, 407, 3, 72, 36, 0, 407, 408, 5, 16, 0, 0, 408, 409, 3, 8, 4, 0, 409, 410, 5, 17, 0, 0, 410, 452, 1, 0, 0, 0, 411, 412, 3, 256, 128, 0, 412, 413, 5, 16, 0, 0, 413, 414, 3, 268, 134, 0, 414, 415, 5, 17, 0, 0, 415, 452, 1, 0, 0, 0, 416, 452, 3, 222, 111, 0, 417, 452, 3, 296, 148, 0, 418, 452, 3, 70, 35, 0, 419, 452, 3, 66, 33, 0, 420, 452, 3, 88, 44, 0, 421, 452, 3, 90, 45, 0, 422, 452, 3, 22, 11, 0, 423, 424, 3, 346, 173, 0, 424, 425, 5, 16, 0, 0, 425, 426, 3, 348, 174, 0, 426, 427, 5, 17, 0, 0, 427, 452, 1, 0, 0, 0, 428, 429, 3, 352, 176, 0, 429, 430, 5, 16, 0, 0, 430, 431, 3, 358, 179, 0, 431, 432, 5, 17, 0, 0, 432, 452, 1, 0, 0, 0, 433, 434, 3, 362, 181, 0, 434, 435, 5, 16, 0, 0, 435, 436, 3, 366, 183, 0, 436, 437, 5, 17, 0, 0, 437, 452, 1, 0, 0, 0, 438, 452, 3, 64, 32, 0, 439, 452, 3, 174, 87, 0, 440, 452, 3, 342, 171, 0, 441, 452, 3, 12, 6, 0, 442, 452, 3, 14, 7, 0, 443, 452, 3, 16, 8, 0, 444, 452, 3, 18, 9, 0, 445, 452, 3, 20, 10, 0, 446, 452, 3, 26, 13, 0, 447, 452, 3, 42, 21, 0, 448, 452, 3, 40, 20, 0, 449, 452, 3, 30, 15, 0, 450, 452, 3, 24, 12, 0, 451, 401, 1, 0, 0, 0, 451, 406, 1, 0, 0, 0, 451, 411, 1, 0, 0, 0, 451, 416, 1, 0, 0, 0, 451, 417, 1, 0, 0, 0, 451, 418, 1, 0, 0, 0, 451, 419, 1, 0, 0, 0, 451, 420, 1, 0, 0, 0, 451, 421, 1, 0, 0, 0, 451, 422, 1, 0, 0, 0, 451, 423, 1, 0, 0, 0, 451, 428, 1, 0, 0, 0, 451, 433, 1, 0, 0, 0, 451, 438, 1, 0, 0, 0, 451, 439, 1, 0, 0, 0, 451, 440, 1, 0, 0, 0, 451, 441, 1, 0, 0, 0, 451, 442, 1, 0, 0, 0, 451, 443, 1, 0, 0, 0, 451, 444, 1, 0, 0, 0, 451, 445, 1, 0, 0, 0, 451, 446, 1, 0, 0, 0, 451, 447, 1, 0, 0, 0, 451, 448, 1, 0, 0, 0, 451, 449, 1, 0, 0, 0, 451, 450, 1, 0, 0, 0, 452, 11, 1, 0, 0, 0, 453, 454, 5, 18, 0, 0, 454, 455, 3, 32, 16, 0, 455, 13, 1, 0, 0, 0, 456, 457, 5, 19, 0, 0, 457, 458, 3, 32, 16, 0, 458, 15, 1, 0, 0, 0, 459, 460, 5, 20, 0, 0, 460, 461, 5, 21, 0, 0, 461, 462, 3, 32, 16, 0, 462, 17, 1, 0, 0, 0, 463, 464, 5, 22, 0, 0, 464, 465, 3, 34, 17, 0, 465, 19, 1, 0, 0, 0, 466, 467, 5, 23, 0, 0, 467, 468, 3, 34, 17, 0, 468, 21, 1, 0, 0, 0, 469, 470, 5, 24, 0, 0, 470, 471, 3, 98, 49, 0, 471, 472, 3, 2, 1, 0, 472, 473, 5, 16, 0, 0, 473, 474, 3, 142, 71, 0, 474, 475, 5, 17, 0, 0, 475, 23, 1, 0, 0, 0, 476, 477, 5, 25, 0, 0, 477, 25, 1, 0, 0, 0, 478, 479, 5, 26, 0, 0, 479, 493, 3, 28, 14, 0, 480, 481, 5, 26, 0, 0, 481, 482, 3, 28, 14, 0, 482, 483, 5, 27, 0, 0, 483, 484, 3, 28, 14, 0, 484, 493, 1, 0, 0, 0, 485, 486, 5, 26, 0, 0, 486, 487, 3, 28, 14, 0, 487, 488, 5, 27, 0, 0, 488, 489, 3, 28, 14, 0, 489, 490, 5, 27, 0, 0, 490, 491, 3, 28, 14, 0, 491, 493, 1, 0, 0, 0, 492, 478, 1, 0, 0, 0, 492, 480, 1, 0, 0, 0, 492, 485, 1, 0, 0, 0, 493, 27, 1, 0, 0, 0, 494, 495, 7, 2, 0, 0, 495, 29, 1, 0, 0, 0, 496, 497, 5, 28, 0, 0, 497, 501, 5, 16, 0, 0, 498, 500, 3, 138, 69, 0, 499, 498, 1, 0, 0, 0, 500, 503, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 504, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 505, 5, 17, 0, 0, 505, 31, 1, 0, 0, 0, 506, 507, 5, 172, 0, 0, 507, 33, 1, 0, 0, 0, 508, 509, 7, 3, 0, 0, 509, 35, 1, 0, 0, 0, 510, 526, 5, 174, 0, 0, 511, 512, 3, 32, 16, 0, 512, 513, 5, 264, 0, 0, 513, 526, 1, 0, 0, 0, 514, 526, 3, 32, 16, 0, 515, 516, 5, 187, 0, 0, 516, 517, 5, 29, 0, 0, 517, 518, 3, 32, 16, 0, 518, 519, 5, 30, 0, 0, 519, 526, 1, 0, 0, 0, 520, 521, 5, 188, 0, 0, 521, 522, 5, 29, 0, 0, 522, 523, 3, 34, 17, 0, 523, 524, 5, 30, 0, 0, 524, 526, 1, 0, 0, 0, 525, 510, 1, 0, 0, 0, 525, 511, 1, 0, 0, 0, 525, 514, 1, 0, 0, 0, 525, 515, 1, 0, 0, 0, 525, 520, 1, 0, 0, 0, 526, 37, 1, 0, 0, 0, 527, 530, 3, 32, 16, 0, 528, 530, 5, 261, 0, 0, 529, 527, 1, 0, 0, 0, 529, 528, 1, 0, 0, 0, 530, 39, 1, 0, 0, 0, 531, 532, 5, 266, 0, 0, 532, 548, 5, 288, 0, 0, 533, 534, 5, 266, 0, 0, 534, 535, 5, 288, 0, 0, 535, 548, 5, 262, 0, 0, 536, 537, 5, 267, 0, 0, 537, 548, 5, 288, 0, 0, 538, 539, 5, 268, 0, 0, 539, 548, 5, 288, 0, 0, 540, 541, 5, 269, 0, 0, 541, 548, 5, 288, 0, 0, 542, 548, 5, 270, 0, 0, 543, 548, 5, 271, 0, 0, 544, 545, 5, 272, 0, 0, 545, 548, 5, 262, 0, 0, 546, 548, 5, 31, 0, 0, 547, 531, 1, 0, 0, 0, 547, 533, 1, 0, 0, 0, 547, 536, 1, 0, 0, 0, 547, 538, 1, 0, 0, 0, 547, 540, 1, 0, 0, 0, 547, 542, 1, 0, 0, 0, 547, 543, 1, 0, 0, 0, 547, 544, 1, 0, 0, 0, 547, 546, 1, 0, 0, 0, 548, 41, 1, 0, 0, 0, 549, 550, 5, 32, 0, 0, 550, 551, 3, 160, 80, 0, 551, 552, 5, 33, 0, 0, 552, 553, 3, 2, 1, 0, 553, 575, 1, 0, 0, 0, 554, 555, 5, 32, 0, 0, 555, 556, 3, 138, 69, 0, 556, 557, 5, 33, 0, 0, 557, 558, 3, 2, 1, 0, 558, 575, 1, 0, 0, 0, 559, 560, 5, 32, 0, 0, 560, 561, 3, 198, 99, 0, 561, 562, 5, 33, 0, 0, 562, 563, 3, 2, 1, 0, 563, 575, 1, 0, 0, 0, 564, 565, 5, 32, 0, 0, 565, 566, 3, 44, 22, 0, 566, 567, 5, 33, 0, 0, 567, 568, 3, 2, 1, 0, 568, 575, 1, 0, 0, 0, 569, 570, 5, 32, 0, 0, 570, 571, 3, 46, 23, 0, 571, 572, 5, 33, 0, 0, 572, 573, 3, 2, 1, 0, 573, 575, 1, 0, 0, 0, 574, 549, 1, 0, 0, 0, 574, 554, 1, 0, 0, 0, 574, 559, 1, 0, 0, 0, 574, 564, 1, 0, 0, 0, 574, 569, 1, 0, 0, 0, 575, 43, 1, 0, 0, 0, 576, 577, 5, 34, 0, 0, 577, 598, 3, 48, 24, 0, 578, 579, 5, 34, 0, 0, 579, 580, 3, 48, 24, 0, 580, 581, 5, 35, 0, 0, 581, 582, 3, 6, 3, 0, 582, 598, 1, 0, 0, 0, 583, 584, 5, 34, 0, 0, 584, 585, 3, 48, 24, 0, 585, 586, 5, 35, 0, 0, 586, 587, 5, 16, 0, 0, 587, 588, 3, 52, 26, 0, 588, 589, 5, 17, 0, 0, 589, 598, 1, 0, 0, 0, 590, 591, 5, 34, 0, 0, 591, 592, 3, 48, 24, 0, 592, 593, 5, 35, 0, 0, 593, 594, 5, 29, 0, 0, 594, 595, 3, 312, 156, 0, 595, 596, 5, 30, 0, 0, 596, 598, 1, 0, 0, 0, 597, 576, 1, 0, 0, 0, 597, 578, 1, 0, 0, 0, 597, 583, 1, 0, 0, 0, 597, 590, 1, 0, 0, 0, 598, 45, 1, 0, 0, 0, 599, 600, 5, 34, 0, 0, 600, 601, 5, 29, 0, 0, 601, 602, 3, 50, 25, 0, 602, 603, 5, 30, 0, 0, 603, 604, 3, 48, 24, 0, 604, 634, 1, 0, 0, 0, 605, 606, 5, 34, 0, 0, 606, 607, 5, 29, 0, 0, 607, 608, 3, 50, 25, 0, 608, 609, 5, 30, 0, 0, 609, 610, 3, 48, 24, 0, 610, 611, 5, 35, 0, 0, 611, 612, 3, 6, 3, 0, 612, 634, 1, 0, 0, 0, 613, 614, 5, 34, 0, 0, 614, 615, 5, 29, 0, 0, 615, 616, 3, 50, 25, 0, 616, 617, 5, 30, 0, 0, 617, 618, 3, 48, 24, 0, 618, 619, 5, 35, 0, 0, 619, 620, 5, 16, 0, 0, 620, 621, 3, 52, 26, 0, 621, 622, 5, 17, 0, 0, 622, 634, 1, 0, 0, 0, 623, 624, 5, 34, 0, 0, 624, 625, 5, 29, 0, 0, 625, 626, 3, 50, 25, 0, 626, 627, 5, 30, 0, 0, 627, 628, 3, 48, 24, 0, 628, 629, 5, 35, 0, 0, 629, 630, 5, 29, 0, 0, 630, 631, 3, 312, 156, 0, 631, 632, 5, 30, 0, 0, 632, 634, 1, 0, 0, 0, 633, 599, 1, 0, 0, 0, 633, 605, 1, 0, 0, 0, 633, 613, 1, 0, 0, 0, 633, 623, 1, 0, 0, 0, 634, 47, 1, 0, 0, 0, 635, 636, 3, 190, 95, 0, 636, 49, 1, 0, 0, 0, 637, 640, 3, 146, 73, 0, 638, 640, 3, 198, 99, 0, 639, 637, 1, 0, 0, 0, 639, 638, 1, 0, 0, 0, 640, 51, 1, 0, 0, 0, 641, 642, 3, 54, 27, 0, 642, 643, 3, 56, 28, 0, 643, 53, 1, 0, 0, 0, 644, 647, 3, 318, 159, 0, 645, 647, 3, 40, 20, 0, 646, 644, 1, 0, 0, 0, 646, 645, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 55, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 3, 58, 29, 0, 652, 653, 3, 60, 30, 0, 653, 654, 3, 2, 1, 0, 654, 655, 5, 35, 0, 0, 655, 656, 3, 318, 159, 0, 656, 659, 1, 0, 0, 0, 657, 659, 3, 40, 20, 0, 658, 651, 1, 0, 0, 0, 658, 657, 1, 0, 0, 0, 659, 662, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 57, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 663, 664, 7, 4, 0, 0, 664, 59, 1, 0, 0, 0, 665, 667, 3, 62, 31, 0, 666, 668, 5, 260, 0, 0, 667, 666, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 61, 1, 0, 0, 0, 669, 679, 3, 166, 83, 0, 670, 679, 3, 2, 1, 0, 671, 679, 5, 195, 0, 0, 672, 679, 5, 196, 0, 0, 673, 674, 5, 201, 0, 0, 674, 675, 5, 38, 0, 0, 675, 679, 5, 263, 0, 0, 676, 677, 5, 201, 0, 0, 677, 679, 3, 138, 69, 0, 678, 669, 1, 0, 0, 0, 678, 670, 1, 0, 0, 0, 678, 671, 1, 0, 0, 0, 678, 672, 1, 0, 0, 0, 678, 673, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 679, 63, 1, 0, 0, 0, 680, 681, 5, 197, 0, 0, 681, 682, 5, 39, 0, 0, 682, 687, 3, 2, 1, 0, 683, 684, 5, 197, 0, 0, 684, 687, 3, 2, 1, 0, 685, 687, 5, 197, 0, 0, 686, 680, 1, 0, 0, 0, 686, 683, 1, 0, 0, 0, 686, 685, 1, 0, 0, 0, 687, 65, 1, 0, 0, 0, 688, 689, 5, 40, 0, 0, 689, 690, 5, 41, 0, 0, 690, 691, 3, 32, 16, 0, 691, 692, 5, 42, 0, 0, 692, 693, 3, 68, 34, 0, 693, 694, 5, 43, 0, 0, 694, 695, 3, 0, 0, 0, 695, 67, 1, 0, 0, 0, 696, 709, 6, 34, -1, 0, 697, 698, 10, 5, 0, 0, 698, 708, 5, 185, 0, 0, 699, 700, 10, 4, 0, 0, 700, 708, 5, 186, 0, 0, 701, 702, 10, 3, 0, 0, 702, 708, 5, 44, 0, 0, 703, 704, 10, 2, 0, 0, 704, 708, 5, 45, 0, 0, 705, 706, 10, 1, 0, 0, 706, 708, 5, 46, 0, 0, 707, 697, 1, 0, 0, 0, 707, 699, 1, 0, 0, 0, 707, 701, 1, 0, 0, 0, 707, 703, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 708, 711, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 69, 1, 0, 0, 0, 711, 709, 1, 0, 0, 0, 712, 713, 5, 47, 0, 0, 713, 714, 5, 35, 0, 0, 714, 715, 5, 29, 0, 0, 715, 716, 3, 312, 156, 0, 716, 717, 5, 30, 0, 0, 717, 71, 1, 0, 0, 0, 718, 719, 5, 48, 0, 0, 719, 720, 3, 2, 1, 0, 720, 73, 1, 0, 0, 0, 721, 725, 5, 49, 0, 0, 722, 724, 3, 76, 38, 0, 723, 722, 1, 0, 0, 0, 724, 727, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 728, 729, 3, 2, 1, 0, 729, 730, 3, 204, 102, 0, 730, 731, 3, 78, 39, 0, 731, 732, 3, 80, 40, 0, 732, 75, 1, 0, 0, 0, 733, 771, 5, 50, 0, 0, 734, 771, 5, 51, 0, 0, 735, 771, 5, 198, 0, 0, 736, 771, 5, 201, 0, 0, 737, 771, 5, 220, 0, 0, 738, 771, 5, 52, 0, 0, 739, 771, 5, 53, 0, 0, 740, 771, 5, 54, 0, 0, 741, 771, 5, 55, 0, 0, 742, 771, 5, 243, 0, 0, 743, 771, 5, 15, 0, 0, 744, 771, 5, 223, 0, 0, 745, 771, 5, 56, 0, 0, 746, 771, 5, 57, 0, 0, 747, 771, 5, 58, 0, 0, 748, 771, 5, 59, 0, 0, 749, 771, 5, 60, 0, 0, 750, 751, 5, 61, 0, 0, 751, 771, 5, 50, 0, 0, 752, 753, 5, 61, 0, 0, 753, 771, 5, 51, 0, 0, 754, 755, 5, 61, 0, 0, 755, 771, 5, 62, 0, 0, 756, 757, 5, 61, 0, 0, 757, 771, 5, 63, 0, 0, 758, 759, 5, 61, 0, 0, 759, 771, 5, 64, 0, 0, 760, 761, 5, 61, 0, 0, 761, 771, 5, 65, 0, 0, 762, 771, 5, 66, 0, 0, 763, 771, 5, 67, 0, 0, 764, 771, 5, 68, 0, 0, 765, 766, 5, 69, 0, 0, 766, 767, 5, 29, 0, 0, 767, 768, 3, 32, 16, 0, 768, 769, 5, 30, 0, 0, 769, 771, 1, 0, 0, 0, 770, 733, 1, 0, 0, 0, 770, 734, 1, 0, 0, 0, 770, 735, 1, 0, 0, 0, 770, 736, 1, 0, 0, 0, 770, 737, 1, 0, 0, 0, 770, 738, 1, 0, 0, 0, 770, 739, 1, 0, 0, 0, 770, 740, 1, 0, 0, 0, 770, 741, 1, 0, 0, 0, 770, 742, 1, 0, 0, 0, 770, 743, 1, 0, 0, 0, 770, 744, 1, 0, 0, 0, 770, 745, 1, 0, 0, 0, 770, 746, 1, 0, 0, 0, 770, 747, 1, 0, 0, 0, 770, 748, 1, 0, 0, 0, 770, 749, 1, 0, 0, 0, 770, 750, 1, 0, 0, 0, 770, 752, 1, 0, 0, 0, 770, 754, 1, 0, 0, 0, 770, 756, 1, 0, 0, 0, 770, 758, 1, 0, 0, 0, 770, 760, 1, 0, 0, 0, 770, 762, 1, 0, 0, 0, 770, 763, 1, 0, 0, 0, 770, 764, 1, 0, 0, 0, 770, 765, 1, 0, 0, 0, 771, 77, 1, 0, 0, 0, 772, 776, 1, 0, 0, 0, 773, 774, 5, 70, 0, 0, 774, 776, 3, 146, 73, 0, 775, 772, 1, 0, 0, 0, 775, 773, 1, 0, 0, 0, 776, 79, 1, 0, 0, 0, 777, 781, 1, 0, 0, 0, 778, 779, 5, 71, 0, 0, 779, 781, 3, 84, 42, 0, 780, 777, 1, 0, 0, 0, 780, 778, 1, 0, 0, 0, 781, 81, 1, 0, 0, 0, 782, 784, 3, 220, 110, 0, 783, 782, 1, 0, 0, 0, 784, 787, 1, 0, 0, 0, 785, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 83, 1, 0, 0, 0, 787, 785, 1, 0, 0, 0, 788, 789, 3, 146, 73, 0, 789, 790, 5, 27, 0, 0, 790, 792, 1, 0, 0, 0, 791, 788, 1, 0, 0, 0, 792, 795, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 796, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 796, 797, 3, 146, 73, 0, 797, 85, 1, 0, 0, 0, 798, 799, 7, 5, 0, 0, 799, 87, 1, 0, 0, 0, 800, 801, 3, 86, 43, 0, 801, 802, 3, 32, 16, 0, 802, 803, 5, 263, 0, 0, 803, 904, 1, 0, 0, 0, 804, 805, 3, 86, 43, 0, 805, 806, 3, 32, 16, 0, 806, 904, 1, 0, 0, 0, 807, 808, 3, 86, 43, 0, 808, 809, 3, 32, 16, 0, 809, 810, 5, 74, 0, 0, 810, 811, 3, 32, 16, 0, 811, 812, 5, 263, 0, 0, 812, 904, 1, 0, 0, 0, 813, 814, 3, 86, 43, 0, 814, 815, 3, 32, 16, 0, 815, 816, 5, 74, 0, 0, 816, 817, 3, 32, 16, 0, 817, 904, 1, 0, 0, 0, 818, 819, 3, 86, 43, 0, 819, 820, 3, 32, 16, 0, 820, 821, 5, 74, 0, 0, 821, 822, 3, 32, 16, 0, 822, 823, 5, 27, 0, 0, 823, 824, 3, 32, 16, 0, 824, 825, 5, 263, 0, 0, 825, 904, 1, 0, 0, 0, 826, 827, 3, 86, 43, 0, 827, 828, 3, 32, 16, 0, 828, 829, 5, 74, 0, 0, 829, 830, 3, 32, 16, 0, 830, 831, 5, 27, 0, 0, 831, 832, 3, 32, 16, 0, 832, 904, 1, 0, 0, 0, 833, 834, 3, 86, 43, 0, 834, 835, 3, 32, 16, 0, 835, 836, 5, 27, 0, 0, 836, 837, 3, 32, 16, 0, 837, 838, 5, 74, 0, 0, 838, 839, 3, 32, 16, 0, 839, 840, 5, 263, 0, 0, 840, 904, 1, 0, 0, 0, 841, 842, 3, 86, 43, 0, 842, 843, 3, 32, 16, 0, 843, 844, 5, 27, 0, 0, 844, 845, 3, 32, 16, 0, 845, 846, 5, 74, 0, 0, 846, 847, 3, 32, 16, 0, 847, 904, 1, 0, 0, 0, 848, 849, 3, 86, 43, 0, 849, 850, 3, 32, 16, 0, 850, 851, 5, 27, 0, 0, 851, 852, 3, 32, 16, 0, 852, 853, 5, 74, 0, 0, 853, 854, 3, 32, 16, 0, 854, 855, 5, 27, 0, 0, 855, 856, 3, 32, 16, 0, 856, 857, 5, 263, 0, 0, 857, 904, 1, 0, 0, 0, 858, 859, 3, 86, 43, 0, 859, 860, 3, 32, 16, 0, 860, 861, 5, 27, 0, 0, 861, 862, 3, 32, 16, 0, 862, 863, 5, 74, 0, 0, 863, 864, 3, 32, 16, 0, 864, 865, 5, 27, 0, 0, 865, 866, 3, 32, 16, 0, 866, 904, 1, 0, 0, 0, 867, 868, 3, 86, 43, 0, 868, 869, 3, 32, 16, 0, 869, 870, 5, 262, 0, 0, 870, 904, 1, 0, 0, 0, 871, 872, 3, 86, 43, 0, 872, 873, 3, 32, 16, 0, 873, 874, 5, 74, 0, 0, 874, 875, 3, 32, 16, 0, 875, 876, 5, 262, 0, 0, 876, 904, 1, 0, 0, 0, 877, 878, 3, 86, 43, 0, 878, 879, 3, 32, 16, 0, 879, 880, 5, 74, 0, 0, 880, 881, 3, 32, 16, 0, 881, 882, 5, 27, 0, 0, 882, 883, 3, 32, 16, 0, 883, 884, 5, 262, 0, 0, 884, 904, 1, 0, 0, 0, 885, 886, 3, 86, 43, 0, 886, 887, 3, 32, 16, 0, 887, 888, 5, 27, 0, 0, 888, 889, 3, 32, 16, 0, 889, 890, 5, 74, 0, 0, 890, 891, 3, 32, 16, 0, 891, 892, 5, 262, 0, 0, 892, 904, 1, 0, 0, 0, 893, 894, 3, 86, 43, 0, 894, 895, 3, 32, 16, 0, 895, 896, 5, 27, 0, 0, 896, 897, 3, 32, 16, 0, 897, 898, 5, 74, 0, 0, 898, 899, 3, 32, 16, 0, 899, 900, 5, 27, 0, 0, 900, 901, 3, 32, 16, 0, 901, 902, 5, 262, 0, 0, 902, 904, 1, 0, 0, 0, 903, 800, 1, 0, 0, 0, 903, 804, 1, 0, 0, 0, 903, 807, 1, 0, 0, 0, 903, 813, 1, 0, 0, 0, 903, 818, 1, 0, 0, 0, 903, 826, 1, 0, 0, 0, 903, 833, 1, 0, 0, 0, 903, 841, 1, 0, 0, 0, 903, 848, 1, 0, 0, 0, 903, 858, 1, 0, 0, 0, 903, 867, 1, 0, 0, 0, 903, 871, 1, 0, 0, 0, 903, 877, 1, 0, 0, 0, 903, 885, 1, 0, 0, 0, 903, 893, 1, 0, 0, 0, 904, 89, 1, 0, 0, 0, 905, 909, 5, 20, 0, 0, 906, 908, 3, 92, 46, 0, 907, 906, 1, 0, 0, 0, 908, 911, 1, 0, 0, 0, 909, 907, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 912, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 912, 913, 3, 2, 1, 0, 913, 914, 3, 94, 47, 0, 914, 915, 5, 179, 0, 0, 915, 916, 5, 35, 0, 0, 916, 917, 5, 29, 0, 0, 917, 918, 3, 312, 156, 0, 918, 919, 5, 30, 0, 0, 919, 920, 3, 94, 47, 0, 920, 932, 1, 0, 0, 0, 921, 925, 5, 20, 0, 0, 922, 924, 3, 92, 46, 0, 923, 922, 1, 0, 0, 0, 924, 927, 1, 0, 0, 0, 925, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 928, 1, 0, 0, 0, 927, 925, 1, 0, 0, 0, 928, 929, 3, 2, 1, 0, 929, 930, 3, 94, 47, 0, 930, 932, 1, 0, 0, 0, 931, 905, 1, 0, 0, 0, 931, 921, 1, 0, 0, 0, 932, 91, 1, 0, 0, 0, 933, 934, 5, 75, 0, 0, 934, 93, 1, 0, 0, 0, 935, 938, 1, 0, 0, 0, 936, 938, 5, 297, 0, 0, 937, 935, 1, 0, 0, 0, 937, 936, 1, 0, 0, 0, 938, 95, 1, 0, 0, 0, 939, 940, 7, 6, 0, 0, 940, 97, 1, 0, 0, 0, 941, 943, 3, 96, 48, 0, 942, 941, 1, 0, 0, 0, 943, 946, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 99, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 947, 948, 5, 274, 0, 0, 948, 101, 1, 0, 0, 0, 949, 950, 5, 275, 0, 0, 950, 103, 1, 0, 0, 0, 951, 952, 5, 276, 0, 0, 952, 105, 1, 0, 0, 0, 953, 954, 5, 277, 0, 0, 954, 107, 1, 0, 0, 0, 955, 956, 5, 278, 0, 0, 956, 109, 1, 0, 0, 0, 957, 958, 5, 281, 0, 0, 958, 111, 1, 0, 0, 0, 959, 960, 5, 279, 0, 0, 960, 113, 1, 0, 0, 0, 961, 962, 5, 285, 0, 0, 962, 115, 1, 0, 0, 0, 963, 964, 5, 283, 0, 0, 964, 117, 1, 0, 0, 0, 965, 966, 5, 284, 0, 0, 966, 119, 1, 0, 0, 0, 967, 968, 5, 280, 0, 0, 968, 121, 1, 0, 0, 0, 969, 970, 5, 286, 0, 0, 970, 123, 1, 0, 0, 0, 971, 972, 5, 282, 0, 0, 972, 125, 1, 0, 0, 0, 973, 1053, 3, 100, 50, 0, 974, 975, 3, 102, 51, 0, 975, 976, 3, 32, 16, 0, 976, 1053, 1, 0, 0, 0, 977, 978, 3, 102, 51, 0, 978, 979, 3, 0, 0, 0, 979, 1053, 1, 0, 0, 0, 980, 981, 3, 104, 52, 0, 981, 982, 3, 32, 16, 0, 982, 1053, 1, 0, 0, 0, 983, 984, 3, 106, 53, 0, 984, 985, 3, 34, 17, 0, 985, 1053, 1, 0, 0, 0, 986, 987, 3, 108, 54, 0, 987, 988, 3, 36, 18, 0, 988, 1053, 1, 0, 0, 0, 989, 990, 3, 108, 54, 0, 990, 991, 3, 34, 17, 0, 991, 1053, 1, 0, 0, 0, 992, 993, 3, 108, 54, 0, 993, 994, 5, 29, 0, 0, 994, 995, 3, 312, 156, 0, 995, 996, 5, 30, 0, 0, 996, 1053, 1, 0, 0, 0, 997, 998, 3, 108, 54, 0, 998, 999, 5, 83, 0, 0, 999, 1000, 5, 29, 0, 0, 1000, 1001, 3, 312, 156, 0, 1001, 1002, 5, 30, 0, 0, 1002, 1053, 1, 0, 0, 0, 1003, 1004, 3, 110, 55, 0, 1004, 1005, 3, 32, 16, 0, 1005, 1053, 1, 0, 0, 0, 1006, 1007, 3, 110, 55, 0, 1007, 1008, 3, 0, 0, 0, 1008, 1053, 1, 0, 0, 0, 1009, 1010, 3, 112, 56, 0, 1010, 1011, 3, 190, 95, 0, 1011, 1053, 1, 0, 0, 0, 1012, 1013, 3, 114, 57, 0, 1013, 1014, 3, 200, 100, 0, 1014, 1053, 1, 0, 0, 0, 1015, 1016, 3, 114, 57, 0, 1016, 1017, 3, 196, 98, 0, 1017, 1053, 1, 0, 0, 0, 1018, 1019, 3, 116, 58, 0, 1019, 1020, 3, 146, 73, 0, 1020, 1053, 1, 0, 0, 0, 1021, 1022, 3, 118, 59, 0, 1022, 1023, 3, 6, 3, 0, 1023, 1053, 1, 0, 0, 0, 1024, 1025, 3, 118, 59, 0, 1025, 1026, 5, 223, 0, 0, 1026, 1027, 5, 29, 0, 0, 1027, 1028, 3, 6, 3, 0, 1028, 1029, 5, 30, 0, 0, 1029, 1053, 1, 0, 0, 0, 1030, 1031, 3, 118, 59, 0, 1031, 1032, 5, 83, 0, 0, 1032, 1033, 5, 29, 0, 0, 1033, 1034, 3, 312, 156, 0, 1034, 1035, 5, 30, 0, 0, 1035, 1053, 1, 0, 0, 0, 1036, 1037, 3, 120, 60, 0, 1037, 1038, 3, 192, 96, 0, 1038, 1039, 3, 160, 80, 0, 1039, 1040, 3, 134, 67, 0, 1040, 1053, 1, 0, 0, 0, 1041, 1042, 3, 122, 61, 0, 1042, 1043, 3, 50, 25, 0, 1043, 1053, 1, 0, 0, 0, 1044, 1045, 3, 124, 62, 0, 1045, 1046, 5, 29, 0, 0, 1046, 1047, 3, 128, 64, 0, 1047, 1048, 5, 30, 0, 0, 1048, 1053, 1, 0, 0, 0, 1049, 1050, 3, 124, 62, 0, 1050, 1051, 5, 84, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 973, 1, 0, 0, 0, 1052, 974, 1, 0, 0, 0, 1052, 977, 1, 0, 0, 0, 1052, 980, 1, 0, 0, 0, 1052, 983, 1, 0, 0, 0, 1052, 986, 1, 0, 0, 0, 1052, 989, 1, 0, 0, 0, 1052, 992, 1, 0, 0, 0, 1052, 997, 1, 0, 0, 0, 1052, 1003, 1, 0, 0, 0, 1052, 1006, 1, 0, 0, 0, 1052, 1009, 1, 0, 0, 0, 1052, 1012, 1, 0, 0, 0, 1052, 1015, 1, 0, 0, 0, 1052, 1018, 1, 0, 0, 0, 1052, 1021, 1, 0, 0, 0, 1052, 1024, 1, 0, 0, 0, 1052, 1030, 1, 0, 0, 0, 1052, 1036, 1, 0, 0, 0, 1052, 1041, 1, 0, 0, 0, 1052, 1044, 1, 0, 0, 0, 1052, 1049, 1, 0, 0, 0, 1053, 127, 1, 0, 0, 0, 1054, 1071, 1, 0, 0, 0, 1055, 1058, 3, 0, 0, 0, 1056, 1058, 3, 32, 16, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 27, 0, 0, 1060, 1062, 1, 0, 0, 0, 1061, 1057, 1, 0, 0, 0, 1062, 1065, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1068, 1, 0, 0, 0, 1065, 1063, 1, 0, 0, 0, 1066, 1069, 3, 0, 0, 0, 1067, 1069, 3, 32, 16, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1067, 1, 0, 0, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1054, 1, 0, 0, 0, 1070, 1063, 1, 0, 0, 0, 1071, 129, 1, 0, 0, 0, 1072, 1078, 5, 85, 0, 0, 1073, 1074, 3, 160, 80, 0, 1074, 1075, 5, 27, 0, 0, 1075, 1077, 1, 0, 0, 0, 1076, 1073, 1, 0, 0, 0, 1077, 1080, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1081, 1, 0, 0, 0, 1080, 1078, 1, 0, 0, 0, 1081, 1082, 3, 160, 80, 0, 1082, 1083, 5, 86, 0, 0, 1083, 131, 1, 0, 0, 0, 1084, 1090, 5, 41, 0, 0, 1085, 1086, 3, 168, 84, 0, 1086, 1087, 5, 27, 0, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1085, 1, 0, 0, 0, 1089, 1092, 1, 0, 0, 0, 1090, 1088, 1, 0, 0, 0, 1090, 1091, 1, 0, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1093, 1094, 3, 168, 84, 0, 1094, 1095, 5, 42, 0, 0, 1095, 133, 1, 0, 0, 0, 1096, 1102, 5, 29, 0, 0, 1097, 1098, 3, 136, 68, 0, 1098, 1099, 5, 27, 0, 0, 1099, 1101, 1, 0, 0, 0, 1100, 1097, 1, 0, 0, 0, 1101, 1104, 1, 0, 0, 0, 1102, 1100, 1, 0, 0, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1105, 1, 0, 0, 0, 1104, 1102, 1, 0, 0, 0, 1105, 1106, 3, 136, 68, 0, 1106, 1107, 5, 30, 0, 0, 1107, 1110, 1, 0, 0, 0, 1108, 1110, 5, 84, 0, 0, 1109, 1096, 1, 0, 0, 0, 1109, 1108, 1, 0, 0, 0, 1110, 135, 1, 0, 0, 0, 1111, 1119, 5, 176, 0, 0, 1112, 1113, 3, 252, 126, 0, 1113, 1114, 3, 160, 80, 0, 1114, 1116, 3, 248, 124, 0, 1115, 1117, 3, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1119, 1, 0, 0, 0, 1118, 1111, 1, 0, 0, 0, 1118, 1112, 1, 0, 0, 0, 1119, 137, 1, 0, 0, 0, 1120, 1121, 5, 41, 0, 0, 1121, 1122, 3, 2, 1, 0, 1122, 1123, 5, 42, 0, 0, 1123, 1124, 3, 140, 70, 0, 1124, 1146, 1, 0, 0, 0, 1125, 1126, 5, 41, 0, 0, 1126, 1127, 3, 196, 98, 0, 1127, 1128, 5, 42, 0, 0, 1128, 1129, 3, 140, 70, 0, 1129, 1146, 1, 0, 0, 0, 1130, 1131, 5, 41, 0, 0, 1131, 1132, 5, 261, 0, 0, 1132, 1133, 5, 42, 0, 0, 1133, 1146, 3, 140, 70, 0, 1134, 1135, 5, 41, 0, 0, 1135, 1136, 5, 197, 0, 0, 1136, 1137, 3, 2, 1, 0, 1137, 1138, 5, 42, 0, 0, 1138, 1139, 3, 140, 70, 0, 1139, 1146, 1, 0, 0, 0, 1140, 1146, 3, 140, 70, 0, 1141, 1146, 3, 196, 98, 0, 1142, 1146, 5, 256, 0, 0, 1143, 1146, 5, 257, 0, 0, 1144, 1146, 5, 258, 0, 0, 1145, 1120, 1, 0, 0, 0, 1145, 1125, 1, 0, 0, 0, 1145, 1130, 1, 0, 0, 0, 1145, 1134, 1, 0, 0, 0, 1145, 1140, 1, 0, 0, 0, 1145, 1141, 1, 0, 0, 0, 1145, 1142, 1, 0, 0, 0, 1145, 1143, 1, 0, 0, 0, 1145, 1144, 1, 0, 0, 0, 1146, 139, 1, 0, 0, 0, 1147, 1148, 3, 2, 1, 0, 1148, 1149, 5, 87, 0, 0, 1149, 1151, 1, 0, 0, 0, 1150, 1147, 1, 0, 0, 0, 1151, 1154, 1, 0, 0, 0, 1152, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1155, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1155, 1156, 3, 2, 1, 0, 1156, 141, 1, 0, 0, 0, 1157, 1159, 3, 144, 72, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1162, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 143, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1163, 1164, 5, 179, 0, 0, 1164, 1165, 5, 88, 0, 0, 1165, 1169, 3, 32, 16, 0, 1166, 1169, 3, 174, 87, 0, 1167, 1169, 3, 344, 172, 0, 1168, 1163, 1, 0, 0, 0, 1168, 1166, 1, 0, 0, 0, 1168, 1167, 1, 0, 0, 0, 1169, 145, 1, 0, 0, 0, 1170, 1182, 3, 138, 69, 0, 1171, 1172, 5, 41, 0, 0, 1172, 1173, 3, 2, 1, 0, 1173, 1174, 5, 42, 0, 0, 1174, 1182, 1, 0, 0, 0, 1175, 1176, 5, 41, 0, 0, 1176, 1177, 5, 197, 0, 0, 1177, 1178, 3, 2, 1, 0, 1178, 1179, 5, 42, 0, 0, 1179, 1182, 1, 0, 0, 0, 1180, 1182, 3, 160, 80, 0, 1181, 1170, 1, 0, 0, 0, 1181, 1171, 1, 0, 0, 0, 1181, 1175, 1, 0, 0, 0, 1181, 1180, 1, 0, 0, 0, 1182, 147, 1, 0, 0, 0, 1183, 1192, 1, 0, 0, 0, 1184, 1188, 3, 152, 76, 0, 1185, 1187, 3, 150, 75, 0, 1186, 1185, 1, 0, 0, 0, 1187, 1190, 1, 0, 0, 0, 1188, 1186, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1192, 1, 0, 0, 0, 1190, 1188, 1, 0, 0, 0, 1191, 1183, 1, 0, 0, 0, 1191, 1184, 1, 0, 0, 0, 1192, 149, 1, 0, 0, 0, 1193, 1211, 5, 261, 0, 0, 1194, 1211, 5, 260, 0, 0, 1195, 1196, 5, 41, 0, 0, 1196, 1197, 3, 32, 16, 0, 1197, 1198, 5, 42, 0, 0, 1198, 1211, 1, 0, 0, 0, 1199, 1200, 5, 41, 0, 0, 1200, 1201, 3, 32, 16, 0, 1201, 1202, 5, 265, 0, 0, 1202, 1203, 3, 32, 16, 0, 1203, 1204, 5, 42, 0, 0, 1204, 1211, 1, 0, 0, 0, 1205, 1206, 5, 41, 0, 0, 1206, 1207, 5, 265, 0, 0, 1207, 1208, 3, 32, 16, 0, 1208, 1209, 5, 42, 0, 0, 1209, 1211, 1, 0, 0, 0, 1210, 1193, 1, 0, 0, 0, 1210, 1194, 1, 0, 0, 0, 1210, 1195, 1, 0, 0, 0, 1210, 1199, 1, 0, 0, 0, 1210, 1205, 1, 0, 0, 0, 1211, 151, 1, 0, 0, 0, 1212, 1297, 1, 0, 0, 0, 1213, 1214, 5, 202, 0, 0, 1214, 1215, 5, 29, 0, 0, 1215, 1216, 3, 6, 3, 0, 1216, 1217, 5, 27, 0, 0, 1217, 1218, 3, 6, 3, 0, 1218, 1219, 5, 27, 0, 0, 1219, 1220, 3, 6, 3, 0, 1220, 1221, 5, 27, 0, 0, 1221, 1222, 3, 6, 3, 0, 1222, 1223, 5, 30, 0, 0, 1223, 1297, 1, 0, 0, 0, 1224, 1225, 5, 202, 0, 0, 1225, 1226, 5, 29, 0, 0, 1226, 1227, 3, 6, 3, 0, 1227, 1228, 5, 27, 0, 0, 1228, 1229, 3, 6, 3, 0, 1229, 1230, 5, 30, 0, 0, 1230, 1297, 1, 0, 0, 0, 1231, 1232, 5, 203, 0, 0, 1232, 1233, 5, 204, 0, 0, 1233, 1234, 5, 41, 0, 0, 1234, 1235, 3, 32, 16, 0, 1235, 1236, 5, 42, 0, 0, 1236, 1297, 1, 0, 0, 0, 1237, 1238, 5, 203, 0, 0, 1238, 1239, 5, 205, 0, 0, 1239, 1240, 5, 41, 0, 0, 1240, 1241, 3, 32, 16, 0, 1241, 1242, 5, 42, 0, 0, 1242, 1243, 3, 148, 74, 0, 1243, 1297, 1, 0, 0, 0, 1244, 1297, 5, 206, 0, 0, 1245, 1297, 5, 207, 0, 0, 1246, 1297, 5, 208, 0, 0, 1247, 1297, 5, 200, 0, 0, 1248, 1297, 5, 182, 0, 0, 1249, 1297, 5, 183, 0, 0, 1250, 1297, 5, 184, 0, 0, 1251, 1297, 5, 185, 0, 0, 1252, 1297, 5, 186, 0, 0, 1253, 1297, 5, 187, 0, 0, 1254, 1297, 5, 188, 0, 0, 1255, 1297, 5, 209, 0, 0, 1256, 1297, 5, 189, 0, 0, 1257, 1297, 5, 190, 0, 0, 1258, 1297, 5, 191, 0, 0, 1259, 1297, 5, 192, 0, 0, 1260, 1297, 5, 210, 0, 0, 1261, 1297, 5, 211, 0, 0, 1262, 1297, 5, 212, 0, 0, 1263, 1297, 5, 213, 0, 0, 1264, 1297, 5, 214, 0, 0, 1265, 1297, 5, 215, 0, 0, 1266, 1297, 5, 216, 0, 0, 1267, 1268, 5, 217, 0, 0, 1268, 1297, 3, 154, 77, 0, 1269, 1270, 5, 218, 0, 0, 1270, 1297, 3, 154, 77, 0, 1271, 1297, 5, 219, 0, 0, 1272, 1273, 5, 220, 0, 0, 1273, 1297, 3, 154, 77, 0, 1274, 1275, 5, 221, 0, 0, 1275, 1297, 3, 156, 78, 0, 1276, 1277, 5, 221, 0, 0, 1277, 1278, 3, 156, 78, 0, 1278, 1279, 5, 27, 0, 0, 1279, 1280, 3, 6, 3, 0, 1280, 1297, 1, 0, 0, 0, 1281, 1297, 5, 193, 0, 0, 1282, 1297, 5, 194, 0, 0, 1283, 1284, 5, 61, 0, 0, 1284, 1297, 5, 219, 0, 0, 1285, 1297, 5, 222, 0, 0, 1286, 1287, 5, 223, 0, 0, 1287, 1297, 5, 212, 0, 0, 1288, 1297, 5, 224, 0, 0, 1289, 1290, 5, 206, 0, 0, 1290, 1297, 5, 182, 0, 0, 1291, 1297, 5, 225, 0, 0, 1292, 1297, 5, 227, 0, 0, 1293, 1294, 5, 33, 0, 0, 1294, 1297, 5, 226, 0, 0, 1295, 1297, 3, 2, 1, 0, 1296, 1212, 1, 0, 0, 0, 1296, 1213, 1, 0, 0, 0, 1296, 1224, 1, 0, 0, 0, 1296, 1231, 1, 0, 0, 0, 1296, 1237, 1, 0, 0, 0, 1296, 1244, 1, 0, 0, 0, 1296, 1245, 1, 0, 0, 0, 1296, 1246, 1, 0, 0, 0, 1296, 1247, 1, 0, 0, 0, 1296, 1248, 1, 0, 0, 0, 1296, 1249, 1, 0, 0, 0, 1296, 1250, 1, 0, 0, 0, 1296, 1251, 1, 0, 0, 0, 1296, 1252, 1, 0, 0, 0, 1296, 1253, 1, 0, 0, 0, 1296, 1254, 1, 0, 0, 0, 1296, 1255, 1, 0, 0, 0, 1296, 1256, 1, 0, 0, 0, 1296, 1257, 1, 0, 0, 0, 1296, 1258, 1, 0, 0, 0, 1296, 1259, 1, 0, 0, 0, 1296, 1260, 1, 0, 0, 0, 1296, 1261, 1, 0, 0, 0, 1296, 1262, 1, 0, 0, 0, 1296, 1263, 1, 0, 0, 0, 1296, 1264, 1, 0, 0, 0, 1296, 1265, 1, 0, 0, 0, 1296, 1266, 1, 0, 0, 0, 1296, 1267, 1, 0, 0, 0, 1296, 1269, 1, 0, 0, 0, 1296, 1271, 1, 0, 0, 0, 1296, 1272, 1, 0, 0, 0, 1296, 1274, 1, 0, 0, 0, 1296, 1276, 1, 0, 0, 0, 1296, 1281, 1, 0, 0, 0, 1296, 1282, 1, 0, 0, 0, 1296, 1283, 1, 0, 0, 0, 1296, 1285, 1, 0, 0, 0, 1296, 1286, 1, 0, 0, 0, 1296, 1288, 1, 0, 0, 0, 1296, 1289, 1, 0, 0, 0, 1296, 1291, 1, 0, 0, 0, 1296, 1292, 1, 0, 0, 0, 1296, 1293, 1, 0, 0, 0, 1296, 1295, 1, 0, 0, 0, 1297, 153, 1, 0, 0, 0, 1298, 1306, 1, 0, 0, 0, 1299, 1300, 5, 29, 0, 0, 1300, 1301, 5, 89, 0, 0, 1301, 1302, 5, 35, 0, 0, 1302, 1303, 3, 32, 16, 0, 1303, 1304, 5, 30, 0, 0, 1304, 1306, 1, 0, 0, 0, 1305, 1298, 1, 0, 0, 0, 1305, 1299, 1, 0, 0, 0, 1306, 155, 1, 0, 0, 0, 1307, 1316, 1, 0, 0, 0, 1308, 1312, 3, 158, 79, 0, 1309, 1311, 7, 7, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1314, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1316, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1315, 1307, 1, 0, 0, 0, 1315, 1308, 1, 0, 0, 0, 1316, 157, 1, 0, 0, 0, 1317, 1318, 7, 8, 0, 0, 1318, 159, 1, 0, 0, 0, 1319, 1323, 3, 164, 82, 0, 1320, 1322, 3, 162, 81, 0, 1321, 1320, 1, 0, 0, 0, 1322, 1325, 1, 0, 0, 0, 1323, 1321, 1, 0, 0, 0, 1323, 1324, 1, 0, 0, 0, 1324, 161, 1, 0, 0, 0, 1325, 1323, 1, 0, 0, 0, 1326, 1345, 5, 260, 0, 0, 1327, 1328, 5, 41, 0, 0, 1328, 1345, 5, 42, 0, 0, 1329, 1345, 3, 132, 66, 0, 1330, 1345, 5, 259, 0, 0, 1331, 1345, 5, 261, 0, 0, 1332, 1345, 5, 90, 0, 0, 1333, 1334, 5, 91, 0, 0, 1334, 1335, 5, 29, 0, 0, 1335, 1336, 3, 146, 73, 0, 1336, 1337, 5, 30, 0, 0, 1337, 1345, 1, 0, 0, 0, 1338, 1339, 5, 92, 0, 0, 1339, 1340, 5, 29, 0, 0, 1340, 1341, 3, 146, 73, 0, 1341, 1342, 5, 30, 0, 0, 1342, 1345, 1, 0, 0, 0, 1343, 1345, 3, 130, 65, 0, 1344, 1326, 1, 0, 0, 0, 1344, 1327, 1, 0, 0, 0, 1344, 1329, 1, 0, 0, 0, 1344, 1330, 1, 0, 0, 0, 1344, 1331, 1, 0, 0, 0, 1344, 1332, 1, 0, 0, 0, 1344, 1333, 1, 0, 0, 0, 1344, 1338, 1, 0, 0, 0, 1344, 1343, 1, 0, 0, 0, 1345, 163, 1, 0, 0, 0, 1346, 1347, 5, 38, 0, 0, 1347, 1377, 3, 138, 69, 0, 1348, 1377, 5, 196, 0, 0, 1349, 1350, 5, 198, 0, 0, 1350, 1351, 5, 38, 0, 0, 1351, 1377, 3, 138, 69, 0, 1352, 1353, 5, 199, 0, 0, 1353, 1377, 3, 138, 69, 0, 1354, 1355, 5, 225, 0, 0, 1355, 1356, 3, 192, 96, 0, 1356, 1357, 3, 160, 80, 0, 1357, 1358, 5, 261, 0, 0, 1358, 1359, 3, 134, 67, 0, 1359, 1377, 1, 0, 0, 0, 1360, 1361, 5, 252, 0, 0, 1361, 1377, 3, 32, 16, 0, 1362, 1363, 5, 251, 0, 0, 1363, 1377, 3, 32, 16, 0, 1364, 1365, 5, 252, 0, 0, 1365, 1377, 3, 2, 1, 0, 1366, 1367, 5, 251, 0, 0, 1367, 1377, 3, 2, 1, 0, 1368, 1377, 5, 253, 0, 0, 1369, 1377, 5, 200, 0, 0, 1370, 1377, 3, 170, 85, 0, 1371, 1377, 3, 172, 86, 0, 1372, 1377, 3, 166, 83, 0, 1373, 1377, 3, 2, 1, 0, 1374, 1375, 5, 176, 0, 0, 1375, 1377, 3, 160, 80, 0, 1376, 1346, 1, 0, 0, 0, 1376, 1348, 1, 0, 0, 0, 1376, 1349, 1, 0, 0, 0, 1376, 1352, 1, 0, 0, 0, 1376, 1354, 1, 0, 0, 0, 1376, 1360, 1, 0, 0, 0, 1376, 1362, 1, 0, 0, 0, 1376, 1364, 1, 0, 0, 0, 1376, 1366, 1, 0, 0, 0, 1376, 1368, 1, 0, 0, 0, 1376, 1369, 1, 0, 0, 0, 1376, 1370, 1, 0, 0, 0, 1376, 1371, 1, 0, 0, 0, 1376, 1372, 1, 0, 0, 0, 1376, 1373, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1377, 165, 1, 0, 0, 0, 1378, 1400, 5, 180, 0, 0, 1379, 1400, 5, 181, 0, 0, 1380, 1400, 5, 182, 0, 0, 1381, 1400, 5, 183, 0, 0, 1382, 1400, 5, 184, 0, 0, 1383, 1400, 5, 185, 0, 0, 1384, 1400, 5, 186, 0, 0, 1385, 1400, 5, 187, 0, 0, 1386, 1400, 5, 188, 0, 0, 1387, 1400, 5, 189, 0, 0, 1388, 1400, 5, 190, 0, 0, 1389, 1400, 5, 191, 0, 0, 1390, 1400, 5, 192, 0, 0, 1391, 1392, 5, 93, 0, 0, 1392, 1400, 5, 183, 0, 0, 1393, 1394, 5, 93, 0, 0, 1394, 1400, 5, 184, 0, 0, 1395, 1396, 5, 93, 0, 0, 1396, 1400, 5, 185, 0, 0, 1397, 1398, 5, 93, 0, 0, 1398, 1400, 5, 186, 0, 0, 1399, 1378, 1, 0, 0, 0, 1399, 1379, 1, 0, 0, 0, 1399, 1380, 1, 0, 0, 0, 1399, 1381, 1, 0, 0, 0, 1399, 1382, 1, 0, 0, 0, 1399, 1383, 1, 0, 0, 0, 1399, 1384, 1, 0, 0, 0, 1399, 1385, 1, 0, 0, 0, 1399, 1386, 1, 0, 0, 0, 1399, 1387, 1, 0, 0, 0, 1399, 1388, 1, 0, 0, 0, 1399, 1389, 1, 0, 0, 0, 1399, 1390, 1, 0, 0, 0, 1399, 1391, 1, 0, 0, 0, 1399, 1393, 1, 0, 0, 0, 1399, 1395, 1, 0, 0, 0, 1399, 1397, 1, 0, 0, 0, 1400, 167, 1, 0, 0, 0, 1401, 1412, 1, 0, 0, 0, 1402, 1412, 5, 176, 0, 0, 1403, 1412, 3, 32, 16, 0, 1404, 1405, 3, 32, 16, 0, 1405, 1406, 5, 176, 0, 0, 1406, 1407, 3, 32, 16, 0, 1407, 1412, 1, 0, 0, 0, 1408, 1409, 3, 32, 16, 0, 1409, 1410, 5, 176, 0, 0, 1410, 1412, 1, 0, 0, 0, 1411, 1401, 1, 0, 0, 0, 1411, 1402, 1, 0, 0, 0, 1411, 1403, 1, 0, 0, 0, 1411, 1404, 1, 0, 0, 0, 1411, 1408, 1, 0, 0, 0, 1412, 169, 1, 0, 0, 0, 1413, 1414, 5, 1, 0, 0, 1414, 1415, 5, 193, 0, 0, 1415, 171, 1, 0, 0, 0, 1416, 1420, 5, 1, 0, 0, 1417, 1418, 5, 93, 0, 0, 1418, 1421, 5, 193, 0, 0, 1419, 1421, 5, 194, 0, 0, 1420, 1417, 1, 0, 0, 0, 1420, 1419, 1, 0, 0, 0, 1421, 173, 1, 0, 0, 0, 1422, 1423, 5, 293, 0, 0, 1423, 1424, 3, 188, 94, 0, 1424, 1425, 3, 146, 73, 0, 1425, 1426, 5, 29, 0, 0, 1426, 1427, 3, 180, 90, 0, 1427, 1428, 5, 30, 0, 0, 1428, 1463, 1, 0, 0, 0, 1429, 1430, 5, 293, 0, 0, 1430, 1431, 3, 188, 94, 0, 1431, 1432, 3, 146, 73, 0, 1432, 1433, 5, 35, 0, 0, 1433, 1434, 5, 16, 0, 0, 1434, 1435, 3, 52, 26, 0, 1435, 1436, 5, 17, 0, 0, 1436, 1463, 1, 0, 0, 0, 1437, 1438, 5, 293, 0, 0, 1438, 1439, 3, 188, 94, 0, 1439, 1440, 3, 146, 73, 0, 1440, 1463, 1, 0, 0, 0, 1441, 1442, 5, 294, 0, 0, 1442, 1443, 3, 188, 94, 0, 1443, 1445, 5, 35, 0, 0, 1444, 1446, 5, 83, 0, 0, 1445, 1444, 1, 0, 0, 0, 1445, 1446, 1, 0, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1448, 5, 29, 0, 0, 1448, 1449, 3, 312, 156, 0, 1449, 1450, 5, 30, 0, 0, 1450, 1463, 1, 0, 0, 0, 1451, 1452, 5, 294, 0, 0, 1452, 1453, 3, 188, 94, 0, 1453, 1454, 3, 6, 3, 0, 1454, 1463, 1, 0, 0, 0, 1455, 1456, 5, 294, 0, 0, 1456, 1457, 3, 188, 94, 0, 1457, 1458, 5, 35, 0, 0, 1458, 1459, 5, 16, 0, 0, 1459, 1460, 3, 176, 88, 0, 1460, 1461, 5, 17, 0, 0, 1461, 1463, 1, 0, 0, 0, 1462, 1422, 1, 0, 0, 0, 1462, 1429, 1, 0, 0, 0, 1462, 1437, 1, 0, 0, 0, 1462, 1441, 1, 0, 0, 0, 1462, 1451, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1463, 175, 1, 0, 0, 0, 1464, 1475, 1, 0, 0, 0, 1465, 1466, 3, 178, 89, 0, 1466, 1467, 5, 27, 0, 0, 1467, 1469, 1, 0, 0, 0, 1468, 1465, 1, 0, 0, 0, 1469, 1472, 1, 0, 0, 0, 1470, 1468, 1, 0, 0, 0, 1470, 1471, 1, 0, 0, 0, 1471, 1473, 1, 0, 0, 0, 1472, 1470, 1, 0, 0, 0, 1473, 1475, 3, 178, 89, 0, 1474, 1464, 1, 0, 0, 0, 1474, 1470, 1, 0, 0, 0, 1475, 177, 1, 0, 0, 0, 1476, 1477, 5, 38, 0, 0, 1477, 1478, 5, 263, 0, 0, 1478, 1479, 5, 35, 0, 0, 1479, 1480, 5, 16, 0, 0, 1480, 1481, 3, 56, 28, 0, 1481, 1482, 5, 17, 0, 0, 1482, 1490, 1, 0, 0, 0, 1483, 1484, 3, 146, 73, 0, 1484, 1485, 5, 35, 0, 0, 1485, 1486, 5, 16, 0, 0, 1486, 1487, 3, 56, 28, 0, 1487, 1488, 5, 17, 0, 0, 1488, 1490, 1, 0, 0, 0, 1489, 1476, 1, 0, 0, 0, 1489, 1483, 1, 0, 0, 0, 1490, 179, 1, 0, 0, 0, 1491, 1492, 3, 182, 91, 0, 1492, 1493, 5, 27, 0, 0, 1493, 1495, 1, 0, 0, 0, 1494, 1491, 1, 0, 0, 0, 1495, 1498, 1, 0, 0, 0, 1496, 1494, 1, 0, 0, 0, 1496, 1497, 1, 0, 0, 0, 1497, 1499, 1, 0, 0, 0, 1498, 1496, 1, 0, 0, 0, 1499, 1500, 3, 182, 91, 0, 1500, 181, 1, 0, 0, 0, 1501, 1502, 3, 6, 3, 0, 1502, 1503, 5, 35, 0, 0, 1503, 1504, 3, 186, 93, 0, 1504, 183, 1, 0, 0, 0, 1505, 1506, 7, 9, 0, 0, 1506, 185, 1, 0, 0, 0, 1507, 1542, 3, 184, 92, 0, 1508, 1542, 3, 32, 16, 0, 1509, 1510, 5, 185, 0, 0, 1510, 1511, 5, 29, 0, 0, 1511, 1512, 3, 32, 16, 0, 1512, 1513, 5, 30, 0, 0, 1513, 1542, 1, 0, 0, 0, 1514, 1542, 3, 6, 3, 0, 1515, 1516, 3, 138, 69, 0, 1516, 1517, 5, 29, 0, 0, 1517, 1518, 5, 183, 0, 0, 1518, 1519, 5, 74, 0, 0, 1519, 1520, 3, 32, 16, 0, 1520, 1521, 5, 30, 0, 0, 1521, 1542, 1, 0, 0, 0, 1522, 1523, 3, 138, 69, 0, 1523, 1524, 5, 29, 0, 0, 1524, 1525, 5, 184, 0, 0, 1525, 1526, 5, 74, 0, 0, 1526, 1527, 3, 32, 16, 0, 1527, 1528, 5, 30, 0, 0, 1528, 1542, 1, 0, 0, 0, 1529, 1530, 3, 138, 69, 0, 1530, 1531, 5, 29, 0, 0, 1531, 1532, 5, 185, 0, 0, 1532, 1533, 5, 74, 0, 0, 1533, 1534, 3, 32, 16, 0, 1534, 1535, 5, 30, 0, 0, 1535, 1542, 1, 0, 0, 0, 1536, 1537, 3, 138, 69, 0, 1537, 1538, 5, 29, 0, 0, 1538, 1539, 3, 32, 16, 0, 1539, 1540, 5, 30, 0, 0, 1540, 1542, 1, 0, 0, 0, 1541, 1507, 1, 0, 0, 0, 1541, 1508, 1, 0, 0, 0, 1541, 1509, 1, 0, 0, 0, 1541, 1514, 1, 0, 0, 0, 1541, 1515, 1, 0, 0, 0, 1541, 1522, 1, 0, 0, 0, 1541, 1529, 1, 0, 0, 0, 1541, 1536, 1, 0, 0, 0, 1542, 187, 1, 0, 0, 0, 1543, 1544, 7, 10, 0, 0, 1544, 189, 1, 0, 0, 0, 1545, 1546, 3, 192, 96, 0, 1546, 1547, 3, 160, 80, 0, 1547, 1548, 3, 146, 73, 0, 1548, 1549, 5, 175, 0, 0, 1549, 1551, 3, 264, 132, 0, 1550, 1552, 3, 130, 65, 0, 1551, 1550, 1, 0, 0, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1553, 1, 0, 0, 0, 1553, 1554, 3, 134, 67, 0, 1554, 1580, 1, 0, 0, 0, 1555, 1556, 3, 192, 96, 0, 1556, 1557, 3, 160, 80, 0, 1557, 1558, 3, 146, 73, 0, 1558, 1559, 5, 175, 0, 0, 1559, 1560, 3, 264, 132, 0, 1560, 1561, 3, 218, 109, 0, 1561, 1562, 3, 134, 67, 0, 1562, 1580, 1, 0, 0, 0, 1563, 1564, 3, 192, 96, 0, 1564, 1565, 3, 160, 80, 0, 1565, 1567, 3, 264, 132, 0, 1566, 1568, 3, 130, 65, 0, 1567, 1566, 1, 0, 0, 0, 1567, 1568, 1, 0, 0, 0, 1568, 1569, 1, 0, 0, 0, 1569, 1570, 3, 134, 67, 0, 1570, 1580, 1, 0, 0, 0, 1571, 1572, 3, 192, 96, 0, 1572, 1573, 3, 160, 80, 0, 1573, 1574, 3, 264, 132, 0, 1574, 1575, 3, 218, 109, 0, 1575, 1576, 3, 134, 67, 0, 1576, 1580, 1, 0, 0, 0, 1577, 1580, 3, 196, 98, 0, 1578, 1580, 3, 2, 1, 0, 1579, 1545, 1, 0, 0, 0, 1579, 1555, 1, 0, 0, 0, 1579, 1563, 1, 0, 0, 0, 1579, 1571, 1, 0, 0, 0, 1579, 1577, 1, 0, 0, 0, 1579, 1578, 1, 0, 0, 0, 1580, 191, 1, 0, 0, 0, 1581, 1582, 5, 242, 0, 0, 1582, 1592, 3, 192, 96, 0, 1583, 1584, 5, 243, 0, 0, 1584, 1592, 3, 192, 96, 0, 1585, 1592, 3, 194, 97, 0, 1586, 1587, 5, 111, 0, 0, 1587, 1588, 5, 29, 0, 0, 1588, 1589, 3, 32, 16, 0, 1589, 1590, 5, 30, 0, 0, 1590, 1592, 1, 0, 0, 0, 1591, 1581, 1, 0, 0, 0, 1591, 1583, 1, 0, 0, 0, 1591, 1585, 1, 0, 0, 0, 1591, 1586, 1, 0, 0, 0, 1592, 193, 1, 0, 0, 0, 1593, 1606, 1, 0, 0, 0, 1594, 1606, 5, 244, 0, 0, 1595, 1606, 5, 245, 0, 0, 1596, 1597, 5, 246, 0, 0, 1597, 1606, 5, 247, 0, 0, 1598, 1599, 5, 246, 0, 0, 1599, 1606, 5, 248, 0, 0, 1600, 1601, 5, 246, 0, 0, 1601, 1606, 5, 249, 0, 0, 1602, 1603, 5, 246, 0, 0, 1603, 1606, 5, 250, 0, 0, 1604, 1606, 5, 246, 0, 0, 1605, 1593, 1, 0, 0, 0, 1605, 1594, 1, 0, 0, 0, 1605, 1595, 1, 0, 0, 0, 1605, 1596, 1, 0, 0, 0, 1605, 1598, 1, 0, 0, 0, 1605, 1600, 1, 0, 0, 0, 1605, 1602, 1, 0, 0, 0, 1605, 1604, 1, 0, 0, 0, 1606, 195, 1, 0, 0, 0, 1607, 1608, 5, 112, 0, 0, 1608, 1609, 5, 29, 0, 0, 1609, 1610, 3, 32, 16, 0, 1610, 1611, 5, 30, 0, 0, 1611, 197, 1, 0, 0, 0, 1612, 1613, 5, 225, 0, 0, 1613, 1618, 3, 190, 95, 0, 1614, 1615, 5, 36, 0, 0, 1615, 1618, 3, 200, 100, 0, 1616, 1618, 3, 196, 98, 0, 1617, 1612, 1, 0, 0, 0, 1617, 1614, 1, 0, 0, 0, 1617, 1616, 1, 0, 0, 0, 1618, 199, 1, 0, 0, 0, 1619, 1620, 3, 160, 80, 0, 1620, 1621, 3, 146, 73, 0, 1621, 1622, 5, 175, 0, 0, 1622, 1623, 3, 2, 1, 0, 1623, 1629, 1, 0, 0, 0, 1624, 1625, 3, 160, 80, 0, 1625, 1626, 3, 2, 1, 0, 1626, 1629, 1, 0, 0, 0, 1627, 1629, 3, 2, 1, 0, 1628, 1619, 1, 0, 0, 0, 1628, 1624, 1, 0, 0, 0, 1628, 1627, 1, 0, 0, 0, 1629, 201, 1, 0, 0, 0, 1630, 1631, 3, 146, 73, 0, 1631, 1632, 5, 27, 0, 0, 1632, 1634, 1, 0, 0, 0, 1633, 1630, 1, 0, 0, 0, 1634, 1637, 1, 0, 0, 0, 1635, 1633, 1, 0, 0, 0, 1635, 1636, 1, 0, 0, 0, 1636, 1638, 1, 0, 0, 0, 1637, 1635, 1, 0, 0, 0, 1638, 1639, 3, 146, 73, 0, 1639, 203, 1, 0, 0, 0, 1640, 1646, 1, 0, 0, 0, 1641, 1642, 5, 85, 0, 0, 1642, 1643, 3, 212, 106, 0, 1643, 1644, 5, 86, 0, 0, 1644, 1646, 1, 0, 0, 0, 1645, 1640, 1, 0, 0, 0, 1645, 1641, 1, 0, 0, 0, 1646, 205, 1, 0, 0, 0, 1647, 1659, 5, 265, 0, 0, 1648, 1659, 5, 113, 0, 0, 1649, 1659, 5, 38, 0, 0, 1650, 1659, 5, 199, 0, 0, 1651, 1659, 5, 114, 0, 0, 1652, 1659, 5, 115, 0, 0, 1653, 1654, 5, 69, 0, 0, 1654, 1655, 5, 29, 0, 0, 1655, 1656, 3, 32, 16, 0, 1656, 1657, 5, 30, 0, 0, 1657, 1659, 1, 0, 0, 0, 1658, 1647, 1, 0, 0, 0, 1658, 1648, 1, 0, 0, 0, 1658, 1649, 1, 0, 0, 0, 1658, 1650, 1, 0, 0, 0, 1658, 1651, 1, 0, 0, 0, 1658, 1652, 1, 0, 0, 0, 1658, 1653, 1, 0, 0, 0, 1659, 207, 1, 0, 0, 0, 1660, 1662, 3, 206, 103, 0, 1661, 1660, 1, 0, 0, 0, 1662, 1665, 1, 0, 0, 0, 1663, 1661, 1, 0, 0, 0, 1663, 1664, 1, 0, 0, 0, 1664, 209, 1, 0, 0, 0, 1665, 1663, 1, 0, 0, 0, 1666, 1668, 3, 208, 104, 0, 1667, 1669, 3, 214, 107, 0, 1668, 1667, 1, 0, 0, 0, 1668, 1669, 1, 0, 0, 0, 1669, 1670, 1, 0, 0, 0, 1670, 1671, 3, 2, 1, 0, 1671, 211, 1, 0, 0, 0, 1672, 1673, 3, 210, 105, 0, 1673, 1674, 5, 27, 0, 0, 1674, 1676, 1, 0, 0, 0, 1675, 1672, 1, 0, 0, 0, 1676, 1679, 1, 0, 0, 0, 1677, 1675, 1, 0, 0, 0, 1677, 1678, 1, 0, 0, 0, 1678, 1680, 1, 0, 0, 0, 1679, 1677, 1, 0, 0, 0, 1680, 1681, 3, 210, 105, 0, 1681, 213, 1, 0, 0, 0, 1682, 1683, 5, 29, 0, 0, 1683, 1684, 3, 202, 101, 0, 1684, 1685, 5, 30, 0, 0, 1685, 215, 1, 0, 0, 0, 1686, 1689, 1, 0, 0, 0, 1687, 1689, 3, 218, 109, 0, 1688, 1686, 1, 0, 0, 0, 1688, 1687, 1, 0, 0, 0, 1689, 217, 1, 0, 0, 0, 1690, 1691, 5, 85, 0, 0, 1691, 1692, 5, 41, 0, 0, 1692, 1693, 3, 32, 16, 0, 1693, 1694, 5, 42, 0, 0, 1694, 1695, 5, 86, 0, 0, 1695, 219, 1, 0, 0, 0, 1696, 1697, 3, 256, 128, 0, 1697, 1698, 5, 16, 0, 0, 1698, 1699, 3, 268, 134, 0, 1699, 1700, 5, 17, 0, 0, 1700, 1813, 1, 0, 0, 0, 1701, 1702, 3, 74, 37, 0, 1702, 1703, 5, 16, 0, 0, 1703, 1704, 3, 82, 41, 0, 1704, 1705, 5, 17, 0, 0, 1705, 1813, 1, 0, 0, 0, 1706, 1707, 3, 232, 116, 0, 1707, 1708, 5, 16, 0, 0, 1708, 1709, 3, 236, 118, 0, 1709, 1710, 5, 17, 0, 0, 1710, 1813, 1, 0, 0, 0, 1711, 1712, 3, 240, 120, 0, 1712, 1713, 5, 16, 0, 0, 1713, 1714, 3, 244, 122, 0, 1714, 1715, 5, 17, 0, 0, 1715, 1813, 1, 0, 0, 0, 1716, 1813, 3, 222, 111, 0, 1717, 1813, 3, 296, 148, 0, 1718, 1813, 3, 174, 87, 0, 1719, 1813, 3, 88, 44, 0, 1720, 1813, 3, 342, 171, 0, 1721, 1722, 5, 116, 0, 0, 1722, 1813, 3, 32, 16, 0, 1723, 1724, 5, 117, 0, 0, 1724, 1813, 3, 32, 16, 0, 1725, 1726, 3, 354, 177, 0, 1726, 1727, 5, 16, 0, 0, 1727, 1728, 3, 358, 179, 0, 1728, 1729, 5, 17, 0, 0, 1729, 1813, 1, 0, 0, 0, 1730, 1731, 5, 301, 0, 0, 1731, 1732, 3, 146, 73, 0, 1732, 1733, 5, 175, 0, 0, 1733, 1734, 3, 264, 132, 0, 1734, 1735, 5, 118, 0, 0, 1735, 1736, 3, 192, 96, 0, 1736, 1737, 3, 160, 80, 0, 1737, 1738, 3, 146, 73, 0, 1738, 1739, 5, 175, 0, 0, 1739, 1740, 3, 264, 132, 0, 1740, 1741, 3, 134, 67, 0, 1741, 1813, 1, 0, 0, 0, 1742, 1743, 5, 301, 0, 0, 1743, 1744, 5, 225, 0, 0, 1744, 1745, 3, 192, 96, 0, 1745, 1746, 3, 160, 80, 0, 1746, 1747, 3, 146, 73, 0, 1747, 1748, 5, 175, 0, 0, 1748, 1749, 3, 264, 132, 0, 1749, 1750, 3, 216, 108, 0, 1750, 1751, 3, 134, 67, 0, 1751, 1752, 5, 118, 0, 0, 1752, 1753, 5, 225, 0, 0, 1753, 1754, 3, 192, 96, 0, 1754, 1755, 3, 160, 80, 0, 1755, 1756, 3, 146, 73, 0, 1756, 1757, 5, 175, 0, 0, 1757, 1758, 3, 264, 132, 0, 1758, 1759, 3, 216, 108, 0, 1759, 1760, 3, 134, 67, 0, 1760, 1813, 1, 0, 0, 0, 1761, 1813, 3, 26, 13, 0, 1762, 1813, 3, 40, 20, 0, 1763, 1764, 5, 254, 0, 0, 1764, 1765, 5, 195, 0, 0, 1765, 1766, 5, 41, 0, 0, 1766, 1767, 3, 32, 16, 0, 1767, 1771, 5, 42, 0, 0, 1768, 1770, 3, 342, 171, 0, 1769, 1768, 1, 0, 0, 0, 1770, 1773, 1, 0, 0, 0, 1771, 1769, 1, 0, 0, 0, 1771, 1772, 1, 0, 0, 0, 1772, 1813, 1, 0, 0, 0, 1773, 1771, 1, 0, 0, 0, 1774, 1775, 5, 254, 0, 0, 1775, 1776, 5, 195, 0, 0, 1776, 1780, 3, 2, 1, 0, 1777, 1779, 3, 342, 171, 0, 1778, 1777, 1, 0, 0, 0, 1779, 1782, 1, 0, 0, 0, 1780, 1778, 1, 0, 0, 0, 1780, 1781, 1, 0, 0, 0, 1781, 1813, 1, 0, 0, 0, 1782, 1780, 1, 0, 0, 0, 1783, 1784, 5, 254, 0, 0, 1784, 1785, 5, 255, 0, 0, 1785, 1786, 5, 41, 0, 0, 1786, 1787, 3, 32, 16, 0, 1787, 1788, 5, 42, 0, 0, 1788, 1789, 5, 27, 0, 0, 1789, 1793, 3, 146, 73, 0, 1790, 1792, 3, 342, 171, 0, 1791, 1790, 1, 0, 0, 0, 1792, 1795, 1, 0, 0, 0, 1793, 1791, 1, 0, 0, 0, 1793, 1794, 1, 0, 0, 0, 1794, 1813, 1, 0, 0, 0, 1795, 1793, 1, 0, 0, 0, 1796, 1797, 5, 254, 0, 0, 1797, 1798, 5, 255, 0, 0, 1798, 1799, 3, 2, 1, 0, 1799, 1800, 5, 27, 0, 0, 1800, 1804, 3, 146, 73, 0, 1801, 1803, 3, 342, 171, 0, 1802, 1801, 1, 0, 0, 0, 1803, 1806, 1, 0, 0, 0, 1804, 1802, 1, 0, 0, 0, 1804, 1805, 1, 0, 0, 0, 1805, 1813, 1, 0, 0, 0, 1806, 1804, 1, 0, 0, 0, 1807, 1808, 5, 119, 0, 0, 1808, 1809, 5, 195, 0, 0, 1809, 1810, 3, 146, 73, 0, 1810, 1811, 3, 44, 22, 0, 1811, 1813, 1, 0, 0, 0, 1812, 1696, 1, 0, 0, 0, 1812, 1701, 1, 0, 0, 0, 1812, 1706, 1, 0, 0, 0, 1812, 1711, 1, 0, 0, 0, 1812, 1716, 1, 0, 0, 0, 1812, 1717, 1, 0, 0, 0, 1812, 1718, 1, 0, 0, 0, 1812, 1719, 1, 0, 0, 0, 1812, 1720, 1, 0, 0, 0, 1812, 1721, 1, 0, 0, 0, 1812, 1723, 1, 0, 0, 0, 1812, 1725, 1, 0, 0, 0, 1812, 1730, 1, 0, 0, 0, 1812, 1742, 1, 0, 0, 0, 1812, 1761, 1, 0, 0, 0, 1812, 1762, 1, 0, 0, 0, 1812, 1763, 1, 0, 0, 0, 1812, 1774, 1, 0, 0, 0, 1812, 1783, 1, 0, 0, 0, 1812, 1796, 1, 0, 0, 0, 1812, 1807, 1, 0, 0, 0, 1813, 221, 1, 0, 0, 0, 1814, 1815, 5, 120, 0, 0, 1815, 1824, 3, 230, 115, 0, 1816, 1823, 3, 224, 112, 0, 1817, 1818, 5, 121, 0, 0, 1818, 1819, 5, 29, 0, 0, 1819, 1820, 3, 250, 125, 0, 1820, 1821, 5, 30, 0, 0, 1821, 1823, 1, 0, 0, 0, 1822, 1816, 1, 0, 0, 0, 1822, 1817, 1, 0, 0, 0, 1823, 1826, 1, 0, 0, 0, 1824, 1822, 1, 0, 0, 0, 1824, 1825, 1, 0, 0, 0, 1825, 1827, 1, 0, 0, 0, 1826, 1824, 1, 0, 0, 0, 1827, 1828, 3, 160, 80, 0, 1828, 1829, 3, 2, 1, 0, 1829, 1830, 3, 226, 113, 0, 1830, 1831, 3, 228, 114, 0, 1831, 223, 1, 0, 0, 0, 1832, 1852, 5, 122, 0, 0, 1833, 1852, 5, 50, 0, 0, 1834, 1852, 5, 51, 0, 0, 1835, 1852, 5, 62, 0, 0, 1836, 1852, 5, 123, 0, 0, 1837, 1852, 5, 68, 0, 0, 1838, 1852, 5, 67, 0, 0, 1839, 1852, 5, 63, 0, 0, 1840, 1852, 5, 64, 0, 0, 1841, 1852, 5, 65, 0, 0, 1842, 1852, 5, 124, 0, 0, 1843, 1852, 5, 125, 0, 0, 1844, 1852, 5, 126, 0, 0, 1845, 1852, 5, 127, 0, 0, 1846, 1847, 5, 69, 0, 0, 1847, 1848, 5, 29, 0, 0, 1848, 1849, 3, 32, 16, 0, 1849, 1850, 5, 30, 0, 0, 1850, 1852, 1, 0, 0, 0, 1851, 1832, 1, 0, 0, 0, 1851, 1833, 1, 0, 0, 0, 1851, 1834, 1, 0, 0, 0, 1851, 1835, 1, 0, 0, 0, 1851, 1836, 1, 0, 0, 0, 1851, 1837, 1, 0, 0, 0, 1851, 1838, 1, 0, 0, 0, 1851, 1839, 1, 0, 0, 0, 1851, 1840, 1, 0, 0, 0, 1851, 1841, 1, 0, 0, 0, 1851, 1842, 1, 0, 0, 0, 1851, 1843, 1, 0, 0, 0, 1851, 1844, 1, 0, 0, 0, 1851, 1845, 1, 0, 0, 0, 1851, 1846, 1, 0, 0, 0, 1852, 225, 1, 0, 0, 0, 1853, 1859, 1, 0, 0, 0, 1854, 1855, 5, 43, 0, 0, 1855, 1859, 3, 0, 0, 0, 1856, 1857, 5, 43, 0, 0, 1857, 1859, 3, 32, 16, 0, 1858, 1853, 1, 0, 0, 0, 1858, 1854, 1, 0, 0, 0, 1858, 1856, 1, 0, 0, 0, 1859, 227, 1, 0, 0, 0, 1860, 1864, 1, 0, 0, 0, 1861, 1862, 5, 35, 0, 0, 1862, 1864, 3, 316, 158, 0, 1863, 1860, 1, 0, 0, 0, 1863, 1861, 1, 0, 0, 0, 1864, 229, 1, 0, 0, 0, 1865, 1871, 1, 0, 0, 0, 1866, 1867, 5, 41, 0, 0, 1867, 1868, 3, 32, 16, 0, 1868, 1869, 5, 42, 0, 0, 1869, 1871, 1, 0, 0, 0, 1870, 1865, 1, 0, 0, 0, 1870, 1866, 1, 0, 0, 0, 1871, 231, 1, 0, 0, 0, 1872, 1876, 5, 128, 0, 0, 1873, 1875, 3, 234, 117, 0, 1874, 1873, 1, 0, 0, 0, 1875, 1878, 1, 0, 0, 0, 1876, 1874, 1, 0, 0, 0, 1876, 1877, 1, 0, 0, 0, 1877, 1879, 1, 0, 0, 0, 1878, 1876, 1, 0, 0, 0, 1879, 1880, 3, 146, 73, 0, 1880, 1881, 3, 2, 1, 0, 1881, 1891, 1, 0, 0, 0, 1882, 1886, 5, 128, 0, 0, 1883, 1885, 3, 234, 117, 0, 1884, 1883, 1, 0, 0, 0, 1885, 1888, 1, 0, 0, 0, 1886, 1884, 1, 0, 0, 0, 1886, 1887, 1, 0, 0, 0, 1887, 1889, 1, 0, 0, 0, 1888, 1886, 1, 0, 0, 0, 1889, 1891, 3, 2, 1, 0, 1890, 1872, 1, 0, 0, 0, 1890, 1882, 1, 0, 0, 0, 1891, 233, 1, 0, 0, 0, 1892, 1893, 7, 11, 0, 0, 1893, 235, 1, 0, 0, 0, 1894, 1896, 3, 238, 119, 0, 1895, 1894, 1, 0, 0, 0, 1896, 1899, 1, 0, 0, 0, 1897, 1895, 1, 0, 0, 0, 1897, 1898, 1, 0, 0, 0, 1898, 237, 1, 0, 0, 0, 1899, 1897, 1, 0, 0, 0, 1900, 1901, 5, 129, 0, 0, 1901, 1913, 3, 190, 95, 0, 1902, 1903, 5, 130, 0, 0, 1903, 1913, 3, 190, 95, 0, 1904, 1905, 5, 131, 0, 0, 1905, 1913, 3, 190, 95, 0, 1906, 1907, 5, 132, 0, 0, 1907, 1913, 3, 190, 95, 0, 1908, 1913, 3, 88, 44, 0, 1909, 1913, 3, 342, 171, 0, 1910, 1913, 3, 26, 13, 0, 1911, 1913, 3, 40, 20, 0, 1912, 1900, 1, 0, 0, 0, 1912, 1902, 1, 0, 0, 0, 1912, 1904, 1, 0, 0, 0, 1912, 1906, 1, 0, 0, 0, 1912, 1908, 1, 0, 0, 0, 1912, 1909, 1, 0, 0, 0, 1912, 1910, 1, 0, 0, 0, 1912, 1911, 1, 0, 0, 0, 1913, 239, 1, 0, 0, 0, 1914, 1918, 5, 133, 0, 0, 1915, 1917, 3, 242, 121, 0, 1916, 1915, 1, 0, 0, 0, 1917, 1920, 1, 0, 0, 0, 1918, 1916, 1, 0, 0, 0, 1918, 1919, 1, 0, 0, 0, 1919, 1921, 1, 0, 0, 0, 1920, 1918, 1, 0, 0, 0, 1921, 1922, 3, 192, 96, 0, 1922, 1923, 3, 160, 80, 0, 1923, 1924, 3, 2, 1, 0, 1924, 1925, 3, 134, 67, 0, 1925, 1926, 3, 228, 114, 0, 1926, 241, 1, 0, 0, 0, 1927, 1928, 7, 11, 0, 0, 1928, 243, 1, 0, 0, 0, 1929, 1931, 3, 246, 123, 0, 1930, 1929, 1, 0, 0, 0, 1931, 1934, 1, 0, 0, 0, 1932, 1930, 1, 0, 0, 0, 1932, 1933, 1, 0, 0, 0, 1933, 245, 1, 0, 0, 0, 1934, 1932, 1, 0, 0, 0, 1935, 1936, 5, 134, 0, 0, 1936, 1946, 3, 190, 95, 0, 1937, 1938, 5, 135, 0, 0, 1938, 1946, 3, 190, 95, 0, 1939, 1940, 5, 132, 0, 0, 1940, 1946, 3, 190, 95, 0, 1941, 1946, 3, 342, 171, 0, 1942, 1946, 3, 88, 44, 0, 1943, 1946, 3, 26, 13, 0, 1944, 1946, 3, 40, 20, 0, 1945, 1935, 1, 0, 0, 0, 1945, 1937, 1, 0, 0, 0, 1945, 1939, 1, 0, 0, 0, 1945, 1941, 1, 0, 0, 0, 1945, 1942, 1, 0, 0, 0, 1945, 1943, 1, 0, 0, 0, 1945, 1944, 1, 0, 0, 0, 1946, 247, 1, 0, 0, 0, 1947, 1954, 1, 0, 0, 0, 1948, 1949, 5, 121, 0, 0, 1949, 1950, 5, 29, 0, 0, 1950, 1951, 3, 250, 125, 0, 1951, 1952, 5, 30, 0, 0, 1952, 1954, 1, 0, 0, 0, 1953, 1947, 1, 0, 0, 0, 1953, 1948, 1, 0, 0, 0, 1954, 249, 1, 0, 0, 0, 1955, 1965, 3, 148, 74, 0, 1956, 1958, 5, 16, 0, 0, 1957, 1959, 3, 314, 157, 0, 1958, 1957, 1, 0, 0, 0, 1959, 1960, 1, 0, 0, 0, 1960, 1958, 1, 0, 0, 0, 1960, 1961, 1, 0, 0, 0, 1961, 1962, 1, 0, 0, 0, 1962, 1963, 5, 17, 0, 0, 1963, 1965, 1, 0, 0, 0, 1964, 1955, 1, 0, 0, 0, 1964, 1956, 1, 0, 0, 0, 1965, 251, 1, 0, 0, 0, 1966, 1968, 3, 254, 127, 0, 1967, 1966, 1, 0, 0, 0, 1968, 1971, 1, 0, 0, 0, 1969, 1967, 1, 0, 0, 0, 1969, 1970, 1, 0, 0, 0, 1970, 253, 1, 0, 0, 0, 1971, 1969, 1, 0, 0, 0, 1972, 1973, 5, 41, 0, 0, 1973, 1974, 5, 136, 0, 0, 1974, 1986, 5, 42, 0, 0, 1975, 1976, 5, 41, 0, 0, 1976, 1977, 5, 137, 0, 0, 1977, 1986, 5, 42, 0, 0, 1978, 1979, 5, 41, 0, 0, 1979, 1980, 5, 138, 0, 0, 1980, 1986, 5, 42, 0, 0, 1981, 1982, 5, 41, 0, 0, 1982, 1983, 3, 32, 16, 0, 1983, 1984, 5, 42, 0, 0, 1984, 1986, 1, 0, 0, 0, 1985, 1972, 1, 0, 0, 0, 1985, 1975, 1, 0, 0, 0, 1985, 1978, 1, 0, 0, 0, 1985, 1981, 1, 0, 0, 0, 1986, 255, 1, 0, 0, 0, 1987, 1992, 5, 139, 0, 0, 1988, 1991, 3, 258, 129, 0, 1989, 1991, 3, 260, 130, 0, 1990, 1988, 1, 0, 0, 0, 1990, 1989, 1, 0, 0, 0, 1991, 1994, 1, 0, 0, 0, 1992, 1990, 1, 0, 0, 0, 1992, 1993, 1, 0, 0, 0, 1993, 1995, 1, 0, 0, 0, 1994, 1992, 1, 0, 0, 0, 1995, 1996, 3, 192, 96, 0, 1996, 1997, 3, 252, 126, 0, 1997, 1998, 3, 160, 80, 0, 1998, 1999, 3, 248, 124, 0, 1999, 2000, 3, 264, 132, 0, 2000, 2001, 3, 204, 102, 0, 2001, 2005, 3, 134, 67, 0, 2002, 2004, 3, 266, 133, 0, 2003, 2002, 1, 0, 0, 0, 2004, 2007, 1, 0, 0, 0, 2005, 2003, 1, 0, 0, 0, 2005, 2006, 1, 0, 0, 0, 2006, 257, 1, 0, 0, 0, 2007, 2005, 1, 0, 0, 0, 2008, 2032, 5, 122, 0, 0, 2009, 2032, 5, 50, 0, 0, 2010, 2032, 5, 51, 0, 0, 2011, 2032, 5, 62, 0, 0, 2012, 2032, 5, 140, 0, 0, 2013, 2032, 5, 67, 0, 0, 2014, 2032, 5, 141, 0, 0, 2015, 2032, 5, 142, 0, 0, 2016, 2032, 5, 53, 0, 0, 2017, 2032, 5, 63, 0, 0, 2018, 2032, 5, 64, 0, 0, 2019, 2032, 5, 65, 0, 0, 2020, 2032, 5, 124, 0, 0, 2021, 2032, 5, 143, 0, 0, 2022, 2032, 5, 144, 0, 0, 2023, 2032, 5, 68, 0, 0, 2024, 2032, 5, 145, 0, 0, 2025, 2032, 5, 146, 0, 0, 2026, 2027, 5, 69, 0, 0, 2027, 2028, 5, 29, 0, 0, 2028, 2029, 3, 32, 16, 0, 2029, 2030, 5, 30, 0, 0, 2030, 2032, 1, 0, 0, 0, 2031, 2008, 1, 0, 0, 0, 2031, 2009, 1, 0, 0, 0, 2031, 2010, 1, 0, 0, 0, 2031, 2011, 1, 0, 0, 0, 2031, 2012, 1, 0, 0, 0, 2031, 2013, 1, 0, 0, 0, 2031, 2014, 1, 0, 0, 0, 2031, 2015, 1, 0, 0, 0, 2031, 2016, 1, 0, 0, 0, 2031, 2017, 1, 0, 0, 0, 2031, 2018, 1, 0, 0, 0, 2031, 2019, 1, 0, 0, 0, 2031, 2020, 1, 0, 0, 0, 2031, 2021, 1, 0, 0, 0, 2031, 2022, 1, 0, 0, 0, 2031, 2023, 1, 0, 0, 0, 2031, 2024, 1, 0, 0, 0, 2031, 2025, 1, 0, 0, 0, 2031, 2026, 1, 0, 0, 0, 2032, 259, 1, 0, 0, 0, 2033, 2034, 5, 147, 0, 0, 2034, 2040, 5, 29, 0, 0, 2035, 2038, 3, 6, 3, 0, 2036, 2037, 5, 33, 0, 0, 2037, 2039, 3, 6, 3, 0, 2038, 2036, 1, 0, 0, 0, 2038, 2039, 1, 0, 0, 0, 2039, 2041, 1, 0, 0, 0, 2040, 2035, 1, 0, 0, 0, 2040, 2041, 1, 0, 0, 0, 2041, 2045, 1, 0, 0, 0, 2042, 2044, 3, 262, 131, 0, 2043, 2042, 1, 0, 0, 0, 2044, 2047, 1, 0, 0, 0, 2045, 2043, 1, 0, 0, 0, 2045, 2046, 1, 0, 0, 0, 2046, 2048, 1, 0, 0, 0, 2047, 2045, 1, 0, 0, 0, 2048, 2052, 5, 30, 0, 0, 2049, 2050, 5, 147, 0, 0, 2050, 2052, 5, 84, 0, 0, 2051, 2033, 1, 0, 0, 0, 2051, 2049, 1, 0, 0, 0, 2052, 261, 1, 0, 0, 0, 2053, 2081, 5, 148, 0, 0, 2054, 2081, 5, 223, 0, 0, 2055, 2081, 5, 56, 0, 0, 2056, 2081, 5, 57, 0, 0, 2057, 2081, 5, 149, 0, 0, 2058, 2081, 5, 150, 0, 0, 2059, 2081, 5, 247, 0, 0, 2060, 2081, 5, 248, 0, 0, 2061, 2081, 5, 249, 0, 0, 2062, 2081, 5, 250, 0, 0, 2063, 2064, 5, 151, 0, 0, 2064, 2065, 5, 74, 0, 0, 2065, 2081, 5, 152, 0, 0, 2066, 2067, 5, 151, 0, 0, 2067, 2068, 5, 74, 0, 0, 2068, 2081, 5, 153, 0, 0, 2069, 2070, 5, 154, 0, 0, 2070, 2071, 5, 74, 0, 0, 2071, 2081, 5, 152, 0, 0, 2072, 2073, 5, 154, 0, 0, 2073, 2074, 5, 74, 0, 0, 2074, 2081, 5, 153, 0, 0, 2075, 2076, 5, 69, 0, 0, 2076, 2077, 5, 29, 0, 0, 2077, 2078, 3, 32, 16, 0, 2078, 2079, 5, 30, 0, 0, 2079, 2081, 1, 0, 0, 0, 2080, 2053, 1, 0, 0, 0, 2080, 2054, 1, 0, 0, 0, 2080, 2055, 1, 0, 0, 0, 2080, 2056, 1, 0, 0, 0, 2080, 2057, 1, 0, 0, 0, 2080, 2058, 1, 0, 0, 0, 2080, 2059, 1, 0, 0, 0, 2080, 2060, 1, 0, 0, 0, 2080, 2061, 1, 0, 0, 0, 2080, 2062, 1, 0, 0, 0, 2080, 2063, 1, 0, 0, 0, 2080, 2066, 1, 0, 0, 0, 2080, 2069, 1, 0, 0, 0, 2080, 2072, 1, 0, 0, 0, 2080, 2075, 1, 0, 0, 0, 2081, 263, 1, 0, 0, 0, 2082, 2086, 5, 115, 0, 0, 2083, 2086, 5, 155, 0, 0, 2084, 2086, 3, 2, 1, 0, 2085, 2082, 1, 0, 0, 0, 2085, 2083, 1, 0, 0, 0, 2085, 2084, 1, 0, 0, 0, 2086, 265, 1, 0, 0, 0, 2087, 2109, 5, 1, 0, 0, 2088, 2109, 5, 2, 0, 0, 2089, 2109, 5, 156, 0, 0, 2090, 2109, 5, 3, 0, 0, 2091, 2109, 5, 4, 0, 0, 2092, 2109, 5, 246, 0, 0, 2093, 2109, 5, 5, 0, 0, 2094, 2109, 5, 6, 0, 0, 2095, 2109, 5, 7, 0, 0, 2096, 2109, 5, 8, 0, 0, 2097, 2109, 5, 9, 0, 0, 2098, 2109, 5, 10, 0, 0, 2099, 2109, 5, 11, 0, 0, 2100, 2109, 5, 12, 0, 0, 2101, 2109, 5, 13, 0, 0, 2102, 2109, 5, 14, 0, 0, 2103, 2104, 5, 69, 0, 0, 2104, 2105, 5, 29, 0, 0, 2105, 2106, 3, 32, 16, 0, 2106, 2107, 5, 30, 0, 0, 2107, 2109, 1, 0, 0, 0, 2108, 2087, 1, 0, 0, 0, 2108, 2088, 1, 0, 0, 0, 2108, 2089, 1, 0, 0, 0, 2108, 2090, 1, 0, 0, 0, 2108, 2091, 1, 0, 0, 0, 2108, 2092, 1, 0, 0, 0, 2108, 2093, 1, 0, 0, 0, 2108, 2094, 1, 0, 0, 0, 2108, 2095, 1, 0, 0, 0, 2108, 2096, 1, 0, 0, 0, 2108, 2097, 1, 0, 0, 0, 2108, 2098, 1, 0, 0, 0, 2108, 2099, 1, 0, 0, 0, 2108, 2100, 1, 0, 0, 0, 2108, 2101, 1, 0, 0, 0, 2108, 2102, 1, 0, 0, 0, 2108, 2103, 1, 0, 0, 0, 2109, 267, 1, 0, 0, 0, 2110, 2112, 3, 270, 135, 0, 2111, 2110, 1, 0, 0, 0, 2112, 2115, 1, 0, 0, 0, 2113, 2111, 1, 0, 0, 0, 2113, 2114, 1, 0, 0, 0, 2114, 269, 1, 0, 0, 0, 2115, 2113, 1, 0, 0, 0, 2116, 2225, 3, 126, 63, 0, 2117, 2118, 5, 295, 0, 0, 2118, 2225, 3, 32, 16, 0, 2119, 2225, 3, 278, 139, 0, 2120, 2121, 5, 296, 0, 0, 2121, 2225, 3, 32, 16, 0, 2122, 2123, 5, 299, 0, 0, 2123, 2225, 3, 134, 67, 0, 2124, 2125, 5, 299, 0, 0, 2125, 2126, 5, 157, 0, 0, 2126, 2225, 3, 134, 67, 0, 2127, 2225, 5, 297, 0, 0, 2128, 2225, 5, 298, 0, 0, 2129, 2225, 3, 296, 148, 0, 2130, 2225, 3, 272, 136, 0, 2131, 2225, 3, 174, 87, 0, 2132, 2225, 3, 88, 44, 0, 2133, 2225, 3, 26, 13, 0, 2134, 2225, 3, 274, 137, 0, 2135, 2225, 3, 40, 20, 0, 2136, 2137, 5, 300, 0, 0, 2137, 2138, 5, 41, 0, 0, 2138, 2139, 3, 32, 16, 0, 2139, 2140, 5, 42, 0, 0, 2140, 2225, 1, 0, 0, 0, 2141, 2142, 5, 300, 0, 0, 2142, 2143, 5, 41, 0, 0, 2143, 2144, 3, 32, 16, 0, 2144, 2145, 5, 42, 0, 0, 2145, 2146, 5, 33, 0, 0, 2146, 2147, 3, 0, 0, 0, 2147, 2225, 1, 0, 0, 0, 2148, 2149, 5, 302, 0, 0, 2149, 2150, 3, 32, 16, 0, 2150, 2151, 5, 74, 0, 0, 2151, 2152, 3, 32, 16, 0, 2152, 2225, 1, 0, 0, 0, 2153, 2154, 5, 301, 0, 0, 2154, 2155, 3, 146, 73, 0, 2155, 2156, 5, 175, 0, 0, 2156, 2157, 3, 264, 132, 0, 2157, 2225, 1, 0, 0, 0, 2158, 2159, 5, 301, 0, 0, 2159, 2160, 5, 225, 0, 0, 2160, 2161, 3, 192, 96, 0, 2161, 2162, 3, 160, 80, 0, 2162, 2163, 3, 146, 73, 0, 2163, 2164, 5, 175, 0, 0, 2164, 2165, 3, 264, 132, 0, 2165, 2166, 3, 216, 108, 0, 2166, 2167, 3, 134, 67, 0, 2167, 2225, 1, 0, 0, 0, 2168, 2225, 3, 276, 138, 0, 2169, 2170, 5, 254, 0, 0, 2170, 2171, 5, 195, 0, 0, 2171, 2172, 5, 41, 0, 0, 2172, 2173, 3, 32, 16, 0, 2173, 2177, 5, 42, 0, 0, 2174, 2176, 3, 342, 171, 0, 2175, 2174, 1, 0, 0, 0, 2176, 2179, 1, 0, 0, 0, 2177, 2175, 1, 0, 0, 0, 2177, 2178, 1, 0, 0, 0, 2178, 2225, 1, 0, 0, 0, 2179, 2177, 1, 0, 0, 0, 2180, 2181, 5, 254, 0, 0, 2181, 2182, 5, 195, 0, 0, 2182, 2186, 3, 2, 1, 0, 2183, 2185, 3, 342, 171, 0, 2184, 2183, 1, 0, 0, 0, 2185, 2188, 1, 0, 0, 0, 2186, 2184, 1, 0, 0, 0, 2186, 2187, 1, 0, 0, 0, 2187, 2225, 1, 0, 0, 0, 2188, 2186, 1, 0, 0, 0, 2189, 2190, 5, 254, 0, 0, 2190, 2191, 5, 255, 0, 0, 2191, 2192, 5, 41, 0, 0, 2192, 2193, 3, 32, 16, 0, 2193, 2194, 5, 42, 0, 0, 2194, 2195, 5, 27, 0, 0, 2195, 2199, 3, 146, 73, 0, 2196, 2198, 3, 342, 171, 0, 2197, 2196, 1, 0, 0, 0, 2198, 2201, 1, 0, 0, 0, 2199, 2197, 1, 0, 0, 0, 2199, 2200, 1, 0, 0, 0, 2200, 2225, 1, 0, 0, 0, 2201, 2199, 1, 0, 0, 0, 2202, 2203, 5, 254, 0, 0, 2203, 2204, 5, 255, 0, 0, 2204, 2205, 3, 2, 1, 0, 2205, 2206, 5, 27, 0, 0, 2206, 2210, 3, 146, 73, 0, 2207, 2209, 3, 342, 171, 0, 2208, 2207, 1, 0, 0, 0, 2209, 2212, 1, 0, 0, 0, 2210, 2208, 1, 0, 0, 0, 2210, 2211, 1, 0, 0, 0, 2211, 2225, 1, 0, 0, 0, 2212, 2210, 1, 0, 0, 0, 2213, 2214, 5, 254, 0, 0, 2214, 2215, 5, 41, 0, 0, 2215, 2216, 3, 32, 16, 0, 2216, 2217, 5, 42, 0, 0, 2217, 2221, 3, 228, 114, 0, 2218, 2220, 3, 342, 171, 0, 2219, 2218, 1, 0, 0, 0, 2220, 2223, 1, 0, 0, 0, 2221, 2219, 1, 0, 0, 0, 2221, 2222, 1, 0, 0, 0, 2222, 2225, 1, 0, 0, 0, 2223, 2221, 1, 0, 0, 0, 2224, 2116, 1, 0, 0, 0, 2224, 2117, 1, 0, 0, 0, 2224, 2119, 1, 0, 0, 0, 2224, 2120, 1, 0, 0, 0, 2224, 2122, 1, 0, 0, 0, 2224, 2124, 1, 0, 0, 0, 2224, 2127, 1, 0, 0, 0, 2224, 2128, 1, 0, 0, 0, 2224, 2129, 1, 0, 0, 0, 2224, 2130, 1, 0, 0, 0, 2224, 2131, 1, 0, 0, 0, 2224, 2132, 1, 0, 0, 0, 2224, 2133, 1, 0, 0, 0, 2224, 2134, 1, 0, 0, 0, 2224, 2135, 1, 0, 0, 0, 2224, 2136, 1, 0, 0, 0, 2224, 2141, 1, 0, 0, 0, 2224, 2148, 1, 0, 0, 0, 2224, 2153, 1, 0, 0, 0, 2224, 2158, 1, 0, 0, 0, 2224, 2168, 1, 0, 0, 0, 2224, 2169, 1, 0, 0, 0, 2224, 2180, 1, 0, 0, 0, 2224, 2189, 1, 0, 0, 0, 2224, 2202, 1, 0, 0, 0, 2224, 2213, 1, 0, 0, 0, 2225, 271, 1, 0, 0, 0, 2226, 2227, 3, 0, 0, 0, 2227, 2228, 5, 74, 0, 0, 2228, 273, 1, 0, 0, 0, 2229, 2232, 3, 44, 22, 0, 2230, 2232, 3, 46, 23, 0, 2231, 2229, 1, 0, 0, 0, 2231, 2230, 1, 0, 0, 0, 2232, 275, 1, 0, 0, 0, 2233, 2234, 5, 16, 0, 0, 2234, 2235, 3, 268, 134, 0, 2235, 2236, 5, 17, 0, 0, 2236, 277, 1, 0, 0, 0, 2237, 2238, 3, 282, 141, 0, 2238, 2239, 3, 280, 140, 0, 2239, 279, 1, 0, 0, 0, 2240, 2242, 3, 284, 142, 0, 2241, 2240, 1, 0, 0, 0, 2242, 2243, 1, 0, 0, 0, 2243, 2241, 1, 0, 0, 0, 2243, 2244, 1, 0, 0, 0, 2244, 281, 1, 0, 0, 0, 2245, 2246, 5, 158, 0, 0, 2246, 2258, 3, 276, 138, 0, 2247, 2248, 5, 158, 0, 0, 2248, 2249, 3, 0, 0, 0, 2249, 2250, 5, 159, 0, 0, 2250, 2251, 3, 0, 0, 0, 2251, 2258, 1, 0, 0, 0, 2252, 2253, 5, 158, 0, 0, 2253, 2254, 3, 32, 16, 0, 2254, 2255, 5, 159, 0, 0, 2255, 2256, 3, 32, 16, 0, 2256, 2258, 1, 0, 0, 0, 2257, 2245, 1, 0, 0, 0, 2257, 2247, 1, 0, 0, 0, 2257, 2252, 1, 0, 0, 0, 2258, 283, 1, 0, 0, 0, 2259, 2260, 3, 288, 144, 0, 2260, 2261, 3, 294, 147, 0, 2261, 2272, 1, 0, 0, 0, 2262, 2263, 3, 286, 143, 0, 2263, 2264, 3, 294, 147, 0, 2264, 2272, 1, 0, 0, 0, 2265, 2266, 3, 290, 145, 0, 2266, 2267, 3, 294, 147, 0, 2267, 2272, 1, 0, 0, 0, 2268, 2269, 3, 292, 146, 0, 2269, 2270, 3, 294, 147, 0, 2270, 2272, 1, 0, 0, 0, 2271, 2259, 1, 0, 0, 0, 2271, 2262, 1, 0, 0, 0, 2271, 2265, 1, 0, 0, 0, 2271, 2268, 1, 0, 0, 0, 2272, 285, 1, 0, 0, 0, 2273, 2274, 5, 160, 0, 0, 2274, 2280, 3, 276, 138, 0, 2275, 2276, 5, 160, 0, 0, 2276, 2280, 3, 0, 0, 0, 2277, 2278, 5, 160, 0, 0, 2278, 2280, 3, 32, 16, 0, 2279, 2273, 1, 0, 0, 0, 2279, 2275, 1, 0, 0, 0, 2279, 2277, 1, 0, 0, 0, 2280, 287, 1, 0, 0, 0, 2281, 2282, 5, 161, 0, 0, 2282, 2283, 3, 146, 73, 0, 2283, 289, 1, 0, 0, 0, 2284, 2285, 5, 162, 0, 0, 2285, 291, 1, 0, 0, 0, 2286, 2287, 5, 163, 0, 0, 2287, 293, 1, 0, 0, 0, 2288, 2300, 3, 276, 138, 0, 2289, 2290, 5, 164, 0, 0, 2290, 2291, 3, 0, 0, 0, 2291, 2292, 5, 159, 0, 0, 2292, 2293, 3, 0, 0, 0, 2293, 2300, 1, 0, 0, 0, 2294, 2295, 5, 164, 0, 0, 2295, 2296, 3, 32, 16, 0, 2296, 2297, 5, 159, 0, 0, 2297, 2298, 3, 32, 16, 0, 2298, 2300, 1, 0, 0, 0, 2299, 2288, 1, 0, 0, 0, 2299, 2289, 1, 0, 0, 0, 2299, 2294, 1, 0, 0, 0, 2300, 295, 1, 0, 0, 0, 2301, 2302, 3, 298, 149, 0, 2302, 2303, 3, 302, 151, 0, 2303, 297, 1, 0, 0, 0, 2304, 2305, 5, 165, 0, 0, 2305, 2306, 3, 300, 150, 0, 2306, 2307, 3, 0, 0, 0, 2307, 2308, 5, 35, 0, 0, 2308, 2312, 1, 0, 0, 0, 2309, 2310, 5, 165, 0, 0, 2310, 2312, 3, 300, 150, 0, 2311, 2304, 1, 0, 0, 0, 2311, 2309, 1, 0, 0, 0, 2312, 299, 1, 0, 0, 0, 2313, 2317, 1, 0, 0, 0, 2314, 2317, 5, 166, 0, 0, 2315, 2317, 5, 2, 0, 0, 2316, 2313, 1, 0, 0, 0, 2316, 2314, 1, 0, 0, 0, 2316, 2315, 1, 0, 0, 0, 2317, 301, 1, 0, 0, 0, 2318, 2319, 5, 16, 0, 0, 2319, 2320, 3, 304, 152, 0, 2320, 2321, 5, 17, 0, 0, 2321, 2328, 1, 0, 0, 0, 2322, 2324, 3, 308, 154, 0, 2323, 2322, 1, 0, 0, 0, 2324, 2325, 1, 0, 0, 0, 2325, 2323, 1, 0, 0, 0, 2325, 2326, 1, 0, 0, 0, 2326, 2328, 1, 0, 0, 0, 2327, 2318, 1, 0, 0, 0, 2327, 2323, 1, 0, 0, 0, 2328, 303, 1, 0, 0, 0, 2329, 2330, 3, 308, 154, 0, 2330, 2331, 5, 27, 0, 0, 2331, 2333, 1, 0, 0, 0, 2332, 2329, 1, 0, 0, 0, 2333, 2336, 1, 0, 0, 0, 2334, 2332, 1, 0, 0, 0, 2334, 2335, 1, 0, 0, 0, 2335, 2337, 1, 0, 0, 0, 2336, 2334, 1, 0, 0, 0, 2337, 2338, 3, 308, 154, 0, 2338, 305, 1, 0, 0, 0, 2339, 2345, 1, 0, 0, 0, 2340, 2341, 5, 41, 0, 0, 2341, 2342, 3, 32, 16, 0, 2342, 2343, 5, 42, 0, 0, 2343, 2345, 1, 0, 0, 0, 2344, 2339, 1, 0, 0, 0, 2344, 2340, 1, 0, 0, 0, 2345, 307, 1, 0, 0, 0, 2346, 2347, 5, 180, 0, 0, 2347, 2348, 5, 261, 0, 0, 2348, 2349, 5, 29, 0, 0, 2349, 2350, 3, 6, 3, 0, 2350, 2351, 5, 30, 0, 0, 2351, 2413, 1, 0, 0, 0, 2352, 2353, 5, 259, 0, 0, 2353, 2354, 5, 29, 0, 0, 2354, 2355, 3, 0, 0, 0, 2355, 2356, 5, 30, 0, 0, 2356, 2413, 1, 0, 0, 0, 2357, 2358, 5, 259, 0, 0, 2358, 2413, 3, 0, 0, 0, 2359, 2360, 5, 83, 0, 0, 2360, 2361, 5, 29, 0, 0, 2361, 2362, 3, 312, 156, 0, 2362, 2363, 5, 30, 0, 0, 2363, 2413, 1, 0, 0, 0, 2364, 2365, 5, 187, 0, 0, 2365, 2366, 5, 29, 0, 0, 2366, 2367, 3, 36, 18, 0, 2367, 2368, 5, 30, 0, 0, 2368, 2369, 3, 306, 153, 0, 2369, 2413, 1, 0, 0, 0, 2370, 2371, 5, 188, 0, 0, 2371, 2372, 5, 29, 0, 0, 2372, 2373, 3, 36, 18, 0, 2373, 2374, 5, 30, 0, 0, 2374, 2375, 3, 306, 153, 0, 2375, 2413, 1, 0, 0, 0, 2376, 2377, 5, 186, 0, 0, 2377, 2378, 5, 29, 0, 0, 2378, 2379, 3, 34, 17, 0, 2379, 2380, 5, 30, 0, 0, 2380, 2381, 3, 306, 153, 0, 2381, 2413, 1, 0, 0, 0, 2382, 2383, 5, 185, 0, 0, 2383, 2384, 5, 29, 0, 0, 2384, 2385, 3, 32, 16, 0, 2385, 2386, 5, 30, 0, 0, 2386, 2387, 3, 306, 153, 0, 2387, 2413, 1, 0, 0, 0, 2388, 2389, 5, 184, 0, 0, 2389, 2390, 5, 29, 0, 0, 2390, 2391, 3, 32, 16, 0, 2391, 2392, 5, 30, 0, 0, 2392, 2393, 3, 306, 153, 0, 2393, 2413, 1, 0, 0, 0, 2394, 2395, 5, 183, 0, 0, 2395, 2396, 5, 29, 0, 0, 2396, 2397, 3, 32, 16, 0, 2397, 2398, 5, 30, 0, 0, 2398, 2399, 3, 306, 153, 0, 2399, 2413, 1, 0, 0, 0, 2400, 2401, 5, 187, 0, 0, 2401, 2413, 3, 306, 153, 0, 2402, 2403, 5, 188, 0, 0, 2403, 2413, 3, 306, 153, 0, 2404, 2405, 5, 186, 0, 0, 2405, 2413, 3, 306, 153, 0, 2406, 2407, 5, 185, 0, 0, 2407, 2413, 3, 306, 153, 0, 2408, 2409, 5, 184, 0, 0, 2409, 2413, 3, 306, 153, 0, 2410, 2411, 5, 183, 0, 0, 2411, 2413, 3, 306, 153, 0, 2412, 2346, 1, 0, 0, 0, 2412, 2352, 1, 0, 0, 0, 2412, 2357, 1, 0, 0, 0, 2412, 2359, 1, 0, 0, 0, 2412, 2364, 1, 0, 0, 0, 2412, 2370, 1, 0, 0, 0, 2412, 2376, 1, 0, 0, 0, 2412, 2382, 1, 0, 0, 0, 2412, 2388, 1, 0, 0, 0, 2412, 2394, 1, 0, 0, 0, 2412, 2400, 1, 0, 0, 0, 2412, 2402, 1, 0, 0, 0, 2412, 2404, 1, 0, 0, 0, 2412, 2406, 1, 0, 0, 0, 2412, 2408, 1, 0, 0, 0, 2412, 2410, 1, 0, 0, 0, 2413, 309, 1, 0, 0, 0, 2414, 2415, 5, 187, 0, 0, 2415, 2416, 5, 29, 0, 0, 2416, 2417, 3, 36, 18, 0, 2417, 2418, 5, 30, 0, 0, 2418, 2490, 1, 0, 0, 0, 2419, 2420, 5, 188, 0, 0, 2420, 2421, 5, 29, 0, 0, 2421, 2422, 3, 36, 18, 0, 2422, 2423, 5, 30, 0, 0, 2423, 2490, 1, 0, 0, 0, 2424, 2425, 5, 187, 0, 0, 2425, 2426, 5, 29, 0, 0, 2426, 2427, 3, 32, 16, 0, 2427, 2428, 5, 30, 0, 0, 2428, 2490, 1, 0, 0, 0, 2429, 2430, 5, 188, 0, 0, 2430, 2431, 5, 29, 0, 0, 2431, 2432, 3, 34, 17, 0, 2432, 2433, 5, 30, 0, 0, 2433, 2490, 1, 0, 0, 0, 2434, 2435, 5, 186, 0, 0, 2435, 2436, 5, 29, 0, 0, 2436, 2437, 3, 34, 17, 0, 2437, 2438, 5, 30, 0, 0, 2438, 2490, 1, 0, 0, 0, 2439, 2440, 5, 185, 0, 0, 2440, 2441, 5, 29, 0, 0, 2441, 2442, 3, 32, 16, 0, 2442, 2443, 5, 30, 0, 0, 2443, 2490, 1, 0, 0, 0, 2444, 2445, 5, 184, 0, 0, 2445, 2446, 5, 29, 0, 0, 2446, 2447, 3, 32, 16, 0, 2447, 2448, 5, 30, 0, 0, 2448, 2490, 1, 0, 0, 0, 2449, 2450, 5, 183, 0, 0, 2450, 2451, 5, 29, 0, 0, 2451, 2452, 3, 32, 16, 0, 2452, 2453, 5, 30, 0, 0, 2453, 2490, 1, 0, 0, 0, 2454, 2455, 5, 192, 0, 0, 2455, 2456, 5, 29, 0, 0, 2456, 2457, 3, 34, 17, 0, 2457, 2458, 5, 30, 0, 0, 2458, 2490, 1, 0, 0, 0, 2459, 2460, 5, 191, 0, 0, 2460, 2461, 5, 29, 0, 0, 2461, 2462, 3, 32, 16, 0, 2462, 2463, 5, 30, 0, 0, 2463, 2490, 1, 0, 0, 0, 2464, 2465, 5, 190, 0, 0, 2465, 2466, 5, 29, 0, 0, 2466, 2467, 3, 32, 16, 0, 2467, 2468, 5, 30, 0, 0, 2468, 2490, 1, 0, 0, 0, 2469, 2470, 5, 189, 0, 0, 2470, 2471, 5, 29, 0, 0, 2471, 2472, 3, 32, 16, 0, 2472, 2473, 5, 30, 0, 0, 2473, 2490, 1, 0, 0, 0, 2474, 2475, 5, 180, 0, 0, 2475, 2476, 5, 29, 0, 0, 2476, 2477, 3, 32, 16, 0, 2477, 2478, 5, 30, 0, 0, 2478, 2490, 1, 0, 0, 0, 2479, 2480, 5, 182, 0, 0, 2480, 2481, 5, 29, 0, 0, 2481, 2482, 3, 184, 92, 0, 2482, 2483, 5, 30, 0, 0, 2483, 2490, 1, 0, 0, 0, 2484, 2485, 5, 83, 0, 0, 2485, 2486, 5, 29, 0, 0, 2486, 2487, 3, 312, 156, 0, 2487, 2488, 5, 30, 0, 0, 2488, 2490, 1, 0, 0, 0, 2489, 2414, 1, 0, 0, 0, 2489, 2419, 1, 0, 0, 0, 2489, 2424, 1, 0, 0, 0, 2489, 2429, 1, 0, 0, 0, 2489, 2434, 1, 0, 0, 0, 2489, 2439, 1, 0, 0, 0, 2489, 2444, 1, 0, 0, 0, 2489, 2449, 1, 0, 0, 0, 2489, 2454, 1, 0, 0, 0, 2489, 2459, 1, 0, 0, 0, 2489, 2464, 1, 0, 0, 0, 2489, 2469, 1, 0, 0, 0, 2489, 2474, 1, 0, 0, 0, 2489, 2479, 1, 0, 0, 0, 2489, 2484, 1, 0, 0, 0, 2490, 311, 1, 0, 0, 0, 2491, 2493, 3, 314, 157, 0, 2492, 2491, 1, 0, 0, 0, 2493, 2496, 1, 0, 0, 0, 2494, 2492, 1, 0, 0, 0, 2494, 2495, 1, 0, 0, 0, 2495, 313, 1, 0, 0, 0, 2496, 2494, 1, 0, 0, 0, 2497, 2498, 7, 12, 0, 0, 2498, 315, 1, 0, 0, 0, 2499, 2503, 3, 310, 155, 0, 2500, 2503, 3, 6, 3, 0, 2501, 2503, 5, 178, 0, 0, 2502, 2499, 1, 0, 0, 0, 2502, 2500, 1, 0, 0, 0, 2502, 2501, 1, 0, 0, 0, 2503, 317, 1, 0, 0, 0, 2504, 2653, 3, 310, 155, 0, 2505, 2506, 5, 181, 0, 0, 2506, 2507, 5, 29, 0, 0, 2507, 2508, 5, 178, 0, 0, 2508, 2653, 5, 30, 0, 0, 2509, 2510, 5, 181, 0, 0, 2510, 2511, 5, 29, 0, 0, 2511, 2512, 5, 263, 0, 0, 2512, 2653, 5, 30, 0, 0, 2513, 2514, 5, 195, 0, 0, 2514, 2515, 5, 29, 0, 0, 2515, 2516, 5, 38, 0, 0, 2516, 2517, 5, 263, 0, 0, 2517, 2653, 5, 30, 0, 0, 2518, 2519, 5, 195, 0, 0, 2519, 2520, 5, 29, 0, 0, 2520, 2521, 3, 138, 69, 0, 2521, 2522, 5, 30, 0, 0, 2522, 2653, 1, 0, 0, 0, 2523, 2524, 5, 195, 0, 0, 2524, 2525, 5, 29, 0, 0, 2525, 2526, 5, 178, 0, 0, 2526, 2653, 5, 30, 0, 0, 2527, 2528, 5, 196, 0, 0, 2528, 2529, 5, 29, 0, 0, 2529, 2530, 3, 318, 159, 0, 2530, 2531, 5, 30, 0, 0, 2531, 2653, 1, 0, 0, 0, 2532, 2533, 5, 187, 0, 0, 2533, 2534, 5, 41, 0, 0, 2534, 2535, 3, 32, 16, 0, 2535, 2536, 5, 42, 0, 0, 2536, 2537, 5, 29, 0, 0, 2537, 2538, 3, 320, 160, 0, 2538, 2539, 5, 30, 0, 0, 2539, 2653, 1, 0, 0, 0, 2540, 2541, 5, 188, 0, 0, 2541, 2542, 5, 41, 0, 0, 2542, 2543, 3, 32, 16, 0, 2543, 2544, 5, 42, 0, 0, 2544, 2545, 5, 29, 0, 0, 2545, 2546, 3, 322, 161, 0, 2546, 2547, 5, 30, 0, 0, 2547, 2653, 1, 0, 0, 0, 2548, 2549, 5, 186, 0, 0, 2549, 2550, 5, 41, 0, 0, 2550, 2551, 3, 32, 16, 0, 2551, 2552, 5, 42, 0, 0, 2552, 2553, 5, 29, 0, 0, 2553, 2554, 3, 324, 162, 0, 2554, 2555, 5, 30, 0, 0, 2555, 2653, 1, 0, 0, 0, 2556, 2557, 5, 185, 0, 0, 2557, 2558, 5, 41, 0, 0, 2558, 2559, 3, 32, 16, 0, 2559, 2560, 5, 42, 0, 0, 2560, 2561, 5, 29, 0, 0, 2561, 2562, 3, 326, 163, 0, 2562, 2563, 5, 30, 0, 0, 2563, 2653, 1, 0, 0, 0, 2564, 2565, 5, 184, 0, 0, 2565, 2566, 5, 41, 0, 0, 2566, 2567, 3, 32, 16, 0, 2567, 2568, 5, 42, 0, 0, 2568, 2569, 5, 29, 0, 0, 2569, 2570, 3, 328, 164, 0, 2570, 2571, 5, 30, 0, 0, 2571, 2653, 1, 0, 0, 0, 2572, 2573, 5, 183, 0, 0, 2573, 2574, 5, 41, 0, 0, 2574, 2575, 3, 32, 16, 0, 2575, 2576, 5, 42, 0, 0, 2576, 2577, 5, 29, 0, 0, 2577, 2578, 3, 330, 165, 0, 2578, 2579, 5, 30, 0, 0, 2579, 2653, 1, 0, 0, 0, 2580, 2581, 5, 192, 0, 0, 2581, 2582, 5, 41, 0, 0, 2582, 2583, 3, 32, 16, 0, 2583, 2584, 5, 42, 0, 0, 2584, 2585, 5, 29, 0, 0, 2585, 2586, 3, 324, 162, 0, 2586, 2587, 5, 30, 0, 0, 2587, 2653, 1, 0, 0, 0, 2588, 2589, 5, 191, 0, 0, 2589, 2590, 5, 41, 0, 0, 2590, 2591, 3, 32, 16, 0, 2591, 2592, 5, 42, 0, 0, 2592, 2593, 5, 29, 0, 0, 2593, 2594, 3, 326, 163, 0, 2594, 2595, 5, 30, 0, 0, 2595, 2653, 1, 0, 0, 0, 2596, 2597, 5, 190, 0, 0, 2597, 2598, 5, 41, 0, 0, 2598, 2599, 3, 32, 16, 0, 2599, 2600, 5, 42, 0, 0, 2600, 2601, 5, 29, 0, 0, 2601, 2602, 3, 328, 164, 0, 2602, 2603, 5, 30, 0, 0, 2603, 2653, 1, 0, 0, 0, 2604, 2605, 5, 189, 0, 0, 2605, 2606, 5, 41, 0, 0, 2606, 2607, 3, 32, 16, 0, 2607, 2608, 5, 42, 0, 0, 2608, 2609, 5, 29, 0, 0, 2609, 2610, 3, 330, 165, 0, 2610, 2611, 5, 30, 0, 0, 2611, 2653, 1, 0, 0, 0, 2612, 2613, 5, 180, 0, 0, 2613, 2614, 5, 41, 0, 0, 2614, 2615, 3, 32, 16, 0, 2615, 2616, 5, 42, 0, 0, 2616, 2617, 5, 29, 0, 0, 2617, 2618, 3, 328, 164, 0, 2618, 2619, 5, 30, 0, 0, 2619, 2653, 1, 0, 0, 0, 2620, 2621, 5, 182, 0, 0, 2621, 2622, 5, 41, 0, 0, 2622, 2623, 3, 32, 16, 0, 2623, 2624, 5, 42, 0, 0, 2624, 2625, 5, 29, 0, 0, 2625, 2626, 3, 332, 166, 0, 2626, 2627, 5, 30, 0, 0, 2627, 2653, 1, 0, 0, 0, 2628, 2629, 5, 181, 0, 0, 2629, 2630, 5, 41, 0, 0, 2630, 2631, 3, 32, 16, 0, 2631, 2632, 5, 42, 0, 0, 2632, 2633, 5, 29, 0, 0, 2633, 2634, 3, 334, 167, 0, 2634, 2635, 5, 30, 0, 0, 2635, 2653, 1, 0, 0, 0, 2636, 2637, 5, 195, 0, 0, 2637, 2638, 5, 41, 0, 0, 2638, 2639, 3, 32, 16, 0, 2639, 2640, 5, 42, 0, 0, 2640, 2641, 5, 29, 0, 0, 2641, 2642, 3, 336, 168, 0, 2642, 2643, 5, 30, 0, 0, 2643, 2653, 1, 0, 0, 0, 2644, 2645, 5, 196, 0, 0, 2645, 2646, 5, 41, 0, 0, 2646, 2647, 3, 32, 16, 0, 2647, 2648, 5, 42, 0, 0, 2648, 2649, 5, 29, 0, 0, 2649, 2650, 3, 340, 170, 0, 2650, 2651, 5, 30, 0, 0, 2651, 2653, 1, 0, 0, 0, 2652, 2504, 1, 0, 0, 0, 2652, 2505, 1, 0, 0, 0, 2652, 2509, 1, 0, 0, 0, 2652, 2513, 1, 0, 0, 0, 2652, 2518, 1, 0, 0, 0, 2652, 2523, 1, 0, 0, 0, 2652, 2527, 1, 0, 0, 0, 2652, 2532, 1, 0, 0, 0, 2652, 2540, 1, 0, 0, 0, 2652, 2548, 1, 0, 0, 0, 2652, 2556, 1, 0, 0, 0, 2652, 2564, 1, 0, 0, 0, 2652, 2572, 1, 0, 0, 0, 2652, 2580, 1, 0, 0, 0, 2652, 2588, 1, 0, 0, 0, 2652, 2596, 1, 0, 0, 0, 2652, 2604, 1, 0, 0, 0, 2652, 2612, 1, 0, 0, 0, 2652, 2620, 1, 0, 0, 0, 2652, 2628, 1, 0, 0, 0, 2652, 2636, 1, 0, 0, 0, 2652, 2644, 1, 0, 0, 0, 2653, 319, 1, 0, 0, 0, 2654, 2657, 3, 36, 18, 0, 2655, 2657, 3, 32, 16, 0, 2656, 2654, 1, 0, 0, 0, 2656, 2655, 1, 0, 0, 0, 2657, 2660, 1, 0, 0, 0, 2658, 2656, 1, 0, 0, 0, 2658, 2659, 1, 0, 0, 0, 2659, 321, 1, 0, 0, 0, 2660, 2658, 1, 0, 0, 0, 2661, 2664, 3, 36, 18, 0, 2662, 2664, 3, 34, 17, 0, 2663, 2661, 1, 0, 0, 0, 2663, 2662, 1, 0, 0, 0, 2664, 2667, 1, 0, 0, 0, 2665, 2663, 1, 0, 0, 0, 2665, 2666, 1, 0, 0, 0, 2666, 323, 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 3, 34, 17, 0, 2669, 2668, 1, 0, 0, 0, 2670, 2673, 1, 0, 0, 0, 2671, 2669, 1, 0, 0, 0, 2671, 2672, 1, 0, 0, 0, 2672, 325, 1, 0, 0, 0, 2673, 2671, 1, 0, 0, 0, 2674, 2676, 3, 32, 16, 0, 2675, 2674, 1, 0, 0, 0, 2676, 2679, 1, 0, 0, 0, 2677, 2675, 1, 0, 0, 0, 2677, 2678, 1, 0, 0, 0, 2678, 327, 1, 0, 0, 0, 2679, 2677, 1, 0, 0, 0, 2680, 2682, 3, 32, 16, 0, 2681, 2680, 1, 0, 0, 0, 2682, 2685, 1, 0, 0, 0, 2683, 2681, 1, 0, 0, 0, 2683, 2684, 1, 0, 0, 0, 2684, 329, 1, 0, 0, 0, 2685, 2683, 1, 0, 0, 0, 2686, 2688, 3, 32, 16, 0, 2687, 2686, 1, 0, 0, 0, 2688, 2691, 1, 0, 0, 0, 2689, 2687, 1, 0, 0, 0, 2689, 2690, 1, 0, 0, 0, 2690, 331, 1, 0, 0, 0, 2691, 2689, 1, 0, 0, 0, 2692, 2694, 3, 184, 92, 0, 2693, 2692, 1, 0, 0, 0, 2694, 2697, 1, 0, 0, 0, 2695, 2693, 1, 0, 0, 0, 2695, 2696, 1, 0, 0, 0, 2696, 333, 1, 0, 0, 0, 2697, 2695, 1, 0, 0, 0, 2698, 2700, 7, 13, 0, 0, 2699, 2698, 1, 0, 0, 0, 2700, 2703, 1, 0, 0, 0, 2701, 2699, 1, 0, 0, 0, 2701, 2702, 1, 0, 0, 0, 2702, 335, 1, 0, 0, 0, 2703, 2701, 1, 0, 0, 0, 2704, 2706, 3, 338, 169, 0, 2705, 2704, 1, 0, 0, 0, 2706, 2709, 1, 0, 0, 0, 2707, 2705, 1, 0, 0, 0, 2707, 2708, 1, 0, 0, 0, 2708, 337, 1, 0, 0, 0, 2709, 2707, 1, 0, 0, 0, 2710, 2715, 5, 178, 0, 0, 2711, 2712, 5, 38, 0, 0, 2712, 2715, 5, 263, 0, 0, 2713, 2715, 3, 138, 69, 0, 2714, 2710, 1, 0, 0, 0, 2714, 2711, 1, 0, 0, 0, 2714, 2713, 1, 0, 0, 0, 2715, 339, 1, 0, 0, 0, 2716, 2718, 3, 318, 159, 0, 2717, 2716, 1, 0, 0, 0, 2718, 2721, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2719, 2720, 1, 0, 0, 0, 2720, 341, 1, 0, 0, 0, 2721, 2719, 1, 0, 0, 0, 2722, 2726, 3, 44, 22, 0, 2723, 2726, 3, 46, 23, 0, 2724, 2726, 3, 2, 1, 0, 2725, 2722, 1, 0, 0, 0, 2725, 2723, 1, 0, 0, 0, 2725, 2724, 1, 0, 0, 0, 2726, 343, 1, 0, 0, 0, 2727, 2728, 5, 167, 0, 0, 2728, 2729, 5, 35, 0, 0, 2729, 2730, 5, 29, 0, 0, 2730, 2731, 3, 312, 156, 0, 2731, 2732, 5, 30, 0, 0, 2732, 2753, 1, 0, 0, 0, 2733, 2734, 5, 168, 0, 0, 2734, 2735, 3, 38, 19, 0, 2735, 2736, 5, 74, 0, 0, 2736, 2737, 3, 38, 19, 0, 2737, 2738, 5, 74, 0, 0, 2738, 2739, 3, 38, 19, 0, 2739, 2740, 5, 74, 0, 0, 2740, 2741, 3, 38, 19, 0, 2741, 2753, 1, 0, 0, 0, 2742, 2743, 5, 169, 0, 0, 2743, 2753, 3, 6, 3, 0, 2744, 2745, 5, 169, 0, 0, 2745, 2746, 5, 35, 0, 0, 2746, 2747, 5, 29, 0, 0, 2747, 2748, 3, 312, 156, 0, 2748, 2749, 5, 30, 0, 0, 2749, 2753, 1, 0, 0, 0, 2750, 2753, 3, 342, 171, 0, 2751, 2753, 3, 40, 20, 0, 2752, 2727, 1, 0, 0, 0, 2752, 2733, 1, 0, 0, 0, 2752, 2742, 1, 0, 0, 0, 2752, 2744, 1, 0, 0, 0, 2752, 2750, 1, 0, 0, 0, 2752, 2751, 1, 0, 0, 0, 2753, 345, 1, 0, 0, 0, 2754, 2755, 5, 24, 0, 0, 2755, 2756, 5, 39, 0, 0, 2756, 2757, 3, 98, 49, 0, 2757, 2758, 3, 2, 1, 0, 2758, 2767, 1, 0, 0, 0, 2759, 2760, 5, 24, 0, 0, 2760, 2761, 5, 39, 0, 0, 2761, 2762, 3, 98, 49, 0, 2762, 2763, 3, 2, 1, 0, 2763, 2764, 5, 33, 0, 0, 2764, 2765, 3, 2, 1, 0, 2765, 2767, 1, 0, 0, 0, 2766, 2754, 1, 0, 0, 0, 2766, 2759, 1, 0, 0, 0, 2767, 347, 1, 0, 0, 0, 2768, 2770, 3, 350, 175, 0, 2769, 2768, 1, 0, 0, 0, 2770, 2773, 1, 0, 0, 0, 2771, 2769, 1, 0, 0, 0, 2771, 2772, 1, 0, 0, 0, 2772, 349, 1, 0, 0, 0, 2773, 2771, 1, 0, 0, 0, 2774, 2775, 5, 179, 0, 0, 2775, 2776, 5, 35, 0, 0, 2776, 2777, 5, 29, 0, 0, 2777, 2778, 3, 312, 156, 0, 2778, 2779, 5, 30, 0, 0, 2779, 2789, 1, 0, 0, 0, 2780, 2789, 3, 344, 172, 0, 2781, 2782, 5, 170, 0, 0, 2782, 2783, 5, 35, 0, 0, 2783, 2784, 5, 29, 0, 0, 2784, 2785, 3, 312, 156, 0, 2785, 2786, 5, 30, 0, 0, 2786, 2789, 1, 0, 0, 0, 2787, 2789, 5, 54, 0, 0, 2788, 2774, 1, 0, 0, 0, 2788, 2780, 1, 0, 0, 0, 2788, 2781, 1, 0, 0, 0, 2788, 2787, 1, 0, 0, 0, 2789, 351, 1, 0, 0, 0, 2790, 2791, 5, 49, 0, 0, 2791, 2795, 5, 39, 0, 0, 2792, 2794, 3, 356, 178, 0, 2793, 2792, 1, 0, 0, 0, 2794, 2797, 1, 0, 0, 0, 2795, 2793, 1, 0, 0, 0, 2795, 2796, 1, 0, 0, 0, 2796, 2798, 1, 0, 0, 0, 2797, 2795, 1, 0, 0, 0, 2798, 2799, 3, 2, 1, 0, 2799, 353, 1, 0, 0, 0, 2800, 2804, 5, 300, 0, 0, 2801, 2803, 3, 356, 178, 0, 2802, 2801, 1, 0, 0, 0, 2803, 2806, 1, 0, 0, 0, 2804, 2802, 1, 0, 0, 0, 2804, 2805, 1, 0, 0, 0, 2805, 2807, 1, 0, 0, 0, 2806, 2804, 1, 0, 0, 0, 2807, 2808, 3, 2, 1, 0, 2808, 355, 1, 0, 0, 0, 2809, 2825, 5, 51, 0, 0, 2810, 2825, 5, 50, 0, 0, 2811, 2825, 5, 171, 0, 0, 2812, 2813, 5, 61, 0, 0, 2813, 2825, 5, 50, 0, 0, 2814, 2815, 5, 61, 0, 0, 2815, 2825, 5, 51, 0, 0, 2816, 2817, 5, 61, 0, 0, 2817, 2825, 5, 62, 0, 0, 2818, 2819, 5, 61, 0, 0, 2819, 2825, 5, 63, 0, 0, 2820, 2821, 5, 61, 0, 0, 2821, 2825, 5, 64, 0, 0, 2822, 2823, 5, 61, 0, 0, 2823, 2825, 5, 65, 0, 0, 2824, 2809, 1, 0, 0, 0, 2824, 2810, 1, 0, 0, 0, 2824, 2811, 1, 0, 0, 0, 2824, 2812, 1, 0, 0, 0, 2824, 2814, 1, 0, 0, 0, 2824, 2816, 1, 0, 0, 0, 2824, 2818, 1, 0, 0, 0, 2824, 2820, 1, 0, 0, 0, 2824, 2822, 1, 0, 0, 0, 2825, 357, 1, 0, 0, 0, 2826, 2828, 3, 360, 180, 0, 2827, 2826, 1, 0, 0, 0, 2828, 2831, 1, 0, 0, 0, 2829, 2827, 1, 0, 0, 0, 2829, 2830, 1, 0, 0, 0, 2830, 359, 1, 0, 0, 0, 2831, 2829, 1, 0, 0, 0, 2832, 2833, 5, 20, 0, 0, 2833, 2846, 3, 2, 1, 0, 2834, 2835, 5, 49, 0, 0, 2835, 2836, 5, 39, 0, 0, 2836, 2846, 3, 140, 70, 0, 2837, 2838, 5, 24, 0, 0, 2838, 2839, 5, 39, 0, 0, 2839, 2846, 3, 2, 1, 0, 2840, 2846, 3, 196, 98, 0, 2841, 2842, 5, 49, 0, 0, 2842, 2846, 3, 32, 16, 0, 2843, 2846, 3, 342, 171, 0, 2844, 2846, 3, 40, 20, 0, 2845, 2832, 1, 0, 0, 0, 2845, 2834, 1, 0, 0, 0, 2845, 2837, 1, 0, 0, 0, 2845, 2840, 1, 0, 0, 0, 2845, 2841, 1, 0, 0, 0, 2845, 2843, 1, 0, 0, 0, 2845, 2844, 1, 0, 0, 0, 2846, 361, 1, 0, 0, 0, 2847, 2851, 5, 273, 0, 0, 2848, 2850, 3, 364, 182, 0, 2849, 2848, 1, 0, 0, 0, 2850, 2853, 1, 0, 0, 0, 2851, 2849, 1, 0, 0, 0, 2851, 2852, 1, 0, 0, 0, 2852, 2854, 1, 0, 0, 0, 2853, 2851, 1, 0, 0, 0, 2854, 2867, 3, 2, 1, 0, 2855, 2859, 5, 273, 0, 0, 2856, 2858, 3, 364, 182, 0, 2857, 2856, 1, 0, 0, 0, 2858, 2861, 1, 0, 0, 0, 2859, 2857, 1, 0, 0, 0, 2859, 2860, 1, 0, 0, 0, 2860, 2862, 1, 0, 0, 0, 2861, 2859, 1, 0, 0, 0, 2862, 2863, 3, 2, 1, 0, 2863, 2864, 5, 33, 0, 0, 2864, 2865, 3, 2, 1, 0, 2865, 2867, 1, 0, 0, 0, 2866, 2847, 1, 0, 0, 0, 2866, 2855, 1, 0, 0, 0, 2867, 363, 1, 0, 0, 0, 2868, 2869, 7, 14, 0, 0, 2869, 365, 1, 0, 0, 0, 2870, 2872, 3, 368, 184, 0, 2871, 2870, 1, 0, 0, 0, 2872, 2875, 1, 0, 0, 0, 2873, 2871, 1, 0, 0, 0, 2873, 2874, 1, 0, 0, 0, 2874, 367, 1, 0, 0, 0, 2875, 2873, 1, 0, 0, 0, 2876, 2877, 5, 20, 0, 0, 2877, 2878, 3, 2, 1, 0, 2878, 2879, 5, 43, 0, 0, 2879, 2880, 3, 32, 16, 0, 2880, 2887, 1, 0, 0, 0, 2881, 2882, 5, 24, 0, 0, 2882, 2883, 5, 39, 0, 0, 2883, 2887, 3, 2, 1, 0, 2884, 2887, 3, 342, 171, 0, 2885, 2887, 3, 40, 20, 0, 2886, 2876, 1, 0, 0, 0, 2886, 2881, 1, 0, 0, 0, 2886, 2884, 1, 0, 0, 0, 2886, 2885, 1, 0, 0, 0, 2887, 369, 1, 0, 0, 0, 172, 378, 382, 390, 398, 451, 492, 501, 525, 529, 547, 574, 597, 633, 639, 646, 648, 658, 660, 667, 678, 686, 707, 709, 725, 770, 775, 780, 785, 793, 903, 909, 925, 931, 937, 944, 1052, 1057, 1063, 1068, 1070, 1078, 1090, 1102, 1109, 1116, 1118, 1145, 1152, 1160, 1168, 1181, 1188, 1191, 1210, 1296, 1305, 1312, 1315, 1323, 1344, 1376, 1399, 1411, 1420, 1445, 1462, 1470, 1474, 1489, 1496, 1541, 1551, 1567, 1579, 1591, 1605, 1617, 1628, 1635, 1645, 1658, 1663, 1668, 1677, 1688, 1771, 1780, 1793, 1804, 1812, 1822, 1824, 1851, 1858, 1863, 1870, 1876, 1886, 1890, 1897, 1912, 1918, 1932, 1945, 1953, 1960, 1964, 1969, 1985, 1990, 1992, 2005, 2031, 2038, 2040, 2045, 2051, 2080, 2085, 2108, 2113, 2177, 2186, 2199, 2210, 2221, 2224, 2231, 2243, 2257, 2271, 2279, 2299, 2311, 2316, 2325, 2327, 2334, 2344, 2412, 2489, 2494, 2502, 2652, 2656, 2658, 2663, 2665, 2671, 2677, 2683, 2689, 2695, 2701, 2707, 2714, 2719, 2725, 2752, 2766, 2771, 2788, 2795, 2804, 2824, 2829, 2845, 2851, 2859, 2866, 2873, 2886]
\ No newline at end of file
+[4, 1, 304, 2876, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 377, 8, 1, 10, 1, 12, 1, 380, 9, 1, 1, 1, 1, 1, 3, 1, 384, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 5, 3, 390, 8, 3, 10, 3, 12, 3, 393, 9, 3, 1, 3, 1, 3, 1, 4, 5, 4, 398, 8, 4, 10, 4, 12, 4, 401, 9, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 453, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 494, 8, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 501, 8, 15, 10, 15, 12, 15, 504, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 527, 8, 18, 1, 19, 1, 19, 3, 19, 531, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 549, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 576, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 599, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 635, 8, 23, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 641, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 5, 27, 648, 8, 27, 10, 27, 12, 27, 651, 9, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 5, 28, 660, 8, 28, 10, 28, 12, 28, 663, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 669, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 680, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 688, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 709, 8, 34, 10, 34, 12, 34, 712, 9, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 5, 37, 725, 8, 37, 10, 37, 12, 37, 728, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 772, 8, 38, 1, 39, 1, 39, 1, 39, 3, 39, 777, 8, 39, 1, 40, 1, 40, 1, 40, 3, 40, 782, 8, 40, 1, 41, 5, 41, 785, 8, 41, 10, 41, 12, 41, 788, 9, 41, 1, 42, 1, 42, 1, 42, 5, 42, 793, 8, 42, 10, 42, 12, 42, 796, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 873, 8, 44, 1, 45, 1, 45, 5, 45, 877, 8, 45, 10, 45, 12, 45, 880, 9, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 893, 8, 45, 10, 45, 12, 45, 896, 9, 45, 1, 45, 1, 45, 1, 45, 3, 45, 901, 8, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 907, 8, 47, 1, 48, 1, 48, 1, 49, 5, 49, 912, 8, 49, 10, 49, 12, 49, 915, 9, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1025, 8, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1030, 8, 64, 1, 64, 1, 64, 5, 64, 1034, 8, 64, 10, 64, 12, 64, 1037, 9, 64, 1, 64, 1, 64, 3, 64, 1041, 8, 64, 3, 64, 1043, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1049, 8, 65, 10, 65, 12, 65, 1052, 9, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 5, 66, 1061, 8, 66, 10, 66, 12, 66, 1064, 9, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1073, 8, 67, 10, 67, 12, 67, 1076, 9, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1082, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1089, 8, 68, 3, 68, 1091, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1118, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1123, 8, 70, 10, 70, 12, 70, 1126, 9, 70, 1, 70, 1, 70, 1, 71, 5, 71, 1131, 8, 71, 10, 71, 12, 71, 1134, 9, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1141, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1154, 8, 73, 1, 74, 1, 74, 1, 74, 5, 74, 1159, 8, 74, 10, 74, 12, 74, 1162, 9, 74, 3, 74, 1164, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1183, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1277, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1286, 8, 77, 1, 78, 1, 78, 1, 78, 5, 78, 1291, 8, 78, 10, 78, 12, 78, 1294, 9, 78, 3, 78, 1296, 8, 78, 1, 79, 1, 79, 1, 80, 1, 80, 5, 80, 1302, 8, 80, 10, 80, 12, 80, 1305, 9, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 1325, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 1357, 8, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1380, 8, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1392, 8, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1401, 8, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1426, 8, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 1450, 8, 87, 1, 88, 1, 88, 1, 88, 1, 88, 5, 88, 1456, 8, 88, 10, 88, 12, 88, 1459, 9, 88, 1, 88, 3, 88, 1462, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 3, 89, 1477, 8, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1482, 8, 90, 10, 90, 12, 90, 1485, 9, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1529, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1539, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1555, 8, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1567, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1579, 8, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 1593, 8, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 1605, 8, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 1616, 8, 100, 1, 101, 1, 101, 1, 101, 5, 101, 1621, 8, 101, 10, 101, 12, 101, 1624, 9, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1633, 8, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1646, 8, 103, 1, 104, 5, 104, 1649, 8, 104, 10, 104, 12, 104, 1652, 9, 104, 1, 105, 1, 105, 3, 105, 1656, 8, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1663, 8, 106, 10, 106, 12, 106, 1666, 9, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 3, 108, 1676, 8, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1757, 8, 110, 10, 110, 12, 110, 1760, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1766, 8, 110, 10, 110, 12, 110, 1769, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1779, 8, 110, 10, 110, 12, 110, 1782, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1790, 8, 110, 10, 110, 12, 110, 1793, 9, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 1800, 8, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 5, 111, 1810, 8, 111, 10, 111, 12, 111, 1813, 9, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1839, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 3, 113, 1846, 8, 113, 1, 114, 1, 114, 1, 114, 3, 114, 1851, 8, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1858, 8, 115, 1, 116, 1, 116, 5, 116, 1862, 8, 116, 10, 116, 12, 116, 1865, 9, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 5, 116, 1872, 8, 116, 10, 116, 12, 116, 1875, 9, 116, 1, 116, 3, 116, 1878, 8, 116, 1, 117, 1, 117, 1, 118, 5, 118, 1883, 8, 118, 10, 118, 12, 118, 1886, 9, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 3, 119, 1900, 8, 119, 1, 120, 1, 120, 5, 120, 1904, 8, 120, 10, 120, 12, 120, 1907, 9, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 5, 122, 1918, 8, 122, 10, 122, 12, 122, 1921, 9, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 3, 123, 1933, 8, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 3, 124, 1941, 8, 124, 1, 125, 1, 125, 1, 125, 4, 125, 1946, 8, 125, 11, 125, 12, 125, 1947, 1, 125, 1, 125, 3, 125, 1952, 8, 125, 1, 126, 5, 126, 1955, 8, 126, 10, 126, 12, 126, 1958, 9, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 3, 127, 1973, 8, 127, 1, 128, 1, 128, 1, 128, 5, 128, 1978, 8, 128, 10, 128, 12, 128, 1981, 9, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 5, 128, 1991, 8, 128, 10, 128, 12, 128, 1994, 9, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 3, 129, 2019, 8, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2026, 8, 130, 3, 130, 2028, 8, 130, 1, 130, 5, 130, 2031, 8, 130, 10, 130, 12, 130, 2034, 9, 130, 1, 130, 1, 130, 1, 130, 3, 130, 2039, 8, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 2068, 8, 131, 1, 132, 1, 132, 1, 132, 3, 132, 2073, 8, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 3, 133, 2096, 8, 133, 1, 134, 5, 134, 2099, 8, 134, 10, 134, 12, 134, 2102, 9, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2163, 8, 135, 10, 135, 12, 135, 2166, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2172, 8, 135, 10, 135, 12, 135, 2175, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2185, 8, 135, 10, 135, 12, 135, 2188, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2196, 8, 135, 10, 135, 12, 135, 2199, 9, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 5, 135, 2207, 8, 135, 10, 135, 12, 135, 2210, 9, 135, 3, 135, 2212, 8, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 3, 137, 2219, 8, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 140, 4, 140, 2229, 8, 140, 11, 140, 12, 140, 2230, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 3, 141, 2245, 8, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 2259, 8, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 3, 143, 2267, 8, 143, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 2287, 8, 147, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 2299, 8, 149, 1, 150, 1, 150, 1, 150, 3, 150, 2304, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 4, 151, 2311, 8, 151, 11, 151, 12, 151, 2312, 3, 151, 2315, 8, 151, 1, 152, 1, 152, 1, 152, 5, 152, 2320, 8, 152, 10, 152, 12, 152, 2323, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 3, 153, 2332, 8, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 3, 154, 2400, 8, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 3, 155, 2477, 8, 155, 1, 156, 5, 156, 2480, 8, 156, 10, 156, 12, 156, 2483, 9, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 3, 158, 2490, 8, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 3, 159, 2640, 8, 159, 1, 160, 1, 160, 5, 160, 2644, 8, 160, 10, 160, 12, 160, 2647, 9, 160, 1, 161, 1, 161, 5, 161, 2651, 8, 161, 10, 161, 12, 161, 2654, 9, 161, 1, 162, 5, 162, 2657, 8, 162, 10, 162, 12, 162, 2660, 9, 162, 1, 163, 5, 163, 2663, 8, 163, 10, 163, 12, 163, 2666, 9, 163, 1, 164, 5, 164, 2669, 8, 164, 10, 164, 12, 164, 2672, 9, 164, 1, 165, 5, 165, 2675, 8, 165, 10, 165, 12, 165, 2678, 9, 165, 1, 166, 5, 166, 2681, 8, 166, 10, 166, 12, 166, 2684, 9, 166, 1, 167, 5, 167, 2687, 8, 167, 10, 167, 12, 167, 2690, 9, 167, 1, 168, 5, 168, 2693, 8, 168, 10, 168, 12, 168, 2696, 9, 168, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 2702, 8, 169, 1, 170, 5, 170, 2705, 8, 170, 10, 170, 12, 170, 2708, 9, 170, 1, 171, 1, 171, 1, 171, 3, 171, 2713, 8, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 2740, 8, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 3, 173, 2754, 8, 173, 1, 174, 5, 174, 2757, 8, 174, 10, 174, 12, 174, 2760, 9, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 3, 175, 2776, 8, 175, 1, 176, 1, 176, 1, 176, 5, 176, 2781, 8, 176, 10, 176, 12, 176, 2784, 9, 176, 1, 176, 1, 176, 1, 177, 1, 177, 5, 177, 2790, 8, 177, 10, 177, 12, 177, 2793, 9, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 3, 178, 2812, 8, 178, 1, 179, 5, 179, 2815, 8, 179, 10, 179, 12, 179, 2818, 9, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 3, 180, 2833, 8, 180, 1, 181, 1, 181, 5, 181, 2837, 8, 181, 10, 181, 12, 181, 2840, 9, 181, 1, 181, 1, 181, 1, 181, 5, 181, 2845, 8, 181, 10, 181, 12, 181, 2848, 9, 181, 1, 181, 1, 181, 1, 181, 1, 181, 3, 181, 2854, 8, 181, 1, 182, 1, 182, 1, 183, 5, 183, 2859, 8, 183, 10, 183, 12, 183, 2862, 9, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 2874, 8, 184, 1, 184, 0, 1, 68, 185, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 0, 14, 5, 0, 1, 15, 242, 242, 246, 246, 263, 263, 288, 288, 4, 0, 16, 16, 242, 242, 263, 263, 287, 288, 1, 0, 172, 173, 1, 0, 37, 38, 1, 0, 73, 74, 3, 0, 2, 2, 61, 61, 77, 83, 2, 0, 228, 228, 259, 260, 9, 0, 177, 177, 182, 194, 200, 200, 206, 207, 209, 214, 217, 218, 221, 221, 229, 241, 261, 261, 1, 0, 95, 96, 1, 0, 97, 111, 1, 0, 68, 69, 2, 0, 172, 172, 288, 289, 2, 0, 178, 178, 263, 263, 1, 0, 51, 52, 3289, 0, 370, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 4, 385, 1, 0, 0, 0, 6, 391, 1, 0, 0, 0, 8, 399, 1, 0, 0, 0, 10, 452, 1, 0, 0, 0, 12, 454, 1, 0, 0, 0, 14, 457, 1, 0, 0, 0, 16, 460, 1, 0, 0, 0, 18, 464, 1, 0, 0, 0, 20, 467, 1, 0, 0, 0, 22, 470, 1, 0, 0, 0, 24, 477, 1, 0, 0, 0, 26, 493, 1, 0, 0, 0, 28, 495, 1, 0, 0, 0, 30, 497, 1, 0, 0, 0, 32, 507, 1, 0, 0, 0, 34, 509, 1, 0, 0, 0, 36, 526, 1, 0, 0, 0, 38, 530, 1, 0, 0, 0, 40, 548, 1, 0, 0, 0, 42, 575, 1, 0, 0, 0, 44, 598, 1, 0, 0, 0, 46, 634, 1, 0, 0, 0, 48, 636, 1, 0, 0, 0, 50, 640, 1, 0, 0, 0, 52, 642, 1, 0, 0, 0, 54, 649, 1, 0, 0, 0, 56, 661, 1, 0, 0, 0, 58, 664, 1, 0, 0, 0, 60, 666, 1, 0, 0, 0, 62, 679, 1, 0, 0, 0, 64, 687, 1, 0, 0, 0, 66, 689, 1, 0, 0, 0, 68, 697, 1, 0, 0, 0, 70, 713, 1, 0, 0, 0, 72, 719, 1, 0, 0, 0, 74, 722, 1, 0, 0, 0, 76, 771, 1, 0, 0, 0, 78, 776, 1, 0, 0, 0, 80, 781, 1, 0, 0, 0, 82, 786, 1, 0, 0, 0, 84, 794, 1, 0, 0, 0, 86, 799, 1, 0, 0, 0, 88, 872, 1, 0, 0, 0, 90, 900, 1, 0, 0, 0, 92, 902, 1, 0, 0, 0, 94, 906, 1, 0, 0, 0, 96, 908, 1, 0, 0, 0, 98, 913, 1, 0, 0, 0, 100, 916, 1, 0, 0, 0, 102, 918, 1, 0, 0, 0, 104, 920, 1, 0, 0, 0, 106, 922, 1, 0, 0, 0, 108, 924, 1, 0, 0, 0, 110, 926, 1, 0, 0, 0, 112, 928, 1, 0, 0, 0, 114, 930, 1, 0, 0, 0, 116, 932, 1, 0, 0, 0, 118, 934, 1, 0, 0, 0, 120, 936, 1, 0, 0, 0, 122, 938, 1, 0, 0, 0, 124, 940, 1, 0, 0, 0, 126, 1024, 1, 0, 0, 0, 128, 1042, 1, 0, 0, 0, 130, 1044, 1, 0, 0, 0, 132, 1056, 1, 0, 0, 0, 134, 1081, 1, 0, 0, 0, 136, 1090, 1, 0, 0, 0, 138, 1117, 1, 0, 0, 0, 140, 1124, 1, 0, 0, 0, 142, 1132, 1, 0, 0, 0, 144, 1140, 1, 0, 0, 0, 146, 1153, 1, 0, 0, 0, 148, 1163, 1, 0, 0, 0, 150, 1182, 1, 0, 0, 0, 152, 1276, 1, 0, 0, 0, 154, 1285, 1, 0, 0, 0, 156, 1295, 1, 0, 0, 0, 158, 1297, 1, 0, 0, 0, 160, 1299, 1, 0, 0, 0, 162, 1324, 1, 0, 0, 0, 164, 1356, 1, 0, 0, 0, 166, 1379, 1, 0, 0, 0, 168, 1391, 1, 0, 0, 0, 170, 1393, 1, 0, 0, 0, 172, 1396, 1, 0, 0, 0, 174, 1449, 1, 0, 0, 0, 176, 1461, 1, 0, 0, 0, 178, 1476, 1, 0, 0, 0, 180, 1483, 1, 0, 0, 0, 182, 1488, 1, 0, 0, 0, 184, 1492, 1, 0, 0, 0, 186, 1528, 1, 0, 0, 0, 188, 1530, 1, 0, 0, 0, 190, 1566, 1, 0, 0, 0, 192, 1578, 1, 0, 0, 0, 194, 1592, 1, 0, 0, 0, 196, 1594, 1, 0, 0, 0, 198, 1604, 1, 0, 0, 0, 200, 1615, 1, 0, 0, 0, 202, 1622, 1, 0, 0, 0, 204, 1632, 1, 0, 0, 0, 206, 1645, 1, 0, 0, 0, 208, 1650, 1, 0, 0, 0, 210, 1653, 1, 0, 0, 0, 212, 1664, 1, 0, 0, 0, 214, 1669, 1, 0, 0, 0, 216, 1675, 1, 0, 0, 0, 218, 1677, 1, 0, 0, 0, 220, 1799, 1, 0, 0, 0, 222, 1801, 1, 0, 0, 0, 224, 1838, 1, 0, 0, 0, 226, 1845, 1, 0, 0, 0, 228, 1850, 1, 0, 0, 0, 230, 1857, 1, 0, 0, 0, 232, 1877, 1, 0, 0, 0, 234, 1879, 1, 0, 0, 0, 236, 1884, 1, 0, 0, 0, 238, 1899, 1, 0, 0, 0, 240, 1901, 1, 0, 0, 0, 242, 1914, 1, 0, 0, 0, 244, 1919, 1, 0, 0, 0, 246, 1932, 1, 0, 0, 0, 248, 1940, 1, 0, 0, 0, 250, 1951, 1, 0, 0, 0, 252, 1956, 1, 0, 0, 0, 254, 1972, 1, 0, 0, 0, 256, 1974, 1, 0, 0, 0, 258, 2018, 1, 0, 0, 0, 260, 2038, 1, 0, 0, 0, 262, 2067, 1, 0, 0, 0, 264, 2072, 1, 0, 0, 0, 266, 2095, 1, 0, 0, 0, 268, 2100, 1, 0, 0, 0, 270, 2211, 1, 0, 0, 0, 272, 2213, 1, 0, 0, 0, 274, 2218, 1, 0, 0, 0, 276, 2220, 1, 0, 0, 0, 278, 2224, 1, 0, 0, 0, 280, 2228, 1, 0, 0, 0, 282, 2244, 1, 0, 0, 0, 284, 2258, 1, 0, 0, 0, 286, 2266, 1, 0, 0, 0, 288, 2268, 1, 0, 0, 0, 290, 2271, 1, 0, 0, 0, 292, 2273, 1, 0, 0, 0, 294, 2286, 1, 0, 0, 0, 296, 2288, 1, 0, 0, 0, 298, 2298, 1, 0, 0, 0, 300, 2303, 1, 0, 0, 0, 302, 2314, 1, 0, 0, 0, 304, 2321, 1, 0, 0, 0, 306, 2331, 1, 0, 0, 0, 308, 2399, 1, 0, 0, 0, 310, 2476, 1, 0, 0, 0, 312, 2481, 1, 0, 0, 0, 314, 2484, 1, 0, 0, 0, 316, 2489, 1, 0, 0, 0, 318, 2639, 1, 0, 0, 0, 320, 2645, 1, 0, 0, 0, 322, 2652, 1, 0, 0, 0, 324, 2658, 1, 0, 0, 0, 326, 2664, 1, 0, 0, 0, 328, 2670, 1, 0, 0, 0, 330, 2676, 1, 0, 0, 0, 332, 2682, 1, 0, 0, 0, 334, 2688, 1, 0, 0, 0, 336, 2694, 1, 0, 0, 0, 338, 2701, 1, 0, 0, 0, 340, 2706, 1, 0, 0, 0, 342, 2712, 1, 0, 0, 0, 344, 2739, 1, 0, 0, 0, 346, 2753, 1, 0, 0, 0, 348, 2758, 1, 0, 0, 0, 350, 2775, 1, 0, 0, 0, 352, 2777, 1, 0, 0, 0, 354, 2787, 1, 0, 0, 0, 356, 2811, 1, 0, 0, 0, 358, 2816, 1, 0, 0, 0, 360, 2832, 1, 0, 0, 0, 362, 2853, 1, 0, 0, 0, 364, 2855, 1, 0, 0, 0, 366, 2860, 1, 0, 0, 0, 368, 2873, 1, 0, 0, 0, 370, 371, 7, 0, 0, 0, 371, 1, 1, 0, 0, 0, 372, 384, 5, 287, 0, 0, 373, 374, 3, 4, 2, 0, 374, 375, 5, 264, 0, 0, 375, 377, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 381, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 381, 384, 3, 4, 2, 0, 382, 384, 5, 263, 0, 0, 383, 372, 1, 0, 0, 0, 383, 378, 1, 0, 0, 0, 383, 382, 1, 0, 0, 0, 384, 3, 1, 0, 0, 0, 385, 386, 7, 1, 0, 0, 386, 5, 1, 0, 0, 0, 387, 388, 5, 262, 0, 0, 388, 390, 5, 265, 0, 0, 389, 387, 1, 0, 0, 0, 390, 393, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 391, 1, 0, 0, 0, 394, 395, 5, 262, 0, 0, 395, 7, 1, 0, 0, 0, 396, 398, 3, 10, 5, 0, 397, 396, 1, 0, 0, 0, 398, 401, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 9, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 402, 403, 3, 74, 37, 0, 403, 404, 5, 17, 0, 0, 404, 405, 3, 82, 41, 0, 405, 406, 5, 18, 0, 0, 406, 453, 1, 0, 0, 0, 407, 408, 3, 72, 36, 0, 408, 409, 5, 17, 0, 0, 409, 410, 3, 8, 4, 0, 410, 411, 5, 18, 0, 0, 411, 453, 1, 0, 0, 0, 412, 413, 3, 256, 128, 0, 413, 414, 5, 17, 0, 0, 414, 415, 3, 268, 134, 0, 415, 416, 5, 18, 0, 0, 416, 453, 1, 0, 0, 0, 417, 453, 3, 222, 111, 0, 418, 453, 3, 296, 148, 0, 419, 453, 3, 70, 35, 0, 420, 453, 3, 66, 33, 0, 421, 453, 3, 88, 44, 0, 422, 453, 3, 90, 45, 0, 423, 453, 3, 22, 11, 0, 424, 425, 3, 346, 173, 0, 425, 426, 5, 17, 0, 0, 426, 427, 3, 348, 174, 0, 427, 428, 5, 18, 0, 0, 428, 453, 1, 0, 0, 0, 429, 430, 3, 352, 176, 0, 430, 431, 5, 17, 0, 0, 431, 432, 3, 358, 179, 0, 432, 433, 5, 18, 0, 0, 433, 453, 1, 0, 0, 0, 434, 435, 3, 362, 181, 0, 435, 436, 5, 17, 0, 0, 436, 437, 3, 366, 183, 0, 437, 438, 5, 18, 0, 0, 438, 453, 1, 0, 0, 0, 439, 453, 3, 64, 32, 0, 440, 453, 3, 174, 87, 0, 441, 453, 3, 342, 171, 0, 442, 453, 3, 12, 6, 0, 443, 453, 3, 14, 7, 0, 444, 453, 3, 16, 8, 0, 445, 453, 3, 18, 9, 0, 446, 453, 3, 20, 10, 0, 447, 453, 3, 26, 13, 0, 448, 453, 3, 42, 21, 0, 449, 453, 3, 40, 20, 0, 450, 453, 3, 30, 15, 0, 451, 453, 3, 24, 12, 0, 452, 402, 1, 0, 0, 0, 452, 407, 1, 0, 0, 0, 452, 412, 1, 0, 0, 0, 452, 417, 1, 0, 0, 0, 452, 418, 1, 0, 0, 0, 452, 419, 1, 0, 0, 0, 452, 420, 1, 0, 0, 0, 452, 421, 1, 0, 0, 0, 452, 422, 1, 0, 0, 0, 452, 423, 1, 0, 0, 0, 452, 424, 1, 0, 0, 0, 452, 429, 1, 0, 0, 0, 452, 434, 1, 0, 0, 0, 452, 439, 1, 0, 0, 0, 452, 440, 1, 0, 0, 0, 452, 441, 1, 0, 0, 0, 452, 442, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 452, 444, 1, 0, 0, 0, 452, 445, 1, 0, 0, 0, 452, 446, 1, 0, 0, 0, 452, 447, 1, 0, 0, 0, 452, 448, 1, 0, 0, 0, 452, 449, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 451, 1, 0, 0, 0, 453, 11, 1, 0, 0, 0, 454, 455, 5, 19, 0, 0, 455, 456, 3, 32, 16, 0, 456, 13, 1, 0, 0, 0, 457, 458, 5, 20, 0, 0, 458, 459, 3, 32, 16, 0, 459, 15, 1, 0, 0, 0, 460, 461, 5, 21, 0, 0, 461, 462, 5, 22, 0, 0, 462, 463, 3, 32, 16, 0, 463, 17, 1, 0, 0, 0, 464, 465, 5, 23, 0, 0, 465, 466, 3, 34, 17, 0, 466, 19, 1, 0, 0, 0, 467, 468, 5, 24, 0, 0, 468, 469, 3, 34, 17, 0, 469, 21, 1, 0, 0, 0, 470, 471, 5, 25, 0, 0, 471, 472, 3, 98, 49, 0, 472, 473, 3, 2, 1, 0, 473, 474, 5, 17, 0, 0, 474, 475, 3, 142, 71, 0, 475, 476, 5, 18, 0, 0, 476, 23, 1, 0, 0, 0, 477, 478, 5, 26, 0, 0, 478, 25, 1, 0, 0, 0, 479, 480, 5, 27, 0, 0, 480, 494, 3, 28, 14, 0, 481, 482, 5, 27, 0, 0, 482, 483, 3, 28, 14, 0, 483, 484, 5, 28, 0, 0, 484, 485, 3, 28, 14, 0, 485, 494, 1, 0, 0, 0, 486, 487, 5, 27, 0, 0, 487, 488, 3, 28, 14, 0, 488, 489, 5, 28, 0, 0, 489, 490, 3, 28, 14, 0, 490, 491, 5, 28, 0, 0, 491, 492, 3, 28, 14, 0, 492, 494, 1, 0, 0, 0, 493, 479, 1, 0, 0, 0, 493, 481, 1, 0, 0, 0, 493, 486, 1, 0, 0, 0, 494, 27, 1, 0, 0, 0, 495, 496, 5, 263, 0, 0, 496, 29, 1, 0, 0, 0, 497, 498, 5, 29, 0, 0, 498, 502, 5, 17, 0, 0, 499, 501, 3, 138, 69, 0, 500, 499, 1, 0, 0, 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 505, 506, 5, 18, 0, 0, 506, 31, 1, 0, 0, 0, 507, 508, 5, 172, 0, 0, 508, 33, 1, 0, 0, 0, 509, 510, 7, 2, 0, 0, 510, 35, 1, 0, 0, 0, 511, 527, 5, 174, 0, 0, 512, 513, 3, 32, 16, 0, 513, 514, 5, 264, 0, 0, 514, 527, 1, 0, 0, 0, 515, 527, 3, 32, 16, 0, 516, 517, 5, 187, 0, 0, 517, 518, 5, 30, 0, 0, 518, 519, 3, 32, 16, 0, 519, 520, 5, 31, 0, 0, 520, 527, 1, 0, 0, 0, 521, 522, 5, 188, 0, 0, 522, 523, 5, 30, 0, 0, 523, 524, 3, 34, 17, 0, 524, 525, 5, 31, 0, 0, 525, 527, 1, 0, 0, 0, 526, 511, 1, 0, 0, 0, 526, 512, 1, 0, 0, 0, 526, 515, 1, 0, 0, 0, 526, 516, 1, 0, 0, 0, 526, 521, 1, 0, 0, 0, 527, 37, 1, 0, 0, 0, 528, 531, 3, 32, 16, 0, 529, 531, 5, 261, 0, 0, 530, 528, 1, 0, 0, 0, 530, 529, 1, 0, 0, 0, 531, 39, 1, 0, 0, 0, 532, 533, 5, 266, 0, 0, 533, 549, 5, 288, 0, 0, 534, 535, 5, 266, 0, 0, 535, 536, 5, 288, 0, 0, 536, 549, 5, 262, 0, 0, 537, 538, 5, 267, 0, 0, 538, 549, 5, 288, 0, 0, 539, 540, 5, 268, 0, 0, 540, 549, 5, 288, 0, 0, 541, 542, 5, 269, 0, 0, 542, 549, 5, 288, 0, 0, 543, 549, 5, 270, 0, 0, 544, 549, 5, 271, 0, 0, 545, 546, 5, 272, 0, 0, 546, 549, 5, 262, 0, 0, 547, 549, 5, 32, 0, 0, 548, 532, 1, 0, 0, 0, 548, 534, 1, 0, 0, 0, 548, 537, 1, 0, 0, 0, 548, 539, 1, 0, 0, 0, 548, 541, 1, 0, 0, 0, 548, 543, 1, 0, 0, 0, 548, 544, 1, 0, 0, 0, 548, 545, 1, 0, 0, 0, 548, 547, 1, 0, 0, 0, 549, 41, 1, 0, 0, 0, 550, 551, 5, 33, 0, 0, 551, 552, 3, 160, 80, 0, 552, 553, 5, 34, 0, 0, 553, 554, 3, 2, 1, 0, 554, 576, 1, 0, 0, 0, 555, 556, 5, 33, 0, 0, 556, 557, 3, 138, 69, 0, 557, 558, 5, 34, 0, 0, 558, 559, 3, 2, 1, 0, 559, 576, 1, 0, 0, 0, 560, 561, 5, 33, 0, 0, 561, 562, 3, 198, 99, 0, 562, 563, 5, 34, 0, 0, 563, 564, 3, 2, 1, 0, 564, 576, 1, 0, 0, 0, 565, 566, 5, 33, 0, 0, 566, 567, 3, 44, 22, 0, 567, 568, 5, 34, 0, 0, 568, 569, 3, 2, 1, 0, 569, 576, 1, 0, 0, 0, 570, 571, 5, 33, 0, 0, 571, 572, 3, 46, 23, 0, 572, 573, 5, 34, 0, 0, 573, 574, 3, 2, 1, 0, 574, 576, 1, 0, 0, 0, 575, 550, 1, 0, 0, 0, 575, 555, 1, 0, 0, 0, 575, 560, 1, 0, 0, 0, 575, 565, 1, 0, 0, 0, 575, 570, 1, 0, 0, 0, 576, 43, 1, 0, 0, 0, 577, 578, 5, 35, 0, 0, 578, 599, 3, 48, 24, 0, 579, 580, 5, 35, 0, 0, 580, 581, 3, 48, 24, 0, 581, 582, 5, 36, 0, 0, 582, 583, 3, 6, 3, 0, 583, 599, 1, 0, 0, 0, 584, 585, 5, 35, 0, 0, 585, 586, 3, 48, 24, 0, 586, 587, 5, 36, 0, 0, 587, 588, 5, 17, 0, 0, 588, 589, 3, 52, 26, 0, 589, 590, 5, 18, 0, 0, 590, 599, 1, 0, 0, 0, 591, 592, 5, 35, 0, 0, 592, 593, 3, 48, 24, 0, 593, 594, 5, 36, 0, 0, 594, 595, 5, 30, 0, 0, 595, 596, 3, 312, 156, 0, 596, 597, 5, 31, 0, 0, 597, 599, 1, 0, 0, 0, 598, 577, 1, 0, 0, 0, 598, 579, 1, 0, 0, 0, 598, 584, 1, 0, 0, 0, 598, 591, 1, 0, 0, 0, 599, 45, 1, 0, 0, 0, 600, 601, 5, 35, 0, 0, 601, 602, 5, 30, 0, 0, 602, 603, 3, 50, 25, 0, 603, 604, 5, 31, 0, 0, 604, 605, 3, 48, 24, 0, 605, 635, 1, 0, 0, 0, 606, 607, 5, 35, 0, 0, 607, 608, 5, 30, 0, 0, 608, 609, 3, 50, 25, 0, 609, 610, 5, 31, 0, 0, 610, 611, 3, 48, 24, 0, 611, 612, 5, 36, 0, 0, 612, 613, 3, 6, 3, 0, 613, 635, 1, 0, 0, 0, 614, 615, 5, 35, 0, 0, 615, 616, 5, 30, 0, 0, 616, 617, 3, 50, 25, 0, 617, 618, 5, 31, 0, 0, 618, 619, 3, 48, 24, 0, 619, 620, 5, 36, 0, 0, 620, 621, 5, 17, 0, 0, 621, 622, 3, 52, 26, 0, 622, 623, 5, 18, 0, 0, 623, 635, 1, 0, 0, 0, 624, 625, 5, 35, 0, 0, 625, 626, 5, 30, 0, 0, 626, 627, 3, 50, 25, 0, 627, 628, 5, 31, 0, 0, 628, 629, 3, 48, 24, 0, 629, 630, 5, 36, 0, 0, 630, 631, 5, 30, 0, 0, 631, 632, 3, 312, 156, 0, 632, 633, 5, 31, 0, 0, 633, 635, 1, 0, 0, 0, 634, 600, 1, 0, 0, 0, 634, 606, 1, 0, 0, 0, 634, 614, 1, 0, 0, 0, 634, 624, 1, 0, 0, 0, 635, 47, 1, 0, 0, 0, 636, 637, 3, 190, 95, 0, 637, 49, 1, 0, 0, 0, 638, 641, 3, 146, 73, 0, 639, 641, 3, 198, 99, 0, 640, 638, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 51, 1, 0, 0, 0, 642, 643, 3, 54, 27, 0, 643, 644, 3, 56, 28, 0, 644, 53, 1, 0, 0, 0, 645, 648, 3, 318, 159, 0, 646, 648, 3, 40, 20, 0, 647, 645, 1, 0, 0, 0, 647, 646, 1, 0, 0, 0, 648, 651, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 649, 650, 1, 0, 0, 0, 650, 55, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 652, 653, 3, 58, 29, 0, 653, 654, 3, 60, 30, 0, 654, 655, 3, 2, 1, 0, 655, 656, 5, 36, 0, 0, 656, 657, 3, 318, 159, 0, 657, 660, 1, 0, 0, 0, 658, 660, 3, 40, 20, 0, 659, 652, 1, 0, 0, 0, 659, 658, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 57, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 7, 3, 0, 0, 665, 59, 1, 0, 0, 0, 666, 668, 3, 62, 31, 0, 667, 669, 5, 260, 0, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 61, 1, 0, 0, 0, 670, 680, 3, 166, 83, 0, 671, 680, 3, 2, 1, 0, 672, 680, 5, 195, 0, 0, 673, 680, 5, 196, 0, 0, 674, 675, 5, 201, 0, 0, 675, 676, 5, 39, 0, 0, 676, 680, 5, 263, 0, 0, 677, 678, 5, 201, 0, 0, 678, 680, 3, 138, 69, 0, 679, 670, 1, 0, 0, 0, 679, 671, 1, 0, 0, 0, 679, 672, 1, 0, 0, 0, 679, 673, 1, 0, 0, 0, 679, 674, 1, 0, 0, 0, 679, 677, 1, 0, 0, 0, 680, 63, 1, 0, 0, 0, 681, 682, 5, 197, 0, 0, 682, 683, 5, 40, 0, 0, 683, 688, 3, 2, 1, 0, 684, 685, 5, 197, 0, 0, 685, 688, 3, 2, 1, 0, 686, 688, 5, 197, 0, 0, 687, 681, 1, 0, 0, 0, 687, 684, 1, 0, 0, 0, 687, 686, 1, 0, 0, 0, 688, 65, 1, 0, 0, 0, 689, 690, 5, 41, 0, 0, 690, 691, 5, 42, 0, 0, 691, 692, 3, 32, 16, 0, 692, 693, 5, 43, 0, 0, 693, 694, 3, 68, 34, 0, 694, 695, 5, 44, 0, 0, 695, 696, 3, 0, 0, 0, 696, 67, 1, 0, 0, 0, 697, 710, 6, 34, -1, 0, 698, 699, 10, 5, 0, 0, 699, 709, 5, 185, 0, 0, 700, 701, 10, 4, 0, 0, 701, 709, 5, 186, 0, 0, 702, 703, 10, 3, 0, 0, 703, 709, 5, 45, 0, 0, 704, 705, 10, 2, 0, 0, 705, 709, 5, 46, 0, 0, 706, 707, 10, 1, 0, 0, 707, 709, 5, 47, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 704, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 709, 712, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 69, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 713, 714, 5, 48, 0, 0, 714, 715, 5, 36, 0, 0, 715, 716, 5, 30, 0, 0, 716, 717, 3, 312, 156, 0, 717, 718, 5, 31, 0, 0, 718, 71, 1, 0, 0, 0, 719, 720, 5, 49, 0, 0, 720, 721, 3, 2, 1, 0, 721, 73, 1, 0, 0, 0, 722, 726, 5, 50, 0, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 729, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 730, 3, 2, 1, 0, 730, 731, 3, 204, 102, 0, 731, 732, 3, 78, 39, 0, 732, 733, 3, 80, 40, 0, 733, 75, 1, 0, 0, 0, 734, 772, 5, 51, 0, 0, 735, 772, 5, 52, 0, 0, 736, 772, 5, 198, 0, 0, 737, 772, 5, 201, 0, 0, 738, 772, 5, 220, 0, 0, 739, 772, 5, 53, 0, 0, 740, 772, 5, 54, 0, 0, 741, 772, 5, 55, 0, 0, 742, 772, 5, 56, 0, 0, 743, 772, 5, 243, 0, 0, 744, 772, 5, 15, 0, 0, 745, 772, 5, 223, 0, 0, 746, 772, 5, 57, 0, 0, 747, 772, 5, 58, 0, 0, 748, 772, 5, 59, 0, 0, 749, 772, 5, 60, 0, 0, 750, 772, 5, 61, 0, 0, 751, 752, 5, 62, 0, 0, 752, 772, 5, 51, 0, 0, 753, 754, 5, 62, 0, 0, 754, 772, 5, 52, 0, 0, 755, 756, 5, 62, 0, 0, 756, 772, 5, 63, 0, 0, 757, 758, 5, 62, 0, 0, 758, 772, 5, 64, 0, 0, 759, 760, 5, 62, 0, 0, 760, 772, 5, 65, 0, 0, 761, 762, 5, 62, 0, 0, 762, 772, 5, 66, 0, 0, 763, 772, 5, 67, 0, 0, 764, 772, 5, 68, 0, 0, 765, 772, 5, 69, 0, 0, 766, 767, 5, 70, 0, 0, 767, 768, 5, 30, 0, 0, 768, 769, 3, 32, 16, 0, 769, 770, 5, 31, 0, 0, 770, 772, 1, 0, 0, 0, 771, 734, 1, 0, 0, 0, 771, 735, 1, 0, 0, 0, 771, 736, 1, 0, 0, 0, 771, 737, 1, 0, 0, 0, 771, 738, 1, 0, 0, 0, 771, 739, 1, 0, 0, 0, 771, 740, 1, 0, 0, 0, 771, 741, 1, 0, 0, 0, 771, 742, 1, 0, 0, 0, 771, 743, 1, 0, 0, 0, 771, 744, 1, 0, 0, 0, 771, 745, 1, 0, 0, 0, 771, 746, 1, 0, 0, 0, 771, 747, 1, 0, 0, 0, 771, 748, 1, 0, 0, 0, 771, 749, 1, 0, 0, 0, 771, 750, 1, 0, 0, 0, 771, 751, 1, 0, 0, 0, 771, 753, 1, 0, 0, 0, 771, 755, 1, 0, 0, 0, 771, 757, 1, 0, 0, 0, 771, 759, 1, 0, 0, 0, 771, 761, 1, 0, 0, 0, 771, 763, 1, 0, 0, 0, 771, 764, 1, 0, 0, 0, 771, 765, 1, 0, 0, 0, 771, 766, 1, 0, 0, 0, 772, 77, 1, 0, 0, 0, 773, 777, 1, 0, 0, 0, 774, 775, 5, 71, 0, 0, 775, 777, 3, 146, 73, 0, 776, 773, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 777, 79, 1, 0, 0, 0, 778, 782, 1, 0, 0, 0, 779, 780, 5, 72, 0, 0, 780, 782, 3, 84, 42, 0, 781, 778, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 81, 1, 0, 0, 0, 783, 785, 3, 220, 110, 0, 784, 783, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 83, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 789, 790, 3, 146, 73, 0, 790, 791, 5, 28, 0, 0, 791, 793, 1, 0, 0, 0, 792, 789, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 146, 73, 0, 798, 85, 1, 0, 0, 0, 799, 800, 7, 4, 0, 0, 800, 87, 1, 0, 0, 0, 801, 802, 3, 86, 43, 0, 802, 803, 3, 32, 16, 0, 803, 804, 5, 263, 0, 0, 804, 873, 1, 0, 0, 0, 805, 806, 3, 86, 43, 0, 806, 807, 3, 32, 16, 0, 807, 873, 1, 0, 0, 0, 808, 809, 3, 86, 43, 0, 809, 810, 3, 32, 16, 0, 810, 811, 5, 75, 0, 0, 811, 812, 3, 32, 16, 0, 812, 813, 5, 263, 0, 0, 813, 873, 1, 0, 0, 0, 814, 815, 3, 86, 43, 0, 815, 816, 3, 32, 16, 0, 816, 817, 5, 75, 0, 0, 817, 818, 3, 32, 16, 0, 818, 873, 1, 0, 0, 0, 819, 820, 3, 86, 43, 0, 820, 821, 3, 32, 16, 0, 821, 822, 5, 75, 0, 0, 822, 823, 3, 32, 16, 0, 823, 824, 5, 28, 0, 0, 824, 825, 3, 32, 16, 0, 825, 826, 5, 263, 0, 0, 826, 873, 1, 0, 0, 0, 827, 828, 3, 86, 43, 0, 828, 829, 3, 32, 16, 0, 829, 830, 5, 75, 0, 0, 830, 831, 3, 32, 16, 0, 831, 832, 5, 28, 0, 0, 832, 833, 3, 32, 16, 0, 833, 873, 1, 0, 0, 0, 834, 835, 3, 86, 43, 0, 835, 836, 3, 32, 16, 0, 836, 837, 5, 28, 0, 0, 837, 838, 3, 32, 16, 0, 838, 839, 5, 75, 0, 0, 839, 840, 3, 32, 16, 0, 840, 841, 5, 263, 0, 0, 841, 873, 1, 0, 0, 0, 842, 843, 3, 86, 43, 0, 843, 844, 3, 32, 16, 0, 844, 845, 5, 28, 0, 0, 845, 846, 3, 32, 16, 0, 846, 847, 5, 75, 0, 0, 847, 848, 3, 32, 16, 0, 848, 873, 1, 0, 0, 0, 849, 850, 3, 86, 43, 0, 850, 851, 3, 32, 16, 0, 851, 852, 5, 28, 0, 0, 852, 853, 3, 32, 16, 0, 853, 854, 5, 75, 0, 0, 854, 855, 3, 32, 16, 0, 855, 856, 5, 28, 0, 0, 856, 857, 3, 32, 16, 0, 857, 858, 5, 263, 0, 0, 858, 873, 1, 0, 0, 0, 859, 860, 3, 86, 43, 0, 860, 861, 3, 32, 16, 0, 861, 862, 5, 28, 0, 0, 862, 863, 3, 32, 16, 0, 863, 864, 5, 75, 0, 0, 864, 865, 3, 32, 16, 0, 865, 866, 5, 28, 0, 0, 866, 867, 3, 32, 16, 0, 867, 873, 1, 0, 0, 0, 868, 869, 3, 86, 43, 0, 869, 870, 3, 32, 16, 0, 870, 871, 5, 262, 0, 0, 871, 873, 1, 0, 0, 0, 872, 801, 1, 0, 0, 0, 872, 805, 1, 0, 0, 0, 872, 808, 1, 0, 0, 0, 872, 814, 1, 0, 0, 0, 872, 819, 1, 0, 0, 0, 872, 827, 1, 0, 0, 0, 872, 834, 1, 0, 0, 0, 872, 842, 1, 0, 0, 0, 872, 849, 1, 0, 0, 0, 872, 859, 1, 0, 0, 0, 872, 868, 1, 0, 0, 0, 873, 89, 1, 0, 0, 0, 874, 878, 5, 21, 0, 0, 875, 877, 3, 92, 46, 0, 876, 875, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 876, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 881, 1, 0, 0, 0, 880, 878, 1, 0, 0, 0, 881, 882, 3, 2, 1, 0, 882, 883, 3, 94, 47, 0, 883, 884, 5, 179, 0, 0, 884, 885, 5, 36, 0, 0, 885, 886, 5, 30, 0, 0, 886, 887, 3, 312, 156, 0, 887, 888, 5, 31, 0, 0, 888, 889, 3, 94, 47, 0, 889, 901, 1, 0, 0, 0, 890, 894, 5, 21, 0, 0, 891, 893, 3, 92, 46, 0, 892, 891, 1, 0, 0, 0, 893, 896, 1, 0, 0, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 897, 1, 0, 0, 0, 896, 894, 1, 0, 0, 0, 897, 898, 3, 2, 1, 0, 898, 899, 3, 94, 47, 0, 899, 901, 1, 0, 0, 0, 900, 874, 1, 0, 0, 0, 900, 890, 1, 0, 0, 0, 901, 91, 1, 0, 0, 0, 902, 903, 5, 76, 0, 0, 903, 93, 1, 0, 0, 0, 904, 907, 1, 0, 0, 0, 905, 907, 5, 297, 0, 0, 906, 904, 1, 0, 0, 0, 906, 905, 1, 0, 0, 0, 907, 95, 1, 0, 0, 0, 908, 909, 7, 5, 0, 0, 909, 97, 1, 0, 0, 0, 910, 912, 3, 96, 48, 0, 911, 910, 1, 0, 0, 0, 912, 915, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 99, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 916, 917, 5, 274, 0, 0, 917, 101, 1, 0, 0, 0, 918, 919, 5, 275, 0, 0, 919, 103, 1, 0, 0, 0, 920, 921, 5, 276, 0, 0, 921, 105, 1, 0, 0, 0, 922, 923, 5, 277, 0, 0, 923, 107, 1, 0, 0, 0, 924, 925, 5, 278, 0, 0, 925, 109, 1, 0, 0, 0, 926, 927, 5, 281, 0, 0, 927, 111, 1, 0, 0, 0, 928, 929, 5, 279, 0, 0, 929, 113, 1, 0, 0, 0, 930, 931, 5, 285, 0, 0, 931, 115, 1, 0, 0, 0, 932, 933, 5, 283, 0, 0, 933, 117, 1, 0, 0, 0, 934, 935, 5, 284, 0, 0, 935, 119, 1, 0, 0, 0, 936, 937, 5, 280, 0, 0, 937, 121, 1, 0, 0, 0, 938, 939, 5, 286, 0, 0, 939, 123, 1, 0, 0, 0, 940, 941, 5, 282, 0, 0, 941, 125, 1, 0, 0, 0, 942, 1025, 3, 100, 50, 0, 943, 944, 3, 102, 51, 0, 944, 945, 3, 32, 16, 0, 945, 1025, 1, 0, 0, 0, 946, 947, 3, 102, 51, 0, 947, 948, 3, 0, 0, 0, 948, 1025, 1, 0, 0, 0, 949, 950, 3, 104, 52, 0, 950, 951, 3, 32, 16, 0, 951, 1025, 1, 0, 0, 0, 952, 953, 3, 106, 53, 0, 953, 954, 3, 34, 17, 0, 954, 1025, 1, 0, 0, 0, 955, 956, 3, 108, 54, 0, 956, 957, 3, 36, 18, 0, 957, 1025, 1, 0, 0, 0, 958, 959, 3, 108, 54, 0, 959, 960, 3, 34, 17, 0, 960, 1025, 1, 0, 0, 0, 961, 962, 3, 108, 54, 0, 962, 963, 5, 30, 0, 0, 963, 964, 3, 312, 156, 0, 964, 965, 5, 31, 0, 0, 965, 1025, 1, 0, 0, 0, 966, 967, 3, 108, 54, 0, 967, 968, 5, 84, 0, 0, 968, 969, 5, 30, 0, 0, 969, 970, 3, 312, 156, 0, 970, 971, 5, 31, 0, 0, 971, 1025, 1, 0, 0, 0, 972, 973, 3, 110, 55, 0, 973, 974, 3, 32, 16, 0, 974, 1025, 1, 0, 0, 0, 975, 976, 3, 110, 55, 0, 976, 977, 3, 0, 0, 0, 977, 1025, 1, 0, 0, 0, 978, 979, 3, 112, 56, 0, 979, 980, 3, 190, 95, 0, 980, 1025, 1, 0, 0, 0, 981, 982, 3, 114, 57, 0, 982, 983, 3, 200, 100, 0, 983, 1025, 1, 0, 0, 0, 984, 985, 3, 114, 57, 0, 985, 986, 3, 196, 98, 0, 986, 1025, 1, 0, 0, 0, 987, 988, 3, 116, 58, 0, 988, 989, 3, 146, 73, 0, 989, 1025, 1, 0, 0, 0, 990, 991, 3, 118, 59, 0, 991, 992, 3, 6, 3, 0, 992, 1025, 1, 0, 0, 0, 993, 994, 3, 118, 59, 0, 994, 995, 5, 223, 0, 0, 995, 996, 5, 30, 0, 0, 996, 997, 3, 6, 3, 0, 997, 998, 5, 31, 0, 0, 998, 1025, 1, 0, 0, 0, 999, 1000, 3, 118, 59, 0, 1000, 1001, 5, 84, 0, 0, 1001, 1002, 5, 30, 0, 0, 1002, 1003, 3, 312, 156, 0, 1003, 1004, 5, 31, 0, 0, 1004, 1025, 1, 0, 0, 0, 1005, 1006, 3, 120, 60, 0, 1006, 1007, 3, 192, 96, 0, 1007, 1008, 3, 160, 80, 0, 1008, 1009, 3, 134, 67, 0, 1009, 1025, 1, 0, 0, 0, 1010, 1011, 3, 122, 61, 0, 1011, 1012, 3, 50, 25, 0, 1012, 1025, 1, 0, 0, 0, 1013, 1014, 3, 122, 61, 0, 1014, 1015, 3, 32, 16, 0, 1015, 1025, 1, 0, 0, 0, 1016, 1017, 3, 124, 62, 0, 1017, 1018, 5, 30, 0, 0, 1018, 1019, 3, 128, 64, 0, 1019, 1020, 5, 31, 0, 0, 1020, 1025, 1, 0, 0, 0, 1021, 1022, 3, 124, 62, 0, 1022, 1023, 5, 85, 0, 0, 1023, 1025, 1, 0, 0, 0, 1024, 942, 1, 0, 0, 0, 1024, 943, 1, 0, 0, 0, 1024, 946, 1, 0, 0, 0, 1024, 949, 1, 0, 0, 0, 1024, 952, 1, 0, 0, 0, 1024, 955, 1, 0, 0, 0, 1024, 958, 1, 0, 0, 0, 1024, 961, 1, 0, 0, 0, 1024, 966, 1, 0, 0, 0, 1024, 972, 1, 0, 0, 0, 1024, 975, 1, 0, 0, 0, 1024, 978, 1, 0, 0, 0, 1024, 981, 1, 0, 0, 0, 1024, 984, 1, 0, 0, 0, 1024, 987, 1, 0, 0, 0, 1024, 990, 1, 0, 0, 0, 1024, 993, 1, 0, 0, 0, 1024, 999, 1, 0, 0, 0, 1024, 1005, 1, 0, 0, 0, 1024, 1010, 1, 0, 0, 0, 1024, 1013, 1, 0, 0, 0, 1024, 1016, 1, 0, 0, 0, 1024, 1021, 1, 0, 0, 0, 1025, 127, 1, 0, 0, 0, 1026, 1043, 1, 0, 0, 0, 1027, 1030, 3, 0, 0, 0, 1028, 1030, 3, 32, 16, 0, 1029, 1027, 1, 0, 0, 0, 1029, 1028, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1032, 5, 28, 0, 0, 1032, 1034, 1, 0, 0, 0, 1033, 1029, 1, 0, 0, 0, 1034, 1037, 1, 0, 0, 0, 1035, 1033, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1040, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1038, 1041, 3, 0, 0, 0, 1039, 1041, 3, 32, 16, 0, 1040, 1038, 1, 0, 0, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1043, 1, 0, 0, 0, 1042, 1026, 1, 0, 0, 0, 1042, 1035, 1, 0, 0, 0, 1043, 129, 1, 0, 0, 0, 1044, 1050, 5, 86, 0, 0, 1045, 1046, 3, 160, 80, 0, 1046, 1047, 5, 28, 0, 0, 1047, 1049, 1, 0, 0, 0, 1048, 1045, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1053, 1054, 3, 160, 80, 0, 1054, 1055, 5, 87, 0, 0, 1055, 131, 1, 0, 0, 0, 1056, 1062, 5, 42, 0, 0, 1057, 1058, 3, 168, 84, 0, 1058, 1059, 5, 28, 0, 0, 1059, 1061, 1, 0, 0, 0, 1060, 1057, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1065, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1066, 3, 168, 84, 0, 1066, 1067, 5, 43, 0, 0, 1067, 133, 1, 0, 0, 0, 1068, 1074, 5, 30, 0, 0, 1069, 1070, 3, 136, 68, 0, 1070, 1071, 5, 28, 0, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1069, 1, 0, 0, 0, 1073, 1076, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1077, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1077, 1078, 3, 136, 68, 0, 1078, 1079, 5, 31, 0, 0, 1079, 1082, 1, 0, 0, 0, 1080, 1082, 5, 85, 0, 0, 1081, 1068, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 135, 1, 0, 0, 0, 1083, 1091, 5, 176, 0, 0, 1084, 1085, 3, 252, 126, 0, 1085, 1086, 3, 160, 80, 0, 1086, 1088, 3, 248, 124, 0, 1087, 1089, 3, 0, 0, 0, 1088, 1087, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1091, 1, 0, 0, 0, 1090, 1083, 1, 0, 0, 0, 1090, 1084, 1, 0, 0, 0, 1091, 137, 1, 0, 0, 0, 1092, 1093, 5, 42, 0, 0, 1093, 1094, 3, 2, 1, 0, 1094, 1095, 5, 43, 0, 0, 1095, 1096, 3, 140, 70, 0, 1096, 1118, 1, 0, 0, 0, 1097, 1098, 5, 42, 0, 0, 1098, 1099, 3, 196, 98, 0, 1099, 1100, 5, 43, 0, 0, 1100, 1101, 3, 140, 70, 0, 1101, 1118, 1, 0, 0, 0, 1102, 1103, 5, 42, 0, 0, 1103, 1104, 5, 261, 0, 0, 1104, 1105, 5, 43, 0, 0, 1105, 1118, 3, 140, 70, 0, 1106, 1107, 5, 42, 0, 0, 1107, 1108, 5, 197, 0, 0, 1108, 1109, 3, 2, 1, 0, 1109, 1110, 5, 43, 0, 0, 1110, 1111, 3, 140, 70, 0, 1111, 1118, 1, 0, 0, 0, 1112, 1118, 3, 140, 70, 0, 1113, 1118, 3, 196, 98, 0, 1114, 1118, 5, 256, 0, 0, 1115, 1118, 5, 257, 0, 0, 1116, 1118, 5, 258, 0, 0, 1117, 1092, 1, 0, 0, 0, 1117, 1097, 1, 0, 0, 0, 1117, 1102, 1, 0, 0, 0, 1117, 1106, 1, 0, 0, 0, 1117, 1112, 1, 0, 0, 0, 1117, 1113, 1, 0, 0, 0, 1117, 1114, 1, 0, 0, 0, 1117, 1115, 1, 0, 0, 0, 1117, 1116, 1, 0, 0, 0, 1118, 139, 1, 0, 0, 0, 1119, 1120, 3, 2, 1, 0, 1120, 1121, 5, 88, 0, 0, 1121, 1123, 1, 0, 0, 0, 1122, 1119, 1, 0, 0, 0, 1123, 1126, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1127, 1, 0, 0, 0, 1126, 1124, 1, 0, 0, 0, 1127, 1128, 3, 2, 1, 0, 1128, 141, 1, 0, 0, 0, 1129, 1131, 3, 144, 72, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1134, 1, 0, 0, 0, 1132, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 143, 1, 0, 0, 0, 1134, 1132, 1, 0, 0, 0, 1135, 1136, 5, 179, 0, 0, 1136, 1137, 5, 89, 0, 0, 1137, 1141, 3, 32, 16, 0, 1138, 1141, 3, 174, 87, 0, 1139, 1141, 3, 344, 172, 0, 1140, 1135, 1, 0, 0, 0, 1140, 1138, 1, 0, 0, 0, 1140, 1139, 1, 0, 0, 0, 1141, 145, 1, 0, 0, 0, 1142, 1154, 3, 138, 69, 0, 1143, 1144, 5, 42, 0, 0, 1144, 1145, 3, 2, 1, 0, 1145, 1146, 5, 43, 0, 0, 1146, 1154, 1, 0, 0, 0, 1147, 1148, 5, 42, 0, 0, 1148, 1149, 5, 197, 0, 0, 1149, 1150, 3, 2, 1, 0, 1150, 1151, 5, 43, 0, 0, 1151, 1154, 1, 0, 0, 0, 1152, 1154, 3, 160, 80, 0, 1153, 1142, 1, 0, 0, 0, 1153, 1143, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, 147, 1, 0, 0, 0, 1155, 1164, 1, 0, 0, 0, 1156, 1160, 3, 152, 76, 0, 1157, 1159, 3, 150, 75, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1162, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1164, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1163, 1155, 1, 0, 0, 0, 1163, 1156, 1, 0, 0, 0, 1164, 149, 1, 0, 0, 0, 1165, 1183, 5, 261, 0, 0, 1166, 1183, 5, 260, 0, 0, 1167, 1168, 5, 42, 0, 0, 1168, 1169, 3, 32, 16, 0, 1169, 1170, 5, 43, 0, 0, 1170, 1183, 1, 0, 0, 0, 1171, 1172, 5, 42, 0, 0, 1172, 1173, 3, 32, 16, 0, 1173, 1174, 5, 265, 0, 0, 1174, 1175, 3, 32, 16, 0, 1175, 1176, 5, 43, 0, 0, 1176, 1183, 1, 0, 0, 0, 1177, 1178, 5, 42, 0, 0, 1178, 1179, 5, 265, 0, 0, 1179, 1180, 3, 32, 16, 0, 1180, 1181, 5, 43, 0, 0, 1181, 1183, 1, 0, 0, 0, 1182, 1165, 1, 0, 0, 0, 1182, 1166, 1, 0, 0, 0, 1182, 1167, 1, 0, 0, 0, 1182, 1171, 1, 0, 0, 0, 1182, 1177, 1, 0, 0, 0, 1183, 151, 1, 0, 0, 0, 1184, 1277, 1, 0, 0, 0, 1185, 1186, 5, 202, 0, 0, 1186, 1187, 5, 30, 0, 0, 1187, 1188, 3, 6, 3, 0, 1188, 1189, 5, 28, 0, 0, 1189, 1190, 3, 6, 3, 0, 1190, 1191, 5, 28, 0, 0, 1191, 1192, 3, 6, 3, 0, 1192, 1193, 5, 28, 0, 0, 1193, 1194, 3, 6, 3, 0, 1194, 1195, 5, 31, 0, 0, 1195, 1277, 1, 0, 0, 0, 1196, 1197, 5, 202, 0, 0, 1197, 1198, 5, 30, 0, 0, 1198, 1199, 3, 6, 3, 0, 1199, 1200, 5, 28, 0, 0, 1200, 1201, 3, 6, 3, 0, 1201, 1202, 5, 31, 0, 0, 1202, 1277, 1, 0, 0, 0, 1203, 1204, 5, 203, 0, 0, 1204, 1205, 5, 204, 0, 0, 1205, 1206, 5, 42, 0, 0, 1206, 1207, 3, 32, 16, 0, 1207, 1208, 5, 43, 0, 0, 1208, 1277, 1, 0, 0, 0, 1209, 1210, 5, 203, 0, 0, 1210, 1211, 5, 205, 0, 0, 1211, 1212, 5, 42, 0, 0, 1212, 1213, 3, 32, 16, 0, 1213, 1214, 5, 43, 0, 0, 1214, 1215, 3, 148, 74, 0, 1215, 1277, 1, 0, 0, 0, 1216, 1277, 5, 206, 0, 0, 1217, 1277, 5, 207, 0, 0, 1218, 1277, 5, 208, 0, 0, 1219, 1277, 5, 200, 0, 0, 1220, 1277, 5, 182, 0, 0, 1221, 1277, 5, 183, 0, 0, 1222, 1277, 5, 184, 0, 0, 1223, 1277, 5, 185, 0, 0, 1224, 1277, 5, 186, 0, 0, 1225, 1277, 5, 187, 0, 0, 1226, 1277, 5, 188, 0, 0, 1227, 1277, 5, 209, 0, 0, 1228, 1277, 5, 189, 0, 0, 1229, 1277, 5, 190, 0, 0, 1230, 1277, 5, 191, 0, 0, 1231, 1277, 5, 192, 0, 0, 1232, 1277, 5, 210, 0, 0, 1233, 1277, 5, 211, 0, 0, 1234, 1277, 5, 212, 0, 0, 1235, 1277, 5, 213, 0, 0, 1236, 1277, 5, 214, 0, 0, 1237, 1277, 5, 215, 0, 0, 1238, 1277, 5, 216, 0, 0, 1239, 1240, 5, 217, 0, 0, 1240, 1277, 3, 154, 77, 0, 1241, 1242, 5, 218, 0, 0, 1242, 1277, 3, 154, 77, 0, 1243, 1277, 5, 219, 0, 0, 1244, 1245, 5, 220, 0, 0, 1245, 1277, 3, 154, 77, 0, 1246, 1247, 5, 221, 0, 0, 1247, 1277, 3, 156, 78, 0, 1248, 1249, 5, 221, 0, 0, 1249, 1250, 3, 156, 78, 0, 1250, 1251, 5, 28, 0, 0, 1251, 1252, 3, 6, 3, 0, 1252, 1277, 1, 0, 0, 0, 1253, 1277, 5, 193, 0, 0, 1254, 1277, 5, 194, 0, 0, 1255, 1256, 5, 90, 0, 0, 1256, 1277, 5, 183, 0, 0, 1257, 1258, 5, 90, 0, 0, 1258, 1277, 5, 184, 0, 0, 1259, 1260, 5, 90, 0, 0, 1260, 1277, 5, 185, 0, 0, 1261, 1262, 5, 90, 0, 0, 1262, 1277, 5, 186, 0, 0, 1263, 1264, 5, 62, 0, 0, 1264, 1277, 5, 219, 0, 0, 1265, 1277, 5, 222, 0, 0, 1266, 1267, 5, 223, 0, 0, 1267, 1277, 5, 212, 0, 0, 1268, 1277, 5, 224, 0, 0, 1269, 1270, 5, 206, 0, 0, 1270, 1277, 5, 182, 0, 0, 1271, 1277, 5, 225, 0, 0, 1272, 1277, 5, 227, 0, 0, 1273, 1274, 5, 34, 0, 0, 1274, 1277, 5, 226, 0, 0, 1275, 1277, 3, 2, 1, 0, 1276, 1184, 1, 0, 0, 0, 1276, 1185, 1, 0, 0, 0, 1276, 1196, 1, 0, 0, 0, 1276, 1203, 1, 0, 0, 0, 1276, 1209, 1, 0, 0, 0, 1276, 1216, 1, 0, 0, 0, 1276, 1217, 1, 0, 0, 0, 1276, 1218, 1, 0, 0, 0, 1276, 1219, 1, 0, 0, 0, 1276, 1220, 1, 0, 0, 0, 1276, 1221, 1, 0, 0, 0, 1276, 1222, 1, 0, 0, 0, 1276, 1223, 1, 0, 0, 0, 1276, 1224, 1, 0, 0, 0, 1276, 1225, 1, 0, 0, 0, 1276, 1226, 1, 0, 0, 0, 1276, 1227, 1, 0, 0, 0, 1276, 1228, 1, 0, 0, 0, 1276, 1229, 1, 0, 0, 0, 1276, 1230, 1, 0, 0, 0, 1276, 1231, 1, 0, 0, 0, 1276, 1232, 1, 0, 0, 0, 1276, 1233, 1, 0, 0, 0, 1276, 1234, 1, 0, 0, 0, 1276, 1235, 1, 0, 0, 0, 1276, 1236, 1, 0, 0, 0, 1276, 1237, 1, 0, 0, 0, 1276, 1238, 1, 0, 0, 0, 1276, 1239, 1, 0, 0, 0, 1276, 1241, 1, 0, 0, 0, 1276, 1243, 1, 0, 0, 0, 1276, 1244, 1, 0, 0, 0, 1276, 1246, 1, 0, 0, 0, 1276, 1248, 1, 0, 0, 0, 1276, 1253, 1, 0, 0, 0, 1276, 1254, 1, 0, 0, 0, 1276, 1255, 1, 0, 0, 0, 1276, 1257, 1, 0, 0, 0, 1276, 1259, 1, 0, 0, 0, 1276, 1261, 1, 0, 0, 0, 1276, 1263, 1, 0, 0, 0, 1276, 1265, 1, 0, 0, 0, 1276, 1266, 1, 0, 0, 0, 1276, 1268, 1, 0, 0, 0, 1276, 1269, 1, 0, 0, 0, 1276, 1271, 1, 0, 0, 0, 1276, 1272, 1, 0, 0, 0, 1276, 1273, 1, 0, 0, 0, 1276, 1275, 1, 0, 0, 0, 1277, 153, 1, 0, 0, 0, 1278, 1286, 1, 0, 0, 0, 1279, 1280, 5, 30, 0, 0, 1280, 1281, 5, 91, 0, 0, 1281, 1282, 5, 36, 0, 0, 1282, 1283, 3, 32, 16, 0, 1283, 1284, 5, 31, 0, 0, 1284, 1286, 1, 0, 0, 0, 1285, 1278, 1, 0, 0, 0, 1285, 1279, 1, 0, 0, 0, 1286, 155, 1, 0, 0, 0, 1287, 1296, 1, 0, 0, 0, 1288, 1292, 3, 158, 79, 0, 1289, 1291, 7, 6, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1294, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1295, 1287, 1, 0, 0, 0, 1295, 1288, 1, 0, 0, 0, 1296, 157, 1, 0, 0, 0, 1297, 1298, 7, 7, 0, 0, 1298, 159, 1, 0, 0, 0, 1299, 1303, 3, 164, 82, 0, 1300, 1302, 3, 162, 81, 0, 1301, 1300, 1, 0, 0, 0, 1302, 1305, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 161, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1306, 1325, 5, 260, 0, 0, 1307, 1308, 5, 42, 0, 0, 1308, 1325, 5, 43, 0, 0, 1309, 1325, 3, 132, 66, 0, 1310, 1325, 5, 259, 0, 0, 1311, 1325, 5, 261, 0, 0, 1312, 1325, 5, 92, 0, 0, 1313, 1314, 5, 93, 0, 0, 1314, 1315, 5, 30, 0, 0, 1315, 1316, 3, 146, 73, 0, 1316, 1317, 5, 31, 0, 0, 1317, 1325, 1, 0, 0, 0, 1318, 1319, 5, 94, 0, 0, 1319, 1320, 5, 30, 0, 0, 1320, 1321, 3, 146, 73, 0, 1321, 1322, 5, 31, 0, 0, 1322, 1325, 1, 0, 0, 0, 1323, 1325, 3, 130, 65, 0, 1324, 1306, 1, 0, 0, 0, 1324, 1307, 1, 0, 0, 0, 1324, 1309, 1, 0, 0, 0, 1324, 1310, 1, 0, 0, 0, 1324, 1311, 1, 0, 0, 0, 1324, 1312, 1, 0, 0, 0, 1324, 1313, 1, 0, 0, 0, 1324, 1318, 1, 0, 0, 0, 1324, 1323, 1, 0, 0, 0, 1325, 163, 1, 0, 0, 0, 1326, 1327, 5, 39, 0, 0, 1327, 1357, 3, 138, 69, 0, 1328, 1357, 5, 196, 0, 0, 1329, 1330, 5, 198, 0, 0, 1330, 1331, 5, 39, 0, 0, 1331, 1357, 3, 138, 69, 0, 1332, 1333, 5, 199, 0, 0, 1333, 1357, 3, 138, 69, 0, 1334, 1335, 5, 225, 0, 0, 1335, 1336, 3, 192, 96, 0, 1336, 1337, 3, 160, 80, 0, 1337, 1338, 5, 261, 0, 0, 1338, 1339, 3, 134, 67, 0, 1339, 1357, 1, 0, 0, 0, 1340, 1341, 5, 252, 0, 0, 1341, 1357, 3, 32, 16, 0, 1342, 1343, 5, 251, 0, 0, 1343, 1357, 3, 32, 16, 0, 1344, 1345, 5, 252, 0, 0, 1345, 1357, 3, 2, 1, 0, 1346, 1347, 5, 251, 0, 0, 1347, 1357, 3, 2, 1, 0, 1348, 1357, 5, 253, 0, 0, 1349, 1357, 5, 200, 0, 0, 1350, 1357, 3, 170, 85, 0, 1351, 1357, 3, 172, 86, 0, 1352, 1357, 3, 166, 83, 0, 1353, 1357, 3, 2, 1, 0, 1354, 1355, 5, 176, 0, 0, 1355, 1357, 3, 160, 80, 0, 1356, 1326, 1, 0, 0, 0, 1356, 1328, 1, 0, 0, 0, 1356, 1329, 1, 0, 0, 0, 1356, 1332, 1, 0, 0, 0, 1356, 1334, 1, 0, 0, 0, 1356, 1340, 1, 0, 0, 0, 1356, 1342, 1, 0, 0, 0, 1356, 1344, 1, 0, 0, 0, 1356, 1346, 1, 0, 0, 0, 1356, 1348, 1, 0, 0, 0, 1356, 1349, 1, 0, 0, 0, 1356, 1350, 1, 0, 0, 0, 1356, 1351, 1, 0, 0, 0, 1356, 1352, 1, 0, 0, 0, 1356, 1353, 1, 0, 0, 0, 1356, 1354, 1, 0, 0, 0, 1357, 165, 1, 0, 0, 0, 1358, 1380, 5, 180, 0, 0, 1359, 1380, 5, 181, 0, 0, 1360, 1380, 5, 182, 0, 0, 1361, 1380, 5, 183, 0, 0, 1362, 1380, 5, 184, 0, 0, 1363, 1380, 5, 185, 0, 0, 1364, 1380, 5, 186, 0, 0, 1365, 1380, 5, 187, 0, 0, 1366, 1380, 5, 188, 0, 0, 1367, 1380, 5, 189, 0, 0, 1368, 1380, 5, 190, 0, 0, 1369, 1380, 5, 191, 0, 0, 1370, 1380, 5, 192, 0, 0, 1371, 1372, 5, 90, 0, 0, 1372, 1380, 5, 183, 0, 0, 1373, 1374, 5, 90, 0, 0, 1374, 1380, 5, 184, 0, 0, 1375, 1376, 5, 90, 0, 0, 1376, 1380, 5, 185, 0, 0, 1377, 1378, 5, 90, 0, 0, 1378, 1380, 5, 186, 0, 0, 1379, 1358, 1, 0, 0, 0, 1379, 1359, 1, 0, 0, 0, 1379, 1360, 1, 0, 0, 0, 1379, 1361, 1, 0, 0, 0, 1379, 1362, 1, 0, 0, 0, 1379, 1363, 1, 0, 0, 0, 1379, 1364, 1, 0, 0, 0, 1379, 1365, 1, 0, 0, 0, 1379, 1366, 1, 0, 0, 0, 1379, 1367, 1, 0, 0, 0, 1379, 1368, 1, 0, 0, 0, 1379, 1369, 1, 0, 0, 0, 1379, 1370, 1, 0, 0, 0, 1379, 1371, 1, 0, 0, 0, 1379, 1373, 1, 0, 0, 0, 1379, 1375, 1, 0, 0, 0, 1379, 1377, 1, 0, 0, 0, 1380, 167, 1, 0, 0, 0, 1381, 1392, 1, 0, 0, 0, 1382, 1392, 5, 176, 0, 0, 1383, 1392, 3, 32, 16, 0, 1384, 1385, 3, 32, 16, 0, 1385, 1386, 5, 176, 0, 0, 1386, 1387, 3, 32, 16, 0, 1387, 1392, 1, 0, 0, 0, 1388, 1389, 3, 32, 16, 0, 1389, 1390, 5, 176, 0, 0, 1390, 1392, 1, 0, 0, 0, 1391, 1381, 1, 0, 0, 0, 1391, 1382, 1, 0, 0, 0, 1391, 1383, 1, 0, 0, 0, 1391, 1384, 1, 0, 0, 0, 1391, 1388, 1, 0, 0, 0, 1392, 169, 1, 0, 0, 0, 1393, 1394, 5, 1, 0, 0, 1394, 1395, 5, 193, 0, 0, 1395, 171, 1, 0, 0, 0, 1396, 1400, 5, 1, 0, 0, 1397, 1398, 5, 90, 0, 0, 1398, 1401, 5, 193, 0, 0, 1399, 1401, 5, 194, 0, 0, 1400, 1397, 1, 0, 0, 0, 1400, 1399, 1, 0, 0, 0, 1401, 173, 1, 0, 0, 0, 1402, 1403, 5, 293, 0, 0, 1403, 1404, 3, 188, 94, 0, 1404, 1405, 3, 146, 73, 0, 1405, 1406, 5, 30, 0, 0, 1406, 1407, 3, 180, 90, 0, 1407, 1408, 5, 31, 0, 0, 1408, 1450, 1, 0, 0, 0, 1409, 1410, 5, 293, 0, 0, 1410, 1411, 3, 188, 94, 0, 1411, 1412, 3, 146, 73, 0, 1412, 1413, 5, 36, 0, 0, 1413, 1414, 5, 17, 0, 0, 1414, 1415, 3, 52, 26, 0, 1415, 1416, 5, 18, 0, 0, 1416, 1450, 1, 0, 0, 0, 1417, 1418, 5, 293, 0, 0, 1418, 1419, 3, 188, 94, 0, 1419, 1420, 3, 146, 73, 0, 1420, 1450, 1, 0, 0, 0, 1421, 1422, 5, 294, 0, 0, 1422, 1423, 3, 188, 94, 0, 1423, 1425, 5, 36, 0, 0, 1424, 1426, 5, 84, 0, 0, 1425, 1424, 1, 0, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 1, 0, 0, 0, 1427, 1428, 5, 30, 0, 0, 1428, 1429, 3, 312, 156, 0, 1429, 1430, 5, 31, 0, 0, 1430, 1450, 1, 0, 0, 0, 1431, 1432, 5, 294, 0, 0, 1432, 1433, 3, 188, 94, 0, 1433, 1434, 5, 84, 0, 0, 1434, 1435, 5, 30, 0, 0, 1435, 1436, 3, 312, 156, 0, 1436, 1437, 5, 31, 0, 0, 1437, 1450, 1, 0, 0, 0, 1438, 1439, 5, 294, 0, 0, 1439, 1440, 3, 188, 94, 0, 1440, 1441, 3, 6, 3, 0, 1441, 1450, 1, 0, 0, 0, 1442, 1443, 5, 294, 0, 0, 1443, 1444, 3, 188, 94, 0, 1444, 1445, 5, 36, 0, 0, 1445, 1446, 5, 17, 0, 0, 1446, 1447, 3, 176, 88, 0, 1447, 1448, 5, 18, 0, 0, 1448, 1450, 1, 0, 0, 0, 1449, 1402, 1, 0, 0, 0, 1449, 1409, 1, 0, 0, 0, 1449, 1417, 1, 0, 0, 0, 1449, 1421, 1, 0, 0, 0, 1449, 1431, 1, 0, 0, 0, 1449, 1438, 1, 0, 0, 0, 1449, 1442, 1, 0, 0, 0, 1450, 175, 1, 0, 0, 0, 1451, 1462, 1, 0, 0, 0, 1452, 1453, 3, 178, 89, 0, 1453, 1454, 5, 28, 0, 0, 1454, 1456, 1, 0, 0, 0, 1455, 1452, 1, 0, 0, 0, 1456, 1459, 1, 0, 0, 0, 1457, 1455, 1, 0, 0, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1460, 1, 0, 0, 0, 1459, 1457, 1, 0, 0, 0, 1460, 1462, 3, 178, 89, 0, 1461, 1451, 1, 0, 0, 0, 1461, 1457, 1, 0, 0, 0, 1462, 177, 1, 0, 0, 0, 1463, 1464, 5, 39, 0, 0, 1464, 1465, 5, 263, 0, 0, 1465, 1466, 5, 36, 0, 0, 1466, 1467, 5, 17, 0, 0, 1467, 1468, 3, 56, 28, 0, 1468, 1469, 5, 18, 0, 0, 1469, 1477, 1, 0, 0, 0, 1470, 1471, 3, 146, 73, 0, 1471, 1472, 5, 36, 0, 0, 1472, 1473, 5, 17, 0, 0, 1473, 1474, 3, 56, 28, 0, 1474, 1475, 5, 18, 0, 0, 1475, 1477, 1, 0, 0, 0, 1476, 1463, 1, 0, 0, 0, 1476, 1470, 1, 0, 0, 0, 1477, 179, 1, 0, 0, 0, 1478, 1479, 3, 182, 91, 0, 1479, 1480, 5, 28, 0, 0, 1480, 1482, 1, 0, 0, 0, 1481, 1478, 1, 0, 0, 0, 1482, 1485, 1, 0, 0, 0, 1483, 1481, 1, 0, 0, 0, 1483, 1484, 1, 0, 0, 0, 1484, 1486, 1, 0, 0, 0, 1485, 1483, 1, 0, 0, 0, 1486, 1487, 3, 182, 91, 0, 1487, 181, 1, 0, 0, 0, 1488, 1489, 3, 6, 3, 0, 1489, 1490, 5, 36, 0, 0, 1490, 1491, 3, 186, 93, 0, 1491, 183, 1, 0, 0, 0, 1492, 1493, 7, 8, 0, 0, 1493, 185, 1, 0, 0, 0, 1494, 1529, 3, 184, 92, 0, 1495, 1529, 3, 32, 16, 0, 1496, 1497, 5, 185, 0, 0, 1497, 1498, 5, 30, 0, 0, 1498, 1499, 3, 32, 16, 0, 1499, 1500, 5, 31, 0, 0, 1500, 1529, 1, 0, 0, 0, 1501, 1529, 3, 6, 3, 0, 1502, 1503, 3, 138, 69, 0, 1503, 1504, 5, 30, 0, 0, 1504, 1505, 5, 183, 0, 0, 1505, 1506, 5, 75, 0, 0, 1506, 1507, 3, 32, 16, 0, 1507, 1508, 5, 31, 0, 0, 1508, 1529, 1, 0, 0, 0, 1509, 1510, 3, 138, 69, 0, 1510, 1511, 5, 30, 0, 0, 1511, 1512, 5, 184, 0, 0, 1512, 1513, 5, 75, 0, 0, 1513, 1514, 3, 32, 16, 0, 1514, 1515, 5, 31, 0, 0, 1515, 1529, 1, 0, 0, 0, 1516, 1517, 3, 138, 69, 0, 1517, 1518, 5, 30, 0, 0, 1518, 1519, 5, 185, 0, 0, 1519, 1520, 5, 75, 0, 0, 1520, 1521, 3, 32, 16, 0, 1521, 1522, 5, 31, 0, 0, 1522, 1529, 1, 0, 0, 0, 1523, 1524, 3, 138, 69, 0, 1524, 1525, 5, 30, 0, 0, 1525, 1526, 3, 32, 16, 0, 1526, 1527, 5, 31, 0, 0, 1527, 1529, 1, 0, 0, 0, 1528, 1494, 1, 0, 0, 0, 1528, 1495, 1, 0, 0, 0, 1528, 1496, 1, 0, 0, 0, 1528, 1501, 1, 0, 0, 0, 1528, 1502, 1, 0, 0, 0, 1528, 1509, 1, 0, 0, 0, 1528, 1516, 1, 0, 0, 0, 1528, 1523, 1, 0, 0, 0, 1529, 187, 1, 0, 0, 0, 1530, 1531, 7, 9, 0, 0, 1531, 189, 1, 0, 0, 0, 1532, 1533, 3, 192, 96, 0, 1533, 1534, 3, 160, 80, 0, 1534, 1535, 3, 146, 73, 0, 1535, 1536, 5, 175, 0, 0, 1536, 1538, 3, 264, 132, 0, 1537, 1539, 3, 130, 65, 0, 1538, 1537, 1, 0, 0, 0, 1538, 1539, 1, 0, 0, 0, 1539, 1540, 1, 0, 0, 0, 1540, 1541, 3, 134, 67, 0, 1541, 1567, 1, 0, 0, 0, 1542, 1543, 3, 192, 96, 0, 1543, 1544, 3, 160, 80, 0, 1544, 1545, 3, 146, 73, 0, 1545, 1546, 5, 175, 0, 0, 1546, 1547, 3, 264, 132, 0, 1547, 1548, 3, 218, 109, 0, 1548, 1549, 3, 134, 67, 0, 1549, 1567, 1, 0, 0, 0, 1550, 1551, 3, 192, 96, 0, 1551, 1552, 3, 160, 80, 0, 1552, 1554, 3, 264, 132, 0, 1553, 1555, 3, 130, 65, 0, 1554, 1553, 1, 0, 0, 0, 1554, 1555, 1, 0, 0, 0, 1555, 1556, 1, 0, 0, 0, 1556, 1557, 3, 134, 67, 0, 1557, 1567, 1, 0, 0, 0, 1558, 1559, 3, 192, 96, 0, 1559, 1560, 3, 160, 80, 0, 1560, 1561, 3, 264, 132, 0, 1561, 1562, 3, 218, 109, 0, 1562, 1563, 3, 134, 67, 0, 1563, 1567, 1, 0, 0, 0, 1564, 1567, 3, 196, 98, 0, 1565, 1567, 3, 2, 1, 0, 1566, 1532, 1, 0, 0, 0, 1566, 1542, 1, 0, 0, 0, 1566, 1550, 1, 0, 0, 0, 1566, 1558, 1, 0, 0, 0, 1566, 1564, 1, 0, 0, 0, 1566, 1565, 1, 0, 0, 0, 1567, 191, 1, 0, 0, 0, 1568, 1569, 5, 242, 0, 0, 1569, 1579, 3, 192, 96, 0, 1570, 1571, 5, 243, 0, 0, 1571, 1579, 3, 192, 96, 0, 1572, 1579, 3, 194, 97, 0, 1573, 1574, 5, 112, 0, 0, 1574, 1575, 5, 30, 0, 0, 1575, 1576, 3, 32, 16, 0, 1576, 1577, 5, 31, 0, 0, 1577, 1579, 1, 0, 0, 0, 1578, 1568, 1, 0, 0, 0, 1578, 1570, 1, 0, 0, 0, 1578, 1572, 1, 0, 0, 0, 1578, 1573, 1, 0, 0, 0, 1579, 193, 1, 0, 0, 0, 1580, 1593, 1, 0, 0, 0, 1581, 1593, 5, 244, 0, 0, 1582, 1593, 5, 245, 0, 0, 1583, 1584, 5, 246, 0, 0, 1584, 1593, 5, 247, 0, 0, 1585, 1586, 5, 246, 0, 0, 1586, 1593, 5, 248, 0, 0, 1587, 1588, 5, 246, 0, 0, 1588, 1593, 5, 249, 0, 0, 1589, 1590, 5, 246, 0, 0, 1590, 1593, 5, 250, 0, 0, 1591, 1593, 5, 246, 0, 0, 1592, 1580, 1, 0, 0, 0, 1592, 1581, 1, 0, 0, 0, 1592, 1582, 1, 0, 0, 0, 1592, 1583, 1, 0, 0, 0, 1592, 1585, 1, 0, 0, 0, 1592, 1587, 1, 0, 0, 0, 1592, 1589, 1, 0, 0, 0, 1592, 1591, 1, 0, 0, 0, 1593, 195, 1, 0, 0, 0, 1594, 1595, 5, 113, 0, 0, 1595, 1596, 5, 30, 0, 0, 1596, 1597, 3, 32, 16, 0, 1597, 1598, 5, 31, 0, 0, 1598, 197, 1, 0, 0, 0, 1599, 1600, 5, 225, 0, 0, 1600, 1605, 3, 190, 95, 0, 1601, 1602, 5, 37, 0, 0, 1602, 1605, 3, 200, 100, 0, 1603, 1605, 3, 196, 98, 0, 1604, 1599, 1, 0, 0, 0, 1604, 1601, 1, 0, 0, 0, 1604, 1603, 1, 0, 0, 0, 1605, 199, 1, 0, 0, 0, 1606, 1607, 3, 160, 80, 0, 1607, 1608, 3, 146, 73, 0, 1608, 1609, 5, 175, 0, 0, 1609, 1610, 3, 2, 1, 0, 1610, 1616, 1, 0, 0, 0, 1611, 1612, 3, 160, 80, 0, 1612, 1613, 3, 2, 1, 0, 1613, 1616, 1, 0, 0, 0, 1614, 1616, 3, 2, 1, 0, 1615, 1606, 1, 0, 0, 0, 1615, 1611, 1, 0, 0, 0, 1615, 1614, 1, 0, 0, 0, 1616, 201, 1, 0, 0, 0, 1617, 1618, 3, 146, 73, 0, 1618, 1619, 5, 28, 0, 0, 1619, 1621, 1, 0, 0, 0, 1620, 1617, 1, 0, 0, 0, 1621, 1624, 1, 0, 0, 0, 1622, 1620, 1, 0, 0, 0, 1622, 1623, 1, 0, 0, 0, 1623, 1625, 1, 0, 0, 0, 1624, 1622, 1, 0, 0, 0, 1625, 1626, 3, 146, 73, 0, 1626, 203, 1, 0, 0, 0, 1627, 1633, 1, 0, 0, 0, 1628, 1629, 5, 86, 0, 0, 1629, 1630, 3, 212, 106, 0, 1630, 1631, 5, 87, 0, 0, 1631, 1633, 1, 0, 0, 0, 1632, 1627, 1, 0, 0, 0, 1632, 1628, 1, 0, 0, 0, 1633, 205, 1, 0, 0, 0, 1634, 1646, 5, 265, 0, 0, 1635, 1646, 5, 114, 0, 0, 1636, 1646, 5, 39, 0, 0, 1637, 1646, 5, 199, 0, 0, 1638, 1646, 5, 115, 0, 0, 1639, 1646, 5, 116, 0, 0, 1640, 1641, 5, 70, 0, 0, 1641, 1642, 5, 30, 0, 0, 1642, 1643, 3, 32, 16, 0, 1643, 1644, 5, 31, 0, 0, 1644, 1646, 1, 0, 0, 0, 1645, 1634, 1, 0, 0, 0, 1645, 1635, 1, 0, 0, 0, 1645, 1636, 1, 0, 0, 0, 1645, 1637, 1, 0, 0, 0, 1645, 1638, 1, 0, 0, 0, 1645, 1639, 1, 0, 0, 0, 1645, 1640, 1, 0, 0, 0, 1646, 207, 1, 0, 0, 0, 1647, 1649, 3, 206, 103, 0, 1648, 1647, 1, 0, 0, 0, 1649, 1652, 1, 0, 0, 0, 1650, 1648, 1, 0, 0, 0, 1650, 1651, 1, 0, 0, 0, 1651, 209, 1, 0, 0, 0, 1652, 1650, 1, 0, 0, 0, 1653, 1655, 3, 208, 104, 0, 1654, 1656, 3, 214, 107, 0, 1655, 1654, 1, 0, 0, 0, 1655, 1656, 1, 0, 0, 0, 1656, 1657, 1, 0, 0, 0, 1657, 1658, 3, 2, 1, 0, 1658, 211, 1, 0, 0, 0, 1659, 1660, 3, 210, 105, 0, 1660, 1661, 5, 28, 0, 0, 1661, 1663, 1, 0, 0, 0, 1662, 1659, 1, 0, 0, 0, 1663, 1666, 1, 0, 0, 0, 1664, 1662, 1, 0, 0, 0, 1664, 1665, 1, 0, 0, 0, 1665, 1667, 1, 0, 0, 0, 1666, 1664, 1, 0, 0, 0, 1667, 1668, 3, 210, 105, 0, 1668, 213, 1, 0, 0, 0, 1669, 1670, 5, 30, 0, 0, 1670, 1671, 3, 202, 101, 0, 1671, 1672, 5, 31, 0, 0, 1672, 215, 1, 0, 0, 0, 1673, 1676, 1, 0, 0, 0, 1674, 1676, 3, 218, 109, 0, 1675, 1673, 1, 0, 0, 0, 1675, 1674, 1, 0, 0, 0, 1676, 217, 1, 0, 0, 0, 1677, 1678, 5, 86, 0, 0, 1678, 1679, 5, 42, 0, 0, 1679, 1680, 3, 32, 16, 0, 1680, 1681, 5, 43, 0, 0, 1681, 1682, 5, 87, 0, 0, 1682, 219, 1, 0, 0, 0, 1683, 1684, 3, 256, 128, 0, 1684, 1685, 5, 17, 0, 0, 1685, 1686, 3, 268, 134, 0, 1686, 1687, 5, 18, 0, 0, 1687, 1800, 1, 0, 0, 0, 1688, 1689, 3, 74, 37, 0, 1689, 1690, 5, 17, 0, 0, 1690, 1691, 3, 82, 41, 0, 1691, 1692, 5, 18, 0, 0, 1692, 1800, 1, 0, 0, 0, 1693, 1694, 3, 232, 116, 0, 1694, 1695, 5, 17, 0, 0, 1695, 1696, 3, 236, 118, 0, 1696, 1697, 5, 18, 0, 0, 1697, 1800, 1, 0, 0, 0, 1698, 1699, 3, 240, 120, 0, 1699, 1700, 5, 17, 0, 0, 1700, 1701, 3, 244, 122, 0, 1701, 1702, 5, 18, 0, 0, 1702, 1800, 1, 0, 0, 0, 1703, 1800, 3, 222, 111, 0, 1704, 1800, 3, 296, 148, 0, 1705, 1800, 3, 174, 87, 0, 1706, 1800, 3, 88, 44, 0, 1707, 1800, 3, 342, 171, 0, 1708, 1709, 5, 117, 0, 0, 1709, 1800, 3, 32, 16, 0, 1710, 1711, 5, 118, 0, 0, 1711, 1800, 3, 32, 16, 0, 1712, 1713, 3, 354, 177, 0, 1713, 1714, 5, 17, 0, 0, 1714, 1715, 3, 358, 179, 0, 1715, 1716, 5, 18, 0, 0, 1716, 1800, 1, 0, 0, 0, 1717, 1718, 5, 301, 0, 0, 1718, 1719, 3, 146, 73, 0, 1719, 1720, 5, 175, 0, 0, 1720, 1721, 3, 264, 132, 0, 1721, 1722, 5, 119, 0, 0, 1722, 1723, 3, 192, 96, 0, 1723, 1724, 3, 160, 80, 0, 1724, 1725, 3, 146, 73, 0, 1725, 1726, 5, 175, 0, 0, 1726, 1727, 3, 264, 132, 0, 1727, 1728, 3, 134, 67, 0, 1728, 1800, 1, 0, 0, 0, 1729, 1730, 5, 301, 0, 0, 1730, 1731, 5, 225, 0, 0, 1731, 1732, 3, 192, 96, 0, 1732, 1733, 3, 160, 80, 0, 1733, 1734, 3, 146, 73, 0, 1734, 1735, 5, 175, 0, 0, 1735, 1736, 3, 264, 132, 0, 1736, 1737, 3, 216, 108, 0, 1737, 1738, 3, 134, 67, 0, 1738, 1739, 5, 119, 0, 0, 1739, 1740, 5, 225, 0, 0, 1740, 1741, 3, 192, 96, 0, 1741, 1742, 3, 160, 80, 0, 1742, 1743, 3, 146, 73, 0, 1743, 1744, 5, 175, 0, 0, 1744, 1745, 3, 264, 132, 0, 1745, 1746, 3, 216, 108, 0, 1746, 1747, 3, 134, 67, 0, 1747, 1800, 1, 0, 0, 0, 1748, 1800, 3, 26, 13, 0, 1749, 1800, 3, 40, 20, 0, 1750, 1751, 5, 254, 0, 0, 1751, 1752, 5, 195, 0, 0, 1752, 1753, 5, 42, 0, 0, 1753, 1754, 3, 32, 16, 0, 1754, 1758, 5, 43, 0, 0, 1755, 1757, 3, 342, 171, 0, 1756, 1755, 1, 0, 0, 0, 1757, 1760, 1, 0, 0, 0, 1758, 1756, 1, 0, 0, 0, 1758, 1759, 1, 0, 0, 0, 1759, 1800, 1, 0, 0, 0, 1760, 1758, 1, 0, 0, 0, 1761, 1762, 5, 254, 0, 0, 1762, 1763, 5, 195, 0, 0, 1763, 1767, 3, 2, 1, 0, 1764, 1766, 3, 342, 171, 0, 1765, 1764, 1, 0, 0, 0, 1766, 1769, 1, 0, 0, 0, 1767, 1765, 1, 0, 0, 0, 1767, 1768, 1, 0, 0, 0, 1768, 1800, 1, 0, 0, 0, 1769, 1767, 1, 0, 0, 0, 1770, 1771, 5, 254, 0, 0, 1771, 1772, 5, 255, 0, 0, 1772, 1773, 5, 42, 0, 0, 1773, 1774, 3, 32, 16, 0, 1774, 1775, 5, 43, 0, 0, 1775, 1776, 5, 28, 0, 0, 1776, 1780, 3, 146, 73, 0, 1777, 1779, 3, 342, 171, 0, 1778, 1777, 1, 0, 0, 0, 1779, 1782, 1, 0, 0, 0, 1780, 1778, 1, 0, 0, 0, 1780, 1781, 1, 0, 0, 0, 1781, 1800, 1, 0, 0, 0, 1782, 1780, 1, 0, 0, 0, 1783, 1784, 5, 254, 0, 0, 1784, 1785, 5, 255, 0, 0, 1785, 1786, 3, 2, 1, 0, 1786, 1787, 5, 28, 0, 0, 1787, 1791, 3, 146, 73, 0, 1788, 1790, 3, 342, 171, 0, 1789, 1788, 1, 0, 0, 0, 1790, 1793, 1, 0, 0, 0, 1791, 1789, 1, 0, 0, 0, 1791, 1792, 1, 0, 0, 0, 1792, 1800, 1, 0, 0, 0, 1793, 1791, 1, 0, 0, 0, 1794, 1795, 5, 120, 0, 0, 1795, 1796, 5, 195, 0, 0, 1796, 1797, 3, 146, 73, 0, 1797, 1798, 3, 44, 22, 0, 1798, 1800, 1, 0, 0, 0, 1799, 1683, 1, 0, 0, 0, 1799, 1688, 1, 0, 0, 0, 1799, 1693, 1, 0, 0, 0, 1799, 1698, 1, 0, 0, 0, 1799, 1703, 1, 0, 0, 0, 1799, 1704, 1, 0, 0, 0, 1799, 1705, 1, 0, 0, 0, 1799, 1706, 1, 0, 0, 0, 1799, 1707, 1, 0, 0, 0, 1799, 1708, 1, 0, 0, 0, 1799, 1710, 1, 0, 0, 0, 1799, 1712, 1, 0, 0, 0, 1799, 1717, 1, 0, 0, 0, 1799, 1729, 1, 0, 0, 0, 1799, 1748, 1, 0, 0, 0, 1799, 1749, 1, 0, 0, 0, 1799, 1750, 1, 0, 0, 0, 1799, 1761, 1, 0, 0, 0, 1799, 1770, 1, 0, 0, 0, 1799, 1783, 1, 0, 0, 0, 1799, 1794, 1, 0, 0, 0, 1800, 221, 1, 0, 0, 0, 1801, 1802, 5, 121, 0, 0, 1802, 1811, 3, 230, 115, 0, 1803, 1810, 3, 224, 112, 0, 1804, 1805, 5, 122, 0, 0, 1805, 1806, 5, 30, 0, 0, 1806, 1807, 3, 250, 125, 0, 1807, 1808, 5, 31, 0, 0, 1808, 1810, 1, 0, 0, 0, 1809, 1803, 1, 0, 0, 0, 1809, 1804, 1, 0, 0, 0, 1810, 1813, 1, 0, 0, 0, 1811, 1809, 1, 0, 0, 0, 1811, 1812, 1, 0, 0, 0, 1812, 1814, 1, 0, 0, 0, 1813, 1811, 1, 0, 0, 0, 1814, 1815, 3, 160, 80, 0, 1815, 1816, 3, 2, 1, 0, 1816, 1817, 3, 226, 113, 0, 1817, 1818, 3, 228, 114, 0, 1818, 223, 1, 0, 0, 0, 1819, 1839, 5, 123, 0, 0, 1820, 1839, 5, 51, 0, 0, 1821, 1839, 5, 52, 0, 0, 1822, 1839, 5, 63, 0, 0, 1823, 1839, 5, 124, 0, 0, 1824, 1839, 5, 69, 0, 0, 1825, 1839, 5, 68, 0, 0, 1826, 1839, 5, 64, 0, 0, 1827, 1839, 5, 65, 0, 0, 1828, 1839, 5, 66, 0, 0, 1829, 1839, 5, 125, 0, 0, 1830, 1839, 5, 126, 0, 0, 1831, 1839, 5, 127, 0, 0, 1832, 1839, 5, 16, 0, 0, 1833, 1834, 5, 70, 0, 0, 1834, 1835, 5, 30, 0, 0, 1835, 1836, 3, 32, 16, 0, 1836, 1837, 5, 31, 0, 0, 1837, 1839, 1, 0, 0, 0, 1838, 1819, 1, 0, 0, 0, 1838, 1820, 1, 0, 0, 0, 1838, 1821, 1, 0, 0, 0, 1838, 1822, 1, 0, 0, 0, 1838, 1823, 1, 0, 0, 0, 1838, 1824, 1, 0, 0, 0, 1838, 1825, 1, 0, 0, 0, 1838, 1826, 1, 0, 0, 0, 1838, 1827, 1, 0, 0, 0, 1838, 1828, 1, 0, 0, 0, 1838, 1829, 1, 0, 0, 0, 1838, 1830, 1, 0, 0, 0, 1838, 1831, 1, 0, 0, 0, 1838, 1832, 1, 0, 0, 0, 1838, 1833, 1, 0, 0, 0, 1839, 225, 1, 0, 0, 0, 1840, 1846, 1, 0, 0, 0, 1841, 1842, 5, 44, 0, 0, 1842, 1846, 3, 0, 0, 0, 1843, 1844, 5, 44, 0, 0, 1844, 1846, 3, 32, 16, 0, 1845, 1840, 1, 0, 0, 0, 1845, 1841, 1, 0, 0, 0, 1845, 1843, 1, 0, 0, 0, 1846, 227, 1, 0, 0, 0, 1847, 1851, 1, 0, 0, 0, 1848, 1849, 5, 36, 0, 0, 1849, 1851, 3, 316, 158, 0, 1850, 1847, 1, 0, 0, 0, 1850, 1848, 1, 0, 0, 0, 1851, 229, 1, 0, 0, 0, 1852, 1858, 1, 0, 0, 0, 1853, 1854, 5, 42, 0, 0, 1854, 1855, 3, 32, 16, 0, 1855, 1856, 5, 43, 0, 0, 1856, 1858, 1, 0, 0, 0, 1857, 1852, 1, 0, 0, 0, 1857, 1853, 1, 0, 0, 0, 1858, 231, 1, 0, 0, 0, 1859, 1863, 5, 128, 0, 0, 1860, 1862, 3, 234, 117, 0, 1861, 1860, 1, 0, 0, 0, 1862, 1865, 1, 0, 0, 0, 1863, 1861, 1, 0, 0, 0, 1863, 1864, 1, 0, 0, 0, 1864, 1866, 1, 0, 0, 0, 1865, 1863, 1, 0, 0, 0, 1866, 1867, 3, 146, 73, 0, 1867, 1868, 3, 2, 1, 0, 1868, 1878, 1, 0, 0, 0, 1869, 1873, 5, 128, 0, 0, 1870, 1872, 3, 234, 117, 0, 1871, 1870, 1, 0, 0, 0, 1872, 1875, 1, 0, 0, 0, 1873, 1871, 1, 0, 0, 0, 1873, 1874, 1, 0, 0, 0, 1874, 1876, 1, 0, 0, 0, 1875, 1873, 1, 0, 0, 0, 1876, 1878, 3, 2, 1, 0, 1877, 1859, 1, 0, 0, 0, 1877, 1869, 1, 0, 0, 0, 1878, 233, 1, 0, 0, 0, 1879, 1880, 7, 10, 0, 0, 1880, 235, 1, 0, 0, 0, 1881, 1883, 3, 238, 119, 0, 1882, 1881, 1, 0, 0, 0, 1883, 1886, 1, 0, 0, 0, 1884, 1882, 1, 0, 0, 0, 1884, 1885, 1, 0, 0, 0, 1885, 237, 1, 0, 0, 0, 1886, 1884, 1, 0, 0, 0, 1887, 1888, 5, 129, 0, 0, 1888, 1900, 3, 190, 95, 0, 1889, 1890, 5, 130, 0, 0, 1890, 1900, 3, 190, 95, 0, 1891, 1892, 5, 131, 0, 0, 1892, 1900, 3, 190, 95, 0, 1893, 1894, 5, 132, 0, 0, 1894, 1900, 3, 190, 95, 0, 1895, 1900, 3, 88, 44, 0, 1896, 1900, 3, 342, 171, 0, 1897, 1900, 3, 26, 13, 0, 1898, 1900, 3, 40, 20, 0, 1899, 1887, 1, 0, 0, 0, 1899, 1889, 1, 0, 0, 0, 1899, 1891, 1, 0, 0, 0, 1899, 1893, 1, 0, 0, 0, 1899, 1895, 1, 0, 0, 0, 1899, 1896, 1, 0, 0, 0, 1899, 1897, 1, 0, 0, 0, 1899, 1898, 1, 0, 0, 0, 1900, 239, 1, 0, 0, 0, 1901, 1905, 5, 133, 0, 0, 1902, 1904, 3, 242, 121, 0, 1903, 1902, 1, 0, 0, 0, 1904, 1907, 1, 0, 0, 0, 1905, 1903, 1, 0, 0, 0, 1905, 1906, 1, 0, 0, 0, 1906, 1908, 1, 0, 0, 0, 1907, 1905, 1, 0, 0, 0, 1908, 1909, 3, 192, 96, 0, 1909, 1910, 3, 160, 80, 0, 1910, 1911, 3, 2, 1, 0, 1911, 1912, 3, 134, 67, 0, 1912, 1913, 3, 228, 114, 0, 1913, 241, 1, 0, 0, 0, 1914, 1915, 7, 10, 0, 0, 1915, 243, 1, 0, 0, 0, 1916, 1918, 3, 246, 123, 0, 1917, 1916, 1, 0, 0, 0, 1918, 1921, 1, 0, 0, 0, 1919, 1917, 1, 0, 0, 0, 1919, 1920, 1, 0, 0, 0, 1920, 245, 1, 0, 0, 0, 1921, 1919, 1, 0, 0, 0, 1922, 1923, 5, 134, 0, 0, 1923, 1933, 3, 190, 95, 0, 1924, 1925, 5, 135, 0, 0, 1925, 1933, 3, 190, 95, 0, 1926, 1927, 5, 132, 0, 0, 1927, 1933, 3, 190, 95, 0, 1928, 1933, 3, 342, 171, 0, 1929, 1933, 3, 88, 44, 0, 1930, 1933, 3, 26, 13, 0, 1931, 1933, 3, 40, 20, 0, 1932, 1922, 1, 0, 0, 0, 1932, 1924, 1, 0, 0, 0, 1932, 1926, 1, 0, 0, 0, 1932, 1928, 1, 0, 0, 0, 1932, 1929, 1, 0, 0, 0, 1932, 1930, 1, 0, 0, 0, 1932, 1931, 1, 0, 0, 0, 1933, 247, 1, 0, 0, 0, 1934, 1941, 1, 0, 0, 0, 1935, 1936, 5, 122, 0, 0, 1936, 1937, 5, 30, 0, 0, 1937, 1938, 3, 250, 125, 0, 1938, 1939, 5, 31, 0, 0, 1939, 1941, 1, 0, 0, 0, 1940, 1934, 1, 0, 0, 0, 1940, 1935, 1, 0, 0, 0, 1941, 249, 1, 0, 0, 0, 1942, 1952, 3, 148, 74, 0, 1943, 1945, 5, 17, 0, 0, 1944, 1946, 3, 314, 157, 0, 1945, 1944, 1, 0, 0, 0, 1946, 1947, 1, 0, 0, 0, 1947, 1945, 1, 0, 0, 0, 1947, 1948, 1, 0, 0, 0, 1948, 1949, 1, 0, 0, 0, 1949, 1950, 5, 18, 0, 0, 1950, 1952, 1, 0, 0, 0, 1951, 1942, 1, 0, 0, 0, 1951, 1943, 1, 0, 0, 0, 1952, 251, 1, 0, 0, 0, 1953, 1955, 3, 254, 127, 0, 1954, 1953, 1, 0, 0, 0, 1955, 1958, 1, 0, 0, 0, 1956, 1954, 1, 0, 0, 0, 1956, 1957, 1, 0, 0, 0, 1957, 253, 1, 0, 0, 0, 1958, 1956, 1, 0, 0, 0, 1959, 1960, 5, 42, 0, 0, 1960, 1961, 5, 136, 0, 0, 1961, 1973, 5, 43, 0, 0, 1962, 1963, 5, 42, 0, 0, 1963, 1964, 5, 137, 0, 0, 1964, 1973, 5, 43, 0, 0, 1965, 1966, 5, 42, 0, 0, 1966, 1967, 5, 138, 0, 0, 1967, 1973, 5, 43, 0, 0, 1968, 1969, 5, 42, 0, 0, 1969, 1970, 3, 32, 16, 0, 1970, 1971, 5, 43, 0, 0, 1971, 1973, 1, 0, 0, 0, 1972, 1959, 1, 0, 0, 0, 1972, 1962, 1, 0, 0, 0, 1972, 1965, 1, 0, 0, 0, 1972, 1968, 1, 0, 0, 0, 1973, 255, 1, 0, 0, 0, 1974, 1979, 5, 139, 0, 0, 1975, 1978, 3, 258, 129, 0, 1976, 1978, 3, 260, 130, 0, 1977, 1975, 1, 0, 0, 0, 1977, 1976, 1, 0, 0, 0, 1978, 1981, 1, 0, 0, 0, 1979, 1977, 1, 0, 0, 0, 1979, 1980, 1, 0, 0, 0, 1980, 1982, 1, 0, 0, 0, 1981, 1979, 1, 0, 0, 0, 1982, 1983, 3, 192, 96, 0, 1983, 1984, 3, 252, 126, 0, 1984, 1985, 3, 160, 80, 0, 1985, 1986, 3, 248, 124, 0, 1986, 1987, 3, 264, 132, 0, 1987, 1988, 3, 204, 102, 0, 1988, 1992, 3, 134, 67, 0, 1989, 1991, 3, 266, 133, 0, 1990, 1989, 1, 0, 0, 0, 1991, 1994, 1, 0, 0, 0, 1992, 1990, 1, 0, 0, 0, 1992, 1993, 1, 0, 0, 0, 1993, 257, 1, 0, 0, 0, 1994, 1992, 1, 0, 0, 0, 1995, 2019, 5, 123, 0, 0, 1996, 2019, 5, 51, 0, 0, 1997, 2019, 5, 52, 0, 0, 1998, 2019, 5, 63, 0, 0, 1999, 2019, 5, 140, 0, 0, 2000, 2019, 5, 68, 0, 0, 2001, 2019, 5, 141, 0, 0, 2002, 2019, 5, 142, 0, 0, 2003, 2019, 5, 54, 0, 0, 2004, 2019, 5, 64, 0, 0, 2005, 2019, 5, 65, 0, 0, 2006, 2019, 5, 66, 0, 0, 2007, 2019, 5, 125, 0, 0, 2008, 2019, 5, 143, 0, 0, 2009, 2019, 5, 144, 0, 0, 2010, 2019, 5, 69, 0, 0, 2011, 2019, 5, 145, 0, 0, 2012, 2019, 5, 146, 0, 0, 2013, 2014, 5, 70, 0, 0, 2014, 2015, 5, 30, 0, 0, 2015, 2016, 3, 32, 16, 0, 2016, 2017, 5, 31, 0, 0, 2017, 2019, 1, 0, 0, 0, 2018, 1995, 1, 0, 0, 0, 2018, 1996, 1, 0, 0, 0, 2018, 1997, 1, 0, 0, 0, 2018, 1998, 1, 0, 0, 0, 2018, 1999, 1, 0, 0, 0, 2018, 2000, 1, 0, 0, 0, 2018, 2001, 1, 0, 0, 0, 2018, 2002, 1, 0, 0, 0, 2018, 2003, 1, 0, 0, 0, 2018, 2004, 1, 0, 0, 0, 2018, 2005, 1, 0, 0, 0, 2018, 2006, 1, 0, 0, 0, 2018, 2007, 1, 0, 0, 0, 2018, 2008, 1, 0, 0, 0, 2018, 2009, 1, 0, 0, 0, 2018, 2010, 1, 0, 0, 0, 2018, 2011, 1, 0, 0, 0, 2018, 2012, 1, 0, 0, 0, 2018, 2013, 1, 0, 0, 0, 2019, 259, 1, 0, 0, 0, 2020, 2021, 5, 147, 0, 0, 2021, 2027, 5, 30, 0, 0, 2022, 2025, 3, 6, 3, 0, 2023, 2024, 5, 34, 0, 0, 2024, 2026, 3, 6, 3, 0, 2025, 2023, 1, 0, 0, 0, 2025, 2026, 1, 0, 0, 0, 2026, 2028, 1, 0, 0, 0, 2027, 2022, 1, 0, 0, 0, 2027, 2028, 1, 0, 0, 0, 2028, 2032, 1, 0, 0, 0, 2029, 2031, 3, 262, 131, 0, 2030, 2029, 1, 0, 0, 0, 2031, 2034, 1, 0, 0, 0, 2032, 2030, 1, 0, 0, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2035, 1, 0, 0, 0, 2034, 2032, 1, 0, 0, 0, 2035, 2039, 5, 31, 0, 0, 2036, 2037, 5, 147, 0, 0, 2037, 2039, 5, 85, 0, 0, 2038, 2020, 1, 0, 0, 0, 2038, 2036, 1, 0, 0, 0, 2039, 261, 1, 0, 0, 0, 2040, 2068, 5, 148, 0, 0, 2041, 2068, 5, 223, 0, 0, 2042, 2068, 5, 57, 0, 0, 2043, 2068, 5, 58, 0, 0, 2044, 2068, 5, 149, 0, 0, 2045, 2068, 5, 150, 0, 0, 2046, 2068, 5, 247, 0, 0, 2047, 2068, 5, 248, 0, 0, 2048, 2068, 5, 249, 0, 0, 2049, 2068, 5, 250, 0, 0, 2050, 2051, 5, 151, 0, 0, 2051, 2052, 5, 75, 0, 0, 2052, 2068, 5, 152, 0, 0, 2053, 2054, 5, 151, 0, 0, 2054, 2055, 5, 75, 0, 0, 2055, 2068, 5, 153, 0, 0, 2056, 2057, 5, 154, 0, 0, 2057, 2058, 5, 75, 0, 0, 2058, 2068, 5, 152, 0, 0, 2059, 2060, 5, 154, 0, 0, 2060, 2061, 5, 75, 0, 0, 2061, 2068, 5, 153, 0, 0, 2062, 2063, 5, 70, 0, 0, 2063, 2064, 5, 30, 0, 0, 2064, 2065, 3, 32, 16, 0, 2065, 2066, 5, 31, 0, 0, 2066, 2068, 1, 0, 0, 0, 2067, 2040, 1, 0, 0, 0, 2067, 2041, 1, 0, 0, 0, 2067, 2042, 1, 0, 0, 0, 2067, 2043, 1, 0, 0, 0, 2067, 2044, 1, 0, 0, 0, 2067, 2045, 1, 0, 0, 0, 2067, 2046, 1, 0, 0, 0, 2067, 2047, 1, 0, 0, 0, 2067, 2048, 1, 0, 0, 0, 2067, 2049, 1, 0, 0, 0, 2067, 2050, 1, 0, 0, 0, 2067, 2053, 1, 0, 0, 0, 2067, 2056, 1, 0, 0, 0, 2067, 2059, 1, 0, 0, 0, 2067, 2062, 1, 0, 0, 0, 2068, 263, 1, 0, 0, 0, 2069, 2073, 5, 116, 0, 0, 2070, 2073, 5, 155, 0, 0, 2071, 2073, 3, 2, 1, 0, 2072, 2069, 1, 0, 0, 0, 2072, 2070, 1, 0, 0, 0, 2072, 2071, 1, 0, 0, 0, 2073, 265, 1, 0, 0, 0, 2074, 2096, 5, 1, 0, 0, 2075, 2096, 5, 2, 0, 0, 2076, 2096, 5, 156, 0, 0, 2077, 2096, 5, 3, 0, 0, 2078, 2096, 5, 4, 0, 0, 2079, 2096, 5, 246, 0, 0, 2080, 2096, 5, 5, 0, 0, 2081, 2096, 5, 6, 0, 0, 2082, 2096, 5, 7, 0, 0, 2083, 2096, 5, 8, 0, 0, 2084, 2096, 5, 9, 0, 0, 2085, 2096, 5, 10, 0, 0, 2086, 2096, 5, 11, 0, 0, 2087, 2096, 5, 12, 0, 0, 2088, 2096, 5, 13, 0, 0, 2089, 2096, 5, 14, 0, 0, 2090, 2091, 5, 70, 0, 0, 2091, 2092, 5, 30, 0, 0, 2092, 2093, 3, 32, 16, 0, 2093, 2094, 5, 31, 0, 0, 2094, 2096, 1, 0, 0, 0, 2095, 2074, 1, 0, 0, 0, 2095, 2075, 1, 0, 0, 0, 2095, 2076, 1, 0, 0, 0, 2095, 2077, 1, 0, 0, 0, 2095, 2078, 1, 0, 0, 0, 2095, 2079, 1, 0, 0, 0, 2095, 2080, 1, 0, 0, 0, 2095, 2081, 1, 0, 0, 0, 2095, 2082, 1, 0, 0, 0, 2095, 2083, 1, 0, 0, 0, 2095, 2084, 1, 0, 0, 0, 2095, 2085, 1, 0, 0, 0, 2095, 2086, 1, 0, 0, 0, 2095, 2087, 1, 0, 0, 0, 2095, 2088, 1, 0, 0, 0, 2095, 2089, 1, 0, 0, 0, 2095, 2090, 1, 0, 0, 0, 2096, 267, 1, 0, 0, 0, 2097, 2099, 3, 270, 135, 0, 2098, 2097, 1, 0, 0, 0, 2099, 2102, 1, 0, 0, 0, 2100, 2098, 1, 0, 0, 0, 2100, 2101, 1, 0, 0, 0, 2101, 269, 1, 0, 0, 0, 2102, 2100, 1, 0, 0, 0, 2103, 2212, 3, 126, 63, 0, 2104, 2105, 5, 295, 0, 0, 2105, 2212, 3, 32, 16, 0, 2106, 2212, 3, 278, 139, 0, 2107, 2108, 5, 296, 0, 0, 2108, 2212, 3, 32, 16, 0, 2109, 2110, 5, 299, 0, 0, 2110, 2212, 3, 134, 67, 0, 2111, 2112, 5, 299, 0, 0, 2112, 2113, 5, 157, 0, 0, 2113, 2212, 3, 134, 67, 0, 2114, 2212, 5, 297, 0, 0, 2115, 2212, 5, 298, 0, 0, 2116, 2212, 3, 296, 148, 0, 2117, 2212, 3, 272, 136, 0, 2118, 2212, 3, 174, 87, 0, 2119, 2212, 3, 88, 44, 0, 2120, 2212, 3, 26, 13, 0, 2121, 2212, 3, 274, 137, 0, 2122, 2212, 3, 40, 20, 0, 2123, 2124, 5, 300, 0, 0, 2124, 2125, 5, 42, 0, 0, 2125, 2126, 3, 32, 16, 0, 2126, 2127, 5, 43, 0, 0, 2127, 2212, 1, 0, 0, 0, 2128, 2129, 5, 300, 0, 0, 2129, 2130, 5, 42, 0, 0, 2130, 2131, 3, 32, 16, 0, 2131, 2132, 5, 43, 0, 0, 2132, 2133, 5, 34, 0, 0, 2133, 2134, 3, 0, 0, 0, 2134, 2212, 1, 0, 0, 0, 2135, 2136, 5, 302, 0, 0, 2136, 2137, 3, 32, 16, 0, 2137, 2138, 5, 75, 0, 0, 2138, 2139, 3, 32, 16, 0, 2139, 2212, 1, 0, 0, 0, 2140, 2141, 5, 301, 0, 0, 2141, 2142, 3, 146, 73, 0, 2142, 2143, 5, 175, 0, 0, 2143, 2144, 3, 264, 132, 0, 2144, 2212, 1, 0, 0, 0, 2145, 2146, 5, 301, 0, 0, 2146, 2147, 5, 225, 0, 0, 2147, 2148, 3, 192, 96, 0, 2148, 2149, 3, 160, 80, 0, 2149, 2150, 3, 146, 73, 0, 2150, 2151, 5, 175, 0, 0, 2151, 2152, 3, 264, 132, 0, 2152, 2153, 3, 216, 108, 0, 2153, 2154, 3, 134, 67, 0, 2154, 2212, 1, 0, 0, 0, 2155, 2212, 3, 276, 138, 0, 2156, 2157, 5, 254, 0, 0, 2157, 2158, 5, 195, 0, 0, 2158, 2159, 5, 42, 0, 0, 2159, 2160, 3, 32, 16, 0, 2160, 2164, 5, 43, 0, 0, 2161, 2163, 3, 342, 171, 0, 2162, 2161, 1, 0, 0, 0, 2163, 2166, 1, 0, 0, 0, 2164, 2162, 1, 0, 0, 0, 2164, 2165, 1, 0, 0, 0, 2165, 2212, 1, 0, 0, 0, 2166, 2164, 1, 0, 0, 0, 2167, 2168, 5, 254, 0, 0, 2168, 2169, 5, 195, 0, 0, 2169, 2173, 3, 2, 1, 0, 2170, 2172, 3, 342, 171, 0, 2171, 2170, 1, 0, 0, 0, 2172, 2175, 1, 0, 0, 0, 2173, 2171, 1, 0, 0, 0, 2173, 2174, 1, 0, 0, 0, 2174, 2212, 1, 0, 0, 0, 2175, 2173, 1, 0, 0, 0, 2176, 2177, 5, 254, 0, 0, 2177, 2178, 5, 255, 0, 0, 2178, 2179, 5, 42, 0, 0, 2179, 2180, 3, 32, 16, 0, 2180, 2181, 5, 43, 0, 0, 2181, 2182, 5, 28, 0, 0, 2182, 2186, 3, 146, 73, 0, 2183, 2185, 3, 342, 171, 0, 2184, 2183, 1, 0, 0, 0, 2185, 2188, 1, 0, 0, 0, 2186, 2184, 1, 0, 0, 0, 2186, 2187, 1, 0, 0, 0, 2187, 2212, 1, 0, 0, 0, 2188, 2186, 1, 0, 0, 0, 2189, 2190, 5, 254, 0, 0, 2190, 2191, 5, 255, 0, 0, 2191, 2192, 3, 2, 1, 0, 2192, 2193, 5, 28, 0, 0, 2193, 2197, 3, 146, 73, 0, 2194, 2196, 3, 342, 171, 0, 2195, 2194, 1, 0, 0, 0, 2196, 2199, 1, 0, 0, 0, 2197, 2195, 1, 0, 0, 0, 2197, 2198, 1, 0, 0, 0, 2198, 2212, 1, 0, 0, 0, 2199, 2197, 1, 0, 0, 0, 2200, 2201, 5, 254, 0, 0, 2201, 2202, 5, 42, 0, 0, 2202, 2203, 3, 32, 16, 0, 2203, 2204, 5, 43, 0, 0, 2204, 2208, 3, 228, 114, 0, 2205, 2207, 3, 342, 171, 0, 2206, 2205, 1, 0, 0, 0, 2207, 2210, 1, 0, 0, 0, 2208, 2206, 1, 0, 0, 0, 2208, 2209, 1, 0, 0, 0, 2209, 2212, 1, 0, 0, 0, 2210, 2208, 1, 0, 0, 0, 2211, 2103, 1, 0, 0, 0, 2211, 2104, 1, 0, 0, 0, 2211, 2106, 1, 0, 0, 0, 2211, 2107, 1, 0, 0, 0, 2211, 2109, 1, 0, 0, 0, 2211, 2111, 1, 0, 0, 0, 2211, 2114, 1, 0, 0, 0, 2211, 2115, 1, 0, 0, 0, 2211, 2116, 1, 0, 0, 0, 2211, 2117, 1, 0, 0, 0, 2211, 2118, 1, 0, 0, 0, 2211, 2119, 1, 0, 0, 0, 2211, 2120, 1, 0, 0, 0, 2211, 2121, 1, 0, 0, 0, 2211, 2122, 1, 0, 0, 0, 2211, 2123, 1, 0, 0, 0, 2211, 2128, 1, 0, 0, 0, 2211, 2135, 1, 0, 0, 0, 2211, 2140, 1, 0, 0, 0, 2211, 2145, 1, 0, 0, 0, 2211, 2155, 1, 0, 0, 0, 2211, 2156, 1, 0, 0, 0, 2211, 2167, 1, 0, 0, 0, 2211, 2176, 1, 0, 0, 0, 2211, 2189, 1, 0, 0, 0, 2211, 2200, 1, 0, 0, 0, 2212, 271, 1, 0, 0, 0, 2213, 2214, 3, 0, 0, 0, 2214, 2215, 5, 75, 0, 0, 2215, 273, 1, 0, 0, 0, 2216, 2219, 3, 44, 22, 0, 2217, 2219, 3, 46, 23, 0, 2218, 2216, 1, 0, 0, 0, 2218, 2217, 1, 0, 0, 0, 2219, 275, 1, 0, 0, 0, 2220, 2221, 5, 17, 0, 0, 2221, 2222, 3, 268, 134, 0, 2222, 2223, 5, 18, 0, 0, 2223, 277, 1, 0, 0, 0, 2224, 2225, 3, 282, 141, 0, 2225, 2226, 3, 280, 140, 0, 2226, 279, 1, 0, 0, 0, 2227, 2229, 3, 284, 142, 0, 2228, 2227, 1, 0, 0, 0, 2229, 2230, 1, 0, 0, 0, 2230, 2228, 1, 0, 0, 0, 2230, 2231, 1, 0, 0, 0, 2231, 281, 1, 0, 0, 0, 2232, 2233, 5, 158, 0, 0, 2233, 2245, 3, 276, 138, 0, 2234, 2235, 5, 158, 0, 0, 2235, 2236, 3, 0, 0, 0, 2236, 2237, 5, 159, 0, 0, 2237, 2238, 3, 0, 0, 0, 2238, 2245, 1, 0, 0, 0, 2239, 2240, 5, 158, 0, 0, 2240, 2241, 3, 32, 16, 0, 2241, 2242, 5, 159, 0, 0, 2242, 2243, 3, 32, 16, 0, 2243, 2245, 1, 0, 0, 0, 2244, 2232, 1, 0, 0, 0, 2244, 2234, 1, 0, 0, 0, 2244, 2239, 1, 0, 0, 0, 2245, 283, 1, 0, 0, 0, 2246, 2247, 3, 288, 144, 0, 2247, 2248, 3, 294, 147, 0, 2248, 2259, 1, 0, 0, 0, 2249, 2250, 3, 286, 143, 0, 2250, 2251, 3, 294, 147, 0, 2251, 2259, 1, 0, 0, 0, 2252, 2253, 3, 290, 145, 0, 2253, 2254, 3, 294, 147, 0, 2254, 2259, 1, 0, 0, 0, 2255, 2256, 3, 292, 146, 0, 2256, 2257, 3, 294, 147, 0, 2257, 2259, 1, 0, 0, 0, 2258, 2246, 1, 0, 0, 0, 2258, 2249, 1, 0, 0, 0, 2258, 2252, 1, 0, 0, 0, 2258, 2255, 1, 0, 0, 0, 2259, 285, 1, 0, 0, 0, 2260, 2261, 5, 160, 0, 0, 2261, 2267, 3, 276, 138, 0, 2262, 2263, 5, 160, 0, 0, 2263, 2267, 3, 0, 0, 0, 2264, 2265, 5, 160, 0, 0, 2265, 2267, 3, 32, 16, 0, 2266, 2260, 1, 0, 0, 0, 2266, 2262, 1, 0, 0, 0, 2266, 2264, 1, 0, 0, 0, 2267, 287, 1, 0, 0, 0, 2268, 2269, 5, 161, 0, 0, 2269, 2270, 3, 146, 73, 0, 2270, 289, 1, 0, 0, 0, 2271, 2272, 5, 162, 0, 0, 2272, 291, 1, 0, 0, 0, 2273, 2274, 5, 163, 0, 0, 2274, 293, 1, 0, 0, 0, 2275, 2287, 3, 276, 138, 0, 2276, 2277, 5, 164, 0, 0, 2277, 2278, 3, 0, 0, 0, 2278, 2279, 5, 159, 0, 0, 2279, 2280, 3, 0, 0, 0, 2280, 2287, 1, 0, 0, 0, 2281, 2282, 5, 164, 0, 0, 2282, 2283, 3, 32, 16, 0, 2283, 2284, 5, 159, 0, 0, 2284, 2285, 3, 32, 16, 0, 2285, 2287, 1, 0, 0, 0, 2286, 2275, 1, 0, 0, 0, 2286, 2276, 1, 0, 0, 0, 2286, 2281, 1, 0, 0, 0, 2287, 295, 1, 0, 0, 0, 2288, 2289, 3, 298, 149, 0, 2289, 2290, 3, 302, 151, 0, 2290, 297, 1, 0, 0, 0, 2291, 2292, 5, 165, 0, 0, 2292, 2293, 3, 300, 150, 0, 2293, 2294, 3, 0, 0, 0, 2294, 2295, 5, 36, 0, 0, 2295, 2299, 1, 0, 0, 0, 2296, 2297, 5, 165, 0, 0, 2297, 2299, 3, 300, 150, 0, 2298, 2291, 1, 0, 0, 0, 2298, 2296, 1, 0, 0, 0, 2299, 299, 1, 0, 0, 0, 2300, 2304, 1, 0, 0, 0, 2301, 2304, 5, 166, 0, 0, 2302, 2304, 5, 2, 0, 0, 2303, 2300, 1, 0, 0, 0, 2303, 2301, 1, 0, 0, 0, 2303, 2302, 1, 0, 0, 0, 2304, 301, 1, 0, 0, 0, 2305, 2306, 5, 17, 0, 0, 2306, 2307, 3, 304, 152, 0, 2307, 2308, 5, 18, 0, 0, 2308, 2315, 1, 0, 0, 0, 2309, 2311, 3, 308, 154, 0, 2310, 2309, 1, 0, 0, 0, 2311, 2312, 1, 0, 0, 0, 2312, 2310, 1, 0, 0, 0, 2312, 2313, 1, 0, 0, 0, 2313, 2315, 1, 0, 0, 0, 2314, 2305, 1, 0, 0, 0, 2314, 2310, 1, 0, 0, 0, 2315, 303, 1, 0, 0, 0, 2316, 2317, 3, 308, 154, 0, 2317, 2318, 5, 28, 0, 0, 2318, 2320, 1, 0, 0, 0, 2319, 2316, 1, 0, 0, 0, 2320, 2323, 1, 0, 0, 0, 2321, 2319, 1, 0, 0, 0, 2321, 2322, 1, 0, 0, 0, 2322, 2324, 1, 0, 0, 0, 2323, 2321, 1, 0, 0, 0, 2324, 2325, 3, 308, 154, 0, 2325, 305, 1, 0, 0, 0, 2326, 2332, 1, 0, 0, 0, 2327, 2328, 5, 42, 0, 0, 2328, 2329, 3, 32, 16, 0, 2329, 2330, 5, 43, 0, 0, 2330, 2332, 1, 0, 0, 0, 2331, 2326, 1, 0, 0, 0, 2331, 2327, 1, 0, 0, 0, 2332, 307, 1, 0, 0, 0, 2333, 2334, 5, 180, 0, 0, 2334, 2335, 5, 261, 0, 0, 2335, 2336, 5, 30, 0, 0, 2336, 2337, 3, 6, 3, 0, 2337, 2338, 5, 31, 0, 0, 2338, 2400, 1, 0, 0, 0, 2339, 2340, 5, 259, 0, 0, 2340, 2341, 5, 30, 0, 0, 2341, 2342, 3, 0, 0, 0, 2342, 2343, 5, 31, 0, 0, 2343, 2400, 1, 0, 0, 0, 2344, 2345, 5, 259, 0, 0, 2345, 2400, 3, 0, 0, 0, 2346, 2347, 5, 84, 0, 0, 2347, 2348, 5, 30, 0, 0, 2348, 2349, 3, 312, 156, 0, 2349, 2350, 5, 31, 0, 0, 2350, 2400, 1, 0, 0, 0, 2351, 2352, 5, 187, 0, 0, 2352, 2353, 5, 30, 0, 0, 2353, 2354, 3, 36, 18, 0, 2354, 2355, 5, 31, 0, 0, 2355, 2356, 3, 306, 153, 0, 2356, 2400, 1, 0, 0, 0, 2357, 2358, 5, 188, 0, 0, 2358, 2359, 5, 30, 0, 0, 2359, 2360, 3, 36, 18, 0, 2360, 2361, 5, 31, 0, 0, 2361, 2362, 3, 306, 153, 0, 2362, 2400, 1, 0, 0, 0, 2363, 2364, 5, 186, 0, 0, 2364, 2365, 5, 30, 0, 0, 2365, 2366, 3, 34, 17, 0, 2366, 2367, 5, 31, 0, 0, 2367, 2368, 3, 306, 153, 0, 2368, 2400, 1, 0, 0, 0, 2369, 2370, 5, 185, 0, 0, 2370, 2371, 5, 30, 0, 0, 2371, 2372, 3, 32, 16, 0, 2372, 2373, 5, 31, 0, 0, 2373, 2374, 3, 306, 153, 0, 2374, 2400, 1, 0, 0, 0, 2375, 2376, 5, 184, 0, 0, 2376, 2377, 5, 30, 0, 0, 2377, 2378, 3, 32, 16, 0, 2378, 2379, 5, 31, 0, 0, 2379, 2380, 3, 306, 153, 0, 2380, 2400, 1, 0, 0, 0, 2381, 2382, 5, 183, 0, 0, 2382, 2383, 5, 30, 0, 0, 2383, 2384, 3, 32, 16, 0, 2384, 2385, 5, 31, 0, 0, 2385, 2386, 3, 306, 153, 0, 2386, 2400, 1, 0, 0, 0, 2387, 2388, 5, 187, 0, 0, 2388, 2400, 3, 306, 153, 0, 2389, 2390, 5, 188, 0, 0, 2390, 2400, 3, 306, 153, 0, 2391, 2392, 5, 186, 0, 0, 2392, 2400, 3, 306, 153, 0, 2393, 2394, 5, 185, 0, 0, 2394, 2400, 3, 306, 153, 0, 2395, 2396, 5, 184, 0, 0, 2396, 2400, 3, 306, 153, 0, 2397, 2398, 5, 183, 0, 0, 2398, 2400, 3, 306, 153, 0, 2399, 2333, 1, 0, 0, 0, 2399, 2339, 1, 0, 0, 0, 2399, 2344, 1, 0, 0, 0, 2399, 2346, 1, 0, 0, 0, 2399, 2351, 1, 0, 0, 0, 2399, 2357, 1, 0, 0, 0, 2399, 2363, 1, 0, 0, 0, 2399, 2369, 1, 0, 0, 0, 2399, 2375, 1, 0, 0, 0, 2399, 2381, 1, 0, 0, 0, 2399, 2387, 1, 0, 0, 0, 2399, 2389, 1, 0, 0, 0, 2399, 2391, 1, 0, 0, 0, 2399, 2393, 1, 0, 0, 0, 2399, 2395, 1, 0, 0, 0, 2399, 2397, 1, 0, 0, 0, 2400, 309, 1, 0, 0, 0, 2401, 2402, 5, 187, 0, 0, 2402, 2403, 5, 30, 0, 0, 2403, 2404, 3, 36, 18, 0, 2404, 2405, 5, 31, 0, 0, 2405, 2477, 1, 0, 0, 0, 2406, 2407, 5, 188, 0, 0, 2407, 2408, 5, 30, 0, 0, 2408, 2409, 3, 36, 18, 0, 2409, 2410, 5, 31, 0, 0, 2410, 2477, 1, 0, 0, 0, 2411, 2412, 5, 187, 0, 0, 2412, 2413, 5, 30, 0, 0, 2413, 2414, 3, 32, 16, 0, 2414, 2415, 5, 31, 0, 0, 2415, 2477, 1, 0, 0, 0, 2416, 2417, 5, 188, 0, 0, 2417, 2418, 5, 30, 0, 0, 2418, 2419, 3, 34, 17, 0, 2419, 2420, 5, 31, 0, 0, 2420, 2477, 1, 0, 0, 0, 2421, 2422, 5, 186, 0, 0, 2422, 2423, 5, 30, 0, 0, 2423, 2424, 3, 34, 17, 0, 2424, 2425, 5, 31, 0, 0, 2425, 2477, 1, 0, 0, 0, 2426, 2427, 5, 185, 0, 0, 2427, 2428, 5, 30, 0, 0, 2428, 2429, 3, 32, 16, 0, 2429, 2430, 5, 31, 0, 0, 2430, 2477, 1, 0, 0, 0, 2431, 2432, 5, 184, 0, 0, 2432, 2433, 5, 30, 0, 0, 2433, 2434, 3, 32, 16, 0, 2434, 2435, 5, 31, 0, 0, 2435, 2477, 1, 0, 0, 0, 2436, 2437, 5, 183, 0, 0, 2437, 2438, 5, 30, 0, 0, 2438, 2439, 3, 32, 16, 0, 2439, 2440, 5, 31, 0, 0, 2440, 2477, 1, 0, 0, 0, 2441, 2442, 5, 192, 0, 0, 2442, 2443, 5, 30, 0, 0, 2443, 2444, 3, 34, 17, 0, 2444, 2445, 5, 31, 0, 0, 2445, 2477, 1, 0, 0, 0, 2446, 2447, 5, 191, 0, 0, 2447, 2448, 5, 30, 0, 0, 2448, 2449, 3, 32, 16, 0, 2449, 2450, 5, 31, 0, 0, 2450, 2477, 1, 0, 0, 0, 2451, 2452, 5, 190, 0, 0, 2452, 2453, 5, 30, 0, 0, 2453, 2454, 3, 32, 16, 0, 2454, 2455, 5, 31, 0, 0, 2455, 2477, 1, 0, 0, 0, 2456, 2457, 5, 189, 0, 0, 2457, 2458, 5, 30, 0, 0, 2458, 2459, 3, 32, 16, 0, 2459, 2460, 5, 31, 0, 0, 2460, 2477, 1, 0, 0, 0, 2461, 2462, 5, 180, 0, 0, 2462, 2463, 5, 30, 0, 0, 2463, 2464, 3, 32, 16, 0, 2464, 2465, 5, 31, 0, 0, 2465, 2477, 1, 0, 0, 0, 2466, 2467, 5, 182, 0, 0, 2467, 2468, 5, 30, 0, 0, 2468, 2469, 3, 184, 92, 0, 2469, 2470, 5, 31, 0, 0, 2470, 2477, 1, 0, 0, 0, 2471, 2472, 5, 84, 0, 0, 2472, 2473, 5, 30, 0, 0, 2473, 2474, 3, 312, 156, 0, 2474, 2475, 5, 31, 0, 0, 2475, 2477, 1, 0, 0, 0, 2476, 2401, 1, 0, 0, 0, 2476, 2406, 1, 0, 0, 0, 2476, 2411, 1, 0, 0, 0, 2476, 2416, 1, 0, 0, 0, 2476, 2421, 1, 0, 0, 0, 2476, 2426, 1, 0, 0, 0, 2476, 2431, 1, 0, 0, 0, 2476, 2436, 1, 0, 0, 0, 2476, 2441, 1, 0, 0, 0, 2476, 2446, 1, 0, 0, 0, 2476, 2451, 1, 0, 0, 0, 2476, 2456, 1, 0, 0, 0, 2476, 2461, 1, 0, 0, 0, 2476, 2466, 1, 0, 0, 0, 2476, 2471, 1, 0, 0, 0, 2477, 311, 1, 0, 0, 0, 2478, 2480, 3, 314, 157, 0, 2479, 2478, 1, 0, 0, 0, 2480, 2483, 1, 0, 0, 0, 2481, 2479, 1, 0, 0, 0, 2481, 2482, 1, 0, 0, 0, 2482, 313, 1, 0, 0, 0, 2483, 2481, 1, 0, 0, 0, 2484, 2485, 7, 11, 0, 0, 2485, 315, 1, 0, 0, 0, 2486, 2490, 3, 310, 155, 0, 2487, 2490, 3, 6, 3, 0, 2488, 2490, 5, 178, 0, 0, 2489, 2486, 1, 0, 0, 0, 2489, 2487, 1, 0, 0, 0, 2489, 2488, 1, 0, 0, 0, 2490, 317, 1, 0, 0, 0, 2491, 2640, 3, 310, 155, 0, 2492, 2493, 5, 181, 0, 0, 2493, 2494, 5, 30, 0, 0, 2494, 2495, 5, 178, 0, 0, 2495, 2640, 5, 31, 0, 0, 2496, 2497, 5, 181, 0, 0, 2497, 2498, 5, 30, 0, 0, 2498, 2499, 5, 263, 0, 0, 2499, 2640, 5, 31, 0, 0, 2500, 2501, 5, 195, 0, 0, 2501, 2502, 5, 30, 0, 0, 2502, 2503, 5, 39, 0, 0, 2503, 2504, 5, 263, 0, 0, 2504, 2640, 5, 31, 0, 0, 2505, 2506, 5, 195, 0, 0, 2506, 2507, 5, 30, 0, 0, 2507, 2508, 3, 138, 69, 0, 2508, 2509, 5, 31, 0, 0, 2509, 2640, 1, 0, 0, 0, 2510, 2511, 5, 195, 0, 0, 2511, 2512, 5, 30, 0, 0, 2512, 2513, 5, 178, 0, 0, 2513, 2640, 5, 31, 0, 0, 2514, 2515, 5, 196, 0, 0, 2515, 2516, 5, 30, 0, 0, 2516, 2517, 3, 318, 159, 0, 2517, 2518, 5, 31, 0, 0, 2518, 2640, 1, 0, 0, 0, 2519, 2520, 5, 187, 0, 0, 2520, 2521, 5, 42, 0, 0, 2521, 2522, 3, 32, 16, 0, 2522, 2523, 5, 43, 0, 0, 2523, 2524, 5, 30, 0, 0, 2524, 2525, 3, 320, 160, 0, 2525, 2526, 5, 31, 0, 0, 2526, 2640, 1, 0, 0, 0, 2527, 2528, 5, 188, 0, 0, 2528, 2529, 5, 42, 0, 0, 2529, 2530, 3, 32, 16, 0, 2530, 2531, 5, 43, 0, 0, 2531, 2532, 5, 30, 0, 0, 2532, 2533, 3, 322, 161, 0, 2533, 2534, 5, 31, 0, 0, 2534, 2640, 1, 0, 0, 0, 2535, 2536, 5, 186, 0, 0, 2536, 2537, 5, 42, 0, 0, 2537, 2538, 3, 32, 16, 0, 2538, 2539, 5, 43, 0, 0, 2539, 2540, 5, 30, 0, 0, 2540, 2541, 3, 324, 162, 0, 2541, 2542, 5, 31, 0, 0, 2542, 2640, 1, 0, 0, 0, 2543, 2544, 5, 185, 0, 0, 2544, 2545, 5, 42, 0, 0, 2545, 2546, 3, 32, 16, 0, 2546, 2547, 5, 43, 0, 0, 2547, 2548, 5, 30, 0, 0, 2548, 2549, 3, 326, 163, 0, 2549, 2550, 5, 31, 0, 0, 2550, 2640, 1, 0, 0, 0, 2551, 2552, 5, 184, 0, 0, 2552, 2553, 5, 42, 0, 0, 2553, 2554, 3, 32, 16, 0, 2554, 2555, 5, 43, 0, 0, 2555, 2556, 5, 30, 0, 0, 2556, 2557, 3, 328, 164, 0, 2557, 2558, 5, 31, 0, 0, 2558, 2640, 1, 0, 0, 0, 2559, 2560, 5, 183, 0, 0, 2560, 2561, 5, 42, 0, 0, 2561, 2562, 3, 32, 16, 0, 2562, 2563, 5, 43, 0, 0, 2563, 2564, 5, 30, 0, 0, 2564, 2565, 3, 330, 165, 0, 2565, 2566, 5, 31, 0, 0, 2566, 2640, 1, 0, 0, 0, 2567, 2568, 5, 192, 0, 0, 2568, 2569, 5, 42, 0, 0, 2569, 2570, 3, 32, 16, 0, 2570, 2571, 5, 43, 0, 0, 2571, 2572, 5, 30, 0, 0, 2572, 2573, 3, 324, 162, 0, 2573, 2574, 5, 31, 0, 0, 2574, 2640, 1, 0, 0, 0, 2575, 2576, 5, 191, 0, 0, 2576, 2577, 5, 42, 0, 0, 2577, 2578, 3, 32, 16, 0, 2578, 2579, 5, 43, 0, 0, 2579, 2580, 5, 30, 0, 0, 2580, 2581, 3, 326, 163, 0, 2581, 2582, 5, 31, 0, 0, 2582, 2640, 1, 0, 0, 0, 2583, 2584, 5, 190, 0, 0, 2584, 2585, 5, 42, 0, 0, 2585, 2586, 3, 32, 16, 0, 2586, 2587, 5, 43, 0, 0, 2587, 2588, 5, 30, 0, 0, 2588, 2589, 3, 328, 164, 0, 2589, 2590, 5, 31, 0, 0, 2590, 2640, 1, 0, 0, 0, 2591, 2592, 5, 189, 0, 0, 2592, 2593, 5, 42, 0, 0, 2593, 2594, 3, 32, 16, 0, 2594, 2595, 5, 43, 0, 0, 2595, 2596, 5, 30, 0, 0, 2596, 2597, 3, 330, 165, 0, 2597, 2598, 5, 31, 0, 0, 2598, 2640, 1, 0, 0, 0, 2599, 2600, 5, 180, 0, 0, 2600, 2601, 5, 42, 0, 0, 2601, 2602, 3, 32, 16, 0, 2602, 2603, 5, 43, 0, 0, 2603, 2604, 5, 30, 0, 0, 2604, 2605, 3, 328, 164, 0, 2605, 2606, 5, 31, 0, 0, 2606, 2640, 1, 0, 0, 0, 2607, 2608, 5, 182, 0, 0, 2608, 2609, 5, 42, 0, 0, 2609, 2610, 3, 32, 16, 0, 2610, 2611, 5, 43, 0, 0, 2611, 2612, 5, 30, 0, 0, 2612, 2613, 3, 332, 166, 0, 2613, 2614, 5, 31, 0, 0, 2614, 2640, 1, 0, 0, 0, 2615, 2616, 5, 181, 0, 0, 2616, 2617, 5, 42, 0, 0, 2617, 2618, 3, 32, 16, 0, 2618, 2619, 5, 43, 0, 0, 2619, 2620, 5, 30, 0, 0, 2620, 2621, 3, 334, 167, 0, 2621, 2622, 5, 31, 0, 0, 2622, 2640, 1, 0, 0, 0, 2623, 2624, 5, 195, 0, 0, 2624, 2625, 5, 42, 0, 0, 2625, 2626, 3, 32, 16, 0, 2626, 2627, 5, 43, 0, 0, 2627, 2628, 5, 30, 0, 0, 2628, 2629, 3, 336, 168, 0, 2629, 2630, 5, 31, 0, 0, 2630, 2640, 1, 0, 0, 0, 2631, 2632, 5, 196, 0, 0, 2632, 2633, 5, 42, 0, 0, 2633, 2634, 3, 32, 16, 0, 2634, 2635, 5, 43, 0, 0, 2635, 2636, 5, 30, 0, 0, 2636, 2637, 3, 340, 170, 0, 2637, 2638, 5, 31, 0, 0, 2638, 2640, 1, 0, 0, 0, 2639, 2491, 1, 0, 0, 0, 2639, 2492, 1, 0, 0, 0, 2639, 2496, 1, 0, 0, 0, 2639, 2500, 1, 0, 0, 0, 2639, 2505, 1, 0, 0, 0, 2639, 2510, 1, 0, 0, 0, 2639, 2514, 1, 0, 0, 0, 2639, 2519, 1, 0, 0, 0, 2639, 2527, 1, 0, 0, 0, 2639, 2535, 1, 0, 0, 0, 2639, 2543, 1, 0, 0, 0, 2639, 2551, 1, 0, 0, 0, 2639, 2559, 1, 0, 0, 0, 2639, 2567, 1, 0, 0, 0, 2639, 2575, 1, 0, 0, 0, 2639, 2583, 1, 0, 0, 0, 2639, 2591, 1, 0, 0, 0, 2639, 2599, 1, 0, 0, 0, 2639, 2607, 1, 0, 0, 0, 2639, 2615, 1, 0, 0, 0, 2639, 2623, 1, 0, 0, 0, 2639, 2631, 1, 0, 0, 0, 2640, 319, 1, 0, 0, 0, 2641, 2644, 3, 36, 18, 0, 2642, 2644, 3, 32, 16, 0, 2643, 2641, 1, 0, 0, 0, 2643, 2642, 1, 0, 0, 0, 2644, 2647, 1, 0, 0, 0, 2645, 2643, 1, 0, 0, 0, 2645, 2646, 1, 0, 0, 0, 2646, 321, 1, 0, 0, 0, 2647, 2645, 1, 0, 0, 0, 2648, 2651, 3, 36, 18, 0, 2649, 2651, 3, 34, 17, 0, 2650, 2648, 1, 0, 0, 0, 2650, 2649, 1, 0, 0, 0, 2651, 2654, 1, 0, 0, 0, 2652, 2650, 1, 0, 0, 0, 2652, 2653, 1, 0, 0, 0, 2653, 323, 1, 0, 0, 0, 2654, 2652, 1, 0, 0, 0, 2655, 2657, 3, 34, 17, 0, 2656, 2655, 1, 0, 0, 0, 2657, 2660, 1, 0, 0, 0, 2658, 2656, 1, 0, 0, 0, 2658, 2659, 1, 0, 0, 0, 2659, 325, 1, 0, 0, 0, 2660, 2658, 1, 0, 0, 0, 2661, 2663, 3, 32, 16, 0, 2662, 2661, 1, 0, 0, 0, 2663, 2666, 1, 0, 0, 0, 2664, 2662, 1, 0, 0, 0, 2664, 2665, 1, 0, 0, 0, 2665, 327, 1, 0, 0, 0, 2666, 2664, 1, 0, 0, 0, 2667, 2669, 3, 32, 16, 0, 2668, 2667, 1, 0, 0, 0, 2669, 2672, 1, 0, 0, 0, 2670, 2668, 1, 0, 0, 0, 2670, 2671, 1, 0, 0, 0, 2671, 329, 1, 0, 0, 0, 2672, 2670, 1, 0, 0, 0, 2673, 2675, 3, 32, 16, 0, 2674, 2673, 1, 0, 0, 0, 2675, 2678, 1, 0, 0, 0, 2676, 2674, 1, 0, 0, 0, 2676, 2677, 1, 0, 0, 0, 2677, 331, 1, 0, 0, 0, 2678, 2676, 1, 0, 0, 0, 2679, 2681, 3, 184, 92, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2684, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2683, 333, 1, 0, 0, 0, 2684, 2682, 1, 0, 0, 0, 2685, 2687, 7, 12, 0, 0, 2686, 2685, 1, 0, 0, 0, 2687, 2690, 1, 0, 0, 0, 2688, 2686, 1, 0, 0, 0, 2688, 2689, 1, 0, 0, 0, 2689, 335, 1, 0, 0, 0, 2690, 2688, 1, 0, 0, 0, 2691, 2693, 3, 338, 169, 0, 2692, 2691, 1, 0, 0, 0, 2693, 2696, 1, 0, 0, 0, 2694, 2692, 1, 0, 0, 0, 2694, 2695, 1, 0, 0, 0, 2695, 337, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2697, 2702, 5, 178, 0, 0, 2698, 2699, 5, 39, 0, 0, 2699, 2702, 5, 263, 0, 0, 2700, 2702, 3, 138, 69, 0, 2701, 2697, 1, 0, 0, 0, 2701, 2698, 1, 0, 0, 0, 2701, 2700, 1, 0, 0, 0, 2702, 339, 1, 0, 0, 0, 2703, 2705, 3, 318, 159, 0, 2704, 2703, 1, 0, 0, 0, 2705, 2708, 1, 0, 0, 0, 2706, 2704, 1, 0, 0, 0, 2706, 2707, 1, 0, 0, 0, 2707, 341, 1, 0, 0, 0, 2708, 2706, 1, 0, 0, 0, 2709, 2713, 3, 44, 22, 0, 2710, 2713, 3, 46, 23, 0, 2711, 2713, 3, 2, 1, 0, 2712, 2709, 1, 0, 0, 0, 2712, 2710, 1, 0, 0, 0, 2712, 2711, 1, 0, 0, 0, 2713, 343, 1, 0, 0, 0, 2714, 2715, 5, 167, 0, 0, 2715, 2716, 5, 36, 0, 0, 2716, 2717, 5, 30, 0, 0, 2717, 2718, 3, 312, 156, 0, 2718, 2719, 5, 31, 0, 0, 2719, 2740, 1, 0, 0, 0, 2720, 2721, 5, 168, 0, 0, 2721, 2722, 3, 38, 19, 0, 2722, 2723, 5, 75, 0, 0, 2723, 2724, 3, 38, 19, 0, 2724, 2725, 5, 75, 0, 0, 2725, 2726, 3, 38, 19, 0, 2726, 2727, 5, 75, 0, 0, 2727, 2728, 3, 38, 19, 0, 2728, 2740, 1, 0, 0, 0, 2729, 2730, 5, 169, 0, 0, 2730, 2740, 3, 6, 3, 0, 2731, 2732, 5, 169, 0, 0, 2732, 2733, 5, 36, 0, 0, 2733, 2734, 5, 30, 0, 0, 2734, 2735, 3, 312, 156, 0, 2735, 2736, 5, 31, 0, 0, 2736, 2740, 1, 0, 0, 0, 2737, 2740, 3, 342, 171, 0, 2738, 2740, 3, 40, 20, 0, 2739, 2714, 1, 0, 0, 0, 2739, 2720, 1, 0, 0, 0, 2739, 2729, 1, 0, 0, 0, 2739, 2731, 1, 0, 0, 0, 2739, 2737, 1, 0, 0, 0, 2739, 2738, 1, 0, 0, 0, 2740, 345, 1, 0, 0, 0, 2741, 2742, 5, 25, 0, 0, 2742, 2743, 5, 40, 0, 0, 2743, 2744, 3, 98, 49, 0, 2744, 2745, 3, 2, 1, 0, 2745, 2754, 1, 0, 0, 0, 2746, 2747, 5, 25, 0, 0, 2747, 2748, 5, 40, 0, 0, 2748, 2749, 3, 98, 49, 0, 2749, 2750, 3, 2, 1, 0, 2750, 2751, 5, 34, 0, 0, 2751, 2752, 3, 2, 1, 0, 2752, 2754, 1, 0, 0, 0, 2753, 2741, 1, 0, 0, 0, 2753, 2746, 1, 0, 0, 0, 2754, 347, 1, 0, 0, 0, 2755, 2757, 3, 350, 175, 0, 2756, 2755, 1, 0, 0, 0, 2757, 2760, 1, 0, 0, 0, 2758, 2756, 1, 0, 0, 0, 2758, 2759, 1, 0, 0, 0, 2759, 349, 1, 0, 0, 0, 2760, 2758, 1, 0, 0, 0, 2761, 2762, 5, 179, 0, 0, 2762, 2763, 5, 36, 0, 0, 2763, 2764, 5, 30, 0, 0, 2764, 2765, 3, 312, 156, 0, 2765, 2766, 5, 31, 0, 0, 2766, 2776, 1, 0, 0, 0, 2767, 2776, 3, 344, 172, 0, 2768, 2769, 5, 170, 0, 0, 2769, 2770, 5, 36, 0, 0, 2770, 2771, 5, 30, 0, 0, 2771, 2772, 3, 312, 156, 0, 2772, 2773, 5, 31, 0, 0, 2773, 2776, 1, 0, 0, 0, 2774, 2776, 5, 55, 0, 0, 2775, 2761, 1, 0, 0, 0, 2775, 2767, 1, 0, 0, 0, 2775, 2768, 1, 0, 0, 0, 2775, 2774, 1, 0, 0, 0, 2776, 351, 1, 0, 0, 0, 2777, 2778, 5, 50, 0, 0, 2778, 2782, 5, 40, 0, 0, 2779, 2781, 3, 356, 178, 0, 2780, 2779, 1, 0, 0, 0, 2781, 2784, 1, 0, 0, 0, 2782, 2780, 1, 0, 0, 0, 2782, 2783, 1, 0, 0, 0, 2783, 2785, 1, 0, 0, 0, 2784, 2782, 1, 0, 0, 0, 2785, 2786, 3, 2, 1, 0, 2786, 353, 1, 0, 0, 0, 2787, 2791, 5, 300, 0, 0, 2788, 2790, 3, 356, 178, 0, 2789, 2788, 1, 0, 0, 0, 2790, 2793, 1, 0, 0, 0, 2791, 2789, 1, 0, 0, 0, 2791, 2792, 1, 0, 0, 0, 2792, 2794, 1, 0, 0, 0, 2793, 2791, 1, 0, 0, 0, 2794, 2795, 3, 2, 1, 0, 2795, 355, 1, 0, 0, 0, 2796, 2812, 5, 52, 0, 0, 2797, 2812, 5, 51, 0, 0, 2798, 2812, 5, 171, 0, 0, 2799, 2800, 5, 62, 0, 0, 2800, 2812, 5, 51, 0, 0, 2801, 2802, 5, 62, 0, 0, 2802, 2812, 5, 52, 0, 0, 2803, 2804, 5, 62, 0, 0, 2804, 2812, 5, 63, 0, 0, 2805, 2806, 5, 62, 0, 0, 2806, 2812, 5, 64, 0, 0, 2807, 2808, 5, 62, 0, 0, 2808, 2812, 5, 65, 0, 0, 2809, 2810, 5, 62, 0, 0, 2810, 2812, 5, 66, 0, 0, 2811, 2796, 1, 0, 0, 0, 2811, 2797, 1, 0, 0, 0, 2811, 2798, 1, 0, 0, 0, 2811, 2799, 1, 0, 0, 0, 2811, 2801, 1, 0, 0, 0, 2811, 2803, 1, 0, 0, 0, 2811, 2805, 1, 0, 0, 0, 2811, 2807, 1, 0, 0, 0, 2811, 2809, 1, 0, 0, 0, 2812, 357, 1, 0, 0, 0, 2813, 2815, 3, 360, 180, 0, 2814, 2813, 1, 0, 0, 0, 2815, 2818, 1, 0, 0, 0, 2816, 2814, 1, 0, 0, 0, 2816, 2817, 1, 0, 0, 0, 2817, 359, 1, 0, 0, 0, 2818, 2816, 1, 0, 0, 0, 2819, 2820, 5, 21, 0, 0, 2820, 2833, 3, 2, 1, 0, 2821, 2822, 5, 50, 0, 0, 2822, 2823, 5, 40, 0, 0, 2823, 2833, 3, 140, 70, 0, 2824, 2825, 5, 25, 0, 0, 2825, 2826, 5, 40, 0, 0, 2826, 2833, 3, 2, 1, 0, 2827, 2833, 3, 196, 98, 0, 2828, 2829, 5, 50, 0, 0, 2829, 2833, 3, 32, 16, 0, 2830, 2833, 3, 342, 171, 0, 2831, 2833, 3, 40, 20, 0, 2832, 2819, 1, 0, 0, 0, 2832, 2821, 1, 0, 0, 0, 2832, 2824, 1, 0, 0, 0, 2832, 2827, 1, 0, 0, 0, 2832, 2828, 1, 0, 0, 0, 2832, 2830, 1, 0, 0, 0, 2832, 2831, 1, 0, 0, 0, 2833, 361, 1, 0, 0, 0, 2834, 2838, 5, 273, 0, 0, 2835, 2837, 3, 364, 182, 0, 2836, 2835, 1, 0, 0, 0, 2837, 2840, 1, 0, 0, 0, 2838, 2836, 1, 0, 0, 0, 2838, 2839, 1, 0, 0, 0, 2839, 2841, 1, 0, 0, 0, 2840, 2838, 1, 0, 0, 0, 2841, 2854, 3, 2, 1, 0, 2842, 2846, 5, 273, 0, 0, 2843, 2845, 3, 364, 182, 0, 2844, 2843, 1, 0, 0, 0, 2845, 2848, 1, 0, 0, 0, 2846, 2844, 1, 0, 0, 0, 2846, 2847, 1, 0, 0, 0, 2847, 2849, 1, 0, 0, 0, 2848, 2846, 1, 0, 0, 0, 2849, 2850, 3, 2, 1, 0, 2850, 2851, 5, 34, 0, 0, 2851, 2852, 3, 2, 1, 0, 2852, 2854, 1, 0, 0, 0, 2853, 2834, 1, 0, 0, 0, 2853, 2842, 1, 0, 0, 0, 2854, 363, 1, 0, 0, 0, 2855, 2856, 7, 13, 0, 0, 2856, 365, 1, 0, 0, 0, 2857, 2859, 3, 368, 184, 0, 2858, 2857, 1, 0, 0, 0, 2859, 2862, 1, 0, 0, 0, 2860, 2858, 1, 0, 0, 0, 2860, 2861, 1, 0, 0, 0, 2861, 367, 1, 0, 0, 0, 2862, 2860, 1, 0, 0, 0, 2863, 2864, 5, 21, 0, 0, 2864, 2865, 3, 2, 1, 0, 2865, 2866, 5, 44, 0, 0, 2866, 2867, 3, 32, 16, 0, 2867, 2874, 1, 0, 0, 0, 2868, 2869, 5, 25, 0, 0, 2869, 2870, 5, 40, 0, 0, 2870, 2874, 3, 2, 1, 0, 2871, 2874, 3, 342, 171, 0, 2872, 2874, 3, 40, 20, 0, 2873, 2863, 1, 0, 0, 0, 2873, 2868, 1, 0, 0, 0, 2873, 2871, 1, 0, 0, 0, 2873, 2872, 1, 0, 0, 0, 2874, 369, 1, 0, 0, 0, 172, 378, 383, 391, 399, 452, 493, 502, 526, 530, 548, 575, 598, 634, 640, 647, 649, 659, 661, 668, 679, 687, 708, 710, 726, 771, 776, 781, 786, 794, 872, 878, 894, 900, 906, 913, 1024, 1029, 1035, 1040, 1042, 1050, 1062, 1074, 1081, 1088, 1090, 1117, 1124, 1132, 1140, 1153, 1160, 1163, 1182, 1276, 1285, 1292, 1295, 1303, 1324, 1356, 1379, 1391, 1400, 1425, 1449, 1457, 1461, 1476, 1483, 1528, 1538, 1554, 1566, 1578, 1592, 1604, 1615, 1622, 1632, 1645, 1650, 1655, 1664, 1675, 1758, 1767, 1780, 1791, 1799, 1809, 1811, 1838, 1845, 1850, 1857, 1863, 1873, 1877, 1884, 1899, 1905, 1919, 1932, 1940, 1947, 1951, 1956, 1972, 1977, 1979, 1992, 2018, 2025, 2027, 2032, 2038, 2067, 2072, 2095, 2100, 2164, 2173, 2186, 2197, 2208, 2211, 2218, 2230, 2244, 2258, 2266, 2286, 2298, 2303, 2312, 2314, 2321, 2331, 2399, 2476, 2481, 2489, 2639, 2643, 2645, 2650, 2652, 2658, 2664, 2670, 2676, 2682, 2688, 2694, 2701, 2706, 2712, 2739, 2753, 2758, 2775, 2782, 2791, 2811, 2816, 2832, 2838, 2846, 2853, 2860, 2873]
\ No newline at end of file
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens b/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens
index 2d2c2b7de5f63f..d793c46dd0b4c6 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens
+++ b/src/tools/ilasm/src/ILAssembler/gen/CIL.tokens
@@ -317,118 +317,118 @@ SyntheticIncludedFileEof=304
'aggressiveoptimization'=13
'async'=14
'extended'=15
-'{'=16
-'}'=17
-'.subsystem'=18
-'.corflags'=19
-'.file'=20
-'alignment'=21
-'.imagebase'=22
-'.stackreserve'=23
-'.assembly'=24
-'.mscorlib'=25
-'.language'=26
-','=27
-'.typelist'=28
-'('=29
-')'=30
-';'=31
-'.typedef'=32
-'as'=33
-'.custom'=34
-'='=35
-'field'=36
-'property'=37
-'class'=38
-'extern'=39
-'.vtfixup'=40
-'['=41
-']'=42
-'at'=43
-'fromunmanaged'=44
-'callmostderived'=45
-'retainappdomain'=46
-'.vtable'=47
-'.namespace'=48
-'.class'=49
-'public'=50
-'private'=51
-'sealed'=52
-'abstract'=53
-'auto'=54
-'sequential'=55
-'unicode'=56
-'autochar'=57
-'import'=58
-'serializable'=59
-'windowsruntime'=60
-'nested'=61
-'family'=62
-'assembly'=63
-'famandassem'=64
-'famorassem'=65
-'beforefieldinit'=66
-'specialname'=67
-'rtspecialname'=68
-'flags'=69
-'extends'=70
-'implements'=71
-'.line'=72
-'#line'=73
-':'=74
-'nometadata'=75
-'retargetable'=76
-'noplatform'=77
-'legacy library'=78
-'x86'=79
-'amd64'=80
-'arm'=81
-'arm64'=82
-'bytearray'=83
-'()'=84
-'<'=85
-'>'=86
-'/'=87
-'algorithm'=88
-'iidparam'=89
-'pinned'=90
-'modreq'=91
-'modopt'=92
-'unsigned'=93
-'true'=94
-'false'=95
-'request'=96
-'demand'=97
-'assert'=98
-'deny'=99
-'permitonly'=100
-'linkcheck'=101
-'inheritcheck'=102
-'reqmin'=103
-'reqopt'=104
-'reqrefuse'=105
-'prejitgrant'=106
-'prejitdeny'=107
-'noncasdemand'=108
-'noncaslinkdemand'=109
-'noncasinheritance'=110
-'callconv'=111
-'mdtoken'=112
-'-'=113
-'byreflike'=114
-'.ctor'=115
-'.size'=116
-'.pack'=117
-'with'=118
-'.interfaceimpl'=119
-'.field'=120
-'marshal'=121
-'static'=122
-'initonly'=123
-'privatescope'=124
-'literal'=125
-'notserialized'=126
-'volatile'=127
+'volatile'=16
+'{'=17
+'}'=18
+'.subsystem'=19
+'.corflags'=20
+'.file'=21
+'alignment'=22
+'.imagebase'=23
+'.stackreserve'=24
+'.assembly'=25
+'.mscorlib'=26
+'.language'=27
+','=28
+'.typelist'=29
+'('=30
+')'=31
+';'=32
+'.typedef'=33
+'as'=34
+'.custom'=35
+'='=36
+'field'=37
+'property'=38
+'class'=39
+'extern'=40
+'.vtfixup'=41
+'['=42
+']'=43
+'at'=44
+'fromunmanaged'=45
+'callmostderived'=46
+'retainappdomain'=47
+'.vtable'=48
+'.namespace'=49
+'.class'=50
+'public'=51
+'private'=52
+'sealed'=53
+'abstract'=54
+'auto'=55
+'sequential'=56
+'unicode'=57
+'autochar'=58
+'import'=59
+'serializable'=60
+'windowsruntime'=61
+'nested'=62
+'family'=63
+'assembly'=64
+'famandassem'=65
+'famorassem'=66
+'beforefieldinit'=67
+'specialname'=68
+'rtspecialname'=69
+'flags'=70
+'extends'=71
+'implements'=72
+'.line'=73
+'#line'=74
+':'=75
+'nometadata'=76
+'retargetable'=77
+'noplatform'=78
+'legacy library'=79
+'x86'=80
+'amd64'=81
+'arm'=82
+'arm64'=83
+'bytearray'=84
+'()'=85
+'<'=86
+'>'=87
+'/'=88
+'algorithm'=89
+'unsigned'=90
+'iidparam'=91
+'pinned'=92
+'modreq'=93
+'modopt'=94
+'true'=95
+'false'=96
+'request'=97
+'demand'=98
+'assert'=99
+'deny'=100
+'permitonly'=101
+'linkcheck'=102
+'inheritcheck'=103
+'reqmin'=104
+'reqopt'=105
+'reqrefuse'=106
+'prejitgrant'=107
+'prejitdeny'=108
+'noncasdemand'=109
+'noncaslinkdemand'=110
+'noncasinheritance'=111
+'callconv'=112
+'mdtoken'=113
+'-'=114
+'byreflike'=115
+'.ctor'=116
+'.size'=117
+'.pack'=118
+'with'=119
+'.interfaceimpl'=120
+'.field'=121
+'marshal'=122
+'static'=123
+'initonly'=124
+'privatescope'=125
+'literal'=126
+'notserialized'=127
'.event'=128
'.addon'=129
'.removeon'=130
@@ -468,7 +468,7 @@ SyntheticIncludedFileEof=304
'handler'=164
'.data'=165
'tls'=166
-'.publicKey'=167
+'.publickey'=167
'.ver'=168
'.locale'=169
'.publickeytoken'=170
@@ -501,7 +501,7 @@ SyntheticIncludedFileEof=304
'enum'=201
'custom'=202
'fixed'=203
-'systring'=204
+'sysstring'=204
'array'=205
'variant'=206
'currency'=207
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs
index e95b0b0a47d582..3310518e31dce7 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.cs
@@ -34,54 +34,54 @@ public partial class CILLexer : Lexer {
protected static DFA[] decisionToDFA;
protected static PredictionContextCache sharedContextCache = new PredictionContextCache();
public const int
- T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
- T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
- T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
- T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
- T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
- T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
- T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
- T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
- T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
- T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
- T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
- T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
- T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
- T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
- T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107,
- T__107=108, T__108=109, T__109=110, T__110=111, T__111=112, T__112=113,
- T__113=114, T__114=115, T__115=116, T__116=117, T__117=118, T__118=119,
- T__119=120, T__120=121, T__121=122, T__122=123, T__123=124, T__124=125,
- T__125=126, T__126=127, T__127=128, T__128=129, T__129=130, T__130=131,
- T__131=132, T__132=133, T__133=134, T__134=135, T__135=136, T__136=137,
- T__137=138, T__138=139, T__139=140, T__140=141, T__141=142, T__142=143,
- T__143=144, T__144=145, T__145=146, T__146=147, T__147=148, T__148=149,
- T__149=150, T__150=151, T__151=152, T__152=153, T__153=154, T__154=155,
- T__155=156, T__156=157, T__157=158, T__158=159, T__159=160, T__160=161,
- T__161=162, T__162=163, T__163=164, T__164=165, T__165=166, T__166=167,
- T__167=168, T__168=169, T__169=170, T__170=171, INT32=172, INT64=173,
- FLOAT64=174, DCOLON=175, ELLIPSIS=176, NULL=177, NULLREF=178, HASH=179,
- CHAR=180, STRING=181, BOOL=182, INT8=183, INT16=184, INT32_=185, INT64_=186,
- FLOAT32=187, FLOAT64_=188, UINT8=189, UINT16=190, UINT32=191, UINT64=192,
- INT=193, UINT=194, TYPE=195, OBJECT=196, MODULE=197, VALUE=198, VALUETYPE=199,
- VOID=200, ENUM=201, CUSTOM=202, FIXED=203, SYSSTRING=204, ARRAY=205, VARIANT=206,
- CURRENCY=207, SYSCHAR=208, ERROR=209, DECIMAL=210, DATE=211, BSTR=212,
- LPSTR=213, LPWSTR=214, LPTSTR=215, OBJECTREF=216, IUNKNOWN=217, IDISPATCH=218,
- STRUCT=219, INTERFACE=220, SAFEARRAY=221, BYVALSTR=222, ANSI=223, TBSTR=224,
- METHOD=225, ANY=226, LPSTRUCT=227, VECTOR=228, HRESULT=229, CARRAY=230,
- USERDEFINED=231, RECORD=232, FILETIME=233, BLOB=234, STREAM=235, STORAGE=236,
- STREAMED_OBJECT=237, STORED_OBJECT=238, BLOB_OBJECT=239, CF=240, CLSID=241,
- INSTANCE=242, EXPLICIT=243, DEFAULT=244, VARARG=245, UNMANAGED=246, CDECL=247,
- STDCALL=248, THISCALL=249, FASTCALL=250, TYPE_PARAMETER=251, METHOD_TYPE_PARAMETER=252,
- TYPEDREF=253, PARAM=254, CONSTRAINT=255, THIS=256, BASE=257, NESTER=258,
- REF=259, ARRAY_TYPE_NO_BOUNDS=260, PTR=261, QSTRING=262, SQSTRING=263,
- DOT=264, PLUS=265, PP_DEFINE=266, PP_UNDEF=267, PP_IFDEF=268, PP_IFNDEF=269,
- PP_ELSE=270, PP_ENDIF=271, PP_INCLUDE=272, MRESOURCE=273, INSTR_NONE=274,
- INSTR_VAR=275, INSTR_I=276, INSTR_I8=277, INSTR_R=278, INSTR_METHOD=279,
- INSTR_SIG=280, INSTR_BRTARGET=281, INSTR_SWITCH=282, INSTR_TYPE=283, INSTR_STRING=284,
- INSTR_FIELD=285, INSTR_TOK=286, DOTTEDNAME=287, ID=288, HEXBYTE=289, WS=290,
- SINGLE_LINE_COMMENT=291, COMMENT=292, PERMISSION=293, PERMISSIONSET=294,
- EMITBYTE=295, MAXSTACK=296, ENTRYPOINT=297, ZEROINIT=298, LOCALS=299,
+ T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
+ T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
+ T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
+ T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
+ T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
+ T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
+ T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
+ T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
+ T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
+ T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
+ T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
+ T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
+ T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
+ T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
+ T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107,
+ T__107=108, T__108=109, T__109=110, T__110=111, T__111=112, T__112=113,
+ T__113=114, T__114=115, T__115=116, T__116=117, T__117=118, T__118=119,
+ T__119=120, T__120=121, T__121=122, T__122=123, T__123=124, T__124=125,
+ T__125=126, T__126=127, T__127=128, T__128=129, T__129=130, T__130=131,
+ T__131=132, T__132=133, T__133=134, T__134=135, T__135=136, T__136=137,
+ T__137=138, T__138=139, T__139=140, T__140=141, T__141=142, T__142=143,
+ T__143=144, T__144=145, T__145=146, T__146=147, T__147=148, T__148=149,
+ T__149=150, T__150=151, T__151=152, T__152=153, T__153=154, T__154=155,
+ T__155=156, T__156=157, T__157=158, T__158=159, T__159=160, T__160=161,
+ T__161=162, T__162=163, T__163=164, T__164=165, T__165=166, T__166=167,
+ T__167=168, T__168=169, T__169=170, T__170=171, INT32=172, INT64=173,
+ FLOAT64=174, DCOLON=175, ELLIPSIS=176, NULL=177, NULLREF=178, HASH=179,
+ CHAR=180, STRING=181, BOOL=182, INT8=183, INT16=184, INT32_=185, INT64_=186,
+ FLOAT32=187, FLOAT64_=188, UINT8=189, UINT16=190, UINT32=191, UINT64=192,
+ INT=193, UINT=194, TYPE=195, OBJECT=196, MODULE=197, VALUE=198, VALUETYPE=199,
+ VOID=200, ENUM=201, CUSTOM=202, FIXED=203, SYSSTRING=204, ARRAY=205, VARIANT=206,
+ CURRENCY=207, SYSCHAR=208, ERROR=209, DECIMAL=210, DATE=211, BSTR=212,
+ LPSTR=213, LPWSTR=214, LPTSTR=215, OBJECTREF=216, IUNKNOWN=217, IDISPATCH=218,
+ STRUCT=219, INTERFACE=220, SAFEARRAY=221, BYVALSTR=222, ANSI=223, TBSTR=224,
+ METHOD=225, ANY=226, LPSTRUCT=227, VECTOR=228, HRESULT=229, CARRAY=230,
+ USERDEFINED=231, RECORD=232, FILETIME=233, BLOB=234, STREAM=235, STORAGE=236,
+ STREAMED_OBJECT=237, STORED_OBJECT=238, BLOB_OBJECT=239, CF=240, CLSID=241,
+ INSTANCE=242, EXPLICIT=243, DEFAULT=244, VARARG=245, UNMANAGED=246, CDECL=247,
+ STDCALL=248, THISCALL=249, FASTCALL=250, TYPE_PARAMETER=251, METHOD_TYPE_PARAMETER=252,
+ TYPEDREF=253, PARAM=254, CONSTRAINT=255, THIS=256, BASE=257, NESTER=258,
+ REF=259, ARRAY_TYPE_NO_BOUNDS=260, PTR=261, QSTRING=262, SQSTRING=263,
+ DOT=264, PLUS=265, PP_DEFINE=266, PP_UNDEF=267, PP_IFDEF=268, PP_IFNDEF=269,
+ PP_ELSE=270, PP_ENDIF=271, PP_INCLUDE=272, MRESOURCE=273, INSTR_NONE=274,
+ INSTR_VAR=275, INSTR_I=276, INSTR_I8=277, INSTR_R=278, INSTR_METHOD=279,
+ INSTR_SIG=280, INSTR_BRTARGET=281, INSTR_SWITCH=282, INSTR_TYPE=283, INSTR_STRING=284,
+ INSTR_FIELD=285, INSTR_TOK=286, DOTTEDNAME=287, ID=288, HEXBYTE=289, WS=290,
+ SINGLE_LINE_COMMENT=291, COMMENT=292, PERMISSION=293, PERMISSIONSET=294,
+ EMITBYTE=295, MAXSTACK=296, ENTRYPOINT=297, ZEROINIT=298, LOCALS=299,
EXPORT=300, OVERRIDE=301, VTENTRY=302;
public static string[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
@@ -92,48 +92,48 @@ public const int
};
public static readonly string[] ruleNames = {
- "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8",
- "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16",
- "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24",
- "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32",
- "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
- "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
- "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
- "T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
- "T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
- "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
- "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88",
- "T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96",
- "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104",
- "T__105", "T__106", "T__107", "T__108", "T__109", "T__110", "T__111",
- "T__112", "T__113", "T__114", "T__115", "T__116", "T__117", "T__118",
- "T__119", "T__120", "T__121", "T__122", "T__123", "T__124", "T__125",
- "T__126", "T__127", "T__128", "T__129", "T__130", "T__131", "T__132",
- "T__133", "T__134", "T__135", "T__136", "T__137", "T__138", "T__139",
- "T__140", "T__141", "T__142", "T__143", "T__144", "T__145", "T__146",
- "T__147", "T__148", "T__149", "T__150", "T__151", "T__152", "T__153",
- "T__154", "T__155", "T__156", "T__157", "T__158", "T__159", "T__160",
- "T__161", "T__162", "T__163", "T__164", "T__165", "T__166", "T__167",
- "T__168", "T__169", "T__170", "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
- "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
- "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UNSIGNED", "UINT8", "UINT16",
- "UINT32", "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE",
- "VALUETYPE", "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY",
- "VARIANT", "CURRENCY", "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR",
- "LPSTR", "LPWSTR", "LPTSTR", "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT",
- "INTERFACE", "SAFEARRAY", "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY",
- "LPSTRUCT", "VECTOR", "HRESULT", "CARRAY", "USERDEFINED", "RECORD", "FILETIME",
- "BLOB", "STREAM", "STORAGE", "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT",
- "CF", "CLSID", "INSTANCE", "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED",
- "CDECL", "STDCALL", "THISCALL", "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER",
- "TYPEDREF", "PARAM", "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
- "PTR", "ESC_SEQ", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
- "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
- "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
- "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
- "INSTR_FIELD", "INSTR_TOK", "IDSTART", "IDCONT", "DOTTEDNAME", "ID", "HEXBYTE",
- "WS", "SINGLE_LINE_COMMENT", "COMMENT", "PERMISSION", "PERMISSIONSET",
- "EMITBYTE", "MAXSTACK", "ENTRYPOINT", "ZEROINIT", "LOCALS", "EXPORT",
+ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8",
+ "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16",
+ "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24",
+ "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32",
+ "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
+ "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
+ "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
+ "T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
+ "T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
+ "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
+ "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88",
+ "T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96",
+ "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104",
+ "T__105", "T__106", "T__107", "T__108", "T__109", "T__110", "T__111",
+ "T__112", "T__113", "T__114", "T__115", "T__116", "T__117", "T__118",
+ "T__119", "T__120", "T__121", "T__122", "T__123", "T__124", "T__125",
+ "T__126", "T__127", "T__128", "T__129", "T__130", "T__131", "T__132",
+ "T__133", "T__134", "T__135", "T__136", "T__137", "T__138", "T__139",
+ "T__140", "T__141", "T__142", "T__143", "T__144", "T__145", "T__146",
+ "T__147", "T__148", "T__149", "T__150", "T__151", "T__152", "T__153",
+ "T__154", "T__155", "T__156", "T__157", "T__158", "T__159", "T__160",
+ "T__161", "T__162", "T__163", "T__164", "T__165", "T__166", "T__167",
+ "T__168", "T__169", "T__170", "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
+ "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
+ "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UNSIGNED", "UINT8", "UINT16",
+ "UINT32", "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE",
+ "VALUETYPE", "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY",
+ "VARIANT", "CURRENCY", "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR",
+ "LPSTR", "LPWSTR", "LPTSTR", "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT",
+ "INTERFACE", "SAFEARRAY", "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY",
+ "LPSTRUCT", "VECTOR", "HRESULT", "CARRAY", "USERDEFINED", "RECORD", "FILETIME",
+ "BLOB", "STREAM", "STORAGE", "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT",
+ "CF", "CLSID", "INSTANCE", "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED",
+ "CDECL", "STDCALL", "THISCALL", "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER",
+ "TYPEDREF", "PARAM", "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
+ "PTR", "ESC_SEQ", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
+ "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
+ "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
+ "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
+ "INSTR_FIELD", "INSTR_TOK", "IDSTART", "IDCONT", "DOTTEDNAME", "ID", "HEXBYTE",
+ "WS", "SINGLE_LINE_COMMENT", "COMMENT", "PERMISSION", "PERMISSIONSET",
+ "EMITBYTE", "MAXSTACK", "ENTRYPOINT", "ZEROINIT", "LOCALS", "EXPORT",
"OVERRIDE", "VTENTRY"
};
@@ -148,91 +148,91 @@ public CILLexer(ICharStream input, TextWriter output, TextWriter errorOutput)
}
private static readonly string[] _LiteralNames = {
- null, "'native'", "'cil'", "'optil'", "'managed'", "'forwardref'", "'preservesig'",
- "'runtime'", "'internalcall'", "'synchronized'", "'noinlining'", "'aggressiveinlining'",
- "'nooptimization'", "'aggressiveoptimization'", "'async'", "'extended'",
- "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'", "'alignment'",
- "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'", "'.language'",
- "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'", "'as'", "'.custom'",
- "'='", "'field'", "'property'", "'class'", "'extern'", "'.vtfixup'", "'['",
- "']'", "'at'", "'fromunmanaged'", "'callmostderived'", "'retainappdomain'",
- "'.vtable'", "'.namespace'", "'.class'", "'public'", "'private'", "'sealed'",
- "'abstract'", "'auto'", "'sequential'", "'unicode'", "'autochar'", "'import'",
- "'serializable'", "'windowsruntime'", "'nested'", "'family'", "'assembly'",
- "'famandassem'", "'famorassem'", "'beforefieldinit'", "'specialname'",
- "'rtspecialname'", "'flags'", "'extends'", "'implements'", "'.line'",
- "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'", "'legacy library'",
- "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'", "'()'", "'<'",
- "'>'", "'/'", "'algorithm'", "'iidparam'", "'pinned'", "'modreq'", "'modopt'",
- "'unsigned'", "'true'", "'false'", "'request'", "'demand'", "'assert'",
- "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'", "'reqmin'",
- "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'", "'noncasdemand'",
- "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'", "'mdtoken'",
- "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'", "'.interfaceimpl'",
- "'.field'", "'marshal'", "'static'", "'initonly'", "'privatescope'", "'literal'",
- "'notserialized'", "'volatile'", "'.event'", "'.addon'", "'.removeon'",
- "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'", "'in'", "'out'",
- "'opt'", "'.method'", "'final'", "'virtual'", "'strict'", "'hidebysig'",
- "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'", "'nomangle'",
- "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
- "'.cctor'", "'il'", "'init'", "'.try'", "'to'", "'filter'", "'catch'",
- "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publicKey'",
- "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'", null, null,
- null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null, "'string'",
- "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'", "'float64'",
- "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'", "'type'",
- "'object'", "'.module'", "'value'", "'valuetype'", "'void'", "'enum'",
- "'custom'", "'fixed'", "'systring'", "'array'", "'variant'", "'currency'",
- "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'", "'lpstr'", "'lpwstr'",
- "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'", "'struct'", "'interface'",
- "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'", "'method'", "'any'",
- "'lpstruct'", "'vector'", "'hresult'", "'carray'", "'userdefined'", "'record'",
- "'filetime'", "'blob'", "'stream'", "'storage'", "'streamed_object'",
- "'stored_object'", "'blob_object'", "'cf'", "'clsid'", "'instance'", "'explicit'",
- "'default'", "'vararg'", "'unmanaged'", "'cdecl'", "'stdcall'", "'thiscall'",
- "'fastcall'", "'!'", null, null, "'.param'", "'constraint'", "'.this'",
- "'.base'", "'.nester'", "'&'", null, "'*'", null, null, "'.'", "'+'",
- "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'", "'#else'", "'#endif'",
- "'#include'", "'.mresource'", null, null, null, "'ldc.i8'", null, null,
- "'calli'", null, "'switch'", null, "'ldstr'", null, "'ldtoken'", null,
- null, null, null, null, null, "'.permission'", "'.permissionset'", "'.emitbyte'",
- "'.maxstack'", "'.entrypoint'", "'.zeroinit'", "'.locals'", "'.export'",
+ null, "'native'", "'cil'", "'optil'", "'managed'", "'forwardref'", "'preservesig'",
+ "'runtime'", "'internalcall'", "'synchronized'", "'noinlining'", "'aggressiveinlining'",
+ "'nooptimization'", "'aggressiveoptimization'", "'async'", "'extended'",
+ "'volatile'", "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'",
+ "'alignment'", "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'",
+ "'.language'", "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'",
+ "'as'", "'.custom'", "'='", "'field'", "'property'", "'class'", "'extern'",
+ "'.vtfixup'", "'['", "']'", "'at'", "'fromunmanaged'", "'callmostderived'",
+ "'retainappdomain'", "'.vtable'", "'.namespace'", "'.class'", "'public'",
+ "'private'", "'sealed'", "'abstract'", "'auto'", "'sequential'", "'unicode'",
+ "'autochar'", "'import'", "'serializable'", "'windowsruntime'", "'nested'",
+ "'family'", "'assembly'", "'famandassem'", "'famorassem'", "'beforefieldinit'",
+ "'specialname'", "'rtspecialname'", "'flags'", "'extends'", "'implements'",
+ "'.line'", "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'",
+ "'legacy library'", "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'",
+ "'()'", "'<'", "'>'", "'/'", "'algorithm'", "'unsigned'", "'iidparam'",
+ "'pinned'", "'modreq'", "'modopt'", "'true'", "'false'", "'request'",
+ "'demand'", "'assert'", "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'",
+ "'reqmin'", "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'",
+ "'noncasdemand'", "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'",
+ "'mdtoken'", "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'",
+ "'.interfaceimpl'", "'.field'", "'marshal'", "'static'", "'initonly'",
+ "'privatescope'", "'literal'", "'notserialized'", "'.event'", "'.addon'",
+ "'.removeon'", "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'",
+ "'in'", "'out'", "'opt'", "'.method'", "'final'", "'virtual'", "'strict'",
+ "'hidebysig'", "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'",
+ "'nomangle'", "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
+ "'.cctor'", "'il'", "'init'", "'.try'", "'to'", "'filter'", "'catch'",
+ "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publickey'",
+ "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'", null, null,
+ null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null, "'string'",
+ "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'", "'float64'",
+ "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'", "'type'",
+ "'object'", "'.module'", "'value'", "'valuetype'", "'void'", "'enum'",
+ "'custom'", "'fixed'", "'sysstring'", "'array'", "'variant'", "'currency'",
+ "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'", "'lpstr'", "'lpwstr'",
+ "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'", "'struct'", "'interface'",
+ "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'", "'method'", "'any'",
+ "'lpstruct'", "'vector'", "'hresult'", "'carray'", "'userdefined'", "'record'",
+ "'filetime'", "'blob'", "'stream'", "'storage'", "'streamed_object'",
+ "'stored_object'", "'blob_object'", "'cf'", "'clsid'", "'instance'", "'explicit'",
+ "'default'", "'vararg'", "'unmanaged'", "'cdecl'", "'stdcall'", "'thiscall'",
+ "'fastcall'", "'!'", null, null, "'.param'", "'constraint'", "'.this'",
+ "'.base'", "'.nester'", "'&'", null, "'*'", null, null, "'.'", "'+'",
+ "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'", "'#else'", "'#endif'",
+ "'#include'", "'.mresource'", null, null, null, "'ldc.i8'", null, null,
+ "'calli'", null, "'switch'", null, "'ldstr'", null, "'ldtoken'", null,
+ null, null, null, null, null, "'.permission'", "'.permissionset'", "'.emitbyte'",
+ "'.maxstack'", "'.entrypoint'", "'.zeroinit'", "'.locals'", "'.export'",
"'.override'", "'.vtentry'"
};
private static readonly string[] _SymbolicNames = {
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
- "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
- "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UINT8", "UINT16", "UINT32",
- "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE", "VALUETYPE",
- "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY", "VARIANT", "CURRENCY",
- "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR", "LPSTR", "LPWSTR", "LPTSTR",
- "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT", "INTERFACE", "SAFEARRAY",
- "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY", "LPSTRUCT", "VECTOR", "HRESULT",
- "CARRAY", "USERDEFINED", "RECORD", "FILETIME", "BLOB", "STREAM", "STORAGE",
- "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT", "CF", "CLSID", "INSTANCE",
- "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED", "CDECL", "STDCALL", "THISCALL",
- "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER", "TYPEDREF", "PARAM",
- "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
- "PTR", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
- "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
- "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
- "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
- "INSTR_FIELD", "INSTR_TOK", "DOTTEDNAME", "ID", "HEXBYTE", "WS", "SINGLE_LINE_COMMENT",
- "COMMENT", "PERMISSION", "PERMISSIONSET", "EMITBYTE", "MAXSTACK", "ENTRYPOINT",
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
+ "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
+ "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UINT8", "UINT16", "UINT32",
+ "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE", "VALUETYPE",
+ "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY", "VARIANT", "CURRENCY",
+ "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR", "LPSTR", "LPWSTR", "LPTSTR",
+ "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT", "INTERFACE", "SAFEARRAY",
+ "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY", "LPSTRUCT", "VECTOR", "HRESULT",
+ "CARRAY", "USERDEFINED", "RECORD", "FILETIME", "BLOB", "STREAM", "STORAGE",
+ "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT", "CF", "CLSID", "INSTANCE",
+ "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED", "CDECL", "STDCALL", "THISCALL",
+ "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER", "TYPEDREF", "PARAM",
+ "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
+ "PTR", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
+ "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
+ "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
+ "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
+ "INSTR_FIELD", "INSTR_TOK", "DOTTEDNAME", "ID", "HEXBYTE", "WS", "SINGLE_LINE_COMMENT",
+ "COMMENT", "PERMISSION", "PERMISSIONSET", "EMITBYTE", "MAXSTACK", "ENTRYPOINT",
"ZEROINIT", "LOCALS", "EXPORT", "OVERRIDE", "VTENTRY"
};
public static readonly IVocabulary DefaultVocabulary = new Vocabulary(_LiteralNames, _SymbolicNames);
@@ -263,7 +263,7 @@ static CILLexer() {
}
}
private static int[] _serializedATN = {
- 4,0,302,4695,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
+ 4,0,302,4702,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,
14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,
21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,
@@ -322,75 +322,75 @@ static CILLexer() {
11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,
12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,
13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,
- 14,1,15,1,15,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,
- 17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,
- 19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,
- 21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,
- 22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,
- 23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,
- 24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,
- 26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,29,1,
- 29,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,
- 32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,35,1,35,1,35,1,
- 35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,
- 37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,
- 39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,41,1,41,1,42,1,42,1,42,1,43,1,
- 43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,44,1,
- 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,
- 44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,
- 45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,
- 47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,
- 48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,
- 50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,
- 52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,
- 54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,
- 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,
- 57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,
- 58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,
- 59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,
- 61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,
- 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,
- 64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,
- 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,
- 66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,
- 67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,
- 69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,
- 70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,
- 72,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,
- 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,
- 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,
- 77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,
- 78,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,
- 81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,
- 83,1,83,1,84,1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,
- 87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,
- 89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,
- 91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,
- 92,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,
- 95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,
- 97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,
- 99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,
- 100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,101,
- 1,101,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,102,
- 1,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,
- 1,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,
- 1,105,1,105,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,
- 1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,
- 1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,
- 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,
- 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,
- 1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,
- 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,
- 1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,
- 1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,
- 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118,
- 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,
- 1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,
+ 14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,17,1,17,1,
+ 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,
+ 19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,
+ 21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,
+ 22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,
+ 23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,
+ 24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,
+ 26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,28,1,28,1,28,1,28,1,
+ 28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,30,1,30,1,31,1,31,1,32,1,32,1,
+ 32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,
+ 34,1,34,1,34,1,34,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,
+ 37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,
+ 39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,
+ 40,1,41,1,41,1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,
+ 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,
+ 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,
+ 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,
+ 47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,
+ 48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,
+ 50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,
+ 52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,
+ 54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,
+ 55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,
+ 57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,
+ 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,
+ 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,
+ 61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,
+ 63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,
+ 64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,
+ 65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,
+ 66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,
+ 67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,
+ 68,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,
+ 70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,
+ 72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,75,1,75,1,
+ 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,
+ 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,
+ 77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,
+ 78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,
+ 80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,
+ 83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,85,1,85,1,86,1,
+ 86,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,
+ 89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,
+ 90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,
+ 92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,
+ 94,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,
+ 96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,
+ 98,1,99,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,100,
+ 1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,
+ 1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,
+ 1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,104,1,104,
+ 1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,1,105,
+ 1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,
+ 1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,
+ 1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,
+ 1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,
+ 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,
+ 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
+ 1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,
+ 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,114,1,114,1,114,
+ 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,
+ 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117,
+ 1,117,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119,1,119,
+ 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,
+ 1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,
1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,
- 1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,
- 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,125,
- 1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,126,1,126,
+ 1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124,1,124,1,124,
+ 1,124,1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,
+ 1,125,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,1,126,
1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128,
1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131,
@@ -445,52 +445,52 @@ static CILLexer() {
1,199,1,199,1,199,1,199,1,200,1,200,1,200,1,200,1,200,1,201,1,201,1,201,
1,201,1,201,1,202,1,202,1,202,1,202,1,202,1,202,1,202,1,203,1,203,1,203,
1,203,1,203,1,203,1,204,1,204,1,204,1,204,1,204,1,204,1,204,1,204,1,204,
- 1,205,1,205,1,205,1,205,1,205,1,205,1,206,1,206,1,206,1,206,1,206,1,206,
- 1,206,1,206,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,208,
- 1,208,1,208,1,208,1,208,1,208,1,208,1,208,1,209,1,209,1,209,1,209,1,209,
- 1,209,1,210,1,210,1,210,1,210,1,210,1,210,1,210,1,210,1,211,1,211,1,211,
- 1,211,1,211,1,212,1,212,1,212,1,212,1,212,1,213,1,213,1,213,1,213,1,213,
- 1,213,1,214,1,214,1,214,1,214,1,214,1,214,1,214,1,215,1,215,1,215,1,215,
- 1,215,1,215,1,215,1,216,1,216,1,216,1,216,1,216,1,216,1,216,1,216,1,216,
- 1,216,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,218,1,218,
- 1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,219,1,219,1,219,1,219,
- 1,219,1,219,1,219,1,220,1,220,1,220,1,220,1,220,1,220,1,220,1,220,1,220,
- 1,220,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,222,
- 1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,223,1,223,1,223,1,223,
- 1,223,1,224,1,224,1,224,1,224,1,224,1,224,1,225,1,225,1,225,1,225,1,225,
- 1,225,1,225,1,226,1,226,1,226,1,226,1,227,1,227,1,227,1,227,1,227,1,227,
- 1,227,1,227,1,227,1,228,1,228,1,228,1,228,1,228,1,228,1,228,1,229,1,229,
- 1,229,1,229,1,229,1,229,1,229,1,229,1,230,1,230,1,230,1,230,1,230,1,230,
- 1,230,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,
- 1,231,1,232,1,232,1,232,1,232,1,232,1,232,1,232,1,233,1,233,1,233,1,233,
- 1,233,1,233,1,233,1,233,1,233,1,234,1,234,1,234,1,234,1,234,1,235,1,235,
- 1,235,1,235,1,235,1,235,1,235,1,236,1,236,1,236,1,236,1,236,1,236,1,236,
- 1,236,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,
- 1,237,1,237,1,237,1,237,1,237,1,238,1,238,1,238,1,238,1,238,1,238,1,238,
- 1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,239,1,239,1,239,1,239,1,239,
- 1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,240,1,240,1,240,1,241,1,241,
- 1,241,1,241,1,241,1,241,1,242,1,242,1,242,1,242,1,242,1,242,1,242,1,242,
- 1,242,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,244,1,244,
- 1,244,1,244,1,244,1,244,1,244,1,244,1,245,1,245,1,245,1,245,1,245,1,245,
- 1,245,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,247,
- 1,247,1,247,1,247,1,247,1,247,1,248,1,248,1,248,1,248,1,248,1,248,1,248,
- 1,248,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,250,1,250,
- 1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,251,1,251,1,252,1,252,1,252,
- 1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,
- 1,253,1,253,3,253,2702,8,253,1,254,1,254,1,254,1,254,1,254,1,254,1,254,
- 1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,256,
- 1,256,1,256,1,256,1,256,1,256,1,257,1,257,1,257,1,257,1,257,1,257,1,258,
- 1,258,1,258,1,258,1,258,1,258,1,258,1,258,1,259,1,259,1,260,1,260,1,260,
- 1,261,1,261,1,262,1,262,1,262,1,262,3,262,2753,8,262,1,262,3,262,2756,
- 8,262,1,262,3,262,2759,8,262,1,262,3,262,2762,8,262,1,263,1,263,1,263,
- 5,263,2767,8,263,10,263,12,263,2770,9,263,1,263,1,263,1,264,1,264,1,264,
- 5,264,2777,8,264,10,264,12,264,2780,9,264,1,264,1,264,1,265,1,265,1,266,
- 1,266,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,268,1,268,1,268,
- 1,268,1,268,1,268,1,268,1,269,1,269,1,269,1,269,1,269,1,269,1,269,1,270,
- 1,270,1,270,1,270,1,270,1,270,1,270,1,270,1,271,1,271,1,271,1,271,1,271,
- 1,271,1,272,1,272,1,272,1,272,1,272,1,272,1,272,1,273,1,273,1,273,1,273,
- 1,273,1,273,1,273,1,273,1,273,1,274,1,274,1,274,1,274,1,274,1,274,1,274,
- 1,274,1,274,1,274,1,274,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
+ 1,204,1,205,1,205,1,205,1,205,1,205,1,205,1,206,1,206,1,206,1,206,1,206,
+ 1,206,1,206,1,206,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,207,1,207,
+ 1,208,1,208,1,208,1,208,1,208,1,208,1,208,1,208,1,209,1,209,1,209,1,209,
+ 1,209,1,209,1,210,1,210,1,210,1,210,1,210,1,210,1,210,1,210,1,211,1,211,
+ 1,211,1,211,1,211,1,212,1,212,1,212,1,212,1,212,1,213,1,213,1,213,1,213,
+ 1,213,1,213,1,214,1,214,1,214,1,214,1,214,1,214,1,214,1,215,1,215,1,215,
+ 1,215,1,215,1,215,1,215,1,216,1,216,1,216,1,216,1,216,1,216,1,216,1,216,
+ 1,216,1,216,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,217,1,218,
+ 1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,218,1,219,1,219,1,219,
+ 1,219,1,219,1,219,1,219,1,220,1,220,1,220,1,220,1,220,1,220,1,220,1,220,
+ 1,220,1,220,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,1,221,
+ 1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,222,1,223,1,223,1,223,
+ 1,223,1,223,1,224,1,224,1,224,1,224,1,224,1,224,1,225,1,225,1,225,1,225,
+ 1,225,1,225,1,225,1,226,1,226,1,226,1,226,1,227,1,227,1,227,1,227,1,227,
+ 1,227,1,227,1,227,1,227,1,228,1,228,1,228,1,228,1,228,1,228,1,228,1,229,
+ 1,229,1,229,1,229,1,229,1,229,1,229,1,229,1,230,1,230,1,230,1,230,1,230,
+ 1,230,1,230,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,1,231,
+ 1,231,1,231,1,232,1,232,1,232,1,232,1,232,1,232,1,232,1,233,1,233,1,233,
+ 1,233,1,233,1,233,1,233,1,233,1,233,1,234,1,234,1,234,1,234,1,234,1,235,
+ 1,235,1,235,1,235,1,235,1,235,1,235,1,236,1,236,1,236,1,236,1,236,1,236,
+ 1,236,1,236,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,1,237,
+ 1,237,1,237,1,237,1,237,1,237,1,237,1,238,1,238,1,238,1,238,1,238,1,238,
+ 1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,238,1,239,1,239,1,239,1,239,
+ 1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,239,1,240,1,240,1,240,1,241,
+ 1,241,1,241,1,241,1,241,1,241,1,242,1,242,1,242,1,242,1,242,1,242,1,242,
+ 1,242,1,242,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,243,1,244,
+ 1,244,1,244,1,244,1,244,1,244,1,244,1,244,1,245,1,245,1,245,1,245,1,245,
+ 1,245,1,245,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,1,246,
+ 1,247,1,247,1,247,1,247,1,247,1,247,1,248,1,248,1,248,1,248,1,248,1,248,
+ 1,248,1,248,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,249,1,250,
+ 1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,250,1,251,1,251,1,252,1,252,
+ 1,252,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,1,253,
+ 1,253,1,253,1,253,3,253,2703,8,253,1,254,1,254,1,254,1,254,1,254,1,254,
+ 1,254,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,
+ 1,256,1,256,1,256,1,256,1,256,1,256,1,257,1,257,1,257,1,257,1,257,1,257,
+ 1,258,1,258,1,258,1,258,1,258,1,258,1,258,1,258,1,259,1,259,1,260,1,260,
+ 1,260,1,261,1,261,1,262,1,262,1,262,1,262,3,262,2754,8,262,1,262,3,262,
+ 2757,8,262,1,262,3,262,2760,8,262,1,262,3,262,2763,8,262,1,263,1,263,1,
+ 263,5,263,2768,8,263,10,263,12,263,2771,9,263,1,263,1,263,1,264,1,264,
+ 1,264,5,264,2778,8,264,10,264,12,264,2781,9,264,1,264,1,264,1,265,1,265,
+ 1,266,1,266,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,267,1,268,1,268,
+ 1,268,1,268,1,268,1,268,1,268,1,269,1,269,1,269,1,269,1,269,1,269,1,269,
+ 1,270,1,270,1,270,1,270,1,270,1,270,1,270,1,270,1,271,1,271,1,271,1,271,
+ 1,271,1,271,1,272,1,272,1,272,1,272,1,272,1,272,1,272,1,273,1,273,1,273,
+ 1,273,1,273,1,273,1,273,1,273,1,273,1,274,1,274,1,274,1,274,1,274,1,274,
+ 1,274,1,274,1,274,1,274,1,274,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
@@ -588,22 +588,23 @@ static CILLexer() {
1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
- 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,3,275,4033,
- 8,275,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
+ 1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,1,275,
+ 1,275,1,275,1,275,1,275,1,275,3,275,4040,8,275,1,276,1,276,1,276,1,276,
+ 1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,1,276,
- 1,276,1,276,1,276,1,276,1,276,3,276,4111,8,276,1,277,1,277,1,277,1,277,
+ 3,276,4118,8,276,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,
- 1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,1,277,3,277,
- 4140,8,277,1,278,1,278,1,278,1,278,1,278,1,278,1,278,1,279,1,279,1,279,
- 1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,3,279,4161,8,279,
+ 1,277,1,277,1,277,1,277,1,277,1,277,3,277,4147,8,277,1,278,1,278,1,278,
+ 1,278,1,278,1,278,1,278,1,279,1,279,1,279,1,279,1,279,1,279,1,279,1,279,
+ 1,279,1,279,1,279,1,279,3,279,4168,8,279,1,280,1,280,1,280,1,280,1,280,
1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,
1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,
- 1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,1,280,3,280,
- 4198,8,280,1,281,1,281,1,281,1,281,1,281,1,281,1,282,1,282,1,282,1,282,
+ 1,280,1,280,1,280,1,280,1,280,1,280,3,280,4205,8,280,1,281,1,281,1,281,
+ 1,281,1,281,1,281,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
@@ -616,9 +617,8 @@ static CILLexer() {
1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,
- 1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,1,282,3,282,4364,
- 8,282,1,283,1,283,1,283,1,283,1,283,1,283,1,283,1,284,1,284,1,284,1,284,
- 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
+ 1,282,1,282,1,282,1,282,1,282,3,282,4371,8,282,1,283,1,283,1,283,1,283,
+ 1,283,1,283,1,283,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
@@ -627,1362 +627,1365 @@ static CILLexer() {
1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,
- 1,284,1,284,3,284,4487,8,284,1,285,1,285,1,285,1,285,1,285,1,285,1,286,
+ 1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,1,284,3,284,4494,8,284,
+ 1,285,1,285,1,285,1,285,1,285,1,285,1,286,1,286,1,286,1,286,1,286,1,286,
1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,
1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,
- 1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,1,286,3,286,4530,
- 8,286,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,287,1,288,1,288,1,289,
- 1,289,1,290,1,290,1,290,4,290,4547,8,290,11,290,12,290,4548,1,290,1,290,
- 1,291,1,291,5,291,4555,8,291,10,291,12,291,4558,9,291,1,292,1,292,1,292,
- 1,293,1,293,1,293,1,293,1,294,1,294,1,294,1,294,5,294,4571,8,294,10,294,
- 12,294,4574,9,294,1,294,1,294,1,295,1,295,1,295,1,295,5,295,4582,8,295,
- 10,295,12,295,4585,9,295,1,295,1,295,1,295,1,295,1,295,1,296,1,296,1,296,
- 1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,297,1,297,1,297,
- 1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,
- 1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,298,1,299,1,299,
- 1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,299,1,300,1,300,1,300,1,300,
- 1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,301,1,301,1,301,1,301,
- 1,301,1,301,1,301,1,301,1,301,1,301,1,302,1,302,1,302,1,302,1,302,1,302,
- 1,302,1,302,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,303,1,304,1,304,
- 1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,304,1,305,1,305,1,305,1,305,
- 1,305,1,305,1,305,1,305,1,305,1,4583,0,306,1,1,3,2,5,3,7,4,9,5,11,6,13,
- 7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,
- 39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,
- 63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,
- 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,
- 109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,
- 129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,
- 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,
- 169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,
- 189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,
- 104,209,105,211,106,213,107,215,108,217,109,219,110,221,111,223,112,225,
- 113,227,114,229,115,231,116,233,117,235,118,237,119,239,120,241,121,243,
- 122,245,123,247,124,249,125,251,126,253,127,255,128,257,129,259,130,261,
- 131,263,132,265,133,267,134,269,135,271,136,273,137,275,138,277,139,279,
- 140,281,141,283,142,285,143,287,144,289,145,291,146,293,147,295,148,297,
- 149,299,150,301,151,303,152,305,153,307,154,309,155,311,156,313,157,315,
- 158,317,159,319,160,321,161,323,162,325,163,327,164,329,165,331,166,333,
- 167,335,168,337,169,339,170,341,171,343,172,345,173,347,174,349,175,351,
- 176,353,177,355,178,357,179,359,180,361,181,363,182,365,183,367,184,369,
- 185,371,186,373,187,375,188,377,0,379,189,381,190,383,191,385,192,387,
- 193,389,194,391,195,393,196,395,197,397,198,399,199,401,200,403,201,405,
- 202,407,203,409,204,411,205,413,206,415,207,417,208,419,209,421,210,423,
- 211,425,212,427,213,429,214,431,215,433,216,435,217,437,218,439,219,441,
- 220,443,221,445,222,447,223,449,224,451,225,453,226,455,227,457,228,459,
- 229,461,230,463,231,465,232,467,233,469,234,471,235,473,236,475,237,477,
- 238,479,239,481,240,483,241,485,242,487,243,489,244,491,245,493,246,495,
- 247,497,248,499,249,501,250,503,251,505,252,507,253,509,254,511,255,513,
- 256,515,257,517,258,519,259,521,260,523,261,525,0,527,262,529,263,531,
- 264,533,265,535,266,537,267,539,268,541,269,543,270,545,271,547,272,549,
- 273,551,274,553,275,555,276,557,277,559,278,561,279,563,280,565,281,567,
- 282,569,283,571,284,573,285,575,286,577,0,579,0,581,287,583,288,585,289,
- 587,290,589,291,591,292,593,293,595,294,597,295,599,296,601,297,603,298,
- 605,299,607,300,609,301,611,302,1,0,12,3,0,48,57,65,70,97,102,1,0,48,57,
- 2,0,69,69,101,101,2,0,43,43,45,45,11,0,34,34,39,39,47,48,63,63,92,92,97,
- 98,102,102,110,110,114,114,116,116,118,118,1,0,48,55,4,0,10,10,13,13,34,
- 34,92,92,4,0,10,10,13,13,39,39,92,92,4,0,35,36,63,90,95,95,97,122,4,0,
- 35,36,48,57,63,90,95,122,3,0,9,10,13,13,32,32,2,0,10,10,13,13,4947,0,1,
- 1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,
- 13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,
- 0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,
- 0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,
- 1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,
- 0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,
- 1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,
- 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,
- 1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,
- 0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,
- 0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,
- 0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,
- 0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,
- 0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,
- 0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,
- 0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,
- 0,0,171,1,0,0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,
- 0,0,181,1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,
- 0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,
- 0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,
- 0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,
- 0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,
- 0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,
- 0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,
- 0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,
- 0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,
- 0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,
- 0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,
- 0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,
- 0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,
- 0,0,311,1,0,0,0,0,313,1,0,0,0,0,315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,
- 0,0,321,1,0,0,0,0,323,1,0,0,0,0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,
- 0,0,331,1,0,0,0,0,333,1,0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,
- 0,0,341,1,0,0,0,0,343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,
- 0,0,351,1,0,0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,
- 0,0,361,1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0,0,
- 0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1,0,0,0,0,379,1,0,0,0,0,381,1,0,0,
- 0,0,383,1,0,0,0,0,385,1,0,0,0,0,387,1,0,0,0,0,389,1,0,0,0,0,391,1,0,0,
- 0,0,393,1,0,0,0,0,395,1,0,0,0,0,397,1,0,0,0,0,399,1,0,0,0,0,401,1,0,0,
- 0,0,403,1,0,0,0,0,405,1,0,0,0,0,407,1,0,0,0,0,409,1,0,0,0,0,411,1,0,0,
- 0,0,413,1,0,0,0,0,415,1,0,0,0,0,417,1,0,0,0,0,419,1,0,0,0,0,421,1,0,0,
- 0,0,423,1,0,0,0,0,425,1,0,0,0,0,427,1,0,0,0,0,429,1,0,0,0,0,431,1,0,0,
- 0,0,433,1,0,0,0,0,435,1,0,0,0,0,437,1,0,0,0,0,439,1,0,0,0,0,441,1,0,0,
- 0,0,443,1,0,0,0,0,445,1,0,0,0,0,447,1,0,0,0,0,449,1,0,0,0,0,451,1,0,0,
- 0,0,453,1,0,0,0,0,455,1,0,0,0,0,457,1,0,0,0,0,459,1,0,0,0,0,461,1,0,0,
- 0,0,463,1,0,0,0,0,465,1,0,0,0,0,467,1,0,0,0,0,469,1,0,0,0,0,471,1,0,0,
- 0,0,473,1,0,0,0,0,475,1,0,0,0,0,477,1,0,0,0,0,479,1,0,0,0,0,481,1,0,0,
- 0,0,483,1,0,0,0,0,485,1,0,0,0,0,487,1,0,0,0,0,489,1,0,0,0,0,491,1,0,0,
- 0,0,493,1,0,0,0,0,495,1,0,0,0,0,497,1,0,0,0,0,499,1,0,0,0,0,501,1,0,0,
- 0,0,503,1,0,0,0,0,505,1,0,0,0,0,507,1,0,0,0,0,509,1,0,0,0,0,511,1,0,0,
- 0,0,513,1,0,0,0,0,515,1,0,0,0,0,517,1,0,0,0,0,519,1,0,0,0,0,521,1,0,0,
- 0,0,523,1,0,0,0,0,527,1,0,0,0,0,529,1,0,0,0,0,531,1,0,0,0,0,533,1,0,0,
- 0,0,535,1,0,0,0,0,537,1,0,0,0,0,539,1,0,0,0,0,541,1,0,0,0,0,543,1,0,0,
- 0,0,545,1,0,0,0,0,547,1,0,0,0,0,549,1,0,0,0,0,551,1,0,0,0,0,553,1,0,0,
- 0,0,555,1,0,0,0,0,557,1,0,0,0,0,559,1,0,0,0,0,561,1,0,0,0,0,563,1,0,0,
- 0,0,565,1,0,0,0,0,567,1,0,0,0,0,569,1,0,0,0,0,571,1,0,0,0,0,573,1,0,0,
- 0,0,575,1,0,0,0,0,581,1,0,0,0,0,583,1,0,0,0,0,585,1,0,0,0,0,587,1,0,0,
- 0,0,589,1,0,0,0,0,591,1,0,0,0,0,593,1,0,0,0,0,595,1,0,0,0,0,597,1,0,0,
- 0,0,599,1,0,0,0,0,601,1,0,0,0,0,603,1,0,0,0,0,605,1,0,0,0,0,607,1,0,0,
- 0,0,609,1,0,0,0,0,611,1,0,0,0,1,613,1,0,0,0,3,620,1,0,0,0,5,624,1,0,0,
- 0,7,630,1,0,0,0,9,638,1,0,0,0,11,649,1,0,0,0,13,661,1,0,0,0,15,669,1,0,
- 0,0,17,682,1,0,0,0,19,695,1,0,0,0,21,706,1,0,0,0,23,725,1,0,0,0,25,740,
- 1,0,0,0,27,763,1,0,0,0,29,769,1,0,0,0,31,778,1,0,0,0,33,780,1,0,0,0,35,
- 782,1,0,0,0,37,793,1,0,0,0,39,803,1,0,0,0,41,809,1,0,0,0,43,819,1,0,0,
- 0,45,830,1,0,0,0,47,844,1,0,0,0,49,854,1,0,0,0,51,864,1,0,0,0,53,874,1,
- 0,0,0,55,876,1,0,0,0,57,886,1,0,0,0,59,888,1,0,0,0,61,890,1,0,0,0,63,892,
- 1,0,0,0,65,901,1,0,0,0,67,904,1,0,0,0,69,912,1,0,0,0,71,914,1,0,0,0,73,
- 920,1,0,0,0,75,929,1,0,0,0,77,935,1,0,0,0,79,942,1,0,0,0,81,951,1,0,0,
- 0,83,953,1,0,0,0,85,955,1,0,0,0,87,958,1,0,0,0,89,972,1,0,0,0,91,988,1,
- 0,0,0,93,1004,1,0,0,0,95,1012,1,0,0,0,97,1023,1,0,0,0,99,1030,1,0,0,0,
- 101,1037,1,0,0,0,103,1045,1,0,0,0,105,1052,1,0,0,0,107,1061,1,0,0,0,109,
- 1066,1,0,0,0,111,1077,1,0,0,0,113,1085,1,0,0,0,115,1094,1,0,0,0,117,1101,
- 1,0,0,0,119,1114,1,0,0,0,121,1129,1,0,0,0,123,1136,1,0,0,0,125,1143,1,
- 0,0,0,127,1152,1,0,0,0,129,1164,1,0,0,0,131,1175,1,0,0,0,133,1191,1,0,
- 0,0,135,1203,1,0,0,0,137,1217,1,0,0,0,139,1223,1,0,0,0,141,1231,1,0,0,
- 0,143,1242,1,0,0,0,145,1248,1,0,0,0,147,1254,1,0,0,0,149,1256,1,0,0,0,
- 151,1267,1,0,0,0,153,1280,1,0,0,0,155,1291,1,0,0,0,157,1306,1,0,0,0,159,
- 1310,1,0,0,0,161,1316,1,0,0,0,163,1320,1,0,0,0,165,1326,1,0,0,0,167,1336,
- 1,0,0,0,169,1339,1,0,0,0,171,1341,1,0,0,0,173,1343,1,0,0,0,175,1345,1,
- 0,0,0,177,1355,1,0,0,0,179,1364,1,0,0,0,181,1371,1,0,0,0,183,1378,1,0,
- 0,0,185,1385,1,0,0,0,187,1394,1,0,0,0,189,1399,1,0,0,0,191,1405,1,0,0,
- 0,193,1413,1,0,0,0,195,1420,1,0,0,0,197,1427,1,0,0,0,199,1432,1,0,0,0,
- 201,1443,1,0,0,0,203,1453,1,0,0,0,205,1466,1,0,0,0,207,1473,1,0,0,0,209,
- 1480,1,0,0,0,211,1490,1,0,0,0,213,1502,1,0,0,0,215,1513,1,0,0,0,217,1526,
- 1,0,0,0,219,1543,1,0,0,0,221,1561,1,0,0,0,223,1570,1,0,0,0,225,1578,1,
- 0,0,0,227,1580,1,0,0,0,229,1590,1,0,0,0,231,1596,1,0,0,0,233,1602,1,0,
- 0,0,235,1608,1,0,0,0,237,1613,1,0,0,0,239,1628,1,0,0,0,241,1635,1,0,0,
- 0,243,1643,1,0,0,0,245,1650,1,0,0,0,247,1659,1,0,0,0,249,1672,1,0,0,0,
- 251,1680,1,0,0,0,253,1694,1,0,0,0,255,1703,1,0,0,0,257,1710,1,0,0,0,259,
- 1717,1,0,0,0,261,1727,1,0,0,0,263,1733,1,0,0,0,265,1740,1,0,0,0,267,1750,
- 1,0,0,0,269,1755,1,0,0,0,271,1760,1,0,0,0,273,1763,1,0,0,0,275,1767,1,
- 0,0,0,277,1771,1,0,0,0,279,1779,1,0,0,0,281,1785,1,0,0,0,283,1793,1,0,
- 0,0,285,1800,1,0,0,0,287,1810,1,0,0,0,289,1818,1,0,0,0,291,1831,1,0,0,
- 0,293,1841,1,0,0,0,295,1853,1,0,0,0,297,1862,1,0,0,0,299,1870,1,0,0,0,
- 301,1877,1,0,0,0,303,1885,1,0,0,0,305,1888,1,0,0,0,307,1892,1,0,0,0,309,
- 1905,1,0,0,0,311,1912,1,0,0,0,313,1915,1,0,0,0,315,1920,1,0,0,0,317,1925,
- 1,0,0,0,319,1928,1,0,0,0,321,1935,1,0,0,0,323,1941,1,0,0,0,325,1949,1,
- 0,0,0,327,1955,1,0,0,0,329,1963,1,0,0,0,331,1969,1,0,0,0,333,1973,1,0,
- 0,0,335,1984,1,0,0,0,337,1989,1,0,0,0,339,1997,1,0,0,0,341,2013,1,0,0,
- 0,343,2024,1,0,0,0,345,2042,1,0,0,0,347,2060,1,0,0,0,349,2114,1,0,0,0,
- 351,2117,1,0,0,0,353,2121,1,0,0,0,355,2126,1,0,0,0,357,2134,1,0,0,0,359,
- 2149,1,0,0,0,361,2151,1,0,0,0,363,2158,1,0,0,0,365,2163,1,0,0,0,367,2168,
- 1,0,0,0,369,2174,1,0,0,0,371,2180,1,0,0,0,373,2186,1,0,0,0,375,2194,1,
- 0,0,0,377,2202,1,0,0,0,379,2211,1,0,0,0,381,2217,1,0,0,0,383,2224,1,0,
- 0,0,385,2231,1,0,0,0,387,2238,1,0,0,0,389,2242,1,0,0,0,391,2247,1,0,0,
- 0,393,2252,1,0,0,0,395,2259,1,0,0,0,397,2267,1,0,0,0,399,2273,1,0,0,0,
- 401,2283,1,0,0,0,403,2288,1,0,0,0,405,2293,1,0,0,0,407,2300,1,0,0,0,409,
- 2306,1,0,0,0,411,2315,1,0,0,0,413,2321,1,0,0,0,415,2329,1,0,0,0,417,2338,
- 1,0,0,0,419,2346,1,0,0,0,421,2352,1,0,0,0,423,2360,1,0,0,0,425,2365,1,
- 0,0,0,427,2370,1,0,0,0,429,2376,1,0,0,0,431,2383,1,0,0,0,433,2390,1,0,
- 0,0,435,2400,1,0,0,0,437,2409,1,0,0,0,439,2419,1,0,0,0,441,2426,1,0,0,
- 0,443,2436,1,0,0,0,445,2446,1,0,0,0,447,2455,1,0,0,0,449,2460,1,0,0,0,
- 451,2466,1,0,0,0,453,2473,1,0,0,0,455,2477,1,0,0,0,457,2486,1,0,0,0,459,
- 2493,1,0,0,0,461,2501,1,0,0,0,463,2508,1,0,0,0,465,2520,1,0,0,0,467,2527,
- 1,0,0,0,469,2536,1,0,0,0,471,2541,1,0,0,0,473,2548,1,0,0,0,475,2556,1,
- 0,0,0,477,2572,1,0,0,0,479,2586,1,0,0,0,481,2598,1,0,0,0,483,2601,1,0,
- 0,0,485,2607,1,0,0,0,487,2616,1,0,0,0,489,2625,1,0,0,0,491,2633,1,0,0,
- 0,493,2640,1,0,0,0,495,2650,1,0,0,0,497,2656,1,0,0,0,499,2664,1,0,0,0,
- 501,2673,1,0,0,0,503,2682,1,0,0,0,505,2684,1,0,0,0,507,2701,1,0,0,0,509,
- 2703,1,0,0,0,511,2710,1,0,0,0,513,2721,1,0,0,0,515,2727,1,0,0,0,517,2733,
- 1,0,0,0,519,2741,1,0,0,0,521,2743,1,0,0,0,523,2746,1,0,0,0,525,2748,1,
- 0,0,0,527,2763,1,0,0,0,529,2773,1,0,0,0,531,2783,1,0,0,0,533,2785,1,0,
- 0,0,535,2787,1,0,0,0,537,2795,1,0,0,0,539,2802,1,0,0,0,541,2809,1,0,0,
- 0,543,2817,1,0,0,0,545,2823,1,0,0,0,547,2830,1,0,0,0,549,2839,1,0,0,0,
- 551,4032,1,0,0,0,553,4110,1,0,0,0,555,4139,1,0,0,0,557,4141,1,0,0,0,559,
- 4160,1,0,0,0,561,4197,1,0,0,0,563,4199,1,0,0,0,565,4363,1,0,0,0,567,4365,
- 1,0,0,0,569,4486,1,0,0,0,571,4488,1,0,0,0,573,4529,1,0,0,0,575,4531,1,
- 0,0,0,577,4539,1,0,0,0,579,4541,1,0,0,0,581,4546,1,0,0,0,583,4552,1,0,
- 0,0,585,4559,1,0,0,0,587,4562,1,0,0,0,589,4566,1,0,0,0,591,4577,1,0,0,
- 0,593,4591,1,0,0,0,595,4603,1,0,0,0,597,4618,1,0,0,0,599,4628,1,0,0,0,
- 601,4638,1,0,0,0,603,4650,1,0,0,0,605,4660,1,0,0,0,607,4668,1,0,0,0,609,
- 4676,1,0,0,0,611,4686,1,0,0,0,613,614,5,110,0,0,614,615,5,97,0,0,615,616,
- 5,116,0,0,616,617,5,105,0,0,617,618,5,118,0,0,618,619,5,101,0,0,619,2,
- 1,0,0,0,620,621,5,99,0,0,621,622,5,105,0,0,622,623,5,108,0,0,623,4,1,0,
- 0,0,624,625,5,111,0,0,625,626,5,112,0,0,626,627,5,116,0,0,627,628,5,105,
- 0,0,628,629,5,108,0,0,629,6,1,0,0,0,630,631,5,109,0,0,631,632,5,97,0,0,
- 632,633,5,110,0,0,633,634,5,97,0,0,634,635,5,103,0,0,635,636,5,101,0,0,
- 636,637,5,100,0,0,637,8,1,0,0,0,638,639,5,102,0,0,639,640,5,111,0,0,640,
- 641,5,114,0,0,641,642,5,119,0,0,642,643,5,97,0,0,643,644,5,114,0,0,644,
- 645,5,100,0,0,645,646,5,114,0,0,646,647,5,101,0,0,647,648,5,102,0,0,648,
- 10,1,0,0,0,649,650,5,112,0,0,650,651,5,114,0,0,651,652,5,101,0,0,652,653,
- 5,115,0,0,653,654,5,101,0,0,654,655,5,114,0,0,655,656,5,118,0,0,656,657,
- 5,101,0,0,657,658,5,115,0,0,658,659,5,105,0,0,659,660,5,103,0,0,660,12,
- 1,0,0,0,661,662,5,114,0,0,662,663,5,117,0,0,663,664,5,110,0,0,664,665,
- 5,116,0,0,665,666,5,105,0,0,666,667,5,109,0,0,667,668,5,101,0,0,668,14,
- 1,0,0,0,669,670,5,105,0,0,670,671,5,110,0,0,671,672,5,116,0,0,672,673,
- 5,101,0,0,673,674,5,114,0,0,674,675,5,110,0,0,675,676,5,97,0,0,676,677,
- 5,108,0,0,677,678,5,99,0,0,678,679,5,97,0,0,679,680,5,108,0,0,680,681,
- 5,108,0,0,681,16,1,0,0,0,682,683,5,115,0,0,683,684,5,121,0,0,684,685,5,
- 110,0,0,685,686,5,99,0,0,686,687,5,104,0,0,687,688,5,114,0,0,688,689,5,
- 111,0,0,689,690,5,110,0,0,690,691,5,105,0,0,691,692,5,122,0,0,692,693,
- 5,101,0,0,693,694,5,100,0,0,694,18,1,0,0,0,695,696,5,110,0,0,696,697,5,
- 111,0,0,697,698,5,105,0,0,698,699,5,110,0,0,699,700,5,108,0,0,700,701,
- 5,105,0,0,701,702,5,110,0,0,702,703,5,105,0,0,703,704,5,110,0,0,704,705,
- 5,103,0,0,705,20,1,0,0,0,706,707,5,97,0,0,707,708,5,103,0,0,708,709,5,
- 103,0,0,709,710,5,114,0,0,710,711,5,101,0,0,711,712,5,115,0,0,712,713,
- 5,115,0,0,713,714,5,105,0,0,714,715,5,118,0,0,715,716,5,101,0,0,716,717,
- 5,105,0,0,717,718,5,110,0,0,718,719,5,108,0,0,719,720,5,105,0,0,720,721,
- 5,110,0,0,721,722,5,105,0,0,722,723,5,110,0,0,723,724,5,103,0,0,724,22,
- 1,0,0,0,725,726,5,110,0,0,726,727,5,111,0,0,727,728,5,111,0,0,728,729,
- 5,112,0,0,729,730,5,116,0,0,730,731,5,105,0,0,731,732,5,109,0,0,732,733,
- 5,105,0,0,733,734,5,122,0,0,734,735,5,97,0,0,735,736,5,116,0,0,736,737,
- 5,105,0,0,737,738,5,111,0,0,738,739,5,110,0,0,739,24,1,0,0,0,740,741,5,
- 97,0,0,741,742,5,103,0,0,742,743,5,103,0,0,743,744,5,114,0,0,744,745,5,
- 101,0,0,745,746,5,115,0,0,746,747,5,115,0,0,747,748,5,105,0,0,748,749,
- 5,118,0,0,749,750,5,101,0,0,750,751,5,111,0,0,751,752,5,112,0,0,752,753,
- 5,116,0,0,753,754,5,105,0,0,754,755,5,109,0,0,755,756,5,105,0,0,756,757,
- 5,122,0,0,757,758,5,97,0,0,758,759,5,116,0,0,759,760,5,105,0,0,760,761,
- 5,111,0,0,761,762,5,110,0,0,762,26,1,0,0,0,763,764,5,97,0,0,764,765,5,
- 115,0,0,765,766,5,121,0,0,766,767,5,110,0,0,767,768,5,99,0,0,768,28,1,
- 0,0,0,769,770,5,101,0,0,770,771,5,120,0,0,771,772,5,116,0,0,772,773,5,
- 101,0,0,773,774,5,110,0,0,774,775,5,100,0,0,775,776,5,101,0,0,776,777,
- 5,100,0,0,777,30,1,0,0,0,778,779,5,123,0,0,779,32,1,0,0,0,780,781,5,125,
- 0,0,781,34,1,0,0,0,782,783,5,46,0,0,783,784,5,115,0,0,784,785,5,117,0,
- 0,785,786,5,98,0,0,786,787,5,115,0,0,787,788,5,121,0,0,788,789,5,115,0,
- 0,789,790,5,116,0,0,790,791,5,101,0,0,791,792,5,109,0,0,792,36,1,0,0,0,
- 793,794,5,46,0,0,794,795,5,99,0,0,795,796,5,111,0,0,796,797,5,114,0,0,
- 797,798,5,102,0,0,798,799,5,108,0,0,799,800,5,97,0,0,800,801,5,103,0,0,
- 801,802,5,115,0,0,802,38,1,0,0,0,803,804,5,46,0,0,804,805,5,102,0,0,805,
- 806,5,105,0,0,806,807,5,108,0,0,807,808,5,101,0,0,808,40,1,0,0,0,809,810,
- 5,97,0,0,810,811,5,108,0,0,811,812,5,105,0,0,812,813,5,103,0,0,813,814,
- 5,110,0,0,814,815,5,109,0,0,815,816,5,101,0,0,816,817,5,110,0,0,817,818,
- 5,116,0,0,818,42,1,0,0,0,819,820,5,46,0,0,820,821,5,105,0,0,821,822,5,
- 109,0,0,822,823,5,97,0,0,823,824,5,103,0,0,824,825,5,101,0,0,825,826,5,
- 98,0,0,826,827,5,97,0,0,827,828,5,115,0,0,828,829,5,101,0,0,829,44,1,0,
- 0,0,830,831,5,46,0,0,831,832,5,115,0,0,832,833,5,116,0,0,833,834,5,97,
- 0,0,834,835,5,99,0,0,835,836,5,107,0,0,836,837,5,114,0,0,837,838,5,101,
- 0,0,838,839,5,115,0,0,839,840,5,101,0,0,840,841,5,114,0,0,841,842,5,118,
- 0,0,842,843,5,101,0,0,843,46,1,0,0,0,844,845,5,46,0,0,845,846,5,97,0,0,
- 846,847,5,115,0,0,847,848,5,115,0,0,848,849,5,101,0,0,849,850,5,109,0,
- 0,850,851,5,98,0,0,851,852,5,108,0,0,852,853,5,121,0,0,853,48,1,0,0,0,
- 854,855,5,46,0,0,855,856,5,109,0,0,856,857,5,115,0,0,857,858,5,99,0,0,
- 858,859,5,111,0,0,859,860,5,114,0,0,860,861,5,108,0,0,861,862,5,105,0,
- 0,862,863,5,98,0,0,863,50,1,0,0,0,864,865,5,46,0,0,865,866,5,108,0,0,866,
- 867,5,97,0,0,867,868,5,110,0,0,868,869,5,103,0,0,869,870,5,117,0,0,870,
- 871,5,97,0,0,871,872,5,103,0,0,872,873,5,101,0,0,873,52,1,0,0,0,874,875,
- 5,44,0,0,875,54,1,0,0,0,876,877,5,46,0,0,877,878,5,116,0,0,878,879,5,121,
- 0,0,879,880,5,112,0,0,880,881,5,101,0,0,881,882,5,108,0,0,882,883,5,105,
- 0,0,883,884,5,115,0,0,884,885,5,116,0,0,885,56,1,0,0,0,886,887,5,40,0,
- 0,887,58,1,0,0,0,888,889,5,41,0,0,889,60,1,0,0,0,890,891,5,59,0,0,891,
- 62,1,0,0,0,892,893,5,46,0,0,893,894,5,116,0,0,894,895,5,121,0,0,895,896,
- 5,112,0,0,896,897,5,101,0,0,897,898,5,100,0,0,898,899,5,101,0,0,899,900,
- 5,102,0,0,900,64,1,0,0,0,901,902,5,97,0,0,902,903,5,115,0,0,903,66,1,0,
- 0,0,904,905,5,46,0,0,905,906,5,99,0,0,906,907,5,117,0,0,907,908,5,115,
- 0,0,908,909,5,116,0,0,909,910,5,111,0,0,910,911,5,109,0,0,911,68,1,0,0,
- 0,912,913,5,61,0,0,913,70,1,0,0,0,914,915,5,102,0,0,915,916,5,105,0,0,
- 916,917,5,101,0,0,917,918,5,108,0,0,918,919,5,100,0,0,919,72,1,0,0,0,920,
- 921,5,112,0,0,921,922,5,114,0,0,922,923,5,111,0,0,923,924,5,112,0,0,924,
- 925,5,101,0,0,925,926,5,114,0,0,926,927,5,116,0,0,927,928,5,121,0,0,928,
- 74,1,0,0,0,929,930,5,99,0,0,930,931,5,108,0,0,931,932,5,97,0,0,932,933,
- 5,115,0,0,933,934,5,115,0,0,934,76,1,0,0,0,935,936,5,101,0,0,936,937,5,
- 120,0,0,937,938,5,116,0,0,938,939,5,101,0,0,939,940,5,114,0,0,940,941,
- 5,110,0,0,941,78,1,0,0,0,942,943,5,46,0,0,943,944,5,118,0,0,944,945,5,
- 116,0,0,945,946,5,102,0,0,946,947,5,105,0,0,947,948,5,120,0,0,948,949,
- 5,117,0,0,949,950,5,112,0,0,950,80,1,0,0,0,951,952,5,91,0,0,952,82,1,0,
- 0,0,953,954,5,93,0,0,954,84,1,0,0,0,955,956,5,97,0,0,956,957,5,116,0,0,
- 957,86,1,0,0,0,958,959,5,102,0,0,959,960,5,114,0,0,960,961,5,111,0,0,961,
- 962,5,109,0,0,962,963,5,117,0,0,963,964,5,110,0,0,964,965,5,109,0,0,965,
- 966,5,97,0,0,966,967,5,110,0,0,967,968,5,97,0,0,968,969,5,103,0,0,969,
- 970,5,101,0,0,970,971,5,100,0,0,971,88,1,0,0,0,972,973,5,99,0,0,973,974,
- 5,97,0,0,974,975,5,108,0,0,975,976,5,108,0,0,976,977,5,109,0,0,977,978,
- 5,111,0,0,978,979,5,115,0,0,979,980,5,116,0,0,980,981,5,100,0,0,981,982,
- 5,101,0,0,982,983,5,114,0,0,983,984,5,105,0,0,984,985,5,118,0,0,985,986,
- 5,101,0,0,986,987,5,100,0,0,987,90,1,0,0,0,988,989,5,114,0,0,989,990,5,
- 101,0,0,990,991,5,116,0,0,991,992,5,97,0,0,992,993,5,105,0,0,993,994,5,
- 110,0,0,994,995,5,97,0,0,995,996,5,112,0,0,996,997,5,112,0,0,997,998,5,
- 100,0,0,998,999,5,111,0,0,999,1000,5,109,0,0,1000,1001,5,97,0,0,1001,1002,
- 5,105,0,0,1002,1003,5,110,0,0,1003,92,1,0,0,0,1004,1005,5,46,0,0,1005,
- 1006,5,118,0,0,1006,1007,5,116,0,0,1007,1008,5,97,0,0,1008,1009,5,98,0,
- 0,1009,1010,5,108,0,0,1010,1011,5,101,0,0,1011,94,1,0,0,0,1012,1013,5,
- 46,0,0,1013,1014,5,110,0,0,1014,1015,5,97,0,0,1015,1016,5,109,0,0,1016,
- 1017,5,101,0,0,1017,1018,5,115,0,0,1018,1019,5,112,0,0,1019,1020,5,97,
- 0,0,1020,1021,5,99,0,0,1021,1022,5,101,0,0,1022,96,1,0,0,0,1023,1024,5,
- 46,0,0,1024,1025,5,99,0,0,1025,1026,5,108,0,0,1026,1027,5,97,0,0,1027,
- 1028,5,115,0,0,1028,1029,5,115,0,0,1029,98,1,0,0,0,1030,1031,5,112,0,0,
- 1031,1032,5,117,0,0,1032,1033,5,98,0,0,1033,1034,5,108,0,0,1034,1035,5,
- 105,0,0,1035,1036,5,99,0,0,1036,100,1,0,0,0,1037,1038,5,112,0,0,1038,1039,
- 5,114,0,0,1039,1040,5,105,0,0,1040,1041,5,118,0,0,1041,1042,5,97,0,0,1042,
- 1043,5,116,0,0,1043,1044,5,101,0,0,1044,102,1,0,0,0,1045,1046,5,115,0,
- 0,1046,1047,5,101,0,0,1047,1048,5,97,0,0,1048,1049,5,108,0,0,1049,1050,
- 5,101,0,0,1050,1051,5,100,0,0,1051,104,1,0,0,0,1052,1053,5,97,0,0,1053,
- 1054,5,98,0,0,1054,1055,5,115,0,0,1055,1056,5,116,0,0,1056,1057,5,114,
- 0,0,1057,1058,5,97,0,0,1058,1059,5,99,0,0,1059,1060,5,116,0,0,1060,106,
- 1,0,0,0,1061,1062,5,97,0,0,1062,1063,5,117,0,0,1063,1064,5,116,0,0,1064,
- 1065,5,111,0,0,1065,108,1,0,0,0,1066,1067,5,115,0,0,1067,1068,5,101,0,
- 0,1068,1069,5,113,0,0,1069,1070,5,117,0,0,1070,1071,5,101,0,0,1071,1072,
- 5,110,0,0,1072,1073,5,116,0,0,1073,1074,5,105,0,0,1074,1075,5,97,0,0,1075,
- 1076,5,108,0,0,1076,110,1,0,0,0,1077,1078,5,117,0,0,1078,1079,5,110,0,
- 0,1079,1080,5,105,0,0,1080,1081,5,99,0,0,1081,1082,5,111,0,0,1082,1083,
- 5,100,0,0,1083,1084,5,101,0,0,1084,112,1,0,0,0,1085,1086,5,97,0,0,1086,
- 1087,5,117,0,0,1087,1088,5,116,0,0,1088,1089,5,111,0,0,1089,1090,5,99,
- 0,0,1090,1091,5,104,0,0,1091,1092,5,97,0,0,1092,1093,5,114,0,0,1093,114,
- 1,0,0,0,1094,1095,5,105,0,0,1095,1096,5,109,0,0,1096,1097,5,112,0,0,1097,
- 1098,5,111,0,0,1098,1099,5,114,0,0,1099,1100,5,116,0,0,1100,116,1,0,0,
- 0,1101,1102,5,115,0,0,1102,1103,5,101,0,0,1103,1104,5,114,0,0,1104,1105,
- 5,105,0,0,1105,1106,5,97,0,0,1106,1107,5,108,0,0,1107,1108,5,105,0,0,1108,
- 1109,5,122,0,0,1109,1110,5,97,0,0,1110,1111,5,98,0,0,1111,1112,5,108,0,
- 0,1112,1113,5,101,0,0,1113,118,1,0,0,0,1114,1115,5,119,0,0,1115,1116,5,
- 105,0,0,1116,1117,5,110,0,0,1117,1118,5,100,0,0,1118,1119,5,111,0,0,1119,
- 1120,5,119,0,0,1120,1121,5,115,0,0,1121,1122,5,114,0,0,1122,1123,5,117,
- 0,0,1123,1124,5,110,0,0,1124,1125,5,116,0,0,1125,1126,5,105,0,0,1126,1127,
- 5,109,0,0,1127,1128,5,101,0,0,1128,120,1,0,0,0,1129,1130,5,110,0,0,1130,
- 1131,5,101,0,0,1131,1132,5,115,0,0,1132,1133,5,116,0,0,1133,1134,5,101,
- 0,0,1134,1135,5,100,0,0,1135,122,1,0,0,0,1136,1137,5,102,0,0,1137,1138,
- 5,97,0,0,1138,1139,5,109,0,0,1139,1140,5,105,0,0,1140,1141,5,108,0,0,1141,
- 1142,5,121,0,0,1142,124,1,0,0,0,1143,1144,5,97,0,0,1144,1145,5,115,0,0,
- 1145,1146,5,115,0,0,1146,1147,5,101,0,0,1147,1148,5,109,0,0,1148,1149,
- 5,98,0,0,1149,1150,5,108,0,0,1150,1151,5,121,0,0,1151,126,1,0,0,0,1152,
- 1153,5,102,0,0,1153,1154,5,97,0,0,1154,1155,5,109,0,0,1155,1156,5,97,0,
- 0,1156,1157,5,110,0,0,1157,1158,5,100,0,0,1158,1159,5,97,0,0,1159,1160,
- 5,115,0,0,1160,1161,5,115,0,0,1161,1162,5,101,0,0,1162,1163,5,109,0,0,
- 1163,128,1,0,0,0,1164,1165,5,102,0,0,1165,1166,5,97,0,0,1166,1167,5,109,
- 0,0,1167,1168,5,111,0,0,1168,1169,5,114,0,0,1169,1170,5,97,0,0,1170,1171,
- 5,115,0,0,1171,1172,5,115,0,0,1172,1173,5,101,0,0,1173,1174,5,109,0,0,
- 1174,130,1,0,0,0,1175,1176,5,98,0,0,1176,1177,5,101,0,0,1177,1178,5,102,
- 0,0,1178,1179,5,111,0,0,1179,1180,5,114,0,0,1180,1181,5,101,0,0,1181,1182,
- 5,102,0,0,1182,1183,5,105,0,0,1183,1184,5,101,0,0,1184,1185,5,108,0,0,
- 1185,1186,5,100,0,0,1186,1187,5,105,0,0,1187,1188,5,110,0,0,1188,1189,
- 5,105,0,0,1189,1190,5,116,0,0,1190,132,1,0,0,0,1191,1192,5,115,0,0,1192,
- 1193,5,112,0,0,1193,1194,5,101,0,0,1194,1195,5,99,0,0,1195,1196,5,105,
- 0,0,1196,1197,5,97,0,0,1197,1198,5,108,0,0,1198,1199,5,110,0,0,1199,1200,
- 5,97,0,0,1200,1201,5,109,0,0,1201,1202,5,101,0,0,1202,134,1,0,0,0,1203,
- 1204,5,114,0,0,1204,1205,5,116,0,0,1205,1206,5,115,0,0,1206,1207,5,112,
- 0,0,1207,1208,5,101,0,0,1208,1209,5,99,0,0,1209,1210,5,105,0,0,1210,1211,
- 5,97,0,0,1211,1212,5,108,0,0,1212,1213,5,110,0,0,1213,1214,5,97,0,0,1214,
- 1215,5,109,0,0,1215,1216,5,101,0,0,1216,136,1,0,0,0,1217,1218,5,102,0,
- 0,1218,1219,5,108,0,0,1219,1220,5,97,0,0,1220,1221,5,103,0,0,1221,1222,
- 5,115,0,0,1222,138,1,0,0,0,1223,1224,5,101,0,0,1224,1225,5,120,0,0,1225,
- 1226,5,116,0,0,1226,1227,5,101,0,0,1227,1228,5,110,0,0,1228,1229,5,100,
- 0,0,1229,1230,5,115,0,0,1230,140,1,0,0,0,1231,1232,5,105,0,0,1232,1233,
- 5,109,0,0,1233,1234,5,112,0,0,1234,1235,5,108,0,0,1235,1236,5,101,0,0,
- 1236,1237,5,109,0,0,1237,1238,5,101,0,0,1238,1239,5,110,0,0,1239,1240,
- 5,116,0,0,1240,1241,5,115,0,0,1241,142,1,0,0,0,1242,1243,5,46,0,0,1243,
- 1244,5,108,0,0,1244,1245,5,105,0,0,1245,1246,5,110,0,0,1246,1247,5,101,
- 0,0,1247,144,1,0,0,0,1248,1249,5,35,0,0,1249,1250,5,108,0,0,1250,1251,
- 5,105,0,0,1251,1252,5,110,0,0,1252,1253,5,101,0,0,1253,146,1,0,0,0,1254,
- 1255,5,58,0,0,1255,148,1,0,0,0,1256,1257,5,110,0,0,1257,1258,5,111,0,0,
- 1258,1259,5,109,0,0,1259,1260,5,101,0,0,1260,1261,5,116,0,0,1261,1262,
- 5,97,0,0,1262,1263,5,100,0,0,1263,1264,5,97,0,0,1264,1265,5,116,0,0,1265,
- 1266,5,97,0,0,1266,150,1,0,0,0,1267,1268,5,114,0,0,1268,1269,5,101,0,0,
- 1269,1270,5,116,0,0,1270,1271,5,97,0,0,1271,1272,5,114,0,0,1272,1273,5,
- 103,0,0,1273,1274,5,101,0,0,1274,1275,5,116,0,0,1275,1276,5,97,0,0,1276,
- 1277,5,98,0,0,1277,1278,5,108,0,0,1278,1279,5,101,0,0,1279,152,1,0,0,0,
- 1280,1281,5,110,0,0,1281,1282,5,111,0,0,1282,1283,5,112,0,0,1283,1284,
- 5,108,0,0,1284,1285,5,97,0,0,1285,1286,5,116,0,0,1286,1287,5,102,0,0,1287,
- 1288,5,111,0,0,1288,1289,5,114,0,0,1289,1290,5,109,0,0,1290,154,1,0,0,
- 0,1291,1292,5,108,0,0,1292,1293,5,101,0,0,1293,1294,5,103,0,0,1294,1295,
- 5,97,0,0,1295,1296,5,99,0,0,1296,1297,5,121,0,0,1297,1298,5,32,0,0,1298,
- 1299,5,108,0,0,1299,1300,5,105,0,0,1300,1301,5,98,0,0,1301,1302,5,114,
- 0,0,1302,1303,5,97,0,0,1303,1304,5,114,0,0,1304,1305,5,121,0,0,1305,156,
- 1,0,0,0,1306,1307,5,120,0,0,1307,1308,5,56,0,0,1308,1309,5,54,0,0,1309,
- 158,1,0,0,0,1310,1311,5,97,0,0,1311,1312,5,109,0,0,1312,1313,5,100,0,0,
- 1313,1314,5,54,0,0,1314,1315,5,52,0,0,1315,160,1,0,0,0,1316,1317,5,97,
- 0,0,1317,1318,5,114,0,0,1318,1319,5,109,0,0,1319,162,1,0,0,0,1320,1321,
- 5,97,0,0,1321,1322,5,114,0,0,1322,1323,5,109,0,0,1323,1324,5,54,0,0,1324,
- 1325,5,52,0,0,1325,164,1,0,0,0,1326,1327,5,98,0,0,1327,1328,5,121,0,0,
- 1328,1329,5,116,0,0,1329,1330,5,101,0,0,1330,1331,5,97,0,0,1331,1332,5,
- 114,0,0,1332,1333,5,114,0,0,1333,1334,5,97,0,0,1334,1335,5,121,0,0,1335,
- 166,1,0,0,0,1336,1337,5,40,0,0,1337,1338,5,41,0,0,1338,168,1,0,0,0,1339,
- 1340,5,60,0,0,1340,170,1,0,0,0,1341,1342,5,62,0,0,1342,172,1,0,0,0,1343,
- 1344,5,47,0,0,1344,174,1,0,0,0,1345,1346,5,97,0,0,1346,1347,5,108,0,0,
- 1347,1348,5,103,0,0,1348,1349,5,111,0,0,1349,1350,5,114,0,0,1350,1351,
- 5,105,0,0,1351,1352,5,116,0,0,1352,1353,5,104,0,0,1353,1354,5,109,0,0,
- 1354,176,1,0,0,0,1355,1356,5,105,0,0,1356,1357,5,105,0,0,1357,1358,5,100,
- 0,0,1358,1359,5,112,0,0,1359,1360,5,97,0,0,1360,1361,5,114,0,0,1361,1362,
- 5,97,0,0,1362,1363,5,109,0,0,1363,178,1,0,0,0,1364,1365,5,112,0,0,1365,
- 1366,5,105,0,0,1366,1367,5,110,0,0,1367,1368,5,110,0,0,1368,1369,5,101,
- 0,0,1369,1370,5,100,0,0,1370,180,1,0,0,0,1371,1372,5,109,0,0,1372,1373,
- 5,111,0,0,1373,1374,5,100,0,0,1374,1375,5,114,0,0,1375,1376,5,101,0,0,
- 1376,1377,5,113,0,0,1377,182,1,0,0,0,1378,1379,5,109,0,0,1379,1380,5,111,
- 0,0,1380,1381,5,100,0,0,1381,1382,5,111,0,0,1382,1383,5,112,0,0,1383,1384,
- 5,116,0,0,1384,184,1,0,0,0,1385,1386,5,117,0,0,1386,1387,5,110,0,0,1387,
- 1388,5,115,0,0,1388,1389,5,105,0,0,1389,1390,5,103,0,0,1390,1391,5,110,
- 0,0,1391,1392,5,101,0,0,1392,1393,5,100,0,0,1393,186,1,0,0,0,1394,1395,
- 5,116,0,0,1395,1396,5,114,0,0,1396,1397,5,117,0,0,1397,1398,5,101,0,0,
- 1398,188,1,0,0,0,1399,1400,5,102,0,0,1400,1401,5,97,0,0,1401,1402,5,108,
- 0,0,1402,1403,5,115,0,0,1403,1404,5,101,0,0,1404,190,1,0,0,0,1405,1406,
- 5,114,0,0,1406,1407,5,101,0,0,1407,1408,5,113,0,0,1408,1409,5,117,0,0,
- 1409,1410,5,101,0,0,1410,1411,5,115,0,0,1411,1412,5,116,0,0,1412,192,1,
- 0,0,0,1413,1414,5,100,0,0,1414,1415,5,101,0,0,1415,1416,5,109,0,0,1416,
- 1417,5,97,0,0,1417,1418,5,110,0,0,1418,1419,5,100,0,0,1419,194,1,0,0,0,
- 1420,1421,5,97,0,0,1421,1422,5,115,0,0,1422,1423,5,115,0,0,1423,1424,5,
- 101,0,0,1424,1425,5,114,0,0,1425,1426,5,116,0,0,1426,196,1,0,0,0,1427,
- 1428,5,100,0,0,1428,1429,5,101,0,0,1429,1430,5,110,0,0,1430,1431,5,121,
- 0,0,1431,198,1,0,0,0,1432,1433,5,112,0,0,1433,1434,5,101,0,0,1434,1435,
- 5,114,0,0,1435,1436,5,109,0,0,1436,1437,5,105,0,0,1437,1438,5,116,0,0,
- 1438,1439,5,111,0,0,1439,1440,5,110,0,0,1440,1441,5,108,0,0,1441,1442,
- 5,121,0,0,1442,200,1,0,0,0,1443,1444,5,108,0,0,1444,1445,5,105,0,0,1445,
- 1446,5,110,0,0,1446,1447,5,107,0,0,1447,1448,5,99,0,0,1448,1449,5,104,
- 0,0,1449,1450,5,101,0,0,1450,1451,5,99,0,0,1451,1452,5,107,0,0,1452,202,
- 1,0,0,0,1453,1454,5,105,0,0,1454,1455,5,110,0,0,1455,1456,5,104,0,0,1456,
- 1457,5,101,0,0,1457,1458,5,114,0,0,1458,1459,5,105,0,0,1459,1460,5,116,
- 0,0,1460,1461,5,99,0,0,1461,1462,5,104,0,0,1462,1463,5,101,0,0,1463,1464,
- 5,99,0,0,1464,1465,5,107,0,0,1465,204,1,0,0,0,1466,1467,5,114,0,0,1467,
- 1468,5,101,0,0,1468,1469,5,113,0,0,1469,1470,5,109,0,0,1470,1471,5,105,
- 0,0,1471,1472,5,110,0,0,1472,206,1,0,0,0,1473,1474,5,114,0,0,1474,1475,
- 5,101,0,0,1475,1476,5,113,0,0,1476,1477,5,111,0,0,1477,1478,5,112,0,0,
- 1478,1479,5,116,0,0,1479,208,1,0,0,0,1480,1481,5,114,0,0,1481,1482,5,101,
- 0,0,1482,1483,5,113,0,0,1483,1484,5,114,0,0,1484,1485,5,101,0,0,1485,1486,
- 5,102,0,0,1486,1487,5,117,0,0,1487,1488,5,115,0,0,1488,1489,5,101,0,0,
- 1489,210,1,0,0,0,1490,1491,5,112,0,0,1491,1492,5,114,0,0,1492,1493,5,101,
- 0,0,1493,1494,5,106,0,0,1494,1495,5,105,0,0,1495,1496,5,116,0,0,1496,1497,
- 5,103,0,0,1497,1498,5,114,0,0,1498,1499,5,97,0,0,1499,1500,5,110,0,0,1500,
- 1501,5,116,0,0,1501,212,1,0,0,0,1502,1503,5,112,0,0,1503,1504,5,114,0,
- 0,1504,1505,5,101,0,0,1505,1506,5,106,0,0,1506,1507,5,105,0,0,1507,1508,
- 5,116,0,0,1508,1509,5,100,0,0,1509,1510,5,101,0,0,1510,1511,5,110,0,0,
- 1511,1512,5,121,0,0,1512,214,1,0,0,0,1513,1514,5,110,0,0,1514,1515,5,111,
- 0,0,1515,1516,5,110,0,0,1516,1517,5,99,0,0,1517,1518,5,97,0,0,1518,1519,
- 5,115,0,0,1519,1520,5,100,0,0,1520,1521,5,101,0,0,1521,1522,5,109,0,0,
- 1522,1523,5,97,0,0,1523,1524,5,110,0,0,1524,1525,5,100,0,0,1525,216,1,
- 0,0,0,1526,1527,5,110,0,0,1527,1528,5,111,0,0,1528,1529,5,110,0,0,1529,
- 1530,5,99,0,0,1530,1531,5,97,0,0,1531,1532,5,115,0,0,1532,1533,5,108,0,
- 0,1533,1534,5,105,0,0,1534,1535,5,110,0,0,1535,1536,5,107,0,0,1536,1537,
- 5,100,0,0,1537,1538,5,101,0,0,1538,1539,5,109,0,0,1539,1540,5,97,0,0,1540,
- 1541,5,110,0,0,1541,1542,5,100,0,0,1542,218,1,0,0,0,1543,1544,5,110,0,
- 0,1544,1545,5,111,0,0,1545,1546,5,110,0,0,1546,1547,5,99,0,0,1547,1548,
- 5,97,0,0,1548,1549,5,115,0,0,1549,1550,5,105,0,0,1550,1551,5,110,0,0,1551,
- 1552,5,104,0,0,1552,1553,5,101,0,0,1553,1554,5,114,0,0,1554,1555,5,105,
- 0,0,1555,1556,5,116,0,0,1556,1557,5,97,0,0,1557,1558,5,110,0,0,1558,1559,
- 5,99,0,0,1559,1560,5,101,0,0,1560,220,1,0,0,0,1561,1562,5,99,0,0,1562,
- 1563,5,97,0,0,1563,1564,5,108,0,0,1564,1565,5,108,0,0,1565,1566,5,99,0,
- 0,1566,1567,5,111,0,0,1567,1568,5,110,0,0,1568,1569,5,118,0,0,1569,222,
- 1,0,0,0,1570,1571,5,109,0,0,1571,1572,5,100,0,0,1572,1573,5,116,0,0,1573,
- 1574,5,111,0,0,1574,1575,5,107,0,0,1575,1576,5,101,0,0,1576,1577,5,110,
- 0,0,1577,224,1,0,0,0,1578,1579,5,45,0,0,1579,226,1,0,0,0,1580,1581,5,98,
- 0,0,1581,1582,5,121,0,0,1582,1583,5,114,0,0,1583,1584,5,101,0,0,1584,1585,
- 5,102,0,0,1585,1586,5,108,0,0,1586,1587,5,105,0,0,1587,1588,5,107,0,0,
- 1588,1589,5,101,0,0,1589,228,1,0,0,0,1590,1591,5,46,0,0,1591,1592,5,99,
- 0,0,1592,1593,5,116,0,0,1593,1594,5,111,0,0,1594,1595,5,114,0,0,1595,230,
- 1,0,0,0,1596,1597,5,46,0,0,1597,1598,5,115,0,0,1598,1599,5,105,0,0,1599,
- 1600,5,122,0,0,1600,1601,5,101,0,0,1601,232,1,0,0,0,1602,1603,5,46,0,0,
- 1603,1604,5,112,0,0,1604,1605,5,97,0,0,1605,1606,5,99,0,0,1606,1607,5,
- 107,0,0,1607,234,1,0,0,0,1608,1609,5,119,0,0,1609,1610,5,105,0,0,1610,
- 1611,5,116,0,0,1611,1612,5,104,0,0,1612,236,1,0,0,0,1613,1614,5,46,0,0,
- 1614,1615,5,105,0,0,1615,1616,5,110,0,0,1616,1617,5,116,0,0,1617,1618,
- 5,101,0,0,1618,1619,5,114,0,0,1619,1620,5,102,0,0,1620,1621,5,97,0,0,1621,
- 1622,5,99,0,0,1622,1623,5,101,0,0,1623,1624,5,105,0,0,1624,1625,5,109,
- 0,0,1625,1626,5,112,0,0,1626,1627,5,108,0,0,1627,238,1,0,0,0,1628,1629,
- 5,46,0,0,1629,1630,5,102,0,0,1630,1631,5,105,0,0,1631,1632,5,101,0,0,1632,
- 1633,5,108,0,0,1633,1634,5,100,0,0,1634,240,1,0,0,0,1635,1636,5,109,0,
- 0,1636,1637,5,97,0,0,1637,1638,5,114,0,0,1638,1639,5,115,0,0,1639,1640,
- 5,104,0,0,1640,1641,5,97,0,0,1641,1642,5,108,0,0,1642,242,1,0,0,0,1643,
- 1644,5,115,0,0,1644,1645,5,116,0,0,1645,1646,5,97,0,0,1646,1647,5,116,
- 0,0,1647,1648,5,105,0,0,1648,1649,5,99,0,0,1649,244,1,0,0,0,1650,1651,
- 5,105,0,0,1651,1652,5,110,0,0,1652,1653,5,105,0,0,1653,1654,5,116,0,0,
- 1654,1655,5,111,0,0,1655,1656,5,110,0,0,1656,1657,5,108,0,0,1657,1658,
- 5,121,0,0,1658,246,1,0,0,0,1659,1660,5,112,0,0,1660,1661,5,114,0,0,1661,
- 1662,5,105,0,0,1662,1663,5,118,0,0,1663,1664,5,97,0,0,1664,1665,5,116,
- 0,0,1665,1666,5,101,0,0,1666,1667,5,115,0,0,1667,1668,5,99,0,0,1668,1669,
- 5,111,0,0,1669,1670,5,112,0,0,1670,1671,5,101,0,0,1671,248,1,0,0,0,1672,
- 1673,5,108,0,0,1673,1674,5,105,0,0,1674,1675,5,116,0,0,1675,1676,5,101,
- 0,0,1676,1677,5,114,0,0,1677,1678,5,97,0,0,1678,1679,5,108,0,0,1679,250,
- 1,0,0,0,1680,1681,5,110,0,0,1681,1682,5,111,0,0,1682,1683,5,116,0,0,1683,
- 1684,5,115,0,0,1684,1685,5,101,0,0,1685,1686,5,114,0,0,1686,1687,5,105,
- 0,0,1687,1688,5,97,0,0,1688,1689,5,108,0,0,1689,1690,5,105,0,0,1690,1691,
- 5,122,0,0,1691,1692,5,101,0,0,1692,1693,5,100,0,0,1693,252,1,0,0,0,1694,
- 1695,5,118,0,0,1695,1696,5,111,0,0,1696,1697,5,108,0,0,1697,1698,5,97,
- 0,0,1698,1699,5,116,0,0,1699,1700,5,105,0,0,1700,1701,5,108,0,0,1701,1702,
- 5,101,0,0,1702,254,1,0,0,0,1703,1704,5,46,0,0,1704,1705,5,101,0,0,1705,
- 1706,5,118,0,0,1706,1707,5,101,0,0,1707,1708,5,110,0,0,1708,1709,5,116,
- 0,0,1709,256,1,0,0,0,1710,1711,5,46,0,0,1711,1712,5,97,0,0,1712,1713,5,
- 100,0,0,1713,1714,5,100,0,0,1714,1715,5,111,0,0,1715,1716,5,110,0,0,1716,
- 258,1,0,0,0,1717,1718,5,46,0,0,1718,1719,5,114,0,0,1719,1720,5,101,0,0,
- 1720,1721,5,109,0,0,1721,1722,5,111,0,0,1722,1723,5,118,0,0,1723,1724,
- 5,101,0,0,1724,1725,5,111,0,0,1725,1726,5,110,0,0,1726,260,1,0,0,0,1727,
- 1728,5,46,0,0,1728,1729,5,102,0,0,1729,1730,5,105,0,0,1730,1731,5,114,
- 0,0,1731,1732,5,101,0,0,1732,262,1,0,0,0,1733,1734,5,46,0,0,1734,1735,
- 5,111,0,0,1735,1736,5,116,0,0,1736,1737,5,104,0,0,1737,1738,5,101,0,0,
- 1738,1739,5,114,0,0,1739,264,1,0,0,0,1740,1741,5,46,0,0,1741,1742,5,112,
- 0,0,1742,1743,5,114,0,0,1743,1744,5,111,0,0,1744,1745,5,112,0,0,1745,1746,
- 5,101,0,0,1746,1747,5,114,0,0,1747,1748,5,116,0,0,1748,1749,5,121,0,0,
- 1749,266,1,0,0,0,1750,1751,5,46,0,0,1751,1752,5,115,0,0,1752,1753,5,101,
- 0,0,1753,1754,5,116,0,0,1754,268,1,0,0,0,1755,1756,5,46,0,0,1756,1757,
- 5,103,0,0,1757,1758,5,101,0,0,1758,1759,5,116,0,0,1759,270,1,0,0,0,1760,
- 1761,5,105,0,0,1761,1762,5,110,0,0,1762,272,1,0,0,0,1763,1764,5,111,0,
- 0,1764,1765,5,117,0,0,1765,1766,5,116,0,0,1766,274,1,0,0,0,1767,1768,5,
- 111,0,0,1768,1769,5,112,0,0,1769,1770,5,116,0,0,1770,276,1,0,0,0,1771,
- 1772,5,46,0,0,1772,1773,5,109,0,0,1773,1774,5,101,0,0,1774,1775,5,116,
- 0,0,1775,1776,5,104,0,0,1776,1777,5,111,0,0,1777,1778,5,100,0,0,1778,278,
- 1,0,0,0,1779,1780,5,102,0,0,1780,1781,5,105,0,0,1781,1782,5,110,0,0,1782,
- 1783,5,97,0,0,1783,1784,5,108,0,0,1784,280,1,0,0,0,1785,1786,5,118,0,0,
- 1786,1787,5,105,0,0,1787,1788,5,114,0,0,1788,1789,5,116,0,0,1789,1790,
- 5,117,0,0,1790,1791,5,97,0,0,1791,1792,5,108,0,0,1792,282,1,0,0,0,1793,
- 1794,5,115,0,0,1794,1795,5,116,0,0,1795,1796,5,114,0,0,1796,1797,5,105,
- 0,0,1797,1798,5,99,0,0,1798,1799,5,116,0,0,1799,284,1,0,0,0,1800,1801,
- 5,104,0,0,1801,1802,5,105,0,0,1802,1803,5,100,0,0,1803,1804,5,101,0,0,
- 1804,1805,5,98,0,0,1805,1806,5,121,0,0,1806,1807,5,115,0,0,1807,1808,5,
- 105,0,0,1808,1809,5,103,0,0,1809,286,1,0,0,0,1810,1811,5,110,0,0,1811,
- 1812,5,101,0,0,1812,1813,5,119,0,0,1813,1814,5,115,0,0,1814,1815,5,108,
- 0,0,1815,1816,5,111,0,0,1816,1817,5,116,0,0,1817,288,1,0,0,0,1818,1819,
- 5,117,0,0,1819,1820,5,110,0,0,1820,1821,5,109,0,0,1821,1822,5,97,0,0,1822,
- 1823,5,110,0,0,1823,1824,5,97,0,0,1824,1825,5,103,0,0,1825,1826,5,101,
- 0,0,1826,1827,5,100,0,0,1827,1828,5,101,0,0,1828,1829,5,120,0,0,1829,1830,
- 5,112,0,0,1830,290,1,0,0,0,1831,1832,5,114,0,0,1832,1833,5,101,0,0,1833,
- 1834,5,113,0,0,1834,1835,5,115,0,0,1835,1836,5,101,0,0,1836,1837,5,99,
- 0,0,1837,1838,5,111,0,0,1838,1839,5,98,0,0,1839,1840,5,106,0,0,1840,292,
- 1,0,0,0,1841,1842,5,112,0,0,1842,1843,5,105,0,0,1843,1844,5,110,0,0,1844,
- 1845,5,118,0,0,1845,1846,5,111,0,0,1846,1847,5,107,0,0,1847,1848,5,101,
- 0,0,1848,1849,5,105,0,0,1849,1850,5,109,0,0,1850,1851,5,112,0,0,1851,1852,
- 5,108,0,0,1852,294,1,0,0,0,1853,1854,5,110,0,0,1854,1855,5,111,0,0,1855,
- 1856,5,109,0,0,1856,1857,5,97,0,0,1857,1858,5,110,0,0,1858,1859,5,103,
- 0,0,1859,1860,5,108,0,0,1860,1861,5,101,0,0,1861,296,1,0,0,0,1862,1863,
- 5,108,0,0,1863,1864,5,97,0,0,1864,1865,5,115,0,0,1865,1866,5,116,0,0,1866,
- 1867,5,101,0,0,1867,1868,5,114,0,0,1868,1869,5,114,0,0,1869,298,1,0,0,
- 0,1870,1871,5,119,0,0,1871,1872,5,105,0,0,1872,1873,5,110,0,0,1873,1874,
- 5,97,0,0,1874,1875,5,112,0,0,1875,1876,5,105,0,0,1876,300,1,0,0,0,1877,
- 1878,5,98,0,0,1878,1879,5,101,0,0,1879,1880,5,115,0,0,1880,1881,5,116,
- 0,0,1881,1882,5,102,0,0,1882,1883,5,105,0,0,1883,1884,5,116,0,0,1884,302,
- 1,0,0,0,1885,1886,5,111,0,0,1886,1887,5,110,0,0,1887,304,1,0,0,0,1888,
- 1889,5,111,0,0,1889,1890,5,102,0,0,1890,1891,5,102,0,0,1891,306,1,0,0,
- 0,1892,1893,5,99,0,0,1893,1894,5,104,0,0,1894,1895,5,97,0,0,1895,1896,
- 5,114,0,0,1896,1897,5,109,0,0,1897,1898,5,97,0,0,1898,1899,5,112,0,0,1899,
- 1900,5,101,0,0,1900,1901,5,114,0,0,1901,1902,5,114,0,0,1902,1903,5,111,
- 0,0,1903,1904,5,114,0,0,1904,308,1,0,0,0,1905,1906,5,46,0,0,1906,1907,
- 5,99,0,0,1907,1908,5,99,0,0,1908,1909,5,116,0,0,1909,1910,5,111,0,0,1910,
- 1911,5,114,0,0,1911,310,1,0,0,0,1912,1913,5,105,0,0,1913,1914,5,108,0,
- 0,1914,312,1,0,0,0,1915,1916,5,105,0,0,1916,1917,5,110,0,0,1917,1918,5,
- 105,0,0,1918,1919,5,116,0,0,1919,314,1,0,0,0,1920,1921,5,46,0,0,1921,1922,
- 5,116,0,0,1922,1923,5,114,0,0,1923,1924,5,121,0,0,1924,316,1,0,0,0,1925,
- 1926,5,116,0,0,1926,1927,5,111,0,0,1927,318,1,0,0,0,1928,1929,5,102,0,
- 0,1929,1930,5,105,0,0,1930,1931,5,108,0,0,1931,1932,5,116,0,0,1932,1933,
- 5,101,0,0,1933,1934,5,114,0,0,1934,320,1,0,0,0,1935,1936,5,99,0,0,1936,
- 1937,5,97,0,0,1937,1938,5,116,0,0,1938,1939,5,99,0,0,1939,1940,5,104,0,
- 0,1940,322,1,0,0,0,1941,1942,5,102,0,0,1942,1943,5,105,0,0,1943,1944,5,
- 110,0,0,1944,1945,5,97,0,0,1945,1946,5,108,0,0,1946,1947,5,108,0,0,1947,
- 1948,5,121,0,0,1948,324,1,0,0,0,1949,1950,5,102,0,0,1950,1951,5,97,0,0,
- 1951,1952,5,117,0,0,1952,1953,5,108,0,0,1953,1954,5,116,0,0,1954,326,1,
- 0,0,0,1955,1956,5,104,0,0,1956,1957,5,97,0,0,1957,1958,5,110,0,0,1958,
- 1959,5,100,0,0,1959,1960,5,108,0,0,1960,1961,5,101,0,0,1961,1962,5,114,
- 0,0,1962,328,1,0,0,0,1963,1964,5,46,0,0,1964,1965,5,100,0,0,1965,1966,
- 5,97,0,0,1966,1967,5,116,0,0,1967,1968,5,97,0,0,1968,330,1,0,0,0,1969,
- 1970,5,116,0,0,1970,1971,5,108,0,0,1971,1972,5,115,0,0,1972,332,1,0,0,
- 0,1973,1974,5,46,0,0,1974,1975,5,112,0,0,1975,1976,5,117,0,0,1976,1977,
- 5,98,0,0,1977,1978,5,108,0,0,1978,1979,5,105,0,0,1979,1980,5,99,0,0,1980,
- 1981,5,75,0,0,1981,1982,5,101,0,0,1982,1983,5,121,0,0,1983,334,1,0,0,0,
- 1984,1985,5,46,0,0,1985,1986,5,118,0,0,1986,1987,5,101,0,0,1987,1988,5,
- 114,0,0,1988,336,1,0,0,0,1989,1990,5,46,0,0,1990,1991,5,108,0,0,1991,1992,
- 5,111,0,0,1992,1993,5,99,0,0,1993,1994,5,97,0,0,1994,1995,5,108,0,0,1995,
- 1996,5,101,0,0,1996,338,1,0,0,0,1997,1998,5,46,0,0,1998,1999,5,112,0,0,
- 1999,2000,5,117,0,0,2000,2001,5,98,0,0,2001,2002,5,108,0,0,2002,2003,5,
- 105,0,0,2003,2004,5,99,0,0,2004,2005,5,107,0,0,2005,2006,5,101,0,0,2006,
- 2007,5,121,0,0,2007,2008,5,116,0,0,2008,2009,5,111,0,0,2009,2010,5,107,
- 0,0,2010,2011,5,101,0,0,2011,2012,5,110,0,0,2012,340,1,0,0,0,2013,2014,
- 5,102,0,0,2014,2015,5,111,0,0,2015,2016,5,114,0,0,2016,2017,5,119,0,0,
- 2017,2018,5,97,0,0,2018,2019,5,114,0,0,2019,2020,5,100,0,0,2020,2021,5,
- 101,0,0,2021,2022,5,114,0,0,2022,342,1,0,0,0,2023,2025,5,45,0,0,2024,2023,
- 1,0,0,0,2024,2025,1,0,0,0,2025,2039,1,0,0,0,2026,2027,5,48,0,0,2027,2028,
- 5,120,0,0,2028,2030,1,0,0,0,2029,2031,7,0,0,0,2030,2029,1,0,0,0,2031,2032,
- 1,0,0,0,2032,2030,1,0,0,0,2032,2033,1,0,0,0,2033,2040,1,0,0,0,2034,2036,
- 7,1,0,0,2035,2034,1,0,0,0,2036,2037,1,0,0,0,2037,2035,1,0,0,0,2037,2038,
- 1,0,0,0,2038,2040,1,0,0,0,2039,2026,1,0,0,0,2039,2035,1,0,0,0,2040,344,
- 1,0,0,0,2041,2043,5,45,0,0,2042,2041,1,0,0,0,2042,2043,1,0,0,0,2043,2057,
- 1,0,0,0,2044,2045,5,48,0,0,2045,2046,5,120,0,0,2046,2048,1,0,0,0,2047,
- 2049,7,0,0,0,2048,2047,1,0,0,0,2049,2050,1,0,0,0,2050,2048,1,0,0,0,2050,
- 2051,1,0,0,0,2051,2058,1,0,0,0,2052,2054,7,1,0,0,2053,2052,1,0,0,0,2054,
- 2055,1,0,0,0,2055,2053,1,0,0,0,2055,2056,1,0,0,0,2056,2058,1,0,0,0,2057,
- 2044,1,0,0,0,2057,2053,1,0,0,0,2058,346,1,0,0,0,2059,2061,5,45,0,0,2060,
- 2059,1,0,0,0,2060,2061,1,0,0,0,2061,2112,1,0,0,0,2062,2064,7,1,0,0,2063,
- 2062,1,0,0,0,2064,2065,1,0,0,0,2065,2063,1,0,0,0,2065,2066,1,0,0,0,2066,
- 2093,1,0,0,0,2067,2069,5,46,0,0,2068,2070,7,1,0,0,2069,2068,1,0,0,0,2070,
- 2071,1,0,0,0,2071,2069,1,0,0,0,2071,2072,1,0,0,0,2072,2082,1,0,0,0,2073,
- 2075,7,2,0,0,2074,2076,7,3,0,0,2075,2074,1,0,0,0,2075,2076,1,0,0,0,2076,
- 2078,1,0,0,0,2077,2079,7,1,0,0,2078,2077,1,0,0,0,2079,2080,1,0,0,0,2080,
- 2078,1,0,0,0,2080,2081,1,0,0,0,2081,2083,1,0,0,0,2082,2073,1,0,0,0,2082,
- 2083,1,0,0,0,2083,2094,1,0,0,0,2084,2086,7,2,0,0,2085,2087,7,3,0,0,2086,
- 2085,1,0,0,0,2086,2087,1,0,0,0,2087,2089,1,0,0,0,2088,2090,7,1,0,0,2089,
- 2088,1,0,0,0,2090,2091,1,0,0,0,2091,2089,1,0,0,0,2091,2092,1,0,0,0,2092,
- 2094,1,0,0,0,2093,2067,1,0,0,0,2093,2084,1,0,0,0,2094,2113,1,0,0,0,2095,
- 2097,5,46,0,0,2096,2098,7,1,0,0,2097,2096,1,0,0,0,2098,2099,1,0,0,0,2099,
- 2097,1,0,0,0,2099,2100,1,0,0,0,2100,2110,1,0,0,0,2101,2103,7,2,0,0,2102,
- 2104,7,3,0,0,2103,2102,1,0,0,0,2103,2104,1,0,0,0,2104,2106,1,0,0,0,2105,
- 2107,7,1,0,0,2106,2105,1,0,0,0,2107,2108,1,0,0,0,2108,2106,1,0,0,0,2108,
- 2109,1,0,0,0,2109,2111,1,0,0,0,2110,2101,1,0,0,0,2110,2111,1,0,0,0,2111,
- 2113,1,0,0,0,2112,2063,1,0,0,0,2112,2095,1,0,0,0,2113,348,1,0,0,0,2114,
- 2115,5,58,0,0,2115,2116,5,58,0,0,2116,350,1,0,0,0,2117,2118,5,46,0,0,2118,
- 2119,5,46,0,0,2119,2120,5,46,0,0,2120,352,1,0,0,0,2121,2122,5,110,0,0,
- 2122,2123,5,117,0,0,2123,2124,5,108,0,0,2124,2125,5,108,0,0,2125,354,1,
- 0,0,0,2126,2127,5,110,0,0,2127,2128,5,117,0,0,2128,2129,5,108,0,0,2129,
- 2130,5,108,0,0,2130,2131,5,114,0,0,2131,2132,5,101,0,0,2132,2133,5,102,
- 0,0,2133,356,1,0,0,0,2134,2135,5,46,0,0,2135,2136,5,104,0,0,2136,2137,
- 5,97,0,0,2137,2138,5,115,0,0,2138,2139,5,104,0,0,2139,358,1,0,0,0,2140,
- 2141,5,99,0,0,2141,2142,5,104,0,0,2142,2143,5,97,0,0,2143,2150,5,114,0,
- 0,2144,2145,5,119,0,0,2145,2146,5,99,0,0,2146,2147,5,104,0,0,2147,2148,
- 5,97,0,0,2148,2150,5,114,0,0,2149,2140,1,0,0,0,2149,2144,1,0,0,0,2150,
- 360,1,0,0,0,2151,2152,5,115,0,0,2152,2153,5,116,0,0,2153,2154,5,114,0,
- 0,2154,2155,5,105,0,0,2155,2156,5,110,0,0,2156,2157,5,103,0,0,2157,362,
- 1,0,0,0,2158,2159,5,98,0,0,2159,2160,5,111,0,0,2160,2161,5,111,0,0,2161,
- 2162,5,108,0,0,2162,364,1,0,0,0,2163,2164,5,105,0,0,2164,2165,5,110,0,
- 0,2165,2166,5,116,0,0,2166,2167,5,56,0,0,2167,366,1,0,0,0,2168,2169,5,
- 105,0,0,2169,2170,5,110,0,0,2170,2171,5,116,0,0,2171,2172,5,49,0,0,2172,
- 2173,5,54,0,0,2173,368,1,0,0,0,2174,2175,5,105,0,0,2175,2176,5,110,0,0,
- 2176,2177,5,116,0,0,2177,2178,5,51,0,0,2178,2179,5,50,0,0,2179,370,1,0,
- 0,0,2180,2181,5,105,0,0,2181,2182,5,110,0,0,2182,2183,5,116,0,0,2183,2184,
- 5,54,0,0,2184,2185,5,52,0,0,2185,372,1,0,0,0,2186,2187,5,102,0,0,2187,
- 2188,5,108,0,0,2188,2189,5,111,0,0,2189,2190,5,97,0,0,2190,2191,5,116,
- 0,0,2191,2192,5,51,0,0,2192,2193,5,50,0,0,2193,374,1,0,0,0,2194,2195,5,
- 102,0,0,2195,2196,5,108,0,0,2196,2197,5,111,0,0,2197,2198,5,97,0,0,2198,
- 2199,5,116,0,0,2199,2200,5,54,0,0,2200,2201,5,52,0,0,2201,376,1,0,0,0,
- 2202,2203,5,117,0,0,2203,2204,5,110,0,0,2204,2205,5,115,0,0,2205,2206,
- 5,105,0,0,2206,2207,5,103,0,0,2207,2208,5,110,0,0,2208,2209,5,101,0,0,
- 2209,2210,5,100,0,0,2210,378,1,0,0,0,2211,2212,5,117,0,0,2212,2213,5,105,
- 0,0,2213,2214,5,110,0,0,2214,2215,5,116,0,0,2215,2216,5,56,0,0,2216,380,
- 1,0,0,0,2217,2218,5,117,0,0,2218,2219,5,105,0,0,2219,2220,5,110,0,0,2220,
- 2221,5,116,0,0,2221,2222,5,49,0,0,2222,2223,5,54,0,0,2223,382,1,0,0,0,
- 2224,2225,5,117,0,0,2225,2226,5,105,0,0,2226,2227,5,110,0,0,2227,2228,
- 5,116,0,0,2228,2229,5,51,0,0,2229,2230,5,50,0,0,2230,384,1,0,0,0,2231,
- 2232,5,117,0,0,2232,2233,5,105,0,0,2233,2234,5,110,0,0,2234,2235,5,116,
- 0,0,2235,2236,5,54,0,0,2236,2237,5,52,0,0,2237,386,1,0,0,0,2238,2239,5,
- 105,0,0,2239,2240,5,110,0,0,2240,2241,5,116,0,0,2241,388,1,0,0,0,2242,
- 2243,5,117,0,0,2243,2244,5,105,0,0,2244,2245,5,110,0,0,2245,2246,5,116,
- 0,0,2246,390,1,0,0,0,2247,2248,5,116,0,0,2248,2249,5,121,0,0,2249,2250,
- 5,112,0,0,2250,2251,5,101,0,0,2251,392,1,0,0,0,2252,2253,5,111,0,0,2253,
- 2254,5,98,0,0,2254,2255,5,106,0,0,2255,2256,5,101,0,0,2256,2257,5,99,0,
- 0,2257,2258,5,116,0,0,2258,394,1,0,0,0,2259,2260,5,46,0,0,2260,2261,5,
- 109,0,0,2261,2262,5,111,0,0,2262,2263,5,100,0,0,2263,2264,5,117,0,0,2264,
- 2265,5,108,0,0,2265,2266,5,101,0,0,2266,396,1,0,0,0,2267,2268,5,118,0,
- 0,2268,2269,5,97,0,0,2269,2270,5,108,0,0,2270,2271,5,117,0,0,2271,2272,
- 5,101,0,0,2272,398,1,0,0,0,2273,2274,5,118,0,0,2274,2275,5,97,0,0,2275,
- 2276,5,108,0,0,2276,2277,5,117,0,0,2277,2278,5,101,0,0,2278,2279,5,116,
- 0,0,2279,2280,5,121,0,0,2280,2281,5,112,0,0,2281,2282,5,101,0,0,2282,400,
- 1,0,0,0,2283,2284,5,118,0,0,2284,2285,5,111,0,0,2285,2286,5,105,0,0,2286,
- 2287,5,100,0,0,2287,402,1,0,0,0,2288,2289,5,101,0,0,2289,2290,5,110,0,
- 0,2290,2291,5,117,0,0,2291,2292,5,109,0,0,2292,404,1,0,0,0,2293,2294,5,
- 99,0,0,2294,2295,5,117,0,0,2295,2296,5,115,0,0,2296,2297,5,116,0,0,2297,
- 2298,5,111,0,0,2298,2299,5,109,0,0,2299,406,1,0,0,0,2300,2301,5,102,0,
- 0,2301,2302,5,105,0,0,2302,2303,5,120,0,0,2303,2304,5,101,0,0,2304,2305,
- 5,100,0,0,2305,408,1,0,0,0,2306,2307,5,115,0,0,2307,2308,5,121,0,0,2308,
- 2309,5,115,0,0,2309,2310,5,116,0,0,2310,2311,5,114,0,0,2311,2312,5,105,
- 0,0,2312,2313,5,110,0,0,2313,2314,5,103,0,0,2314,410,1,0,0,0,2315,2316,
- 5,97,0,0,2316,2317,5,114,0,0,2317,2318,5,114,0,0,2318,2319,5,97,0,0,2319,
- 2320,5,121,0,0,2320,412,1,0,0,0,2321,2322,5,118,0,0,2322,2323,5,97,0,0,
- 2323,2324,5,114,0,0,2324,2325,5,105,0,0,2325,2326,5,97,0,0,2326,2327,5,
- 110,0,0,2327,2328,5,116,0,0,2328,414,1,0,0,0,2329,2330,5,99,0,0,2330,2331,
- 5,117,0,0,2331,2332,5,114,0,0,2332,2333,5,114,0,0,2333,2334,5,101,0,0,
- 2334,2335,5,110,0,0,2335,2336,5,99,0,0,2336,2337,5,121,0,0,2337,416,1,
- 0,0,0,2338,2339,5,115,0,0,2339,2340,5,121,0,0,2340,2341,5,115,0,0,2341,
- 2342,5,99,0,0,2342,2343,5,104,0,0,2343,2344,5,97,0,0,2344,2345,5,114,0,
- 0,2345,418,1,0,0,0,2346,2347,5,101,0,0,2347,2348,5,114,0,0,2348,2349,5,
- 114,0,0,2349,2350,5,111,0,0,2350,2351,5,114,0,0,2351,420,1,0,0,0,2352,
- 2353,5,100,0,0,2353,2354,5,101,0,0,2354,2355,5,99,0,0,2355,2356,5,105,
- 0,0,2356,2357,5,109,0,0,2357,2358,5,97,0,0,2358,2359,5,108,0,0,2359,422,
- 1,0,0,0,2360,2361,5,100,0,0,2361,2362,5,97,0,0,2362,2363,5,116,0,0,2363,
- 2364,5,101,0,0,2364,424,1,0,0,0,2365,2366,5,98,0,0,2366,2367,5,115,0,0,
- 2367,2368,5,116,0,0,2368,2369,5,114,0,0,2369,426,1,0,0,0,2370,2371,5,108,
- 0,0,2371,2372,5,112,0,0,2372,2373,5,115,0,0,2373,2374,5,116,0,0,2374,2375,
- 5,114,0,0,2375,428,1,0,0,0,2376,2377,5,108,0,0,2377,2378,5,112,0,0,2378,
- 2379,5,119,0,0,2379,2380,5,115,0,0,2380,2381,5,116,0,0,2381,2382,5,114,
- 0,0,2382,430,1,0,0,0,2383,2384,5,108,0,0,2384,2385,5,112,0,0,2385,2386,
- 5,116,0,0,2386,2387,5,115,0,0,2387,2388,5,116,0,0,2388,2389,5,114,0,0,
- 2389,432,1,0,0,0,2390,2391,5,111,0,0,2391,2392,5,98,0,0,2392,2393,5,106,
- 0,0,2393,2394,5,101,0,0,2394,2395,5,99,0,0,2395,2396,5,116,0,0,2396,2397,
- 5,114,0,0,2397,2398,5,101,0,0,2398,2399,5,102,0,0,2399,434,1,0,0,0,2400,
- 2401,5,105,0,0,2401,2402,5,117,0,0,2402,2403,5,110,0,0,2403,2404,5,107,
- 0,0,2404,2405,5,110,0,0,2405,2406,5,111,0,0,2406,2407,5,119,0,0,2407,2408,
- 5,110,0,0,2408,436,1,0,0,0,2409,2410,5,105,0,0,2410,2411,5,100,0,0,2411,
- 2412,5,105,0,0,2412,2413,5,115,0,0,2413,2414,5,112,0,0,2414,2415,5,97,
- 0,0,2415,2416,5,116,0,0,2416,2417,5,99,0,0,2417,2418,5,104,0,0,2418,438,
- 1,0,0,0,2419,2420,5,115,0,0,2420,2421,5,116,0,0,2421,2422,5,114,0,0,2422,
- 2423,5,117,0,0,2423,2424,5,99,0,0,2424,2425,5,116,0,0,2425,440,1,0,0,0,
- 2426,2427,5,105,0,0,2427,2428,5,110,0,0,2428,2429,5,116,0,0,2429,2430,
- 5,101,0,0,2430,2431,5,114,0,0,2431,2432,5,102,0,0,2432,2433,5,97,0,0,2433,
- 2434,5,99,0,0,2434,2435,5,101,0,0,2435,442,1,0,0,0,2436,2437,5,115,0,0,
- 2437,2438,5,97,0,0,2438,2439,5,102,0,0,2439,2440,5,101,0,0,2440,2441,5,
- 97,0,0,2441,2442,5,114,0,0,2442,2443,5,114,0,0,2443,2444,5,97,0,0,2444,
- 2445,5,121,0,0,2445,444,1,0,0,0,2446,2447,5,98,0,0,2447,2448,5,121,0,0,
- 2448,2449,5,118,0,0,2449,2450,5,97,0,0,2450,2451,5,108,0,0,2451,2452,5,
- 115,0,0,2452,2453,5,116,0,0,2453,2454,5,114,0,0,2454,446,1,0,0,0,2455,
- 2456,5,97,0,0,2456,2457,5,110,0,0,2457,2458,5,115,0,0,2458,2459,5,105,
- 0,0,2459,448,1,0,0,0,2460,2461,5,116,0,0,2461,2462,5,98,0,0,2462,2463,
- 5,115,0,0,2463,2464,5,116,0,0,2464,2465,5,114,0,0,2465,450,1,0,0,0,2466,
- 2467,5,109,0,0,2467,2468,5,101,0,0,2468,2469,5,116,0,0,2469,2470,5,104,
- 0,0,2470,2471,5,111,0,0,2471,2472,5,100,0,0,2472,452,1,0,0,0,2473,2474,
- 5,97,0,0,2474,2475,5,110,0,0,2475,2476,5,121,0,0,2476,454,1,0,0,0,2477,
- 2478,5,108,0,0,2478,2479,5,112,0,0,2479,2480,5,115,0,0,2480,2481,5,116,
- 0,0,2481,2482,5,114,0,0,2482,2483,5,117,0,0,2483,2484,5,99,0,0,2484,2485,
- 5,116,0,0,2485,456,1,0,0,0,2486,2487,5,118,0,0,2487,2488,5,101,0,0,2488,
- 2489,5,99,0,0,2489,2490,5,116,0,0,2490,2491,5,111,0,0,2491,2492,5,114,
- 0,0,2492,458,1,0,0,0,2493,2494,5,104,0,0,2494,2495,5,114,0,0,2495,2496,
- 5,101,0,0,2496,2497,5,115,0,0,2497,2498,5,117,0,0,2498,2499,5,108,0,0,
- 2499,2500,5,116,0,0,2500,460,1,0,0,0,2501,2502,5,99,0,0,2502,2503,5,97,
- 0,0,2503,2504,5,114,0,0,2504,2505,5,114,0,0,2505,2506,5,97,0,0,2506,2507,
- 5,121,0,0,2507,462,1,0,0,0,2508,2509,5,117,0,0,2509,2510,5,115,0,0,2510,
- 2511,5,101,0,0,2511,2512,5,114,0,0,2512,2513,5,100,0,0,2513,2514,5,101,
- 0,0,2514,2515,5,102,0,0,2515,2516,5,105,0,0,2516,2517,5,110,0,0,2517,2518,
- 5,101,0,0,2518,2519,5,100,0,0,2519,464,1,0,0,0,2520,2521,5,114,0,0,2521,
- 2522,5,101,0,0,2522,2523,5,99,0,0,2523,2524,5,111,0,0,2524,2525,5,114,
- 0,0,2525,2526,5,100,0,0,2526,466,1,0,0,0,2527,2528,5,102,0,0,2528,2529,
- 5,105,0,0,2529,2530,5,108,0,0,2530,2531,5,101,0,0,2531,2532,5,116,0,0,
- 2532,2533,5,105,0,0,2533,2534,5,109,0,0,2534,2535,5,101,0,0,2535,468,1,
- 0,0,0,2536,2537,5,98,0,0,2537,2538,5,108,0,0,2538,2539,5,111,0,0,2539,
- 2540,5,98,0,0,2540,470,1,0,0,0,2541,2542,5,115,0,0,2542,2543,5,116,0,0,
- 2543,2544,5,114,0,0,2544,2545,5,101,0,0,2545,2546,5,97,0,0,2546,2547,5,
- 109,0,0,2547,472,1,0,0,0,2548,2549,5,115,0,0,2549,2550,5,116,0,0,2550,
- 2551,5,111,0,0,2551,2552,5,114,0,0,2552,2553,5,97,0,0,2553,2554,5,103,
- 0,0,2554,2555,5,101,0,0,2555,474,1,0,0,0,2556,2557,5,115,0,0,2557,2558,
- 5,116,0,0,2558,2559,5,114,0,0,2559,2560,5,101,0,0,2560,2561,5,97,0,0,2561,
- 2562,5,109,0,0,2562,2563,5,101,0,0,2563,2564,5,100,0,0,2564,2565,5,95,
- 0,0,2565,2566,5,111,0,0,2566,2567,5,98,0,0,2567,2568,5,106,0,0,2568,2569,
- 5,101,0,0,2569,2570,5,99,0,0,2570,2571,5,116,0,0,2571,476,1,0,0,0,2572,
- 2573,5,115,0,0,2573,2574,5,116,0,0,2574,2575,5,111,0,0,2575,2576,5,114,
- 0,0,2576,2577,5,101,0,0,2577,2578,5,100,0,0,2578,2579,5,95,0,0,2579,2580,
- 5,111,0,0,2580,2581,5,98,0,0,2581,2582,5,106,0,0,2582,2583,5,101,0,0,2583,
- 2584,5,99,0,0,2584,2585,5,116,0,0,2585,478,1,0,0,0,2586,2587,5,98,0,0,
- 2587,2588,5,108,0,0,2588,2589,5,111,0,0,2589,2590,5,98,0,0,2590,2591,5,
- 95,0,0,2591,2592,5,111,0,0,2592,2593,5,98,0,0,2593,2594,5,106,0,0,2594,
- 2595,5,101,0,0,2595,2596,5,99,0,0,2596,2597,5,116,0,0,2597,480,1,0,0,0,
- 2598,2599,5,99,0,0,2599,2600,5,102,0,0,2600,482,1,0,0,0,2601,2602,5,99,
- 0,0,2602,2603,5,108,0,0,2603,2604,5,115,0,0,2604,2605,5,105,0,0,2605,2606,
- 5,100,0,0,2606,484,1,0,0,0,2607,2608,5,105,0,0,2608,2609,5,110,0,0,2609,
- 2610,5,115,0,0,2610,2611,5,116,0,0,2611,2612,5,97,0,0,2612,2613,5,110,
- 0,0,2613,2614,5,99,0,0,2614,2615,5,101,0,0,2615,486,1,0,0,0,2616,2617,
- 5,101,0,0,2617,2618,5,120,0,0,2618,2619,5,112,0,0,2619,2620,5,108,0,0,
- 2620,2621,5,105,0,0,2621,2622,5,99,0,0,2622,2623,5,105,0,0,2623,2624,5,
- 116,0,0,2624,488,1,0,0,0,2625,2626,5,100,0,0,2626,2627,5,101,0,0,2627,
- 2628,5,102,0,0,2628,2629,5,97,0,0,2629,2630,5,117,0,0,2630,2631,5,108,
- 0,0,2631,2632,5,116,0,0,2632,490,1,0,0,0,2633,2634,5,118,0,0,2634,2635,
- 5,97,0,0,2635,2636,5,114,0,0,2636,2637,5,97,0,0,2637,2638,5,114,0,0,2638,
- 2639,5,103,0,0,2639,492,1,0,0,0,2640,2641,5,117,0,0,2641,2642,5,110,0,
- 0,2642,2643,5,109,0,0,2643,2644,5,97,0,0,2644,2645,5,110,0,0,2645,2646,
- 5,97,0,0,2646,2647,5,103,0,0,2647,2648,5,101,0,0,2648,2649,5,100,0,0,2649,
- 494,1,0,0,0,2650,2651,5,99,0,0,2651,2652,5,100,0,0,2652,2653,5,101,0,0,
- 2653,2654,5,99,0,0,2654,2655,5,108,0,0,2655,496,1,0,0,0,2656,2657,5,115,
- 0,0,2657,2658,5,116,0,0,2658,2659,5,100,0,0,2659,2660,5,99,0,0,2660,2661,
- 5,97,0,0,2661,2662,5,108,0,0,2662,2663,5,108,0,0,2663,498,1,0,0,0,2664,
- 2665,5,116,0,0,2665,2666,5,104,0,0,2666,2667,5,105,0,0,2667,2668,5,115,
- 0,0,2668,2669,5,99,0,0,2669,2670,5,97,0,0,2670,2671,5,108,0,0,2671,2672,
- 5,108,0,0,2672,500,1,0,0,0,2673,2674,5,102,0,0,2674,2675,5,97,0,0,2675,
- 2676,5,115,0,0,2676,2677,5,116,0,0,2677,2678,5,99,0,0,2678,2679,5,97,0,
- 0,2679,2680,5,108,0,0,2680,2681,5,108,0,0,2681,502,1,0,0,0,2682,2683,5,
- 33,0,0,2683,504,1,0,0,0,2684,2685,5,33,0,0,2685,2686,5,33,0,0,2686,506,
- 1,0,0,0,2687,2688,5,116,0,0,2688,2689,5,121,0,0,2689,2690,5,112,0,0,2690,
- 2691,5,101,0,0,2691,2692,5,100,0,0,2692,2693,5,114,0,0,2693,2694,5,101,
- 0,0,2694,2702,5,102,0,0,2695,2696,5,114,0,0,2696,2697,5,101,0,0,2697,2698,
- 5,102,0,0,2698,2699,5,97,0,0,2699,2700,5,110,0,0,2700,2702,5,121,0,0,2701,
- 2687,1,0,0,0,2701,2695,1,0,0,0,2702,508,1,0,0,0,2703,2704,5,46,0,0,2704,
- 2705,5,112,0,0,2705,2706,5,97,0,0,2706,2707,5,114,0,0,2707,2708,5,97,0,
- 0,2708,2709,5,109,0,0,2709,510,1,0,0,0,2710,2711,5,99,0,0,2711,2712,5,
- 111,0,0,2712,2713,5,110,0,0,2713,2714,5,115,0,0,2714,2715,5,116,0,0,2715,
- 2716,5,114,0,0,2716,2717,5,97,0,0,2717,2718,5,105,0,0,2718,2719,5,110,
- 0,0,2719,2720,5,116,0,0,2720,512,1,0,0,0,2721,2722,5,46,0,0,2722,2723,
- 5,116,0,0,2723,2724,5,104,0,0,2724,2725,5,105,0,0,2725,2726,5,115,0,0,
- 2726,514,1,0,0,0,2727,2728,5,46,0,0,2728,2729,5,98,0,0,2729,2730,5,97,
- 0,0,2730,2731,5,115,0,0,2731,2732,5,101,0,0,2732,516,1,0,0,0,2733,2734,
- 5,46,0,0,2734,2735,5,110,0,0,2735,2736,5,101,0,0,2736,2737,5,115,0,0,2737,
- 2738,5,116,0,0,2738,2739,5,101,0,0,2739,2740,5,114,0,0,2740,518,1,0,0,
- 0,2741,2742,5,38,0,0,2742,520,1,0,0,0,2743,2744,5,91,0,0,2744,2745,5,93,
- 0,0,2745,522,1,0,0,0,2746,2747,5,42,0,0,2747,524,1,0,0,0,2748,2761,5,92,
- 0,0,2749,2762,7,4,0,0,2750,2752,7,5,0,0,2751,2753,7,5,0,0,2752,2751,1,
- 0,0,0,2752,2753,1,0,0,0,2753,2755,1,0,0,0,2754,2756,7,5,0,0,2755,2754,
- 1,0,0,0,2755,2756,1,0,0,0,2756,2762,1,0,0,0,2757,2759,5,13,0,0,2758,2757,
- 1,0,0,0,2758,2759,1,0,0,0,2759,2760,1,0,0,0,2760,2762,5,10,0,0,2761,2749,
- 1,0,0,0,2761,2750,1,0,0,0,2761,2758,1,0,0,0,2762,526,1,0,0,0,2763,2768,
- 5,34,0,0,2764,2767,8,6,0,0,2765,2767,3,525,262,0,2766,2764,1,0,0,0,2766,
- 2765,1,0,0,0,2767,2770,1,0,0,0,2768,2766,1,0,0,0,2768,2769,1,0,0,0,2769,
- 2771,1,0,0,0,2770,2768,1,0,0,0,2771,2772,5,34,0,0,2772,528,1,0,0,0,2773,
- 2778,5,39,0,0,2774,2777,8,7,0,0,2775,2777,3,525,262,0,2776,2774,1,0,0,
- 0,2776,2775,1,0,0,0,2777,2780,1,0,0,0,2778,2776,1,0,0,0,2778,2779,1,0,
- 0,0,2779,2781,1,0,0,0,2780,2778,1,0,0,0,2781,2782,5,39,0,0,2782,530,1,
- 0,0,0,2783,2784,5,46,0,0,2784,532,1,0,0,0,2785,2786,5,43,0,0,2786,534,
- 1,0,0,0,2787,2788,5,35,0,0,2788,2789,5,100,0,0,2789,2790,5,101,0,0,2790,
- 2791,5,102,0,0,2791,2792,5,105,0,0,2792,2793,5,110,0,0,2793,2794,5,101,
- 0,0,2794,536,1,0,0,0,2795,2796,5,35,0,0,2796,2797,5,117,0,0,2797,2798,
- 5,110,0,0,2798,2799,5,100,0,0,2799,2800,5,101,0,0,2800,2801,5,102,0,0,
- 2801,538,1,0,0,0,2802,2803,5,35,0,0,2803,2804,5,105,0,0,2804,2805,5,102,
- 0,0,2805,2806,5,100,0,0,2806,2807,5,101,0,0,2807,2808,5,102,0,0,2808,540,
- 1,0,0,0,2809,2810,5,35,0,0,2810,2811,5,105,0,0,2811,2812,5,102,0,0,2812,
- 2813,5,110,0,0,2813,2814,5,100,0,0,2814,2815,5,101,0,0,2815,2816,5,102,
- 0,0,2816,542,1,0,0,0,2817,2818,5,35,0,0,2818,2819,5,101,0,0,2819,2820,
- 5,108,0,0,2820,2821,5,115,0,0,2821,2822,5,101,0,0,2822,544,1,0,0,0,2823,
- 2824,5,35,0,0,2824,2825,5,101,0,0,2825,2826,5,110,0,0,2826,2827,5,100,
- 0,0,2827,2828,5,105,0,0,2828,2829,5,102,0,0,2829,546,1,0,0,0,2830,2831,
- 5,35,0,0,2831,2832,5,105,0,0,2832,2833,5,110,0,0,2833,2834,5,99,0,0,2834,
- 2835,5,108,0,0,2835,2836,5,117,0,0,2836,2837,5,100,0,0,2837,2838,5,101,
- 0,0,2838,548,1,0,0,0,2839,2840,5,46,0,0,2840,2841,5,109,0,0,2841,2842,
- 5,114,0,0,2842,2843,5,101,0,0,2843,2844,5,115,0,0,2844,2845,5,111,0,0,
- 2845,2846,5,117,0,0,2846,2847,5,114,0,0,2847,2848,5,99,0,0,2848,2849,5,
- 101,0,0,2849,550,1,0,0,0,2850,2851,5,110,0,0,2851,2852,5,111,0,0,2852,
- 4033,5,112,0,0,2853,2854,5,98,0,0,2854,2855,5,114,0,0,2855,2856,5,101,
- 0,0,2856,2857,5,97,0,0,2857,4033,5,107,0,0,2858,2859,5,108,0,0,2859,2860,
- 5,100,0,0,2860,2861,5,97,0,0,2861,2862,5,114,0,0,2862,2863,5,103,0,0,2863,
- 2864,5,46,0,0,2864,4033,5,48,0,0,2865,2866,5,108,0,0,2866,2867,5,100,0,
- 0,2867,2868,5,97,0,0,2868,2869,5,114,0,0,2869,2870,5,103,0,0,2870,2871,
- 5,46,0,0,2871,4033,5,49,0,0,2872,2873,5,108,0,0,2873,2874,5,100,0,0,2874,
- 2875,5,97,0,0,2875,2876,5,114,0,0,2876,2877,5,103,0,0,2877,2878,5,46,0,
- 0,2878,4033,5,50,0,0,2879,2880,5,108,0,0,2880,2881,5,100,0,0,2881,2882,
- 5,97,0,0,2882,2883,5,114,0,0,2883,2884,5,103,0,0,2884,2885,5,46,0,0,2885,
- 4033,5,51,0,0,2886,2887,5,108,0,0,2887,2888,5,100,0,0,2888,2889,5,108,
- 0,0,2889,2890,5,111,0,0,2890,2891,5,99,0,0,2891,2892,5,46,0,0,2892,4033,
- 5,48,0,0,2893,2894,5,108,0,0,2894,2895,5,100,0,0,2895,2896,5,108,0,0,2896,
- 2897,5,111,0,0,2897,2898,5,99,0,0,2898,2899,5,46,0,0,2899,4033,5,49,0,
- 0,2900,2901,5,108,0,0,2901,2902,5,100,0,0,2902,2903,5,108,0,0,2903,2904,
- 5,111,0,0,2904,2905,5,99,0,0,2905,2906,5,46,0,0,2906,4033,5,50,0,0,2907,
- 2908,5,108,0,0,2908,2909,5,100,0,0,2909,2910,5,108,0,0,2910,2911,5,111,
- 0,0,2911,2912,5,99,0,0,2912,2913,5,46,0,0,2913,4033,5,51,0,0,2914,2915,
- 5,115,0,0,2915,2916,5,116,0,0,2916,2917,5,108,0,0,2917,2918,5,111,0,0,
- 2918,2919,5,99,0,0,2919,2920,5,46,0,0,2920,4033,5,48,0,0,2921,2922,5,115,
- 0,0,2922,2923,5,116,0,0,2923,2924,5,108,0,0,2924,2925,5,111,0,0,2925,2926,
- 5,99,0,0,2926,2927,5,46,0,0,2927,4033,5,49,0,0,2928,2929,5,115,0,0,2929,
- 2930,5,116,0,0,2930,2931,5,108,0,0,2931,2932,5,111,0,0,2932,2933,5,99,
- 0,0,2933,2934,5,46,0,0,2934,4033,5,50,0,0,2935,2936,5,115,0,0,2936,2937,
- 5,116,0,0,2937,2938,5,108,0,0,2938,2939,5,111,0,0,2939,2940,5,99,0,0,2940,
- 2941,5,46,0,0,2941,4033,5,51,0,0,2942,2943,5,108,0,0,2943,2944,5,100,0,
- 0,2944,2945,5,110,0,0,2945,2946,5,117,0,0,2946,2947,5,108,0,0,2947,4033,
- 5,108,0,0,2948,2949,5,108,0,0,2949,2950,5,100,0,0,2950,2951,5,99,0,0,2951,
- 2952,5,46,0,0,2952,2953,5,105,0,0,2953,2954,5,52,0,0,2954,2955,5,46,0,
- 0,2955,2956,5,109,0,0,2956,4033,5,49,0,0,2957,2958,5,108,0,0,2958,2959,
- 5,100,0,0,2959,2960,5,99,0,0,2960,2961,5,46,0,0,2961,2962,5,105,0,0,2962,
- 2963,5,52,0,0,2963,2964,5,46,0,0,2964,2965,5,77,0,0,2965,4033,5,49,0,0,
- 2966,2967,5,108,0,0,2967,2968,5,100,0,0,2968,2969,5,99,0,0,2969,2970,5,
- 46,0,0,2970,2971,5,105,0,0,2971,2972,5,52,0,0,2972,2973,5,46,0,0,2973,
- 4033,5,48,0,0,2974,2975,5,108,0,0,2975,2976,5,100,0,0,2976,2977,5,99,0,
- 0,2977,2978,5,46,0,0,2978,2979,5,105,0,0,2979,2980,5,52,0,0,2980,2981,
- 5,46,0,0,2981,4033,5,49,0,0,2982,2983,5,108,0,0,2983,2984,5,100,0,0,2984,
- 2985,5,99,0,0,2985,2986,5,46,0,0,2986,2987,5,105,0,0,2987,2988,5,52,0,
- 0,2988,2989,5,46,0,0,2989,4033,5,50,0,0,2990,2991,5,108,0,0,2991,2992,
- 5,100,0,0,2992,2993,5,99,0,0,2993,2994,5,46,0,0,2994,2995,5,105,0,0,2995,
- 2996,5,52,0,0,2996,2997,5,46,0,0,2997,4033,5,51,0,0,2998,2999,5,108,0,
- 0,2999,3000,5,100,0,0,3000,3001,5,99,0,0,3001,3002,5,46,0,0,3002,3003,
- 5,105,0,0,3003,3004,5,52,0,0,3004,3005,5,46,0,0,3005,4033,5,52,0,0,3006,
- 3007,5,108,0,0,3007,3008,5,100,0,0,3008,3009,5,99,0,0,3009,3010,5,46,0,
- 0,3010,3011,5,105,0,0,3011,3012,5,52,0,0,3012,3013,5,46,0,0,3013,4033,
- 5,53,0,0,3014,3015,5,108,0,0,3015,3016,5,100,0,0,3016,3017,5,99,0,0,3017,
- 3018,5,46,0,0,3018,3019,5,105,0,0,3019,3020,5,52,0,0,3020,3021,5,46,0,
- 0,3021,4033,5,54,0,0,3022,3023,5,108,0,0,3023,3024,5,100,0,0,3024,3025,
- 5,99,0,0,3025,3026,5,46,0,0,3026,3027,5,105,0,0,3027,3028,5,52,0,0,3028,
- 3029,5,46,0,0,3029,4033,5,55,0,0,3030,3031,5,108,0,0,3031,3032,5,100,0,
- 0,3032,3033,5,99,0,0,3033,3034,5,46,0,0,3034,3035,5,105,0,0,3035,3036,
- 5,52,0,0,3036,3037,5,46,0,0,3037,4033,5,56,0,0,3038,3039,5,100,0,0,3039,
- 3040,5,117,0,0,3040,4033,5,112,0,0,3041,3042,5,112,0,0,3042,3043,5,111,
- 0,0,3043,4033,5,112,0,0,3044,3045,5,114,0,0,3045,3046,5,101,0,0,3046,4033,
- 5,116,0,0,3047,3048,5,108,0,0,3048,3049,5,100,0,0,3049,3050,5,105,0,0,
- 3050,3051,5,110,0,0,3051,3052,5,100,0,0,3052,3053,5,46,0,0,3053,3054,5,
- 105,0,0,3054,4033,5,49,0,0,3055,3056,5,108,0,0,3056,3057,5,100,0,0,3057,
- 3058,5,105,0,0,3058,3059,5,110,0,0,3059,3060,5,100,0,0,3060,3061,5,46,
- 0,0,3061,3062,5,117,0,0,3062,4033,5,49,0,0,3063,3064,5,108,0,0,3064,3065,
- 5,100,0,0,3065,3066,5,105,0,0,3066,3067,5,110,0,0,3067,3068,5,100,0,0,
- 3068,3069,5,46,0,0,3069,3070,5,105,0,0,3070,4033,5,50,0,0,3071,3072,5,
- 108,0,0,3072,3073,5,100,0,0,3073,3074,5,105,0,0,3074,3075,5,110,0,0,3075,
- 3076,5,100,0,0,3076,3077,5,46,0,0,3077,3078,5,117,0,0,3078,4033,5,50,0,
- 0,3079,3080,5,108,0,0,3080,3081,5,100,0,0,3081,3082,5,105,0,0,3082,3083,
- 5,110,0,0,3083,3084,5,100,0,0,3084,3085,5,46,0,0,3085,3086,5,105,0,0,3086,
- 4033,5,52,0,0,3087,3088,5,108,0,0,3088,3089,5,100,0,0,3089,3090,5,105,
- 0,0,3090,3091,5,110,0,0,3091,3092,5,100,0,0,3092,3093,5,46,0,0,3093,3094,
- 5,117,0,0,3094,4033,5,52,0,0,3095,3096,5,108,0,0,3096,3097,5,100,0,0,3097,
- 3098,5,105,0,0,3098,3099,5,110,0,0,3099,3100,5,100,0,0,3100,3101,5,46,
- 0,0,3101,3102,5,105,0,0,3102,4033,5,56,0,0,3103,3104,5,108,0,0,3104,3105,
- 5,100,0,0,3105,3106,5,105,0,0,3106,3107,5,110,0,0,3107,3108,5,100,0,0,
- 3108,3109,5,46,0,0,3109,3110,5,117,0,0,3110,4033,5,56,0,0,3111,3112,5,
- 108,0,0,3112,3113,5,100,0,0,3113,3114,5,105,0,0,3114,3115,5,110,0,0,3115,
- 3116,5,100,0,0,3116,3117,5,46,0,0,3117,4033,5,105,0,0,3118,3119,5,108,
- 0,0,3119,3120,5,100,0,0,3120,3121,5,105,0,0,3121,3122,5,110,0,0,3122,3123,
- 5,100,0,0,3123,3124,5,46,0,0,3124,3125,5,114,0,0,3125,4033,5,52,0,0,3126,
- 3127,5,108,0,0,3127,3128,5,100,0,0,3128,3129,5,105,0,0,3129,3130,5,110,
- 0,0,3130,3131,5,100,0,0,3131,3132,5,46,0,0,3132,3133,5,114,0,0,3133,4033,
- 5,56,0,0,3134,3135,5,108,0,0,3135,3136,5,100,0,0,3136,3137,5,105,0,0,3137,
- 3138,5,110,0,0,3138,3139,5,100,0,0,3139,3140,5,46,0,0,3140,3141,5,114,
- 0,0,3141,3142,5,101,0,0,3142,4033,5,102,0,0,3143,3144,5,115,0,0,3144,3145,
- 5,116,0,0,3145,3146,5,105,0,0,3146,3147,5,110,0,0,3147,3148,5,100,0,0,
- 3148,3149,5,46,0,0,3149,3150,5,114,0,0,3150,3151,5,101,0,0,3151,4033,5,
- 102,0,0,3152,3153,5,115,0,0,3153,3154,5,116,0,0,3154,3155,5,105,0,0,3155,
- 3156,5,110,0,0,3156,3157,5,100,0,0,3157,3158,5,46,0,0,3158,3159,5,105,
- 0,0,3159,4033,5,49,0,0,3160,3161,5,115,0,0,3161,3162,5,116,0,0,3162,3163,
- 5,105,0,0,3163,3164,5,110,0,0,3164,3165,5,100,0,0,3165,3166,5,46,0,0,3166,
- 3167,5,105,0,0,3167,4033,5,50,0,0,3168,3169,5,115,0,0,3169,3170,5,116,
- 0,0,3170,3171,5,105,0,0,3171,3172,5,110,0,0,3172,3173,5,100,0,0,3173,3174,
- 5,46,0,0,3174,3175,5,105,0,0,3175,4033,5,52,0,0,3176,3177,5,115,0,0,3177,
- 3178,5,116,0,0,3178,3179,5,105,0,0,3179,3180,5,110,0,0,3180,3181,5,100,
- 0,0,3181,3182,5,46,0,0,3182,3183,5,105,0,0,3183,4033,5,56,0,0,3184,3185,
- 5,115,0,0,3185,3186,5,116,0,0,3186,3187,5,105,0,0,3187,3188,5,110,0,0,
- 3188,3189,5,100,0,0,3189,3190,5,46,0,0,3190,3191,5,114,0,0,3191,4033,5,
- 52,0,0,3192,3193,5,115,0,0,3193,3194,5,116,0,0,3194,3195,5,105,0,0,3195,
- 3196,5,110,0,0,3196,3197,5,100,0,0,3197,3198,5,46,0,0,3198,3199,5,114,
- 0,0,3199,4033,5,56,0,0,3200,3201,5,97,0,0,3201,3202,5,100,0,0,3202,4033,
- 5,100,0,0,3203,3204,5,115,0,0,3204,3205,5,117,0,0,3205,4033,5,98,0,0,3206,
- 3207,5,109,0,0,3207,3208,5,117,0,0,3208,4033,5,108,0,0,3209,3210,5,100,
- 0,0,3210,3211,5,105,0,0,3211,4033,5,118,0,0,3212,3213,5,100,0,0,3213,3214,
- 5,105,0,0,3214,3215,5,118,0,0,3215,3216,5,46,0,0,3216,3217,5,117,0,0,3217,
- 4033,5,110,0,0,3218,3219,5,114,0,0,3219,3220,5,101,0,0,3220,4033,5,109,
- 0,0,3221,3222,5,114,0,0,3222,3223,5,101,0,0,3223,3224,5,109,0,0,3224,3225,
- 5,46,0,0,3225,3226,5,117,0,0,3226,4033,5,110,0,0,3227,3228,5,97,0,0,3228,
- 3229,5,110,0,0,3229,4033,5,100,0,0,3230,3231,5,111,0,0,3231,4033,5,114,
- 0,0,3232,3233,5,120,0,0,3233,3234,5,111,0,0,3234,4033,5,114,0,0,3235,3236,
- 5,115,0,0,3236,3237,5,104,0,0,3237,4033,5,108,0,0,3238,3239,5,115,0,0,
- 3239,3240,5,104,0,0,3240,4033,5,114,0,0,3241,3242,5,115,0,0,3242,3243,
- 5,104,0,0,3243,3244,5,114,0,0,3244,3245,5,46,0,0,3245,3246,5,117,0,0,3246,
- 4033,5,110,0,0,3247,3248,5,110,0,0,3248,3249,5,101,0,0,3249,4033,5,103,
- 0,0,3250,3251,5,110,0,0,3251,3252,5,111,0,0,3252,4033,5,116,0,0,3253,3254,
- 5,99,0,0,3254,3255,5,111,0,0,3255,3256,5,110,0,0,3256,3257,5,118,0,0,3257,
- 3258,5,46,0,0,3258,3259,5,105,0,0,3259,4033,5,49,0,0,3260,3261,5,99,0,
- 0,3261,3262,5,111,0,0,3262,3263,5,110,0,0,3263,3264,5,118,0,0,3264,3265,
- 5,46,0,0,3265,3266,5,105,0,0,3266,4033,5,50,0,0,3267,3268,5,99,0,0,3268,
- 3269,5,111,0,0,3269,3270,5,110,0,0,3270,3271,5,118,0,0,3271,3272,5,46,
- 0,0,3272,3273,5,105,0,0,3273,4033,5,52,0,0,3274,3275,5,99,0,0,3275,3276,
- 5,111,0,0,3276,3277,5,110,0,0,3277,3278,5,118,0,0,3278,3279,5,46,0,0,3279,
- 3280,5,105,0,0,3280,4033,5,56,0,0,3281,3282,5,99,0,0,3282,3283,5,111,0,
- 0,3283,3284,5,110,0,0,3284,3285,5,118,0,0,3285,3286,5,46,0,0,3286,3287,
- 5,114,0,0,3287,4033,5,52,0,0,3288,3289,5,99,0,0,3289,3290,5,111,0,0,3290,
- 3291,5,110,0,0,3291,3292,5,118,0,0,3292,3293,5,46,0,0,3293,3294,5,114,
- 0,0,3294,4033,5,56,0,0,3295,3296,5,99,0,0,3296,3297,5,111,0,0,3297,3298,
- 5,110,0,0,3298,3299,5,118,0,0,3299,3300,5,46,0,0,3300,3301,5,117,0,0,3301,
- 4033,5,52,0,0,3302,3303,5,99,0,0,3303,3304,5,111,0,0,3304,3305,5,110,0,
- 0,3305,3306,5,118,0,0,3306,3307,5,46,0,0,3307,3308,5,117,0,0,3308,4033,
- 5,56,0,0,3309,3310,5,99,0,0,3310,3311,5,111,0,0,3311,3312,5,110,0,0,3312,
- 3313,5,118,0,0,3313,3314,5,46,0,0,3314,3315,5,114,0,0,3315,3316,5,46,0,
- 0,3316,3317,5,117,0,0,3317,4033,5,110,0,0,3318,3319,5,116,0,0,3319,3320,
- 5,104,0,0,3320,3321,5,114,0,0,3321,3322,5,111,0,0,3322,4033,5,119,0,0,
- 3323,3324,5,99,0,0,3324,3325,5,111,0,0,3325,3326,5,110,0,0,3326,3327,5,
- 118,0,0,3327,3328,5,46,0,0,3328,3329,5,111,0,0,3329,3330,5,118,0,0,3330,
- 3331,5,102,0,0,3331,3332,5,46,0,0,3332,3333,5,105,0,0,3333,3334,5,49,0,
- 0,3334,3335,5,46,0,0,3335,3336,5,117,0,0,3336,4033,5,110,0,0,3337,3338,
- 5,99,0,0,3338,3339,5,111,0,0,3339,3340,5,110,0,0,3340,3341,5,118,0,0,3341,
- 3342,5,46,0,0,3342,3343,5,111,0,0,3343,3344,5,118,0,0,3344,3345,5,102,
- 0,0,3345,3346,5,46,0,0,3346,3347,5,105,0,0,3347,3348,5,50,0,0,3348,3349,
- 5,46,0,0,3349,3350,5,117,0,0,3350,4033,5,110,0,0,3351,3352,5,99,0,0,3352,
- 3353,5,111,0,0,3353,3354,5,110,0,0,3354,3355,5,118,0,0,3355,3356,5,46,
- 0,0,3356,3357,5,111,0,0,3357,3358,5,118,0,0,3358,3359,5,102,0,0,3359,3360,
- 5,46,0,0,3360,3361,5,105,0,0,3361,3362,5,52,0,0,3362,3363,5,46,0,0,3363,
- 3364,5,117,0,0,3364,4033,5,110,0,0,3365,3366,5,99,0,0,3366,3367,5,111,
- 0,0,3367,3368,5,110,0,0,3368,3369,5,118,0,0,3369,3370,5,46,0,0,3370,3371,
- 5,111,0,0,3371,3372,5,118,0,0,3372,3373,5,102,0,0,3373,3374,5,46,0,0,3374,
- 3375,5,105,0,0,3375,3376,5,56,0,0,3376,3377,5,46,0,0,3377,3378,5,117,0,
- 0,3378,4033,5,110,0,0,3379,3380,5,99,0,0,3380,3381,5,111,0,0,3381,3382,
- 5,110,0,0,3382,3383,5,118,0,0,3383,3384,5,46,0,0,3384,3385,5,111,0,0,3385,
- 3386,5,118,0,0,3386,3387,5,102,0,0,3387,3388,5,46,0,0,3388,3389,5,117,
- 0,0,3389,3390,5,49,0,0,3390,3391,5,46,0,0,3391,3392,5,117,0,0,3392,4033,
- 5,110,0,0,3393,3394,5,99,0,0,3394,3395,5,111,0,0,3395,3396,5,110,0,0,3396,
- 3397,5,118,0,0,3397,3398,5,46,0,0,3398,3399,5,111,0,0,3399,3400,5,118,
- 0,0,3400,3401,5,102,0,0,3401,3402,5,46,0,0,3402,3403,5,117,0,0,3403,3404,
- 5,50,0,0,3404,3405,5,46,0,0,3405,3406,5,117,0,0,3406,4033,5,110,0,0,3407,
- 3408,5,99,0,0,3408,3409,5,111,0,0,3409,3410,5,110,0,0,3410,3411,5,118,
- 0,0,3411,3412,5,46,0,0,3412,3413,5,111,0,0,3413,3414,5,118,0,0,3414,3415,
- 5,102,0,0,3415,3416,5,46,0,0,3416,3417,5,117,0,0,3417,3418,5,52,0,0,3418,
- 3419,5,46,0,0,3419,3420,5,117,0,0,3420,4033,5,110,0,0,3421,3422,5,99,0,
- 0,3422,3423,5,111,0,0,3423,3424,5,110,0,0,3424,3425,5,118,0,0,3425,3426,
- 5,46,0,0,3426,3427,5,111,0,0,3427,3428,5,118,0,0,3428,3429,5,102,0,0,3429,
- 3430,5,46,0,0,3430,3431,5,117,0,0,3431,3432,5,56,0,0,3432,3433,5,46,0,
- 0,3433,3434,5,117,0,0,3434,4033,5,110,0,0,3435,3436,5,99,0,0,3436,3437,
- 5,111,0,0,3437,3438,5,110,0,0,3438,3439,5,118,0,0,3439,3440,5,46,0,0,3440,
- 3441,5,111,0,0,3441,3442,5,118,0,0,3442,3443,5,102,0,0,3443,3444,5,46,
- 0,0,3444,3445,5,105,0,0,3445,3446,5,46,0,0,3446,3447,5,117,0,0,3447,4033,
- 5,110,0,0,3448,3449,5,99,0,0,3449,3450,5,111,0,0,3450,3451,5,110,0,0,3451,
- 3452,5,118,0,0,3452,3453,5,46,0,0,3453,3454,5,111,0,0,3454,3455,5,118,
- 0,0,3455,3456,5,102,0,0,3456,3457,5,46,0,0,3457,3458,5,117,0,0,3458,3459,
- 5,46,0,0,3459,3460,5,117,0,0,3460,4033,5,110,0,0,3461,3462,5,108,0,0,3462,
- 3463,5,100,0,0,3463,3464,5,108,0,0,3464,3465,5,101,0,0,3465,4033,5,110,
- 0,0,3466,3467,5,108,0,0,3467,3468,5,100,0,0,3468,3469,5,101,0,0,3469,3470,
- 5,108,0,0,3470,3471,5,101,0,0,3471,3472,5,109,0,0,3472,3473,5,46,0,0,3473,
- 3474,5,105,0,0,3474,4033,5,49,0,0,3475,3476,5,108,0,0,3476,3477,5,100,
- 0,0,3477,3478,5,101,0,0,3478,3479,5,108,0,0,3479,3480,5,101,0,0,3480,3481,
- 5,109,0,0,3481,3482,5,46,0,0,3482,3483,5,117,0,0,3483,4033,5,49,0,0,3484,
- 3485,5,108,0,0,3485,3486,5,100,0,0,3486,3487,5,101,0,0,3487,3488,5,108,
- 0,0,3488,3489,5,101,0,0,3489,3490,5,109,0,0,3490,3491,5,46,0,0,3491,3492,
- 5,105,0,0,3492,4033,5,50,0,0,3493,3494,5,108,0,0,3494,3495,5,100,0,0,3495,
- 3496,5,101,0,0,3496,3497,5,108,0,0,3497,3498,5,101,0,0,3498,3499,5,109,
- 0,0,3499,3500,5,46,0,0,3500,3501,5,117,0,0,3501,4033,5,50,0,0,3502,3503,
- 5,108,0,0,3503,3504,5,100,0,0,3504,3505,5,101,0,0,3505,3506,5,108,0,0,
- 3506,3507,5,101,0,0,3507,3508,5,109,0,0,3508,3509,5,46,0,0,3509,3510,5,
- 105,0,0,3510,4033,5,52,0,0,3511,3512,5,108,0,0,3512,3513,5,100,0,0,3513,
- 3514,5,101,0,0,3514,3515,5,108,0,0,3515,3516,5,101,0,0,3516,3517,5,109,
- 0,0,3517,3518,5,46,0,0,3518,3519,5,117,0,0,3519,4033,5,52,0,0,3520,3521,
- 5,108,0,0,3521,3522,5,100,0,0,3522,3523,5,101,0,0,3523,3524,5,108,0,0,
- 3524,3525,5,101,0,0,3525,3526,5,109,0,0,3526,3527,5,46,0,0,3527,3528,5,
- 105,0,0,3528,4033,5,56,0,0,3529,3530,5,108,0,0,3530,3531,5,100,0,0,3531,
- 3532,5,101,0,0,3532,3533,5,108,0,0,3533,3534,5,101,0,0,3534,3535,5,109,
- 0,0,3535,3536,5,46,0,0,3536,3537,5,117,0,0,3537,4033,5,56,0,0,3538,3539,
- 5,108,0,0,3539,3540,5,100,0,0,3540,3541,5,101,0,0,3541,3542,5,108,0,0,
- 3542,3543,5,101,0,0,3543,3544,5,109,0,0,3544,3545,5,46,0,0,3545,4033,5,
- 105,0,0,3546,3547,5,108,0,0,3547,3548,5,100,0,0,3548,3549,5,101,0,0,3549,
- 3550,5,108,0,0,3550,3551,5,101,0,0,3551,3552,5,109,0,0,3552,3553,5,46,
- 0,0,3553,3554,5,114,0,0,3554,4033,5,52,0,0,3555,3556,5,108,0,0,3556,3557,
- 5,100,0,0,3557,3558,5,101,0,0,3558,3559,5,108,0,0,3559,3560,5,101,0,0,
- 3560,3561,5,109,0,0,3561,3562,5,46,0,0,3562,3563,5,114,0,0,3563,4033,5,
- 56,0,0,3564,3565,5,108,0,0,3565,3566,5,100,0,0,3566,3567,5,101,0,0,3567,
- 3568,5,108,0,0,3568,3569,5,101,0,0,3569,3570,5,109,0,0,3570,3571,5,46,
- 0,0,3571,3572,5,114,0,0,3572,3573,5,101,0,0,3573,4033,5,102,0,0,3574,3575,
- 5,115,0,0,3575,3576,5,116,0,0,3576,3577,5,101,0,0,3577,3578,5,108,0,0,
- 3578,3579,5,101,0,0,3579,3580,5,109,0,0,3580,3581,5,46,0,0,3581,4033,5,
- 105,0,0,3582,3583,5,115,0,0,3583,3584,5,116,0,0,3584,3585,5,101,0,0,3585,
- 3586,5,108,0,0,3586,3587,5,101,0,0,3587,3588,5,109,0,0,3588,3589,5,46,
- 0,0,3589,3590,5,105,0,0,3590,4033,5,49,0,0,3591,3592,5,115,0,0,3592,3593,
- 5,116,0,0,3593,3594,5,101,0,0,3594,3595,5,108,0,0,3595,3596,5,101,0,0,
- 3596,3597,5,109,0,0,3597,3598,5,46,0,0,3598,3599,5,105,0,0,3599,4033,5,
- 50,0,0,3600,3601,5,115,0,0,3601,3602,5,116,0,0,3602,3603,5,101,0,0,3603,
- 3604,5,108,0,0,3604,3605,5,101,0,0,3605,3606,5,109,0,0,3606,3607,5,46,
- 0,0,3607,3608,5,105,0,0,3608,4033,5,52,0,0,3609,3610,5,115,0,0,3610,3611,
- 5,116,0,0,3611,3612,5,101,0,0,3612,3613,5,108,0,0,3613,3614,5,101,0,0,
- 3614,3615,5,109,0,0,3615,3616,5,46,0,0,3616,3617,5,105,0,0,3617,4033,5,
- 56,0,0,3618,3619,5,115,0,0,3619,3620,5,116,0,0,3620,3621,5,101,0,0,3621,
- 3622,5,108,0,0,3622,3623,5,101,0,0,3623,3624,5,109,0,0,3624,3625,5,46,
- 0,0,3625,3626,5,114,0,0,3626,4033,5,52,0,0,3627,3628,5,115,0,0,3628,3629,
- 5,116,0,0,3629,3630,5,101,0,0,3630,3631,5,108,0,0,3631,3632,5,101,0,0,
- 3632,3633,5,109,0,0,3633,3634,5,46,0,0,3634,3635,5,114,0,0,3635,4033,5,
- 56,0,0,3636,3637,5,115,0,0,3637,3638,5,116,0,0,3638,3639,5,101,0,0,3639,
- 3640,5,108,0,0,3640,3641,5,101,0,0,3641,3642,5,109,0,0,3642,3643,5,46,
- 0,0,3643,3644,5,114,0,0,3644,3645,5,101,0,0,3645,4033,5,102,0,0,3646,3647,
- 5,99,0,0,3647,3648,5,111,0,0,3648,3649,5,110,0,0,3649,3650,5,118,0,0,3650,
- 3651,5,46,0,0,3651,3652,5,111,0,0,3652,3653,5,118,0,0,3653,3654,5,102,
- 0,0,3654,3655,5,46,0,0,3655,3656,5,105,0,0,3656,4033,5,49,0,0,3657,3658,
- 5,99,0,0,3658,3659,5,111,0,0,3659,3660,5,110,0,0,3660,3661,5,118,0,0,3661,
- 3662,5,46,0,0,3662,3663,5,111,0,0,3663,3664,5,118,0,0,3664,3665,5,102,
- 0,0,3665,3666,5,46,0,0,3666,3667,5,117,0,0,3667,4033,5,49,0,0,3668,3669,
- 5,99,0,0,3669,3670,5,111,0,0,3670,3671,5,110,0,0,3671,3672,5,118,0,0,3672,
- 3673,5,46,0,0,3673,3674,5,111,0,0,3674,3675,5,118,0,0,3675,3676,5,102,
- 0,0,3676,3677,5,46,0,0,3677,3678,5,105,0,0,3678,4033,5,50,0,0,3679,3680,
- 5,99,0,0,3680,3681,5,111,0,0,3681,3682,5,110,0,0,3682,3683,5,118,0,0,3683,
- 3684,5,46,0,0,3684,3685,5,111,0,0,3685,3686,5,118,0,0,3686,3687,5,102,
- 0,0,3687,3688,5,46,0,0,3688,3689,5,117,0,0,3689,4033,5,50,0,0,3690,3691,
- 5,99,0,0,3691,3692,5,111,0,0,3692,3693,5,110,0,0,3693,3694,5,118,0,0,3694,
- 3695,5,46,0,0,3695,3696,5,111,0,0,3696,3697,5,118,0,0,3697,3698,5,102,
- 0,0,3698,3699,5,46,0,0,3699,3700,5,105,0,0,3700,4033,5,52,0,0,3701,3702,
- 5,99,0,0,3702,3703,5,111,0,0,3703,3704,5,110,0,0,3704,3705,5,118,0,0,3705,
- 3706,5,46,0,0,3706,3707,5,111,0,0,3707,3708,5,118,0,0,3708,3709,5,102,
- 0,0,3709,3710,5,46,0,0,3710,3711,5,117,0,0,3711,4033,5,52,0,0,3712,3713,
- 5,99,0,0,3713,3714,5,111,0,0,3714,3715,5,110,0,0,3715,3716,5,118,0,0,3716,
- 3717,5,46,0,0,3717,3718,5,111,0,0,3718,3719,5,118,0,0,3719,3720,5,102,
- 0,0,3720,3721,5,46,0,0,3721,3722,5,105,0,0,3722,4033,5,56,0,0,3723,3724,
- 5,99,0,0,3724,3725,5,111,0,0,3725,3726,5,110,0,0,3726,3727,5,118,0,0,3727,
- 3728,5,46,0,0,3728,3729,5,111,0,0,3729,3730,5,118,0,0,3730,3731,5,102,
- 0,0,3731,3732,5,46,0,0,3732,3733,5,117,0,0,3733,4033,5,56,0,0,3734,3735,
- 5,99,0,0,3735,3736,5,107,0,0,3736,3737,5,102,0,0,3737,3738,5,105,0,0,3738,
- 3739,5,110,0,0,3739,3740,5,105,0,0,3740,3741,5,116,0,0,3741,4033,5,101,
- 0,0,3742,3743,5,99,0,0,3743,3744,5,111,0,0,3744,3745,5,110,0,0,3745,3746,
- 5,118,0,0,3746,3747,5,46,0,0,3747,3748,5,117,0,0,3748,4033,5,50,0,0,3749,
- 3750,5,99,0,0,3750,3751,5,111,0,0,3751,3752,5,110,0,0,3752,3753,5,118,
- 0,0,3753,3754,5,46,0,0,3754,3755,5,117,0,0,3755,4033,5,49,0,0,3756,3757,
- 5,99,0,0,3757,3758,5,111,0,0,3758,3759,5,110,0,0,3759,3760,5,118,0,0,3760,
- 3761,5,46,0,0,3761,4033,5,105,0,0,3762,3763,5,99,0,0,3763,3764,5,111,0,
- 0,3764,3765,5,110,0,0,3765,3766,5,118,0,0,3766,3767,5,46,0,0,3767,3768,
- 5,111,0,0,3768,3769,5,118,0,0,3769,3770,5,102,0,0,3770,3771,5,46,0,0,3771,
- 4033,5,105,0,0,3772,3773,5,99,0,0,3773,3774,5,111,0,0,3774,3775,5,110,
- 0,0,3775,3776,5,118,0,0,3776,3777,5,46,0,0,3777,3778,5,111,0,0,3778,3779,
- 5,118,0,0,3779,3780,5,102,0,0,3780,3781,5,46,0,0,3781,4033,5,117,0,0,3782,
- 3783,5,97,0,0,3783,3784,5,100,0,0,3784,3785,5,100,0,0,3785,3786,5,46,0,
- 0,3786,3787,5,111,0,0,3787,3788,5,118,0,0,3788,4033,5,102,0,0,3789,3790,
- 5,97,0,0,3790,3791,5,100,0,0,3791,3792,5,100,0,0,3792,3793,5,46,0,0,3793,
- 3794,5,111,0,0,3794,3795,5,118,0,0,3795,3796,5,102,0,0,3796,3797,5,46,
- 0,0,3797,3798,5,117,0,0,3798,4033,5,110,0,0,3799,3800,5,109,0,0,3800,3801,
- 5,117,0,0,3801,3802,5,108,0,0,3802,3803,5,46,0,0,3803,3804,5,111,0,0,3804,
- 3805,5,118,0,0,3805,4033,5,102,0,0,3806,3807,5,109,0,0,3807,3808,5,117,
- 0,0,3808,3809,5,108,0,0,3809,3810,5,46,0,0,3810,3811,5,111,0,0,3811,3812,
- 5,118,0,0,3812,3813,5,102,0,0,3813,3814,5,46,0,0,3814,3815,5,117,0,0,3815,
- 4033,5,110,0,0,3816,3817,5,115,0,0,3817,3818,5,117,0,0,3818,3819,5,98,
- 0,0,3819,3820,5,46,0,0,3820,3821,5,111,0,0,3821,3822,5,118,0,0,3822,4033,
- 5,102,0,0,3823,3824,5,115,0,0,3824,3825,5,117,0,0,3825,3826,5,98,0,0,3826,
- 3827,5,46,0,0,3827,3828,5,111,0,0,3828,3829,5,118,0,0,3829,3830,5,102,
- 0,0,3830,3831,5,46,0,0,3831,3832,5,117,0,0,3832,4033,5,110,0,0,3833,3834,
- 5,101,0,0,3834,3835,5,110,0,0,3835,3836,5,100,0,0,3836,3837,5,102,0,0,
- 3837,3838,5,105,0,0,3838,3839,5,110,0,0,3839,3840,5,97,0,0,3840,3841,5,
- 108,0,0,3841,3842,5,108,0,0,3842,4033,5,121,0,0,3843,3844,5,101,0,0,3844,
- 3845,5,110,0,0,3845,3846,5,100,0,0,3846,3847,5,102,0,0,3847,3848,5,97,
- 0,0,3848,3849,5,117,0,0,3849,3850,5,108,0,0,3850,4033,5,116,0,0,3851,3852,
- 5,115,0,0,3852,3853,5,116,0,0,3853,3854,5,105,0,0,3854,3855,5,110,0,0,
- 3855,3856,5,100,0,0,3856,3857,5,46,0,0,3857,4033,5,105,0,0,3858,3859,5,
- 99,0,0,3859,3860,5,111,0,0,3860,3861,5,110,0,0,3861,3862,5,118,0,0,3862,
- 3863,5,46,0,0,3863,4033,5,117,0,0,3864,3865,5,112,0,0,3865,3866,5,114,
- 0,0,3866,3867,5,101,0,0,3867,3868,5,102,0,0,3868,3869,5,105,0,0,3869,3870,
- 5,120,0,0,3870,4033,5,55,0,0,3871,3872,5,112,0,0,3872,3873,5,114,0,0,3873,
- 3874,5,101,0,0,3874,3875,5,102,0,0,3875,3876,5,105,0,0,3876,3877,5,120,
- 0,0,3877,4033,5,54,0,0,3878,3879,5,112,0,0,3879,3880,5,114,0,0,3880,3881,
- 5,101,0,0,3881,3882,5,102,0,0,3882,3883,5,105,0,0,3883,3884,5,120,0,0,
- 3884,4033,5,53,0,0,3885,3886,5,112,0,0,3886,3887,5,114,0,0,3887,3888,5,
- 101,0,0,3888,3889,5,102,0,0,3889,3890,5,105,0,0,3890,3891,5,120,0,0,3891,
- 4033,5,52,0,0,3892,3893,5,112,0,0,3893,3894,5,114,0,0,3894,3895,5,101,
- 0,0,3895,3896,5,102,0,0,3896,3897,5,105,0,0,3897,3898,5,120,0,0,3898,4033,
- 5,51,0,0,3899,3900,5,112,0,0,3900,3901,5,114,0,0,3901,3902,5,101,0,0,3902,
- 3903,5,102,0,0,3903,3904,5,105,0,0,3904,3905,5,120,0,0,3905,4033,5,50,
- 0,0,3906,3907,5,112,0,0,3907,3908,5,114,0,0,3908,3909,5,101,0,0,3909,3910,
- 5,102,0,0,3910,3911,5,105,0,0,3911,3912,5,120,0,0,3912,4033,5,49,0,0,3913,
- 3914,5,112,0,0,3914,3915,5,114,0,0,3915,3916,5,101,0,0,3916,3917,5,102,
- 0,0,3917,3918,5,105,0,0,3918,3919,5,120,0,0,3919,3920,5,114,0,0,3920,3921,
- 5,101,0,0,3921,4033,5,102,0,0,3922,3923,5,97,0,0,3923,3924,5,114,0,0,3924,
- 3925,5,103,0,0,3925,3926,5,108,0,0,3926,3927,5,105,0,0,3927,3928,5,115,
- 0,0,3928,4033,5,116,0,0,3929,3930,5,99,0,0,3930,3931,5,101,0,0,3931,4033,
- 5,113,0,0,3932,3933,5,99,0,0,3933,3934,5,103,0,0,3934,4033,5,116,0,0,3935,
- 3936,5,99,0,0,3936,3937,5,103,0,0,3937,3938,5,116,0,0,3938,3939,5,46,0,
- 0,3939,3940,5,117,0,0,3940,4033,5,110,0,0,3941,3942,5,99,0,0,3942,3943,
- 5,108,0,0,3943,4033,5,116,0,0,3944,3945,5,99,0,0,3945,3946,5,108,0,0,3946,
- 3947,5,116,0,0,3947,3948,5,46,0,0,3948,3949,5,117,0,0,3949,4033,5,110,
- 0,0,3950,3951,5,108,0,0,3951,3952,5,111,0,0,3952,3953,5,99,0,0,3953,3954,
- 5,97,0,0,3954,3955,5,108,0,0,3955,3956,5,108,0,0,3956,3957,5,111,0,0,3957,
- 4033,5,99,0,0,3958,3959,5,101,0,0,3959,3960,5,110,0,0,3960,3961,5,100,
- 0,0,3961,3962,5,102,0,0,3962,3963,5,105,0,0,3963,3964,5,108,0,0,3964,3965,
- 5,116,0,0,3965,3966,5,101,0,0,3966,4033,5,114,0,0,3967,3968,5,118,0,0,
- 3968,3969,5,111,0,0,3969,3970,5,108,0,0,3970,3971,5,97,0,0,3971,3972,5,
- 116,0,0,3972,3973,5,105,0,0,3973,3974,5,108,0,0,3974,3975,5,101,0,0,3975,
- 4033,5,46,0,0,3976,3977,5,116,0,0,3977,3978,5,97,0,0,3978,3979,5,105,0,
- 0,3979,3980,5,108,0,0,3980,4033,5,46,0,0,3981,3982,5,99,0,0,3982,3983,
- 5,112,0,0,3983,3984,5,98,0,0,3984,3985,5,108,0,0,3985,4033,5,107,0,0,3986,
- 3987,5,105,0,0,3987,3988,5,110,0,0,3988,3989,5,105,0,0,3989,3990,5,116,
- 0,0,3990,3991,5,98,0,0,3991,3992,5,108,0,0,3992,4033,5,107,0,0,3993,3994,
- 5,114,0,0,3994,3995,5,101,0,0,3995,3996,5,116,0,0,3996,3997,5,104,0,0,
- 3997,3998,5,114,0,0,3998,3999,5,111,0,0,3999,4033,5,119,0,0,4000,4001,
- 5,114,0,0,4001,4002,5,101,0,0,4002,4003,5,102,0,0,4003,4004,5,97,0,0,4004,
- 4005,5,110,0,0,4005,4006,5,121,0,0,4006,4007,5,116,0,0,4007,4008,5,121,
- 0,0,4008,4009,5,112,0,0,4009,4033,5,101,0,0,4010,4011,5,114,0,0,4011,4012,
- 5,101,0,0,4012,4013,5,97,0,0,4013,4014,5,100,0,0,4014,4015,5,111,0,0,4015,
- 4016,5,110,0,0,4016,4017,5,108,0,0,4017,4018,5,121,0,0,4018,4033,5,46,
- 0,0,4019,4020,5,105,0,0,4020,4021,5,108,0,0,4021,4022,5,108,0,0,4022,4023,
- 5,101,0,0,4023,4024,5,103,0,0,4024,4025,5,97,0,0,4025,4033,5,108,0,0,4026,
- 4027,5,101,0,0,4027,4028,5,110,0,0,4028,4029,5,100,0,0,4029,4030,5,109,
- 0,0,4030,4031,5,97,0,0,4031,4033,5,99,0,0,4032,2850,1,0,0,0,4032,2853,
- 1,0,0,0,4032,2858,1,0,0,0,4032,2865,1,0,0,0,4032,2872,1,0,0,0,4032,2879,
- 1,0,0,0,4032,2886,1,0,0,0,4032,2893,1,0,0,0,4032,2900,1,0,0,0,4032,2907,
- 1,0,0,0,4032,2914,1,0,0,0,4032,2921,1,0,0,0,4032,2928,1,0,0,0,4032,2935,
- 1,0,0,0,4032,2942,1,0,0,0,4032,2948,1,0,0,0,4032,2957,1,0,0,0,4032,2966,
- 1,0,0,0,4032,2974,1,0,0,0,4032,2982,1,0,0,0,4032,2990,1,0,0,0,4032,2998,
- 1,0,0,0,4032,3006,1,0,0,0,4032,3014,1,0,0,0,4032,3022,1,0,0,0,4032,3030,
- 1,0,0,0,4032,3038,1,0,0,0,4032,3041,1,0,0,0,4032,3044,1,0,0,0,4032,3047,
- 1,0,0,0,4032,3055,1,0,0,0,4032,3063,1,0,0,0,4032,3071,1,0,0,0,4032,3079,
- 1,0,0,0,4032,3087,1,0,0,0,4032,3095,1,0,0,0,4032,3103,1,0,0,0,4032,3111,
- 1,0,0,0,4032,3118,1,0,0,0,4032,3126,1,0,0,0,4032,3134,1,0,0,0,4032,3143,
- 1,0,0,0,4032,3152,1,0,0,0,4032,3160,1,0,0,0,4032,3168,1,0,0,0,4032,3176,
- 1,0,0,0,4032,3184,1,0,0,0,4032,3192,1,0,0,0,4032,3200,1,0,0,0,4032,3203,
- 1,0,0,0,4032,3206,1,0,0,0,4032,3209,1,0,0,0,4032,3212,1,0,0,0,4032,3218,
- 1,0,0,0,4032,3221,1,0,0,0,4032,3227,1,0,0,0,4032,3230,1,0,0,0,4032,3232,
- 1,0,0,0,4032,3235,1,0,0,0,4032,3238,1,0,0,0,4032,3241,1,0,0,0,4032,3247,
- 1,0,0,0,4032,3250,1,0,0,0,4032,3253,1,0,0,0,4032,3260,1,0,0,0,4032,3267,
- 1,0,0,0,4032,3274,1,0,0,0,4032,3281,1,0,0,0,4032,3288,1,0,0,0,4032,3295,
- 1,0,0,0,4032,3302,1,0,0,0,4032,3309,1,0,0,0,4032,3318,1,0,0,0,4032,3323,
- 1,0,0,0,4032,3337,1,0,0,0,4032,3351,1,0,0,0,4032,3365,1,0,0,0,4032,3379,
- 1,0,0,0,4032,3393,1,0,0,0,4032,3407,1,0,0,0,4032,3421,1,0,0,0,4032,3435,
- 1,0,0,0,4032,3448,1,0,0,0,4032,3461,1,0,0,0,4032,3466,1,0,0,0,4032,3475,
- 1,0,0,0,4032,3484,1,0,0,0,4032,3493,1,0,0,0,4032,3502,1,0,0,0,4032,3511,
- 1,0,0,0,4032,3520,1,0,0,0,4032,3529,1,0,0,0,4032,3538,1,0,0,0,4032,3546,
- 1,0,0,0,4032,3555,1,0,0,0,4032,3564,1,0,0,0,4032,3574,1,0,0,0,4032,3582,
- 1,0,0,0,4032,3591,1,0,0,0,4032,3600,1,0,0,0,4032,3609,1,0,0,0,4032,3618,
- 1,0,0,0,4032,3627,1,0,0,0,4032,3636,1,0,0,0,4032,3646,1,0,0,0,4032,3657,
- 1,0,0,0,4032,3668,1,0,0,0,4032,3679,1,0,0,0,4032,3690,1,0,0,0,4032,3701,
- 1,0,0,0,4032,3712,1,0,0,0,4032,3723,1,0,0,0,4032,3734,1,0,0,0,4032,3742,
- 1,0,0,0,4032,3749,1,0,0,0,4032,3756,1,0,0,0,4032,3762,1,0,0,0,4032,3772,
- 1,0,0,0,4032,3782,1,0,0,0,4032,3789,1,0,0,0,4032,3799,1,0,0,0,4032,3806,
- 1,0,0,0,4032,3816,1,0,0,0,4032,3823,1,0,0,0,4032,3833,1,0,0,0,4032,3843,
- 1,0,0,0,4032,3851,1,0,0,0,4032,3858,1,0,0,0,4032,3864,1,0,0,0,4032,3871,
- 1,0,0,0,4032,3878,1,0,0,0,4032,3885,1,0,0,0,4032,3892,1,0,0,0,4032,3899,
- 1,0,0,0,4032,3906,1,0,0,0,4032,3913,1,0,0,0,4032,3922,1,0,0,0,4032,3929,
- 1,0,0,0,4032,3932,1,0,0,0,4032,3935,1,0,0,0,4032,3941,1,0,0,0,4032,3944,
- 1,0,0,0,4032,3950,1,0,0,0,4032,3958,1,0,0,0,4032,3967,1,0,0,0,4032,3976,
- 1,0,0,0,4032,3981,1,0,0,0,4032,3986,1,0,0,0,4032,3993,1,0,0,0,4032,4000,
- 1,0,0,0,4032,4010,1,0,0,0,4032,4019,1,0,0,0,4032,4026,1,0,0,0,4033,552,
- 1,0,0,0,4034,4035,5,108,0,0,4035,4036,5,100,0,0,4036,4037,5,97,0,0,4037,
- 4038,5,114,0,0,4038,4039,5,103,0,0,4039,4040,5,46,0,0,4040,4111,5,115,
- 0,0,4041,4042,5,108,0,0,4042,4043,5,100,0,0,4043,4044,5,97,0,0,4044,4045,
- 5,114,0,0,4045,4046,5,103,0,0,4046,4047,5,97,0,0,4047,4048,5,46,0,0,4048,
- 4111,5,115,0,0,4049,4050,5,115,0,0,4050,4051,5,116,0,0,4051,4052,5,97,
- 0,0,4052,4053,5,114,0,0,4053,4054,5,103,0,0,4054,4055,5,46,0,0,4055,4111,
- 5,115,0,0,4056,4057,5,108,0,0,4057,4058,5,100,0,0,4058,4059,5,108,0,0,
- 4059,4060,5,111,0,0,4060,4061,5,99,0,0,4061,4062,5,46,0,0,4062,4111,5,
- 115,0,0,4063,4064,5,108,0,0,4064,4065,5,100,0,0,4065,4066,5,108,0,0,4066,
- 4067,5,111,0,0,4067,4068,5,99,0,0,4068,4069,5,97,0,0,4069,4070,5,46,0,
- 0,4070,4111,5,115,0,0,4071,4072,5,115,0,0,4072,4073,5,116,0,0,4073,4074,
- 5,108,0,0,4074,4075,5,111,0,0,4075,4076,5,99,0,0,4076,4077,5,46,0,0,4077,
- 4111,5,115,0,0,4078,4079,5,108,0,0,4079,4080,5,100,0,0,4080,4081,5,97,
- 0,0,4081,4082,5,114,0,0,4082,4111,5,103,0,0,4083,4084,5,108,0,0,4084,4085,
- 5,100,0,0,4085,4086,5,97,0,0,4086,4087,5,114,0,0,4087,4088,5,103,0,0,4088,
- 4111,5,97,0,0,4089,4090,5,115,0,0,4090,4091,5,116,0,0,4091,4092,5,97,0,
- 0,4092,4093,5,114,0,0,4093,4111,5,103,0,0,4094,4095,5,108,0,0,4095,4096,
- 5,100,0,0,4096,4097,5,108,0,0,4097,4098,5,111,0,0,4098,4111,5,99,0,0,4099,
- 4100,5,108,0,0,4100,4101,5,100,0,0,4101,4102,5,108,0,0,4102,4103,5,111,
- 0,0,4103,4104,5,99,0,0,4104,4111,5,97,0,0,4105,4106,5,115,0,0,4106,4107,
- 5,116,0,0,4107,4108,5,108,0,0,4108,4109,5,111,0,0,4109,4111,5,99,0,0,4110,
- 4034,1,0,0,0,4110,4041,1,0,0,0,4110,4049,1,0,0,0,4110,4056,1,0,0,0,4110,
- 4063,1,0,0,0,4110,4071,1,0,0,0,4110,4078,1,0,0,0,4110,4083,1,0,0,0,4110,
- 4089,1,0,0,0,4110,4094,1,0,0,0,4110,4099,1,0,0,0,4110,4105,1,0,0,0,4111,
- 554,1,0,0,0,4112,4113,5,108,0,0,4113,4114,5,100,0,0,4114,4115,5,99,0,0,
- 4115,4116,5,46,0,0,4116,4117,5,105,0,0,4117,4118,5,52,0,0,4118,4119,5,
- 46,0,0,4119,4140,5,115,0,0,4120,4121,5,108,0,0,4121,4122,5,100,0,0,4122,
- 4123,5,99,0,0,4123,4124,5,46,0,0,4124,4125,5,105,0,0,4125,4140,5,52,0,
- 0,4126,4127,5,117,0,0,4127,4128,5,110,0,0,4128,4129,5,97,0,0,4129,4130,
- 5,108,0,0,4130,4131,5,105,0,0,4131,4132,5,103,0,0,4132,4133,5,110,0,0,
- 4133,4134,5,101,0,0,4134,4135,5,100,0,0,4135,4140,5,46,0,0,4136,4137,5,
- 110,0,0,4137,4138,5,111,0,0,4138,4140,5,46,0,0,4139,4112,1,0,0,0,4139,
- 4120,1,0,0,0,4139,4126,1,0,0,0,4139,4136,1,0,0,0,4140,556,1,0,0,0,4141,
- 4142,5,108,0,0,4142,4143,5,100,0,0,4143,4144,5,99,0,0,4144,4145,5,46,0,
- 0,4145,4146,5,105,0,0,4146,4147,5,56,0,0,4147,558,1,0,0,0,4148,4149,5,
- 108,0,0,4149,4150,5,100,0,0,4150,4151,5,99,0,0,4151,4152,5,46,0,0,4152,
- 4153,5,114,0,0,4153,4161,5,52,0,0,4154,4155,5,108,0,0,4155,4156,5,100,
- 0,0,4156,4157,5,99,0,0,4157,4158,5,46,0,0,4158,4159,5,114,0,0,4159,4161,
- 5,56,0,0,4160,4148,1,0,0,0,4160,4154,1,0,0,0,4161,560,1,0,0,0,4162,4163,
- 5,106,0,0,4163,4164,5,109,0,0,4164,4198,5,112,0,0,4165,4166,5,99,0,0,4166,
- 4167,5,97,0,0,4167,4168,5,108,0,0,4168,4198,5,108,0,0,4169,4170,5,99,0,
- 0,4170,4171,5,97,0,0,4171,4172,5,108,0,0,4172,4173,5,108,0,0,4173,4174,
- 5,118,0,0,4174,4175,5,105,0,0,4175,4176,5,114,0,0,4176,4198,5,116,0,0,
- 4177,4178,5,110,0,0,4178,4179,5,101,0,0,4179,4180,5,119,0,0,4180,4181,
- 5,111,0,0,4181,4182,5,98,0,0,4182,4198,5,106,0,0,4183,4184,5,108,0,0,4184,
- 4185,5,100,0,0,4185,4186,5,102,0,0,4186,4187,5,116,0,0,4187,4198,5,110,
- 0,0,4188,4189,5,108,0,0,4189,4190,5,100,0,0,4190,4191,5,118,0,0,4191,4192,
- 5,105,0,0,4192,4193,5,114,0,0,4193,4194,5,116,0,0,4194,4195,5,102,0,0,
- 4195,4196,5,116,0,0,4196,4198,5,110,0,0,4197,4162,1,0,0,0,4197,4165,1,
- 0,0,0,4197,4169,1,0,0,0,4197,4177,1,0,0,0,4197,4183,1,0,0,0,4197,4188,
- 1,0,0,0,4198,562,1,0,0,0,4199,4200,5,99,0,0,4200,4201,5,97,0,0,4201,4202,
- 5,108,0,0,4202,4203,5,108,0,0,4203,4204,5,105,0,0,4204,564,1,0,0,0,4205,
- 4206,5,98,0,0,4206,4207,5,114,0,0,4207,4208,5,46,0,0,4208,4364,5,115,0,
- 0,4209,4210,5,98,0,0,4210,4211,5,114,0,0,4211,4212,5,102,0,0,4212,4213,
- 5,97,0,0,4213,4214,5,108,0,0,4214,4215,5,115,0,0,4215,4216,5,101,0,0,4216,
- 4217,5,46,0,0,4217,4364,5,115,0,0,4218,4219,5,98,0,0,4219,4220,5,114,0,
- 0,4220,4221,5,116,0,0,4221,4222,5,114,0,0,4222,4223,5,117,0,0,4223,4224,
- 5,101,0,0,4224,4225,5,46,0,0,4225,4364,5,115,0,0,4226,4227,5,98,0,0,4227,
- 4228,5,101,0,0,4228,4229,5,113,0,0,4229,4230,5,46,0,0,4230,4364,5,115,
- 0,0,4231,4232,5,98,0,0,4232,4233,5,103,0,0,4233,4234,5,101,0,0,4234,4235,
- 5,46,0,0,4235,4364,5,115,0,0,4236,4237,5,98,0,0,4237,4238,5,103,0,0,4238,
- 4239,5,116,0,0,4239,4240,5,46,0,0,4240,4364,5,115,0,0,4241,4242,5,98,0,
- 0,4242,4243,5,108,0,0,4243,4244,5,101,0,0,4244,4245,5,46,0,0,4245,4364,
- 5,115,0,0,4246,4247,5,98,0,0,4247,4248,5,108,0,0,4248,4249,5,116,0,0,4249,
- 4250,5,46,0,0,4250,4364,5,115,0,0,4251,4252,5,98,0,0,4252,4253,5,110,0,
- 0,4253,4254,5,101,0,0,4254,4255,5,46,0,0,4255,4256,5,117,0,0,4256,4257,
- 5,110,0,0,4257,4258,5,46,0,0,4258,4364,5,115,0,0,4259,4260,5,98,0,0,4260,
- 4261,5,103,0,0,4261,4262,5,101,0,0,4262,4263,5,46,0,0,4263,4264,5,117,
- 0,0,4264,4265,5,110,0,0,4265,4266,5,46,0,0,4266,4364,5,115,0,0,4267,4268,
- 5,98,0,0,4268,4269,5,103,0,0,4269,4270,5,116,0,0,4270,4271,5,46,0,0,4271,
- 4272,5,117,0,0,4272,4273,5,110,0,0,4273,4274,5,46,0,0,4274,4364,5,115,
- 0,0,4275,4276,5,98,0,0,4276,4277,5,108,0,0,4277,4278,5,101,0,0,4278,4279,
- 5,46,0,0,4279,4280,5,117,0,0,4280,4281,5,110,0,0,4281,4282,5,46,0,0,4282,
- 4364,5,115,0,0,4283,4284,5,98,0,0,4284,4285,5,108,0,0,4285,4286,5,116,
- 0,0,4286,4287,5,46,0,0,4287,4288,5,117,0,0,4288,4289,5,110,0,0,4289,4290,
- 5,46,0,0,4290,4364,5,115,0,0,4291,4292,5,98,0,0,4292,4364,5,114,0,0,4293,
- 4294,5,98,0,0,4294,4295,5,114,0,0,4295,4296,5,102,0,0,4296,4297,5,97,0,
- 0,4297,4298,5,108,0,0,4298,4299,5,115,0,0,4299,4364,5,101,0,0,4300,4301,
- 5,98,0,0,4301,4302,5,114,0,0,4302,4303,5,116,0,0,4303,4304,5,114,0,0,4304,
- 4305,5,117,0,0,4305,4364,5,101,0,0,4306,4307,5,98,0,0,4307,4308,5,101,
- 0,0,4308,4364,5,113,0,0,4309,4310,5,98,0,0,4310,4311,5,103,0,0,4311,4364,
- 5,101,0,0,4312,4313,5,98,0,0,4313,4314,5,103,0,0,4314,4364,5,116,0,0,4315,
- 4316,5,98,0,0,4316,4317,5,108,0,0,4317,4364,5,101,0,0,4318,4319,5,98,0,
- 0,4319,4320,5,108,0,0,4320,4364,5,116,0,0,4321,4322,5,98,0,0,4322,4323,
- 5,110,0,0,4323,4324,5,101,0,0,4324,4325,5,46,0,0,4325,4326,5,117,0,0,4326,
- 4364,5,110,0,0,4327,4328,5,98,0,0,4328,4329,5,103,0,0,4329,4330,5,101,
- 0,0,4330,4331,5,46,0,0,4331,4332,5,117,0,0,4332,4364,5,110,0,0,4333,4334,
- 5,98,0,0,4334,4335,5,103,0,0,4335,4336,5,116,0,0,4336,4337,5,46,0,0,4337,
- 4338,5,117,0,0,4338,4364,5,110,0,0,4339,4340,5,98,0,0,4340,4341,5,108,
- 0,0,4341,4342,5,101,0,0,4342,4343,5,46,0,0,4343,4344,5,117,0,0,4344,4364,
- 5,110,0,0,4345,4346,5,98,0,0,4346,4347,5,108,0,0,4347,4348,5,116,0,0,4348,
- 4349,5,46,0,0,4349,4350,5,117,0,0,4350,4364,5,110,0,0,4351,4352,5,108,
- 0,0,4352,4353,5,101,0,0,4353,4354,5,97,0,0,4354,4355,5,118,0,0,4355,4364,
- 5,101,0,0,4356,4357,5,108,0,0,4357,4358,5,101,0,0,4358,4359,5,97,0,0,4359,
- 4360,5,118,0,0,4360,4361,5,101,0,0,4361,4362,5,46,0,0,4362,4364,5,115,
- 0,0,4363,4205,1,0,0,0,4363,4209,1,0,0,0,4363,4218,1,0,0,0,4363,4226,1,
- 0,0,0,4363,4231,1,0,0,0,4363,4236,1,0,0,0,4363,4241,1,0,0,0,4363,4246,
- 1,0,0,0,4363,4251,1,0,0,0,4363,4259,1,0,0,0,4363,4267,1,0,0,0,4363,4275,
- 1,0,0,0,4363,4283,1,0,0,0,4363,4291,1,0,0,0,4363,4293,1,0,0,0,4363,4300,
- 1,0,0,0,4363,4306,1,0,0,0,4363,4309,1,0,0,0,4363,4312,1,0,0,0,4363,4315,
- 1,0,0,0,4363,4318,1,0,0,0,4363,4321,1,0,0,0,4363,4327,1,0,0,0,4363,4333,
- 1,0,0,0,4363,4339,1,0,0,0,4363,4345,1,0,0,0,4363,4351,1,0,0,0,4363,4356,
- 1,0,0,0,4364,566,1,0,0,0,4365,4366,5,115,0,0,4366,4367,5,119,0,0,4367,
- 4368,5,105,0,0,4368,4369,5,116,0,0,4369,4370,5,99,0,0,4370,4371,5,104,
- 0,0,4371,568,1,0,0,0,4372,4373,5,99,0,0,4373,4374,5,112,0,0,4374,4375,
- 5,111,0,0,4375,4376,5,98,0,0,4376,4487,5,106,0,0,4377,4378,5,108,0,0,4378,
- 4379,5,100,0,0,4379,4380,5,111,0,0,4380,4381,5,98,0,0,4381,4487,5,106,
- 0,0,4382,4383,5,99,0,0,4383,4384,5,97,0,0,4384,4385,5,115,0,0,4385,4386,
- 5,116,0,0,4386,4387,5,99,0,0,4387,4388,5,108,0,0,4388,4389,5,97,0,0,4389,
- 4390,5,115,0,0,4390,4487,5,115,0,0,4391,4392,5,105,0,0,4392,4393,5,115,
- 0,0,4393,4394,5,105,0,0,4394,4395,5,110,0,0,4395,4396,5,115,0,0,4396,4487,
- 5,116,0,0,4397,4398,5,117,0,0,4398,4399,5,110,0,0,4399,4400,5,98,0,0,4400,
- 4401,5,111,0,0,4401,4487,5,120,0,0,4402,4403,5,115,0,0,4403,4404,5,116,
- 0,0,4404,4405,5,111,0,0,4405,4406,5,98,0,0,4406,4487,5,106,0,0,4407,4408,
- 5,98,0,0,4408,4409,5,111,0,0,4409,4487,5,120,0,0,4410,4411,5,110,0,0,4411,
- 4412,5,101,0,0,4412,4413,5,119,0,0,4413,4414,5,97,0,0,4414,4415,5,114,
- 0,0,4415,4487,5,114,0,0,4416,4417,5,108,0,0,4417,4418,5,100,0,0,4418,4419,
- 5,101,0,0,4419,4420,5,108,0,0,4420,4421,5,101,0,0,4421,4422,5,109,0,0,
- 4422,4487,5,97,0,0,4423,4424,5,108,0,0,4424,4425,5,100,0,0,4425,4426,5,
- 101,0,0,4426,4427,5,108,0,0,4427,4428,5,101,0,0,4428,4487,5,109,0,0,4429,
- 4430,5,115,0,0,4430,4431,5,116,0,0,4431,4432,5,101,0,0,4432,4433,5,108,
- 0,0,4433,4434,5,101,0,0,4434,4487,5,109,0,0,4435,4436,5,117,0,0,4436,4437,
- 5,110,0,0,4437,4438,5,98,0,0,4438,4439,5,111,0,0,4439,4440,5,120,0,0,4440,
- 4441,5,46,0,0,4441,4442,5,97,0,0,4442,4443,5,110,0,0,4443,4487,5,121,0,
- 0,4444,4445,5,114,0,0,4445,4446,5,101,0,0,4446,4447,5,102,0,0,4447,4448,
- 5,97,0,0,4448,4449,5,110,0,0,4449,4450,5,121,0,0,4450,4451,5,118,0,0,4451,
- 4452,5,97,0,0,4452,4487,5,108,0,0,4453,4454,5,109,0,0,4454,4455,5,107,
- 0,0,4455,4456,5,114,0,0,4456,4457,5,101,0,0,4457,4458,5,102,0,0,4458,4459,
- 5,97,0,0,4459,4460,5,110,0,0,4460,4487,5,121,0,0,4461,4462,5,105,0,0,4462,
- 4463,5,110,0,0,4463,4464,5,105,0,0,4464,4465,5,116,0,0,4465,4466,5,111,
- 0,0,4466,4467,5,98,0,0,4467,4487,5,106,0,0,4468,4469,5,99,0,0,4469,4470,
- 5,111,0,0,4470,4471,5,110,0,0,4471,4472,5,115,0,0,4472,4473,5,116,0,0,
- 4473,4474,5,114,0,0,4474,4475,5,97,0,0,4475,4476,5,105,0,0,4476,4477,5,
- 110,0,0,4477,4478,5,101,0,0,4478,4479,5,100,0,0,4479,4487,5,46,0,0,4480,
- 4481,5,115,0,0,4481,4482,5,105,0,0,4482,4483,5,122,0,0,4483,4484,5,101,
- 0,0,4484,4485,5,111,0,0,4485,4487,5,102,0,0,4486,4372,1,0,0,0,4486,4377,
- 1,0,0,0,4486,4382,1,0,0,0,4486,4391,1,0,0,0,4486,4397,1,0,0,0,4486,4402,
- 1,0,0,0,4486,4407,1,0,0,0,4486,4410,1,0,0,0,4486,4416,1,0,0,0,4486,4423,
- 1,0,0,0,4486,4429,1,0,0,0,4486,4435,1,0,0,0,4486,4444,1,0,0,0,4486,4453,
- 1,0,0,0,4486,4461,1,0,0,0,4486,4468,1,0,0,0,4486,4480,1,0,0,0,4487,570,
- 1,0,0,0,4488,4489,5,108,0,0,4489,4490,5,100,0,0,4490,4491,5,115,0,0,4491,
- 4492,5,116,0,0,4492,4493,5,114,0,0,4493,572,1,0,0,0,4494,4495,5,108,0,
- 0,4495,4496,5,100,0,0,4496,4497,5,102,0,0,4497,4498,5,108,0,0,4498,4530,
- 5,100,0,0,4499,4500,5,108,0,0,4500,4501,5,100,0,0,4501,4502,5,102,0,0,
- 4502,4503,5,108,0,0,4503,4504,5,100,0,0,4504,4530,5,97,0,0,4505,4506,5,
- 115,0,0,4506,4507,5,116,0,0,4507,4508,5,102,0,0,4508,4509,5,108,0,0,4509,
- 4530,5,100,0,0,4510,4511,5,108,0,0,4511,4512,5,100,0,0,4512,4513,5,115,
- 0,0,4513,4514,5,102,0,0,4514,4515,5,108,0,0,4515,4530,5,100,0,0,4516,4517,
- 5,108,0,0,4517,4518,5,100,0,0,4518,4519,5,115,0,0,4519,4520,5,102,0,0,
- 4520,4521,5,108,0,0,4521,4522,5,100,0,0,4522,4530,5,97,0,0,4523,4524,5,
- 115,0,0,4524,4525,5,116,0,0,4525,4526,5,115,0,0,4526,4527,5,102,0,0,4527,
- 4528,5,108,0,0,4528,4530,5,100,0,0,4529,4494,1,0,0,0,4529,4499,1,0,0,0,
- 4529,4505,1,0,0,0,4529,4510,1,0,0,0,4529,4516,1,0,0,0,4529,4523,1,0,0,
- 0,4530,574,1,0,0,0,4531,4532,5,108,0,0,4532,4533,5,100,0,0,4533,4534,5,
- 116,0,0,4534,4535,5,111,0,0,4535,4536,5,107,0,0,4536,4537,5,101,0,0,4537,
- 4538,5,110,0,0,4538,576,1,0,0,0,4539,4540,7,8,0,0,4540,578,1,0,0,0,4541,
- 4542,7,9,0,0,4542,580,1,0,0,0,4543,4544,3,583,291,0,4544,4545,3,531,265,
- 0,4545,4547,1,0,0,0,4546,4543,1,0,0,0,4547,4548,1,0,0,0,4548,4546,1,0,
- 0,0,4548,4549,1,0,0,0,4549,4550,1,0,0,0,4550,4551,3,583,291,0,4551,582,
- 1,0,0,0,4552,4556,3,577,288,0,4553,4555,3,579,289,0,4554,4553,1,0,0,0,
- 4555,4558,1,0,0,0,4556,4554,1,0,0,0,4556,4557,1,0,0,0,4557,584,1,0,0,0,
- 4558,4556,1,0,0,0,4559,4560,7,0,0,0,4560,4561,7,0,0,0,4561,586,1,0,0,0,
- 4562,4563,7,10,0,0,4563,4564,1,0,0,0,4564,4565,6,293,0,0,4565,588,1,0,
- 0,0,4566,4567,5,47,0,0,4567,4568,5,47,0,0,4568,4572,1,0,0,0,4569,4571,
- 8,11,0,0,4570,4569,1,0,0,0,4571,4574,1,0,0,0,4572,4570,1,0,0,0,4572,4573,
- 1,0,0,0,4573,4575,1,0,0,0,4574,4572,1,0,0,0,4575,4576,6,294,0,0,4576,590,
- 1,0,0,0,4577,4578,5,47,0,0,4578,4579,5,42,0,0,4579,4583,1,0,0,0,4580,4582,
- 9,0,0,0,4581,4580,1,0,0,0,4582,4585,1,0,0,0,4583,4584,1,0,0,0,4583,4581,
- 1,0,0,0,4584,4586,1,0,0,0,4585,4583,1,0,0,0,4586,4587,5,42,0,0,4587,4588,
- 5,47,0,0,4588,4589,1,0,0,0,4589,4590,6,295,0,0,4590,592,1,0,0,0,4591,4592,
- 5,46,0,0,4592,4593,5,112,0,0,4593,4594,5,101,0,0,4594,4595,5,114,0,0,4595,
- 4596,5,109,0,0,4596,4597,5,105,0,0,4597,4598,5,115,0,0,4598,4599,5,115,
- 0,0,4599,4600,5,105,0,0,4600,4601,5,111,0,0,4601,4602,5,110,0,0,4602,594,
- 1,0,0,0,4603,4604,5,46,0,0,4604,4605,5,112,0,0,4605,4606,5,101,0,0,4606,
- 4607,5,114,0,0,4607,4608,5,109,0,0,4608,4609,5,105,0,0,4609,4610,5,115,
- 0,0,4610,4611,5,115,0,0,4611,4612,5,105,0,0,4612,4613,5,111,0,0,4613,4614,
- 5,110,0,0,4614,4615,5,115,0,0,4615,4616,5,101,0,0,4616,4617,5,116,0,0,
- 4617,596,1,0,0,0,4618,4619,5,46,0,0,4619,4620,5,101,0,0,4620,4621,5,109,
- 0,0,4621,4622,5,105,0,0,4622,4623,5,116,0,0,4623,4624,5,98,0,0,4624,4625,
- 5,121,0,0,4625,4626,5,116,0,0,4626,4627,5,101,0,0,4627,598,1,0,0,0,4628,
- 4629,5,46,0,0,4629,4630,5,109,0,0,4630,4631,5,97,0,0,4631,4632,5,120,0,
- 0,4632,4633,5,115,0,0,4633,4634,5,116,0,0,4634,4635,5,97,0,0,4635,4636,
- 5,99,0,0,4636,4637,5,107,0,0,4637,600,1,0,0,0,4638,4639,5,46,0,0,4639,
- 4640,5,101,0,0,4640,4641,5,110,0,0,4641,4642,5,116,0,0,4642,4643,5,114,
- 0,0,4643,4644,5,121,0,0,4644,4645,5,112,0,0,4645,4646,5,111,0,0,4646,4647,
- 5,105,0,0,4647,4648,5,110,0,0,4648,4649,5,116,0,0,4649,602,1,0,0,0,4650,
- 4651,5,46,0,0,4651,4652,5,122,0,0,4652,4653,5,101,0,0,4653,4654,5,114,
- 0,0,4654,4655,5,111,0,0,4655,4656,5,105,0,0,4656,4657,5,110,0,0,4657,4658,
- 5,105,0,0,4658,4659,5,116,0,0,4659,604,1,0,0,0,4660,4661,5,46,0,0,4661,
- 4662,5,108,0,0,4662,4663,5,111,0,0,4663,4664,5,99,0,0,4664,4665,5,97,0,
- 0,4665,4666,5,108,0,0,4666,4667,5,115,0,0,4667,606,1,0,0,0,4668,4669,5,
- 46,0,0,4669,4670,5,101,0,0,4670,4671,5,120,0,0,4671,4672,5,112,0,0,4672,
- 4673,5,111,0,0,4673,4674,5,114,0,0,4674,4675,5,116,0,0,4675,608,1,0,0,
- 0,4676,4677,5,46,0,0,4677,4678,5,111,0,0,4678,4679,5,118,0,0,4679,4680,
- 5,101,0,0,4680,4681,5,114,0,0,4681,4682,5,114,0,0,4682,4683,5,105,0,0,
- 4683,4684,5,100,0,0,4684,4685,5,101,0,0,4685,610,1,0,0,0,4686,4687,5,46,
- 0,0,4687,4688,5,118,0,0,4688,4689,5,116,0,0,4689,4690,5,101,0,0,4690,4691,
- 5,110,0,0,4691,4692,5,116,0,0,4692,4693,5,114,0,0,4693,4694,5,121,0,0,
- 4694,612,1,0,0,0,45,0,2024,2032,2037,2039,2042,2050,2055,2057,2060,2065,
- 2071,2075,2080,2082,2086,2091,2093,2099,2103,2108,2110,2112,2149,2701,
- 2752,2755,2758,2761,2766,2768,2776,2778,4032,4110,4139,4160,4197,4363,
- 4486,4529,4548,4556,4572,4583,1,6,0,0
+ 1,286,1,286,1,286,1,286,1,286,3,286,4537,8,286,1,287,1,287,1,287,1,287,
+ 1,287,1,287,1,287,1,287,1,288,1,288,1,289,1,289,1,290,1,290,1,290,4,290,
+ 4554,8,290,11,290,12,290,4555,1,290,1,290,1,291,1,291,5,291,4562,8,291,
+ 10,291,12,291,4565,9,291,1,292,1,292,1,292,1,293,1,293,1,293,1,293,1,294,
+ 1,294,1,294,1,294,5,294,4578,8,294,10,294,12,294,4581,9,294,1,294,1,294,
+ 1,295,1,295,1,295,1,295,5,295,4589,8,295,10,295,12,295,4592,9,295,1,295,
+ 1,295,1,295,1,295,1,295,1,296,1,296,1,296,1,296,1,296,1,296,1,296,1,296,
+ 1,296,1,296,1,296,1,296,1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,297,
+ 1,297,1,297,1,297,1,297,1,297,1,297,1,297,1,298,1,298,1,298,1,298,1,298,
+ 1,298,1,298,1,298,1,298,1,298,1,299,1,299,1,299,1,299,1,299,1,299,1,299,
+ 1,299,1,299,1,299,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,1,300,
+ 1,300,1,300,1,300,1,301,1,301,1,301,1,301,1,301,1,301,1,301,1,301,1,301,
+ 1,301,1,302,1,302,1,302,1,302,1,302,1,302,1,302,1,302,1,303,1,303,1,303,
+ 1,303,1,303,1,303,1,303,1,303,1,304,1,304,1,304,1,304,1,304,1,304,1,304,
+ 1,304,1,304,1,304,1,305,1,305,1,305,1,305,1,305,1,305,1,305,1,305,1,305,
+ 1,4590,0,306,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,
+ 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,
+ 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,
+ 73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,
+ 97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,
+ 59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,
+ 69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,
+ 79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177,
+ 89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193,97,195,98,197,
+ 99,199,100,201,101,203,102,205,103,207,104,209,105,211,106,213,107,215,
+ 108,217,109,219,110,221,111,223,112,225,113,227,114,229,115,231,116,233,
+ 117,235,118,237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,
+ 126,253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,134,269,
+ 135,271,136,273,137,275,138,277,139,279,140,281,141,283,142,285,143,287,
+ 144,289,145,291,146,293,147,295,148,297,149,299,150,301,151,303,152,305,
+ 153,307,154,309,155,311,156,313,157,315,158,317,159,319,160,321,161,323,
+ 162,325,163,327,164,329,165,331,166,333,167,335,168,337,169,339,170,341,
+ 171,343,172,345,173,347,174,349,175,351,176,353,177,355,178,357,179,359,
+ 180,361,181,363,182,365,183,367,184,369,185,371,186,373,187,375,188,377,
+ 0,379,189,381,190,383,191,385,192,387,193,389,194,391,195,393,196,395,
+ 197,397,198,399,199,401,200,403,201,405,202,407,203,409,204,411,205,413,
+ 206,415,207,417,208,419,209,421,210,423,211,425,212,427,213,429,214,431,
+ 215,433,216,435,217,437,218,439,219,441,220,443,221,445,222,447,223,449,
+ 224,451,225,453,226,455,227,457,228,459,229,461,230,463,231,465,232,467,
+ 233,469,234,471,235,473,236,475,237,477,238,479,239,481,240,483,241,485,
+ 242,487,243,489,244,491,245,493,246,495,247,497,248,499,249,501,250,503,
+ 251,505,252,507,253,509,254,511,255,513,256,515,257,517,258,519,259,521,
+ 260,523,261,525,0,527,262,529,263,531,264,533,265,535,266,537,267,539,
+ 268,541,269,543,270,545,271,547,272,549,273,551,274,553,275,555,276,557,
+ 277,559,278,561,279,563,280,565,281,567,282,569,283,571,284,573,285,575,
+ 286,577,0,579,0,581,287,583,288,585,289,587,290,589,291,591,292,593,293,
+ 595,294,597,295,599,296,601,297,603,298,605,299,607,300,609,301,611,302,
+ 1,0,12,3,0,48,57,65,70,97,102,1,0,48,57,2,0,69,69,101,101,2,0,43,43,45,
+ 45,11,0,34,34,39,39,47,48,63,63,92,92,97,98,102,102,110,110,114,114,116,
+ 116,118,118,1,0,48,55,4,0,10,10,13,13,34,34,92,92,4,0,10,10,13,13,39,39,
+ 92,92,4,0,35,36,63,90,95,95,97,122,4,0,35,36,48,57,63,90,95,122,3,0,9,
+ 10,13,13,32,32,2,0,10,10,13,13,4955,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,
+ 0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,
+ 1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,
+ 0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,
+ 1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,
+ 0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,
+ 1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,
+ 0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,
+ 1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,
+ 0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,
+ 105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,
+ 115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,
+ 125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,
+ 135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,
+ 145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,
+ 155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,
+ 165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0,
+ 175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0,0,0,0,
+ 185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,
+ 195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,
+ 205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,
+ 215,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,
+ 225,1,0,0,0,0,227,1,0,0,0,0,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,
+ 235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,
+ 245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,
+ 255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,
+ 265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,
+ 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,
+ 285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,
+ 295,1,0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,
+ 305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0,
+ 315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0,0,0,0,
+ 325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0,0,0,0,333,1,0,0,0,0,
+ 335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0,0,343,1,0,0,0,0,
+ 345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1,0,0,0,0,353,1,0,0,0,0,
+ 355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0,361,1,0,0,0,0,363,1,0,0,0,0,
+ 365,1,0,0,0,0,367,1,0,0,0,0,369,1,0,0,0,0,371,1,0,0,0,0,373,1,0,0,0,0,
+ 375,1,0,0,0,0,379,1,0,0,0,0,381,1,0,0,0,0,383,1,0,0,0,0,385,1,0,0,0,0,
+ 387,1,0,0,0,0,389,1,0,0,0,0,391,1,0,0,0,0,393,1,0,0,0,0,395,1,0,0,0,0,
+ 397,1,0,0,0,0,399,1,0,0,0,0,401,1,0,0,0,0,403,1,0,0,0,0,405,1,0,0,0,0,
+ 407,1,0,0,0,0,409,1,0,0,0,0,411,1,0,0,0,0,413,1,0,0,0,0,415,1,0,0,0,0,
+ 417,1,0,0,0,0,419,1,0,0,0,0,421,1,0,0,0,0,423,1,0,0,0,0,425,1,0,0,0,0,
+ 427,1,0,0,0,0,429,1,0,0,0,0,431,1,0,0,0,0,433,1,0,0,0,0,435,1,0,0,0,0,
+ 437,1,0,0,0,0,439,1,0,0,0,0,441,1,0,0,0,0,443,1,0,0,0,0,445,1,0,0,0,0,
+ 447,1,0,0,0,0,449,1,0,0,0,0,451,1,0,0,0,0,453,1,0,0,0,0,455,1,0,0,0,0,
+ 457,1,0,0,0,0,459,1,0,0,0,0,461,1,0,0,0,0,463,1,0,0,0,0,465,1,0,0,0,0,
+ 467,1,0,0,0,0,469,1,0,0,0,0,471,1,0,0,0,0,473,1,0,0,0,0,475,1,0,0,0,0,
+ 477,1,0,0,0,0,479,1,0,0,0,0,481,1,0,0,0,0,483,1,0,0,0,0,485,1,0,0,0,0,
+ 487,1,0,0,0,0,489,1,0,0,0,0,491,1,0,0,0,0,493,1,0,0,0,0,495,1,0,0,0,0,
+ 497,1,0,0,0,0,499,1,0,0,0,0,501,1,0,0,0,0,503,1,0,0,0,0,505,1,0,0,0,0,
+ 507,1,0,0,0,0,509,1,0,0,0,0,511,1,0,0,0,0,513,1,0,0,0,0,515,1,0,0,0,0,
+ 517,1,0,0,0,0,519,1,0,0,0,0,521,1,0,0,0,0,523,1,0,0,0,0,527,1,0,0,0,0,
+ 529,1,0,0,0,0,531,1,0,0,0,0,533,1,0,0,0,0,535,1,0,0,0,0,537,1,0,0,0,0,
+ 539,1,0,0,0,0,541,1,0,0,0,0,543,1,0,0,0,0,545,1,0,0,0,0,547,1,0,0,0,0,
+ 549,1,0,0,0,0,551,1,0,0,0,0,553,1,0,0,0,0,555,1,0,0,0,0,557,1,0,0,0,0,
+ 559,1,0,0,0,0,561,1,0,0,0,0,563,1,0,0,0,0,565,1,0,0,0,0,567,1,0,0,0,0,
+ 569,1,0,0,0,0,571,1,0,0,0,0,573,1,0,0,0,0,575,1,0,0,0,0,581,1,0,0,0,0,
+ 583,1,0,0,0,0,585,1,0,0,0,0,587,1,0,0,0,0,589,1,0,0,0,0,591,1,0,0,0,0,
+ 593,1,0,0,0,0,595,1,0,0,0,0,597,1,0,0,0,0,599,1,0,0,0,0,601,1,0,0,0,0,
+ 603,1,0,0,0,0,605,1,0,0,0,0,607,1,0,0,0,0,609,1,0,0,0,0,611,1,0,0,0,1,
+ 613,1,0,0,0,3,620,1,0,0,0,5,624,1,0,0,0,7,630,1,0,0,0,9,638,1,0,0,0,11,
+ 649,1,0,0,0,13,661,1,0,0,0,15,669,1,0,0,0,17,682,1,0,0,0,19,695,1,0,0,
+ 0,21,706,1,0,0,0,23,725,1,0,0,0,25,740,1,0,0,0,27,763,1,0,0,0,29,769,1,
+ 0,0,0,31,778,1,0,0,0,33,787,1,0,0,0,35,789,1,0,0,0,37,791,1,0,0,0,39,802,
+ 1,0,0,0,41,812,1,0,0,0,43,818,1,0,0,0,45,828,1,0,0,0,47,839,1,0,0,0,49,
+ 853,1,0,0,0,51,863,1,0,0,0,53,873,1,0,0,0,55,883,1,0,0,0,57,885,1,0,0,
+ 0,59,895,1,0,0,0,61,897,1,0,0,0,63,899,1,0,0,0,65,901,1,0,0,0,67,910,1,
+ 0,0,0,69,913,1,0,0,0,71,921,1,0,0,0,73,923,1,0,0,0,75,929,1,0,0,0,77,938,
+ 1,0,0,0,79,944,1,0,0,0,81,951,1,0,0,0,83,960,1,0,0,0,85,962,1,0,0,0,87,
+ 964,1,0,0,0,89,967,1,0,0,0,91,981,1,0,0,0,93,997,1,0,0,0,95,1013,1,0,0,
+ 0,97,1021,1,0,0,0,99,1032,1,0,0,0,101,1039,1,0,0,0,103,1046,1,0,0,0,105,
+ 1054,1,0,0,0,107,1061,1,0,0,0,109,1070,1,0,0,0,111,1075,1,0,0,0,113,1086,
+ 1,0,0,0,115,1094,1,0,0,0,117,1103,1,0,0,0,119,1110,1,0,0,0,121,1123,1,
+ 0,0,0,123,1138,1,0,0,0,125,1145,1,0,0,0,127,1152,1,0,0,0,129,1161,1,0,
+ 0,0,131,1173,1,0,0,0,133,1184,1,0,0,0,135,1200,1,0,0,0,137,1212,1,0,0,
+ 0,139,1226,1,0,0,0,141,1232,1,0,0,0,143,1240,1,0,0,0,145,1251,1,0,0,0,
+ 147,1257,1,0,0,0,149,1263,1,0,0,0,151,1265,1,0,0,0,153,1276,1,0,0,0,155,
+ 1289,1,0,0,0,157,1300,1,0,0,0,159,1315,1,0,0,0,161,1319,1,0,0,0,163,1325,
+ 1,0,0,0,165,1329,1,0,0,0,167,1335,1,0,0,0,169,1345,1,0,0,0,171,1348,1,
+ 0,0,0,173,1350,1,0,0,0,175,1352,1,0,0,0,177,1354,1,0,0,0,179,1364,1,0,
+ 0,0,181,1373,1,0,0,0,183,1382,1,0,0,0,185,1389,1,0,0,0,187,1396,1,0,0,
+ 0,189,1403,1,0,0,0,191,1408,1,0,0,0,193,1414,1,0,0,0,195,1422,1,0,0,0,
+ 197,1429,1,0,0,0,199,1436,1,0,0,0,201,1441,1,0,0,0,203,1452,1,0,0,0,205,
+ 1462,1,0,0,0,207,1475,1,0,0,0,209,1482,1,0,0,0,211,1489,1,0,0,0,213,1499,
+ 1,0,0,0,215,1511,1,0,0,0,217,1522,1,0,0,0,219,1535,1,0,0,0,221,1552,1,
+ 0,0,0,223,1570,1,0,0,0,225,1579,1,0,0,0,227,1587,1,0,0,0,229,1589,1,0,
+ 0,0,231,1599,1,0,0,0,233,1605,1,0,0,0,235,1611,1,0,0,0,237,1617,1,0,0,
+ 0,239,1622,1,0,0,0,241,1637,1,0,0,0,243,1644,1,0,0,0,245,1652,1,0,0,0,
+ 247,1659,1,0,0,0,249,1668,1,0,0,0,251,1681,1,0,0,0,253,1689,1,0,0,0,255,
+ 1703,1,0,0,0,257,1710,1,0,0,0,259,1717,1,0,0,0,261,1727,1,0,0,0,263,1733,
+ 1,0,0,0,265,1740,1,0,0,0,267,1750,1,0,0,0,269,1755,1,0,0,0,271,1760,1,
+ 0,0,0,273,1763,1,0,0,0,275,1767,1,0,0,0,277,1771,1,0,0,0,279,1779,1,0,
+ 0,0,281,1785,1,0,0,0,283,1793,1,0,0,0,285,1800,1,0,0,0,287,1810,1,0,0,
+ 0,289,1818,1,0,0,0,291,1831,1,0,0,0,293,1841,1,0,0,0,295,1853,1,0,0,0,
+ 297,1862,1,0,0,0,299,1870,1,0,0,0,301,1877,1,0,0,0,303,1885,1,0,0,0,305,
+ 1888,1,0,0,0,307,1892,1,0,0,0,309,1905,1,0,0,0,311,1912,1,0,0,0,313,1915,
+ 1,0,0,0,315,1920,1,0,0,0,317,1925,1,0,0,0,319,1928,1,0,0,0,321,1935,1,
+ 0,0,0,323,1941,1,0,0,0,325,1949,1,0,0,0,327,1955,1,0,0,0,329,1963,1,0,
+ 0,0,331,1969,1,0,0,0,333,1973,1,0,0,0,335,1984,1,0,0,0,337,1989,1,0,0,
+ 0,339,1997,1,0,0,0,341,2013,1,0,0,0,343,2024,1,0,0,0,345,2042,1,0,0,0,
+ 347,2060,1,0,0,0,349,2114,1,0,0,0,351,2117,1,0,0,0,353,2121,1,0,0,0,355,
+ 2126,1,0,0,0,357,2134,1,0,0,0,359,2149,1,0,0,0,361,2151,1,0,0,0,363,2158,
+ 1,0,0,0,365,2163,1,0,0,0,367,2168,1,0,0,0,369,2174,1,0,0,0,371,2180,1,
+ 0,0,0,373,2186,1,0,0,0,375,2194,1,0,0,0,377,2202,1,0,0,0,379,2211,1,0,
+ 0,0,381,2217,1,0,0,0,383,2224,1,0,0,0,385,2231,1,0,0,0,387,2238,1,0,0,
+ 0,389,2242,1,0,0,0,391,2247,1,0,0,0,393,2252,1,0,0,0,395,2259,1,0,0,0,
+ 397,2267,1,0,0,0,399,2273,1,0,0,0,401,2283,1,0,0,0,403,2288,1,0,0,0,405,
+ 2293,1,0,0,0,407,2300,1,0,0,0,409,2306,1,0,0,0,411,2316,1,0,0,0,413,2322,
+ 1,0,0,0,415,2330,1,0,0,0,417,2339,1,0,0,0,419,2347,1,0,0,0,421,2353,1,
+ 0,0,0,423,2361,1,0,0,0,425,2366,1,0,0,0,427,2371,1,0,0,0,429,2377,1,0,
+ 0,0,431,2384,1,0,0,0,433,2391,1,0,0,0,435,2401,1,0,0,0,437,2410,1,0,0,
+ 0,439,2420,1,0,0,0,441,2427,1,0,0,0,443,2437,1,0,0,0,445,2447,1,0,0,0,
+ 447,2456,1,0,0,0,449,2461,1,0,0,0,451,2467,1,0,0,0,453,2474,1,0,0,0,455,
+ 2478,1,0,0,0,457,2487,1,0,0,0,459,2494,1,0,0,0,461,2502,1,0,0,0,463,2509,
+ 1,0,0,0,465,2521,1,0,0,0,467,2528,1,0,0,0,469,2537,1,0,0,0,471,2542,1,
+ 0,0,0,473,2549,1,0,0,0,475,2557,1,0,0,0,477,2573,1,0,0,0,479,2587,1,0,
+ 0,0,481,2599,1,0,0,0,483,2602,1,0,0,0,485,2608,1,0,0,0,487,2617,1,0,0,
+ 0,489,2626,1,0,0,0,491,2634,1,0,0,0,493,2641,1,0,0,0,495,2651,1,0,0,0,
+ 497,2657,1,0,0,0,499,2665,1,0,0,0,501,2674,1,0,0,0,503,2683,1,0,0,0,505,
+ 2685,1,0,0,0,507,2702,1,0,0,0,509,2704,1,0,0,0,511,2711,1,0,0,0,513,2722,
+ 1,0,0,0,515,2728,1,0,0,0,517,2734,1,0,0,0,519,2742,1,0,0,0,521,2744,1,
+ 0,0,0,523,2747,1,0,0,0,525,2749,1,0,0,0,527,2764,1,0,0,0,529,2774,1,0,
+ 0,0,531,2784,1,0,0,0,533,2786,1,0,0,0,535,2788,1,0,0,0,537,2796,1,0,0,
+ 0,539,2803,1,0,0,0,541,2810,1,0,0,0,543,2818,1,0,0,0,545,2824,1,0,0,0,
+ 547,2831,1,0,0,0,549,2840,1,0,0,0,551,4039,1,0,0,0,553,4117,1,0,0,0,555,
+ 4146,1,0,0,0,557,4148,1,0,0,0,559,4167,1,0,0,0,561,4204,1,0,0,0,563,4206,
+ 1,0,0,0,565,4370,1,0,0,0,567,4372,1,0,0,0,569,4493,1,0,0,0,571,4495,1,
+ 0,0,0,573,4536,1,0,0,0,575,4538,1,0,0,0,577,4546,1,0,0,0,579,4548,1,0,
+ 0,0,581,4553,1,0,0,0,583,4559,1,0,0,0,585,4566,1,0,0,0,587,4569,1,0,0,
+ 0,589,4573,1,0,0,0,591,4584,1,0,0,0,593,4598,1,0,0,0,595,4610,1,0,0,0,
+ 597,4625,1,0,0,0,599,4635,1,0,0,0,601,4645,1,0,0,0,603,4657,1,0,0,0,605,
+ 4667,1,0,0,0,607,4675,1,0,0,0,609,4683,1,0,0,0,611,4693,1,0,0,0,613,614,
+ 5,110,0,0,614,615,5,97,0,0,615,616,5,116,0,0,616,617,5,105,0,0,617,618,
+ 5,118,0,0,618,619,5,101,0,0,619,2,1,0,0,0,620,621,5,99,0,0,621,622,5,105,
+ 0,0,622,623,5,108,0,0,623,4,1,0,0,0,624,625,5,111,0,0,625,626,5,112,0,
+ 0,626,627,5,116,0,0,627,628,5,105,0,0,628,629,5,108,0,0,629,6,1,0,0,0,
+ 630,631,5,109,0,0,631,632,5,97,0,0,632,633,5,110,0,0,633,634,5,97,0,0,
+ 634,635,5,103,0,0,635,636,5,101,0,0,636,637,5,100,0,0,637,8,1,0,0,0,638,
+ 639,5,102,0,0,639,640,5,111,0,0,640,641,5,114,0,0,641,642,5,119,0,0,642,
+ 643,5,97,0,0,643,644,5,114,0,0,644,645,5,100,0,0,645,646,5,114,0,0,646,
+ 647,5,101,0,0,647,648,5,102,0,0,648,10,1,0,0,0,649,650,5,112,0,0,650,651,
+ 5,114,0,0,651,652,5,101,0,0,652,653,5,115,0,0,653,654,5,101,0,0,654,655,
+ 5,114,0,0,655,656,5,118,0,0,656,657,5,101,0,0,657,658,5,115,0,0,658,659,
+ 5,105,0,0,659,660,5,103,0,0,660,12,1,0,0,0,661,662,5,114,0,0,662,663,5,
+ 117,0,0,663,664,5,110,0,0,664,665,5,116,0,0,665,666,5,105,0,0,666,667,
+ 5,109,0,0,667,668,5,101,0,0,668,14,1,0,0,0,669,670,5,105,0,0,670,671,5,
+ 110,0,0,671,672,5,116,0,0,672,673,5,101,0,0,673,674,5,114,0,0,674,675,
+ 5,110,0,0,675,676,5,97,0,0,676,677,5,108,0,0,677,678,5,99,0,0,678,679,
+ 5,97,0,0,679,680,5,108,0,0,680,681,5,108,0,0,681,16,1,0,0,0,682,683,5,
+ 115,0,0,683,684,5,121,0,0,684,685,5,110,0,0,685,686,5,99,0,0,686,687,5,
+ 104,0,0,687,688,5,114,0,0,688,689,5,111,0,0,689,690,5,110,0,0,690,691,
+ 5,105,0,0,691,692,5,122,0,0,692,693,5,101,0,0,693,694,5,100,0,0,694,18,
+ 1,0,0,0,695,696,5,110,0,0,696,697,5,111,0,0,697,698,5,105,0,0,698,699,
+ 5,110,0,0,699,700,5,108,0,0,700,701,5,105,0,0,701,702,5,110,0,0,702,703,
+ 5,105,0,0,703,704,5,110,0,0,704,705,5,103,0,0,705,20,1,0,0,0,706,707,5,
+ 97,0,0,707,708,5,103,0,0,708,709,5,103,0,0,709,710,5,114,0,0,710,711,5,
+ 101,0,0,711,712,5,115,0,0,712,713,5,115,0,0,713,714,5,105,0,0,714,715,
+ 5,118,0,0,715,716,5,101,0,0,716,717,5,105,0,0,717,718,5,110,0,0,718,719,
+ 5,108,0,0,719,720,5,105,0,0,720,721,5,110,0,0,721,722,5,105,0,0,722,723,
+ 5,110,0,0,723,724,5,103,0,0,724,22,1,0,0,0,725,726,5,110,0,0,726,727,5,
+ 111,0,0,727,728,5,111,0,0,728,729,5,112,0,0,729,730,5,116,0,0,730,731,
+ 5,105,0,0,731,732,5,109,0,0,732,733,5,105,0,0,733,734,5,122,0,0,734,735,
+ 5,97,0,0,735,736,5,116,0,0,736,737,5,105,0,0,737,738,5,111,0,0,738,739,
+ 5,110,0,0,739,24,1,0,0,0,740,741,5,97,0,0,741,742,5,103,0,0,742,743,5,
+ 103,0,0,743,744,5,114,0,0,744,745,5,101,0,0,745,746,5,115,0,0,746,747,
+ 5,115,0,0,747,748,5,105,0,0,748,749,5,118,0,0,749,750,5,101,0,0,750,751,
+ 5,111,0,0,751,752,5,112,0,0,752,753,5,116,0,0,753,754,5,105,0,0,754,755,
+ 5,109,0,0,755,756,5,105,0,0,756,757,5,122,0,0,757,758,5,97,0,0,758,759,
+ 5,116,0,0,759,760,5,105,0,0,760,761,5,111,0,0,761,762,5,110,0,0,762,26,
+ 1,0,0,0,763,764,5,97,0,0,764,765,5,115,0,0,765,766,5,121,0,0,766,767,5,
+ 110,0,0,767,768,5,99,0,0,768,28,1,0,0,0,769,770,5,101,0,0,770,771,5,120,
+ 0,0,771,772,5,116,0,0,772,773,5,101,0,0,773,774,5,110,0,0,774,775,5,100,
+ 0,0,775,776,5,101,0,0,776,777,5,100,0,0,777,30,1,0,0,0,778,779,5,118,0,
+ 0,779,780,5,111,0,0,780,781,5,108,0,0,781,782,5,97,0,0,782,783,5,116,0,
+ 0,783,784,5,105,0,0,784,785,5,108,0,0,785,786,5,101,0,0,786,32,1,0,0,0,
+ 787,788,5,123,0,0,788,34,1,0,0,0,789,790,5,125,0,0,790,36,1,0,0,0,791,
+ 792,5,46,0,0,792,793,5,115,0,0,793,794,5,117,0,0,794,795,5,98,0,0,795,
+ 796,5,115,0,0,796,797,5,121,0,0,797,798,5,115,0,0,798,799,5,116,0,0,799,
+ 800,5,101,0,0,800,801,5,109,0,0,801,38,1,0,0,0,802,803,5,46,0,0,803,804,
+ 5,99,0,0,804,805,5,111,0,0,805,806,5,114,0,0,806,807,5,102,0,0,807,808,
+ 5,108,0,0,808,809,5,97,0,0,809,810,5,103,0,0,810,811,5,115,0,0,811,40,
+ 1,0,0,0,812,813,5,46,0,0,813,814,5,102,0,0,814,815,5,105,0,0,815,816,5,
+ 108,0,0,816,817,5,101,0,0,817,42,1,0,0,0,818,819,5,97,0,0,819,820,5,108,
+ 0,0,820,821,5,105,0,0,821,822,5,103,0,0,822,823,5,110,0,0,823,824,5,109,
+ 0,0,824,825,5,101,0,0,825,826,5,110,0,0,826,827,5,116,0,0,827,44,1,0,0,
+ 0,828,829,5,46,0,0,829,830,5,105,0,0,830,831,5,109,0,0,831,832,5,97,0,
+ 0,832,833,5,103,0,0,833,834,5,101,0,0,834,835,5,98,0,0,835,836,5,97,0,
+ 0,836,837,5,115,0,0,837,838,5,101,0,0,838,46,1,0,0,0,839,840,5,46,0,0,
+ 840,841,5,115,0,0,841,842,5,116,0,0,842,843,5,97,0,0,843,844,5,99,0,0,
+ 844,845,5,107,0,0,845,846,5,114,0,0,846,847,5,101,0,0,847,848,5,115,0,
+ 0,848,849,5,101,0,0,849,850,5,114,0,0,850,851,5,118,0,0,851,852,5,101,
+ 0,0,852,48,1,0,0,0,853,854,5,46,0,0,854,855,5,97,0,0,855,856,5,115,0,0,
+ 856,857,5,115,0,0,857,858,5,101,0,0,858,859,5,109,0,0,859,860,5,98,0,0,
+ 860,861,5,108,0,0,861,862,5,121,0,0,862,50,1,0,0,0,863,864,5,46,0,0,864,
+ 865,5,109,0,0,865,866,5,115,0,0,866,867,5,99,0,0,867,868,5,111,0,0,868,
+ 869,5,114,0,0,869,870,5,108,0,0,870,871,5,105,0,0,871,872,5,98,0,0,872,
+ 52,1,0,0,0,873,874,5,46,0,0,874,875,5,108,0,0,875,876,5,97,0,0,876,877,
+ 5,110,0,0,877,878,5,103,0,0,878,879,5,117,0,0,879,880,5,97,0,0,880,881,
+ 5,103,0,0,881,882,5,101,0,0,882,54,1,0,0,0,883,884,5,44,0,0,884,56,1,0,
+ 0,0,885,886,5,46,0,0,886,887,5,116,0,0,887,888,5,121,0,0,888,889,5,112,
+ 0,0,889,890,5,101,0,0,890,891,5,108,0,0,891,892,5,105,0,0,892,893,5,115,
+ 0,0,893,894,5,116,0,0,894,58,1,0,0,0,895,896,5,40,0,0,896,60,1,0,0,0,897,
+ 898,5,41,0,0,898,62,1,0,0,0,899,900,5,59,0,0,900,64,1,0,0,0,901,902,5,
+ 46,0,0,902,903,5,116,0,0,903,904,5,121,0,0,904,905,5,112,0,0,905,906,5,
+ 101,0,0,906,907,5,100,0,0,907,908,5,101,0,0,908,909,5,102,0,0,909,66,1,
+ 0,0,0,910,911,5,97,0,0,911,912,5,115,0,0,912,68,1,0,0,0,913,914,5,46,0,
+ 0,914,915,5,99,0,0,915,916,5,117,0,0,916,917,5,115,0,0,917,918,5,116,0,
+ 0,918,919,5,111,0,0,919,920,5,109,0,0,920,70,1,0,0,0,921,922,5,61,0,0,
+ 922,72,1,0,0,0,923,924,5,102,0,0,924,925,5,105,0,0,925,926,5,101,0,0,926,
+ 927,5,108,0,0,927,928,5,100,0,0,928,74,1,0,0,0,929,930,5,112,0,0,930,931,
+ 5,114,0,0,931,932,5,111,0,0,932,933,5,112,0,0,933,934,5,101,0,0,934,935,
+ 5,114,0,0,935,936,5,116,0,0,936,937,5,121,0,0,937,76,1,0,0,0,938,939,5,
+ 99,0,0,939,940,5,108,0,0,940,941,5,97,0,0,941,942,5,115,0,0,942,943,5,
+ 115,0,0,943,78,1,0,0,0,944,945,5,101,0,0,945,946,5,120,0,0,946,947,5,116,
+ 0,0,947,948,5,101,0,0,948,949,5,114,0,0,949,950,5,110,0,0,950,80,1,0,0,
+ 0,951,952,5,46,0,0,952,953,5,118,0,0,953,954,5,116,0,0,954,955,5,102,0,
+ 0,955,956,5,105,0,0,956,957,5,120,0,0,957,958,5,117,0,0,958,959,5,112,
+ 0,0,959,82,1,0,0,0,960,961,5,91,0,0,961,84,1,0,0,0,962,963,5,93,0,0,963,
+ 86,1,0,0,0,964,965,5,97,0,0,965,966,5,116,0,0,966,88,1,0,0,0,967,968,5,
+ 102,0,0,968,969,5,114,0,0,969,970,5,111,0,0,970,971,5,109,0,0,971,972,
+ 5,117,0,0,972,973,5,110,0,0,973,974,5,109,0,0,974,975,5,97,0,0,975,976,
+ 5,110,0,0,976,977,5,97,0,0,977,978,5,103,0,0,978,979,5,101,0,0,979,980,
+ 5,100,0,0,980,90,1,0,0,0,981,982,5,99,0,0,982,983,5,97,0,0,983,984,5,108,
+ 0,0,984,985,5,108,0,0,985,986,5,109,0,0,986,987,5,111,0,0,987,988,5,115,
+ 0,0,988,989,5,116,0,0,989,990,5,100,0,0,990,991,5,101,0,0,991,992,5,114,
+ 0,0,992,993,5,105,0,0,993,994,5,118,0,0,994,995,5,101,0,0,995,996,5,100,
+ 0,0,996,92,1,0,0,0,997,998,5,114,0,0,998,999,5,101,0,0,999,1000,5,116,
+ 0,0,1000,1001,5,97,0,0,1001,1002,5,105,0,0,1002,1003,5,110,0,0,1003,1004,
+ 5,97,0,0,1004,1005,5,112,0,0,1005,1006,5,112,0,0,1006,1007,5,100,0,0,1007,
+ 1008,5,111,0,0,1008,1009,5,109,0,0,1009,1010,5,97,0,0,1010,1011,5,105,
+ 0,0,1011,1012,5,110,0,0,1012,94,1,0,0,0,1013,1014,5,46,0,0,1014,1015,5,
+ 118,0,0,1015,1016,5,116,0,0,1016,1017,5,97,0,0,1017,1018,5,98,0,0,1018,
+ 1019,5,108,0,0,1019,1020,5,101,0,0,1020,96,1,0,0,0,1021,1022,5,46,0,0,
+ 1022,1023,5,110,0,0,1023,1024,5,97,0,0,1024,1025,5,109,0,0,1025,1026,5,
+ 101,0,0,1026,1027,5,115,0,0,1027,1028,5,112,0,0,1028,1029,5,97,0,0,1029,
+ 1030,5,99,0,0,1030,1031,5,101,0,0,1031,98,1,0,0,0,1032,1033,5,46,0,0,1033,
+ 1034,5,99,0,0,1034,1035,5,108,0,0,1035,1036,5,97,0,0,1036,1037,5,115,0,
+ 0,1037,1038,5,115,0,0,1038,100,1,0,0,0,1039,1040,5,112,0,0,1040,1041,5,
+ 117,0,0,1041,1042,5,98,0,0,1042,1043,5,108,0,0,1043,1044,5,105,0,0,1044,
+ 1045,5,99,0,0,1045,102,1,0,0,0,1046,1047,5,112,0,0,1047,1048,5,114,0,0,
+ 1048,1049,5,105,0,0,1049,1050,5,118,0,0,1050,1051,5,97,0,0,1051,1052,5,
+ 116,0,0,1052,1053,5,101,0,0,1053,104,1,0,0,0,1054,1055,5,115,0,0,1055,
+ 1056,5,101,0,0,1056,1057,5,97,0,0,1057,1058,5,108,0,0,1058,1059,5,101,
+ 0,0,1059,1060,5,100,0,0,1060,106,1,0,0,0,1061,1062,5,97,0,0,1062,1063,
+ 5,98,0,0,1063,1064,5,115,0,0,1064,1065,5,116,0,0,1065,1066,5,114,0,0,1066,
+ 1067,5,97,0,0,1067,1068,5,99,0,0,1068,1069,5,116,0,0,1069,108,1,0,0,0,
+ 1070,1071,5,97,0,0,1071,1072,5,117,0,0,1072,1073,5,116,0,0,1073,1074,5,
+ 111,0,0,1074,110,1,0,0,0,1075,1076,5,115,0,0,1076,1077,5,101,0,0,1077,
+ 1078,5,113,0,0,1078,1079,5,117,0,0,1079,1080,5,101,0,0,1080,1081,5,110,
+ 0,0,1081,1082,5,116,0,0,1082,1083,5,105,0,0,1083,1084,5,97,0,0,1084,1085,
+ 5,108,0,0,1085,112,1,0,0,0,1086,1087,5,117,0,0,1087,1088,5,110,0,0,1088,
+ 1089,5,105,0,0,1089,1090,5,99,0,0,1090,1091,5,111,0,0,1091,1092,5,100,
+ 0,0,1092,1093,5,101,0,0,1093,114,1,0,0,0,1094,1095,5,97,0,0,1095,1096,
+ 5,117,0,0,1096,1097,5,116,0,0,1097,1098,5,111,0,0,1098,1099,5,99,0,0,1099,
+ 1100,5,104,0,0,1100,1101,5,97,0,0,1101,1102,5,114,0,0,1102,116,1,0,0,0,
+ 1103,1104,5,105,0,0,1104,1105,5,109,0,0,1105,1106,5,112,0,0,1106,1107,
+ 5,111,0,0,1107,1108,5,114,0,0,1108,1109,5,116,0,0,1109,118,1,0,0,0,1110,
+ 1111,5,115,0,0,1111,1112,5,101,0,0,1112,1113,5,114,0,0,1113,1114,5,105,
+ 0,0,1114,1115,5,97,0,0,1115,1116,5,108,0,0,1116,1117,5,105,0,0,1117,1118,
+ 5,122,0,0,1118,1119,5,97,0,0,1119,1120,5,98,0,0,1120,1121,5,108,0,0,1121,
+ 1122,5,101,0,0,1122,120,1,0,0,0,1123,1124,5,119,0,0,1124,1125,5,105,0,
+ 0,1125,1126,5,110,0,0,1126,1127,5,100,0,0,1127,1128,5,111,0,0,1128,1129,
+ 5,119,0,0,1129,1130,5,115,0,0,1130,1131,5,114,0,0,1131,1132,5,117,0,0,
+ 1132,1133,5,110,0,0,1133,1134,5,116,0,0,1134,1135,5,105,0,0,1135,1136,
+ 5,109,0,0,1136,1137,5,101,0,0,1137,122,1,0,0,0,1138,1139,5,110,0,0,1139,
+ 1140,5,101,0,0,1140,1141,5,115,0,0,1141,1142,5,116,0,0,1142,1143,5,101,
+ 0,0,1143,1144,5,100,0,0,1144,124,1,0,0,0,1145,1146,5,102,0,0,1146,1147,
+ 5,97,0,0,1147,1148,5,109,0,0,1148,1149,5,105,0,0,1149,1150,5,108,0,0,1150,
+ 1151,5,121,0,0,1151,126,1,0,0,0,1152,1153,5,97,0,0,1153,1154,5,115,0,0,
+ 1154,1155,5,115,0,0,1155,1156,5,101,0,0,1156,1157,5,109,0,0,1157,1158,
+ 5,98,0,0,1158,1159,5,108,0,0,1159,1160,5,121,0,0,1160,128,1,0,0,0,1161,
+ 1162,5,102,0,0,1162,1163,5,97,0,0,1163,1164,5,109,0,0,1164,1165,5,97,0,
+ 0,1165,1166,5,110,0,0,1166,1167,5,100,0,0,1167,1168,5,97,0,0,1168,1169,
+ 5,115,0,0,1169,1170,5,115,0,0,1170,1171,5,101,0,0,1171,1172,5,109,0,0,
+ 1172,130,1,0,0,0,1173,1174,5,102,0,0,1174,1175,5,97,0,0,1175,1176,5,109,
+ 0,0,1176,1177,5,111,0,0,1177,1178,5,114,0,0,1178,1179,5,97,0,0,1179,1180,
+ 5,115,0,0,1180,1181,5,115,0,0,1181,1182,5,101,0,0,1182,1183,5,109,0,0,
+ 1183,132,1,0,0,0,1184,1185,5,98,0,0,1185,1186,5,101,0,0,1186,1187,5,102,
+ 0,0,1187,1188,5,111,0,0,1188,1189,5,114,0,0,1189,1190,5,101,0,0,1190,1191,
+ 5,102,0,0,1191,1192,5,105,0,0,1192,1193,5,101,0,0,1193,1194,5,108,0,0,
+ 1194,1195,5,100,0,0,1195,1196,5,105,0,0,1196,1197,5,110,0,0,1197,1198,
+ 5,105,0,0,1198,1199,5,116,0,0,1199,134,1,0,0,0,1200,1201,5,115,0,0,1201,
+ 1202,5,112,0,0,1202,1203,5,101,0,0,1203,1204,5,99,0,0,1204,1205,5,105,
+ 0,0,1205,1206,5,97,0,0,1206,1207,5,108,0,0,1207,1208,5,110,0,0,1208,1209,
+ 5,97,0,0,1209,1210,5,109,0,0,1210,1211,5,101,0,0,1211,136,1,0,0,0,1212,
+ 1213,5,114,0,0,1213,1214,5,116,0,0,1214,1215,5,115,0,0,1215,1216,5,112,
+ 0,0,1216,1217,5,101,0,0,1217,1218,5,99,0,0,1218,1219,5,105,0,0,1219,1220,
+ 5,97,0,0,1220,1221,5,108,0,0,1221,1222,5,110,0,0,1222,1223,5,97,0,0,1223,
+ 1224,5,109,0,0,1224,1225,5,101,0,0,1225,138,1,0,0,0,1226,1227,5,102,0,
+ 0,1227,1228,5,108,0,0,1228,1229,5,97,0,0,1229,1230,5,103,0,0,1230,1231,
+ 5,115,0,0,1231,140,1,0,0,0,1232,1233,5,101,0,0,1233,1234,5,120,0,0,1234,
+ 1235,5,116,0,0,1235,1236,5,101,0,0,1236,1237,5,110,0,0,1237,1238,5,100,
+ 0,0,1238,1239,5,115,0,0,1239,142,1,0,0,0,1240,1241,5,105,0,0,1241,1242,
+ 5,109,0,0,1242,1243,5,112,0,0,1243,1244,5,108,0,0,1244,1245,5,101,0,0,
+ 1245,1246,5,109,0,0,1246,1247,5,101,0,0,1247,1248,5,110,0,0,1248,1249,
+ 5,116,0,0,1249,1250,5,115,0,0,1250,144,1,0,0,0,1251,1252,5,46,0,0,1252,
+ 1253,5,108,0,0,1253,1254,5,105,0,0,1254,1255,5,110,0,0,1255,1256,5,101,
+ 0,0,1256,146,1,0,0,0,1257,1258,5,35,0,0,1258,1259,5,108,0,0,1259,1260,
+ 5,105,0,0,1260,1261,5,110,0,0,1261,1262,5,101,0,0,1262,148,1,0,0,0,1263,
+ 1264,5,58,0,0,1264,150,1,0,0,0,1265,1266,5,110,0,0,1266,1267,5,111,0,0,
+ 1267,1268,5,109,0,0,1268,1269,5,101,0,0,1269,1270,5,116,0,0,1270,1271,
+ 5,97,0,0,1271,1272,5,100,0,0,1272,1273,5,97,0,0,1273,1274,5,116,0,0,1274,
+ 1275,5,97,0,0,1275,152,1,0,0,0,1276,1277,5,114,0,0,1277,1278,5,101,0,0,
+ 1278,1279,5,116,0,0,1279,1280,5,97,0,0,1280,1281,5,114,0,0,1281,1282,5,
+ 103,0,0,1282,1283,5,101,0,0,1283,1284,5,116,0,0,1284,1285,5,97,0,0,1285,
+ 1286,5,98,0,0,1286,1287,5,108,0,0,1287,1288,5,101,0,0,1288,154,1,0,0,0,
+ 1289,1290,5,110,0,0,1290,1291,5,111,0,0,1291,1292,5,112,0,0,1292,1293,
+ 5,108,0,0,1293,1294,5,97,0,0,1294,1295,5,116,0,0,1295,1296,5,102,0,0,1296,
+ 1297,5,111,0,0,1297,1298,5,114,0,0,1298,1299,5,109,0,0,1299,156,1,0,0,
+ 0,1300,1301,5,108,0,0,1301,1302,5,101,0,0,1302,1303,5,103,0,0,1303,1304,
+ 5,97,0,0,1304,1305,5,99,0,0,1305,1306,5,121,0,0,1306,1307,5,32,0,0,1307,
+ 1308,5,108,0,0,1308,1309,5,105,0,0,1309,1310,5,98,0,0,1310,1311,5,114,
+ 0,0,1311,1312,5,97,0,0,1312,1313,5,114,0,0,1313,1314,5,121,0,0,1314,158,
+ 1,0,0,0,1315,1316,5,120,0,0,1316,1317,5,56,0,0,1317,1318,5,54,0,0,1318,
+ 160,1,0,0,0,1319,1320,5,97,0,0,1320,1321,5,109,0,0,1321,1322,5,100,0,0,
+ 1322,1323,5,54,0,0,1323,1324,5,52,0,0,1324,162,1,0,0,0,1325,1326,5,97,
+ 0,0,1326,1327,5,114,0,0,1327,1328,5,109,0,0,1328,164,1,0,0,0,1329,1330,
+ 5,97,0,0,1330,1331,5,114,0,0,1331,1332,5,109,0,0,1332,1333,5,54,0,0,1333,
+ 1334,5,52,0,0,1334,166,1,0,0,0,1335,1336,5,98,0,0,1336,1337,5,121,0,0,
+ 1337,1338,5,116,0,0,1338,1339,5,101,0,0,1339,1340,5,97,0,0,1340,1341,5,
+ 114,0,0,1341,1342,5,114,0,0,1342,1343,5,97,0,0,1343,1344,5,121,0,0,1344,
+ 168,1,0,0,0,1345,1346,5,40,0,0,1346,1347,5,41,0,0,1347,170,1,0,0,0,1348,
+ 1349,5,60,0,0,1349,172,1,0,0,0,1350,1351,5,62,0,0,1351,174,1,0,0,0,1352,
+ 1353,5,47,0,0,1353,176,1,0,0,0,1354,1355,5,97,0,0,1355,1356,5,108,0,0,
+ 1356,1357,5,103,0,0,1357,1358,5,111,0,0,1358,1359,5,114,0,0,1359,1360,
+ 5,105,0,0,1360,1361,5,116,0,0,1361,1362,5,104,0,0,1362,1363,5,109,0,0,
+ 1363,178,1,0,0,0,1364,1365,5,117,0,0,1365,1366,5,110,0,0,1366,1367,5,115,
+ 0,0,1367,1368,5,105,0,0,1368,1369,5,103,0,0,1369,1370,5,110,0,0,1370,1371,
+ 5,101,0,0,1371,1372,5,100,0,0,1372,180,1,0,0,0,1373,1374,5,105,0,0,1374,
+ 1375,5,105,0,0,1375,1376,5,100,0,0,1376,1377,5,112,0,0,1377,1378,5,97,
+ 0,0,1378,1379,5,114,0,0,1379,1380,5,97,0,0,1380,1381,5,109,0,0,1381,182,
+ 1,0,0,0,1382,1383,5,112,0,0,1383,1384,5,105,0,0,1384,1385,5,110,0,0,1385,
+ 1386,5,110,0,0,1386,1387,5,101,0,0,1387,1388,5,100,0,0,1388,184,1,0,0,
+ 0,1389,1390,5,109,0,0,1390,1391,5,111,0,0,1391,1392,5,100,0,0,1392,1393,
+ 5,114,0,0,1393,1394,5,101,0,0,1394,1395,5,113,0,0,1395,186,1,0,0,0,1396,
+ 1397,5,109,0,0,1397,1398,5,111,0,0,1398,1399,5,100,0,0,1399,1400,5,111,
+ 0,0,1400,1401,5,112,0,0,1401,1402,5,116,0,0,1402,188,1,0,0,0,1403,1404,
+ 5,116,0,0,1404,1405,5,114,0,0,1405,1406,5,117,0,0,1406,1407,5,101,0,0,
+ 1407,190,1,0,0,0,1408,1409,5,102,0,0,1409,1410,5,97,0,0,1410,1411,5,108,
+ 0,0,1411,1412,5,115,0,0,1412,1413,5,101,0,0,1413,192,1,0,0,0,1414,1415,
+ 5,114,0,0,1415,1416,5,101,0,0,1416,1417,5,113,0,0,1417,1418,5,117,0,0,
+ 1418,1419,5,101,0,0,1419,1420,5,115,0,0,1420,1421,5,116,0,0,1421,194,1,
+ 0,0,0,1422,1423,5,100,0,0,1423,1424,5,101,0,0,1424,1425,5,109,0,0,1425,
+ 1426,5,97,0,0,1426,1427,5,110,0,0,1427,1428,5,100,0,0,1428,196,1,0,0,0,
+ 1429,1430,5,97,0,0,1430,1431,5,115,0,0,1431,1432,5,115,0,0,1432,1433,5,
+ 101,0,0,1433,1434,5,114,0,0,1434,1435,5,116,0,0,1435,198,1,0,0,0,1436,
+ 1437,5,100,0,0,1437,1438,5,101,0,0,1438,1439,5,110,0,0,1439,1440,5,121,
+ 0,0,1440,200,1,0,0,0,1441,1442,5,112,0,0,1442,1443,5,101,0,0,1443,1444,
+ 5,114,0,0,1444,1445,5,109,0,0,1445,1446,5,105,0,0,1446,1447,5,116,0,0,
+ 1447,1448,5,111,0,0,1448,1449,5,110,0,0,1449,1450,5,108,0,0,1450,1451,
+ 5,121,0,0,1451,202,1,0,0,0,1452,1453,5,108,0,0,1453,1454,5,105,0,0,1454,
+ 1455,5,110,0,0,1455,1456,5,107,0,0,1456,1457,5,99,0,0,1457,1458,5,104,
+ 0,0,1458,1459,5,101,0,0,1459,1460,5,99,0,0,1460,1461,5,107,0,0,1461,204,
+ 1,0,0,0,1462,1463,5,105,0,0,1463,1464,5,110,0,0,1464,1465,5,104,0,0,1465,
+ 1466,5,101,0,0,1466,1467,5,114,0,0,1467,1468,5,105,0,0,1468,1469,5,116,
+ 0,0,1469,1470,5,99,0,0,1470,1471,5,104,0,0,1471,1472,5,101,0,0,1472,1473,
+ 5,99,0,0,1473,1474,5,107,0,0,1474,206,1,0,0,0,1475,1476,5,114,0,0,1476,
+ 1477,5,101,0,0,1477,1478,5,113,0,0,1478,1479,5,109,0,0,1479,1480,5,105,
+ 0,0,1480,1481,5,110,0,0,1481,208,1,0,0,0,1482,1483,5,114,0,0,1483,1484,
+ 5,101,0,0,1484,1485,5,113,0,0,1485,1486,5,111,0,0,1486,1487,5,112,0,0,
+ 1487,1488,5,116,0,0,1488,210,1,0,0,0,1489,1490,5,114,0,0,1490,1491,5,101,
+ 0,0,1491,1492,5,113,0,0,1492,1493,5,114,0,0,1493,1494,5,101,0,0,1494,1495,
+ 5,102,0,0,1495,1496,5,117,0,0,1496,1497,5,115,0,0,1497,1498,5,101,0,0,
+ 1498,212,1,0,0,0,1499,1500,5,112,0,0,1500,1501,5,114,0,0,1501,1502,5,101,
+ 0,0,1502,1503,5,106,0,0,1503,1504,5,105,0,0,1504,1505,5,116,0,0,1505,1506,
+ 5,103,0,0,1506,1507,5,114,0,0,1507,1508,5,97,0,0,1508,1509,5,110,0,0,1509,
+ 1510,5,116,0,0,1510,214,1,0,0,0,1511,1512,5,112,0,0,1512,1513,5,114,0,
+ 0,1513,1514,5,101,0,0,1514,1515,5,106,0,0,1515,1516,5,105,0,0,1516,1517,
+ 5,116,0,0,1517,1518,5,100,0,0,1518,1519,5,101,0,0,1519,1520,5,110,0,0,
+ 1520,1521,5,121,0,0,1521,216,1,0,0,0,1522,1523,5,110,0,0,1523,1524,5,111,
+ 0,0,1524,1525,5,110,0,0,1525,1526,5,99,0,0,1526,1527,5,97,0,0,1527,1528,
+ 5,115,0,0,1528,1529,5,100,0,0,1529,1530,5,101,0,0,1530,1531,5,109,0,0,
+ 1531,1532,5,97,0,0,1532,1533,5,110,0,0,1533,1534,5,100,0,0,1534,218,1,
+ 0,0,0,1535,1536,5,110,0,0,1536,1537,5,111,0,0,1537,1538,5,110,0,0,1538,
+ 1539,5,99,0,0,1539,1540,5,97,0,0,1540,1541,5,115,0,0,1541,1542,5,108,0,
+ 0,1542,1543,5,105,0,0,1543,1544,5,110,0,0,1544,1545,5,107,0,0,1545,1546,
+ 5,100,0,0,1546,1547,5,101,0,0,1547,1548,5,109,0,0,1548,1549,5,97,0,0,1549,
+ 1550,5,110,0,0,1550,1551,5,100,0,0,1551,220,1,0,0,0,1552,1553,5,110,0,
+ 0,1553,1554,5,111,0,0,1554,1555,5,110,0,0,1555,1556,5,99,0,0,1556,1557,
+ 5,97,0,0,1557,1558,5,115,0,0,1558,1559,5,105,0,0,1559,1560,5,110,0,0,1560,
+ 1561,5,104,0,0,1561,1562,5,101,0,0,1562,1563,5,114,0,0,1563,1564,5,105,
+ 0,0,1564,1565,5,116,0,0,1565,1566,5,97,0,0,1566,1567,5,110,0,0,1567,1568,
+ 5,99,0,0,1568,1569,5,101,0,0,1569,222,1,0,0,0,1570,1571,5,99,0,0,1571,
+ 1572,5,97,0,0,1572,1573,5,108,0,0,1573,1574,5,108,0,0,1574,1575,5,99,0,
+ 0,1575,1576,5,111,0,0,1576,1577,5,110,0,0,1577,1578,5,118,0,0,1578,224,
+ 1,0,0,0,1579,1580,5,109,0,0,1580,1581,5,100,0,0,1581,1582,5,116,0,0,1582,
+ 1583,5,111,0,0,1583,1584,5,107,0,0,1584,1585,5,101,0,0,1585,1586,5,110,
+ 0,0,1586,226,1,0,0,0,1587,1588,5,45,0,0,1588,228,1,0,0,0,1589,1590,5,98,
+ 0,0,1590,1591,5,121,0,0,1591,1592,5,114,0,0,1592,1593,5,101,0,0,1593,1594,
+ 5,102,0,0,1594,1595,5,108,0,0,1595,1596,5,105,0,0,1596,1597,5,107,0,0,
+ 1597,1598,5,101,0,0,1598,230,1,0,0,0,1599,1600,5,46,0,0,1600,1601,5,99,
+ 0,0,1601,1602,5,116,0,0,1602,1603,5,111,0,0,1603,1604,5,114,0,0,1604,232,
+ 1,0,0,0,1605,1606,5,46,0,0,1606,1607,5,115,0,0,1607,1608,5,105,0,0,1608,
+ 1609,5,122,0,0,1609,1610,5,101,0,0,1610,234,1,0,0,0,1611,1612,5,46,0,0,
+ 1612,1613,5,112,0,0,1613,1614,5,97,0,0,1614,1615,5,99,0,0,1615,1616,5,
+ 107,0,0,1616,236,1,0,0,0,1617,1618,5,119,0,0,1618,1619,5,105,0,0,1619,
+ 1620,5,116,0,0,1620,1621,5,104,0,0,1621,238,1,0,0,0,1622,1623,5,46,0,0,
+ 1623,1624,5,105,0,0,1624,1625,5,110,0,0,1625,1626,5,116,0,0,1626,1627,
+ 5,101,0,0,1627,1628,5,114,0,0,1628,1629,5,102,0,0,1629,1630,5,97,0,0,1630,
+ 1631,5,99,0,0,1631,1632,5,101,0,0,1632,1633,5,105,0,0,1633,1634,5,109,
+ 0,0,1634,1635,5,112,0,0,1635,1636,5,108,0,0,1636,240,1,0,0,0,1637,1638,
+ 5,46,0,0,1638,1639,5,102,0,0,1639,1640,5,105,0,0,1640,1641,5,101,0,0,1641,
+ 1642,5,108,0,0,1642,1643,5,100,0,0,1643,242,1,0,0,0,1644,1645,5,109,0,
+ 0,1645,1646,5,97,0,0,1646,1647,5,114,0,0,1647,1648,5,115,0,0,1648,1649,
+ 5,104,0,0,1649,1650,5,97,0,0,1650,1651,5,108,0,0,1651,244,1,0,0,0,1652,
+ 1653,5,115,0,0,1653,1654,5,116,0,0,1654,1655,5,97,0,0,1655,1656,5,116,
+ 0,0,1656,1657,5,105,0,0,1657,1658,5,99,0,0,1658,246,1,0,0,0,1659,1660,
+ 5,105,0,0,1660,1661,5,110,0,0,1661,1662,5,105,0,0,1662,1663,5,116,0,0,
+ 1663,1664,5,111,0,0,1664,1665,5,110,0,0,1665,1666,5,108,0,0,1666,1667,
+ 5,121,0,0,1667,248,1,0,0,0,1668,1669,5,112,0,0,1669,1670,5,114,0,0,1670,
+ 1671,5,105,0,0,1671,1672,5,118,0,0,1672,1673,5,97,0,0,1673,1674,5,116,
+ 0,0,1674,1675,5,101,0,0,1675,1676,5,115,0,0,1676,1677,5,99,0,0,1677,1678,
+ 5,111,0,0,1678,1679,5,112,0,0,1679,1680,5,101,0,0,1680,250,1,0,0,0,1681,
+ 1682,5,108,0,0,1682,1683,5,105,0,0,1683,1684,5,116,0,0,1684,1685,5,101,
+ 0,0,1685,1686,5,114,0,0,1686,1687,5,97,0,0,1687,1688,5,108,0,0,1688,252,
+ 1,0,0,0,1689,1690,5,110,0,0,1690,1691,5,111,0,0,1691,1692,5,116,0,0,1692,
+ 1693,5,115,0,0,1693,1694,5,101,0,0,1694,1695,5,114,0,0,1695,1696,5,105,
+ 0,0,1696,1697,5,97,0,0,1697,1698,5,108,0,0,1698,1699,5,105,0,0,1699,1700,
+ 5,122,0,0,1700,1701,5,101,0,0,1701,1702,5,100,0,0,1702,254,1,0,0,0,1703,
+ 1704,5,46,0,0,1704,1705,5,101,0,0,1705,1706,5,118,0,0,1706,1707,5,101,
+ 0,0,1707,1708,5,110,0,0,1708,1709,5,116,0,0,1709,256,1,0,0,0,1710,1711,
+ 5,46,0,0,1711,1712,5,97,0,0,1712,1713,5,100,0,0,1713,1714,5,100,0,0,1714,
+ 1715,5,111,0,0,1715,1716,5,110,0,0,1716,258,1,0,0,0,1717,1718,5,46,0,0,
+ 1718,1719,5,114,0,0,1719,1720,5,101,0,0,1720,1721,5,109,0,0,1721,1722,
+ 5,111,0,0,1722,1723,5,118,0,0,1723,1724,5,101,0,0,1724,1725,5,111,0,0,
+ 1725,1726,5,110,0,0,1726,260,1,0,0,0,1727,1728,5,46,0,0,1728,1729,5,102,
+ 0,0,1729,1730,5,105,0,0,1730,1731,5,114,0,0,1731,1732,5,101,0,0,1732,262,
+ 1,0,0,0,1733,1734,5,46,0,0,1734,1735,5,111,0,0,1735,1736,5,116,0,0,1736,
+ 1737,5,104,0,0,1737,1738,5,101,0,0,1738,1739,5,114,0,0,1739,264,1,0,0,
+ 0,1740,1741,5,46,0,0,1741,1742,5,112,0,0,1742,1743,5,114,0,0,1743,1744,
+ 5,111,0,0,1744,1745,5,112,0,0,1745,1746,5,101,0,0,1746,1747,5,114,0,0,
+ 1747,1748,5,116,0,0,1748,1749,5,121,0,0,1749,266,1,0,0,0,1750,1751,5,46,
+ 0,0,1751,1752,5,115,0,0,1752,1753,5,101,0,0,1753,1754,5,116,0,0,1754,268,
+ 1,0,0,0,1755,1756,5,46,0,0,1756,1757,5,103,0,0,1757,1758,5,101,0,0,1758,
+ 1759,5,116,0,0,1759,270,1,0,0,0,1760,1761,5,105,0,0,1761,1762,5,110,0,
+ 0,1762,272,1,0,0,0,1763,1764,5,111,0,0,1764,1765,5,117,0,0,1765,1766,5,
+ 116,0,0,1766,274,1,0,0,0,1767,1768,5,111,0,0,1768,1769,5,112,0,0,1769,
+ 1770,5,116,0,0,1770,276,1,0,0,0,1771,1772,5,46,0,0,1772,1773,5,109,0,0,
+ 1773,1774,5,101,0,0,1774,1775,5,116,0,0,1775,1776,5,104,0,0,1776,1777,
+ 5,111,0,0,1777,1778,5,100,0,0,1778,278,1,0,0,0,1779,1780,5,102,0,0,1780,
+ 1781,5,105,0,0,1781,1782,5,110,0,0,1782,1783,5,97,0,0,1783,1784,5,108,
+ 0,0,1784,280,1,0,0,0,1785,1786,5,118,0,0,1786,1787,5,105,0,0,1787,1788,
+ 5,114,0,0,1788,1789,5,116,0,0,1789,1790,5,117,0,0,1790,1791,5,97,0,0,1791,
+ 1792,5,108,0,0,1792,282,1,0,0,0,1793,1794,5,115,0,0,1794,1795,5,116,0,
+ 0,1795,1796,5,114,0,0,1796,1797,5,105,0,0,1797,1798,5,99,0,0,1798,1799,
+ 5,116,0,0,1799,284,1,0,0,0,1800,1801,5,104,0,0,1801,1802,5,105,0,0,1802,
+ 1803,5,100,0,0,1803,1804,5,101,0,0,1804,1805,5,98,0,0,1805,1806,5,121,
+ 0,0,1806,1807,5,115,0,0,1807,1808,5,105,0,0,1808,1809,5,103,0,0,1809,286,
+ 1,0,0,0,1810,1811,5,110,0,0,1811,1812,5,101,0,0,1812,1813,5,119,0,0,1813,
+ 1814,5,115,0,0,1814,1815,5,108,0,0,1815,1816,5,111,0,0,1816,1817,5,116,
+ 0,0,1817,288,1,0,0,0,1818,1819,5,117,0,0,1819,1820,5,110,0,0,1820,1821,
+ 5,109,0,0,1821,1822,5,97,0,0,1822,1823,5,110,0,0,1823,1824,5,97,0,0,1824,
+ 1825,5,103,0,0,1825,1826,5,101,0,0,1826,1827,5,100,0,0,1827,1828,5,101,
+ 0,0,1828,1829,5,120,0,0,1829,1830,5,112,0,0,1830,290,1,0,0,0,1831,1832,
+ 5,114,0,0,1832,1833,5,101,0,0,1833,1834,5,113,0,0,1834,1835,5,115,0,0,
+ 1835,1836,5,101,0,0,1836,1837,5,99,0,0,1837,1838,5,111,0,0,1838,1839,5,
+ 98,0,0,1839,1840,5,106,0,0,1840,292,1,0,0,0,1841,1842,5,112,0,0,1842,1843,
+ 5,105,0,0,1843,1844,5,110,0,0,1844,1845,5,118,0,0,1845,1846,5,111,0,0,
+ 1846,1847,5,107,0,0,1847,1848,5,101,0,0,1848,1849,5,105,0,0,1849,1850,
+ 5,109,0,0,1850,1851,5,112,0,0,1851,1852,5,108,0,0,1852,294,1,0,0,0,1853,
+ 1854,5,110,0,0,1854,1855,5,111,0,0,1855,1856,5,109,0,0,1856,1857,5,97,
+ 0,0,1857,1858,5,110,0,0,1858,1859,5,103,0,0,1859,1860,5,108,0,0,1860,1861,
+ 5,101,0,0,1861,296,1,0,0,0,1862,1863,5,108,0,0,1863,1864,5,97,0,0,1864,
+ 1865,5,115,0,0,1865,1866,5,116,0,0,1866,1867,5,101,0,0,1867,1868,5,114,
+ 0,0,1868,1869,5,114,0,0,1869,298,1,0,0,0,1870,1871,5,119,0,0,1871,1872,
+ 5,105,0,0,1872,1873,5,110,0,0,1873,1874,5,97,0,0,1874,1875,5,112,0,0,1875,
+ 1876,5,105,0,0,1876,300,1,0,0,0,1877,1878,5,98,0,0,1878,1879,5,101,0,0,
+ 1879,1880,5,115,0,0,1880,1881,5,116,0,0,1881,1882,5,102,0,0,1882,1883,
+ 5,105,0,0,1883,1884,5,116,0,0,1884,302,1,0,0,0,1885,1886,5,111,0,0,1886,
+ 1887,5,110,0,0,1887,304,1,0,0,0,1888,1889,5,111,0,0,1889,1890,5,102,0,
+ 0,1890,1891,5,102,0,0,1891,306,1,0,0,0,1892,1893,5,99,0,0,1893,1894,5,
+ 104,0,0,1894,1895,5,97,0,0,1895,1896,5,114,0,0,1896,1897,5,109,0,0,1897,
+ 1898,5,97,0,0,1898,1899,5,112,0,0,1899,1900,5,101,0,0,1900,1901,5,114,
+ 0,0,1901,1902,5,114,0,0,1902,1903,5,111,0,0,1903,1904,5,114,0,0,1904,308,
+ 1,0,0,0,1905,1906,5,46,0,0,1906,1907,5,99,0,0,1907,1908,5,99,0,0,1908,
+ 1909,5,116,0,0,1909,1910,5,111,0,0,1910,1911,5,114,0,0,1911,310,1,0,0,
+ 0,1912,1913,5,105,0,0,1913,1914,5,108,0,0,1914,312,1,0,0,0,1915,1916,5,
+ 105,0,0,1916,1917,5,110,0,0,1917,1918,5,105,0,0,1918,1919,5,116,0,0,1919,
+ 314,1,0,0,0,1920,1921,5,46,0,0,1921,1922,5,116,0,0,1922,1923,5,114,0,0,
+ 1923,1924,5,121,0,0,1924,316,1,0,0,0,1925,1926,5,116,0,0,1926,1927,5,111,
+ 0,0,1927,318,1,0,0,0,1928,1929,5,102,0,0,1929,1930,5,105,0,0,1930,1931,
+ 5,108,0,0,1931,1932,5,116,0,0,1932,1933,5,101,0,0,1933,1934,5,114,0,0,
+ 1934,320,1,0,0,0,1935,1936,5,99,0,0,1936,1937,5,97,0,0,1937,1938,5,116,
+ 0,0,1938,1939,5,99,0,0,1939,1940,5,104,0,0,1940,322,1,0,0,0,1941,1942,
+ 5,102,0,0,1942,1943,5,105,0,0,1943,1944,5,110,0,0,1944,1945,5,97,0,0,1945,
+ 1946,5,108,0,0,1946,1947,5,108,0,0,1947,1948,5,121,0,0,1948,324,1,0,0,
+ 0,1949,1950,5,102,0,0,1950,1951,5,97,0,0,1951,1952,5,117,0,0,1952,1953,
+ 5,108,0,0,1953,1954,5,116,0,0,1954,326,1,0,0,0,1955,1956,5,104,0,0,1956,
+ 1957,5,97,0,0,1957,1958,5,110,0,0,1958,1959,5,100,0,0,1959,1960,5,108,
+ 0,0,1960,1961,5,101,0,0,1961,1962,5,114,0,0,1962,328,1,0,0,0,1963,1964,
+ 5,46,0,0,1964,1965,5,100,0,0,1965,1966,5,97,0,0,1966,1967,5,116,0,0,1967,
+ 1968,5,97,0,0,1968,330,1,0,0,0,1969,1970,5,116,0,0,1970,1971,5,108,0,0,
+ 1971,1972,5,115,0,0,1972,332,1,0,0,0,1973,1974,5,46,0,0,1974,1975,5,112,
+ 0,0,1975,1976,5,117,0,0,1976,1977,5,98,0,0,1977,1978,5,108,0,0,1978,1979,
+ 5,105,0,0,1979,1980,5,99,0,0,1980,1981,5,107,0,0,1981,1982,5,101,0,0,1982,
+ 1983,5,121,0,0,1983,334,1,0,0,0,1984,1985,5,46,0,0,1985,1986,5,118,0,0,
+ 1986,1987,5,101,0,0,1987,1988,5,114,0,0,1988,336,1,0,0,0,1989,1990,5,46,
+ 0,0,1990,1991,5,108,0,0,1991,1992,5,111,0,0,1992,1993,5,99,0,0,1993,1994,
+ 5,97,0,0,1994,1995,5,108,0,0,1995,1996,5,101,0,0,1996,338,1,0,0,0,1997,
+ 1998,5,46,0,0,1998,1999,5,112,0,0,1999,2000,5,117,0,0,2000,2001,5,98,0,
+ 0,2001,2002,5,108,0,0,2002,2003,5,105,0,0,2003,2004,5,99,0,0,2004,2005,
+ 5,107,0,0,2005,2006,5,101,0,0,2006,2007,5,121,0,0,2007,2008,5,116,0,0,
+ 2008,2009,5,111,0,0,2009,2010,5,107,0,0,2010,2011,5,101,0,0,2011,2012,
+ 5,110,0,0,2012,340,1,0,0,0,2013,2014,5,102,0,0,2014,2015,5,111,0,0,2015,
+ 2016,5,114,0,0,2016,2017,5,119,0,0,2017,2018,5,97,0,0,2018,2019,5,114,
+ 0,0,2019,2020,5,100,0,0,2020,2021,5,101,0,0,2021,2022,5,114,0,0,2022,342,
+ 1,0,0,0,2023,2025,5,45,0,0,2024,2023,1,0,0,0,2024,2025,1,0,0,0,2025,2039,
+ 1,0,0,0,2026,2027,5,48,0,0,2027,2028,5,120,0,0,2028,2030,1,0,0,0,2029,
+ 2031,7,0,0,0,2030,2029,1,0,0,0,2031,2032,1,0,0,0,2032,2030,1,0,0,0,2032,
+ 2033,1,0,0,0,2033,2040,1,0,0,0,2034,2036,7,1,0,0,2035,2034,1,0,0,0,2036,
+ 2037,1,0,0,0,2037,2035,1,0,0,0,2037,2038,1,0,0,0,2038,2040,1,0,0,0,2039,
+ 2026,1,0,0,0,2039,2035,1,0,0,0,2040,344,1,0,0,0,2041,2043,5,45,0,0,2042,
+ 2041,1,0,0,0,2042,2043,1,0,0,0,2043,2057,1,0,0,0,2044,2045,5,48,0,0,2045,
+ 2046,5,120,0,0,2046,2048,1,0,0,0,2047,2049,7,0,0,0,2048,2047,1,0,0,0,2049,
+ 2050,1,0,0,0,2050,2048,1,0,0,0,2050,2051,1,0,0,0,2051,2058,1,0,0,0,2052,
+ 2054,7,1,0,0,2053,2052,1,0,0,0,2054,2055,1,0,0,0,2055,2053,1,0,0,0,2055,
+ 2056,1,0,0,0,2056,2058,1,0,0,0,2057,2044,1,0,0,0,2057,2053,1,0,0,0,2058,
+ 346,1,0,0,0,2059,2061,5,45,0,0,2060,2059,1,0,0,0,2060,2061,1,0,0,0,2061,
+ 2112,1,0,0,0,2062,2064,7,1,0,0,2063,2062,1,0,0,0,2064,2065,1,0,0,0,2065,
+ 2063,1,0,0,0,2065,2066,1,0,0,0,2066,2093,1,0,0,0,2067,2069,5,46,0,0,2068,
+ 2070,7,1,0,0,2069,2068,1,0,0,0,2070,2071,1,0,0,0,2071,2069,1,0,0,0,2071,
+ 2072,1,0,0,0,2072,2082,1,0,0,0,2073,2075,7,2,0,0,2074,2076,7,3,0,0,2075,
+ 2074,1,0,0,0,2075,2076,1,0,0,0,2076,2078,1,0,0,0,2077,2079,7,1,0,0,2078,
+ 2077,1,0,0,0,2079,2080,1,0,0,0,2080,2078,1,0,0,0,2080,2081,1,0,0,0,2081,
+ 2083,1,0,0,0,2082,2073,1,0,0,0,2082,2083,1,0,0,0,2083,2094,1,0,0,0,2084,
+ 2086,7,2,0,0,2085,2087,7,3,0,0,2086,2085,1,0,0,0,2086,2087,1,0,0,0,2087,
+ 2089,1,0,0,0,2088,2090,7,1,0,0,2089,2088,1,0,0,0,2090,2091,1,0,0,0,2091,
+ 2089,1,0,0,0,2091,2092,1,0,0,0,2092,2094,1,0,0,0,2093,2067,1,0,0,0,2093,
+ 2084,1,0,0,0,2094,2113,1,0,0,0,2095,2097,5,46,0,0,2096,2098,7,1,0,0,2097,
+ 2096,1,0,0,0,2098,2099,1,0,0,0,2099,2097,1,0,0,0,2099,2100,1,0,0,0,2100,
+ 2110,1,0,0,0,2101,2103,7,2,0,0,2102,2104,7,3,0,0,2103,2102,1,0,0,0,2103,
+ 2104,1,0,0,0,2104,2106,1,0,0,0,2105,2107,7,1,0,0,2106,2105,1,0,0,0,2107,
+ 2108,1,0,0,0,2108,2106,1,0,0,0,2108,2109,1,0,0,0,2109,2111,1,0,0,0,2110,
+ 2101,1,0,0,0,2110,2111,1,0,0,0,2111,2113,1,0,0,0,2112,2063,1,0,0,0,2112,
+ 2095,1,0,0,0,2113,348,1,0,0,0,2114,2115,5,58,0,0,2115,2116,5,58,0,0,2116,
+ 350,1,0,0,0,2117,2118,5,46,0,0,2118,2119,5,46,0,0,2119,2120,5,46,0,0,2120,
+ 352,1,0,0,0,2121,2122,5,110,0,0,2122,2123,5,117,0,0,2123,2124,5,108,0,
+ 0,2124,2125,5,108,0,0,2125,354,1,0,0,0,2126,2127,5,110,0,0,2127,2128,5,
+ 117,0,0,2128,2129,5,108,0,0,2129,2130,5,108,0,0,2130,2131,5,114,0,0,2131,
+ 2132,5,101,0,0,2132,2133,5,102,0,0,2133,356,1,0,0,0,2134,2135,5,46,0,0,
+ 2135,2136,5,104,0,0,2136,2137,5,97,0,0,2137,2138,5,115,0,0,2138,2139,5,
+ 104,0,0,2139,358,1,0,0,0,2140,2141,5,99,0,0,2141,2142,5,104,0,0,2142,2143,
+ 5,97,0,0,2143,2150,5,114,0,0,2144,2145,5,119,0,0,2145,2146,5,99,0,0,2146,
+ 2147,5,104,0,0,2147,2148,5,97,0,0,2148,2150,5,114,0,0,2149,2140,1,0,0,
+ 0,2149,2144,1,0,0,0,2150,360,1,0,0,0,2151,2152,5,115,0,0,2152,2153,5,116,
+ 0,0,2153,2154,5,114,0,0,2154,2155,5,105,0,0,2155,2156,5,110,0,0,2156,2157,
+ 5,103,0,0,2157,362,1,0,0,0,2158,2159,5,98,0,0,2159,2160,5,111,0,0,2160,
+ 2161,5,111,0,0,2161,2162,5,108,0,0,2162,364,1,0,0,0,2163,2164,5,105,0,
+ 0,2164,2165,5,110,0,0,2165,2166,5,116,0,0,2166,2167,5,56,0,0,2167,366,
+ 1,0,0,0,2168,2169,5,105,0,0,2169,2170,5,110,0,0,2170,2171,5,116,0,0,2171,
+ 2172,5,49,0,0,2172,2173,5,54,0,0,2173,368,1,0,0,0,2174,2175,5,105,0,0,
+ 2175,2176,5,110,0,0,2176,2177,5,116,0,0,2177,2178,5,51,0,0,2178,2179,5,
+ 50,0,0,2179,370,1,0,0,0,2180,2181,5,105,0,0,2181,2182,5,110,0,0,2182,2183,
+ 5,116,0,0,2183,2184,5,54,0,0,2184,2185,5,52,0,0,2185,372,1,0,0,0,2186,
+ 2187,5,102,0,0,2187,2188,5,108,0,0,2188,2189,5,111,0,0,2189,2190,5,97,
+ 0,0,2190,2191,5,116,0,0,2191,2192,5,51,0,0,2192,2193,5,50,0,0,2193,374,
+ 1,0,0,0,2194,2195,5,102,0,0,2195,2196,5,108,0,0,2196,2197,5,111,0,0,2197,
+ 2198,5,97,0,0,2198,2199,5,116,0,0,2199,2200,5,54,0,0,2200,2201,5,52,0,
+ 0,2201,376,1,0,0,0,2202,2203,5,117,0,0,2203,2204,5,110,0,0,2204,2205,5,
+ 115,0,0,2205,2206,5,105,0,0,2206,2207,5,103,0,0,2207,2208,5,110,0,0,2208,
+ 2209,5,101,0,0,2209,2210,5,100,0,0,2210,378,1,0,0,0,2211,2212,5,117,0,
+ 0,2212,2213,5,105,0,0,2213,2214,5,110,0,0,2214,2215,5,116,0,0,2215,2216,
+ 5,56,0,0,2216,380,1,0,0,0,2217,2218,5,117,0,0,2218,2219,5,105,0,0,2219,
+ 2220,5,110,0,0,2220,2221,5,116,0,0,2221,2222,5,49,0,0,2222,2223,5,54,0,
+ 0,2223,382,1,0,0,0,2224,2225,5,117,0,0,2225,2226,5,105,0,0,2226,2227,5,
+ 110,0,0,2227,2228,5,116,0,0,2228,2229,5,51,0,0,2229,2230,5,50,0,0,2230,
+ 384,1,0,0,0,2231,2232,5,117,0,0,2232,2233,5,105,0,0,2233,2234,5,110,0,
+ 0,2234,2235,5,116,0,0,2235,2236,5,54,0,0,2236,2237,5,52,0,0,2237,386,1,
+ 0,0,0,2238,2239,5,105,0,0,2239,2240,5,110,0,0,2240,2241,5,116,0,0,2241,
+ 388,1,0,0,0,2242,2243,5,117,0,0,2243,2244,5,105,0,0,2244,2245,5,110,0,
+ 0,2245,2246,5,116,0,0,2246,390,1,0,0,0,2247,2248,5,116,0,0,2248,2249,5,
+ 121,0,0,2249,2250,5,112,0,0,2250,2251,5,101,0,0,2251,392,1,0,0,0,2252,
+ 2253,5,111,0,0,2253,2254,5,98,0,0,2254,2255,5,106,0,0,2255,2256,5,101,
+ 0,0,2256,2257,5,99,0,0,2257,2258,5,116,0,0,2258,394,1,0,0,0,2259,2260,
+ 5,46,0,0,2260,2261,5,109,0,0,2261,2262,5,111,0,0,2262,2263,5,100,0,0,2263,
+ 2264,5,117,0,0,2264,2265,5,108,0,0,2265,2266,5,101,0,0,2266,396,1,0,0,
+ 0,2267,2268,5,118,0,0,2268,2269,5,97,0,0,2269,2270,5,108,0,0,2270,2271,
+ 5,117,0,0,2271,2272,5,101,0,0,2272,398,1,0,0,0,2273,2274,5,118,0,0,2274,
+ 2275,5,97,0,0,2275,2276,5,108,0,0,2276,2277,5,117,0,0,2277,2278,5,101,
+ 0,0,2278,2279,5,116,0,0,2279,2280,5,121,0,0,2280,2281,5,112,0,0,2281,2282,
+ 5,101,0,0,2282,400,1,0,0,0,2283,2284,5,118,0,0,2284,2285,5,111,0,0,2285,
+ 2286,5,105,0,0,2286,2287,5,100,0,0,2287,402,1,0,0,0,2288,2289,5,101,0,
+ 0,2289,2290,5,110,0,0,2290,2291,5,117,0,0,2291,2292,5,109,0,0,2292,404,
+ 1,0,0,0,2293,2294,5,99,0,0,2294,2295,5,117,0,0,2295,2296,5,115,0,0,2296,
+ 2297,5,116,0,0,2297,2298,5,111,0,0,2298,2299,5,109,0,0,2299,406,1,0,0,
+ 0,2300,2301,5,102,0,0,2301,2302,5,105,0,0,2302,2303,5,120,0,0,2303,2304,
+ 5,101,0,0,2304,2305,5,100,0,0,2305,408,1,0,0,0,2306,2307,5,115,0,0,2307,
+ 2308,5,121,0,0,2308,2309,5,115,0,0,2309,2310,5,115,0,0,2310,2311,5,116,
+ 0,0,2311,2312,5,114,0,0,2312,2313,5,105,0,0,2313,2314,5,110,0,0,2314,2315,
+ 5,103,0,0,2315,410,1,0,0,0,2316,2317,5,97,0,0,2317,2318,5,114,0,0,2318,
+ 2319,5,114,0,0,2319,2320,5,97,0,0,2320,2321,5,121,0,0,2321,412,1,0,0,0,
+ 2322,2323,5,118,0,0,2323,2324,5,97,0,0,2324,2325,5,114,0,0,2325,2326,5,
+ 105,0,0,2326,2327,5,97,0,0,2327,2328,5,110,0,0,2328,2329,5,116,0,0,2329,
+ 414,1,0,0,0,2330,2331,5,99,0,0,2331,2332,5,117,0,0,2332,2333,5,114,0,0,
+ 2333,2334,5,114,0,0,2334,2335,5,101,0,0,2335,2336,5,110,0,0,2336,2337,
+ 5,99,0,0,2337,2338,5,121,0,0,2338,416,1,0,0,0,2339,2340,5,115,0,0,2340,
+ 2341,5,121,0,0,2341,2342,5,115,0,0,2342,2343,5,99,0,0,2343,2344,5,104,
+ 0,0,2344,2345,5,97,0,0,2345,2346,5,114,0,0,2346,418,1,0,0,0,2347,2348,
+ 5,101,0,0,2348,2349,5,114,0,0,2349,2350,5,114,0,0,2350,2351,5,111,0,0,
+ 2351,2352,5,114,0,0,2352,420,1,0,0,0,2353,2354,5,100,0,0,2354,2355,5,101,
+ 0,0,2355,2356,5,99,0,0,2356,2357,5,105,0,0,2357,2358,5,109,0,0,2358,2359,
+ 5,97,0,0,2359,2360,5,108,0,0,2360,422,1,0,0,0,2361,2362,5,100,0,0,2362,
+ 2363,5,97,0,0,2363,2364,5,116,0,0,2364,2365,5,101,0,0,2365,424,1,0,0,0,
+ 2366,2367,5,98,0,0,2367,2368,5,115,0,0,2368,2369,5,116,0,0,2369,2370,5,
+ 114,0,0,2370,426,1,0,0,0,2371,2372,5,108,0,0,2372,2373,5,112,0,0,2373,
+ 2374,5,115,0,0,2374,2375,5,116,0,0,2375,2376,5,114,0,0,2376,428,1,0,0,
+ 0,2377,2378,5,108,0,0,2378,2379,5,112,0,0,2379,2380,5,119,0,0,2380,2381,
+ 5,115,0,0,2381,2382,5,116,0,0,2382,2383,5,114,0,0,2383,430,1,0,0,0,2384,
+ 2385,5,108,0,0,2385,2386,5,112,0,0,2386,2387,5,116,0,0,2387,2388,5,115,
+ 0,0,2388,2389,5,116,0,0,2389,2390,5,114,0,0,2390,432,1,0,0,0,2391,2392,
+ 5,111,0,0,2392,2393,5,98,0,0,2393,2394,5,106,0,0,2394,2395,5,101,0,0,2395,
+ 2396,5,99,0,0,2396,2397,5,116,0,0,2397,2398,5,114,0,0,2398,2399,5,101,
+ 0,0,2399,2400,5,102,0,0,2400,434,1,0,0,0,2401,2402,5,105,0,0,2402,2403,
+ 5,117,0,0,2403,2404,5,110,0,0,2404,2405,5,107,0,0,2405,2406,5,110,0,0,
+ 2406,2407,5,111,0,0,2407,2408,5,119,0,0,2408,2409,5,110,0,0,2409,436,1,
+ 0,0,0,2410,2411,5,105,0,0,2411,2412,5,100,0,0,2412,2413,5,105,0,0,2413,
+ 2414,5,115,0,0,2414,2415,5,112,0,0,2415,2416,5,97,0,0,2416,2417,5,116,
+ 0,0,2417,2418,5,99,0,0,2418,2419,5,104,0,0,2419,438,1,0,0,0,2420,2421,
+ 5,115,0,0,2421,2422,5,116,0,0,2422,2423,5,114,0,0,2423,2424,5,117,0,0,
+ 2424,2425,5,99,0,0,2425,2426,5,116,0,0,2426,440,1,0,0,0,2427,2428,5,105,
+ 0,0,2428,2429,5,110,0,0,2429,2430,5,116,0,0,2430,2431,5,101,0,0,2431,2432,
+ 5,114,0,0,2432,2433,5,102,0,0,2433,2434,5,97,0,0,2434,2435,5,99,0,0,2435,
+ 2436,5,101,0,0,2436,442,1,0,0,0,2437,2438,5,115,0,0,2438,2439,5,97,0,0,
+ 2439,2440,5,102,0,0,2440,2441,5,101,0,0,2441,2442,5,97,0,0,2442,2443,5,
+ 114,0,0,2443,2444,5,114,0,0,2444,2445,5,97,0,0,2445,2446,5,121,0,0,2446,
+ 444,1,0,0,0,2447,2448,5,98,0,0,2448,2449,5,121,0,0,2449,2450,5,118,0,0,
+ 2450,2451,5,97,0,0,2451,2452,5,108,0,0,2452,2453,5,115,0,0,2453,2454,5,
+ 116,0,0,2454,2455,5,114,0,0,2455,446,1,0,0,0,2456,2457,5,97,0,0,2457,2458,
+ 5,110,0,0,2458,2459,5,115,0,0,2459,2460,5,105,0,0,2460,448,1,0,0,0,2461,
+ 2462,5,116,0,0,2462,2463,5,98,0,0,2463,2464,5,115,0,0,2464,2465,5,116,
+ 0,0,2465,2466,5,114,0,0,2466,450,1,0,0,0,2467,2468,5,109,0,0,2468,2469,
+ 5,101,0,0,2469,2470,5,116,0,0,2470,2471,5,104,0,0,2471,2472,5,111,0,0,
+ 2472,2473,5,100,0,0,2473,452,1,0,0,0,2474,2475,5,97,0,0,2475,2476,5,110,
+ 0,0,2476,2477,5,121,0,0,2477,454,1,0,0,0,2478,2479,5,108,0,0,2479,2480,
+ 5,112,0,0,2480,2481,5,115,0,0,2481,2482,5,116,0,0,2482,2483,5,114,0,0,
+ 2483,2484,5,117,0,0,2484,2485,5,99,0,0,2485,2486,5,116,0,0,2486,456,1,
+ 0,0,0,2487,2488,5,118,0,0,2488,2489,5,101,0,0,2489,2490,5,99,0,0,2490,
+ 2491,5,116,0,0,2491,2492,5,111,0,0,2492,2493,5,114,0,0,2493,458,1,0,0,
+ 0,2494,2495,5,104,0,0,2495,2496,5,114,0,0,2496,2497,5,101,0,0,2497,2498,
+ 5,115,0,0,2498,2499,5,117,0,0,2499,2500,5,108,0,0,2500,2501,5,116,0,0,
+ 2501,460,1,0,0,0,2502,2503,5,99,0,0,2503,2504,5,97,0,0,2504,2505,5,114,
+ 0,0,2505,2506,5,114,0,0,2506,2507,5,97,0,0,2507,2508,5,121,0,0,2508,462,
+ 1,0,0,0,2509,2510,5,117,0,0,2510,2511,5,115,0,0,2511,2512,5,101,0,0,2512,
+ 2513,5,114,0,0,2513,2514,5,100,0,0,2514,2515,5,101,0,0,2515,2516,5,102,
+ 0,0,2516,2517,5,105,0,0,2517,2518,5,110,0,0,2518,2519,5,101,0,0,2519,2520,
+ 5,100,0,0,2520,464,1,0,0,0,2521,2522,5,114,0,0,2522,2523,5,101,0,0,2523,
+ 2524,5,99,0,0,2524,2525,5,111,0,0,2525,2526,5,114,0,0,2526,2527,5,100,
+ 0,0,2527,466,1,0,0,0,2528,2529,5,102,0,0,2529,2530,5,105,0,0,2530,2531,
+ 5,108,0,0,2531,2532,5,101,0,0,2532,2533,5,116,0,0,2533,2534,5,105,0,0,
+ 2534,2535,5,109,0,0,2535,2536,5,101,0,0,2536,468,1,0,0,0,2537,2538,5,98,
+ 0,0,2538,2539,5,108,0,0,2539,2540,5,111,0,0,2540,2541,5,98,0,0,2541,470,
+ 1,0,0,0,2542,2543,5,115,0,0,2543,2544,5,116,0,0,2544,2545,5,114,0,0,2545,
+ 2546,5,101,0,0,2546,2547,5,97,0,0,2547,2548,5,109,0,0,2548,472,1,0,0,0,
+ 2549,2550,5,115,0,0,2550,2551,5,116,0,0,2551,2552,5,111,0,0,2552,2553,
+ 5,114,0,0,2553,2554,5,97,0,0,2554,2555,5,103,0,0,2555,2556,5,101,0,0,2556,
+ 474,1,0,0,0,2557,2558,5,115,0,0,2558,2559,5,116,0,0,2559,2560,5,114,0,
+ 0,2560,2561,5,101,0,0,2561,2562,5,97,0,0,2562,2563,5,109,0,0,2563,2564,
+ 5,101,0,0,2564,2565,5,100,0,0,2565,2566,5,95,0,0,2566,2567,5,111,0,0,2567,
+ 2568,5,98,0,0,2568,2569,5,106,0,0,2569,2570,5,101,0,0,2570,2571,5,99,0,
+ 0,2571,2572,5,116,0,0,2572,476,1,0,0,0,2573,2574,5,115,0,0,2574,2575,5,
+ 116,0,0,2575,2576,5,111,0,0,2576,2577,5,114,0,0,2577,2578,5,101,0,0,2578,
+ 2579,5,100,0,0,2579,2580,5,95,0,0,2580,2581,5,111,0,0,2581,2582,5,98,0,
+ 0,2582,2583,5,106,0,0,2583,2584,5,101,0,0,2584,2585,5,99,0,0,2585,2586,
+ 5,116,0,0,2586,478,1,0,0,0,2587,2588,5,98,0,0,2588,2589,5,108,0,0,2589,
+ 2590,5,111,0,0,2590,2591,5,98,0,0,2591,2592,5,95,0,0,2592,2593,5,111,0,
+ 0,2593,2594,5,98,0,0,2594,2595,5,106,0,0,2595,2596,5,101,0,0,2596,2597,
+ 5,99,0,0,2597,2598,5,116,0,0,2598,480,1,0,0,0,2599,2600,5,99,0,0,2600,
+ 2601,5,102,0,0,2601,482,1,0,0,0,2602,2603,5,99,0,0,2603,2604,5,108,0,0,
+ 2604,2605,5,115,0,0,2605,2606,5,105,0,0,2606,2607,5,100,0,0,2607,484,1,
+ 0,0,0,2608,2609,5,105,0,0,2609,2610,5,110,0,0,2610,2611,5,115,0,0,2611,
+ 2612,5,116,0,0,2612,2613,5,97,0,0,2613,2614,5,110,0,0,2614,2615,5,99,0,
+ 0,2615,2616,5,101,0,0,2616,486,1,0,0,0,2617,2618,5,101,0,0,2618,2619,5,
+ 120,0,0,2619,2620,5,112,0,0,2620,2621,5,108,0,0,2621,2622,5,105,0,0,2622,
+ 2623,5,99,0,0,2623,2624,5,105,0,0,2624,2625,5,116,0,0,2625,488,1,0,0,0,
+ 2626,2627,5,100,0,0,2627,2628,5,101,0,0,2628,2629,5,102,0,0,2629,2630,
+ 5,97,0,0,2630,2631,5,117,0,0,2631,2632,5,108,0,0,2632,2633,5,116,0,0,2633,
+ 490,1,0,0,0,2634,2635,5,118,0,0,2635,2636,5,97,0,0,2636,2637,5,114,0,0,
+ 2637,2638,5,97,0,0,2638,2639,5,114,0,0,2639,2640,5,103,0,0,2640,492,1,
+ 0,0,0,2641,2642,5,117,0,0,2642,2643,5,110,0,0,2643,2644,5,109,0,0,2644,
+ 2645,5,97,0,0,2645,2646,5,110,0,0,2646,2647,5,97,0,0,2647,2648,5,103,0,
+ 0,2648,2649,5,101,0,0,2649,2650,5,100,0,0,2650,494,1,0,0,0,2651,2652,5,
+ 99,0,0,2652,2653,5,100,0,0,2653,2654,5,101,0,0,2654,2655,5,99,0,0,2655,
+ 2656,5,108,0,0,2656,496,1,0,0,0,2657,2658,5,115,0,0,2658,2659,5,116,0,
+ 0,2659,2660,5,100,0,0,2660,2661,5,99,0,0,2661,2662,5,97,0,0,2662,2663,
+ 5,108,0,0,2663,2664,5,108,0,0,2664,498,1,0,0,0,2665,2666,5,116,0,0,2666,
+ 2667,5,104,0,0,2667,2668,5,105,0,0,2668,2669,5,115,0,0,2669,2670,5,99,
+ 0,0,2670,2671,5,97,0,0,2671,2672,5,108,0,0,2672,2673,5,108,0,0,2673,500,
+ 1,0,0,0,2674,2675,5,102,0,0,2675,2676,5,97,0,0,2676,2677,5,115,0,0,2677,
+ 2678,5,116,0,0,2678,2679,5,99,0,0,2679,2680,5,97,0,0,2680,2681,5,108,0,
+ 0,2681,2682,5,108,0,0,2682,502,1,0,0,0,2683,2684,5,33,0,0,2684,504,1,0,
+ 0,0,2685,2686,5,33,0,0,2686,2687,5,33,0,0,2687,506,1,0,0,0,2688,2689,5,
+ 116,0,0,2689,2690,5,121,0,0,2690,2691,5,112,0,0,2691,2692,5,101,0,0,2692,
+ 2693,5,100,0,0,2693,2694,5,114,0,0,2694,2695,5,101,0,0,2695,2703,5,102,
+ 0,0,2696,2697,5,114,0,0,2697,2698,5,101,0,0,2698,2699,5,102,0,0,2699,2700,
+ 5,97,0,0,2700,2701,5,110,0,0,2701,2703,5,121,0,0,2702,2688,1,0,0,0,2702,
+ 2696,1,0,0,0,2703,508,1,0,0,0,2704,2705,5,46,0,0,2705,2706,5,112,0,0,2706,
+ 2707,5,97,0,0,2707,2708,5,114,0,0,2708,2709,5,97,0,0,2709,2710,5,109,0,
+ 0,2710,510,1,0,0,0,2711,2712,5,99,0,0,2712,2713,5,111,0,0,2713,2714,5,
+ 110,0,0,2714,2715,5,115,0,0,2715,2716,5,116,0,0,2716,2717,5,114,0,0,2717,
+ 2718,5,97,0,0,2718,2719,5,105,0,0,2719,2720,5,110,0,0,2720,2721,5,116,
+ 0,0,2721,512,1,0,0,0,2722,2723,5,46,0,0,2723,2724,5,116,0,0,2724,2725,
+ 5,104,0,0,2725,2726,5,105,0,0,2726,2727,5,115,0,0,2727,514,1,0,0,0,2728,
+ 2729,5,46,0,0,2729,2730,5,98,0,0,2730,2731,5,97,0,0,2731,2732,5,115,0,
+ 0,2732,2733,5,101,0,0,2733,516,1,0,0,0,2734,2735,5,46,0,0,2735,2736,5,
+ 110,0,0,2736,2737,5,101,0,0,2737,2738,5,115,0,0,2738,2739,5,116,0,0,2739,
+ 2740,5,101,0,0,2740,2741,5,114,0,0,2741,518,1,0,0,0,2742,2743,5,38,0,0,
+ 2743,520,1,0,0,0,2744,2745,5,91,0,0,2745,2746,5,93,0,0,2746,522,1,0,0,
+ 0,2747,2748,5,42,0,0,2748,524,1,0,0,0,2749,2762,5,92,0,0,2750,2763,7,4,
+ 0,0,2751,2753,7,5,0,0,2752,2754,7,5,0,0,2753,2752,1,0,0,0,2753,2754,1,
+ 0,0,0,2754,2756,1,0,0,0,2755,2757,7,5,0,0,2756,2755,1,0,0,0,2756,2757,
+ 1,0,0,0,2757,2763,1,0,0,0,2758,2760,5,13,0,0,2759,2758,1,0,0,0,2759,2760,
+ 1,0,0,0,2760,2761,1,0,0,0,2761,2763,5,10,0,0,2762,2750,1,0,0,0,2762,2751,
+ 1,0,0,0,2762,2759,1,0,0,0,2763,526,1,0,0,0,2764,2769,5,34,0,0,2765,2768,
+ 8,6,0,0,2766,2768,3,525,262,0,2767,2765,1,0,0,0,2767,2766,1,0,0,0,2768,
+ 2771,1,0,0,0,2769,2767,1,0,0,0,2769,2770,1,0,0,0,2770,2772,1,0,0,0,2771,
+ 2769,1,0,0,0,2772,2773,5,34,0,0,2773,528,1,0,0,0,2774,2779,5,39,0,0,2775,
+ 2778,8,7,0,0,2776,2778,3,525,262,0,2777,2775,1,0,0,0,2777,2776,1,0,0,0,
+ 2778,2781,1,0,0,0,2779,2777,1,0,0,0,2779,2780,1,0,0,0,2780,2782,1,0,0,
+ 0,2781,2779,1,0,0,0,2782,2783,5,39,0,0,2783,530,1,0,0,0,2784,2785,5,46,
+ 0,0,2785,532,1,0,0,0,2786,2787,5,43,0,0,2787,534,1,0,0,0,2788,2789,5,35,
+ 0,0,2789,2790,5,100,0,0,2790,2791,5,101,0,0,2791,2792,5,102,0,0,2792,2793,
+ 5,105,0,0,2793,2794,5,110,0,0,2794,2795,5,101,0,0,2795,536,1,0,0,0,2796,
+ 2797,5,35,0,0,2797,2798,5,117,0,0,2798,2799,5,110,0,0,2799,2800,5,100,
+ 0,0,2800,2801,5,101,0,0,2801,2802,5,102,0,0,2802,538,1,0,0,0,2803,2804,
+ 5,35,0,0,2804,2805,5,105,0,0,2805,2806,5,102,0,0,2806,2807,5,100,0,0,2807,
+ 2808,5,101,0,0,2808,2809,5,102,0,0,2809,540,1,0,0,0,2810,2811,5,35,0,0,
+ 2811,2812,5,105,0,0,2812,2813,5,102,0,0,2813,2814,5,110,0,0,2814,2815,
+ 5,100,0,0,2815,2816,5,101,0,0,2816,2817,5,102,0,0,2817,542,1,0,0,0,2818,
+ 2819,5,35,0,0,2819,2820,5,101,0,0,2820,2821,5,108,0,0,2821,2822,5,115,
+ 0,0,2822,2823,5,101,0,0,2823,544,1,0,0,0,2824,2825,5,35,0,0,2825,2826,
+ 5,101,0,0,2826,2827,5,110,0,0,2827,2828,5,100,0,0,2828,2829,5,105,0,0,
+ 2829,2830,5,102,0,0,2830,546,1,0,0,0,2831,2832,5,35,0,0,2832,2833,5,105,
+ 0,0,2833,2834,5,110,0,0,2834,2835,5,99,0,0,2835,2836,5,108,0,0,2836,2837,
+ 5,117,0,0,2837,2838,5,100,0,0,2838,2839,5,101,0,0,2839,548,1,0,0,0,2840,
+ 2841,5,46,0,0,2841,2842,5,109,0,0,2842,2843,5,114,0,0,2843,2844,5,101,
+ 0,0,2844,2845,5,115,0,0,2845,2846,5,111,0,0,2846,2847,5,117,0,0,2847,2848,
+ 5,114,0,0,2848,2849,5,99,0,0,2849,2850,5,101,0,0,2850,550,1,0,0,0,2851,
+ 2852,5,110,0,0,2852,2853,5,111,0,0,2853,4040,5,112,0,0,2854,2855,5,117,
+ 0,0,2855,2856,5,110,0,0,2856,2857,5,117,0,0,2857,2858,5,115,0,0,2858,2859,
+ 5,101,0,0,2859,4040,5,100,0,0,2860,2861,5,98,0,0,2861,2862,5,114,0,0,2862,
+ 2863,5,101,0,0,2863,2864,5,97,0,0,2864,4040,5,107,0,0,2865,2866,5,108,
+ 0,0,2866,2867,5,100,0,0,2867,2868,5,97,0,0,2868,2869,5,114,0,0,2869,2870,
+ 5,103,0,0,2870,2871,5,46,0,0,2871,4040,5,48,0,0,2872,2873,5,108,0,0,2873,
+ 2874,5,100,0,0,2874,2875,5,97,0,0,2875,2876,5,114,0,0,2876,2877,5,103,
+ 0,0,2877,2878,5,46,0,0,2878,4040,5,49,0,0,2879,2880,5,108,0,0,2880,2881,
+ 5,100,0,0,2881,2882,5,97,0,0,2882,2883,5,114,0,0,2883,2884,5,103,0,0,2884,
+ 2885,5,46,0,0,2885,4040,5,50,0,0,2886,2887,5,108,0,0,2887,2888,5,100,0,
+ 0,2888,2889,5,97,0,0,2889,2890,5,114,0,0,2890,2891,5,103,0,0,2891,2892,
+ 5,46,0,0,2892,4040,5,51,0,0,2893,2894,5,108,0,0,2894,2895,5,100,0,0,2895,
+ 2896,5,108,0,0,2896,2897,5,111,0,0,2897,2898,5,99,0,0,2898,2899,5,46,0,
+ 0,2899,4040,5,48,0,0,2900,2901,5,108,0,0,2901,2902,5,100,0,0,2902,2903,
+ 5,108,0,0,2903,2904,5,111,0,0,2904,2905,5,99,0,0,2905,2906,5,46,0,0,2906,
+ 4040,5,49,0,0,2907,2908,5,108,0,0,2908,2909,5,100,0,0,2909,2910,5,108,
+ 0,0,2910,2911,5,111,0,0,2911,2912,5,99,0,0,2912,2913,5,46,0,0,2913,4040,
+ 5,50,0,0,2914,2915,5,108,0,0,2915,2916,5,100,0,0,2916,2917,5,108,0,0,2917,
+ 2918,5,111,0,0,2918,2919,5,99,0,0,2919,2920,5,46,0,0,2920,4040,5,51,0,
+ 0,2921,2922,5,115,0,0,2922,2923,5,116,0,0,2923,2924,5,108,0,0,2924,2925,
+ 5,111,0,0,2925,2926,5,99,0,0,2926,2927,5,46,0,0,2927,4040,5,48,0,0,2928,
+ 2929,5,115,0,0,2929,2930,5,116,0,0,2930,2931,5,108,0,0,2931,2932,5,111,
+ 0,0,2932,2933,5,99,0,0,2933,2934,5,46,0,0,2934,4040,5,49,0,0,2935,2936,
+ 5,115,0,0,2936,2937,5,116,0,0,2937,2938,5,108,0,0,2938,2939,5,111,0,0,
+ 2939,2940,5,99,0,0,2940,2941,5,46,0,0,2941,4040,5,50,0,0,2942,2943,5,115,
+ 0,0,2943,2944,5,116,0,0,2944,2945,5,108,0,0,2945,2946,5,111,0,0,2946,2947,
+ 5,99,0,0,2947,2948,5,46,0,0,2948,4040,5,51,0,0,2949,2950,5,108,0,0,2950,
+ 2951,5,100,0,0,2951,2952,5,110,0,0,2952,2953,5,117,0,0,2953,2954,5,108,
+ 0,0,2954,4040,5,108,0,0,2955,2956,5,108,0,0,2956,2957,5,100,0,0,2957,2958,
+ 5,99,0,0,2958,2959,5,46,0,0,2959,2960,5,105,0,0,2960,2961,5,52,0,0,2961,
+ 2962,5,46,0,0,2962,2963,5,109,0,0,2963,4040,5,49,0,0,2964,2965,5,108,0,
+ 0,2965,2966,5,100,0,0,2966,2967,5,99,0,0,2967,2968,5,46,0,0,2968,2969,
+ 5,105,0,0,2969,2970,5,52,0,0,2970,2971,5,46,0,0,2971,2972,5,77,0,0,2972,
+ 4040,5,49,0,0,2973,2974,5,108,0,0,2974,2975,5,100,0,0,2975,2976,5,99,0,
+ 0,2976,2977,5,46,0,0,2977,2978,5,105,0,0,2978,2979,5,52,0,0,2979,2980,
+ 5,46,0,0,2980,4040,5,48,0,0,2981,2982,5,108,0,0,2982,2983,5,100,0,0,2983,
+ 2984,5,99,0,0,2984,2985,5,46,0,0,2985,2986,5,105,0,0,2986,2987,5,52,0,
+ 0,2987,2988,5,46,0,0,2988,4040,5,49,0,0,2989,2990,5,108,0,0,2990,2991,
+ 5,100,0,0,2991,2992,5,99,0,0,2992,2993,5,46,0,0,2993,2994,5,105,0,0,2994,
+ 2995,5,52,0,0,2995,2996,5,46,0,0,2996,4040,5,50,0,0,2997,2998,5,108,0,
+ 0,2998,2999,5,100,0,0,2999,3000,5,99,0,0,3000,3001,5,46,0,0,3001,3002,
+ 5,105,0,0,3002,3003,5,52,0,0,3003,3004,5,46,0,0,3004,4040,5,51,0,0,3005,
+ 3006,5,108,0,0,3006,3007,5,100,0,0,3007,3008,5,99,0,0,3008,3009,5,46,0,
+ 0,3009,3010,5,105,0,0,3010,3011,5,52,0,0,3011,3012,5,46,0,0,3012,4040,
+ 5,52,0,0,3013,3014,5,108,0,0,3014,3015,5,100,0,0,3015,3016,5,99,0,0,3016,
+ 3017,5,46,0,0,3017,3018,5,105,0,0,3018,3019,5,52,0,0,3019,3020,5,46,0,
+ 0,3020,4040,5,53,0,0,3021,3022,5,108,0,0,3022,3023,5,100,0,0,3023,3024,
+ 5,99,0,0,3024,3025,5,46,0,0,3025,3026,5,105,0,0,3026,3027,5,52,0,0,3027,
+ 3028,5,46,0,0,3028,4040,5,54,0,0,3029,3030,5,108,0,0,3030,3031,5,100,0,
+ 0,3031,3032,5,99,0,0,3032,3033,5,46,0,0,3033,3034,5,105,0,0,3034,3035,
+ 5,52,0,0,3035,3036,5,46,0,0,3036,4040,5,55,0,0,3037,3038,5,108,0,0,3038,
+ 3039,5,100,0,0,3039,3040,5,99,0,0,3040,3041,5,46,0,0,3041,3042,5,105,0,
+ 0,3042,3043,5,52,0,0,3043,3044,5,46,0,0,3044,4040,5,56,0,0,3045,3046,5,
+ 100,0,0,3046,3047,5,117,0,0,3047,4040,5,112,0,0,3048,3049,5,112,0,0,3049,
+ 3050,5,111,0,0,3050,4040,5,112,0,0,3051,3052,5,114,0,0,3052,3053,5,101,
+ 0,0,3053,4040,5,116,0,0,3054,3055,5,108,0,0,3055,3056,5,100,0,0,3056,3057,
+ 5,105,0,0,3057,3058,5,110,0,0,3058,3059,5,100,0,0,3059,3060,5,46,0,0,3060,
+ 3061,5,105,0,0,3061,4040,5,49,0,0,3062,3063,5,108,0,0,3063,3064,5,100,
+ 0,0,3064,3065,5,105,0,0,3065,3066,5,110,0,0,3066,3067,5,100,0,0,3067,3068,
+ 5,46,0,0,3068,3069,5,117,0,0,3069,4040,5,49,0,0,3070,3071,5,108,0,0,3071,
+ 3072,5,100,0,0,3072,3073,5,105,0,0,3073,3074,5,110,0,0,3074,3075,5,100,
+ 0,0,3075,3076,5,46,0,0,3076,3077,5,105,0,0,3077,4040,5,50,0,0,3078,3079,
+ 5,108,0,0,3079,3080,5,100,0,0,3080,3081,5,105,0,0,3081,3082,5,110,0,0,
+ 3082,3083,5,100,0,0,3083,3084,5,46,0,0,3084,3085,5,117,0,0,3085,4040,5,
+ 50,0,0,3086,3087,5,108,0,0,3087,3088,5,100,0,0,3088,3089,5,105,0,0,3089,
+ 3090,5,110,0,0,3090,3091,5,100,0,0,3091,3092,5,46,0,0,3092,3093,5,105,
+ 0,0,3093,4040,5,52,0,0,3094,3095,5,108,0,0,3095,3096,5,100,0,0,3096,3097,
+ 5,105,0,0,3097,3098,5,110,0,0,3098,3099,5,100,0,0,3099,3100,5,46,0,0,3100,
+ 3101,5,117,0,0,3101,4040,5,52,0,0,3102,3103,5,108,0,0,3103,3104,5,100,
+ 0,0,3104,3105,5,105,0,0,3105,3106,5,110,0,0,3106,3107,5,100,0,0,3107,3108,
+ 5,46,0,0,3108,3109,5,105,0,0,3109,4040,5,56,0,0,3110,3111,5,108,0,0,3111,
+ 3112,5,100,0,0,3112,3113,5,105,0,0,3113,3114,5,110,0,0,3114,3115,5,100,
+ 0,0,3115,3116,5,46,0,0,3116,3117,5,117,0,0,3117,4040,5,56,0,0,3118,3119,
+ 5,108,0,0,3119,3120,5,100,0,0,3120,3121,5,105,0,0,3121,3122,5,110,0,0,
+ 3122,3123,5,100,0,0,3123,3124,5,46,0,0,3124,4040,5,105,0,0,3125,3126,5,
+ 108,0,0,3126,3127,5,100,0,0,3127,3128,5,105,0,0,3128,3129,5,110,0,0,3129,
+ 3130,5,100,0,0,3130,3131,5,46,0,0,3131,3132,5,114,0,0,3132,4040,5,52,0,
+ 0,3133,3134,5,108,0,0,3134,3135,5,100,0,0,3135,3136,5,105,0,0,3136,3137,
+ 5,110,0,0,3137,3138,5,100,0,0,3138,3139,5,46,0,0,3139,3140,5,114,0,0,3140,
+ 4040,5,56,0,0,3141,3142,5,108,0,0,3142,3143,5,100,0,0,3143,3144,5,105,
+ 0,0,3144,3145,5,110,0,0,3145,3146,5,100,0,0,3146,3147,5,46,0,0,3147,3148,
+ 5,114,0,0,3148,3149,5,101,0,0,3149,4040,5,102,0,0,3150,3151,5,115,0,0,
+ 3151,3152,5,116,0,0,3152,3153,5,105,0,0,3153,3154,5,110,0,0,3154,3155,
+ 5,100,0,0,3155,3156,5,46,0,0,3156,3157,5,114,0,0,3157,3158,5,101,0,0,3158,
+ 4040,5,102,0,0,3159,3160,5,115,0,0,3160,3161,5,116,0,0,3161,3162,5,105,
+ 0,0,3162,3163,5,110,0,0,3163,3164,5,100,0,0,3164,3165,5,46,0,0,3165,3166,
+ 5,105,0,0,3166,4040,5,49,0,0,3167,3168,5,115,0,0,3168,3169,5,116,0,0,3169,
+ 3170,5,105,0,0,3170,3171,5,110,0,0,3171,3172,5,100,0,0,3172,3173,5,46,
+ 0,0,3173,3174,5,105,0,0,3174,4040,5,50,0,0,3175,3176,5,115,0,0,3176,3177,
+ 5,116,0,0,3177,3178,5,105,0,0,3178,3179,5,110,0,0,3179,3180,5,100,0,0,
+ 3180,3181,5,46,0,0,3181,3182,5,105,0,0,3182,4040,5,52,0,0,3183,3184,5,
+ 115,0,0,3184,3185,5,116,0,0,3185,3186,5,105,0,0,3186,3187,5,110,0,0,3187,
+ 3188,5,100,0,0,3188,3189,5,46,0,0,3189,3190,5,105,0,0,3190,4040,5,56,0,
+ 0,3191,3192,5,115,0,0,3192,3193,5,116,0,0,3193,3194,5,105,0,0,3194,3195,
+ 5,110,0,0,3195,3196,5,100,0,0,3196,3197,5,46,0,0,3197,3198,5,114,0,0,3198,
+ 4040,5,52,0,0,3199,3200,5,115,0,0,3200,3201,5,116,0,0,3201,3202,5,105,
+ 0,0,3202,3203,5,110,0,0,3203,3204,5,100,0,0,3204,3205,5,46,0,0,3205,3206,
+ 5,114,0,0,3206,4040,5,56,0,0,3207,3208,5,97,0,0,3208,3209,5,100,0,0,3209,
+ 4040,5,100,0,0,3210,3211,5,115,0,0,3211,3212,5,117,0,0,3212,4040,5,98,
+ 0,0,3213,3214,5,109,0,0,3214,3215,5,117,0,0,3215,4040,5,108,0,0,3216,3217,
+ 5,100,0,0,3217,3218,5,105,0,0,3218,4040,5,118,0,0,3219,3220,5,100,0,0,
+ 3220,3221,5,105,0,0,3221,3222,5,118,0,0,3222,3223,5,46,0,0,3223,3224,5,
+ 117,0,0,3224,4040,5,110,0,0,3225,3226,5,114,0,0,3226,3227,5,101,0,0,3227,
+ 4040,5,109,0,0,3228,3229,5,114,0,0,3229,3230,5,101,0,0,3230,3231,5,109,
+ 0,0,3231,3232,5,46,0,0,3232,3233,5,117,0,0,3233,4040,5,110,0,0,3234,3235,
+ 5,97,0,0,3235,3236,5,110,0,0,3236,4040,5,100,0,0,3237,3238,5,111,0,0,3238,
+ 4040,5,114,0,0,3239,3240,5,120,0,0,3240,3241,5,111,0,0,3241,4040,5,114,
+ 0,0,3242,3243,5,115,0,0,3243,3244,5,104,0,0,3244,4040,5,108,0,0,3245,3246,
+ 5,115,0,0,3246,3247,5,104,0,0,3247,4040,5,114,0,0,3248,3249,5,115,0,0,
+ 3249,3250,5,104,0,0,3250,3251,5,114,0,0,3251,3252,5,46,0,0,3252,3253,5,
+ 117,0,0,3253,4040,5,110,0,0,3254,3255,5,110,0,0,3255,3256,5,101,0,0,3256,
+ 4040,5,103,0,0,3257,3258,5,110,0,0,3258,3259,5,111,0,0,3259,4040,5,116,
+ 0,0,3260,3261,5,99,0,0,3261,3262,5,111,0,0,3262,3263,5,110,0,0,3263,3264,
+ 5,118,0,0,3264,3265,5,46,0,0,3265,3266,5,105,0,0,3266,4040,5,49,0,0,3267,
+ 3268,5,99,0,0,3268,3269,5,111,0,0,3269,3270,5,110,0,0,3270,3271,5,118,
+ 0,0,3271,3272,5,46,0,0,3272,3273,5,105,0,0,3273,4040,5,50,0,0,3274,3275,
+ 5,99,0,0,3275,3276,5,111,0,0,3276,3277,5,110,0,0,3277,3278,5,118,0,0,3278,
+ 3279,5,46,0,0,3279,3280,5,105,0,0,3280,4040,5,52,0,0,3281,3282,5,99,0,
+ 0,3282,3283,5,111,0,0,3283,3284,5,110,0,0,3284,3285,5,118,0,0,3285,3286,
+ 5,46,0,0,3286,3287,5,105,0,0,3287,4040,5,56,0,0,3288,3289,5,99,0,0,3289,
+ 3290,5,111,0,0,3290,3291,5,110,0,0,3291,3292,5,118,0,0,3292,3293,5,46,
+ 0,0,3293,3294,5,114,0,0,3294,4040,5,52,0,0,3295,3296,5,99,0,0,3296,3297,
+ 5,111,0,0,3297,3298,5,110,0,0,3298,3299,5,118,0,0,3299,3300,5,46,0,0,3300,
+ 3301,5,114,0,0,3301,4040,5,56,0,0,3302,3303,5,99,0,0,3303,3304,5,111,0,
+ 0,3304,3305,5,110,0,0,3305,3306,5,118,0,0,3306,3307,5,46,0,0,3307,3308,
+ 5,117,0,0,3308,4040,5,52,0,0,3309,3310,5,99,0,0,3310,3311,5,111,0,0,3311,
+ 3312,5,110,0,0,3312,3313,5,118,0,0,3313,3314,5,46,0,0,3314,3315,5,117,
+ 0,0,3315,4040,5,56,0,0,3316,3317,5,99,0,0,3317,3318,5,111,0,0,3318,3319,
+ 5,110,0,0,3319,3320,5,118,0,0,3320,3321,5,46,0,0,3321,3322,5,114,0,0,3322,
+ 3323,5,46,0,0,3323,3324,5,117,0,0,3324,4040,5,110,0,0,3325,3326,5,116,
+ 0,0,3326,3327,5,104,0,0,3327,3328,5,114,0,0,3328,3329,5,111,0,0,3329,4040,
+ 5,119,0,0,3330,3331,5,99,0,0,3331,3332,5,111,0,0,3332,3333,5,110,0,0,3333,
+ 3334,5,118,0,0,3334,3335,5,46,0,0,3335,3336,5,111,0,0,3336,3337,5,118,
+ 0,0,3337,3338,5,102,0,0,3338,3339,5,46,0,0,3339,3340,5,105,0,0,3340,3341,
+ 5,49,0,0,3341,3342,5,46,0,0,3342,3343,5,117,0,0,3343,4040,5,110,0,0,3344,
+ 3345,5,99,0,0,3345,3346,5,111,0,0,3346,3347,5,110,0,0,3347,3348,5,118,
+ 0,0,3348,3349,5,46,0,0,3349,3350,5,111,0,0,3350,3351,5,118,0,0,3351,3352,
+ 5,102,0,0,3352,3353,5,46,0,0,3353,3354,5,105,0,0,3354,3355,5,50,0,0,3355,
+ 3356,5,46,0,0,3356,3357,5,117,0,0,3357,4040,5,110,0,0,3358,3359,5,99,0,
+ 0,3359,3360,5,111,0,0,3360,3361,5,110,0,0,3361,3362,5,118,0,0,3362,3363,
+ 5,46,0,0,3363,3364,5,111,0,0,3364,3365,5,118,0,0,3365,3366,5,102,0,0,3366,
+ 3367,5,46,0,0,3367,3368,5,105,0,0,3368,3369,5,52,0,0,3369,3370,5,46,0,
+ 0,3370,3371,5,117,0,0,3371,4040,5,110,0,0,3372,3373,5,99,0,0,3373,3374,
+ 5,111,0,0,3374,3375,5,110,0,0,3375,3376,5,118,0,0,3376,3377,5,46,0,0,3377,
+ 3378,5,111,0,0,3378,3379,5,118,0,0,3379,3380,5,102,0,0,3380,3381,5,46,
+ 0,0,3381,3382,5,105,0,0,3382,3383,5,56,0,0,3383,3384,5,46,0,0,3384,3385,
+ 5,117,0,0,3385,4040,5,110,0,0,3386,3387,5,99,0,0,3387,3388,5,111,0,0,3388,
+ 3389,5,110,0,0,3389,3390,5,118,0,0,3390,3391,5,46,0,0,3391,3392,5,111,
+ 0,0,3392,3393,5,118,0,0,3393,3394,5,102,0,0,3394,3395,5,46,0,0,3395,3396,
+ 5,117,0,0,3396,3397,5,49,0,0,3397,3398,5,46,0,0,3398,3399,5,117,0,0,3399,
+ 4040,5,110,0,0,3400,3401,5,99,0,0,3401,3402,5,111,0,0,3402,3403,5,110,
+ 0,0,3403,3404,5,118,0,0,3404,3405,5,46,0,0,3405,3406,5,111,0,0,3406,3407,
+ 5,118,0,0,3407,3408,5,102,0,0,3408,3409,5,46,0,0,3409,3410,5,117,0,0,3410,
+ 3411,5,50,0,0,3411,3412,5,46,0,0,3412,3413,5,117,0,0,3413,4040,5,110,0,
+ 0,3414,3415,5,99,0,0,3415,3416,5,111,0,0,3416,3417,5,110,0,0,3417,3418,
+ 5,118,0,0,3418,3419,5,46,0,0,3419,3420,5,111,0,0,3420,3421,5,118,0,0,3421,
+ 3422,5,102,0,0,3422,3423,5,46,0,0,3423,3424,5,117,0,0,3424,3425,5,52,0,
+ 0,3425,3426,5,46,0,0,3426,3427,5,117,0,0,3427,4040,5,110,0,0,3428,3429,
+ 5,99,0,0,3429,3430,5,111,0,0,3430,3431,5,110,0,0,3431,3432,5,118,0,0,3432,
+ 3433,5,46,0,0,3433,3434,5,111,0,0,3434,3435,5,118,0,0,3435,3436,5,102,
+ 0,0,3436,3437,5,46,0,0,3437,3438,5,117,0,0,3438,3439,5,56,0,0,3439,3440,
+ 5,46,0,0,3440,3441,5,117,0,0,3441,4040,5,110,0,0,3442,3443,5,99,0,0,3443,
+ 3444,5,111,0,0,3444,3445,5,110,0,0,3445,3446,5,118,0,0,3446,3447,5,46,
+ 0,0,3447,3448,5,111,0,0,3448,3449,5,118,0,0,3449,3450,5,102,0,0,3450,3451,
+ 5,46,0,0,3451,3452,5,105,0,0,3452,3453,5,46,0,0,3453,3454,5,117,0,0,3454,
+ 4040,5,110,0,0,3455,3456,5,99,0,0,3456,3457,5,111,0,0,3457,3458,5,110,
+ 0,0,3458,3459,5,118,0,0,3459,3460,5,46,0,0,3460,3461,5,111,0,0,3461,3462,
+ 5,118,0,0,3462,3463,5,102,0,0,3463,3464,5,46,0,0,3464,3465,5,117,0,0,3465,
+ 3466,5,46,0,0,3466,3467,5,117,0,0,3467,4040,5,110,0,0,3468,3469,5,108,
+ 0,0,3469,3470,5,100,0,0,3470,3471,5,108,0,0,3471,3472,5,101,0,0,3472,4040,
+ 5,110,0,0,3473,3474,5,108,0,0,3474,3475,5,100,0,0,3475,3476,5,101,0,0,
+ 3476,3477,5,108,0,0,3477,3478,5,101,0,0,3478,3479,5,109,0,0,3479,3480,
+ 5,46,0,0,3480,3481,5,105,0,0,3481,4040,5,49,0,0,3482,3483,5,108,0,0,3483,
+ 3484,5,100,0,0,3484,3485,5,101,0,0,3485,3486,5,108,0,0,3486,3487,5,101,
+ 0,0,3487,3488,5,109,0,0,3488,3489,5,46,0,0,3489,3490,5,117,0,0,3490,4040,
+ 5,49,0,0,3491,3492,5,108,0,0,3492,3493,5,100,0,0,3493,3494,5,101,0,0,3494,
+ 3495,5,108,0,0,3495,3496,5,101,0,0,3496,3497,5,109,0,0,3497,3498,5,46,
+ 0,0,3498,3499,5,105,0,0,3499,4040,5,50,0,0,3500,3501,5,108,0,0,3501,3502,
+ 5,100,0,0,3502,3503,5,101,0,0,3503,3504,5,108,0,0,3504,3505,5,101,0,0,
+ 3505,3506,5,109,0,0,3506,3507,5,46,0,0,3507,3508,5,117,0,0,3508,4040,5,
+ 50,0,0,3509,3510,5,108,0,0,3510,3511,5,100,0,0,3511,3512,5,101,0,0,3512,
+ 3513,5,108,0,0,3513,3514,5,101,0,0,3514,3515,5,109,0,0,3515,3516,5,46,
+ 0,0,3516,3517,5,105,0,0,3517,4040,5,52,0,0,3518,3519,5,108,0,0,3519,3520,
+ 5,100,0,0,3520,3521,5,101,0,0,3521,3522,5,108,0,0,3522,3523,5,101,0,0,
+ 3523,3524,5,109,0,0,3524,3525,5,46,0,0,3525,3526,5,117,0,0,3526,4040,5,
+ 52,0,0,3527,3528,5,108,0,0,3528,3529,5,100,0,0,3529,3530,5,101,0,0,3530,
+ 3531,5,108,0,0,3531,3532,5,101,0,0,3532,3533,5,109,0,0,3533,3534,5,46,
+ 0,0,3534,3535,5,105,0,0,3535,4040,5,56,0,0,3536,3537,5,108,0,0,3537,3538,
+ 5,100,0,0,3538,3539,5,101,0,0,3539,3540,5,108,0,0,3540,3541,5,101,0,0,
+ 3541,3542,5,109,0,0,3542,3543,5,46,0,0,3543,3544,5,117,0,0,3544,4040,5,
+ 56,0,0,3545,3546,5,108,0,0,3546,3547,5,100,0,0,3547,3548,5,101,0,0,3548,
+ 3549,5,108,0,0,3549,3550,5,101,0,0,3550,3551,5,109,0,0,3551,3552,5,46,
+ 0,0,3552,4040,5,105,0,0,3553,3554,5,108,0,0,3554,3555,5,100,0,0,3555,3556,
+ 5,101,0,0,3556,3557,5,108,0,0,3557,3558,5,101,0,0,3558,3559,5,109,0,0,
+ 3559,3560,5,46,0,0,3560,3561,5,114,0,0,3561,4040,5,52,0,0,3562,3563,5,
+ 108,0,0,3563,3564,5,100,0,0,3564,3565,5,101,0,0,3565,3566,5,108,0,0,3566,
+ 3567,5,101,0,0,3567,3568,5,109,0,0,3568,3569,5,46,0,0,3569,3570,5,114,
+ 0,0,3570,4040,5,56,0,0,3571,3572,5,108,0,0,3572,3573,5,100,0,0,3573,3574,
+ 5,101,0,0,3574,3575,5,108,0,0,3575,3576,5,101,0,0,3576,3577,5,109,0,0,
+ 3577,3578,5,46,0,0,3578,3579,5,114,0,0,3579,3580,5,101,0,0,3580,4040,5,
+ 102,0,0,3581,3582,5,115,0,0,3582,3583,5,116,0,0,3583,3584,5,101,0,0,3584,
+ 3585,5,108,0,0,3585,3586,5,101,0,0,3586,3587,5,109,0,0,3587,3588,5,46,
+ 0,0,3588,4040,5,105,0,0,3589,3590,5,115,0,0,3590,3591,5,116,0,0,3591,3592,
+ 5,101,0,0,3592,3593,5,108,0,0,3593,3594,5,101,0,0,3594,3595,5,109,0,0,
+ 3595,3596,5,46,0,0,3596,3597,5,105,0,0,3597,4040,5,49,0,0,3598,3599,5,
+ 115,0,0,3599,3600,5,116,0,0,3600,3601,5,101,0,0,3601,3602,5,108,0,0,3602,
+ 3603,5,101,0,0,3603,3604,5,109,0,0,3604,3605,5,46,0,0,3605,3606,5,105,
+ 0,0,3606,4040,5,50,0,0,3607,3608,5,115,0,0,3608,3609,5,116,0,0,3609,3610,
+ 5,101,0,0,3610,3611,5,108,0,0,3611,3612,5,101,0,0,3612,3613,5,109,0,0,
+ 3613,3614,5,46,0,0,3614,3615,5,105,0,0,3615,4040,5,52,0,0,3616,3617,5,
+ 115,0,0,3617,3618,5,116,0,0,3618,3619,5,101,0,0,3619,3620,5,108,0,0,3620,
+ 3621,5,101,0,0,3621,3622,5,109,0,0,3622,3623,5,46,0,0,3623,3624,5,105,
+ 0,0,3624,4040,5,56,0,0,3625,3626,5,115,0,0,3626,3627,5,116,0,0,3627,3628,
+ 5,101,0,0,3628,3629,5,108,0,0,3629,3630,5,101,0,0,3630,3631,5,109,0,0,
+ 3631,3632,5,46,0,0,3632,3633,5,114,0,0,3633,4040,5,52,0,0,3634,3635,5,
+ 115,0,0,3635,3636,5,116,0,0,3636,3637,5,101,0,0,3637,3638,5,108,0,0,3638,
+ 3639,5,101,0,0,3639,3640,5,109,0,0,3640,3641,5,46,0,0,3641,3642,5,114,
+ 0,0,3642,4040,5,56,0,0,3643,3644,5,115,0,0,3644,3645,5,116,0,0,3645,3646,
+ 5,101,0,0,3646,3647,5,108,0,0,3647,3648,5,101,0,0,3648,3649,5,109,0,0,
+ 3649,3650,5,46,0,0,3650,3651,5,114,0,0,3651,3652,5,101,0,0,3652,4040,5,
+ 102,0,0,3653,3654,5,99,0,0,3654,3655,5,111,0,0,3655,3656,5,110,0,0,3656,
+ 3657,5,118,0,0,3657,3658,5,46,0,0,3658,3659,5,111,0,0,3659,3660,5,118,
+ 0,0,3660,3661,5,102,0,0,3661,3662,5,46,0,0,3662,3663,5,105,0,0,3663,4040,
+ 5,49,0,0,3664,3665,5,99,0,0,3665,3666,5,111,0,0,3666,3667,5,110,0,0,3667,
+ 3668,5,118,0,0,3668,3669,5,46,0,0,3669,3670,5,111,0,0,3670,3671,5,118,
+ 0,0,3671,3672,5,102,0,0,3672,3673,5,46,0,0,3673,3674,5,117,0,0,3674,4040,
+ 5,49,0,0,3675,3676,5,99,0,0,3676,3677,5,111,0,0,3677,3678,5,110,0,0,3678,
+ 3679,5,118,0,0,3679,3680,5,46,0,0,3680,3681,5,111,0,0,3681,3682,5,118,
+ 0,0,3682,3683,5,102,0,0,3683,3684,5,46,0,0,3684,3685,5,105,0,0,3685,4040,
+ 5,50,0,0,3686,3687,5,99,0,0,3687,3688,5,111,0,0,3688,3689,5,110,0,0,3689,
+ 3690,5,118,0,0,3690,3691,5,46,0,0,3691,3692,5,111,0,0,3692,3693,5,118,
+ 0,0,3693,3694,5,102,0,0,3694,3695,5,46,0,0,3695,3696,5,117,0,0,3696,4040,
+ 5,50,0,0,3697,3698,5,99,0,0,3698,3699,5,111,0,0,3699,3700,5,110,0,0,3700,
+ 3701,5,118,0,0,3701,3702,5,46,0,0,3702,3703,5,111,0,0,3703,3704,5,118,
+ 0,0,3704,3705,5,102,0,0,3705,3706,5,46,0,0,3706,3707,5,105,0,0,3707,4040,
+ 5,52,0,0,3708,3709,5,99,0,0,3709,3710,5,111,0,0,3710,3711,5,110,0,0,3711,
+ 3712,5,118,0,0,3712,3713,5,46,0,0,3713,3714,5,111,0,0,3714,3715,5,118,
+ 0,0,3715,3716,5,102,0,0,3716,3717,5,46,0,0,3717,3718,5,117,0,0,3718,4040,
+ 5,52,0,0,3719,3720,5,99,0,0,3720,3721,5,111,0,0,3721,3722,5,110,0,0,3722,
+ 3723,5,118,0,0,3723,3724,5,46,0,0,3724,3725,5,111,0,0,3725,3726,5,118,
+ 0,0,3726,3727,5,102,0,0,3727,3728,5,46,0,0,3728,3729,5,105,0,0,3729,4040,
+ 5,56,0,0,3730,3731,5,99,0,0,3731,3732,5,111,0,0,3732,3733,5,110,0,0,3733,
+ 3734,5,118,0,0,3734,3735,5,46,0,0,3735,3736,5,111,0,0,3736,3737,5,118,
+ 0,0,3737,3738,5,102,0,0,3738,3739,5,46,0,0,3739,3740,5,117,0,0,3740,4040,
+ 5,56,0,0,3741,3742,5,99,0,0,3742,3743,5,107,0,0,3743,3744,5,102,0,0,3744,
+ 3745,5,105,0,0,3745,3746,5,110,0,0,3746,3747,5,105,0,0,3747,3748,5,116,
+ 0,0,3748,4040,5,101,0,0,3749,3750,5,99,0,0,3750,3751,5,111,0,0,3751,3752,
+ 5,110,0,0,3752,3753,5,118,0,0,3753,3754,5,46,0,0,3754,3755,5,117,0,0,3755,
+ 4040,5,50,0,0,3756,3757,5,99,0,0,3757,3758,5,111,0,0,3758,3759,5,110,0,
+ 0,3759,3760,5,118,0,0,3760,3761,5,46,0,0,3761,3762,5,117,0,0,3762,4040,
+ 5,49,0,0,3763,3764,5,99,0,0,3764,3765,5,111,0,0,3765,3766,5,110,0,0,3766,
+ 3767,5,118,0,0,3767,3768,5,46,0,0,3768,4040,5,105,0,0,3769,3770,5,99,0,
+ 0,3770,3771,5,111,0,0,3771,3772,5,110,0,0,3772,3773,5,118,0,0,3773,3774,
+ 5,46,0,0,3774,3775,5,111,0,0,3775,3776,5,118,0,0,3776,3777,5,102,0,0,3777,
+ 3778,5,46,0,0,3778,4040,5,105,0,0,3779,3780,5,99,0,0,3780,3781,5,111,0,
+ 0,3781,3782,5,110,0,0,3782,3783,5,118,0,0,3783,3784,5,46,0,0,3784,3785,
+ 5,111,0,0,3785,3786,5,118,0,0,3786,3787,5,102,0,0,3787,3788,5,46,0,0,3788,
+ 4040,5,117,0,0,3789,3790,5,97,0,0,3790,3791,5,100,0,0,3791,3792,5,100,
+ 0,0,3792,3793,5,46,0,0,3793,3794,5,111,0,0,3794,3795,5,118,0,0,3795,4040,
+ 5,102,0,0,3796,3797,5,97,0,0,3797,3798,5,100,0,0,3798,3799,5,100,0,0,3799,
+ 3800,5,46,0,0,3800,3801,5,111,0,0,3801,3802,5,118,0,0,3802,3803,5,102,
+ 0,0,3803,3804,5,46,0,0,3804,3805,5,117,0,0,3805,4040,5,110,0,0,3806,3807,
+ 5,109,0,0,3807,3808,5,117,0,0,3808,3809,5,108,0,0,3809,3810,5,46,0,0,3810,
+ 3811,5,111,0,0,3811,3812,5,118,0,0,3812,4040,5,102,0,0,3813,3814,5,109,
+ 0,0,3814,3815,5,117,0,0,3815,3816,5,108,0,0,3816,3817,5,46,0,0,3817,3818,
+ 5,111,0,0,3818,3819,5,118,0,0,3819,3820,5,102,0,0,3820,3821,5,46,0,0,3821,
+ 3822,5,117,0,0,3822,4040,5,110,0,0,3823,3824,5,115,0,0,3824,3825,5,117,
+ 0,0,3825,3826,5,98,0,0,3826,3827,5,46,0,0,3827,3828,5,111,0,0,3828,3829,
+ 5,118,0,0,3829,4040,5,102,0,0,3830,3831,5,115,0,0,3831,3832,5,117,0,0,
+ 3832,3833,5,98,0,0,3833,3834,5,46,0,0,3834,3835,5,111,0,0,3835,3836,5,
+ 118,0,0,3836,3837,5,102,0,0,3837,3838,5,46,0,0,3838,3839,5,117,0,0,3839,
+ 4040,5,110,0,0,3840,3841,5,101,0,0,3841,3842,5,110,0,0,3842,3843,5,100,
+ 0,0,3843,3844,5,102,0,0,3844,3845,5,105,0,0,3845,3846,5,110,0,0,3846,3847,
+ 5,97,0,0,3847,3848,5,108,0,0,3848,3849,5,108,0,0,3849,4040,5,121,0,0,3850,
+ 3851,5,101,0,0,3851,3852,5,110,0,0,3852,3853,5,100,0,0,3853,3854,5,102,
+ 0,0,3854,3855,5,97,0,0,3855,3856,5,117,0,0,3856,3857,5,108,0,0,3857,4040,
+ 5,116,0,0,3858,3859,5,115,0,0,3859,3860,5,116,0,0,3860,3861,5,105,0,0,
+ 3861,3862,5,110,0,0,3862,3863,5,100,0,0,3863,3864,5,46,0,0,3864,4040,5,
+ 105,0,0,3865,3866,5,99,0,0,3866,3867,5,111,0,0,3867,3868,5,110,0,0,3868,
+ 3869,5,118,0,0,3869,3870,5,46,0,0,3870,4040,5,117,0,0,3871,3872,5,112,
+ 0,0,3872,3873,5,114,0,0,3873,3874,5,101,0,0,3874,3875,5,102,0,0,3875,3876,
+ 5,105,0,0,3876,3877,5,120,0,0,3877,4040,5,55,0,0,3878,3879,5,112,0,0,3879,
+ 3880,5,114,0,0,3880,3881,5,101,0,0,3881,3882,5,102,0,0,3882,3883,5,105,
+ 0,0,3883,3884,5,120,0,0,3884,4040,5,54,0,0,3885,3886,5,112,0,0,3886,3887,
+ 5,114,0,0,3887,3888,5,101,0,0,3888,3889,5,102,0,0,3889,3890,5,105,0,0,
+ 3890,3891,5,120,0,0,3891,4040,5,53,0,0,3892,3893,5,112,0,0,3893,3894,5,
+ 114,0,0,3894,3895,5,101,0,0,3895,3896,5,102,0,0,3896,3897,5,105,0,0,3897,
+ 3898,5,120,0,0,3898,4040,5,52,0,0,3899,3900,5,112,0,0,3900,3901,5,114,
+ 0,0,3901,3902,5,101,0,0,3902,3903,5,102,0,0,3903,3904,5,105,0,0,3904,3905,
+ 5,120,0,0,3905,4040,5,51,0,0,3906,3907,5,112,0,0,3907,3908,5,114,0,0,3908,
+ 3909,5,101,0,0,3909,3910,5,102,0,0,3910,3911,5,105,0,0,3911,3912,5,120,
+ 0,0,3912,4040,5,50,0,0,3913,3914,5,112,0,0,3914,3915,5,114,0,0,3915,3916,
+ 5,101,0,0,3916,3917,5,102,0,0,3917,3918,5,105,0,0,3918,3919,5,120,0,0,
+ 3919,4040,5,49,0,0,3920,3921,5,112,0,0,3921,3922,5,114,0,0,3922,3923,5,
+ 101,0,0,3923,3924,5,102,0,0,3924,3925,5,105,0,0,3925,3926,5,120,0,0,3926,
+ 3927,5,114,0,0,3927,3928,5,101,0,0,3928,4040,5,102,0,0,3929,3930,5,97,
+ 0,0,3930,3931,5,114,0,0,3931,3932,5,103,0,0,3932,3933,5,108,0,0,3933,3934,
+ 5,105,0,0,3934,3935,5,115,0,0,3935,4040,5,116,0,0,3936,3937,5,99,0,0,3937,
+ 3938,5,101,0,0,3938,4040,5,113,0,0,3939,3940,5,99,0,0,3940,3941,5,103,
+ 0,0,3941,4040,5,116,0,0,3942,3943,5,99,0,0,3943,3944,5,103,0,0,3944,3945,
+ 5,116,0,0,3945,3946,5,46,0,0,3946,3947,5,117,0,0,3947,4040,5,110,0,0,3948,
+ 3949,5,99,0,0,3949,3950,5,108,0,0,3950,4040,5,116,0,0,3951,3952,5,99,0,
+ 0,3952,3953,5,108,0,0,3953,3954,5,116,0,0,3954,3955,5,46,0,0,3955,3956,
+ 5,117,0,0,3956,4040,5,110,0,0,3957,3958,5,108,0,0,3958,3959,5,111,0,0,
+ 3959,3960,5,99,0,0,3960,3961,5,97,0,0,3961,3962,5,108,0,0,3962,3963,5,
+ 108,0,0,3963,3964,5,111,0,0,3964,4040,5,99,0,0,3965,3966,5,101,0,0,3966,
+ 3967,5,110,0,0,3967,3968,5,100,0,0,3968,3969,5,102,0,0,3969,3970,5,105,
+ 0,0,3970,3971,5,108,0,0,3971,3972,5,116,0,0,3972,3973,5,101,0,0,3973,4040,
+ 5,114,0,0,3974,3975,5,118,0,0,3975,3976,5,111,0,0,3976,3977,5,108,0,0,
+ 3977,3978,5,97,0,0,3978,3979,5,116,0,0,3979,3980,5,105,0,0,3980,3981,5,
+ 108,0,0,3981,3982,5,101,0,0,3982,4040,5,46,0,0,3983,3984,5,116,0,0,3984,
+ 3985,5,97,0,0,3985,3986,5,105,0,0,3986,3987,5,108,0,0,3987,4040,5,46,0,
+ 0,3988,3989,5,99,0,0,3989,3990,5,112,0,0,3990,3991,5,98,0,0,3991,3992,
+ 5,108,0,0,3992,4040,5,107,0,0,3993,3994,5,105,0,0,3994,3995,5,110,0,0,
+ 3995,3996,5,105,0,0,3996,3997,5,116,0,0,3997,3998,5,98,0,0,3998,3999,5,
+ 108,0,0,3999,4040,5,107,0,0,4000,4001,5,114,0,0,4001,4002,5,101,0,0,4002,
+ 4003,5,116,0,0,4003,4004,5,104,0,0,4004,4005,5,114,0,0,4005,4006,5,111,
+ 0,0,4006,4040,5,119,0,0,4007,4008,5,114,0,0,4008,4009,5,101,0,0,4009,4010,
+ 5,102,0,0,4010,4011,5,97,0,0,4011,4012,5,110,0,0,4012,4013,5,121,0,0,4013,
+ 4014,5,116,0,0,4014,4015,5,121,0,0,4015,4016,5,112,0,0,4016,4040,5,101,
+ 0,0,4017,4018,5,114,0,0,4018,4019,5,101,0,0,4019,4020,5,97,0,0,4020,4021,
+ 5,100,0,0,4021,4022,5,111,0,0,4022,4023,5,110,0,0,4023,4024,5,108,0,0,
+ 4024,4025,5,121,0,0,4025,4040,5,46,0,0,4026,4027,5,105,0,0,4027,4028,5,
+ 108,0,0,4028,4029,5,108,0,0,4029,4030,5,101,0,0,4030,4031,5,103,0,0,4031,
+ 4032,5,97,0,0,4032,4040,5,108,0,0,4033,4034,5,101,0,0,4034,4035,5,110,
+ 0,0,4035,4036,5,100,0,0,4036,4037,5,109,0,0,4037,4038,5,97,0,0,4038,4040,
+ 5,99,0,0,4039,2851,1,0,0,0,4039,2854,1,0,0,0,4039,2860,1,0,0,0,4039,2865,
+ 1,0,0,0,4039,2872,1,0,0,0,4039,2879,1,0,0,0,4039,2886,1,0,0,0,4039,2893,
+ 1,0,0,0,4039,2900,1,0,0,0,4039,2907,1,0,0,0,4039,2914,1,0,0,0,4039,2921,
+ 1,0,0,0,4039,2928,1,0,0,0,4039,2935,1,0,0,0,4039,2942,1,0,0,0,4039,2949,
+ 1,0,0,0,4039,2955,1,0,0,0,4039,2964,1,0,0,0,4039,2973,1,0,0,0,4039,2981,
+ 1,0,0,0,4039,2989,1,0,0,0,4039,2997,1,0,0,0,4039,3005,1,0,0,0,4039,3013,
+ 1,0,0,0,4039,3021,1,0,0,0,4039,3029,1,0,0,0,4039,3037,1,0,0,0,4039,3045,
+ 1,0,0,0,4039,3048,1,0,0,0,4039,3051,1,0,0,0,4039,3054,1,0,0,0,4039,3062,
+ 1,0,0,0,4039,3070,1,0,0,0,4039,3078,1,0,0,0,4039,3086,1,0,0,0,4039,3094,
+ 1,0,0,0,4039,3102,1,0,0,0,4039,3110,1,0,0,0,4039,3118,1,0,0,0,4039,3125,
+ 1,0,0,0,4039,3133,1,0,0,0,4039,3141,1,0,0,0,4039,3150,1,0,0,0,4039,3159,
+ 1,0,0,0,4039,3167,1,0,0,0,4039,3175,1,0,0,0,4039,3183,1,0,0,0,4039,3191,
+ 1,0,0,0,4039,3199,1,0,0,0,4039,3207,1,0,0,0,4039,3210,1,0,0,0,4039,3213,
+ 1,0,0,0,4039,3216,1,0,0,0,4039,3219,1,0,0,0,4039,3225,1,0,0,0,4039,3228,
+ 1,0,0,0,4039,3234,1,0,0,0,4039,3237,1,0,0,0,4039,3239,1,0,0,0,4039,3242,
+ 1,0,0,0,4039,3245,1,0,0,0,4039,3248,1,0,0,0,4039,3254,1,0,0,0,4039,3257,
+ 1,0,0,0,4039,3260,1,0,0,0,4039,3267,1,0,0,0,4039,3274,1,0,0,0,4039,3281,
+ 1,0,0,0,4039,3288,1,0,0,0,4039,3295,1,0,0,0,4039,3302,1,0,0,0,4039,3309,
+ 1,0,0,0,4039,3316,1,0,0,0,4039,3325,1,0,0,0,4039,3330,1,0,0,0,4039,3344,
+ 1,0,0,0,4039,3358,1,0,0,0,4039,3372,1,0,0,0,4039,3386,1,0,0,0,4039,3400,
+ 1,0,0,0,4039,3414,1,0,0,0,4039,3428,1,0,0,0,4039,3442,1,0,0,0,4039,3455,
+ 1,0,0,0,4039,3468,1,0,0,0,4039,3473,1,0,0,0,4039,3482,1,0,0,0,4039,3491,
+ 1,0,0,0,4039,3500,1,0,0,0,4039,3509,1,0,0,0,4039,3518,1,0,0,0,4039,3527,
+ 1,0,0,0,4039,3536,1,0,0,0,4039,3545,1,0,0,0,4039,3553,1,0,0,0,4039,3562,
+ 1,0,0,0,4039,3571,1,0,0,0,4039,3581,1,0,0,0,4039,3589,1,0,0,0,4039,3598,
+ 1,0,0,0,4039,3607,1,0,0,0,4039,3616,1,0,0,0,4039,3625,1,0,0,0,4039,3634,
+ 1,0,0,0,4039,3643,1,0,0,0,4039,3653,1,0,0,0,4039,3664,1,0,0,0,4039,3675,
+ 1,0,0,0,4039,3686,1,0,0,0,4039,3697,1,0,0,0,4039,3708,1,0,0,0,4039,3719,
+ 1,0,0,0,4039,3730,1,0,0,0,4039,3741,1,0,0,0,4039,3749,1,0,0,0,4039,3756,
+ 1,0,0,0,4039,3763,1,0,0,0,4039,3769,1,0,0,0,4039,3779,1,0,0,0,4039,3789,
+ 1,0,0,0,4039,3796,1,0,0,0,4039,3806,1,0,0,0,4039,3813,1,0,0,0,4039,3823,
+ 1,0,0,0,4039,3830,1,0,0,0,4039,3840,1,0,0,0,4039,3850,1,0,0,0,4039,3858,
+ 1,0,0,0,4039,3865,1,0,0,0,4039,3871,1,0,0,0,4039,3878,1,0,0,0,4039,3885,
+ 1,0,0,0,4039,3892,1,0,0,0,4039,3899,1,0,0,0,4039,3906,1,0,0,0,4039,3913,
+ 1,0,0,0,4039,3920,1,0,0,0,4039,3929,1,0,0,0,4039,3936,1,0,0,0,4039,3939,
+ 1,0,0,0,4039,3942,1,0,0,0,4039,3948,1,0,0,0,4039,3951,1,0,0,0,4039,3957,
+ 1,0,0,0,4039,3965,1,0,0,0,4039,3974,1,0,0,0,4039,3983,1,0,0,0,4039,3988,
+ 1,0,0,0,4039,3993,1,0,0,0,4039,4000,1,0,0,0,4039,4007,1,0,0,0,4039,4017,
+ 1,0,0,0,4039,4026,1,0,0,0,4039,4033,1,0,0,0,4040,552,1,0,0,0,4041,4042,
+ 5,108,0,0,4042,4043,5,100,0,0,4043,4044,5,97,0,0,4044,4045,5,114,0,0,4045,
+ 4046,5,103,0,0,4046,4047,5,46,0,0,4047,4118,5,115,0,0,4048,4049,5,108,
+ 0,0,4049,4050,5,100,0,0,4050,4051,5,97,0,0,4051,4052,5,114,0,0,4052,4053,
+ 5,103,0,0,4053,4054,5,97,0,0,4054,4055,5,46,0,0,4055,4118,5,115,0,0,4056,
+ 4057,5,115,0,0,4057,4058,5,116,0,0,4058,4059,5,97,0,0,4059,4060,5,114,
+ 0,0,4060,4061,5,103,0,0,4061,4062,5,46,0,0,4062,4118,5,115,0,0,4063,4064,
+ 5,108,0,0,4064,4065,5,100,0,0,4065,4066,5,108,0,0,4066,4067,5,111,0,0,
+ 4067,4068,5,99,0,0,4068,4069,5,46,0,0,4069,4118,5,115,0,0,4070,4071,5,
+ 108,0,0,4071,4072,5,100,0,0,4072,4073,5,108,0,0,4073,4074,5,111,0,0,4074,
+ 4075,5,99,0,0,4075,4076,5,97,0,0,4076,4077,5,46,0,0,4077,4118,5,115,0,
+ 0,4078,4079,5,115,0,0,4079,4080,5,116,0,0,4080,4081,5,108,0,0,4081,4082,
+ 5,111,0,0,4082,4083,5,99,0,0,4083,4084,5,46,0,0,4084,4118,5,115,0,0,4085,
+ 4086,5,108,0,0,4086,4087,5,100,0,0,4087,4088,5,97,0,0,4088,4089,5,114,
+ 0,0,4089,4118,5,103,0,0,4090,4091,5,108,0,0,4091,4092,5,100,0,0,4092,4093,
+ 5,97,0,0,4093,4094,5,114,0,0,4094,4095,5,103,0,0,4095,4118,5,97,0,0,4096,
+ 4097,5,115,0,0,4097,4098,5,116,0,0,4098,4099,5,97,0,0,4099,4100,5,114,
+ 0,0,4100,4118,5,103,0,0,4101,4102,5,108,0,0,4102,4103,5,100,0,0,4103,4104,
+ 5,108,0,0,4104,4105,5,111,0,0,4105,4118,5,99,0,0,4106,4107,5,108,0,0,4107,
+ 4108,5,100,0,0,4108,4109,5,108,0,0,4109,4110,5,111,0,0,4110,4111,5,99,
+ 0,0,4111,4118,5,97,0,0,4112,4113,5,115,0,0,4113,4114,5,116,0,0,4114,4115,
+ 5,108,0,0,4115,4116,5,111,0,0,4116,4118,5,99,0,0,4117,4041,1,0,0,0,4117,
+ 4048,1,0,0,0,4117,4056,1,0,0,0,4117,4063,1,0,0,0,4117,4070,1,0,0,0,4117,
+ 4078,1,0,0,0,4117,4085,1,0,0,0,4117,4090,1,0,0,0,4117,4096,1,0,0,0,4117,
+ 4101,1,0,0,0,4117,4106,1,0,0,0,4117,4112,1,0,0,0,4118,554,1,0,0,0,4119,
+ 4120,5,108,0,0,4120,4121,5,100,0,0,4121,4122,5,99,0,0,4122,4123,5,46,0,
+ 0,4123,4124,5,105,0,0,4124,4125,5,52,0,0,4125,4126,5,46,0,0,4126,4147,
+ 5,115,0,0,4127,4128,5,108,0,0,4128,4129,5,100,0,0,4129,4130,5,99,0,0,4130,
+ 4131,5,46,0,0,4131,4132,5,105,0,0,4132,4147,5,52,0,0,4133,4134,5,117,0,
+ 0,4134,4135,5,110,0,0,4135,4136,5,97,0,0,4136,4137,5,108,0,0,4137,4138,
+ 5,105,0,0,4138,4139,5,103,0,0,4139,4140,5,110,0,0,4140,4141,5,101,0,0,
+ 4141,4142,5,100,0,0,4142,4147,5,46,0,0,4143,4144,5,110,0,0,4144,4145,5,
+ 111,0,0,4145,4147,5,46,0,0,4146,4119,1,0,0,0,4146,4127,1,0,0,0,4146,4133,
+ 1,0,0,0,4146,4143,1,0,0,0,4147,556,1,0,0,0,4148,4149,5,108,0,0,4149,4150,
+ 5,100,0,0,4150,4151,5,99,0,0,4151,4152,5,46,0,0,4152,4153,5,105,0,0,4153,
+ 4154,5,56,0,0,4154,558,1,0,0,0,4155,4156,5,108,0,0,4156,4157,5,100,0,0,
+ 4157,4158,5,99,0,0,4158,4159,5,46,0,0,4159,4160,5,114,0,0,4160,4168,5,
+ 52,0,0,4161,4162,5,108,0,0,4162,4163,5,100,0,0,4163,4164,5,99,0,0,4164,
+ 4165,5,46,0,0,4165,4166,5,114,0,0,4166,4168,5,56,0,0,4167,4155,1,0,0,0,
+ 4167,4161,1,0,0,0,4168,560,1,0,0,0,4169,4170,5,106,0,0,4170,4171,5,109,
+ 0,0,4171,4205,5,112,0,0,4172,4173,5,99,0,0,4173,4174,5,97,0,0,4174,4175,
+ 5,108,0,0,4175,4205,5,108,0,0,4176,4177,5,99,0,0,4177,4178,5,97,0,0,4178,
+ 4179,5,108,0,0,4179,4180,5,108,0,0,4180,4181,5,118,0,0,4181,4182,5,105,
+ 0,0,4182,4183,5,114,0,0,4183,4205,5,116,0,0,4184,4185,5,110,0,0,4185,4186,
+ 5,101,0,0,4186,4187,5,119,0,0,4187,4188,5,111,0,0,4188,4189,5,98,0,0,4189,
+ 4205,5,106,0,0,4190,4191,5,108,0,0,4191,4192,5,100,0,0,4192,4193,5,102,
+ 0,0,4193,4194,5,116,0,0,4194,4205,5,110,0,0,4195,4196,5,108,0,0,4196,4197,
+ 5,100,0,0,4197,4198,5,118,0,0,4198,4199,5,105,0,0,4199,4200,5,114,0,0,
+ 4200,4201,5,116,0,0,4201,4202,5,102,0,0,4202,4203,5,116,0,0,4203,4205,
+ 5,110,0,0,4204,4169,1,0,0,0,4204,4172,1,0,0,0,4204,4176,1,0,0,0,4204,4184,
+ 1,0,0,0,4204,4190,1,0,0,0,4204,4195,1,0,0,0,4205,562,1,0,0,0,4206,4207,
+ 5,99,0,0,4207,4208,5,97,0,0,4208,4209,5,108,0,0,4209,4210,5,108,0,0,4210,
+ 4211,5,105,0,0,4211,564,1,0,0,0,4212,4213,5,98,0,0,4213,4214,5,114,0,0,
+ 4214,4215,5,46,0,0,4215,4371,5,115,0,0,4216,4217,5,98,0,0,4217,4218,5,
+ 114,0,0,4218,4219,5,102,0,0,4219,4220,5,97,0,0,4220,4221,5,108,0,0,4221,
+ 4222,5,115,0,0,4222,4223,5,101,0,0,4223,4224,5,46,0,0,4224,4371,5,115,
+ 0,0,4225,4226,5,98,0,0,4226,4227,5,114,0,0,4227,4228,5,116,0,0,4228,4229,
+ 5,114,0,0,4229,4230,5,117,0,0,4230,4231,5,101,0,0,4231,4232,5,46,0,0,4232,
+ 4371,5,115,0,0,4233,4234,5,98,0,0,4234,4235,5,101,0,0,4235,4236,5,113,
+ 0,0,4236,4237,5,46,0,0,4237,4371,5,115,0,0,4238,4239,5,98,0,0,4239,4240,
+ 5,103,0,0,4240,4241,5,101,0,0,4241,4242,5,46,0,0,4242,4371,5,115,0,0,4243,
+ 4244,5,98,0,0,4244,4245,5,103,0,0,4245,4246,5,116,0,0,4246,4247,5,46,0,
+ 0,4247,4371,5,115,0,0,4248,4249,5,98,0,0,4249,4250,5,108,0,0,4250,4251,
+ 5,101,0,0,4251,4252,5,46,0,0,4252,4371,5,115,0,0,4253,4254,5,98,0,0,4254,
+ 4255,5,108,0,0,4255,4256,5,116,0,0,4256,4257,5,46,0,0,4257,4371,5,115,
+ 0,0,4258,4259,5,98,0,0,4259,4260,5,110,0,0,4260,4261,5,101,0,0,4261,4262,
+ 5,46,0,0,4262,4263,5,117,0,0,4263,4264,5,110,0,0,4264,4265,5,46,0,0,4265,
+ 4371,5,115,0,0,4266,4267,5,98,0,0,4267,4268,5,103,0,0,4268,4269,5,101,
+ 0,0,4269,4270,5,46,0,0,4270,4271,5,117,0,0,4271,4272,5,110,0,0,4272,4273,
+ 5,46,0,0,4273,4371,5,115,0,0,4274,4275,5,98,0,0,4275,4276,5,103,0,0,4276,
+ 4277,5,116,0,0,4277,4278,5,46,0,0,4278,4279,5,117,0,0,4279,4280,5,110,
+ 0,0,4280,4281,5,46,0,0,4281,4371,5,115,0,0,4282,4283,5,98,0,0,4283,4284,
+ 5,108,0,0,4284,4285,5,101,0,0,4285,4286,5,46,0,0,4286,4287,5,117,0,0,4287,
+ 4288,5,110,0,0,4288,4289,5,46,0,0,4289,4371,5,115,0,0,4290,4291,5,98,0,
+ 0,4291,4292,5,108,0,0,4292,4293,5,116,0,0,4293,4294,5,46,0,0,4294,4295,
+ 5,117,0,0,4295,4296,5,110,0,0,4296,4297,5,46,0,0,4297,4371,5,115,0,0,4298,
+ 4299,5,98,0,0,4299,4371,5,114,0,0,4300,4301,5,98,0,0,4301,4302,5,114,0,
+ 0,4302,4303,5,102,0,0,4303,4304,5,97,0,0,4304,4305,5,108,0,0,4305,4306,
+ 5,115,0,0,4306,4371,5,101,0,0,4307,4308,5,98,0,0,4308,4309,5,114,0,0,4309,
+ 4310,5,116,0,0,4310,4311,5,114,0,0,4311,4312,5,117,0,0,4312,4371,5,101,
+ 0,0,4313,4314,5,98,0,0,4314,4315,5,101,0,0,4315,4371,5,113,0,0,4316,4317,
+ 5,98,0,0,4317,4318,5,103,0,0,4318,4371,5,101,0,0,4319,4320,5,98,0,0,4320,
+ 4321,5,103,0,0,4321,4371,5,116,0,0,4322,4323,5,98,0,0,4323,4324,5,108,
+ 0,0,4324,4371,5,101,0,0,4325,4326,5,98,0,0,4326,4327,5,108,0,0,4327,4371,
+ 5,116,0,0,4328,4329,5,98,0,0,4329,4330,5,110,0,0,4330,4331,5,101,0,0,4331,
+ 4332,5,46,0,0,4332,4333,5,117,0,0,4333,4371,5,110,0,0,4334,4335,5,98,0,
+ 0,4335,4336,5,103,0,0,4336,4337,5,101,0,0,4337,4338,5,46,0,0,4338,4339,
+ 5,117,0,0,4339,4371,5,110,0,0,4340,4341,5,98,0,0,4341,4342,5,103,0,0,4342,
+ 4343,5,116,0,0,4343,4344,5,46,0,0,4344,4345,5,117,0,0,4345,4371,5,110,
+ 0,0,4346,4347,5,98,0,0,4347,4348,5,108,0,0,4348,4349,5,101,0,0,4349,4350,
+ 5,46,0,0,4350,4351,5,117,0,0,4351,4371,5,110,0,0,4352,4353,5,98,0,0,4353,
+ 4354,5,108,0,0,4354,4355,5,116,0,0,4355,4356,5,46,0,0,4356,4357,5,117,
+ 0,0,4357,4371,5,110,0,0,4358,4359,5,108,0,0,4359,4360,5,101,0,0,4360,4361,
+ 5,97,0,0,4361,4362,5,118,0,0,4362,4371,5,101,0,0,4363,4364,5,108,0,0,4364,
+ 4365,5,101,0,0,4365,4366,5,97,0,0,4366,4367,5,118,0,0,4367,4368,5,101,
+ 0,0,4368,4369,5,46,0,0,4369,4371,5,115,0,0,4370,4212,1,0,0,0,4370,4216,
+ 1,0,0,0,4370,4225,1,0,0,0,4370,4233,1,0,0,0,4370,4238,1,0,0,0,4370,4243,
+ 1,0,0,0,4370,4248,1,0,0,0,4370,4253,1,0,0,0,4370,4258,1,0,0,0,4370,4266,
+ 1,0,0,0,4370,4274,1,0,0,0,4370,4282,1,0,0,0,4370,4290,1,0,0,0,4370,4298,
+ 1,0,0,0,4370,4300,1,0,0,0,4370,4307,1,0,0,0,4370,4313,1,0,0,0,4370,4316,
+ 1,0,0,0,4370,4319,1,0,0,0,4370,4322,1,0,0,0,4370,4325,1,0,0,0,4370,4328,
+ 1,0,0,0,4370,4334,1,0,0,0,4370,4340,1,0,0,0,4370,4346,1,0,0,0,4370,4352,
+ 1,0,0,0,4370,4358,1,0,0,0,4370,4363,1,0,0,0,4371,566,1,0,0,0,4372,4373,
+ 5,115,0,0,4373,4374,5,119,0,0,4374,4375,5,105,0,0,4375,4376,5,116,0,0,
+ 4376,4377,5,99,0,0,4377,4378,5,104,0,0,4378,568,1,0,0,0,4379,4380,5,99,
+ 0,0,4380,4381,5,112,0,0,4381,4382,5,111,0,0,4382,4383,5,98,0,0,4383,4494,
+ 5,106,0,0,4384,4385,5,108,0,0,4385,4386,5,100,0,0,4386,4387,5,111,0,0,
+ 4387,4388,5,98,0,0,4388,4494,5,106,0,0,4389,4390,5,99,0,0,4390,4391,5,
+ 97,0,0,4391,4392,5,115,0,0,4392,4393,5,116,0,0,4393,4394,5,99,0,0,4394,
+ 4395,5,108,0,0,4395,4396,5,97,0,0,4396,4397,5,115,0,0,4397,4494,5,115,
+ 0,0,4398,4399,5,105,0,0,4399,4400,5,115,0,0,4400,4401,5,105,0,0,4401,4402,
+ 5,110,0,0,4402,4403,5,115,0,0,4403,4494,5,116,0,0,4404,4405,5,117,0,0,
+ 4405,4406,5,110,0,0,4406,4407,5,98,0,0,4407,4408,5,111,0,0,4408,4494,5,
+ 120,0,0,4409,4410,5,115,0,0,4410,4411,5,116,0,0,4411,4412,5,111,0,0,4412,
+ 4413,5,98,0,0,4413,4494,5,106,0,0,4414,4415,5,98,0,0,4415,4416,5,111,0,
+ 0,4416,4494,5,120,0,0,4417,4418,5,110,0,0,4418,4419,5,101,0,0,4419,4420,
+ 5,119,0,0,4420,4421,5,97,0,0,4421,4422,5,114,0,0,4422,4494,5,114,0,0,4423,
+ 4424,5,108,0,0,4424,4425,5,100,0,0,4425,4426,5,101,0,0,4426,4427,5,108,
+ 0,0,4427,4428,5,101,0,0,4428,4429,5,109,0,0,4429,4494,5,97,0,0,4430,4431,
+ 5,108,0,0,4431,4432,5,100,0,0,4432,4433,5,101,0,0,4433,4434,5,108,0,0,
+ 4434,4435,5,101,0,0,4435,4494,5,109,0,0,4436,4437,5,115,0,0,4437,4438,
+ 5,116,0,0,4438,4439,5,101,0,0,4439,4440,5,108,0,0,4440,4441,5,101,0,0,
+ 4441,4494,5,109,0,0,4442,4443,5,117,0,0,4443,4444,5,110,0,0,4444,4445,
+ 5,98,0,0,4445,4446,5,111,0,0,4446,4447,5,120,0,0,4447,4448,5,46,0,0,4448,
+ 4449,5,97,0,0,4449,4450,5,110,0,0,4450,4494,5,121,0,0,4451,4452,5,114,
+ 0,0,4452,4453,5,101,0,0,4453,4454,5,102,0,0,4454,4455,5,97,0,0,4455,4456,
+ 5,110,0,0,4456,4457,5,121,0,0,4457,4458,5,118,0,0,4458,4459,5,97,0,0,4459,
+ 4494,5,108,0,0,4460,4461,5,109,0,0,4461,4462,5,107,0,0,4462,4463,5,114,
+ 0,0,4463,4464,5,101,0,0,4464,4465,5,102,0,0,4465,4466,5,97,0,0,4466,4467,
+ 5,110,0,0,4467,4494,5,121,0,0,4468,4469,5,105,0,0,4469,4470,5,110,0,0,
+ 4470,4471,5,105,0,0,4471,4472,5,116,0,0,4472,4473,5,111,0,0,4473,4474,
+ 5,98,0,0,4474,4494,5,106,0,0,4475,4476,5,99,0,0,4476,4477,5,111,0,0,4477,
+ 4478,5,110,0,0,4478,4479,5,115,0,0,4479,4480,5,116,0,0,4480,4481,5,114,
+ 0,0,4481,4482,5,97,0,0,4482,4483,5,105,0,0,4483,4484,5,110,0,0,4484,4485,
+ 5,101,0,0,4485,4486,5,100,0,0,4486,4494,5,46,0,0,4487,4488,5,115,0,0,4488,
+ 4489,5,105,0,0,4489,4490,5,122,0,0,4490,4491,5,101,0,0,4491,4492,5,111,
+ 0,0,4492,4494,5,102,0,0,4493,4379,1,0,0,0,4493,4384,1,0,0,0,4493,4389,
+ 1,0,0,0,4493,4398,1,0,0,0,4493,4404,1,0,0,0,4493,4409,1,0,0,0,4493,4414,
+ 1,0,0,0,4493,4417,1,0,0,0,4493,4423,1,0,0,0,4493,4430,1,0,0,0,4493,4436,
+ 1,0,0,0,4493,4442,1,0,0,0,4493,4451,1,0,0,0,4493,4460,1,0,0,0,4493,4468,
+ 1,0,0,0,4493,4475,1,0,0,0,4493,4487,1,0,0,0,4494,570,1,0,0,0,4495,4496,
+ 5,108,0,0,4496,4497,5,100,0,0,4497,4498,5,115,0,0,4498,4499,5,116,0,0,
+ 4499,4500,5,114,0,0,4500,572,1,0,0,0,4501,4502,5,108,0,0,4502,4503,5,100,
+ 0,0,4503,4504,5,102,0,0,4504,4505,5,108,0,0,4505,4537,5,100,0,0,4506,4507,
+ 5,108,0,0,4507,4508,5,100,0,0,4508,4509,5,102,0,0,4509,4510,5,108,0,0,
+ 4510,4511,5,100,0,0,4511,4537,5,97,0,0,4512,4513,5,115,0,0,4513,4514,5,
+ 116,0,0,4514,4515,5,102,0,0,4515,4516,5,108,0,0,4516,4537,5,100,0,0,4517,
+ 4518,5,108,0,0,4518,4519,5,100,0,0,4519,4520,5,115,0,0,4520,4521,5,102,
+ 0,0,4521,4522,5,108,0,0,4522,4537,5,100,0,0,4523,4524,5,108,0,0,4524,4525,
+ 5,100,0,0,4525,4526,5,115,0,0,4526,4527,5,102,0,0,4527,4528,5,108,0,0,
+ 4528,4529,5,100,0,0,4529,4537,5,97,0,0,4530,4531,5,115,0,0,4531,4532,5,
+ 116,0,0,4532,4533,5,115,0,0,4533,4534,5,102,0,0,4534,4535,5,108,0,0,4535,
+ 4537,5,100,0,0,4536,4501,1,0,0,0,4536,4506,1,0,0,0,4536,4512,1,0,0,0,4536,
+ 4517,1,0,0,0,4536,4523,1,0,0,0,4536,4530,1,0,0,0,4537,574,1,0,0,0,4538,
+ 4539,5,108,0,0,4539,4540,5,100,0,0,4540,4541,5,116,0,0,4541,4542,5,111,
+ 0,0,4542,4543,5,107,0,0,4543,4544,5,101,0,0,4544,4545,5,110,0,0,4545,576,
+ 1,0,0,0,4546,4547,7,8,0,0,4547,578,1,0,0,0,4548,4549,7,9,0,0,4549,580,
+ 1,0,0,0,4550,4551,3,583,291,0,4551,4552,3,531,265,0,4552,4554,1,0,0,0,
+ 4553,4550,1,0,0,0,4554,4555,1,0,0,0,4555,4553,1,0,0,0,4555,4556,1,0,0,
+ 0,4556,4557,1,0,0,0,4557,4558,3,583,291,0,4558,582,1,0,0,0,4559,4563,3,
+ 577,288,0,4560,4562,3,579,289,0,4561,4560,1,0,0,0,4562,4565,1,0,0,0,4563,
+ 4561,1,0,0,0,4563,4564,1,0,0,0,4564,584,1,0,0,0,4565,4563,1,0,0,0,4566,
+ 4567,7,0,0,0,4567,4568,7,0,0,0,4568,586,1,0,0,0,4569,4570,7,10,0,0,4570,
+ 4571,1,0,0,0,4571,4572,6,293,0,0,4572,588,1,0,0,0,4573,4574,5,47,0,0,4574,
+ 4575,5,47,0,0,4575,4579,1,0,0,0,4576,4578,8,11,0,0,4577,4576,1,0,0,0,4578,
+ 4581,1,0,0,0,4579,4577,1,0,0,0,4579,4580,1,0,0,0,4580,4582,1,0,0,0,4581,
+ 4579,1,0,0,0,4582,4583,6,294,0,0,4583,590,1,0,0,0,4584,4585,5,47,0,0,4585,
+ 4586,5,42,0,0,4586,4590,1,0,0,0,4587,4589,9,0,0,0,4588,4587,1,0,0,0,4589,
+ 4592,1,0,0,0,4590,4591,1,0,0,0,4590,4588,1,0,0,0,4591,4593,1,0,0,0,4592,
+ 4590,1,0,0,0,4593,4594,5,42,0,0,4594,4595,5,47,0,0,4595,4596,1,0,0,0,4596,
+ 4597,6,295,0,0,4597,592,1,0,0,0,4598,4599,5,46,0,0,4599,4600,5,112,0,0,
+ 4600,4601,5,101,0,0,4601,4602,5,114,0,0,4602,4603,5,109,0,0,4603,4604,
+ 5,105,0,0,4604,4605,5,115,0,0,4605,4606,5,115,0,0,4606,4607,5,105,0,0,
+ 4607,4608,5,111,0,0,4608,4609,5,110,0,0,4609,594,1,0,0,0,4610,4611,5,46,
+ 0,0,4611,4612,5,112,0,0,4612,4613,5,101,0,0,4613,4614,5,114,0,0,4614,4615,
+ 5,109,0,0,4615,4616,5,105,0,0,4616,4617,5,115,0,0,4617,4618,5,115,0,0,
+ 4618,4619,5,105,0,0,4619,4620,5,111,0,0,4620,4621,5,110,0,0,4621,4622,
+ 5,115,0,0,4622,4623,5,101,0,0,4623,4624,5,116,0,0,4624,596,1,0,0,0,4625,
+ 4626,5,46,0,0,4626,4627,5,101,0,0,4627,4628,5,109,0,0,4628,4629,5,105,
+ 0,0,4629,4630,5,116,0,0,4630,4631,5,98,0,0,4631,4632,5,121,0,0,4632,4633,
+ 5,116,0,0,4633,4634,5,101,0,0,4634,598,1,0,0,0,4635,4636,5,46,0,0,4636,
+ 4637,5,109,0,0,4637,4638,5,97,0,0,4638,4639,5,120,0,0,4639,4640,5,115,
+ 0,0,4640,4641,5,116,0,0,4641,4642,5,97,0,0,4642,4643,5,99,0,0,4643,4644,
+ 5,107,0,0,4644,600,1,0,0,0,4645,4646,5,46,0,0,4646,4647,5,101,0,0,4647,
+ 4648,5,110,0,0,4648,4649,5,116,0,0,4649,4650,5,114,0,0,4650,4651,5,121,
+ 0,0,4651,4652,5,112,0,0,4652,4653,5,111,0,0,4653,4654,5,105,0,0,4654,4655,
+ 5,110,0,0,4655,4656,5,116,0,0,4656,602,1,0,0,0,4657,4658,5,46,0,0,4658,
+ 4659,5,122,0,0,4659,4660,5,101,0,0,4660,4661,5,114,0,0,4661,4662,5,111,
+ 0,0,4662,4663,5,105,0,0,4663,4664,5,110,0,0,4664,4665,5,105,0,0,4665,4666,
+ 5,116,0,0,4666,604,1,0,0,0,4667,4668,5,46,0,0,4668,4669,5,108,0,0,4669,
+ 4670,5,111,0,0,4670,4671,5,99,0,0,4671,4672,5,97,0,0,4672,4673,5,108,0,
+ 0,4673,4674,5,115,0,0,4674,606,1,0,0,0,4675,4676,5,46,0,0,4676,4677,5,
+ 101,0,0,4677,4678,5,120,0,0,4678,4679,5,112,0,0,4679,4680,5,111,0,0,4680,
+ 4681,5,114,0,0,4681,4682,5,116,0,0,4682,608,1,0,0,0,4683,4684,5,46,0,0,
+ 4684,4685,5,111,0,0,4685,4686,5,118,0,0,4686,4687,5,101,0,0,4687,4688,
+ 5,114,0,0,4688,4689,5,114,0,0,4689,4690,5,105,0,0,4690,4691,5,100,0,0,
+ 4691,4692,5,101,0,0,4692,610,1,0,0,0,4693,4694,5,46,0,0,4694,4695,5,118,
+ 0,0,4695,4696,5,116,0,0,4696,4697,5,101,0,0,4697,4698,5,110,0,0,4698,4699,
+ 5,116,0,0,4699,4700,5,114,0,0,4700,4701,5,121,0,0,4701,612,1,0,0,0,45,
+ 0,2024,2032,2037,2039,2042,2050,2055,2057,2060,2065,2071,2075,2080,2082,
+ 2086,2091,2093,2099,2103,2108,2110,2112,2149,2702,2753,2756,2759,2762,
+ 2767,2769,2777,2779,4039,4117,4146,4167,4204,4370,4493,4536,4555,4563,
+ 4579,4590,1,6,0,0
};
public static readonly ATN _ATN =
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp
index 67afb01bceadcd..06a4df1c8dc33a 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.interp
@@ -15,6 +15,7 @@ null
'aggressiveoptimization'
'async'
'extended'
+'volatile'
'{'
'}'
'.subsystem'
@@ -88,11 +89,11 @@ null
'>'
'/'
'algorithm'
+'unsigned'
'iidparam'
'pinned'
'modreq'
'modopt'
-'unsigned'
'true'
'false'
'request'
@@ -126,7 +127,6 @@ null
'privatescope'
'literal'
'notserialized'
-'volatile'
'.event'
'.addon'
'.removeon'
@@ -166,7 +166,7 @@ null
'handler'
'.data'
'tls'
-'.publicKey'
+'.publickey'
'.ver'
'.locale'
'.publickeytoken'
@@ -203,7 +203,7 @@ null
'enum'
'custom'
'fixed'
-'systring'
+'sysstring'
'array'
'variant'
'currency'
@@ -924,4 +924,4 @@ mode names:
DEFAULT_MODE
atn:
-[4, 0, 302, 4695, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 3, 171, 2025, 8, 171, 1, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2031, 8, 171, 11, 171, 12, 171, 2032, 1, 171, 4, 171, 2036, 8, 171, 11, 171, 12, 171, 2037, 3, 171, 2040, 8, 171, 1, 172, 3, 172, 2043, 8, 172, 1, 172, 1, 172, 1, 172, 1, 172, 4, 172, 2049, 8, 172, 11, 172, 12, 172, 2050, 1, 172, 4, 172, 2054, 8, 172, 11, 172, 12, 172, 2055, 3, 172, 2058, 8, 172, 1, 173, 3, 173, 2061, 8, 173, 1, 173, 4, 173, 2064, 8, 173, 11, 173, 12, 173, 2065, 1, 173, 1, 173, 4, 173, 2070, 8, 173, 11, 173, 12, 173, 2071, 1, 173, 1, 173, 3, 173, 2076, 8, 173, 1, 173, 4, 173, 2079, 8, 173, 11, 173, 12, 173, 2080, 3, 173, 2083, 8, 173, 1, 173, 1, 173, 3, 173, 2087, 8, 173, 1, 173, 4, 173, 2090, 8, 173, 11, 173, 12, 173, 2091, 3, 173, 2094, 8, 173, 1, 173, 1, 173, 4, 173, 2098, 8, 173, 11, 173, 12, 173, 2099, 1, 173, 1, 173, 3, 173, 2104, 8, 173, 1, 173, 4, 173, 2107, 8, 173, 11, 173, 12, 173, 2108, 3, 173, 2111, 8, 173, 3, 173, 2113, 8, 173, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 3, 179, 2150, 8, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 3, 253, 2702, 8, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 3, 262, 2753, 8, 262, 1, 262, 3, 262, 2756, 8, 262, 1, 262, 3, 262, 2759, 8, 262, 1, 262, 3, 262, 2762, 8, 262, 1, 263, 1, 263, 1, 263, 5, 263, 2767, 8, 263, 10, 263, 12, 263, 2770, 9, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 5, 264, 2777, 8, 264, 10, 264, 12, 264, 2780, 9, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 3, 275, 4033, 8, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 3, 276, 4111, 8, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 3, 277, 4140, 8, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 3, 279, 4161, 8, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 3, 280, 4198, 8, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 3, 282, 4364, 8, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 3, 284, 4487, 8, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 3, 286, 4530, 8, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 4, 290, 4547, 8, 290, 11, 290, 12, 290, 4548, 1, 290, 1, 290, 1, 291, 1, 291, 5, 291, 4555, 8, 291, 10, 291, 12, 291, 4558, 9, 291, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 5, 294, 4571, 8, 294, 10, 294, 12, 294, 4574, 9, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 5, 295, 4582, 8, 295, 10, 295, 12, 295, 4585, 9, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 4583, 0, 306, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 0, 379, 189, 381, 190, 383, 191, 385, 192, 387, 193, 389, 194, 391, 195, 393, 196, 395, 197, 397, 198, 399, 199, 401, 200, 403, 201, 405, 202, 407, 203, 409, 204, 411, 205, 413, 206, 415, 207, 417, 208, 419, 209, 421, 210, 423, 211, 425, 212, 427, 213, 429, 214, 431, 215, 433, 216, 435, 217, 437, 218, 439, 219, 441, 220, 443, 221, 445, 222, 447, 223, 449, 224, 451, 225, 453, 226, 455, 227, 457, 228, 459, 229, 461, 230, 463, 231, 465, 232, 467, 233, 469, 234, 471, 235, 473, 236, 475, 237, 477, 238, 479, 239, 481, 240, 483, 241, 485, 242, 487, 243, 489, 244, 491, 245, 493, 246, 495, 247, 497, 248, 499, 249, 501, 250, 503, 251, 505, 252, 507, 253, 509, 254, 511, 255, 513, 256, 515, 257, 517, 258, 519, 259, 521, 260, 523, 261, 525, 0, 527, 262, 529, 263, 531, 264, 533, 265, 535, 266, 537, 267, 539, 268, 541, 269, 543, 270, 545, 271, 547, 272, 549, 273, 551, 274, 553, 275, 555, 276, 557, 277, 559, 278, 561, 279, 563, 280, 565, 281, 567, 282, 569, 283, 571, 284, 573, 285, 575, 286, 577, 0, 579, 0, 581, 287, 583, 288, 585, 289, 587, 290, 589, 291, 591, 292, 593, 293, 595, 294, 597, 295, 599, 296, 601, 297, 603, 298, 605, 299, 607, 300, 609, 301, 611, 302, 1, 0, 12, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 11, 0, 34, 34, 39, 39, 47, 48, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 1, 0, 48, 55, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 4, 0, 35, 36, 63, 90, 95, 95, 97, 122, 4, 0, 35, 36, 48, 57, 63, 90, 95, 122, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 4947, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 379, 1, 0, 0, 0, 0, 381, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 385, 1, 0, 0, 0, 0, 387, 1, 0, 0, 0, 0, 389, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 397, 1, 0, 0, 0, 0, 399, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 405, 1, 0, 0, 0, 0, 407, 1, 0, 0, 0, 0, 409, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 511, 1, 0, 0, 0, 0, 513, 1, 0, 0, 0, 0, 515, 1, 0, 0, 0, 0, 517, 1, 0, 0, 0, 0, 519, 1, 0, 0, 0, 0, 521, 1, 0, 0, 0, 0, 523, 1, 0, 0, 0, 0, 527, 1, 0, 0, 0, 0, 529, 1, 0, 0, 0, 0, 531, 1, 0, 0, 0, 0, 533, 1, 0, 0, 0, 0, 535, 1, 0, 0, 0, 0, 537, 1, 0, 0, 0, 0, 539, 1, 0, 0, 0, 0, 541, 1, 0, 0, 0, 0, 543, 1, 0, 0, 0, 0, 545, 1, 0, 0, 0, 0, 547, 1, 0, 0, 0, 0, 549, 1, 0, 0, 0, 0, 551, 1, 0, 0, 0, 0, 553, 1, 0, 0, 0, 0, 555, 1, 0, 0, 0, 0, 557, 1, 0, 0, 0, 0, 559, 1, 0, 0, 0, 0, 561, 1, 0, 0, 0, 0, 563, 1, 0, 0, 0, 0, 565, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 0, 575, 1, 0, 0, 0, 0, 581, 1, 0, 0, 0, 0, 583, 1, 0, 0, 0, 0, 585, 1, 0, 0, 0, 0, 587, 1, 0, 0, 0, 0, 589, 1, 0, 0, 0, 0, 591, 1, 0, 0, 0, 0, 593, 1, 0, 0, 0, 0, 595, 1, 0, 0, 0, 0, 597, 1, 0, 0, 0, 0, 599, 1, 0, 0, 0, 0, 601, 1, 0, 0, 0, 0, 603, 1, 0, 0, 0, 0, 605, 1, 0, 0, 0, 0, 607, 1, 0, 0, 0, 0, 609, 1, 0, 0, 0, 0, 611, 1, 0, 0, 0, 1, 613, 1, 0, 0, 0, 3, 620, 1, 0, 0, 0, 5, 624, 1, 0, 0, 0, 7, 630, 1, 0, 0, 0, 9, 638, 1, 0, 0, 0, 11, 649, 1, 0, 0, 0, 13, 661, 1, 0, 0, 0, 15, 669, 1, 0, 0, 0, 17, 682, 1, 0, 0, 0, 19, 695, 1, 0, 0, 0, 21, 706, 1, 0, 0, 0, 23, 725, 1, 0, 0, 0, 25, 740, 1, 0, 0, 0, 27, 763, 1, 0, 0, 0, 29, 769, 1, 0, 0, 0, 31, 778, 1, 0, 0, 0, 33, 780, 1, 0, 0, 0, 35, 782, 1, 0, 0, 0, 37, 793, 1, 0, 0, 0, 39, 803, 1, 0, 0, 0, 41, 809, 1, 0, 0, 0, 43, 819, 1, 0, 0, 0, 45, 830, 1, 0, 0, 0, 47, 844, 1, 0, 0, 0, 49, 854, 1, 0, 0, 0, 51, 864, 1, 0, 0, 0, 53, 874, 1, 0, 0, 0, 55, 876, 1, 0, 0, 0, 57, 886, 1, 0, 0, 0, 59, 888, 1, 0, 0, 0, 61, 890, 1, 0, 0, 0, 63, 892, 1, 0, 0, 0, 65, 901, 1, 0, 0, 0, 67, 904, 1, 0, 0, 0, 69, 912, 1, 0, 0, 0, 71, 914, 1, 0, 0, 0, 73, 920, 1, 0, 0, 0, 75, 929, 1, 0, 0, 0, 77, 935, 1, 0, 0, 0, 79, 942, 1, 0, 0, 0, 81, 951, 1, 0, 0, 0, 83, 953, 1, 0, 0, 0, 85, 955, 1, 0, 0, 0, 87, 958, 1, 0, 0, 0, 89, 972, 1, 0, 0, 0, 91, 988, 1, 0, 0, 0, 93, 1004, 1, 0, 0, 0, 95, 1012, 1, 0, 0, 0, 97, 1023, 1, 0, 0, 0, 99, 1030, 1, 0, 0, 0, 101, 1037, 1, 0, 0, 0, 103, 1045, 1, 0, 0, 0, 105, 1052, 1, 0, 0, 0, 107, 1061, 1, 0, 0, 0, 109, 1066, 1, 0, 0, 0, 111, 1077, 1, 0, 0, 0, 113, 1085, 1, 0, 0, 0, 115, 1094, 1, 0, 0, 0, 117, 1101, 1, 0, 0, 0, 119, 1114, 1, 0, 0, 0, 121, 1129, 1, 0, 0, 0, 123, 1136, 1, 0, 0, 0, 125, 1143, 1, 0, 0, 0, 127, 1152, 1, 0, 0, 0, 129, 1164, 1, 0, 0, 0, 131, 1175, 1, 0, 0, 0, 133, 1191, 1, 0, 0, 0, 135, 1203, 1, 0, 0, 0, 137, 1217, 1, 0, 0, 0, 139, 1223, 1, 0, 0, 0, 141, 1231, 1, 0, 0, 0, 143, 1242, 1, 0, 0, 0, 145, 1248, 1, 0, 0, 0, 147, 1254, 1, 0, 0, 0, 149, 1256, 1, 0, 0, 0, 151, 1267, 1, 0, 0, 0, 153, 1280, 1, 0, 0, 0, 155, 1291, 1, 0, 0, 0, 157, 1306, 1, 0, 0, 0, 159, 1310, 1, 0, 0, 0, 161, 1316, 1, 0, 0, 0, 163, 1320, 1, 0, 0, 0, 165, 1326, 1, 0, 0, 0, 167, 1336, 1, 0, 0, 0, 169, 1339, 1, 0, 0, 0, 171, 1341, 1, 0, 0, 0, 173, 1343, 1, 0, 0, 0, 175, 1345, 1, 0, 0, 0, 177, 1355, 1, 0, 0, 0, 179, 1364, 1, 0, 0, 0, 181, 1371, 1, 0, 0, 0, 183, 1378, 1, 0, 0, 0, 185, 1385, 1, 0, 0, 0, 187, 1394, 1, 0, 0, 0, 189, 1399, 1, 0, 0, 0, 191, 1405, 1, 0, 0, 0, 193, 1413, 1, 0, 0, 0, 195, 1420, 1, 0, 0, 0, 197, 1427, 1, 0, 0, 0, 199, 1432, 1, 0, 0, 0, 201, 1443, 1, 0, 0, 0, 203, 1453, 1, 0, 0, 0, 205, 1466, 1, 0, 0, 0, 207, 1473, 1, 0, 0, 0, 209, 1480, 1, 0, 0, 0, 211, 1490, 1, 0, 0, 0, 213, 1502, 1, 0, 0, 0, 215, 1513, 1, 0, 0, 0, 217, 1526, 1, 0, 0, 0, 219, 1543, 1, 0, 0, 0, 221, 1561, 1, 0, 0, 0, 223, 1570, 1, 0, 0, 0, 225, 1578, 1, 0, 0, 0, 227, 1580, 1, 0, 0, 0, 229, 1590, 1, 0, 0, 0, 231, 1596, 1, 0, 0, 0, 233, 1602, 1, 0, 0, 0, 235, 1608, 1, 0, 0, 0, 237, 1613, 1, 0, 0, 0, 239, 1628, 1, 0, 0, 0, 241, 1635, 1, 0, 0, 0, 243, 1643, 1, 0, 0, 0, 245, 1650, 1, 0, 0, 0, 247, 1659, 1, 0, 0, 0, 249, 1672, 1, 0, 0, 0, 251, 1680, 1, 0, 0, 0, 253, 1694, 1, 0, 0, 0, 255, 1703, 1, 0, 0, 0, 257, 1710, 1, 0, 0, 0, 259, 1717, 1, 0, 0, 0, 261, 1727, 1, 0, 0, 0, 263, 1733, 1, 0, 0, 0, 265, 1740, 1, 0, 0, 0, 267, 1750, 1, 0, 0, 0, 269, 1755, 1, 0, 0, 0, 271, 1760, 1, 0, 0, 0, 273, 1763, 1, 0, 0, 0, 275, 1767, 1, 0, 0, 0, 277, 1771, 1, 0, 0, 0, 279, 1779, 1, 0, 0, 0, 281, 1785, 1, 0, 0, 0, 283, 1793, 1, 0, 0, 0, 285, 1800, 1, 0, 0, 0, 287, 1810, 1, 0, 0, 0, 289, 1818, 1, 0, 0, 0, 291, 1831, 1, 0, 0, 0, 293, 1841, 1, 0, 0, 0, 295, 1853, 1, 0, 0, 0, 297, 1862, 1, 0, 0, 0, 299, 1870, 1, 0, 0, 0, 301, 1877, 1, 0, 0, 0, 303, 1885, 1, 0, 0, 0, 305, 1888, 1, 0, 0, 0, 307, 1892, 1, 0, 0, 0, 309, 1905, 1, 0, 0, 0, 311, 1912, 1, 0, 0, 0, 313, 1915, 1, 0, 0, 0, 315, 1920, 1, 0, 0, 0, 317, 1925, 1, 0, 0, 0, 319, 1928, 1, 0, 0, 0, 321, 1935, 1, 0, 0, 0, 323, 1941, 1, 0, 0, 0, 325, 1949, 1, 0, 0, 0, 327, 1955, 1, 0, 0, 0, 329, 1963, 1, 0, 0, 0, 331, 1969, 1, 0, 0, 0, 333, 1973, 1, 0, 0, 0, 335, 1984, 1, 0, 0, 0, 337, 1989, 1, 0, 0, 0, 339, 1997, 1, 0, 0, 0, 341, 2013, 1, 0, 0, 0, 343, 2024, 1, 0, 0, 0, 345, 2042, 1, 0, 0, 0, 347, 2060, 1, 0, 0, 0, 349, 2114, 1, 0, 0, 0, 351, 2117, 1, 0, 0, 0, 353, 2121, 1, 0, 0, 0, 355, 2126, 1, 0, 0, 0, 357, 2134, 1, 0, 0, 0, 359, 2149, 1, 0, 0, 0, 361, 2151, 1, 0, 0, 0, 363, 2158, 1, 0, 0, 0, 365, 2163, 1, 0, 0, 0, 367, 2168, 1, 0, 0, 0, 369, 2174, 1, 0, 0, 0, 371, 2180, 1, 0, 0, 0, 373, 2186, 1, 0, 0, 0, 375, 2194, 1, 0, 0, 0, 377, 2202, 1, 0, 0, 0, 379, 2211, 1, 0, 0, 0, 381, 2217, 1, 0, 0, 0, 383, 2224, 1, 0, 0, 0, 385, 2231, 1, 0, 0, 0, 387, 2238, 1, 0, 0, 0, 389, 2242, 1, 0, 0, 0, 391, 2247, 1, 0, 0, 0, 393, 2252, 1, 0, 0, 0, 395, 2259, 1, 0, 0, 0, 397, 2267, 1, 0, 0, 0, 399, 2273, 1, 0, 0, 0, 401, 2283, 1, 0, 0, 0, 403, 2288, 1, 0, 0, 0, 405, 2293, 1, 0, 0, 0, 407, 2300, 1, 0, 0, 0, 409, 2306, 1, 0, 0, 0, 411, 2315, 1, 0, 0, 0, 413, 2321, 1, 0, 0, 0, 415, 2329, 1, 0, 0, 0, 417, 2338, 1, 0, 0, 0, 419, 2346, 1, 0, 0, 0, 421, 2352, 1, 0, 0, 0, 423, 2360, 1, 0, 0, 0, 425, 2365, 1, 0, 0, 0, 427, 2370, 1, 0, 0, 0, 429, 2376, 1, 0, 0, 0, 431, 2383, 1, 0, 0, 0, 433, 2390, 1, 0, 0, 0, 435, 2400, 1, 0, 0, 0, 437, 2409, 1, 0, 0, 0, 439, 2419, 1, 0, 0, 0, 441, 2426, 1, 0, 0, 0, 443, 2436, 1, 0, 0, 0, 445, 2446, 1, 0, 0, 0, 447, 2455, 1, 0, 0, 0, 449, 2460, 1, 0, 0, 0, 451, 2466, 1, 0, 0, 0, 453, 2473, 1, 0, 0, 0, 455, 2477, 1, 0, 0, 0, 457, 2486, 1, 0, 0, 0, 459, 2493, 1, 0, 0, 0, 461, 2501, 1, 0, 0, 0, 463, 2508, 1, 0, 0, 0, 465, 2520, 1, 0, 0, 0, 467, 2527, 1, 0, 0, 0, 469, 2536, 1, 0, 0, 0, 471, 2541, 1, 0, 0, 0, 473, 2548, 1, 0, 0, 0, 475, 2556, 1, 0, 0, 0, 477, 2572, 1, 0, 0, 0, 479, 2586, 1, 0, 0, 0, 481, 2598, 1, 0, 0, 0, 483, 2601, 1, 0, 0, 0, 485, 2607, 1, 0, 0, 0, 487, 2616, 1, 0, 0, 0, 489, 2625, 1, 0, 0, 0, 491, 2633, 1, 0, 0, 0, 493, 2640, 1, 0, 0, 0, 495, 2650, 1, 0, 0, 0, 497, 2656, 1, 0, 0, 0, 499, 2664, 1, 0, 0, 0, 501, 2673, 1, 0, 0, 0, 503, 2682, 1, 0, 0, 0, 505, 2684, 1, 0, 0, 0, 507, 2701, 1, 0, 0, 0, 509, 2703, 1, 0, 0, 0, 511, 2710, 1, 0, 0, 0, 513, 2721, 1, 0, 0, 0, 515, 2727, 1, 0, 0, 0, 517, 2733, 1, 0, 0, 0, 519, 2741, 1, 0, 0, 0, 521, 2743, 1, 0, 0, 0, 523, 2746, 1, 0, 0, 0, 525, 2748, 1, 0, 0, 0, 527, 2763, 1, 0, 0, 0, 529, 2773, 1, 0, 0, 0, 531, 2783, 1, 0, 0, 0, 533, 2785, 1, 0, 0, 0, 535, 2787, 1, 0, 0, 0, 537, 2795, 1, 0, 0, 0, 539, 2802, 1, 0, 0, 0, 541, 2809, 1, 0, 0, 0, 543, 2817, 1, 0, 0, 0, 545, 2823, 1, 0, 0, 0, 547, 2830, 1, 0, 0, 0, 549, 2839, 1, 0, 0, 0, 551, 4032, 1, 0, 0, 0, 553, 4110, 1, 0, 0, 0, 555, 4139, 1, 0, 0, 0, 557, 4141, 1, 0, 0, 0, 559, 4160, 1, 0, 0, 0, 561, 4197, 1, 0, 0, 0, 563, 4199, 1, 0, 0, 0, 565, 4363, 1, 0, 0, 0, 567, 4365, 1, 0, 0, 0, 569, 4486, 1, 0, 0, 0, 571, 4488, 1, 0, 0, 0, 573, 4529, 1, 0, 0, 0, 575, 4531, 1, 0, 0, 0, 577, 4539, 1, 0, 0, 0, 579, 4541, 1, 0, 0, 0, 581, 4546, 1, 0, 0, 0, 583, 4552, 1, 0, 0, 0, 585, 4559, 1, 0, 0, 0, 587, 4562, 1, 0, 0, 0, 589, 4566, 1, 0, 0, 0, 591, 4577, 1, 0, 0, 0, 593, 4591, 1, 0, 0, 0, 595, 4603, 1, 0, 0, 0, 597, 4618, 1, 0, 0, 0, 599, 4628, 1, 0, 0, 0, 601, 4638, 1, 0, 0, 0, 603, 4650, 1, 0, 0, 0, 605, 4660, 1, 0, 0, 0, 607, 4668, 1, 0, 0, 0, 609, 4676, 1, 0, 0, 0, 611, 4686, 1, 0, 0, 0, 613, 614, 5, 110, 0, 0, 614, 615, 5, 97, 0, 0, 615, 616, 5, 116, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 118, 0, 0, 618, 619, 5, 101, 0, 0, 619, 2, 1, 0, 0, 0, 620, 621, 5, 99, 0, 0, 621, 622, 5, 105, 0, 0, 622, 623, 5, 108, 0, 0, 623, 4, 1, 0, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 112, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 108, 0, 0, 629, 6, 1, 0, 0, 0, 630, 631, 5, 109, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 101, 0, 0, 636, 637, 5, 100, 0, 0, 637, 8, 1, 0, 0, 0, 638, 639, 5, 102, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 114, 0, 0, 641, 642, 5, 119, 0, 0, 642, 643, 5, 97, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 100, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 102, 0, 0, 648, 10, 1, 0, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 115, 0, 0, 653, 654, 5, 101, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 118, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 103, 0, 0, 660, 12, 1, 0, 0, 0, 661, 662, 5, 114, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 110, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 109, 0, 0, 667, 668, 5, 101, 0, 0, 668, 14, 1, 0, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 110, 0, 0, 671, 672, 5, 116, 0, 0, 672, 673, 5, 101, 0, 0, 673, 674, 5, 114, 0, 0, 674, 675, 5, 110, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 108, 0, 0, 677, 678, 5, 99, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 108, 0, 0, 680, 681, 5, 108, 0, 0, 681, 16, 1, 0, 0, 0, 682, 683, 5, 115, 0, 0, 683, 684, 5, 121, 0, 0, 684, 685, 5, 110, 0, 0, 685, 686, 5, 99, 0, 0, 686, 687, 5, 104, 0, 0, 687, 688, 5, 114, 0, 0, 688, 689, 5, 111, 0, 0, 689, 690, 5, 110, 0, 0, 690, 691, 5, 105, 0, 0, 691, 692, 5, 122, 0, 0, 692, 693, 5, 101, 0, 0, 693, 694, 5, 100, 0, 0, 694, 18, 1, 0, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 111, 0, 0, 697, 698, 5, 105, 0, 0, 698, 699, 5, 110, 0, 0, 699, 700, 5, 108, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 110, 0, 0, 702, 703, 5, 105, 0, 0, 703, 704, 5, 110, 0, 0, 704, 705, 5, 103, 0, 0, 705, 20, 1, 0, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 103, 0, 0, 708, 709, 5, 103, 0, 0, 709, 710, 5, 114, 0, 0, 710, 711, 5, 101, 0, 0, 711, 712, 5, 115, 0, 0, 712, 713, 5, 115, 0, 0, 713, 714, 5, 105, 0, 0, 714, 715, 5, 118, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 105, 0, 0, 717, 718, 5, 110, 0, 0, 718, 719, 5, 108, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 110, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 110, 0, 0, 723, 724, 5, 103, 0, 0, 724, 22, 1, 0, 0, 0, 725, 726, 5, 110, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 112, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 109, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 122, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 105, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 110, 0, 0, 739, 24, 1, 0, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 103, 0, 0, 742, 743, 5, 103, 0, 0, 743, 744, 5, 114, 0, 0, 744, 745, 5, 101, 0, 0, 745, 746, 5, 115, 0, 0, 746, 747, 5, 115, 0, 0, 747, 748, 5, 105, 0, 0, 748, 749, 5, 118, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 111, 0, 0, 751, 752, 5, 112, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 109, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 122, 0, 0, 757, 758, 5, 97, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 105, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 110, 0, 0, 762, 26, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 766, 5, 121, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 99, 0, 0, 768, 28, 1, 0, 0, 0, 769, 770, 5, 101, 0, 0, 770, 771, 5, 120, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 101, 0, 0, 773, 774, 5, 110, 0, 0, 774, 775, 5, 100, 0, 0, 775, 776, 5, 101, 0, 0, 776, 777, 5, 100, 0, 0, 777, 30, 1, 0, 0, 0, 778, 779, 5, 123, 0, 0, 779, 32, 1, 0, 0, 0, 780, 781, 5, 125, 0, 0, 781, 34, 1, 0, 0, 0, 782, 783, 5, 46, 0, 0, 783, 784, 5, 115, 0, 0, 784, 785, 5, 117, 0, 0, 785, 786, 5, 98, 0, 0, 786, 787, 5, 115, 0, 0, 787, 788, 5, 121, 0, 0, 788, 789, 5, 115, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 101, 0, 0, 791, 792, 5, 109, 0, 0, 792, 36, 1, 0, 0, 0, 793, 794, 5, 46, 0, 0, 794, 795, 5, 99, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 114, 0, 0, 797, 798, 5, 102, 0, 0, 798, 799, 5, 108, 0, 0, 799, 800, 5, 97, 0, 0, 800, 801, 5, 103, 0, 0, 801, 802, 5, 115, 0, 0, 802, 38, 1, 0, 0, 0, 803, 804, 5, 46, 0, 0, 804, 805, 5, 102, 0, 0, 805, 806, 5, 105, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 101, 0, 0, 808, 40, 1, 0, 0, 0, 809, 810, 5, 97, 0, 0, 810, 811, 5, 108, 0, 0, 811, 812, 5, 105, 0, 0, 812, 813, 5, 103, 0, 0, 813, 814, 5, 110, 0, 0, 814, 815, 5, 109, 0, 0, 815, 816, 5, 101, 0, 0, 816, 817, 5, 110, 0, 0, 817, 818, 5, 116, 0, 0, 818, 42, 1, 0, 0, 0, 819, 820, 5, 46, 0, 0, 820, 821, 5, 105, 0, 0, 821, 822, 5, 109, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 103, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 98, 0, 0, 826, 827, 5, 97, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 101, 0, 0, 829, 44, 1, 0, 0, 0, 830, 831, 5, 46, 0, 0, 831, 832, 5, 115, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 97, 0, 0, 834, 835, 5, 99, 0, 0, 835, 836, 5, 107, 0, 0, 836, 837, 5, 114, 0, 0, 837, 838, 5, 101, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 101, 0, 0, 840, 841, 5, 114, 0, 0, 841, 842, 5, 118, 0, 0, 842, 843, 5, 101, 0, 0, 843, 46, 1, 0, 0, 0, 844, 845, 5, 46, 0, 0, 845, 846, 5, 97, 0, 0, 846, 847, 5, 115, 0, 0, 847, 848, 5, 115, 0, 0, 848, 849, 5, 101, 0, 0, 849, 850, 5, 109, 0, 0, 850, 851, 5, 98, 0, 0, 851, 852, 5, 108, 0, 0, 852, 853, 5, 121, 0, 0, 853, 48, 1, 0, 0, 0, 854, 855, 5, 46, 0, 0, 855, 856, 5, 109, 0, 0, 856, 857, 5, 115, 0, 0, 857, 858, 5, 99, 0, 0, 858, 859, 5, 111, 0, 0, 859, 860, 5, 114, 0, 0, 860, 861, 5, 108, 0, 0, 861, 862, 5, 105, 0, 0, 862, 863, 5, 98, 0, 0, 863, 50, 1, 0, 0, 0, 864, 865, 5, 46, 0, 0, 865, 866, 5, 108, 0, 0, 866, 867, 5, 97, 0, 0, 867, 868, 5, 110, 0, 0, 868, 869, 5, 103, 0, 0, 869, 870, 5, 117, 0, 0, 870, 871, 5, 97, 0, 0, 871, 872, 5, 103, 0, 0, 872, 873, 5, 101, 0, 0, 873, 52, 1, 0, 0, 0, 874, 875, 5, 44, 0, 0, 875, 54, 1, 0, 0, 0, 876, 877, 5, 46, 0, 0, 877, 878, 5, 116, 0, 0, 878, 879, 5, 121, 0, 0, 879, 880, 5, 112, 0, 0, 880, 881, 5, 101, 0, 0, 881, 882, 5, 108, 0, 0, 882, 883, 5, 105, 0, 0, 883, 884, 5, 115, 0, 0, 884, 885, 5, 116, 0, 0, 885, 56, 1, 0, 0, 0, 886, 887, 5, 40, 0, 0, 887, 58, 1, 0, 0, 0, 888, 889, 5, 41, 0, 0, 889, 60, 1, 0, 0, 0, 890, 891, 5, 59, 0, 0, 891, 62, 1, 0, 0, 0, 892, 893, 5, 46, 0, 0, 893, 894, 5, 116, 0, 0, 894, 895, 5, 121, 0, 0, 895, 896, 5, 112, 0, 0, 896, 897, 5, 101, 0, 0, 897, 898, 5, 100, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 102, 0, 0, 900, 64, 1, 0, 0, 0, 901, 902, 5, 97, 0, 0, 902, 903, 5, 115, 0, 0, 903, 66, 1, 0, 0, 0, 904, 905, 5, 46, 0, 0, 905, 906, 5, 99, 0, 0, 906, 907, 5, 117, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 116, 0, 0, 909, 910, 5, 111, 0, 0, 910, 911, 5, 109, 0, 0, 911, 68, 1, 0, 0, 0, 912, 913, 5, 61, 0, 0, 913, 70, 1, 0, 0, 0, 914, 915, 5, 102, 0, 0, 915, 916, 5, 105, 0, 0, 916, 917, 5, 101, 0, 0, 917, 918, 5, 108, 0, 0, 918, 919, 5, 100, 0, 0, 919, 72, 1, 0, 0, 0, 920, 921, 5, 112, 0, 0, 921, 922, 5, 114, 0, 0, 922, 923, 5, 111, 0, 0, 923, 924, 5, 112, 0, 0, 924, 925, 5, 101, 0, 0, 925, 926, 5, 114, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 121, 0, 0, 928, 74, 1, 0, 0, 0, 929, 930, 5, 99, 0, 0, 930, 931, 5, 108, 0, 0, 931, 932, 5, 97, 0, 0, 932, 933, 5, 115, 0, 0, 933, 934, 5, 115, 0, 0, 934, 76, 1, 0, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 120, 0, 0, 937, 938, 5, 116, 0, 0, 938, 939, 5, 101, 0, 0, 939, 940, 5, 114, 0, 0, 940, 941, 5, 110, 0, 0, 941, 78, 1, 0, 0, 0, 942, 943, 5, 46, 0, 0, 943, 944, 5, 118, 0, 0, 944, 945, 5, 116, 0, 0, 945, 946, 5, 102, 0, 0, 946, 947, 5, 105, 0, 0, 947, 948, 5, 120, 0, 0, 948, 949, 5, 117, 0, 0, 949, 950, 5, 112, 0, 0, 950, 80, 1, 0, 0, 0, 951, 952, 5, 91, 0, 0, 952, 82, 1, 0, 0, 0, 953, 954, 5, 93, 0, 0, 954, 84, 1, 0, 0, 0, 955, 956, 5, 97, 0, 0, 956, 957, 5, 116, 0, 0, 957, 86, 1, 0, 0, 0, 958, 959, 5, 102, 0, 0, 959, 960, 5, 114, 0, 0, 960, 961, 5, 111, 0, 0, 961, 962, 5, 109, 0, 0, 962, 963, 5, 117, 0, 0, 963, 964, 5, 110, 0, 0, 964, 965, 5, 109, 0, 0, 965, 966, 5, 97, 0, 0, 966, 967, 5, 110, 0, 0, 967, 968, 5, 97, 0, 0, 968, 969, 5, 103, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 100, 0, 0, 971, 88, 1, 0, 0, 0, 972, 973, 5, 99, 0, 0, 973, 974, 5, 97, 0, 0, 974, 975, 5, 108, 0, 0, 975, 976, 5, 108, 0, 0, 976, 977, 5, 109, 0, 0, 977, 978, 5, 111, 0, 0, 978, 979, 5, 115, 0, 0, 979, 980, 5, 116, 0, 0, 980, 981, 5, 100, 0, 0, 981, 982, 5, 101, 0, 0, 982, 983, 5, 114, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 118, 0, 0, 985, 986, 5, 101, 0, 0, 986, 987, 5, 100, 0, 0, 987, 90, 1, 0, 0, 0, 988, 989, 5, 114, 0, 0, 989, 990, 5, 101, 0, 0, 990, 991, 5, 116, 0, 0, 991, 992, 5, 97, 0, 0, 992, 993, 5, 105, 0, 0, 993, 994, 5, 110, 0, 0, 994, 995, 5, 97, 0, 0, 995, 996, 5, 112, 0, 0, 996, 997, 5, 112, 0, 0, 997, 998, 5, 100, 0, 0, 998, 999, 5, 111, 0, 0, 999, 1000, 5, 109, 0, 0, 1000, 1001, 5, 97, 0, 0, 1001, 1002, 5, 105, 0, 0, 1002, 1003, 5, 110, 0, 0, 1003, 92, 1, 0, 0, 0, 1004, 1005, 5, 46, 0, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 5, 116, 0, 0, 1007, 1008, 5, 97, 0, 0, 1008, 1009, 5, 98, 0, 0, 1009, 1010, 5, 108, 0, 0, 1010, 1011, 5, 101, 0, 0, 1011, 94, 1, 0, 0, 0, 1012, 1013, 5, 46, 0, 0, 1013, 1014, 5, 110, 0, 0, 1014, 1015, 5, 97, 0, 0, 1015, 1016, 5, 109, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 115, 0, 0, 1018, 1019, 5, 112, 0, 0, 1019, 1020, 5, 97, 0, 0, 1020, 1021, 5, 99, 0, 0, 1021, 1022, 5, 101, 0, 0, 1022, 96, 1, 0, 0, 0, 1023, 1024, 5, 46, 0, 0, 1024, 1025, 5, 99, 0, 0, 1025, 1026, 5, 108, 0, 0, 1026, 1027, 5, 97, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 115, 0, 0, 1029, 98, 1, 0, 0, 0, 1030, 1031, 5, 112, 0, 0, 1031, 1032, 5, 117, 0, 0, 1032, 1033, 5, 98, 0, 0, 1033, 1034, 5, 108, 0, 0, 1034, 1035, 5, 105, 0, 0, 1035, 1036, 5, 99, 0, 0, 1036, 100, 1, 0, 0, 0, 1037, 1038, 5, 112, 0, 0, 1038, 1039, 5, 114, 0, 0, 1039, 1040, 5, 105, 0, 0, 1040, 1041, 5, 118, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 116, 0, 0, 1043, 1044, 5, 101, 0, 0, 1044, 102, 1, 0, 0, 0, 1045, 1046, 5, 115, 0, 0, 1046, 1047, 5, 101, 0, 0, 1047, 1048, 5, 97, 0, 0, 1048, 1049, 5, 108, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 100, 0, 0, 1051, 104, 1, 0, 0, 0, 1052, 1053, 5, 97, 0, 0, 1053, 1054, 5, 98, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 116, 0, 0, 1056, 1057, 5, 114, 0, 0, 1057, 1058, 5, 97, 0, 0, 1058, 1059, 5, 99, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 106, 1, 0, 0, 0, 1061, 1062, 5, 97, 0, 0, 1062, 1063, 5, 117, 0, 0, 1063, 1064, 5, 116, 0, 0, 1064, 1065, 5, 111, 0, 0, 1065, 108, 1, 0, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 1069, 5, 113, 0, 0, 1069, 1070, 5, 117, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 110, 0, 0, 1072, 1073, 5, 116, 0, 0, 1073, 1074, 5, 105, 0, 0, 1074, 1075, 5, 97, 0, 0, 1075, 1076, 5, 108, 0, 0, 1076, 110, 1, 0, 0, 0, 1077, 1078, 5, 117, 0, 0, 1078, 1079, 5, 110, 0, 0, 1079, 1080, 5, 105, 0, 0, 1080, 1081, 5, 99, 0, 0, 1081, 1082, 5, 111, 0, 0, 1082, 1083, 5, 100, 0, 0, 1083, 1084, 5, 101, 0, 0, 1084, 112, 1, 0, 0, 0, 1085, 1086, 5, 97, 0, 0, 1086, 1087, 5, 117, 0, 0, 1087, 1088, 5, 116, 0, 0, 1088, 1089, 5, 111, 0, 0, 1089, 1090, 5, 99, 0, 0, 1090, 1091, 5, 104, 0, 0, 1091, 1092, 5, 97, 0, 0, 1092, 1093, 5, 114, 0, 0, 1093, 114, 1, 0, 0, 0, 1094, 1095, 5, 105, 0, 0, 1095, 1096, 5, 109, 0, 0, 1096, 1097, 5, 112, 0, 0, 1097, 1098, 5, 111, 0, 0, 1098, 1099, 5, 114, 0, 0, 1099, 1100, 5, 116, 0, 0, 1100, 116, 1, 0, 0, 0, 1101, 1102, 5, 115, 0, 0, 1102, 1103, 5, 101, 0, 0, 1103, 1104, 5, 114, 0, 0, 1104, 1105, 5, 105, 0, 0, 1105, 1106, 5, 97, 0, 0, 1106, 1107, 5, 108, 0, 0, 1107, 1108, 5, 105, 0, 0, 1108, 1109, 5, 122, 0, 0, 1109, 1110, 5, 97, 0, 0, 1110, 1111, 5, 98, 0, 0, 1111, 1112, 5, 108, 0, 0, 1112, 1113, 5, 101, 0, 0, 1113, 118, 1, 0, 0, 0, 1114, 1115, 5, 119, 0, 0, 1115, 1116, 5, 105, 0, 0, 1116, 1117, 5, 110, 0, 0, 1117, 1118, 5, 100, 0, 0, 1118, 1119, 5, 111, 0, 0, 1119, 1120, 5, 119, 0, 0, 1120, 1121, 5, 115, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 117, 0, 0, 1123, 1124, 5, 110, 0, 0, 1124, 1125, 5, 116, 0, 0, 1125, 1126, 5, 105, 0, 0, 1126, 1127, 5, 109, 0, 0, 1127, 1128, 5, 101, 0, 0, 1128, 120, 1, 0, 0, 0, 1129, 1130, 5, 110, 0, 0, 1130, 1131, 5, 101, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 116, 0, 0, 1133, 1134, 5, 101, 0, 0, 1134, 1135, 5, 100, 0, 0, 1135, 122, 1, 0, 0, 0, 1136, 1137, 5, 102, 0, 0, 1137, 1138, 5, 97, 0, 0, 1138, 1139, 5, 109, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 108, 0, 0, 1141, 1142, 5, 121, 0, 0, 1142, 124, 1, 0, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 115, 0, 0, 1145, 1146, 5, 115, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 1148, 5, 109, 0, 0, 1148, 1149, 5, 98, 0, 0, 1149, 1150, 5, 108, 0, 0, 1150, 1151, 5, 121, 0, 0, 1151, 126, 1, 0, 0, 0, 1152, 1153, 5, 102, 0, 0, 1153, 1154, 5, 97, 0, 0, 1154, 1155, 5, 109, 0, 0, 1155, 1156, 5, 97, 0, 0, 1156, 1157, 5, 110, 0, 0, 1157, 1158, 5, 100, 0, 0, 1158, 1159, 5, 97, 0, 0, 1159, 1160, 5, 115, 0, 0, 1160, 1161, 5, 115, 0, 0, 1161, 1162, 5, 101, 0, 0, 1162, 1163, 5, 109, 0, 0, 1163, 128, 1, 0, 0, 0, 1164, 1165, 5, 102, 0, 0, 1165, 1166, 5, 97, 0, 0, 1166, 1167, 5, 109, 0, 0, 1167, 1168, 5, 111, 0, 0, 1168, 1169, 5, 114, 0, 0, 1169, 1170, 5, 97, 0, 0, 1170, 1171, 5, 115, 0, 0, 1171, 1172, 5, 115, 0, 0, 1172, 1173, 5, 101, 0, 0, 1173, 1174, 5, 109, 0, 0, 1174, 130, 1, 0, 0, 0, 1175, 1176, 5, 98, 0, 0, 1176, 1177, 5, 101, 0, 0, 1177, 1178, 5, 102, 0, 0, 1178, 1179, 5, 111, 0, 0, 1179, 1180, 5, 114, 0, 0, 1180, 1181, 5, 101, 0, 0, 1181, 1182, 5, 102, 0, 0, 1182, 1183, 5, 105, 0, 0, 1183, 1184, 5, 101, 0, 0, 1184, 1185, 5, 108, 0, 0, 1185, 1186, 5, 100, 0, 0, 1186, 1187, 5, 105, 0, 0, 1187, 1188, 5, 110, 0, 0, 1188, 1189, 5, 105, 0, 0, 1189, 1190, 5, 116, 0, 0, 1190, 132, 1, 0, 0, 0, 1191, 1192, 5, 115, 0, 0, 1192, 1193, 5, 112, 0, 0, 1193, 1194, 5, 101, 0, 0, 1194, 1195, 5, 99, 0, 0, 1195, 1196, 5, 105, 0, 0, 1196, 1197, 5, 97, 0, 0, 1197, 1198, 5, 108, 0, 0, 1198, 1199, 5, 110, 0, 0, 1199, 1200, 5, 97, 0, 0, 1200, 1201, 5, 109, 0, 0, 1201, 1202, 5, 101, 0, 0, 1202, 134, 1, 0, 0, 0, 1203, 1204, 5, 114, 0, 0, 1204, 1205, 5, 116, 0, 0, 1205, 1206, 5, 115, 0, 0, 1206, 1207, 5, 112, 0, 0, 1207, 1208, 5, 101, 0, 0, 1208, 1209, 5, 99, 0, 0, 1209, 1210, 5, 105, 0, 0, 1210, 1211, 5, 97, 0, 0, 1211, 1212, 5, 108, 0, 0, 1212, 1213, 5, 110, 0, 0, 1213, 1214, 5, 97, 0, 0, 1214, 1215, 5, 109, 0, 0, 1215, 1216, 5, 101, 0, 0, 1216, 136, 1, 0, 0, 0, 1217, 1218, 5, 102, 0, 0, 1218, 1219, 5, 108, 0, 0, 1219, 1220, 5, 97, 0, 0, 1220, 1221, 5, 103, 0, 0, 1221, 1222, 5, 115, 0, 0, 1222, 138, 1, 0, 0, 0, 1223, 1224, 5, 101, 0, 0, 1224, 1225, 5, 120, 0, 0, 1225, 1226, 5, 116, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 1228, 5, 110, 0, 0, 1228, 1229, 5, 100, 0, 0, 1229, 1230, 5, 115, 0, 0, 1230, 140, 1, 0, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 109, 0, 0, 1233, 1234, 5, 112, 0, 0, 1234, 1235, 5, 108, 0, 0, 1235, 1236, 5, 101, 0, 0, 1236, 1237, 5, 109, 0, 0, 1237, 1238, 5, 101, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 116, 0, 0, 1240, 1241, 5, 115, 0, 0, 1241, 142, 1, 0, 0, 0, 1242, 1243, 5, 46, 0, 0, 1243, 1244, 5, 108, 0, 0, 1244, 1245, 5, 105, 0, 0, 1245, 1246, 5, 110, 0, 0, 1246, 1247, 5, 101, 0, 0, 1247, 144, 1, 0, 0, 0, 1248, 1249, 5, 35, 0, 0, 1249, 1250, 5, 108, 0, 0, 1250, 1251, 5, 105, 0, 0, 1251, 1252, 5, 110, 0, 0, 1252, 1253, 5, 101, 0, 0, 1253, 146, 1, 0, 0, 0, 1254, 1255, 5, 58, 0, 0, 1255, 148, 1, 0, 0, 0, 1256, 1257, 5, 110, 0, 0, 1257, 1258, 5, 111, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 101, 0, 0, 1260, 1261, 5, 116, 0, 0, 1261, 1262, 5, 97, 0, 0, 1262, 1263, 5, 100, 0, 0, 1263, 1264, 5, 97, 0, 0, 1264, 1265, 5, 116, 0, 0, 1265, 1266, 5, 97, 0, 0, 1266, 150, 1, 0, 0, 0, 1267, 1268, 5, 114, 0, 0, 1268, 1269, 5, 101, 0, 0, 1269, 1270, 5, 116, 0, 0, 1270, 1271, 5, 97, 0, 0, 1271, 1272, 5, 114, 0, 0, 1272, 1273, 5, 103, 0, 0, 1273, 1274, 5, 101, 0, 0, 1274, 1275, 5, 116, 0, 0, 1275, 1276, 5, 97, 0, 0, 1276, 1277, 5, 98, 0, 0, 1277, 1278, 5, 108, 0, 0, 1278, 1279, 5, 101, 0, 0, 1279, 152, 1, 0, 0, 0, 1280, 1281, 5, 110, 0, 0, 1281, 1282, 5, 111, 0, 0, 1282, 1283, 5, 112, 0, 0, 1283, 1284, 5, 108, 0, 0, 1284, 1285, 5, 97, 0, 0, 1285, 1286, 5, 116, 0, 0, 1286, 1287, 5, 102, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1289, 5, 114, 0, 0, 1289, 1290, 5, 109, 0, 0, 1290, 154, 1, 0, 0, 0, 1291, 1292, 5, 108, 0, 0, 1292, 1293, 5, 101, 0, 0, 1293, 1294, 5, 103, 0, 0, 1294, 1295, 5, 97, 0, 0, 1295, 1296, 5, 99, 0, 0, 1296, 1297, 5, 121, 0, 0, 1297, 1298, 5, 32, 0, 0, 1298, 1299, 5, 108, 0, 0, 1299, 1300, 5, 105, 0, 0, 1300, 1301, 5, 98, 0, 0, 1301, 1302, 5, 114, 0, 0, 1302, 1303, 5, 97, 0, 0, 1303, 1304, 5, 114, 0, 0, 1304, 1305, 5, 121, 0, 0, 1305, 156, 1, 0, 0, 0, 1306, 1307, 5, 120, 0, 0, 1307, 1308, 5, 56, 0, 0, 1308, 1309, 5, 54, 0, 0, 1309, 158, 1, 0, 0, 0, 1310, 1311, 5, 97, 0, 0, 1311, 1312, 5, 109, 0, 0, 1312, 1313, 5, 100, 0, 0, 1313, 1314, 5, 54, 0, 0, 1314, 1315, 5, 52, 0, 0, 1315, 160, 1, 0, 0, 0, 1316, 1317, 5, 97, 0, 0, 1317, 1318, 5, 114, 0, 0, 1318, 1319, 5, 109, 0, 0, 1319, 162, 1, 0, 0, 0, 1320, 1321, 5, 97, 0, 0, 1321, 1322, 5, 114, 0, 0, 1322, 1323, 5, 109, 0, 0, 1323, 1324, 5, 54, 0, 0, 1324, 1325, 5, 52, 0, 0, 1325, 164, 1, 0, 0, 0, 1326, 1327, 5, 98, 0, 0, 1327, 1328, 5, 121, 0, 0, 1328, 1329, 5, 116, 0, 0, 1329, 1330, 5, 101, 0, 0, 1330, 1331, 5, 97, 0, 0, 1331, 1332, 5, 114, 0, 0, 1332, 1333, 5, 114, 0, 0, 1333, 1334, 5, 97, 0, 0, 1334, 1335, 5, 121, 0, 0, 1335, 166, 1, 0, 0, 0, 1336, 1337, 5, 40, 0, 0, 1337, 1338, 5, 41, 0, 0, 1338, 168, 1, 0, 0, 0, 1339, 1340, 5, 60, 0, 0, 1340, 170, 1, 0, 0, 0, 1341, 1342, 5, 62, 0, 0, 1342, 172, 1, 0, 0, 0, 1343, 1344, 5, 47, 0, 0, 1344, 174, 1, 0, 0, 0, 1345, 1346, 5, 97, 0, 0, 1346, 1347, 5, 108, 0, 0, 1347, 1348, 5, 103, 0, 0, 1348, 1349, 5, 111, 0, 0, 1349, 1350, 5, 114, 0, 0, 1350, 1351, 5, 105, 0, 0, 1351, 1352, 5, 116, 0, 0, 1352, 1353, 5, 104, 0, 0, 1353, 1354, 5, 109, 0, 0, 1354, 176, 1, 0, 0, 0, 1355, 1356, 5, 105, 0, 0, 1356, 1357, 5, 105, 0, 0, 1357, 1358, 5, 100, 0, 0, 1358, 1359, 5, 112, 0, 0, 1359, 1360, 5, 97, 0, 0, 1360, 1361, 5, 114, 0, 0, 1361, 1362, 5, 97, 0, 0, 1362, 1363, 5, 109, 0, 0, 1363, 178, 1, 0, 0, 0, 1364, 1365, 5, 112, 0, 0, 1365, 1366, 5, 105, 0, 0, 1366, 1367, 5, 110, 0, 0, 1367, 1368, 5, 110, 0, 0, 1368, 1369, 5, 101, 0, 0, 1369, 1370, 5, 100, 0, 0, 1370, 180, 1, 0, 0, 0, 1371, 1372, 5, 109, 0, 0, 1372, 1373, 5, 111, 0, 0, 1373, 1374, 5, 100, 0, 0, 1374, 1375, 5, 114, 0, 0, 1375, 1376, 5, 101, 0, 0, 1376, 1377, 5, 113, 0, 0, 1377, 182, 1, 0, 0, 0, 1378, 1379, 5, 109, 0, 0, 1379, 1380, 5, 111, 0, 0, 1380, 1381, 5, 100, 0, 0, 1381, 1382, 5, 111, 0, 0, 1382, 1383, 5, 112, 0, 0, 1383, 1384, 5, 116, 0, 0, 1384, 184, 1, 0, 0, 0, 1385, 1386, 5, 117, 0, 0, 1386, 1387, 5, 110, 0, 0, 1387, 1388, 5, 115, 0, 0, 1388, 1389, 5, 105, 0, 0, 1389, 1390, 5, 103, 0, 0, 1390, 1391, 5, 110, 0, 0, 1391, 1392, 5, 101, 0, 0, 1392, 1393, 5, 100, 0, 0, 1393, 186, 1, 0, 0, 0, 1394, 1395, 5, 116, 0, 0, 1395, 1396, 5, 114, 0, 0, 1396, 1397, 5, 117, 0, 0, 1397, 1398, 5, 101, 0, 0, 1398, 188, 1, 0, 0, 0, 1399, 1400, 5, 102, 0, 0, 1400, 1401, 5, 97, 0, 0, 1401, 1402, 5, 108, 0, 0, 1402, 1403, 5, 115, 0, 0, 1403, 1404, 5, 101, 0, 0, 1404, 190, 1, 0, 0, 0, 1405, 1406, 5, 114, 0, 0, 1406, 1407, 5, 101, 0, 0, 1407, 1408, 5, 113, 0, 0, 1408, 1409, 5, 117, 0, 0, 1409, 1410, 5, 101, 0, 0, 1410, 1411, 5, 115, 0, 0, 1411, 1412, 5, 116, 0, 0, 1412, 192, 1, 0, 0, 0, 1413, 1414, 5, 100, 0, 0, 1414, 1415, 5, 101, 0, 0, 1415, 1416, 5, 109, 0, 0, 1416, 1417, 5, 97, 0, 0, 1417, 1418, 5, 110, 0, 0, 1418, 1419, 5, 100, 0, 0, 1419, 194, 1, 0, 0, 0, 1420, 1421, 5, 97, 0, 0, 1421, 1422, 5, 115, 0, 0, 1422, 1423, 5, 115, 0, 0, 1423, 1424, 5, 101, 0, 0, 1424, 1425, 5, 114, 0, 0, 1425, 1426, 5, 116, 0, 0, 1426, 196, 1, 0, 0, 0, 1427, 1428, 5, 100, 0, 0, 1428, 1429, 5, 101, 0, 0, 1429, 1430, 5, 110, 0, 0, 1430, 1431, 5, 121, 0, 0, 1431, 198, 1, 0, 0, 0, 1432, 1433, 5, 112, 0, 0, 1433, 1434, 5, 101, 0, 0, 1434, 1435, 5, 114, 0, 0, 1435, 1436, 5, 109, 0, 0, 1436, 1437, 5, 105, 0, 0, 1437, 1438, 5, 116, 0, 0, 1438, 1439, 5, 111, 0, 0, 1439, 1440, 5, 110, 0, 0, 1440, 1441, 5, 108, 0, 0, 1441, 1442, 5, 121, 0, 0, 1442, 200, 1, 0, 0, 0, 1443, 1444, 5, 108, 0, 0, 1444, 1445, 5, 105, 0, 0, 1445, 1446, 5, 110, 0, 0, 1446, 1447, 5, 107, 0, 0, 1447, 1448, 5, 99, 0, 0, 1448, 1449, 5, 104, 0, 0, 1449, 1450, 5, 101, 0, 0, 1450, 1451, 5, 99, 0, 0, 1451, 1452, 5, 107, 0, 0, 1452, 202, 1, 0, 0, 0, 1453, 1454, 5, 105, 0, 0, 1454, 1455, 5, 110, 0, 0, 1455, 1456, 5, 104, 0, 0, 1456, 1457, 5, 101, 0, 0, 1457, 1458, 5, 114, 0, 0, 1458, 1459, 5, 105, 0, 0, 1459, 1460, 5, 116, 0, 0, 1460, 1461, 5, 99, 0, 0, 1461, 1462, 5, 104, 0, 0, 1462, 1463, 5, 101, 0, 0, 1463, 1464, 5, 99, 0, 0, 1464, 1465, 5, 107, 0, 0, 1465, 204, 1, 0, 0, 0, 1466, 1467, 5, 114, 0, 0, 1467, 1468, 5, 101, 0, 0, 1468, 1469, 5, 113, 0, 0, 1469, 1470, 5, 109, 0, 0, 1470, 1471, 5, 105, 0, 0, 1471, 1472, 5, 110, 0, 0, 1472, 206, 1, 0, 0, 0, 1473, 1474, 5, 114, 0, 0, 1474, 1475, 5, 101, 0, 0, 1475, 1476, 5, 113, 0, 0, 1476, 1477, 5, 111, 0, 0, 1477, 1478, 5, 112, 0, 0, 1478, 1479, 5, 116, 0, 0, 1479, 208, 1, 0, 0, 0, 1480, 1481, 5, 114, 0, 0, 1481, 1482, 5, 101, 0, 0, 1482, 1483, 5, 113, 0, 0, 1483, 1484, 5, 114, 0, 0, 1484, 1485, 5, 101, 0, 0, 1485, 1486, 5, 102, 0, 0, 1486, 1487, 5, 117, 0, 0, 1487, 1488, 5, 115, 0, 0, 1488, 1489, 5, 101, 0, 0, 1489, 210, 1, 0, 0, 0, 1490, 1491, 5, 112, 0, 0, 1491, 1492, 5, 114, 0, 0, 1492, 1493, 5, 101, 0, 0, 1493, 1494, 5, 106, 0, 0, 1494, 1495, 5, 105, 0, 0, 1495, 1496, 5, 116, 0, 0, 1496, 1497, 5, 103, 0, 0, 1497, 1498, 5, 114, 0, 0, 1498, 1499, 5, 97, 0, 0, 1499, 1500, 5, 110, 0, 0, 1500, 1501, 5, 116, 0, 0, 1501, 212, 1, 0, 0, 0, 1502, 1503, 5, 112, 0, 0, 1503, 1504, 5, 114, 0, 0, 1504, 1505, 5, 101, 0, 0, 1505, 1506, 5, 106, 0, 0, 1506, 1507, 5, 105, 0, 0, 1507, 1508, 5, 116, 0, 0, 1508, 1509, 5, 100, 0, 0, 1509, 1510, 5, 101, 0, 0, 1510, 1511, 5, 110, 0, 0, 1511, 1512, 5, 121, 0, 0, 1512, 214, 1, 0, 0, 0, 1513, 1514, 5, 110, 0, 0, 1514, 1515, 5, 111, 0, 0, 1515, 1516, 5, 110, 0, 0, 1516, 1517, 5, 99, 0, 0, 1517, 1518, 5, 97, 0, 0, 1518, 1519, 5, 115, 0, 0, 1519, 1520, 5, 100, 0, 0, 1520, 1521, 5, 101, 0, 0, 1521, 1522, 5, 109, 0, 0, 1522, 1523, 5, 97, 0, 0, 1523, 1524, 5, 110, 0, 0, 1524, 1525, 5, 100, 0, 0, 1525, 216, 1, 0, 0, 0, 1526, 1527, 5, 110, 0, 0, 1527, 1528, 5, 111, 0, 0, 1528, 1529, 5, 110, 0, 0, 1529, 1530, 5, 99, 0, 0, 1530, 1531, 5, 97, 0, 0, 1531, 1532, 5, 115, 0, 0, 1532, 1533, 5, 108, 0, 0, 1533, 1534, 5, 105, 0, 0, 1534, 1535, 5, 110, 0, 0, 1535, 1536, 5, 107, 0, 0, 1536, 1537, 5, 100, 0, 0, 1537, 1538, 5, 101, 0, 0, 1538, 1539, 5, 109, 0, 0, 1539, 1540, 5, 97, 0, 0, 1540, 1541, 5, 110, 0, 0, 1541, 1542, 5, 100, 0, 0, 1542, 218, 1, 0, 0, 0, 1543, 1544, 5, 110, 0, 0, 1544, 1545, 5, 111, 0, 0, 1545, 1546, 5, 110, 0, 0, 1546, 1547, 5, 99, 0, 0, 1547, 1548, 5, 97, 0, 0, 1548, 1549, 5, 115, 0, 0, 1549, 1550, 5, 105, 0, 0, 1550, 1551, 5, 110, 0, 0, 1551, 1552, 5, 104, 0, 0, 1552, 1553, 5, 101, 0, 0, 1553, 1554, 5, 114, 0, 0, 1554, 1555, 5, 105, 0, 0, 1555, 1556, 5, 116, 0, 0, 1556, 1557, 5, 97, 0, 0, 1557, 1558, 5, 110, 0, 0, 1558, 1559, 5, 99, 0, 0, 1559, 1560, 5, 101, 0, 0, 1560, 220, 1, 0, 0, 0, 1561, 1562, 5, 99, 0, 0, 1562, 1563, 5, 97, 0, 0, 1563, 1564, 5, 108, 0, 0, 1564, 1565, 5, 108, 0, 0, 1565, 1566, 5, 99, 0, 0, 1566, 1567, 5, 111, 0, 0, 1567, 1568, 5, 110, 0, 0, 1568, 1569, 5, 118, 0, 0, 1569, 222, 1, 0, 0, 0, 1570, 1571, 5, 109, 0, 0, 1571, 1572, 5, 100, 0, 0, 1572, 1573, 5, 116, 0, 0, 1573, 1574, 5, 111, 0, 0, 1574, 1575, 5, 107, 0, 0, 1575, 1576, 5, 101, 0, 0, 1576, 1577, 5, 110, 0, 0, 1577, 224, 1, 0, 0, 0, 1578, 1579, 5, 45, 0, 0, 1579, 226, 1, 0, 0, 0, 1580, 1581, 5, 98, 0, 0, 1581, 1582, 5, 121, 0, 0, 1582, 1583, 5, 114, 0, 0, 1583, 1584, 5, 101, 0, 0, 1584, 1585, 5, 102, 0, 0, 1585, 1586, 5, 108, 0, 0, 1586, 1587, 5, 105, 0, 0, 1587, 1588, 5, 107, 0, 0, 1588, 1589, 5, 101, 0, 0, 1589, 228, 1, 0, 0, 0, 1590, 1591, 5, 46, 0, 0, 1591, 1592, 5, 99, 0, 0, 1592, 1593, 5, 116, 0, 0, 1593, 1594, 5, 111, 0, 0, 1594, 1595, 5, 114, 0, 0, 1595, 230, 1, 0, 0, 0, 1596, 1597, 5, 46, 0, 0, 1597, 1598, 5, 115, 0, 0, 1598, 1599, 5, 105, 0, 0, 1599, 1600, 5, 122, 0, 0, 1600, 1601, 5, 101, 0, 0, 1601, 232, 1, 0, 0, 0, 1602, 1603, 5, 46, 0, 0, 1603, 1604, 5, 112, 0, 0, 1604, 1605, 5, 97, 0, 0, 1605, 1606, 5, 99, 0, 0, 1606, 1607, 5, 107, 0, 0, 1607, 234, 1, 0, 0, 0, 1608, 1609, 5, 119, 0, 0, 1609, 1610, 5, 105, 0, 0, 1610, 1611, 5, 116, 0, 0, 1611, 1612, 5, 104, 0, 0, 1612, 236, 1, 0, 0, 0, 1613, 1614, 5, 46, 0, 0, 1614, 1615, 5, 105, 0, 0, 1615, 1616, 5, 110, 0, 0, 1616, 1617, 5, 116, 0, 0, 1617, 1618, 5, 101, 0, 0, 1618, 1619, 5, 114, 0, 0, 1619, 1620, 5, 102, 0, 0, 1620, 1621, 5, 97, 0, 0, 1621, 1622, 5, 99, 0, 0, 1622, 1623, 5, 101, 0, 0, 1623, 1624, 5, 105, 0, 0, 1624, 1625, 5, 109, 0, 0, 1625, 1626, 5, 112, 0, 0, 1626, 1627, 5, 108, 0, 0, 1627, 238, 1, 0, 0, 0, 1628, 1629, 5, 46, 0, 0, 1629, 1630, 5, 102, 0, 0, 1630, 1631, 5, 105, 0, 0, 1631, 1632, 5, 101, 0, 0, 1632, 1633, 5, 108, 0, 0, 1633, 1634, 5, 100, 0, 0, 1634, 240, 1, 0, 0, 0, 1635, 1636, 5, 109, 0, 0, 1636, 1637, 5, 97, 0, 0, 1637, 1638, 5, 114, 0, 0, 1638, 1639, 5, 115, 0, 0, 1639, 1640, 5, 104, 0, 0, 1640, 1641, 5, 97, 0, 0, 1641, 1642, 5, 108, 0, 0, 1642, 242, 1, 0, 0, 0, 1643, 1644, 5, 115, 0, 0, 1644, 1645, 5, 116, 0, 0, 1645, 1646, 5, 97, 0, 0, 1646, 1647, 5, 116, 0, 0, 1647, 1648, 5, 105, 0, 0, 1648, 1649, 5, 99, 0, 0, 1649, 244, 1, 0, 0, 0, 1650, 1651, 5, 105, 0, 0, 1651, 1652, 5, 110, 0, 0, 1652, 1653, 5, 105, 0, 0, 1653, 1654, 5, 116, 0, 0, 1654, 1655, 5, 111, 0, 0, 1655, 1656, 5, 110, 0, 0, 1656, 1657, 5, 108, 0, 0, 1657, 1658, 5, 121, 0, 0, 1658, 246, 1, 0, 0, 0, 1659, 1660, 5, 112, 0, 0, 1660, 1661, 5, 114, 0, 0, 1661, 1662, 5, 105, 0, 0, 1662, 1663, 5, 118, 0, 0, 1663, 1664, 5, 97, 0, 0, 1664, 1665, 5, 116, 0, 0, 1665, 1666, 5, 101, 0, 0, 1666, 1667, 5, 115, 0, 0, 1667, 1668, 5, 99, 0, 0, 1668, 1669, 5, 111, 0, 0, 1669, 1670, 5, 112, 0, 0, 1670, 1671, 5, 101, 0, 0, 1671, 248, 1, 0, 0, 0, 1672, 1673, 5, 108, 0, 0, 1673, 1674, 5, 105, 0, 0, 1674, 1675, 5, 116, 0, 0, 1675, 1676, 5, 101, 0, 0, 1676, 1677, 5, 114, 0, 0, 1677, 1678, 5, 97, 0, 0, 1678, 1679, 5, 108, 0, 0, 1679, 250, 1, 0, 0, 0, 1680, 1681, 5, 110, 0, 0, 1681, 1682, 5, 111, 0, 0, 1682, 1683, 5, 116, 0, 0, 1683, 1684, 5, 115, 0, 0, 1684, 1685, 5, 101, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 105, 0, 0, 1687, 1688, 5, 97, 0, 0, 1688, 1689, 5, 108, 0, 0, 1689, 1690, 5, 105, 0, 0, 1690, 1691, 5, 122, 0, 0, 1691, 1692, 5, 101, 0, 0, 1692, 1693, 5, 100, 0, 0, 1693, 252, 1, 0, 0, 0, 1694, 1695, 5, 118, 0, 0, 1695, 1696, 5, 111, 0, 0, 1696, 1697, 5, 108, 0, 0, 1697, 1698, 5, 97, 0, 0, 1698, 1699, 5, 116, 0, 0, 1699, 1700, 5, 105, 0, 0, 1700, 1701, 5, 108, 0, 0, 1701, 1702, 5, 101, 0, 0, 1702, 254, 1, 0, 0, 0, 1703, 1704, 5, 46, 0, 0, 1704, 1705, 5, 101, 0, 0, 1705, 1706, 5, 118, 0, 0, 1706, 1707, 5, 101, 0, 0, 1707, 1708, 5, 110, 0, 0, 1708, 1709, 5, 116, 0, 0, 1709, 256, 1, 0, 0, 0, 1710, 1711, 5, 46, 0, 0, 1711, 1712, 5, 97, 0, 0, 1712, 1713, 5, 100, 0, 0, 1713, 1714, 5, 100, 0, 0, 1714, 1715, 5, 111, 0, 0, 1715, 1716, 5, 110, 0, 0, 1716, 258, 1, 0, 0, 0, 1717, 1718, 5, 46, 0, 0, 1718, 1719, 5, 114, 0, 0, 1719, 1720, 5, 101, 0, 0, 1720, 1721, 5, 109, 0, 0, 1721, 1722, 5, 111, 0, 0, 1722, 1723, 5, 118, 0, 0, 1723, 1724, 5, 101, 0, 0, 1724, 1725, 5, 111, 0, 0, 1725, 1726, 5, 110, 0, 0, 1726, 260, 1, 0, 0, 0, 1727, 1728, 5, 46, 0, 0, 1728, 1729, 5, 102, 0, 0, 1729, 1730, 5, 105, 0, 0, 1730, 1731, 5, 114, 0, 0, 1731, 1732, 5, 101, 0, 0, 1732, 262, 1, 0, 0, 0, 1733, 1734, 5, 46, 0, 0, 1734, 1735, 5, 111, 0, 0, 1735, 1736, 5, 116, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 1738, 5, 101, 0, 0, 1738, 1739, 5, 114, 0, 0, 1739, 264, 1, 0, 0, 0, 1740, 1741, 5, 46, 0, 0, 1741, 1742, 5, 112, 0, 0, 1742, 1743, 5, 114, 0, 0, 1743, 1744, 5, 111, 0, 0, 1744, 1745, 5, 112, 0, 0, 1745, 1746, 5, 101, 0, 0, 1746, 1747, 5, 114, 0, 0, 1747, 1748, 5, 116, 0, 0, 1748, 1749, 5, 121, 0, 0, 1749, 266, 1, 0, 0, 0, 1750, 1751, 5, 46, 0, 0, 1751, 1752, 5, 115, 0, 0, 1752, 1753, 5, 101, 0, 0, 1753, 1754, 5, 116, 0, 0, 1754, 268, 1, 0, 0, 0, 1755, 1756, 5, 46, 0, 0, 1756, 1757, 5, 103, 0, 0, 1757, 1758, 5, 101, 0, 0, 1758, 1759, 5, 116, 0, 0, 1759, 270, 1, 0, 0, 0, 1760, 1761, 5, 105, 0, 0, 1761, 1762, 5, 110, 0, 0, 1762, 272, 1, 0, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 117, 0, 0, 1765, 1766, 5, 116, 0, 0, 1766, 274, 1, 0, 0, 0, 1767, 1768, 5, 111, 0, 0, 1768, 1769, 5, 112, 0, 0, 1769, 1770, 5, 116, 0, 0, 1770, 276, 1, 0, 0, 0, 1771, 1772, 5, 46, 0, 0, 1772, 1773, 5, 109, 0, 0, 1773, 1774, 5, 101, 0, 0, 1774, 1775, 5, 116, 0, 0, 1775, 1776, 5, 104, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 100, 0, 0, 1778, 278, 1, 0, 0, 0, 1779, 1780, 5, 102, 0, 0, 1780, 1781, 5, 105, 0, 0, 1781, 1782, 5, 110, 0, 0, 1782, 1783, 5, 97, 0, 0, 1783, 1784, 5, 108, 0, 0, 1784, 280, 1, 0, 0, 0, 1785, 1786, 5, 118, 0, 0, 1786, 1787, 5, 105, 0, 0, 1787, 1788, 5, 114, 0, 0, 1788, 1789, 5, 116, 0, 0, 1789, 1790, 5, 117, 0, 0, 1790, 1791, 5, 97, 0, 0, 1791, 1792, 5, 108, 0, 0, 1792, 282, 1, 0, 0, 0, 1793, 1794, 5, 115, 0, 0, 1794, 1795, 5, 116, 0, 0, 1795, 1796, 5, 114, 0, 0, 1796, 1797, 5, 105, 0, 0, 1797, 1798, 5, 99, 0, 0, 1798, 1799, 5, 116, 0, 0, 1799, 284, 1, 0, 0, 0, 1800, 1801, 5, 104, 0, 0, 1801, 1802, 5, 105, 0, 0, 1802, 1803, 5, 100, 0, 0, 1803, 1804, 5, 101, 0, 0, 1804, 1805, 5, 98, 0, 0, 1805, 1806, 5, 121, 0, 0, 1806, 1807, 5, 115, 0, 0, 1807, 1808, 5, 105, 0, 0, 1808, 1809, 5, 103, 0, 0, 1809, 286, 1, 0, 0, 0, 1810, 1811, 5, 110, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 1813, 5, 119, 0, 0, 1813, 1814, 5, 115, 0, 0, 1814, 1815, 5, 108, 0, 0, 1815, 1816, 5, 111, 0, 0, 1816, 1817, 5, 116, 0, 0, 1817, 288, 1, 0, 0, 0, 1818, 1819, 5, 117, 0, 0, 1819, 1820, 5, 110, 0, 0, 1820, 1821, 5, 109, 0, 0, 1821, 1822, 5, 97, 0, 0, 1822, 1823, 5, 110, 0, 0, 1823, 1824, 5, 97, 0, 0, 1824, 1825, 5, 103, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 100, 0, 0, 1827, 1828, 5, 101, 0, 0, 1828, 1829, 5, 120, 0, 0, 1829, 1830, 5, 112, 0, 0, 1830, 290, 1, 0, 0, 0, 1831, 1832, 5, 114, 0, 0, 1832, 1833, 5, 101, 0, 0, 1833, 1834, 5, 113, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 101, 0, 0, 1836, 1837, 5, 99, 0, 0, 1837, 1838, 5, 111, 0, 0, 1838, 1839, 5, 98, 0, 0, 1839, 1840, 5, 106, 0, 0, 1840, 292, 1, 0, 0, 0, 1841, 1842, 5, 112, 0, 0, 1842, 1843, 5, 105, 0, 0, 1843, 1844, 5, 110, 0, 0, 1844, 1845, 5, 118, 0, 0, 1845, 1846, 5, 111, 0, 0, 1846, 1847, 5, 107, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 105, 0, 0, 1849, 1850, 5, 109, 0, 0, 1850, 1851, 5, 112, 0, 0, 1851, 1852, 5, 108, 0, 0, 1852, 294, 1, 0, 0, 0, 1853, 1854, 5, 110, 0, 0, 1854, 1855, 5, 111, 0, 0, 1855, 1856, 5, 109, 0, 0, 1856, 1857, 5, 97, 0, 0, 1857, 1858, 5, 110, 0, 0, 1858, 1859, 5, 103, 0, 0, 1859, 1860, 5, 108, 0, 0, 1860, 1861, 5, 101, 0, 0, 1861, 296, 1, 0, 0, 0, 1862, 1863, 5, 108, 0, 0, 1863, 1864, 5, 97, 0, 0, 1864, 1865, 5, 115, 0, 0, 1865, 1866, 5, 116, 0, 0, 1866, 1867, 5, 101, 0, 0, 1867, 1868, 5, 114, 0, 0, 1868, 1869, 5, 114, 0, 0, 1869, 298, 1, 0, 0, 0, 1870, 1871, 5, 119, 0, 0, 1871, 1872, 5, 105, 0, 0, 1872, 1873, 5, 110, 0, 0, 1873, 1874, 5, 97, 0, 0, 1874, 1875, 5, 112, 0, 0, 1875, 1876, 5, 105, 0, 0, 1876, 300, 1, 0, 0, 0, 1877, 1878, 5, 98, 0, 0, 1878, 1879, 5, 101, 0, 0, 1879, 1880, 5, 115, 0, 0, 1880, 1881, 5, 116, 0, 0, 1881, 1882, 5, 102, 0, 0, 1882, 1883, 5, 105, 0, 0, 1883, 1884, 5, 116, 0, 0, 1884, 302, 1, 0, 0, 0, 1885, 1886, 5, 111, 0, 0, 1886, 1887, 5, 110, 0, 0, 1887, 304, 1, 0, 0, 0, 1888, 1889, 5, 111, 0, 0, 1889, 1890, 5, 102, 0, 0, 1890, 1891, 5, 102, 0, 0, 1891, 306, 1, 0, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 104, 0, 0, 1894, 1895, 5, 97, 0, 0, 1895, 1896, 5, 114, 0, 0, 1896, 1897, 5, 109, 0, 0, 1897, 1898, 5, 97, 0, 0, 1898, 1899, 5, 112, 0, 0, 1899, 1900, 5, 101, 0, 0, 1900, 1901, 5, 114, 0, 0, 1901, 1902, 5, 114, 0, 0, 1902, 1903, 5, 111, 0, 0, 1903, 1904, 5, 114, 0, 0, 1904, 308, 1, 0, 0, 0, 1905, 1906, 5, 46, 0, 0, 1906, 1907, 5, 99, 0, 0, 1907, 1908, 5, 99, 0, 0, 1908, 1909, 5, 116, 0, 0, 1909, 1910, 5, 111, 0, 0, 1910, 1911, 5, 114, 0, 0, 1911, 310, 1, 0, 0, 0, 1912, 1913, 5, 105, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 312, 1, 0, 0, 0, 1915, 1916, 5, 105, 0, 0, 1916, 1917, 5, 110, 0, 0, 1917, 1918, 5, 105, 0, 0, 1918, 1919, 5, 116, 0, 0, 1919, 314, 1, 0, 0, 0, 1920, 1921, 5, 46, 0, 0, 1921, 1922, 5, 116, 0, 0, 1922, 1923, 5, 114, 0, 0, 1923, 1924, 5, 121, 0, 0, 1924, 316, 1, 0, 0, 0, 1925, 1926, 5, 116, 0, 0, 1926, 1927, 5, 111, 0, 0, 1927, 318, 1, 0, 0, 0, 1928, 1929, 5, 102, 0, 0, 1929, 1930, 5, 105, 0, 0, 1930, 1931, 5, 108, 0, 0, 1931, 1932, 5, 116, 0, 0, 1932, 1933, 5, 101, 0, 0, 1933, 1934, 5, 114, 0, 0, 1934, 320, 1, 0, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 97, 0, 0, 1937, 1938, 5, 116, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1940, 5, 104, 0, 0, 1940, 322, 1, 0, 0, 0, 1941, 1942, 5, 102, 0, 0, 1942, 1943, 5, 105, 0, 0, 1943, 1944, 5, 110, 0, 0, 1944, 1945, 5, 97, 0, 0, 1945, 1946, 5, 108, 0, 0, 1946, 1947, 5, 108, 0, 0, 1947, 1948, 5, 121, 0, 0, 1948, 324, 1, 0, 0, 0, 1949, 1950, 5, 102, 0, 0, 1950, 1951, 5, 97, 0, 0, 1951, 1952, 5, 117, 0, 0, 1952, 1953, 5, 108, 0, 0, 1953, 1954, 5, 116, 0, 0, 1954, 326, 1, 0, 0, 0, 1955, 1956, 5, 104, 0, 0, 1956, 1957, 5, 97, 0, 0, 1957, 1958, 5, 110, 0, 0, 1958, 1959, 5, 100, 0, 0, 1959, 1960, 5, 108, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 114, 0, 0, 1962, 328, 1, 0, 0, 0, 1963, 1964, 5, 46, 0, 0, 1964, 1965, 5, 100, 0, 0, 1965, 1966, 5, 97, 0, 0, 1966, 1967, 5, 116, 0, 0, 1967, 1968, 5, 97, 0, 0, 1968, 330, 1, 0, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 108, 0, 0, 1971, 1972, 5, 115, 0, 0, 1972, 332, 1, 0, 0, 0, 1973, 1974, 5, 46, 0, 0, 1974, 1975, 5, 112, 0, 0, 1975, 1976, 5, 117, 0, 0, 1976, 1977, 5, 98, 0, 0, 1977, 1978, 5, 108, 0, 0, 1978, 1979, 5, 105, 0, 0, 1979, 1980, 5, 99, 0, 0, 1980, 1981, 5, 75, 0, 0, 1981, 1982, 5, 101, 0, 0, 1982, 1983, 5, 121, 0, 0, 1983, 334, 1, 0, 0, 0, 1984, 1985, 5, 46, 0, 0, 1985, 1986, 5, 118, 0, 0, 1986, 1987, 5, 101, 0, 0, 1987, 1988, 5, 114, 0, 0, 1988, 336, 1, 0, 0, 0, 1989, 1990, 5, 46, 0, 0, 1990, 1991, 5, 108, 0, 0, 1991, 1992, 5, 111, 0, 0, 1992, 1993, 5, 99, 0, 0, 1993, 1994, 5, 97, 0, 0, 1994, 1995, 5, 108, 0, 0, 1995, 1996, 5, 101, 0, 0, 1996, 338, 1, 0, 0, 0, 1997, 1998, 5, 46, 0, 0, 1998, 1999, 5, 112, 0, 0, 1999, 2000, 5, 117, 0, 0, 2000, 2001, 5, 98, 0, 0, 2001, 2002, 5, 108, 0, 0, 2002, 2003, 5, 105, 0, 0, 2003, 2004, 5, 99, 0, 0, 2004, 2005, 5, 107, 0, 0, 2005, 2006, 5, 101, 0, 0, 2006, 2007, 5, 121, 0, 0, 2007, 2008, 5, 116, 0, 0, 2008, 2009, 5, 111, 0, 0, 2009, 2010, 5, 107, 0, 0, 2010, 2011, 5, 101, 0, 0, 2011, 2012, 5, 110, 0, 0, 2012, 340, 1, 0, 0, 0, 2013, 2014, 5, 102, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 114, 0, 0, 2016, 2017, 5, 119, 0, 0, 2017, 2018, 5, 97, 0, 0, 2018, 2019, 5, 114, 0, 0, 2019, 2020, 5, 100, 0, 0, 2020, 2021, 5, 101, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 342, 1, 0, 0, 0, 2023, 2025, 5, 45, 0, 0, 2024, 2023, 1, 0, 0, 0, 2024, 2025, 1, 0, 0, 0, 2025, 2039, 1, 0, 0, 0, 2026, 2027, 5, 48, 0, 0, 2027, 2028, 5, 120, 0, 0, 2028, 2030, 1, 0, 0, 0, 2029, 2031, 7, 0, 0, 0, 2030, 2029, 1, 0, 0, 0, 2031, 2032, 1, 0, 0, 0, 2032, 2030, 1, 0, 0, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2040, 1, 0, 0, 0, 2034, 2036, 7, 1, 0, 0, 2035, 2034, 1, 0, 0, 0, 2036, 2037, 1, 0, 0, 0, 2037, 2035, 1, 0, 0, 0, 2037, 2038, 1, 0, 0, 0, 2038, 2040, 1, 0, 0, 0, 2039, 2026, 1, 0, 0, 0, 2039, 2035, 1, 0, 0, 0, 2040, 344, 1, 0, 0, 0, 2041, 2043, 5, 45, 0, 0, 2042, 2041, 1, 0, 0, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2057, 1, 0, 0, 0, 2044, 2045, 5, 48, 0, 0, 2045, 2046, 5, 120, 0, 0, 2046, 2048, 1, 0, 0, 0, 2047, 2049, 7, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 2050, 1, 0, 0, 0, 2050, 2048, 1, 0, 0, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2058, 1, 0, 0, 0, 2052, 2054, 7, 1, 0, 0, 2053, 2052, 1, 0, 0, 0, 2054, 2055, 1, 0, 0, 0, 2055, 2053, 1, 0, 0, 0, 2055, 2056, 1, 0, 0, 0, 2056, 2058, 1, 0, 0, 0, 2057, 2044, 1, 0, 0, 0, 2057, 2053, 1, 0, 0, 0, 2058, 346, 1, 0, 0, 0, 2059, 2061, 5, 45, 0, 0, 2060, 2059, 1, 0, 0, 0, 2060, 2061, 1, 0, 0, 0, 2061, 2112, 1, 0, 0, 0, 2062, 2064, 7, 1, 0, 0, 2063, 2062, 1, 0, 0, 0, 2064, 2065, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2066, 1, 0, 0, 0, 2066, 2093, 1, 0, 0, 0, 2067, 2069, 5, 46, 0, 0, 2068, 2070, 7, 1, 0, 0, 2069, 2068, 1, 0, 0, 0, 2070, 2071, 1, 0, 0, 0, 2071, 2069, 1, 0, 0, 0, 2071, 2072, 1, 0, 0, 0, 2072, 2082, 1, 0, 0, 0, 2073, 2075, 7, 2, 0, 0, 2074, 2076, 7, 3, 0, 0, 2075, 2074, 1, 0, 0, 0, 2075, 2076, 1, 0, 0, 0, 2076, 2078, 1, 0, 0, 0, 2077, 2079, 7, 1, 0, 0, 2078, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2078, 1, 0, 0, 0, 2080, 2081, 1, 0, 0, 0, 2081, 2083, 1, 0, 0, 0, 2082, 2073, 1, 0, 0, 0, 2082, 2083, 1, 0, 0, 0, 2083, 2094, 1, 0, 0, 0, 2084, 2086, 7, 2, 0, 0, 2085, 2087, 7, 3, 0, 0, 2086, 2085, 1, 0, 0, 0, 2086, 2087, 1, 0, 0, 0, 2087, 2089, 1, 0, 0, 0, 2088, 2090, 7, 1, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2094, 1, 0, 0, 0, 2093, 2067, 1, 0, 0, 0, 2093, 2084, 1, 0, 0, 0, 2094, 2113, 1, 0, 0, 0, 2095, 2097, 5, 46, 0, 0, 2096, 2098, 7, 1, 0, 0, 2097, 2096, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2097, 1, 0, 0, 0, 2099, 2100, 1, 0, 0, 0, 2100, 2110, 1, 0, 0, 0, 2101, 2103, 7, 2, 0, 0, 2102, 2104, 7, 3, 0, 0, 2103, 2102, 1, 0, 0, 0, 2103, 2104, 1, 0, 0, 0, 2104, 2106, 1, 0, 0, 0, 2105, 2107, 7, 1, 0, 0, 2106, 2105, 1, 0, 0, 0, 2107, 2108, 1, 0, 0, 0, 2108, 2106, 1, 0, 0, 0, 2108, 2109, 1, 0, 0, 0, 2109, 2111, 1, 0, 0, 0, 2110, 2101, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2113, 1, 0, 0, 0, 2112, 2063, 1, 0, 0, 0, 2112, 2095, 1, 0, 0, 0, 2113, 348, 1, 0, 0, 0, 2114, 2115, 5, 58, 0, 0, 2115, 2116, 5, 58, 0, 0, 2116, 350, 1, 0, 0, 0, 2117, 2118, 5, 46, 0, 0, 2118, 2119, 5, 46, 0, 0, 2119, 2120, 5, 46, 0, 0, 2120, 352, 1, 0, 0, 0, 2121, 2122, 5, 110, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 108, 0, 0, 2125, 354, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 117, 0, 0, 2128, 2129, 5, 108, 0, 0, 2129, 2130, 5, 108, 0, 0, 2130, 2131, 5, 114, 0, 0, 2131, 2132, 5, 101, 0, 0, 2132, 2133, 5, 102, 0, 0, 2133, 356, 1, 0, 0, 0, 2134, 2135, 5, 46, 0, 0, 2135, 2136, 5, 104, 0, 0, 2136, 2137, 5, 97, 0, 0, 2137, 2138, 5, 115, 0, 0, 2138, 2139, 5, 104, 0, 0, 2139, 358, 1, 0, 0, 0, 2140, 2141, 5, 99, 0, 0, 2141, 2142, 5, 104, 0, 0, 2142, 2143, 5, 97, 0, 0, 2143, 2150, 5, 114, 0, 0, 2144, 2145, 5, 119, 0, 0, 2145, 2146, 5, 99, 0, 0, 2146, 2147, 5, 104, 0, 0, 2147, 2148, 5, 97, 0, 0, 2148, 2150, 5, 114, 0, 0, 2149, 2140, 1, 0, 0, 0, 2149, 2144, 1, 0, 0, 0, 2150, 360, 1, 0, 0, 0, 2151, 2152, 5, 115, 0, 0, 2152, 2153, 5, 116, 0, 0, 2153, 2154, 5, 114, 0, 0, 2154, 2155, 5, 105, 0, 0, 2155, 2156, 5, 110, 0, 0, 2156, 2157, 5, 103, 0, 0, 2157, 362, 1, 0, 0, 0, 2158, 2159, 5, 98, 0, 0, 2159, 2160, 5, 111, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 108, 0, 0, 2162, 364, 1, 0, 0, 0, 2163, 2164, 5, 105, 0, 0, 2164, 2165, 5, 110, 0, 0, 2165, 2166, 5, 116, 0, 0, 2166, 2167, 5, 56, 0, 0, 2167, 366, 1, 0, 0, 0, 2168, 2169, 5, 105, 0, 0, 2169, 2170, 5, 110, 0, 0, 2170, 2171, 5, 116, 0, 0, 2171, 2172, 5, 49, 0, 0, 2172, 2173, 5, 54, 0, 0, 2173, 368, 1, 0, 0, 0, 2174, 2175, 5, 105, 0, 0, 2175, 2176, 5, 110, 0, 0, 2176, 2177, 5, 116, 0, 0, 2177, 2178, 5, 51, 0, 0, 2178, 2179, 5, 50, 0, 0, 2179, 370, 1, 0, 0, 0, 2180, 2181, 5, 105, 0, 0, 2181, 2182, 5, 110, 0, 0, 2182, 2183, 5, 116, 0, 0, 2183, 2184, 5, 54, 0, 0, 2184, 2185, 5, 52, 0, 0, 2185, 372, 1, 0, 0, 0, 2186, 2187, 5, 102, 0, 0, 2187, 2188, 5, 108, 0, 0, 2188, 2189, 5, 111, 0, 0, 2189, 2190, 5, 97, 0, 0, 2190, 2191, 5, 116, 0, 0, 2191, 2192, 5, 51, 0, 0, 2192, 2193, 5, 50, 0, 0, 2193, 374, 1, 0, 0, 0, 2194, 2195, 5, 102, 0, 0, 2195, 2196, 5, 108, 0, 0, 2196, 2197, 5, 111, 0, 0, 2197, 2198, 5, 97, 0, 0, 2198, 2199, 5, 116, 0, 0, 2199, 2200, 5, 54, 0, 0, 2200, 2201, 5, 52, 0, 0, 2201, 376, 1, 0, 0, 0, 2202, 2203, 5, 117, 0, 0, 2203, 2204, 5, 110, 0, 0, 2204, 2205, 5, 115, 0, 0, 2205, 2206, 5, 105, 0, 0, 2206, 2207, 5, 103, 0, 0, 2207, 2208, 5, 110, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 100, 0, 0, 2210, 378, 1, 0, 0, 0, 2211, 2212, 5, 117, 0, 0, 2212, 2213, 5, 105, 0, 0, 2213, 2214, 5, 110, 0, 0, 2214, 2215, 5, 116, 0, 0, 2215, 2216, 5, 56, 0, 0, 2216, 380, 1, 0, 0, 0, 2217, 2218, 5, 117, 0, 0, 2218, 2219, 5, 105, 0, 0, 2219, 2220, 5, 110, 0, 0, 2220, 2221, 5, 116, 0, 0, 2221, 2222, 5, 49, 0, 0, 2222, 2223, 5, 54, 0, 0, 2223, 382, 1, 0, 0, 0, 2224, 2225, 5, 117, 0, 0, 2225, 2226, 5, 105, 0, 0, 2226, 2227, 5, 110, 0, 0, 2227, 2228, 5, 116, 0, 0, 2228, 2229, 5, 51, 0, 0, 2229, 2230, 5, 50, 0, 0, 2230, 384, 1, 0, 0, 0, 2231, 2232, 5, 117, 0, 0, 2232, 2233, 5, 105, 0, 0, 2233, 2234, 5, 110, 0, 0, 2234, 2235, 5, 116, 0, 0, 2235, 2236, 5, 54, 0, 0, 2236, 2237, 5, 52, 0, 0, 2237, 386, 1, 0, 0, 0, 2238, 2239, 5, 105, 0, 0, 2239, 2240, 5, 110, 0, 0, 2240, 2241, 5, 116, 0, 0, 2241, 388, 1, 0, 0, 0, 2242, 2243, 5, 117, 0, 0, 2243, 2244, 5, 105, 0, 0, 2244, 2245, 5, 110, 0, 0, 2245, 2246, 5, 116, 0, 0, 2246, 390, 1, 0, 0, 0, 2247, 2248, 5, 116, 0, 0, 2248, 2249, 5, 121, 0, 0, 2249, 2250, 5, 112, 0, 0, 2250, 2251, 5, 101, 0, 0, 2251, 392, 1, 0, 0, 0, 2252, 2253, 5, 111, 0, 0, 2253, 2254, 5, 98, 0, 0, 2254, 2255, 5, 106, 0, 0, 2255, 2256, 5, 101, 0, 0, 2256, 2257, 5, 99, 0, 0, 2257, 2258, 5, 116, 0, 0, 2258, 394, 1, 0, 0, 0, 2259, 2260, 5, 46, 0, 0, 2260, 2261, 5, 109, 0, 0, 2261, 2262, 5, 111, 0, 0, 2262, 2263, 5, 100, 0, 0, 2263, 2264, 5, 117, 0, 0, 2264, 2265, 5, 108, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 396, 1, 0, 0, 0, 2267, 2268, 5, 118, 0, 0, 2268, 2269, 5, 97, 0, 0, 2269, 2270, 5, 108, 0, 0, 2270, 2271, 5, 117, 0, 0, 2271, 2272, 5, 101, 0, 0, 2272, 398, 1, 0, 0, 0, 2273, 2274, 5, 118, 0, 0, 2274, 2275, 5, 97, 0, 0, 2275, 2276, 5, 108, 0, 0, 2276, 2277, 5, 117, 0, 0, 2277, 2278, 5, 101, 0, 0, 2278, 2279, 5, 116, 0, 0, 2279, 2280, 5, 121, 0, 0, 2280, 2281, 5, 112, 0, 0, 2281, 2282, 5, 101, 0, 0, 2282, 400, 1, 0, 0, 0, 2283, 2284, 5, 118, 0, 0, 2284, 2285, 5, 111, 0, 0, 2285, 2286, 5, 105, 0, 0, 2286, 2287, 5, 100, 0, 0, 2287, 402, 1, 0, 0, 0, 2288, 2289, 5, 101, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 117, 0, 0, 2291, 2292, 5, 109, 0, 0, 2292, 404, 1, 0, 0, 0, 2293, 2294, 5, 99, 0, 0, 2294, 2295, 5, 117, 0, 0, 2295, 2296, 5, 115, 0, 0, 2296, 2297, 5, 116, 0, 0, 2297, 2298, 5, 111, 0, 0, 2298, 2299, 5, 109, 0, 0, 2299, 406, 1, 0, 0, 0, 2300, 2301, 5, 102, 0, 0, 2301, 2302, 5, 105, 0, 0, 2302, 2303, 5, 120, 0, 0, 2303, 2304, 5, 101, 0, 0, 2304, 2305, 5, 100, 0, 0, 2305, 408, 1, 0, 0, 0, 2306, 2307, 5, 115, 0, 0, 2307, 2308, 5, 121, 0, 0, 2308, 2309, 5, 115, 0, 0, 2309, 2310, 5, 116, 0, 0, 2310, 2311, 5, 114, 0, 0, 2311, 2312, 5, 105, 0, 0, 2312, 2313, 5, 110, 0, 0, 2313, 2314, 5, 103, 0, 0, 2314, 410, 1, 0, 0, 0, 2315, 2316, 5, 97, 0, 0, 2316, 2317, 5, 114, 0, 0, 2317, 2318, 5, 114, 0, 0, 2318, 2319, 5, 97, 0, 0, 2319, 2320, 5, 121, 0, 0, 2320, 412, 1, 0, 0, 0, 2321, 2322, 5, 118, 0, 0, 2322, 2323, 5, 97, 0, 0, 2323, 2324, 5, 114, 0, 0, 2324, 2325, 5, 105, 0, 0, 2325, 2326, 5, 97, 0, 0, 2326, 2327, 5, 110, 0, 0, 2327, 2328, 5, 116, 0, 0, 2328, 414, 1, 0, 0, 0, 2329, 2330, 5, 99, 0, 0, 2330, 2331, 5, 117, 0, 0, 2331, 2332, 5, 114, 0, 0, 2332, 2333, 5, 114, 0, 0, 2333, 2334, 5, 101, 0, 0, 2334, 2335, 5, 110, 0, 0, 2335, 2336, 5, 99, 0, 0, 2336, 2337, 5, 121, 0, 0, 2337, 416, 1, 0, 0, 0, 2338, 2339, 5, 115, 0, 0, 2339, 2340, 5, 121, 0, 0, 2340, 2341, 5, 115, 0, 0, 2341, 2342, 5, 99, 0, 0, 2342, 2343, 5, 104, 0, 0, 2343, 2344, 5, 97, 0, 0, 2344, 2345, 5, 114, 0, 0, 2345, 418, 1, 0, 0, 0, 2346, 2347, 5, 101, 0, 0, 2347, 2348, 5, 114, 0, 0, 2348, 2349, 5, 114, 0, 0, 2349, 2350, 5, 111, 0, 0, 2350, 2351, 5, 114, 0, 0, 2351, 420, 1, 0, 0, 0, 2352, 2353, 5, 100, 0, 0, 2353, 2354, 5, 101, 0, 0, 2354, 2355, 5, 99, 0, 0, 2355, 2356, 5, 105, 0, 0, 2356, 2357, 5, 109, 0, 0, 2357, 2358, 5, 97, 0, 0, 2358, 2359, 5, 108, 0, 0, 2359, 422, 1, 0, 0, 0, 2360, 2361, 5, 100, 0, 0, 2361, 2362, 5, 97, 0, 0, 2362, 2363, 5, 116, 0, 0, 2363, 2364, 5, 101, 0, 0, 2364, 424, 1, 0, 0, 0, 2365, 2366, 5, 98, 0, 0, 2366, 2367, 5, 115, 0, 0, 2367, 2368, 5, 116, 0, 0, 2368, 2369, 5, 114, 0, 0, 2369, 426, 1, 0, 0, 0, 2370, 2371, 5, 108, 0, 0, 2371, 2372, 5, 112, 0, 0, 2372, 2373, 5, 115, 0, 0, 2373, 2374, 5, 116, 0, 0, 2374, 2375, 5, 114, 0, 0, 2375, 428, 1, 0, 0, 0, 2376, 2377, 5, 108, 0, 0, 2377, 2378, 5, 112, 0, 0, 2378, 2379, 5, 119, 0, 0, 2379, 2380, 5, 115, 0, 0, 2380, 2381, 5, 116, 0, 0, 2381, 2382, 5, 114, 0, 0, 2382, 430, 1, 0, 0, 0, 2383, 2384, 5, 108, 0, 0, 2384, 2385, 5, 112, 0, 0, 2385, 2386, 5, 116, 0, 0, 2386, 2387, 5, 115, 0, 0, 2387, 2388, 5, 116, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 432, 1, 0, 0, 0, 2390, 2391, 5, 111, 0, 0, 2391, 2392, 5, 98, 0, 0, 2392, 2393, 5, 106, 0, 0, 2393, 2394, 5, 101, 0, 0, 2394, 2395, 5, 99, 0, 0, 2395, 2396, 5, 116, 0, 0, 2396, 2397, 5, 114, 0, 0, 2397, 2398, 5, 101, 0, 0, 2398, 2399, 5, 102, 0, 0, 2399, 434, 1, 0, 0, 0, 2400, 2401, 5, 105, 0, 0, 2401, 2402, 5, 117, 0, 0, 2402, 2403, 5, 110, 0, 0, 2403, 2404, 5, 107, 0, 0, 2404, 2405, 5, 110, 0, 0, 2405, 2406, 5, 111, 0, 0, 2406, 2407, 5, 119, 0, 0, 2407, 2408, 5, 110, 0, 0, 2408, 436, 1, 0, 0, 0, 2409, 2410, 5, 105, 0, 0, 2410, 2411, 5, 100, 0, 0, 2411, 2412, 5, 105, 0, 0, 2412, 2413, 5, 115, 0, 0, 2413, 2414, 5, 112, 0, 0, 2414, 2415, 5, 97, 0, 0, 2415, 2416, 5, 116, 0, 0, 2416, 2417, 5, 99, 0, 0, 2417, 2418, 5, 104, 0, 0, 2418, 438, 1, 0, 0, 0, 2419, 2420, 5, 115, 0, 0, 2420, 2421, 5, 116, 0, 0, 2421, 2422, 5, 114, 0, 0, 2422, 2423, 5, 117, 0, 0, 2423, 2424, 5, 99, 0, 0, 2424, 2425, 5, 116, 0, 0, 2425, 440, 1, 0, 0, 0, 2426, 2427, 5, 105, 0, 0, 2427, 2428, 5, 110, 0, 0, 2428, 2429, 5, 116, 0, 0, 2429, 2430, 5, 101, 0, 0, 2430, 2431, 5, 114, 0, 0, 2431, 2432, 5, 102, 0, 0, 2432, 2433, 5, 97, 0, 0, 2433, 2434, 5, 99, 0, 0, 2434, 2435, 5, 101, 0, 0, 2435, 442, 1, 0, 0, 0, 2436, 2437, 5, 115, 0, 0, 2437, 2438, 5, 97, 0, 0, 2438, 2439, 5, 102, 0, 0, 2439, 2440, 5, 101, 0, 0, 2440, 2441, 5, 97, 0, 0, 2441, 2442, 5, 114, 0, 0, 2442, 2443, 5, 114, 0, 0, 2443, 2444, 5, 97, 0, 0, 2444, 2445, 5, 121, 0, 0, 2445, 444, 1, 0, 0, 0, 2446, 2447, 5, 98, 0, 0, 2447, 2448, 5, 121, 0, 0, 2448, 2449, 5, 118, 0, 0, 2449, 2450, 5, 97, 0, 0, 2450, 2451, 5, 108, 0, 0, 2451, 2452, 5, 115, 0, 0, 2452, 2453, 5, 116, 0, 0, 2453, 2454, 5, 114, 0, 0, 2454, 446, 1, 0, 0, 0, 2455, 2456, 5, 97, 0, 0, 2456, 2457, 5, 110, 0, 0, 2457, 2458, 5, 115, 0, 0, 2458, 2459, 5, 105, 0, 0, 2459, 448, 1, 0, 0, 0, 2460, 2461, 5, 116, 0, 0, 2461, 2462, 5, 98, 0, 0, 2462, 2463, 5, 115, 0, 0, 2463, 2464, 5, 116, 0, 0, 2464, 2465, 5, 114, 0, 0, 2465, 450, 1, 0, 0, 0, 2466, 2467, 5, 109, 0, 0, 2467, 2468, 5, 101, 0, 0, 2468, 2469, 5, 116, 0, 0, 2469, 2470, 5, 104, 0, 0, 2470, 2471, 5, 111, 0, 0, 2471, 2472, 5, 100, 0, 0, 2472, 452, 1, 0, 0, 0, 2473, 2474, 5, 97, 0, 0, 2474, 2475, 5, 110, 0, 0, 2475, 2476, 5, 121, 0, 0, 2476, 454, 1, 0, 0, 0, 2477, 2478, 5, 108, 0, 0, 2478, 2479, 5, 112, 0, 0, 2479, 2480, 5, 115, 0, 0, 2480, 2481, 5, 116, 0, 0, 2481, 2482, 5, 114, 0, 0, 2482, 2483, 5, 117, 0, 0, 2483, 2484, 5, 99, 0, 0, 2484, 2485, 5, 116, 0, 0, 2485, 456, 1, 0, 0, 0, 2486, 2487, 5, 118, 0, 0, 2487, 2488, 5, 101, 0, 0, 2488, 2489, 5, 99, 0, 0, 2489, 2490, 5, 116, 0, 0, 2490, 2491, 5, 111, 0, 0, 2491, 2492, 5, 114, 0, 0, 2492, 458, 1, 0, 0, 0, 2493, 2494, 5, 104, 0, 0, 2494, 2495, 5, 114, 0, 0, 2495, 2496, 5, 101, 0, 0, 2496, 2497, 5, 115, 0, 0, 2497, 2498, 5, 117, 0, 0, 2498, 2499, 5, 108, 0, 0, 2499, 2500, 5, 116, 0, 0, 2500, 460, 1, 0, 0, 0, 2501, 2502, 5, 99, 0, 0, 2502, 2503, 5, 97, 0, 0, 2503, 2504, 5, 114, 0, 0, 2504, 2505, 5, 114, 0, 0, 2505, 2506, 5, 97, 0, 0, 2506, 2507, 5, 121, 0, 0, 2507, 462, 1, 0, 0, 0, 2508, 2509, 5, 117, 0, 0, 2509, 2510, 5, 115, 0, 0, 2510, 2511, 5, 101, 0, 0, 2511, 2512, 5, 114, 0, 0, 2512, 2513, 5, 100, 0, 0, 2513, 2514, 5, 101, 0, 0, 2514, 2515, 5, 102, 0, 0, 2515, 2516, 5, 105, 0, 0, 2516, 2517, 5, 110, 0, 0, 2517, 2518, 5, 101, 0, 0, 2518, 2519, 5, 100, 0, 0, 2519, 464, 1, 0, 0, 0, 2520, 2521, 5, 114, 0, 0, 2521, 2522, 5, 101, 0, 0, 2522, 2523, 5, 99, 0, 0, 2523, 2524, 5, 111, 0, 0, 2524, 2525, 5, 114, 0, 0, 2525, 2526, 5, 100, 0, 0, 2526, 466, 1, 0, 0, 0, 2527, 2528, 5, 102, 0, 0, 2528, 2529, 5, 105, 0, 0, 2529, 2530, 5, 108, 0, 0, 2530, 2531, 5, 101, 0, 0, 2531, 2532, 5, 116, 0, 0, 2532, 2533, 5, 105, 0, 0, 2533, 2534, 5, 109, 0, 0, 2534, 2535, 5, 101, 0, 0, 2535, 468, 1, 0, 0, 0, 2536, 2537, 5, 98, 0, 0, 2537, 2538, 5, 108, 0, 0, 2538, 2539, 5, 111, 0, 0, 2539, 2540, 5, 98, 0, 0, 2540, 470, 1, 0, 0, 0, 2541, 2542, 5, 115, 0, 0, 2542, 2543, 5, 116, 0, 0, 2543, 2544, 5, 114, 0, 0, 2544, 2545, 5, 101, 0, 0, 2545, 2546, 5, 97, 0, 0, 2546, 2547, 5, 109, 0, 0, 2547, 472, 1, 0, 0, 0, 2548, 2549, 5, 115, 0, 0, 2549, 2550, 5, 116, 0, 0, 2550, 2551, 5, 111, 0, 0, 2551, 2552, 5, 114, 0, 0, 2552, 2553, 5, 97, 0, 0, 2553, 2554, 5, 103, 0, 0, 2554, 2555, 5, 101, 0, 0, 2555, 474, 1, 0, 0, 0, 2556, 2557, 5, 115, 0, 0, 2557, 2558, 5, 116, 0, 0, 2558, 2559, 5, 114, 0, 0, 2559, 2560, 5, 101, 0, 0, 2560, 2561, 5, 97, 0, 0, 2561, 2562, 5, 109, 0, 0, 2562, 2563, 5, 101, 0, 0, 2563, 2564, 5, 100, 0, 0, 2564, 2565, 5, 95, 0, 0, 2565, 2566, 5, 111, 0, 0, 2566, 2567, 5, 98, 0, 0, 2567, 2568, 5, 106, 0, 0, 2568, 2569, 5, 101, 0, 0, 2569, 2570, 5, 99, 0, 0, 2570, 2571, 5, 116, 0, 0, 2571, 476, 1, 0, 0, 0, 2572, 2573, 5, 115, 0, 0, 2573, 2574, 5, 116, 0, 0, 2574, 2575, 5, 111, 0, 0, 2575, 2576, 5, 114, 0, 0, 2576, 2577, 5, 101, 0, 0, 2577, 2578, 5, 100, 0, 0, 2578, 2579, 5, 95, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 478, 1, 0, 0, 0, 2586, 2587, 5, 98, 0, 0, 2587, 2588, 5, 108, 0, 0, 2588, 2589, 5, 111, 0, 0, 2589, 2590, 5, 98, 0, 0, 2590, 2591, 5, 95, 0, 0, 2591, 2592, 5, 111, 0, 0, 2592, 2593, 5, 98, 0, 0, 2593, 2594, 5, 106, 0, 0, 2594, 2595, 5, 101, 0, 0, 2595, 2596, 5, 99, 0, 0, 2596, 2597, 5, 116, 0, 0, 2597, 480, 1, 0, 0, 0, 2598, 2599, 5, 99, 0, 0, 2599, 2600, 5, 102, 0, 0, 2600, 482, 1, 0, 0, 0, 2601, 2602, 5, 99, 0, 0, 2602, 2603, 5, 108, 0, 0, 2603, 2604, 5, 115, 0, 0, 2604, 2605, 5, 105, 0, 0, 2605, 2606, 5, 100, 0, 0, 2606, 484, 1, 0, 0, 0, 2607, 2608, 5, 105, 0, 0, 2608, 2609, 5, 110, 0, 0, 2609, 2610, 5, 115, 0, 0, 2610, 2611, 5, 116, 0, 0, 2611, 2612, 5, 97, 0, 0, 2612, 2613, 5, 110, 0, 0, 2613, 2614, 5, 99, 0, 0, 2614, 2615, 5, 101, 0, 0, 2615, 486, 1, 0, 0, 0, 2616, 2617, 5, 101, 0, 0, 2617, 2618, 5, 120, 0, 0, 2618, 2619, 5, 112, 0, 0, 2619, 2620, 5, 108, 0, 0, 2620, 2621, 5, 105, 0, 0, 2621, 2622, 5, 99, 0, 0, 2622, 2623, 5, 105, 0, 0, 2623, 2624, 5, 116, 0, 0, 2624, 488, 1, 0, 0, 0, 2625, 2626, 5, 100, 0, 0, 2626, 2627, 5, 101, 0, 0, 2627, 2628, 5, 102, 0, 0, 2628, 2629, 5, 97, 0, 0, 2629, 2630, 5, 117, 0, 0, 2630, 2631, 5, 108, 0, 0, 2631, 2632, 5, 116, 0, 0, 2632, 490, 1, 0, 0, 0, 2633, 2634, 5, 118, 0, 0, 2634, 2635, 5, 97, 0, 0, 2635, 2636, 5, 114, 0, 0, 2636, 2637, 5, 97, 0, 0, 2637, 2638, 5, 114, 0, 0, 2638, 2639, 5, 103, 0, 0, 2639, 492, 1, 0, 0, 0, 2640, 2641, 5, 117, 0, 0, 2641, 2642, 5, 110, 0, 0, 2642, 2643, 5, 109, 0, 0, 2643, 2644, 5, 97, 0, 0, 2644, 2645, 5, 110, 0, 0, 2645, 2646, 5, 97, 0, 0, 2646, 2647, 5, 103, 0, 0, 2647, 2648, 5, 101, 0, 0, 2648, 2649, 5, 100, 0, 0, 2649, 494, 1, 0, 0, 0, 2650, 2651, 5, 99, 0, 0, 2651, 2652, 5, 100, 0, 0, 2652, 2653, 5, 101, 0, 0, 2653, 2654, 5, 99, 0, 0, 2654, 2655, 5, 108, 0, 0, 2655, 496, 1, 0, 0, 0, 2656, 2657, 5, 115, 0, 0, 2657, 2658, 5, 116, 0, 0, 2658, 2659, 5, 100, 0, 0, 2659, 2660, 5, 99, 0, 0, 2660, 2661, 5, 97, 0, 0, 2661, 2662, 5, 108, 0, 0, 2662, 2663, 5, 108, 0, 0, 2663, 498, 1, 0, 0, 0, 2664, 2665, 5, 116, 0, 0, 2665, 2666, 5, 104, 0, 0, 2666, 2667, 5, 105, 0, 0, 2667, 2668, 5, 115, 0, 0, 2668, 2669, 5, 99, 0, 0, 2669, 2670, 5, 97, 0, 0, 2670, 2671, 5, 108, 0, 0, 2671, 2672, 5, 108, 0, 0, 2672, 500, 1, 0, 0, 0, 2673, 2674, 5, 102, 0, 0, 2674, 2675, 5, 97, 0, 0, 2675, 2676, 5, 115, 0, 0, 2676, 2677, 5, 116, 0, 0, 2677, 2678, 5, 99, 0, 0, 2678, 2679, 5, 97, 0, 0, 2679, 2680, 5, 108, 0, 0, 2680, 2681, 5, 108, 0, 0, 2681, 502, 1, 0, 0, 0, 2682, 2683, 5, 33, 0, 0, 2683, 504, 1, 0, 0, 0, 2684, 2685, 5, 33, 0, 0, 2685, 2686, 5, 33, 0, 0, 2686, 506, 1, 0, 0, 0, 2687, 2688, 5, 116, 0, 0, 2688, 2689, 5, 121, 0, 0, 2689, 2690, 5, 112, 0, 0, 2690, 2691, 5, 101, 0, 0, 2691, 2692, 5, 100, 0, 0, 2692, 2693, 5, 114, 0, 0, 2693, 2694, 5, 101, 0, 0, 2694, 2702, 5, 102, 0, 0, 2695, 2696, 5, 114, 0, 0, 2696, 2697, 5, 101, 0, 0, 2697, 2698, 5, 102, 0, 0, 2698, 2699, 5, 97, 0, 0, 2699, 2700, 5, 110, 0, 0, 2700, 2702, 5, 121, 0, 0, 2701, 2687, 1, 0, 0, 0, 2701, 2695, 1, 0, 0, 0, 2702, 508, 1, 0, 0, 0, 2703, 2704, 5, 46, 0, 0, 2704, 2705, 5, 112, 0, 0, 2705, 2706, 5, 97, 0, 0, 2706, 2707, 5, 114, 0, 0, 2707, 2708, 5, 97, 0, 0, 2708, 2709, 5, 109, 0, 0, 2709, 510, 1, 0, 0, 0, 2710, 2711, 5, 99, 0, 0, 2711, 2712, 5, 111, 0, 0, 2712, 2713, 5, 110, 0, 0, 2713, 2714, 5, 115, 0, 0, 2714, 2715, 5, 116, 0, 0, 2715, 2716, 5, 114, 0, 0, 2716, 2717, 5, 97, 0, 0, 2717, 2718, 5, 105, 0, 0, 2718, 2719, 5, 110, 0, 0, 2719, 2720, 5, 116, 0, 0, 2720, 512, 1, 0, 0, 0, 2721, 2722, 5, 46, 0, 0, 2722, 2723, 5, 116, 0, 0, 2723, 2724, 5, 104, 0, 0, 2724, 2725, 5, 105, 0, 0, 2725, 2726, 5, 115, 0, 0, 2726, 514, 1, 0, 0, 0, 2727, 2728, 5, 46, 0, 0, 2728, 2729, 5, 98, 0, 0, 2729, 2730, 5, 97, 0, 0, 2730, 2731, 5, 115, 0, 0, 2731, 2732, 5, 101, 0, 0, 2732, 516, 1, 0, 0, 0, 2733, 2734, 5, 46, 0, 0, 2734, 2735, 5, 110, 0, 0, 2735, 2736, 5, 101, 0, 0, 2736, 2737, 5, 115, 0, 0, 2737, 2738, 5, 116, 0, 0, 2738, 2739, 5, 101, 0, 0, 2739, 2740, 5, 114, 0, 0, 2740, 518, 1, 0, 0, 0, 2741, 2742, 5, 38, 0, 0, 2742, 520, 1, 0, 0, 0, 2743, 2744, 5, 91, 0, 0, 2744, 2745, 5, 93, 0, 0, 2745, 522, 1, 0, 0, 0, 2746, 2747, 5, 42, 0, 0, 2747, 524, 1, 0, 0, 0, 2748, 2761, 5, 92, 0, 0, 2749, 2762, 7, 4, 0, 0, 2750, 2752, 7, 5, 0, 0, 2751, 2753, 7, 5, 0, 0, 2752, 2751, 1, 0, 0, 0, 2752, 2753, 1, 0, 0, 0, 2753, 2755, 1, 0, 0, 0, 2754, 2756, 7, 5, 0, 0, 2755, 2754, 1, 0, 0, 0, 2755, 2756, 1, 0, 0, 0, 2756, 2762, 1, 0, 0, 0, 2757, 2759, 5, 13, 0, 0, 2758, 2757, 1, 0, 0, 0, 2758, 2759, 1, 0, 0, 0, 2759, 2760, 1, 0, 0, 0, 2760, 2762, 5, 10, 0, 0, 2761, 2749, 1, 0, 0, 0, 2761, 2750, 1, 0, 0, 0, 2761, 2758, 1, 0, 0, 0, 2762, 526, 1, 0, 0, 0, 2763, 2768, 5, 34, 0, 0, 2764, 2767, 8, 6, 0, 0, 2765, 2767, 3, 525, 262, 0, 2766, 2764, 1, 0, 0, 0, 2766, 2765, 1, 0, 0, 0, 2767, 2770, 1, 0, 0, 0, 2768, 2766, 1, 0, 0, 0, 2768, 2769, 1, 0, 0, 0, 2769, 2771, 1, 0, 0, 0, 2770, 2768, 1, 0, 0, 0, 2771, 2772, 5, 34, 0, 0, 2772, 528, 1, 0, 0, 0, 2773, 2778, 5, 39, 0, 0, 2774, 2777, 8, 7, 0, 0, 2775, 2777, 3, 525, 262, 0, 2776, 2774, 1, 0, 0, 0, 2776, 2775, 1, 0, 0, 0, 2777, 2780, 1, 0, 0, 0, 2778, 2776, 1, 0, 0, 0, 2778, 2779, 1, 0, 0, 0, 2779, 2781, 1, 0, 0, 0, 2780, 2778, 1, 0, 0, 0, 2781, 2782, 5, 39, 0, 0, 2782, 530, 1, 0, 0, 0, 2783, 2784, 5, 46, 0, 0, 2784, 532, 1, 0, 0, 0, 2785, 2786, 5, 43, 0, 0, 2786, 534, 1, 0, 0, 0, 2787, 2788, 5, 35, 0, 0, 2788, 2789, 5, 100, 0, 0, 2789, 2790, 5, 101, 0, 0, 2790, 2791, 5, 102, 0, 0, 2791, 2792, 5, 105, 0, 0, 2792, 2793, 5, 110, 0, 0, 2793, 2794, 5, 101, 0, 0, 2794, 536, 1, 0, 0, 0, 2795, 2796, 5, 35, 0, 0, 2796, 2797, 5, 117, 0, 0, 2797, 2798, 5, 110, 0, 0, 2798, 2799, 5, 100, 0, 0, 2799, 2800, 5, 101, 0, 0, 2800, 2801, 5, 102, 0, 0, 2801, 538, 1, 0, 0, 0, 2802, 2803, 5, 35, 0, 0, 2803, 2804, 5, 105, 0, 0, 2804, 2805, 5, 102, 0, 0, 2805, 2806, 5, 100, 0, 0, 2806, 2807, 5, 101, 0, 0, 2807, 2808, 5, 102, 0, 0, 2808, 540, 1, 0, 0, 0, 2809, 2810, 5, 35, 0, 0, 2810, 2811, 5, 105, 0, 0, 2811, 2812, 5, 102, 0, 0, 2812, 2813, 5, 110, 0, 0, 2813, 2814, 5, 100, 0, 0, 2814, 2815, 5, 101, 0, 0, 2815, 2816, 5, 102, 0, 0, 2816, 542, 1, 0, 0, 0, 2817, 2818, 5, 35, 0, 0, 2818, 2819, 5, 101, 0, 0, 2819, 2820, 5, 108, 0, 0, 2820, 2821, 5, 115, 0, 0, 2821, 2822, 5, 101, 0, 0, 2822, 544, 1, 0, 0, 0, 2823, 2824, 5, 35, 0, 0, 2824, 2825, 5, 101, 0, 0, 2825, 2826, 5, 110, 0, 0, 2826, 2827, 5, 100, 0, 0, 2827, 2828, 5, 105, 0, 0, 2828, 2829, 5, 102, 0, 0, 2829, 546, 1, 0, 0, 0, 2830, 2831, 5, 35, 0, 0, 2831, 2832, 5, 105, 0, 0, 2832, 2833, 5, 110, 0, 0, 2833, 2834, 5, 99, 0, 0, 2834, 2835, 5, 108, 0, 0, 2835, 2836, 5, 117, 0, 0, 2836, 2837, 5, 100, 0, 0, 2837, 2838, 5, 101, 0, 0, 2838, 548, 1, 0, 0, 0, 2839, 2840, 5, 46, 0, 0, 2840, 2841, 5, 109, 0, 0, 2841, 2842, 5, 114, 0, 0, 2842, 2843, 5, 101, 0, 0, 2843, 2844, 5, 115, 0, 0, 2844, 2845, 5, 111, 0, 0, 2845, 2846, 5, 117, 0, 0, 2846, 2847, 5, 114, 0, 0, 2847, 2848, 5, 99, 0, 0, 2848, 2849, 5, 101, 0, 0, 2849, 550, 1, 0, 0, 0, 2850, 2851, 5, 110, 0, 0, 2851, 2852, 5, 111, 0, 0, 2852, 4033, 5, 112, 0, 0, 2853, 2854, 5, 98, 0, 0, 2854, 2855, 5, 114, 0, 0, 2855, 2856, 5, 101, 0, 0, 2856, 2857, 5, 97, 0, 0, 2857, 4033, 5, 107, 0, 0, 2858, 2859, 5, 108, 0, 0, 2859, 2860, 5, 100, 0, 0, 2860, 2861, 5, 97, 0, 0, 2861, 2862, 5, 114, 0, 0, 2862, 2863, 5, 103, 0, 0, 2863, 2864, 5, 46, 0, 0, 2864, 4033, 5, 48, 0, 0, 2865, 2866, 5, 108, 0, 0, 2866, 2867, 5, 100, 0, 0, 2867, 2868, 5, 97, 0, 0, 2868, 2869, 5, 114, 0, 0, 2869, 2870, 5, 103, 0, 0, 2870, 2871, 5, 46, 0, 0, 2871, 4033, 5, 49, 0, 0, 2872, 2873, 5, 108, 0, 0, 2873, 2874, 5, 100, 0, 0, 2874, 2875, 5, 97, 0, 0, 2875, 2876, 5, 114, 0, 0, 2876, 2877, 5, 103, 0, 0, 2877, 2878, 5, 46, 0, 0, 2878, 4033, 5, 50, 0, 0, 2879, 2880, 5, 108, 0, 0, 2880, 2881, 5, 100, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 114, 0, 0, 2883, 2884, 5, 103, 0, 0, 2884, 2885, 5, 46, 0, 0, 2885, 4033, 5, 51, 0, 0, 2886, 2887, 5, 108, 0, 0, 2887, 2888, 5, 100, 0, 0, 2888, 2889, 5, 108, 0, 0, 2889, 2890, 5, 111, 0, 0, 2890, 2891, 5, 99, 0, 0, 2891, 2892, 5, 46, 0, 0, 2892, 4033, 5, 48, 0, 0, 2893, 2894, 5, 108, 0, 0, 2894, 2895, 5, 100, 0, 0, 2895, 2896, 5, 108, 0, 0, 2896, 2897, 5, 111, 0, 0, 2897, 2898, 5, 99, 0, 0, 2898, 2899, 5, 46, 0, 0, 2899, 4033, 5, 49, 0, 0, 2900, 2901, 5, 108, 0, 0, 2901, 2902, 5, 100, 0, 0, 2902, 2903, 5, 108, 0, 0, 2903, 2904, 5, 111, 0, 0, 2904, 2905, 5, 99, 0, 0, 2905, 2906, 5, 46, 0, 0, 2906, 4033, 5, 50, 0, 0, 2907, 2908, 5, 108, 0, 0, 2908, 2909, 5, 100, 0, 0, 2909, 2910, 5, 108, 0, 0, 2910, 2911, 5, 111, 0, 0, 2911, 2912, 5, 99, 0, 0, 2912, 2913, 5, 46, 0, 0, 2913, 4033, 5, 51, 0, 0, 2914, 2915, 5, 115, 0, 0, 2915, 2916, 5, 116, 0, 0, 2916, 2917, 5, 108, 0, 0, 2917, 2918, 5, 111, 0, 0, 2918, 2919, 5, 99, 0, 0, 2919, 2920, 5, 46, 0, 0, 2920, 4033, 5, 48, 0, 0, 2921, 2922, 5, 115, 0, 0, 2922, 2923, 5, 116, 0, 0, 2923, 2924, 5, 108, 0, 0, 2924, 2925, 5, 111, 0, 0, 2925, 2926, 5, 99, 0, 0, 2926, 2927, 5, 46, 0, 0, 2927, 4033, 5, 49, 0, 0, 2928, 2929, 5, 115, 0, 0, 2929, 2930, 5, 116, 0, 0, 2930, 2931, 5, 108, 0, 0, 2931, 2932, 5, 111, 0, 0, 2932, 2933, 5, 99, 0, 0, 2933, 2934, 5, 46, 0, 0, 2934, 4033, 5, 50, 0, 0, 2935, 2936, 5, 115, 0, 0, 2936, 2937, 5, 116, 0, 0, 2937, 2938, 5, 108, 0, 0, 2938, 2939, 5, 111, 0, 0, 2939, 2940, 5, 99, 0, 0, 2940, 2941, 5, 46, 0, 0, 2941, 4033, 5, 51, 0, 0, 2942, 2943, 5, 108, 0, 0, 2943, 2944, 5, 100, 0, 0, 2944, 2945, 5, 110, 0, 0, 2945, 2946, 5, 117, 0, 0, 2946, 2947, 5, 108, 0, 0, 2947, 4033, 5, 108, 0, 0, 2948, 2949, 5, 108, 0, 0, 2949, 2950, 5, 100, 0, 0, 2950, 2951, 5, 99, 0, 0, 2951, 2952, 5, 46, 0, 0, 2952, 2953, 5, 105, 0, 0, 2953, 2954, 5, 52, 0, 0, 2954, 2955, 5, 46, 0, 0, 2955, 2956, 5, 109, 0, 0, 2956, 4033, 5, 49, 0, 0, 2957, 2958, 5, 108, 0, 0, 2958, 2959, 5, 100, 0, 0, 2959, 2960, 5, 99, 0, 0, 2960, 2961, 5, 46, 0, 0, 2961, 2962, 5, 105, 0, 0, 2962, 2963, 5, 52, 0, 0, 2963, 2964, 5, 46, 0, 0, 2964, 2965, 5, 77, 0, 0, 2965, 4033, 5, 49, 0, 0, 2966, 2967, 5, 108, 0, 0, 2967, 2968, 5, 100, 0, 0, 2968, 2969, 5, 99, 0, 0, 2969, 2970, 5, 46, 0, 0, 2970, 2971, 5, 105, 0, 0, 2971, 2972, 5, 52, 0, 0, 2972, 2973, 5, 46, 0, 0, 2973, 4033, 5, 48, 0, 0, 2974, 2975, 5, 108, 0, 0, 2975, 2976, 5, 100, 0, 0, 2976, 2977, 5, 99, 0, 0, 2977, 2978, 5, 46, 0, 0, 2978, 2979, 5, 105, 0, 0, 2979, 2980, 5, 52, 0, 0, 2980, 2981, 5, 46, 0, 0, 2981, 4033, 5, 49, 0, 0, 2982, 2983, 5, 108, 0, 0, 2983, 2984, 5, 100, 0, 0, 2984, 2985, 5, 99, 0, 0, 2985, 2986, 5, 46, 0, 0, 2986, 2987, 5, 105, 0, 0, 2987, 2988, 5, 52, 0, 0, 2988, 2989, 5, 46, 0, 0, 2989, 4033, 5, 50, 0, 0, 2990, 2991, 5, 108, 0, 0, 2991, 2992, 5, 100, 0, 0, 2992, 2993, 5, 99, 0, 0, 2993, 2994, 5, 46, 0, 0, 2994, 2995, 5, 105, 0, 0, 2995, 2996, 5, 52, 0, 0, 2996, 2997, 5, 46, 0, 0, 2997, 4033, 5, 51, 0, 0, 2998, 2999, 5, 108, 0, 0, 2999, 3000, 5, 100, 0, 0, 3000, 3001, 5, 99, 0, 0, 3001, 3002, 5, 46, 0, 0, 3002, 3003, 5, 105, 0, 0, 3003, 3004, 5, 52, 0, 0, 3004, 3005, 5, 46, 0, 0, 3005, 4033, 5, 52, 0, 0, 3006, 3007, 5, 108, 0, 0, 3007, 3008, 5, 100, 0, 0, 3008, 3009, 5, 99, 0, 0, 3009, 3010, 5, 46, 0, 0, 3010, 3011, 5, 105, 0, 0, 3011, 3012, 5, 52, 0, 0, 3012, 3013, 5, 46, 0, 0, 3013, 4033, 5, 53, 0, 0, 3014, 3015, 5, 108, 0, 0, 3015, 3016, 5, 100, 0, 0, 3016, 3017, 5, 99, 0, 0, 3017, 3018, 5, 46, 0, 0, 3018, 3019, 5, 105, 0, 0, 3019, 3020, 5, 52, 0, 0, 3020, 3021, 5, 46, 0, 0, 3021, 4033, 5, 54, 0, 0, 3022, 3023, 5, 108, 0, 0, 3023, 3024, 5, 100, 0, 0, 3024, 3025, 5, 99, 0, 0, 3025, 3026, 5, 46, 0, 0, 3026, 3027, 5, 105, 0, 0, 3027, 3028, 5, 52, 0, 0, 3028, 3029, 5, 46, 0, 0, 3029, 4033, 5, 55, 0, 0, 3030, 3031, 5, 108, 0, 0, 3031, 3032, 5, 100, 0, 0, 3032, 3033, 5, 99, 0, 0, 3033, 3034, 5, 46, 0, 0, 3034, 3035, 5, 105, 0, 0, 3035, 3036, 5, 52, 0, 0, 3036, 3037, 5, 46, 0, 0, 3037, 4033, 5, 56, 0, 0, 3038, 3039, 5, 100, 0, 0, 3039, 3040, 5, 117, 0, 0, 3040, 4033, 5, 112, 0, 0, 3041, 3042, 5, 112, 0, 0, 3042, 3043, 5, 111, 0, 0, 3043, 4033, 5, 112, 0, 0, 3044, 3045, 5, 114, 0, 0, 3045, 3046, 5, 101, 0, 0, 3046, 4033, 5, 116, 0, 0, 3047, 3048, 5, 108, 0, 0, 3048, 3049, 5, 100, 0, 0, 3049, 3050, 5, 105, 0, 0, 3050, 3051, 5, 110, 0, 0, 3051, 3052, 5, 100, 0, 0, 3052, 3053, 5, 46, 0, 0, 3053, 3054, 5, 105, 0, 0, 3054, 4033, 5, 49, 0, 0, 3055, 3056, 5, 108, 0, 0, 3056, 3057, 5, 100, 0, 0, 3057, 3058, 5, 105, 0, 0, 3058, 3059, 5, 110, 0, 0, 3059, 3060, 5, 100, 0, 0, 3060, 3061, 5, 46, 0, 0, 3061, 3062, 5, 117, 0, 0, 3062, 4033, 5, 49, 0, 0, 3063, 3064, 5, 108, 0, 0, 3064, 3065, 5, 100, 0, 0, 3065, 3066, 5, 105, 0, 0, 3066, 3067, 5, 110, 0, 0, 3067, 3068, 5, 100, 0, 0, 3068, 3069, 5, 46, 0, 0, 3069, 3070, 5, 105, 0, 0, 3070, 4033, 5, 50, 0, 0, 3071, 3072, 5, 108, 0, 0, 3072, 3073, 5, 100, 0, 0, 3073, 3074, 5, 105, 0, 0, 3074, 3075, 5, 110, 0, 0, 3075, 3076, 5, 100, 0, 0, 3076, 3077, 5, 46, 0, 0, 3077, 3078, 5, 117, 0, 0, 3078, 4033, 5, 50, 0, 0, 3079, 3080, 5, 108, 0, 0, 3080, 3081, 5, 100, 0, 0, 3081, 3082, 5, 105, 0, 0, 3082, 3083, 5, 110, 0, 0, 3083, 3084, 5, 100, 0, 0, 3084, 3085, 5, 46, 0, 0, 3085, 3086, 5, 105, 0, 0, 3086, 4033, 5, 52, 0, 0, 3087, 3088, 5, 108, 0, 0, 3088, 3089, 5, 100, 0, 0, 3089, 3090, 5, 105, 0, 0, 3090, 3091, 5, 110, 0, 0, 3091, 3092, 5, 100, 0, 0, 3092, 3093, 5, 46, 0, 0, 3093, 3094, 5, 117, 0, 0, 3094, 4033, 5, 52, 0, 0, 3095, 3096, 5, 108, 0, 0, 3096, 3097, 5, 100, 0, 0, 3097, 3098, 5, 105, 0, 0, 3098, 3099, 5, 110, 0, 0, 3099, 3100, 5, 100, 0, 0, 3100, 3101, 5, 46, 0, 0, 3101, 3102, 5, 105, 0, 0, 3102, 4033, 5, 56, 0, 0, 3103, 3104, 5, 108, 0, 0, 3104, 3105, 5, 100, 0, 0, 3105, 3106, 5, 105, 0, 0, 3106, 3107, 5, 110, 0, 0, 3107, 3108, 5, 100, 0, 0, 3108, 3109, 5, 46, 0, 0, 3109, 3110, 5, 117, 0, 0, 3110, 4033, 5, 56, 0, 0, 3111, 3112, 5, 108, 0, 0, 3112, 3113, 5, 100, 0, 0, 3113, 3114, 5, 105, 0, 0, 3114, 3115, 5, 110, 0, 0, 3115, 3116, 5, 100, 0, 0, 3116, 3117, 5, 46, 0, 0, 3117, 4033, 5, 105, 0, 0, 3118, 3119, 5, 108, 0, 0, 3119, 3120, 5, 100, 0, 0, 3120, 3121, 5, 105, 0, 0, 3121, 3122, 5, 110, 0, 0, 3122, 3123, 5, 100, 0, 0, 3123, 3124, 5, 46, 0, 0, 3124, 3125, 5, 114, 0, 0, 3125, 4033, 5, 52, 0, 0, 3126, 3127, 5, 108, 0, 0, 3127, 3128, 5, 100, 0, 0, 3128, 3129, 5, 105, 0, 0, 3129, 3130, 5, 110, 0, 0, 3130, 3131, 5, 100, 0, 0, 3131, 3132, 5, 46, 0, 0, 3132, 3133, 5, 114, 0, 0, 3133, 4033, 5, 56, 0, 0, 3134, 3135, 5, 108, 0, 0, 3135, 3136, 5, 100, 0, 0, 3136, 3137, 5, 105, 0, 0, 3137, 3138, 5, 110, 0, 0, 3138, 3139, 5, 100, 0, 0, 3139, 3140, 5, 46, 0, 0, 3140, 3141, 5, 114, 0, 0, 3141, 3142, 5, 101, 0, 0, 3142, 4033, 5, 102, 0, 0, 3143, 3144, 5, 115, 0, 0, 3144, 3145, 5, 116, 0, 0, 3145, 3146, 5, 105, 0, 0, 3146, 3147, 5, 110, 0, 0, 3147, 3148, 5, 100, 0, 0, 3148, 3149, 5, 46, 0, 0, 3149, 3150, 5, 114, 0, 0, 3150, 3151, 5, 101, 0, 0, 3151, 4033, 5, 102, 0, 0, 3152, 3153, 5, 115, 0, 0, 3153, 3154, 5, 116, 0, 0, 3154, 3155, 5, 105, 0, 0, 3155, 3156, 5, 110, 0, 0, 3156, 3157, 5, 100, 0, 0, 3157, 3158, 5, 46, 0, 0, 3158, 3159, 5, 105, 0, 0, 3159, 4033, 5, 49, 0, 0, 3160, 3161, 5, 115, 0, 0, 3161, 3162, 5, 116, 0, 0, 3162, 3163, 5, 105, 0, 0, 3163, 3164, 5, 110, 0, 0, 3164, 3165, 5, 100, 0, 0, 3165, 3166, 5, 46, 0, 0, 3166, 3167, 5, 105, 0, 0, 3167, 4033, 5, 50, 0, 0, 3168, 3169, 5, 115, 0, 0, 3169, 3170, 5, 116, 0, 0, 3170, 3171, 5, 105, 0, 0, 3171, 3172, 5, 110, 0, 0, 3172, 3173, 5, 100, 0, 0, 3173, 3174, 5, 46, 0, 0, 3174, 3175, 5, 105, 0, 0, 3175, 4033, 5, 52, 0, 0, 3176, 3177, 5, 115, 0, 0, 3177, 3178, 5, 116, 0, 0, 3178, 3179, 5, 105, 0, 0, 3179, 3180, 5, 110, 0, 0, 3180, 3181, 5, 100, 0, 0, 3181, 3182, 5, 46, 0, 0, 3182, 3183, 5, 105, 0, 0, 3183, 4033, 5, 56, 0, 0, 3184, 3185, 5, 115, 0, 0, 3185, 3186, 5, 116, 0, 0, 3186, 3187, 5, 105, 0, 0, 3187, 3188, 5, 110, 0, 0, 3188, 3189, 5, 100, 0, 0, 3189, 3190, 5, 46, 0, 0, 3190, 3191, 5, 114, 0, 0, 3191, 4033, 5, 52, 0, 0, 3192, 3193, 5, 115, 0, 0, 3193, 3194, 5, 116, 0, 0, 3194, 3195, 5, 105, 0, 0, 3195, 3196, 5, 110, 0, 0, 3196, 3197, 5, 100, 0, 0, 3197, 3198, 5, 46, 0, 0, 3198, 3199, 5, 114, 0, 0, 3199, 4033, 5, 56, 0, 0, 3200, 3201, 5, 97, 0, 0, 3201, 3202, 5, 100, 0, 0, 3202, 4033, 5, 100, 0, 0, 3203, 3204, 5, 115, 0, 0, 3204, 3205, 5, 117, 0, 0, 3205, 4033, 5, 98, 0, 0, 3206, 3207, 5, 109, 0, 0, 3207, 3208, 5, 117, 0, 0, 3208, 4033, 5, 108, 0, 0, 3209, 3210, 5, 100, 0, 0, 3210, 3211, 5, 105, 0, 0, 3211, 4033, 5, 118, 0, 0, 3212, 3213, 5, 100, 0, 0, 3213, 3214, 5, 105, 0, 0, 3214, 3215, 5, 118, 0, 0, 3215, 3216, 5, 46, 0, 0, 3216, 3217, 5, 117, 0, 0, 3217, 4033, 5, 110, 0, 0, 3218, 3219, 5, 114, 0, 0, 3219, 3220, 5, 101, 0, 0, 3220, 4033, 5, 109, 0, 0, 3221, 3222, 5, 114, 0, 0, 3222, 3223, 5, 101, 0, 0, 3223, 3224, 5, 109, 0, 0, 3224, 3225, 5, 46, 0, 0, 3225, 3226, 5, 117, 0, 0, 3226, 4033, 5, 110, 0, 0, 3227, 3228, 5, 97, 0, 0, 3228, 3229, 5, 110, 0, 0, 3229, 4033, 5, 100, 0, 0, 3230, 3231, 5, 111, 0, 0, 3231, 4033, 5, 114, 0, 0, 3232, 3233, 5, 120, 0, 0, 3233, 3234, 5, 111, 0, 0, 3234, 4033, 5, 114, 0, 0, 3235, 3236, 5, 115, 0, 0, 3236, 3237, 5, 104, 0, 0, 3237, 4033, 5, 108, 0, 0, 3238, 3239, 5, 115, 0, 0, 3239, 3240, 5, 104, 0, 0, 3240, 4033, 5, 114, 0, 0, 3241, 3242, 5, 115, 0, 0, 3242, 3243, 5, 104, 0, 0, 3243, 3244, 5, 114, 0, 0, 3244, 3245, 5, 46, 0, 0, 3245, 3246, 5, 117, 0, 0, 3246, 4033, 5, 110, 0, 0, 3247, 3248, 5, 110, 0, 0, 3248, 3249, 5, 101, 0, 0, 3249, 4033, 5, 103, 0, 0, 3250, 3251, 5, 110, 0, 0, 3251, 3252, 5, 111, 0, 0, 3252, 4033, 5, 116, 0, 0, 3253, 3254, 5, 99, 0, 0, 3254, 3255, 5, 111, 0, 0, 3255, 3256, 5, 110, 0, 0, 3256, 3257, 5, 118, 0, 0, 3257, 3258, 5, 46, 0, 0, 3258, 3259, 5, 105, 0, 0, 3259, 4033, 5, 49, 0, 0, 3260, 3261, 5, 99, 0, 0, 3261, 3262, 5, 111, 0, 0, 3262, 3263, 5, 110, 0, 0, 3263, 3264, 5, 118, 0, 0, 3264, 3265, 5, 46, 0, 0, 3265, 3266, 5, 105, 0, 0, 3266, 4033, 5, 50, 0, 0, 3267, 3268, 5, 99, 0, 0, 3268, 3269, 5, 111, 0, 0, 3269, 3270, 5, 110, 0, 0, 3270, 3271, 5, 118, 0, 0, 3271, 3272, 5, 46, 0, 0, 3272, 3273, 5, 105, 0, 0, 3273, 4033, 5, 52, 0, 0, 3274, 3275, 5, 99, 0, 0, 3275, 3276, 5, 111, 0, 0, 3276, 3277, 5, 110, 0, 0, 3277, 3278, 5, 118, 0, 0, 3278, 3279, 5, 46, 0, 0, 3279, 3280, 5, 105, 0, 0, 3280, 4033, 5, 56, 0, 0, 3281, 3282, 5, 99, 0, 0, 3282, 3283, 5, 111, 0, 0, 3283, 3284, 5, 110, 0, 0, 3284, 3285, 5, 118, 0, 0, 3285, 3286, 5, 46, 0, 0, 3286, 3287, 5, 114, 0, 0, 3287, 4033, 5, 52, 0, 0, 3288, 3289, 5, 99, 0, 0, 3289, 3290, 5, 111, 0, 0, 3290, 3291, 5, 110, 0, 0, 3291, 3292, 5, 118, 0, 0, 3292, 3293, 5, 46, 0, 0, 3293, 3294, 5, 114, 0, 0, 3294, 4033, 5, 56, 0, 0, 3295, 3296, 5, 99, 0, 0, 3296, 3297, 5, 111, 0, 0, 3297, 3298, 5, 110, 0, 0, 3298, 3299, 5, 118, 0, 0, 3299, 3300, 5, 46, 0, 0, 3300, 3301, 5, 117, 0, 0, 3301, 4033, 5, 52, 0, 0, 3302, 3303, 5, 99, 0, 0, 3303, 3304, 5, 111, 0, 0, 3304, 3305, 5, 110, 0, 0, 3305, 3306, 5, 118, 0, 0, 3306, 3307, 5, 46, 0, 0, 3307, 3308, 5, 117, 0, 0, 3308, 4033, 5, 56, 0, 0, 3309, 3310, 5, 99, 0, 0, 3310, 3311, 5, 111, 0, 0, 3311, 3312, 5, 110, 0, 0, 3312, 3313, 5, 118, 0, 0, 3313, 3314, 5, 46, 0, 0, 3314, 3315, 5, 114, 0, 0, 3315, 3316, 5, 46, 0, 0, 3316, 3317, 5, 117, 0, 0, 3317, 4033, 5, 110, 0, 0, 3318, 3319, 5, 116, 0, 0, 3319, 3320, 5, 104, 0, 0, 3320, 3321, 5, 114, 0, 0, 3321, 3322, 5, 111, 0, 0, 3322, 4033, 5, 119, 0, 0, 3323, 3324, 5, 99, 0, 0, 3324, 3325, 5, 111, 0, 0, 3325, 3326, 5, 110, 0, 0, 3326, 3327, 5, 118, 0, 0, 3327, 3328, 5, 46, 0, 0, 3328, 3329, 5, 111, 0, 0, 3329, 3330, 5, 118, 0, 0, 3330, 3331, 5, 102, 0, 0, 3331, 3332, 5, 46, 0, 0, 3332, 3333, 5, 105, 0, 0, 3333, 3334, 5, 49, 0, 0, 3334, 3335, 5, 46, 0, 0, 3335, 3336, 5, 117, 0, 0, 3336, 4033, 5, 110, 0, 0, 3337, 3338, 5, 99, 0, 0, 3338, 3339, 5, 111, 0, 0, 3339, 3340, 5, 110, 0, 0, 3340, 3341, 5, 118, 0, 0, 3341, 3342, 5, 46, 0, 0, 3342, 3343, 5, 111, 0, 0, 3343, 3344, 5, 118, 0, 0, 3344, 3345, 5, 102, 0, 0, 3345, 3346, 5, 46, 0, 0, 3346, 3347, 5, 105, 0, 0, 3347, 3348, 5, 50, 0, 0, 3348, 3349, 5, 46, 0, 0, 3349, 3350, 5, 117, 0, 0, 3350, 4033, 5, 110, 0, 0, 3351, 3352, 5, 99, 0, 0, 3352, 3353, 5, 111, 0, 0, 3353, 3354, 5, 110, 0, 0, 3354, 3355, 5, 118, 0, 0, 3355, 3356, 5, 46, 0, 0, 3356, 3357, 5, 111, 0, 0, 3357, 3358, 5, 118, 0, 0, 3358, 3359, 5, 102, 0, 0, 3359, 3360, 5, 46, 0, 0, 3360, 3361, 5, 105, 0, 0, 3361, 3362, 5, 52, 0, 0, 3362, 3363, 5, 46, 0, 0, 3363, 3364, 5, 117, 0, 0, 3364, 4033, 5, 110, 0, 0, 3365, 3366, 5, 99, 0, 0, 3366, 3367, 5, 111, 0, 0, 3367, 3368, 5, 110, 0, 0, 3368, 3369, 5, 118, 0, 0, 3369, 3370, 5, 46, 0, 0, 3370, 3371, 5, 111, 0, 0, 3371, 3372, 5, 118, 0, 0, 3372, 3373, 5, 102, 0, 0, 3373, 3374, 5, 46, 0, 0, 3374, 3375, 5, 105, 0, 0, 3375, 3376, 5, 56, 0, 0, 3376, 3377, 5, 46, 0, 0, 3377, 3378, 5, 117, 0, 0, 3378, 4033, 5, 110, 0, 0, 3379, 3380, 5, 99, 0, 0, 3380, 3381, 5, 111, 0, 0, 3381, 3382, 5, 110, 0, 0, 3382, 3383, 5, 118, 0, 0, 3383, 3384, 5, 46, 0, 0, 3384, 3385, 5, 111, 0, 0, 3385, 3386, 5, 118, 0, 0, 3386, 3387, 5, 102, 0, 0, 3387, 3388, 5, 46, 0, 0, 3388, 3389, 5, 117, 0, 0, 3389, 3390, 5, 49, 0, 0, 3390, 3391, 5, 46, 0, 0, 3391, 3392, 5, 117, 0, 0, 3392, 4033, 5, 110, 0, 0, 3393, 3394, 5, 99, 0, 0, 3394, 3395, 5, 111, 0, 0, 3395, 3396, 5, 110, 0, 0, 3396, 3397, 5, 118, 0, 0, 3397, 3398, 5, 46, 0, 0, 3398, 3399, 5, 111, 0, 0, 3399, 3400, 5, 118, 0, 0, 3400, 3401, 5, 102, 0, 0, 3401, 3402, 5, 46, 0, 0, 3402, 3403, 5, 117, 0, 0, 3403, 3404, 5, 50, 0, 0, 3404, 3405, 5, 46, 0, 0, 3405, 3406, 5, 117, 0, 0, 3406, 4033, 5, 110, 0, 0, 3407, 3408, 5, 99, 0, 0, 3408, 3409, 5, 111, 0, 0, 3409, 3410, 5, 110, 0, 0, 3410, 3411, 5, 118, 0, 0, 3411, 3412, 5, 46, 0, 0, 3412, 3413, 5, 111, 0, 0, 3413, 3414, 5, 118, 0, 0, 3414, 3415, 5, 102, 0, 0, 3415, 3416, 5, 46, 0, 0, 3416, 3417, 5, 117, 0, 0, 3417, 3418, 5, 52, 0, 0, 3418, 3419, 5, 46, 0, 0, 3419, 3420, 5, 117, 0, 0, 3420, 4033, 5, 110, 0, 0, 3421, 3422, 5, 99, 0, 0, 3422, 3423, 5, 111, 0, 0, 3423, 3424, 5, 110, 0, 0, 3424, 3425, 5, 118, 0, 0, 3425, 3426, 5, 46, 0, 0, 3426, 3427, 5, 111, 0, 0, 3427, 3428, 5, 118, 0, 0, 3428, 3429, 5, 102, 0, 0, 3429, 3430, 5, 46, 0, 0, 3430, 3431, 5, 117, 0, 0, 3431, 3432, 5, 56, 0, 0, 3432, 3433, 5, 46, 0, 0, 3433, 3434, 5, 117, 0, 0, 3434, 4033, 5, 110, 0, 0, 3435, 3436, 5, 99, 0, 0, 3436, 3437, 5, 111, 0, 0, 3437, 3438, 5, 110, 0, 0, 3438, 3439, 5, 118, 0, 0, 3439, 3440, 5, 46, 0, 0, 3440, 3441, 5, 111, 0, 0, 3441, 3442, 5, 118, 0, 0, 3442, 3443, 5, 102, 0, 0, 3443, 3444, 5, 46, 0, 0, 3444, 3445, 5, 105, 0, 0, 3445, 3446, 5, 46, 0, 0, 3446, 3447, 5, 117, 0, 0, 3447, 4033, 5, 110, 0, 0, 3448, 3449, 5, 99, 0, 0, 3449, 3450, 5, 111, 0, 0, 3450, 3451, 5, 110, 0, 0, 3451, 3452, 5, 118, 0, 0, 3452, 3453, 5, 46, 0, 0, 3453, 3454, 5, 111, 0, 0, 3454, 3455, 5, 118, 0, 0, 3455, 3456, 5, 102, 0, 0, 3456, 3457, 5, 46, 0, 0, 3457, 3458, 5, 117, 0, 0, 3458, 3459, 5, 46, 0, 0, 3459, 3460, 5, 117, 0, 0, 3460, 4033, 5, 110, 0, 0, 3461, 3462, 5, 108, 0, 0, 3462, 3463, 5, 100, 0, 0, 3463, 3464, 5, 108, 0, 0, 3464, 3465, 5, 101, 0, 0, 3465, 4033, 5, 110, 0, 0, 3466, 3467, 5, 108, 0, 0, 3467, 3468, 5, 100, 0, 0, 3468, 3469, 5, 101, 0, 0, 3469, 3470, 5, 108, 0, 0, 3470, 3471, 5, 101, 0, 0, 3471, 3472, 5, 109, 0, 0, 3472, 3473, 5, 46, 0, 0, 3473, 3474, 5, 105, 0, 0, 3474, 4033, 5, 49, 0, 0, 3475, 3476, 5, 108, 0, 0, 3476, 3477, 5, 100, 0, 0, 3477, 3478, 5, 101, 0, 0, 3478, 3479, 5, 108, 0, 0, 3479, 3480, 5, 101, 0, 0, 3480, 3481, 5, 109, 0, 0, 3481, 3482, 5, 46, 0, 0, 3482, 3483, 5, 117, 0, 0, 3483, 4033, 5, 49, 0, 0, 3484, 3485, 5, 108, 0, 0, 3485, 3486, 5, 100, 0, 0, 3486, 3487, 5, 101, 0, 0, 3487, 3488, 5, 108, 0, 0, 3488, 3489, 5, 101, 0, 0, 3489, 3490, 5, 109, 0, 0, 3490, 3491, 5, 46, 0, 0, 3491, 3492, 5, 105, 0, 0, 3492, 4033, 5, 50, 0, 0, 3493, 3494, 5, 108, 0, 0, 3494, 3495, 5, 100, 0, 0, 3495, 3496, 5, 101, 0, 0, 3496, 3497, 5, 108, 0, 0, 3497, 3498, 5, 101, 0, 0, 3498, 3499, 5, 109, 0, 0, 3499, 3500, 5, 46, 0, 0, 3500, 3501, 5, 117, 0, 0, 3501, 4033, 5, 50, 0, 0, 3502, 3503, 5, 108, 0, 0, 3503, 3504, 5, 100, 0, 0, 3504, 3505, 5, 101, 0, 0, 3505, 3506, 5, 108, 0, 0, 3506, 3507, 5, 101, 0, 0, 3507, 3508, 5, 109, 0, 0, 3508, 3509, 5, 46, 0, 0, 3509, 3510, 5, 105, 0, 0, 3510, 4033, 5, 52, 0, 0, 3511, 3512, 5, 108, 0, 0, 3512, 3513, 5, 100, 0, 0, 3513, 3514, 5, 101, 0, 0, 3514, 3515, 5, 108, 0, 0, 3515, 3516, 5, 101, 0, 0, 3516, 3517, 5, 109, 0, 0, 3517, 3518, 5, 46, 0, 0, 3518, 3519, 5, 117, 0, 0, 3519, 4033, 5, 52, 0, 0, 3520, 3521, 5, 108, 0, 0, 3521, 3522, 5, 100, 0, 0, 3522, 3523, 5, 101, 0, 0, 3523, 3524, 5, 108, 0, 0, 3524, 3525, 5, 101, 0, 0, 3525, 3526, 5, 109, 0, 0, 3526, 3527, 5, 46, 0, 0, 3527, 3528, 5, 105, 0, 0, 3528, 4033, 5, 56, 0, 0, 3529, 3530, 5, 108, 0, 0, 3530, 3531, 5, 100, 0, 0, 3531, 3532, 5, 101, 0, 0, 3532, 3533, 5, 108, 0, 0, 3533, 3534, 5, 101, 0, 0, 3534, 3535, 5, 109, 0, 0, 3535, 3536, 5, 46, 0, 0, 3536, 3537, 5, 117, 0, 0, 3537, 4033, 5, 56, 0, 0, 3538, 3539, 5, 108, 0, 0, 3539, 3540, 5, 100, 0, 0, 3540, 3541, 5, 101, 0, 0, 3541, 3542, 5, 108, 0, 0, 3542, 3543, 5, 101, 0, 0, 3543, 3544, 5, 109, 0, 0, 3544, 3545, 5, 46, 0, 0, 3545, 4033, 5, 105, 0, 0, 3546, 3547, 5, 108, 0, 0, 3547, 3548, 5, 100, 0, 0, 3548, 3549, 5, 101, 0, 0, 3549, 3550, 5, 108, 0, 0, 3550, 3551, 5, 101, 0, 0, 3551, 3552, 5, 109, 0, 0, 3552, 3553, 5, 46, 0, 0, 3553, 3554, 5, 114, 0, 0, 3554, 4033, 5, 52, 0, 0, 3555, 3556, 5, 108, 0, 0, 3556, 3557, 5, 100, 0, 0, 3557, 3558, 5, 101, 0, 0, 3558, 3559, 5, 108, 0, 0, 3559, 3560, 5, 101, 0, 0, 3560, 3561, 5, 109, 0, 0, 3561, 3562, 5, 46, 0, 0, 3562, 3563, 5, 114, 0, 0, 3563, 4033, 5, 56, 0, 0, 3564, 3565, 5, 108, 0, 0, 3565, 3566, 5, 100, 0, 0, 3566, 3567, 5, 101, 0, 0, 3567, 3568, 5, 108, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 5, 109, 0, 0, 3570, 3571, 5, 46, 0, 0, 3571, 3572, 5, 114, 0, 0, 3572, 3573, 5, 101, 0, 0, 3573, 4033, 5, 102, 0, 0, 3574, 3575, 5, 115, 0, 0, 3575, 3576, 5, 116, 0, 0, 3576, 3577, 5, 101, 0, 0, 3577, 3578, 5, 108, 0, 0, 3578, 3579, 5, 101, 0, 0, 3579, 3580, 5, 109, 0, 0, 3580, 3581, 5, 46, 0, 0, 3581, 4033, 5, 105, 0, 0, 3582, 3583, 5, 115, 0, 0, 3583, 3584, 5, 116, 0, 0, 3584, 3585, 5, 101, 0, 0, 3585, 3586, 5, 108, 0, 0, 3586, 3587, 5, 101, 0, 0, 3587, 3588, 5, 109, 0, 0, 3588, 3589, 5, 46, 0, 0, 3589, 3590, 5, 105, 0, 0, 3590, 4033, 5, 49, 0, 0, 3591, 3592, 5, 115, 0, 0, 3592, 3593, 5, 116, 0, 0, 3593, 3594, 5, 101, 0, 0, 3594, 3595, 5, 108, 0, 0, 3595, 3596, 5, 101, 0, 0, 3596, 3597, 5, 109, 0, 0, 3597, 3598, 5, 46, 0, 0, 3598, 3599, 5, 105, 0, 0, 3599, 4033, 5, 50, 0, 0, 3600, 3601, 5, 115, 0, 0, 3601, 3602, 5, 116, 0, 0, 3602, 3603, 5, 101, 0, 0, 3603, 3604, 5, 108, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 109, 0, 0, 3606, 3607, 5, 46, 0, 0, 3607, 3608, 5, 105, 0, 0, 3608, 4033, 5, 52, 0, 0, 3609, 3610, 5, 115, 0, 0, 3610, 3611, 5, 116, 0, 0, 3611, 3612, 5, 101, 0, 0, 3612, 3613, 5, 108, 0, 0, 3613, 3614, 5, 101, 0, 0, 3614, 3615, 5, 109, 0, 0, 3615, 3616, 5, 46, 0, 0, 3616, 3617, 5, 105, 0, 0, 3617, 4033, 5, 56, 0, 0, 3618, 3619, 5, 115, 0, 0, 3619, 3620, 5, 116, 0, 0, 3620, 3621, 5, 101, 0, 0, 3621, 3622, 5, 108, 0, 0, 3622, 3623, 5, 101, 0, 0, 3623, 3624, 5, 109, 0, 0, 3624, 3625, 5, 46, 0, 0, 3625, 3626, 5, 114, 0, 0, 3626, 4033, 5, 52, 0, 0, 3627, 3628, 5, 115, 0, 0, 3628, 3629, 5, 116, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 108, 0, 0, 3631, 3632, 5, 101, 0, 0, 3632, 3633, 5, 109, 0, 0, 3633, 3634, 5, 46, 0, 0, 3634, 3635, 5, 114, 0, 0, 3635, 4033, 5, 56, 0, 0, 3636, 3637, 5, 115, 0, 0, 3637, 3638, 5, 116, 0, 0, 3638, 3639, 5, 101, 0, 0, 3639, 3640, 5, 108, 0, 0, 3640, 3641, 5, 101, 0, 0, 3641, 3642, 5, 109, 0, 0, 3642, 3643, 5, 46, 0, 0, 3643, 3644, 5, 114, 0, 0, 3644, 3645, 5, 101, 0, 0, 3645, 4033, 5, 102, 0, 0, 3646, 3647, 5, 99, 0, 0, 3647, 3648, 5, 111, 0, 0, 3648, 3649, 5, 110, 0, 0, 3649, 3650, 5, 118, 0, 0, 3650, 3651, 5, 46, 0, 0, 3651, 3652, 5, 111, 0, 0, 3652, 3653, 5, 118, 0, 0, 3653, 3654, 5, 102, 0, 0, 3654, 3655, 5, 46, 0, 0, 3655, 3656, 5, 105, 0, 0, 3656, 4033, 5, 49, 0, 0, 3657, 3658, 5, 99, 0, 0, 3658, 3659, 5, 111, 0, 0, 3659, 3660, 5, 110, 0, 0, 3660, 3661, 5, 118, 0, 0, 3661, 3662, 5, 46, 0, 0, 3662, 3663, 5, 111, 0, 0, 3663, 3664, 5, 118, 0, 0, 3664, 3665, 5, 102, 0, 0, 3665, 3666, 5, 46, 0, 0, 3666, 3667, 5, 117, 0, 0, 3667, 4033, 5, 49, 0, 0, 3668, 3669, 5, 99, 0, 0, 3669, 3670, 5, 111, 0, 0, 3670, 3671, 5, 110, 0, 0, 3671, 3672, 5, 118, 0, 0, 3672, 3673, 5, 46, 0, 0, 3673, 3674, 5, 111, 0, 0, 3674, 3675, 5, 118, 0, 0, 3675, 3676, 5, 102, 0, 0, 3676, 3677, 5, 46, 0, 0, 3677, 3678, 5, 105, 0, 0, 3678, 4033, 5, 50, 0, 0, 3679, 3680, 5, 99, 0, 0, 3680, 3681, 5, 111, 0, 0, 3681, 3682, 5, 110, 0, 0, 3682, 3683, 5, 118, 0, 0, 3683, 3684, 5, 46, 0, 0, 3684, 3685, 5, 111, 0, 0, 3685, 3686, 5, 118, 0, 0, 3686, 3687, 5, 102, 0, 0, 3687, 3688, 5, 46, 0, 0, 3688, 3689, 5, 117, 0, 0, 3689, 4033, 5, 50, 0, 0, 3690, 3691, 5, 99, 0, 0, 3691, 3692, 5, 111, 0, 0, 3692, 3693, 5, 110, 0, 0, 3693, 3694, 5, 118, 0, 0, 3694, 3695, 5, 46, 0, 0, 3695, 3696, 5, 111, 0, 0, 3696, 3697, 5, 118, 0, 0, 3697, 3698, 5, 102, 0, 0, 3698, 3699, 5, 46, 0, 0, 3699, 3700, 5, 105, 0, 0, 3700, 4033, 5, 52, 0, 0, 3701, 3702, 5, 99, 0, 0, 3702, 3703, 5, 111, 0, 0, 3703, 3704, 5, 110, 0, 0, 3704, 3705, 5, 118, 0, 0, 3705, 3706, 5, 46, 0, 0, 3706, 3707, 5, 111, 0, 0, 3707, 3708, 5, 118, 0, 0, 3708, 3709, 5, 102, 0, 0, 3709, 3710, 5, 46, 0, 0, 3710, 3711, 5, 117, 0, 0, 3711, 4033, 5, 52, 0, 0, 3712, 3713, 5, 99, 0, 0, 3713, 3714, 5, 111, 0, 0, 3714, 3715, 5, 110, 0, 0, 3715, 3716, 5, 118, 0, 0, 3716, 3717, 5, 46, 0, 0, 3717, 3718, 5, 111, 0, 0, 3718, 3719, 5, 118, 0, 0, 3719, 3720, 5, 102, 0, 0, 3720, 3721, 5, 46, 0, 0, 3721, 3722, 5, 105, 0, 0, 3722, 4033, 5, 56, 0, 0, 3723, 3724, 5, 99, 0, 0, 3724, 3725, 5, 111, 0, 0, 3725, 3726, 5, 110, 0, 0, 3726, 3727, 5, 118, 0, 0, 3727, 3728, 5, 46, 0, 0, 3728, 3729, 5, 111, 0, 0, 3729, 3730, 5, 118, 0, 0, 3730, 3731, 5, 102, 0, 0, 3731, 3732, 5, 46, 0, 0, 3732, 3733, 5, 117, 0, 0, 3733, 4033, 5, 56, 0, 0, 3734, 3735, 5, 99, 0, 0, 3735, 3736, 5, 107, 0, 0, 3736, 3737, 5, 102, 0, 0, 3737, 3738, 5, 105, 0, 0, 3738, 3739, 5, 110, 0, 0, 3739, 3740, 5, 105, 0, 0, 3740, 3741, 5, 116, 0, 0, 3741, 4033, 5, 101, 0, 0, 3742, 3743, 5, 99, 0, 0, 3743, 3744, 5, 111, 0, 0, 3744, 3745, 5, 110, 0, 0, 3745, 3746, 5, 118, 0, 0, 3746, 3747, 5, 46, 0, 0, 3747, 3748, 5, 117, 0, 0, 3748, 4033, 5, 50, 0, 0, 3749, 3750, 5, 99, 0, 0, 3750, 3751, 5, 111, 0, 0, 3751, 3752, 5, 110, 0, 0, 3752, 3753, 5, 118, 0, 0, 3753, 3754, 5, 46, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 4033, 5, 49, 0, 0, 3756, 3757, 5, 99, 0, 0, 3757, 3758, 5, 111, 0, 0, 3758, 3759, 5, 110, 0, 0, 3759, 3760, 5, 118, 0, 0, 3760, 3761, 5, 46, 0, 0, 3761, 4033, 5, 105, 0, 0, 3762, 3763, 5, 99, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 110, 0, 0, 3765, 3766, 5, 118, 0, 0, 3766, 3767, 5, 46, 0, 0, 3767, 3768, 5, 111, 0, 0, 3768, 3769, 5, 118, 0, 0, 3769, 3770, 5, 102, 0, 0, 3770, 3771, 5, 46, 0, 0, 3771, 4033, 5, 105, 0, 0, 3772, 3773, 5, 99, 0, 0, 3773, 3774, 5, 111, 0, 0, 3774, 3775, 5, 110, 0, 0, 3775, 3776, 5, 118, 0, 0, 3776, 3777, 5, 46, 0, 0, 3777, 3778, 5, 111, 0, 0, 3778, 3779, 5, 118, 0, 0, 3779, 3780, 5, 102, 0, 0, 3780, 3781, 5, 46, 0, 0, 3781, 4033, 5, 117, 0, 0, 3782, 3783, 5, 97, 0, 0, 3783, 3784, 5, 100, 0, 0, 3784, 3785, 5, 100, 0, 0, 3785, 3786, 5, 46, 0, 0, 3786, 3787, 5, 111, 0, 0, 3787, 3788, 5, 118, 0, 0, 3788, 4033, 5, 102, 0, 0, 3789, 3790, 5, 97, 0, 0, 3790, 3791, 5, 100, 0, 0, 3791, 3792, 5, 100, 0, 0, 3792, 3793, 5, 46, 0, 0, 3793, 3794, 5, 111, 0, 0, 3794, 3795, 5, 118, 0, 0, 3795, 3796, 5, 102, 0, 0, 3796, 3797, 5, 46, 0, 0, 3797, 3798, 5, 117, 0, 0, 3798, 4033, 5, 110, 0, 0, 3799, 3800, 5, 109, 0, 0, 3800, 3801, 5, 117, 0, 0, 3801, 3802, 5, 108, 0, 0, 3802, 3803, 5, 46, 0, 0, 3803, 3804, 5, 111, 0, 0, 3804, 3805, 5, 118, 0, 0, 3805, 4033, 5, 102, 0, 0, 3806, 3807, 5, 109, 0, 0, 3807, 3808, 5, 117, 0, 0, 3808, 3809, 5, 108, 0, 0, 3809, 3810, 5, 46, 0, 0, 3810, 3811, 5, 111, 0, 0, 3811, 3812, 5, 118, 0, 0, 3812, 3813, 5, 102, 0, 0, 3813, 3814, 5, 46, 0, 0, 3814, 3815, 5, 117, 0, 0, 3815, 4033, 5, 110, 0, 0, 3816, 3817, 5, 115, 0, 0, 3817, 3818, 5, 117, 0, 0, 3818, 3819, 5, 98, 0, 0, 3819, 3820, 5, 46, 0, 0, 3820, 3821, 5, 111, 0, 0, 3821, 3822, 5, 118, 0, 0, 3822, 4033, 5, 102, 0, 0, 3823, 3824, 5, 115, 0, 0, 3824, 3825, 5, 117, 0, 0, 3825, 3826, 5, 98, 0, 0, 3826, 3827, 5, 46, 0, 0, 3827, 3828, 5, 111, 0, 0, 3828, 3829, 5, 118, 0, 0, 3829, 3830, 5, 102, 0, 0, 3830, 3831, 5, 46, 0, 0, 3831, 3832, 5, 117, 0, 0, 3832, 4033, 5, 110, 0, 0, 3833, 3834, 5, 101, 0, 0, 3834, 3835, 5, 110, 0, 0, 3835, 3836, 5, 100, 0, 0, 3836, 3837, 5, 102, 0, 0, 3837, 3838, 5, 105, 0, 0, 3838, 3839, 5, 110, 0, 0, 3839, 3840, 5, 97, 0, 0, 3840, 3841, 5, 108, 0, 0, 3841, 3842, 5, 108, 0, 0, 3842, 4033, 5, 121, 0, 0, 3843, 3844, 5, 101, 0, 0, 3844, 3845, 5, 110, 0, 0, 3845, 3846, 5, 100, 0, 0, 3846, 3847, 5, 102, 0, 0, 3847, 3848, 5, 97, 0, 0, 3848, 3849, 5, 117, 0, 0, 3849, 3850, 5, 108, 0, 0, 3850, 4033, 5, 116, 0, 0, 3851, 3852, 5, 115, 0, 0, 3852, 3853, 5, 116, 0, 0, 3853, 3854, 5, 105, 0, 0, 3854, 3855, 5, 110, 0, 0, 3855, 3856, 5, 100, 0, 0, 3856, 3857, 5, 46, 0, 0, 3857, 4033, 5, 105, 0, 0, 3858, 3859, 5, 99, 0, 0, 3859, 3860, 5, 111, 0, 0, 3860, 3861, 5, 110, 0, 0, 3861, 3862, 5, 118, 0, 0, 3862, 3863, 5, 46, 0, 0, 3863, 4033, 5, 117, 0, 0, 3864, 3865, 5, 112, 0, 0, 3865, 3866, 5, 114, 0, 0, 3866, 3867, 5, 101, 0, 0, 3867, 3868, 5, 102, 0, 0, 3868, 3869, 5, 105, 0, 0, 3869, 3870, 5, 120, 0, 0, 3870, 4033, 5, 55, 0, 0, 3871, 3872, 5, 112, 0, 0, 3872, 3873, 5, 114, 0, 0, 3873, 3874, 5, 101, 0, 0, 3874, 3875, 5, 102, 0, 0, 3875, 3876, 5, 105, 0, 0, 3876, 3877, 5, 120, 0, 0, 3877, 4033, 5, 54, 0, 0, 3878, 3879, 5, 112, 0, 0, 3879, 3880, 5, 114, 0, 0, 3880, 3881, 5, 101, 0, 0, 3881, 3882, 5, 102, 0, 0, 3882, 3883, 5, 105, 0, 0, 3883, 3884, 5, 120, 0, 0, 3884, 4033, 5, 53, 0, 0, 3885, 3886, 5, 112, 0, 0, 3886, 3887, 5, 114, 0, 0, 3887, 3888, 5, 101, 0, 0, 3888, 3889, 5, 102, 0, 0, 3889, 3890, 5, 105, 0, 0, 3890, 3891, 5, 120, 0, 0, 3891, 4033, 5, 52, 0, 0, 3892, 3893, 5, 112, 0, 0, 3893, 3894, 5, 114, 0, 0, 3894, 3895, 5, 101, 0, 0, 3895, 3896, 5, 102, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 120, 0, 0, 3898, 4033, 5, 51, 0, 0, 3899, 3900, 5, 112, 0, 0, 3900, 3901, 5, 114, 0, 0, 3901, 3902, 5, 101, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 105, 0, 0, 3904, 3905, 5, 120, 0, 0, 3905, 4033, 5, 50, 0, 0, 3906, 3907, 5, 112, 0, 0, 3907, 3908, 5, 114, 0, 0, 3908, 3909, 5, 101, 0, 0, 3909, 3910, 5, 102, 0, 0, 3910, 3911, 5, 105, 0, 0, 3911, 3912, 5, 120, 0, 0, 3912, 4033, 5, 49, 0, 0, 3913, 3914, 5, 112, 0, 0, 3914, 3915, 5, 114, 0, 0, 3915, 3916, 5, 101, 0, 0, 3916, 3917, 5, 102, 0, 0, 3917, 3918, 5, 105, 0, 0, 3918, 3919, 5, 120, 0, 0, 3919, 3920, 5, 114, 0, 0, 3920, 3921, 5, 101, 0, 0, 3921, 4033, 5, 102, 0, 0, 3922, 3923, 5, 97, 0, 0, 3923, 3924, 5, 114, 0, 0, 3924, 3925, 5, 103, 0, 0, 3925, 3926, 5, 108, 0, 0, 3926, 3927, 5, 105, 0, 0, 3927, 3928, 5, 115, 0, 0, 3928, 4033, 5, 116, 0, 0, 3929, 3930, 5, 99, 0, 0, 3930, 3931, 5, 101, 0, 0, 3931, 4033, 5, 113, 0, 0, 3932, 3933, 5, 99, 0, 0, 3933, 3934, 5, 103, 0, 0, 3934, 4033, 5, 116, 0, 0, 3935, 3936, 5, 99, 0, 0, 3936, 3937, 5, 103, 0, 0, 3937, 3938, 5, 116, 0, 0, 3938, 3939, 5, 46, 0, 0, 3939, 3940, 5, 117, 0, 0, 3940, 4033, 5, 110, 0, 0, 3941, 3942, 5, 99, 0, 0, 3942, 3943, 5, 108, 0, 0, 3943, 4033, 5, 116, 0, 0, 3944, 3945, 5, 99, 0, 0, 3945, 3946, 5, 108, 0, 0, 3946, 3947, 5, 116, 0, 0, 3947, 3948, 5, 46, 0, 0, 3948, 3949, 5, 117, 0, 0, 3949, 4033, 5, 110, 0, 0, 3950, 3951, 5, 108, 0, 0, 3951, 3952, 5, 111, 0, 0, 3952, 3953, 5, 99, 0, 0, 3953, 3954, 5, 97, 0, 0, 3954, 3955, 5, 108, 0, 0, 3955, 3956, 5, 108, 0, 0, 3956, 3957, 5, 111, 0, 0, 3957, 4033, 5, 99, 0, 0, 3958, 3959, 5, 101, 0, 0, 3959, 3960, 5, 110, 0, 0, 3960, 3961, 5, 100, 0, 0, 3961, 3962, 5, 102, 0, 0, 3962, 3963, 5, 105, 0, 0, 3963, 3964, 5, 108, 0, 0, 3964, 3965, 5, 116, 0, 0, 3965, 3966, 5, 101, 0, 0, 3966, 4033, 5, 114, 0, 0, 3967, 3968, 5, 118, 0, 0, 3968, 3969, 5, 111, 0, 0, 3969, 3970, 5, 108, 0, 0, 3970, 3971, 5, 97, 0, 0, 3971, 3972, 5, 116, 0, 0, 3972, 3973, 5, 105, 0, 0, 3973, 3974, 5, 108, 0, 0, 3974, 3975, 5, 101, 0, 0, 3975, 4033, 5, 46, 0, 0, 3976, 3977, 5, 116, 0, 0, 3977, 3978, 5, 97, 0, 0, 3978, 3979, 5, 105, 0, 0, 3979, 3980, 5, 108, 0, 0, 3980, 4033, 5, 46, 0, 0, 3981, 3982, 5, 99, 0, 0, 3982, 3983, 5, 112, 0, 0, 3983, 3984, 5, 98, 0, 0, 3984, 3985, 5, 108, 0, 0, 3985, 4033, 5, 107, 0, 0, 3986, 3987, 5, 105, 0, 0, 3987, 3988, 5, 110, 0, 0, 3988, 3989, 5, 105, 0, 0, 3989, 3990, 5, 116, 0, 0, 3990, 3991, 5, 98, 0, 0, 3991, 3992, 5, 108, 0, 0, 3992, 4033, 5, 107, 0, 0, 3993, 3994, 5, 114, 0, 0, 3994, 3995, 5, 101, 0, 0, 3995, 3996, 5, 116, 0, 0, 3996, 3997, 5, 104, 0, 0, 3997, 3998, 5, 114, 0, 0, 3998, 3999, 5, 111, 0, 0, 3999, 4033, 5, 119, 0, 0, 4000, 4001, 5, 114, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 102, 0, 0, 4003, 4004, 5, 97, 0, 0, 4004, 4005, 5, 110, 0, 0, 4005, 4006, 5, 121, 0, 0, 4006, 4007, 5, 116, 0, 0, 4007, 4008, 5, 121, 0, 0, 4008, 4009, 5, 112, 0, 0, 4009, 4033, 5, 101, 0, 0, 4010, 4011, 5, 114, 0, 0, 4011, 4012, 5, 101, 0, 0, 4012, 4013, 5, 97, 0, 0, 4013, 4014, 5, 100, 0, 0, 4014, 4015, 5, 111, 0, 0, 4015, 4016, 5, 110, 0, 0, 4016, 4017, 5, 108, 0, 0, 4017, 4018, 5, 121, 0, 0, 4018, 4033, 5, 46, 0, 0, 4019, 4020, 5, 105, 0, 0, 4020, 4021, 5, 108, 0, 0, 4021, 4022, 5, 108, 0, 0, 4022, 4023, 5, 101, 0, 0, 4023, 4024, 5, 103, 0, 0, 4024, 4025, 5, 97, 0, 0, 4025, 4033, 5, 108, 0, 0, 4026, 4027, 5, 101, 0, 0, 4027, 4028, 5, 110, 0, 0, 4028, 4029, 5, 100, 0, 0, 4029, 4030, 5, 109, 0, 0, 4030, 4031, 5, 97, 0, 0, 4031, 4033, 5, 99, 0, 0, 4032, 2850, 1, 0, 0, 0, 4032, 2853, 1, 0, 0, 0, 4032, 2858, 1, 0, 0, 0, 4032, 2865, 1, 0, 0, 0, 4032, 2872, 1, 0, 0, 0, 4032, 2879, 1, 0, 0, 0, 4032, 2886, 1, 0, 0, 0, 4032, 2893, 1, 0, 0, 0, 4032, 2900, 1, 0, 0, 0, 4032, 2907, 1, 0, 0, 0, 4032, 2914, 1, 0, 0, 0, 4032, 2921, 1, 0, 0, 0, 4032, 2928, 1, 0, 0, 0, 4032, 2935, 1, 0, 0, 0, 4032, 2942, 1, 0, 0, 0, 4032, 2948, 1, 0, 0, 0, 4032, 2957, 1, 0, 0, 0, 4032, 2966, 1, 0, 0, 0, 4032, 2974, 1, 0, 0, 0, 4032, 2982, 1, 0, 0, 0, 4032, 2990, 1, 0, 0, 0, 4032, 2998, 1, 0, 0, 0, 4032, 3006, 1, 0, 0, 0, 4032, 3014, 1, 0, 0, 0, 4032, 3022, 1, 0, 0, 0, 4032, 3030, 1, 0, 0, 0, 4032, 3038, 1, 0, 0, 0, 4032, 3041, 1, 0, 0, 0, 4032, 3044, 1, 0, 0, 0, 4032, 3047, 1, 0, 0, 0, 4032, 3055, 1, 0, 0, 0, 4032, 3063, 1, 0, 0, 0, 4032, 3071, 1, 0, 0, 0, 4032, 3079, 1, 0, 0, 0, 4032, 3087, 1, 0, 0, 0, 4032, 3095, 1, 0, 0, 0, 4032, 3103, 1, 0, 0, 0, 4032, 3111, 1, 0, 0, 0, 4032, 3118, 1, 0, 0, 0, 4032, 3126, 1, 0, 0, 0, 4032, 3134, 1, 0, 0, 0, 4032, 3143, 1, 0, 0, 0, 4032, 3152, 1, 0, 0, 0, 4032, 3160, 1, 0, 0, 0, 4032, 3168, 1, 0, 0, 0, 4032, 3176, 1, 0, 0, 0, 4032, 3184, 1, 0, 0, 0, 4032, 3192, 1, 0, 0, 0, 4032, 3200, 1, 0, 0, 0, 4032, 3203, 1, 0, 0, 0, 4032, 3206, 1, 0, 0, 0, 4032, 3209, 1, 0, 0, 0, 4032, 3212, 1, 0, 0, 0, 4032, 3218, 1, 0, 0, 0, 4032, 3221, 1, 0, 0, 0, 4032, 3227, 1, 0, 0, 0, 4032, 3230, 1, 0, 0, 0, 4032, 3232, 1, 0, 0, 0, 4032, 3235, 1, 0, 0, 0, 4032, 3238, 1, 0, 0, 0, 4032, 3241, 1, 0, 0, 0, 4032, 3247, 1, 0, 0, 0, 4032, 3250, 1, 0, 0, 0, 4032, 3253, 1, 0, 0, 0, 4032, 3260, 1, 0, 0, 0, 4032, 3267, 1, 0, 0, 0, 4032, 3274, 1, 0, 0, 0, 4032, 3281, 1, 0, 0, 0, 4032, 3288, 1, 0, 0, 0, 4032, 3295, 1, 0, 0, 0, 4032, 3302, 1, 0, 0, 0, 4032, 3309, 1, 0, 0, 0, 4032, 3318, 1, 0, 0, 0, 4032, 3323, 1, 0, 0, 0, 4032, 3337, 1, 0, 0, 0, 4032, 3351, 1, 0, 0, 0, 4032, 3365, 1, 0, 0, 0, 4032, 3379, 1, 0, 0, 0, 4032, 3393, 1, 0, 0, 0, 4032, 3407, 1, 0, 0, 0, 4032, 3421, 1, 0, 0, 0, 4032, 3435, 1, 0, 0, 0, 4032, 3448, 1, 0, 0, 0, 4032, 3461, 1, 0, 0, 0, 4032, 3466, 1, 0, 0, 0, 4032, 3475, 1, 0, 0, 0, 4032, 3484, 1, 0, 0, 0, 4032, 3493, 1, 0, 0, 0, 4032, 3502, 1, 0, 0, 0, 4032, 3511, 1, 0, 0, 0, 4032, 3520, 1, 0, 0, 0, 4032, 3529, 1, 0, 0, 0, 4032, 3538, 1, 0, 0, 0, 4032, 3546, 1, 0, 0, 0, 4032, 3555, 1, 0, 0, 0, 4032, 3564, 1, 0, 0, 0, 4032, 3574, 1, 0, 0, 0, 4032, 3582, 1, 0, 0, 0, 4032, 3591, 1, 0, 0, 0, 4032, 3600, 1, 0, 0, 0, 4032, 3609, 1, 0, 0, 0, 4032, 3618, 1, 0, 0, 0, 4032, 3627, 1, 0, 0, 0, 4032, 3636, 1, 0, 0, 0, 4032, 3646, 1, 0, 0, 0, 4032, 3657, 1, 0, 0, 0, 4032, 3668, 1, 0, 0, 0, 4032, 3679, 1, 0, 0, 0, 4032, 3690, 1, 0, 0, 0, 4032, 3701, 1, 0, 0, 0, 4032, 3712, 1, 0, 0, 0, 4032, 3723, 1, 0, 0, 0, 4032, 3734, 1, 0, 0, 0, 4032, 3742, 1, 0, 0, 0, 4032, 3749, 1, 0, 0, 0, 4032, 3756, 1, 0, 0, 0, 4032, 3762, 1, 0, 0, 0, 4032, 3772, 1, 0, 0, 0, 4032, 3782, 1, 0, 0, 0, 4032, 3789, 1, 0, 0, 0, 4032, 3799, 1, 0, 0, 0, 4032, 3806, 1, 0, 0, 0, 4032, 3816, 1, 0, 0, 0, 4032, 3823, 1, 0, 0, 0, 4032, 3833, 1, 0, 0, 0, 4032, 3843, 1, 0, 0, 0, 4032, 3851, 1, 0, 0, 0, 4032, 3858, 1, 0, 0, 0, 4032, 3864, 1, 0, 0, 0, 4032, 3871, 1, 0, 0, 0, 4032, 3878, 1, 0, 0, 0, 4032, 3885, 1, 0, 0, 0, 4032, 3892, 1, 0, 0, 0, 4032, 3899, 1, 0, 0, 0, 4032, 3906, 1, 0, 0, 0, 4032, 3913, 1, 0, 0, 0, 4032, 3922, 1, 0, 0, 0, 4032, 3929, 1, 0, 0, 0, 4032, 3932, 1, 0, 0, 0, 4032, 3935, 1, 0, 0, 0, 4032, 3941, 1, 0, 0, 0, 4032, 3944, 1, 0, 0, 0, 4032, 3950, 1, 0, 0, 0, 4032, 3958, 1, 0, 0, 0, 4032, 3967, 1, 0, 0, 0, 4032, 3976, 1, 0, 0, 0, 4032, 3981, 1, 0, 0, 0, 4032, 3986, 1, 0, 0, 0, 4032, 3993, 1, 0, 0, 0, 4032, 4000, 1, 0, 0, 0, 4032, 4010, 1, 0, 0, 0, 4032, 4019, 1, 0, 0, 0, 4032, 4026, 1, 0, 0, 0, 4033, 552, 1, 0, 0, 0, 4034, 4035, 5, 108, 0, 0, 4035, 4036, 5, 100, 0, 0, 4036, 4037, 5, 97, 0, 0, 4037, 4038, 5, 114, 0, 0, 4038, 4039, 5, 103, 0, 0, 4039, 4040, 5, 46, 0, 0, 4040, 4111, 5, 115, 0, 0, 4041, 4042, 5, 108, 0, 0, 4042, 4043, 5, 100, 0, 0, 4043, 4044, 5, 97, 0, 0, 4044, 4045, 5, 114, 0, 0, 4045, 4046, 5, 103, 0, 0, 4046, 4047, 5, 97, 0, 0, 4047, 4048, 5, 46, 0, 0, 4048, 4111, 5, 115, 0, 0, 4049, 4050, 5, 115, 0, 0, 4050, 4051, 5, 116, 0, 0, 4051, 4052, 5, 97, 0, 0, 4052, 4053, 5, 114, 0, 0, 4053, 4054, 5, 103, 0, 0, 4054, 4055, 5, 46, 0, 0, 4055, 4111, 5, 115, 0, 0, 4056, 4057, 5, 108, 0, 0, 4057, 4058, 5, 100, 0, 0, 4058, 4059, 5, 108, 0, 0, 4059, 4060, 5, 111, 0, 0, 4060, 4061, 5, 99, 0, 0, 4061, 4062, 5, 46, 0, 0, 4062, 4111, 5, 115, 0, 0, 4063, 4064, 5, 108, 0, 0, 4064, 4065, 5, 100, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 111, 0, 0, 4067, 4068, 5, 99, 0, 0, 4068, 4069, 5, 97, 0, 0, 4069, 4070, 5, 46, 0, 0, 4070, 4111, 5, 115, 0, 0, 4071, 4072, 5, 115, 0, 0, 4072, 4073, 5, 116, 0, 0, 4073, 4074, 5, 108, 0, 0, 4074, 4075, 5, 111, 0, 0, 4075, 4076, 5, 99, 0, 0, 4076, 4077, 5, 46, 0, 0, 4077, 4111, 5, 115, 0, 0, 4078, 4079, 5, 108, 0, 0, 4079, 4080, 5, 100, 0, 0, 4080, 4081, 5, 97, 0, 0, 4081, 4082, 5, 114, 0, 0, 4082, 4111, 5, 103, 0, 0, 4083, 4084, 5, 108, 0, 0, 4084, 4085, 5, 100, 0, 0, 4085, 4086, 5, 97, 0, 0, 4086, 4087, 5, 114, 0, 0, 4087, 4088, 5, 103, 0, 0, 4088, 4111, 5, 97, 0, 0, 4089, 4090, 5, 115, 0, 0, 4090, 4091, 5, 116, 0, 0, 4091, 4092, 5, 97, 0, 0, 4092, 4093, 5, 114, 0, 0, 4093, 4111, 5, 103, 0, 0, 4094, 4095, 5, 108, 0, 0, 4095, 4096, 5, 100, 0, 0, 4096, 4097, 5, 108, 0, 0, 4097, 4098, 5, 111, 0, 0, 4098, 4111, 5, 99, 0, 0, 4099, 4100, 5, 108, 0, 0, 4100, 4101, 5, 100, 0, 0, 4101, 4102, 5, 108, 0, 0, 4102, 4103, 5, 111, 0, 0, 4103, 4104, 5, 99, 0, 0, 4104, 4111, 5, 97, 0, 0, 4105, 4106, 5, 115, 0, 0, 4106, 4107, 5, 116, 0, 0, 4107, 4108, 5, 108, 0, 0, 4108, 4109, 5, 111, 0, 0, 4109, 4111, 5, 99, 0, 0, 4110, 4034, 1, 0, 0, 0, 4110, 4041, 1, 0, 0, 0, 4110, 4049, 1, 0, 0, 0, 4110, 4056, 1, 0, 0, 0, 4110, 4063, 1, 0, 0, 0, 4110, 4071, 1, 0, 0, 0, 4110, 4078, 1, 0, 0, 0, 4110, 4083, 1, 0, 0, 0, 4110, 4089, 1, 0, 0, 0, 4110, 4094, 1, 0, 0, 0, 4110, 4099, 1, 0, 0, 0, 4110, 4105, 1, 0, 0, 0, 4111, 554, 1, 0, 0, 0, 4112, 4113, 5, 108, 0, 0, 4113, 4114, 5, 100, 0, 0, 4114, 4115, 5, 99, 0, 0, 4115, 4116, 5, 46, 0, 0, 4116, 4117, 5, 105, 0, 0, 4117, 4118, 5, 52, 0, 0, 4118, 4119, 5, 46, 0, 0, 4119, 4140, 5, 115, 0, 0, 4120, 4121, 5, 108, 0, 0, 4121, 4122, 5, 100, 0, 0, 4122, 4123, 5, 99, 0, 0, 4123, 4124, 5, 46, 0, 0, 4124, 4125, 5, 105, 0, 0, 4125, 4140, 5, 52, 0, 0, 4126, 4127, 5, 117, 0, 0, 4127, 4128, 5, 110, 0, 0, 4128, 4129, 5, 97, 0, 0, 4129, 4130, 5, 108, 0, 0, 4130, 4131, 5, 105, 0, 0, 4131, 4132, 5, 103, 0, 0, 4132, 4133, 5, 110, 0, 0, 4133, 4134, 5, 101, 0, 0, 4134, 4135, 5, 100, 0, 0, 4135, 4140, 5, 46, 0, 0, 4136, 4137, 5, 110, 0, 0, 4137, 4138, 5, 111, 0, 0, 4138, 4140, 5, 46, 0, 0, 4139, 4112, 1, 0, 0, 0, 4139, 4120, 1, 0, 0, 0, 4139, 4126, 1, 0, 0, 0, 4139, 4136, 1, 0, 0, 0, 4140, 556, 1, 0, 0, 0, 4141, 4142, 5, 108, 0, 0, 4142, 4143, 5, 100, 0, 0, 4143, 4144, 5, 99, 0, 0, 4144, 4145, 5, 46, 0, 0, 4145, 4146, 5, 105, 0, 0, 4146, 4147, 5, 56, 0, 0, 4147, 558, 1, 0, 0, 0, 4148, 4149, 5, 108, 0, 0, 4149, 4150, 5, 100, 0, 0, 4150, 4151, 5, 99, 0, 0, 4151, 4152, 5, 46, 0, 0, 4152, 4153, 5, 114, 0, 0, 4153, 4161, 5, 52, 0, 0, 4154, 4155, 5, 108, 0, 0, 4155, 4156, 5, 100, 0, 0, 4156, 4157, 5, 99, 0, 0, 4157, 4158, 5, 46, 0, 0, 4158, 4159, 5, 114, 0, 0, 4159, 4161, 5, 56, 0, 0, 4160, 4148, 1, 0, 0, 0, 4160, 4154, 1, 0, 0, 0, 4161, 560, 1, 0, 0, 0, 4162, 4163, 5, 106, 0, 0, 4163, 4164, 5, 109, 0, 0, 4164, 4198, 5, 112, 0, 0, 4165, 4166, 5, 99, 0, 0, 4166, 4167, 5, 97, 0, 0, 4167, 4168, 5, 108, 0, 0, 4168, 4198, 5, 108, 0, 0, 4169, 4170, 5, 99, 0, 0, 4170, 4171, 5, 97, 0, 0, 4171, 4172, 5, 108, 0, 0, 4172, 4173, 5, 108, 0, 0, 4173, 4174, 5, 118, 0, 0, 4174, 4175, 5, 105, 0, 0, 4175, 4176, 5, 114, 0, 0, 4176, 4198, 5, 116, 0, 0, 4177, 4178, 5, 110, 0, 0, 4178, 4179, 5, 101, 0, 0, 4179, 4180, 5, 119, 0, 0, 4180, 4181, 5, 111, 0, 0, 4181, 4182, 5, 98, 0, 0, 4182, 4198, 5, 106, 0, 0, 4183, 4184, 5, 108, 0, 0, 4184, 4185, 5, 100, 0, 0, 4185, 4186, 5, 102, 0, 0, 4186, 4187, 5, 116, 0, 0, 4187, 4198, 5, 110, 0, 0, 4188, 4189, 5, 108, 0, 0, 4189, 4190, 5, 100, 0, 0, 4190, 4191, 5, 118, 0, 0, 4191, 4192, 5, 105, 0, 0, 4192, 4193, 5, 114, 0, 0, 4193, 4194, 5, 116, 0, 0, 4194, 4195, 5, 102, 0, 0, 4195, 4196, 5, 116, 0, 0, 4196, 4198, 5, 110, 0, 0, 4197, 4162, 1, 0, 0, 0, 4197, 4165, 1, 0, 0, 0, 4197, 4169, 1, 0, 0, 0, 4197, 4177, 1, 0, 0, 0, 4197, 4183, 1, 0, 0, 0, 4197, 4188, 1, 0, 0, 0, 4198, 562, 1, 0, 0, 0, 4199, 4200, 5, 99, 0, 0, 4200, 4201, 5, 97, 0, 0, 4201, 4202, 5, 108, 0, 0, 4202, 4203, 5, 108, 0, 0, 4203, 4204, 5, 105, 0, 0, 4204, 564, 1, 0, 0, 0, 4205, 4206, 5, 98, 0, 0, 4206, 4207, 5, 114, 0, 0, 4207, 4208, 5, 46, 0, 0, 4208, 4364, 5, 115, 0, 0, 4209, 4210, 5, 98, 0, 0, 4210, 4211, 5, 114, 0, 0, 4211, 4212, 5, 102, 0, 0, 4212, 4213, 5, 97, 0, 0, 4213, 4214, 5, 108, 0, 0, 4214, 4215, 5, 115, 0, 0, 4215, 4216, 5, 101, 0, 0, 4216, 4217, 5, 46, 0, 0, 4217, 4364, 5, 115, 0, 0, 4218, 4219, 5, 98, 0, 0, 4219, 4220, 5, 114, 0, 0, 4220, 4221, 5, 116, 0, 0, 4221, 4222, 5, 114, 0, 0, 4222, 4223, 5, 117, 0, 0, 4223, 4224, 5, 101, 0, 0, 4224, 4225, 5, 46, 0, 0, 4225, 4364, 5, 115, 0, 0, 4226, 4227, 5, 98, 0, 0, 4227, 4228, 5, 101, 0, 0, 4228, 4229, 5, 113, 0, 0, 4229, 4230, 5, 46, 0, 0, 4230, 4364, 5, 115, 0, 0, 4231, 4232, 5, 98, 0, 0, 4232, 4233, 5, 103, 0, 0, 4233, 4234, 5, 101, 0, 0, 4234, 4235, 5, 46, 0, 0, 4235, 4364, 5, 115, 0, 0, 4236, 4237, 5, 98, 0, 0, 4237, 4238, 5, 103, 0, 0, 4238, 4239, 5, 116, 0, 0, 4239, 4240, 5, 46, 0, 0, 4240, 4364, 5, 115, 0, 0, 4241, 4242, 5, 98, 0, 0, 4242, 4243, 5, 108, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 46, 0, 0, 4245, 4364, 5, 115, 0, 0, 4246, 4247, 5, 98, 0, 0, 4247, 4248, 5, 108, 0, 0, 4248, 4249, 5, 116, 0, 0, 4249, 4250, 5, 46, 0, 0, 4250, 4364, 5, 115, 0, 0, 4251, 4252, 5, 98, 0, 0, 4252, 4253, 5, 110, 0, 0, 4253, 4254, 5, 101, 0, 0, 4254, 4255, 5, 46, 0, 0, 4255, 4256, 5, 117, 0, 0, 4256, 4257, 5, 110, 0, 0, 4257, 4258, 5, 46, 0, 0, 4258, 4364, 5, 115, 0, 0, 4259, 4260, 5, 98, 0, 0, 4260, 4261, 5, 103, 0, 0, 4261, 4262, 5, 101, 0, 0, 4262, 4263, 5, 46, 0, 0, 4263, 4264, 5, 117, 0, 0, 4264, 4265, 5, 110, 0, 0, 4265, 4266, 5, 46, 0, 0, 4266, 4364, 5, 115, 0, 0, 4267, 4268, 5, 98, 0, 0, 4268, 4269, 5, 103, 0, 0, 4269, 4270, 5, 116, 0, 0, 4270, 4271, 5, 46, 0, 0, 4271, 4272, 5, 117, 0, 0, 4272, 4273, 5, 110, 0, 0, 4273, 4274, 5, 46, 0, 0, 4274, 4364, 5, 115, 0, 0, 4275, 4276, 5, 98, 0, 0, 4276, 4277, 5, 108, 0, 0, 4277, 4278, 5, 101, 0, 0, 4278, 4279, 5, 46, 0, 0, 4279, 4280, 5, 117, 0, 0, 4280, 4281, 5, 110, 0, 0, 4281, 4282, 5, 46, 0, 0, 4282, 4364, 5, 115, 0, 0, 4283, 4284, 5, 98, 0, 0, 4284, 4285, 5, 108, 0, 0, 4285, 4286, 5, 116, 0, 0, 4286, 4287, 5, 46, 0, 0, 4287, 4288, 5, 117, 0, 0, 4288, 4289, 5, 110, 0, 0, 4289, 4290, 5, 46, 0, 0, 4290, 4364, 5, 115, 0, 0, 4291, 4292, 5, 98, 0, 0, 4292, 4364, 5, 114, 0, 0, 4293, 4294, 5, 98, 0, 0, 4294, 4295, 5, 114, 0, 0, 4295, 4296, 5, 102, 0, 0, 4296, 4297, 5, 97, 0, 0, 4297, 4298, 5, 108, 0, 0, 4298, 4299, 5, 115, 0, 0, 4299, 4364, 5, 101, 0, 0, 4300, 4301, 5, 98, 0, 0, 4301, 4302, 5, 114, 0, 0, 4302, 4303, 5, 116, 0, 0, 4303, 4304, 5, 114, 0, 0, 4304, 4305, 5, 117, 0, 0, 4305, 4364, 5, 101, 0, 0, 4306, 4307, 5, 98, 0, 0, 4307, 4308, 5, 101, 0, 0, 4308, 4364, 5, 113, 0, 0, 4309, 4310, 5, 98, 0, 0, 4310, 4311, 5, 103, 0, 0, 4311, 4364, 5, 101, 0, 0, 4312, 4313, 5, 98, 0, 0, 4313, 4314, 5, 103, 0, 0, 4314, 4364, 5, 116, 0, 0, 4315, 4316, 5, 98, 0, 0, 4316, 4317, 5, 108, 0, 0, 4317, 4364, 5, 101, 0, 0, 4318, 4319, 5, 98, 0, 0, 4319, 4320, 5, 108, 0, 0, 4320, 4364, 5, 116, 0, 0, 4321, 4322, 5, 98, 0, 0, 4322, 4323, 5, 110, 0, 0, 4323, 4324, 5, 101, 0, 0, 4324, 4325, 5, 46, 0, 0, 4325, 4326, 5, 117, 0, 0, 4326, 4364, 5, 110, 0, 0, 4327, 4328, 5, 98, 0, 0, 4328, 4329, 5, 103, 0, 0, 4329, 4330, 5, 101, 0, 0, 4330, 4331, 5, 46, 0, 0, 4331, 4332, 5, 117, 0, 0, 4332, 4364, 5, 110, 0, 0, 4333, 4334, 5, 98, 0, 0, 4334, 4335, 5, 103, 0, 0, 4335, 4336, 5, 116, 0, 0, 4336, 4337, 5, 46, 0, 0, 4337, 4338, 5, 117, 0, 0, 4338, 4364, 5, 110, 0, 0, 4339, 4340, 5, 98, 0, 0, 4340, 4341, 5, 108, 0, 0, 4341, 4342, 5, 101, 0, 0, 4342, 4343, 5, 46, 0, 0, 4343, 4344, 5, 117, 0, 0, 4344, 4364, 5, 110, 0, 0, 4345, 4346, 5, 98, 0, 0, 4346, 4347, 5, 108, 0, 0, 4347, 4348, 5, 116, 0, 0, 4348, 4349, 5, 46, 0, 0, 4349, 4350, 5, 117, 0, 0, 4350, 4364, 5, 110, 0, 0, 4351, 4352, 5, 108, 0, 0, 4352, 4353, 5, 101, 0, 0, 4353, 4354, 5, 97, 0, 0, 4354, 4355, 5, 118, 0, 0, 4355, 4364, 5, 101, 0, 0, 4356, 4357, 5, 108, 0, 0, 4357, 4358, 5, 101, 0, 0, 4358, 4359, 5, 97, 0, 0, 4359, 4360, 5, 118, 0, 0, 4360, 4361, 5, 101, 0, 0, 4361, 4362, 5, 46, 0, 0, 4362, 4364, 5, 115, 0, 0, 4363, 4205, 1, 0, 0, 0, 4363, 4209, 1, 0, 0, 0, 4363, 4218, 1, 0, 0, 0, 4363, 4226, 1, 0, 0, 0, 4363, 4231, 1, 0, 0, 0, 4363, 4236, 1, 0, 0, 0, 4363, 4241, 1, 0, 0, 0, 4363, 4246, 1, 0, 0, 0, 4363, 4251, 1, 0, 0, 0, 4363, 4259, 1, 0, 0, 0, 4363, 4267, 1, 0, 0, 0, 4363, 4275, 1, 0, 0, 0, 4363, 4283, 1, 0, 0, 0, 4363, 4291, 1, 0, 0, 0, 4363, 4293, 1, 0, 0, 0, 4363, 4300, 1, 0, 0, 0, 4363, 4306, 1, 0, 0, 0, 4363, 4309, 1, 0, 0, 0, 4363, 4312, 1, 0, 0, 0, 4363, 4315, 1, 0, 0, 0, 4363, 4318, 1, 0, 0, 0, 4363, 4321, 1, 0, 0, 0, 4363, 4327, 1, 0, 0, 0, 4363, 4333, 1, 0, 0, 0, 4363, 4339, 1, 0, 0, 0, 4363, 4345, 1, 0, 0, 0, 4363, 4351, 1, 0, 0, 0, 4363, 4356, 1, 0, 0, 0, 4364, 566, 1, 0, 0, 0, 4365, 4366, 5, 115, 0, 0, 4366, 4367, 5, 119, 0, 0, 4367, 4368, 5, 105, 0, 0, 4368, 4369, 5, 116, 0, 0, 4369, 4370, 5, 99, 0, 0, 4370, 4371, 5, 104, 0, 0, 4371, 568, 1, 0, 0, 0, 4372, 4373, 5, 99, 0, 0, 4373, 4374, 5, 112, 0, 0, 4374, 4375, 5, 111, 0, 0, 4375, 4376, 5, 98, 0, 0, 4376, 4487, 5, 106, 0, 0, 4377, 4378, 5, 108, 0, 0, 4378, 4379, 5, 100, 0, 0, 4379, 4380, 5, 111, 0, 0, 4380, 4381, 5, 98, 0, 0, 4381, 4487, 5, 106, 0, 0, 4382, 4383, 5, 99, 0, 0, 4383, 4384, 5, 97, 0, 0, 4384, 4385, 5, 115, 0, 0, 4385, 4386, 5, 116, 0, 0, 4386, 4387, 5, 99, 0, 0, 4387, 4388, 5, 108, 0, 0, 4388, 4389, 5, 97, 0, 0, 4389, 4390, 5, 115, 0, 0, 4390, 4487, 5, 115, 0, 0, 4391, 4392, 5, 105, 0, 0, 4392, 4393, 5, 115, 0, 0, 4393, 4394, 5, 105, 0, 0, 4394, 4395, 5, 110, 0, 0, 4395, 4396, 5, 115, 0, 0, 4396, 4487, 5, 116, 0, 0, 4397, 4398, 5, 117, 0, 0, 4398, 4399, 5, 110, 0, 0, 4399, 4400, 5, 98, 0, 0, 4400, 4401, 5, 111, 0, 0, 4401, 4487, 5, 120, 0, 0, 4402, 4403, 5, 115, 0, 0, 4403, 4404, 5, 116, 0, 0, 4404, 4405, 5, 111, 0, 0, 4405, 4406, 5, 98, 0, 0, 4406, 4487, 5, 106, 0, 0, 4407, 4408, 5, 98, 0, 0, 4408, 4409, 5, 111, 0, 0, 4409, 4487, 5, 120, 0, 0, 4410, 4411, 5, 110, 0, 0, 4411, 4412, 5, 101, 0, 0, 4412, 4413, 5, 119, 0, 0, 4413, 4414, 5, 97, 0, 0, 4414, 4415, 5, 114, 0, 0, 4415, 4487, 5, 114, 0, 0, 4416, 4417, 5, 108, 0, 0, 4417, 4418, 5, 100, 0, 0, 4418, 4419, 5, 101, 0, 0, 4419, 4420, 5, 108, 0, 0, 4420, 4421, 5, 101, 0, 0, 4421, 4422, 5, 109, 0, 0, 4422, 4487, 5, 97, 0, 0, 4423, 4424, 5, 108, 0, 0, 4424, 4425, 5, 100, 0, 0, 4425, 4426, 5, 101, 0, 0, 4426, 4427, 5, 108, 0, 0, 4427, 4428, 5, 101, 0, 0, 4428, 4487, 5, 109, 0, 0, 4429, 4430, 5, 115, 0, 0, 4430, 4431, 5, 116, 0, 0, 4431, 4432, 5, 101, 0, 0, 4432, 4433, 5, 108, 0, 0, 4433, 4434, 5, 101, 0, 0, 4434, 4487, 5, 109, 0, 0, 4435, 4436, 5, 117, 0, 0, 4436, 4437, 5, 110, 0, 0, 4437, 4438, 5, 98, 0, 0, 4438, 4439, 5, 111, 0, 0, 4439, 4440, 5, 120, 0, 0, 4440, 4441, 5, 46, 0, 0, 4441, 4442, 5, 97, 0, 0, 4442, 4443, 5, 110, 0, 0, 4443, 4487, 5, 121, 0, 0, 4444, 4445, 5, 114, 0, 0, 4445, 4446, 5, 101, 0, 0, 4446, 4447, 5, 102, 0, 0, 4447, 4448, 5, 97, 0, 0, 4448, 4449, 5, 110, 0, 0, 4449, 4450, 5, 121, 0, 0, 4450, 4451, 5, 118, 0, 0, 4451, 4452, 5, 97, 0, 0, 4452, 4487, 5, 108, 0, 0, 4453, 4454, 5, 109, 0, 0, 4454, 4455, 5, 107, 0, 0, 4455, 4456, 5, 114, 0, 0, 4456, 4457, 5, 101, 0, 0, 4457, 4458, 5, 102, 0, 0, 4458, 4459, 5, 97, 0, 0, 4459, 4460, 5, 110, 0, 0, 4460, 4487, 5, 121, 0, 0, 4461, 4462, 5, 105, 0, 0, 4462, 4463, 5, 110, 0, 0, 4463, 4464, 5, 105, 0, 0, 4464, 4465, 5, 116, 0, 0, 4465, 4466, 5, 111, 0, 0, 4466, 4467, 5, 98, 0, 0, 4467, 4487, 5, 106, 0, 0, 4468, 4469, 5, 99, 0, 0, 4469, 4470, 5, 111, 0, 0, 4470, 4471, 5, 110, 0, 0, 4471, 4472, 5, 115, 0, 0, 4472, 4473, 5, 116, 0, 0, 4473, 4474, 5, 114, 0, 0, 4474, 4475, 5, 97, 0, 0, 4475, 4476, 5, 105, 0, 0, 4476, 4477, 5, 110, 0, 0, 4477, 4478, 5, 101, 0, 0, 4478, 4479, 5, 100, 0, 0, 4479, 4487, 5, 46, 0, 0, 4480, 4481, 5, 115, 0, 0, 4481, 4482, 5, 105, 0, 0, 4482, 4483, 5, 122, 0, 0, 4483, 4484, 5, 101, 0, 0, 4484, 4485, 5, 111, 0, 0, 4485, 4487, 5, 102, 0, 0, 4486, 4372, 1, 0, 0, 0, 4486, 4377, 1, 0, 0, 0, 4486, 4382, 1, 0, 0, 0, 4486, 4391, 1, 0, 0, 0, 4486, 4397, 1, 0, 0, 0, 4486, 4402, 1, 0, 0, 0, 4486, 4407, 1, 0, 0, 0, 4486, 4410, 1, 0, 0, 0, 4486, 4416, 1, 0, 0, 0, 4486, 4423, 1, 0, 0, 0, 4486, 4429, 1, 0, 0, 0, 4486, 4435, 1, 0, 0, 0, 4486, 4444, 1, 0, 0, 0, 4486, 4453, 1, 0, 0, 0, 4486, 4461, 1, 0, 0, 0, 4486, 4468, 1, 0, 0, 0, 4486, 4480, 1, 0, 0, 0, 4487, 570, 1, 0, 0, 0, 4488, 4489, 5, 108, 0, 0, 4489, 4490, 5, 100, 0, 0, 4490, 4491, 5, 115, 0, 0, 4491, 4492, 5, 116, 0, 0, 4492, 4493, 5, 114, 0, 0, 4493, 572, 1, 0, 0, 0, 4494, 4495, 5, 108, 0, 0, 4495, 4496, 5, 100, 0, 0, 4496, 4497, 5, 102, 0, 0, 4497, 4498, 5, 108, 0, 0, 4498, 4530, 5, 100, 0, 0, 4499, 4500, 5, 108, 0, 0, 4500, 4501, 5, 100, 0, 0, 4501, 4502, 5, 102, 0, 0, 4502, 4503, 5, 108, 0, 0, 4503, 4504, 5, 100, 0, 0, 4504, 4530, 5, 97, 0, 0, 4505, 4506, 5, 115, 0, 0, 4506, 4507, 5, 116, 0, 0, 4507, 4508, 5, 102, 0, 0, 4508, 4509, 5, 108, 0, 0, 4509, 4530, 5, 100, 0, 0, 4510, 4511, 5, 108, 0, 0, 4511, 4512, 5, 100, 0, 0, 4512, 4513, 5, 115, 0, 0, 4513, 4514, 5, 102, 0, 0, 4514, 4515, 5, 108, 0, 0, 4515, 4530, 5, 100, 0, 0, 4516, 4517, 5, 108, 0, 0, 4517, 4518, 5, 100, 0, 0, 4518, 4519, 5, 115, 0, 0, 4519, 4520, 5, 102, 0, 0, 4520, 4521, 5, 108, 0, 0, 4521, 4522, 5, 100, 0, 0, 4522, 4530, 5, 97, 0, 0, 4523, 4524, 5, 115, 0, 0, 4524, 4525, 5, 116, 0, 0, 4525, 4526, 5, 115, 0, 0, 4526, 4527, 5, 102, 0, 0, 4527, 4528, 5, 108, 0, 0, 4528, 4530, 5, 100, 0, 0, 4529, 4494, 1, 0, 0, 0, 4529, 4499, 1, 0, 0, 0, 4529, 4505, 1, 0, 0, 0, 4529, 4510, 1, 0, 0, 0, 4529, 4516, 1, 0, 0, 0, 4529, 4523, 1, 0, 0, 0, 4530, 574, 1, 0, 0, 0, 4531, 4532, 5, 108, 0, 0, 4532, 4533, 5, 100, 0, 0, 4533, 4534, 5, 116, 0, 0, 4534, 4535, 5, 111, 0, 0, 4535, 4536, 5, 107, 0, 0, 4536, 4537, 5, 101, 0, 0, 4537, 4538, 5, 110, 0, 0, 4538, 576, 1, 0, 0, 0, 4539, 4540, 7, 8, 0, 0, 4540, 578, 1, 0, 0, 0, 4541, 4542, 7, 9, 0, 0, 4542, 580, 1, 0, 0, 0, 4543, 4544, 3, 583, 291, 0, 4544, 4545, 3, 531, 265, 0, 4545, 4547, 1, 0, 0, 0, 4546, 4543, 1, 0, 0, 0, 4547, 4548, 1, 0, 0, 0, 4548, 4546, 1, 0, 0, 0, 4548, 4549, 1, 0, 0, 0, 4549, 4550, 1, 0, 0, 0, 4550, 4551, 3, 583, 291, 0, 4551, 582, 1, 0, 0, 0, 4552, 4556, 3, 577, 288, 0, 4553, 4555, 3, 579, 289, 0, 4554, 4553, 1, 0, 0, 0, 4555, 4558, 1, 0, 0, 0, 4556, 4554, 1, 0, 0, 0, 4556, 4557, 1, 0, 0, 0, 4557, 584, 1, 0, 0, 0, 4558, 4556, 1, 0, 0, 0, 4559, 4560, 7, 0, 0, 0, 4560, 4561, 7, 0, 0, 0, 4561, 586, 1, 0, 0, 0, 4562, 4563, 7, 10, 0, 0, 4563, 4564, 1, 0, 0, 0, 4564, 4565, 6, 293, 0, 0, 4565, 588, 1, 0, 0, 0, 4566, 4567, 5, 47, 0, 0, 4567, 4568, 5, 47, 0, 0, 4568, 4572, 1, 0, 0, 0, 4569, 4571, 8, 11, 0, 0, 4570, 4569, 1, 0, 0, 0, 4571, 4574, 1, 0, 0, 0, 4572, 4570, 1, 0, 0, 0, 4572, 4573, 1, 0, 0, 0, 4573, 4575, 1, 0, 0, 0, 4574, 4572, 1, 0, 0, 0, 4575, 4576, 6, 294, 0, 0, 4576, 590, 1, 0, 0, 0, 4577, 4578, 5, 47, 0, 0, 4578, 4579, 5, 42, 0, 0, 4579, 4583, 1, 0, 0, 0, 4580, 4582, 9, 0, 0, 0, 4581, 4580, 1, 0, 0, 0, 4582, 4585, 1, 0, 0, 0, 4583, 4584, 1, 0, 0, 0, 4583, 4581, 1, 0, 0, 0, 4584, 4586, 1, 0, 0, 0, 4585, 4583, 1, 0, 0, 0, 4586, 4587, 5, 42, 0, 0, 4587, 4588, 5, 47, 0, 0, 4588, 4589, 1, 0, 0, 0, 4589, 4590, 6, 295, 0, 0, 4590, 592, 1, 0, 0, 0, 4591, 4592, 5, 46, 0, 0, 4592, 4593, 5, 112, 0, 0, 4593, 4594, 5, 101, 0, 0, 4594, 4595, 5, 114, 0, 0, 4595, 4596, 5, 109, 0, 0, 4596, 4597, 5, 105, 0, 0, 4597, 4598, 5, 115, 0, 0, 4598, 4599, 5, 115, 0, 0, 4599, 4600, 5, 105, 0, 0, 4600, 4601, 5, 111, 0, 0, 4601, 4602, 5, 110, 0, 0, 4602, 594, 1, 0, 0, 0, 4603, 4604, 5, 46, 0, 0, 4604, 4605, 5, 112, 0, 0, 4605, 4606, 5, 101, 0, 0, 4606, 4607, 5, 114, 0, 0, 4607, 4608, 5, 109, 0, 0, 4608, 4609, 5, 105, 0, 0, 4609, 4610, 5, 115, 0, 0, 4610, 4611, 5, 115, 0, 0, 4611, 4612, 5, 105, 0, 0, 4612, 4613, 5, 111, 0, 0, 4613, 4614, 5, 110, 0, 0, 4614, 4615, 5, 115, 0, 0, 4615, 4616, 5, 101, 0, 0, 4616, 4617, 5, 116, 0, 0, 4617, 596, 1, 0, 0, 0, 4618, 4619, 5, 46, 0, 0, 4619, 4620, 5, 101, 0, 0, 4620, 4621, 5, 109, 0, 0, 4621, 4622, 5, 105, 0, 0, 4622, 4623, 5, 116, 0, 0, 4623, 4624, 5, 98, 0, 0, 4624, 4625, 5, 121, 0, 0, 4625, 4626, 5, 116, 0, 0, 4626, 4627, 5, 101, 0, 0, 4627, 598, 1, 0, 0, 0, 4628, 4629, 5, 46, 0, 0, 4629, 4630, 5, 109, 0, 0, 4630, 4631, 5, 97, 0, 0, 4631, 4632, 5, 120, 0, 0, 4632, 4633, 5, 115, 0, 0, 4633, 4634, 5, 116, 0, 0, 4634, 4635, 5, 97, 0, 0, 4635, 4636, 5, 99, 0, 0, 4636, 4637, 5, 107, 0, 0, 4637, 600, 1, 0, 0, 0, 4638, 4639, 5, 46, 0, 0, 4639, 4640, 5, 101, 0, 0, 4640, 4641, 5, 110, 0, 0, 4641, 4642, 5, 116, 0, 0, 4642, 4643, 5, 114, 0, 0, 4643, 4644, 5, 121, 0, 0, 4644, 4645, 5, 112, 0, 0, 4645, 4646, 5, 111, 0, 0, 4646, 4647, 5, 105, 0, 0, 4647, 4648, 5, 110, 0, 0, 4648, 4649, 5, 116, 0, 0, 4649, 602, 1, 0, 0, 0, 4650, 4651, 5, 46, 0, 0, 4651, 4652, 5, 122, 0, 0, 4652, 4653, 5, 101, 0, 0, 4653, 4654, 5, 114, 0, 0, 4654, 4655, 5, 111, 0, 0, 4655, 4656, 5, 105, 0, 0, 4656, 4657, 5, 110, 0, 0, 4657, 4658, 5, 105, 0, 0, 4658, 4659, 5, 116, 0, 0, 4659, 604, 1, 0, 0, 0, 4660, 4661, 5, 46, 0, 0, 4661, 4662, 5, 108, 0, 0, 4662, 4663, 5, 111, 0, 0, 4663, 4664, 5, 99, 0, 0, 4664, 4665, 5, 97, 0, 0, 4665, 4666, 5, 108, 0, 0, 4666, 4667, 5, 115, 0, 0, 4667, 606, 1, 0, 0, 0, 4668, 4669, 5, 46, 0, 0, 4669, 4670, 5, 101, 0, 0, 4670, 4671, 5, 120, 0, 0, 4671, 4672, 5, 112, 0, 0, 4672, 4673, 5, 111, 0, 0, 4673, 4674, 5, 114, 0, 0, 4674, 4675, 5, 116, 0, 0, 4675, 608, 1, 0, 0, 0, 4676, 4677, 5, 46, 0, 0, 4677, 4678, 5, 111, 0, 0, 4678, 4679, 5, 118, 0, 0, 4679, 4680, 5, 101, 0, 0, 4680, 4681, 5, 114, 0, 0, 4681, 4682, 5, 114, 0, 0, 4682, 4683, 5, 105, 0, 0, 4683, 4684, 5, 100, 0, 0, 4684, 4685, 5, 101, 0, 0, 4685, 610, 1, 0, 0, 0, 4686, 4687, 5, 46, 0, 0, 4687, 4688, 5, 118, 0, 0, 4688, 4689, 5, 116, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 110, 0, 0, 4691, 4692, 5, 116, 0, 0, 4692, 4693, 5, 114, 0, 0, 4693, 4694, 5, 121, 0, 0, 4694, 612, 1, 0, 0, 0, 45, 0, 2024, 2032, 2037, 2039, 2042, 2050, 2055, 2057, 2060, 2065, 2071, 2075, 2080, 2082, 2086, 2091, 2093, 2099, 2103, 2108, 2110, 2112, 2149, 2701, 2752, 2755, 2758, 2761, 2766, 2768, 2776, 2778, 4032, 4110, 4139, 4160, 4197, 4363, 4486, 4529, 4548, 4556, 4572, 4583, 1, 6, 0, 0]
\ No newline at end of file
+[4, 0, 302, 4702, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 3, 171, 2025, 8, 171, 1, 171, 1, 171, 1, 171, 1, 171, 4, 171, 2031, 8, 171, 11, 171, 12, 171, 2032, 1, 171, 4, 171, 2036, 8, 171, 11, 171, 12, 171, 2037, 3, 171, 2040, 8, 171, 1, 172, 3, 172, 2043, 8, 172, 1, 172, 1, 172, 1, 172, 1, 172, 4, 172, 2049, 8, 172, 11, 172, 12, 172, 2050, 1, 172, 4, 172, 2054, 8, 172, 11, 172, 12, 172, 2055, 3, 172, 2058, 8, 172, 1, 173, 3, 173, 2061, 8, 173, 1, 173, 4, 173, 2064, 8, 173, 11, 173, 12, 173, 2065, 1, 173, 1, 173, 4, 173, 2070, 8, 173, 11, 173, 12, 173, 2071, 1, 173, 1, 173, 3, 173, 2076, 8, 173, 1, 173, 4, 173, 2079, 8, 173, 11, 173, 12, 173, 2080, 3, 173, 2083, 8, 173, 1, 173, 1, 173, 3, 173, 2087, 8, 173, 1, 173, 4, 173, 2090, 8, 173, 11, 173, 12, 173, 2091, 3, 173, 2094, 8, 173, 1, 173, 1, 173, 4, 173, 2098, 8, 173, 11, 173, 12, 173, 2099, 1, 173, 1, 173, 3, 173, 2104, 8, 173, 1, 173, 4, 173, 2107, 8, 173, 11, 173, 12, 173, 2108, 3, 173, 2111, 8, 173, 3, 173, 2113, 8, 173, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 3, 179, 2150, 8, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 3, 253, 2703, 8, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 3, 262, 2754, 8, 262, 1, 262, 3, 262, 2757, 8, 262, 1, 262, 3, 262, 2760, 8, 262, 1, 262, 3, 262, 2763, 8, 262, 1, 263, 1, 263, 1, 263, 5, 263, 2768, 8, 263, 10, 263, 12, 263, 2771, 9, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 5, 264, 2778, 8, 264, 10, 264, 12, 264, 2781, 9, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 3, 275, 4040, 8, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 3, 276, 4118, 8, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 3, 277, 4147, 8, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 3, 279, 4168, 8, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 3, 280, 4205, 8, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 3, 282, 4371, 8, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 3, 284, 4494, 8, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 3, 286, 4537, 8, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 4, 290, 4554, 8, 290, 11, 290, 12, 290, 4555, 1, 290, 1, 290, 1, 291, 1, 291, 5, 291, 4562, 8, 291, 10, 291, 12, 291, 4565, 9, 291, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 5, 294, 4578, 8, 294, 10, 294, 12, 294, 4581, 9, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 5, 295, 4589, 8, 295, 10, 295, 12, 295, 4592, 9, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 4590, 0, 306, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 157, 315, 158, 317, 159, 319, 160, 321, 161, 323, 162, 325, 163, 327, 164, 329, 165, 331, 166, 333, 167, 335, 168, 337, 169, 339, 170, 341, 171, 343, 172, 345, 173, 347, 174, 349, 175, 351, 176, 353, 177, 355, 178, 357, 179, 359, 180, 361, 181, 363, 182, 365, 183, 367, 184, 369, 185, 371, 186, 373, 187, 375, 188, 377, 0, 379, 189, 381, 190, 383, 191, 385, 192, 387, 193, 389, 194, 391, 195, 393, 196, 395, 197, 397, 198, 399, 199, 401, 200, 403, 201, 405, 202, 407, 203, 409, 204, 411, 205, 413, 206, 415, 207, 417, 208, 419, 209, 421, 210, 423, 211, 425, 212, 427, 213, 429, 214, 431, 215, 433, 216, 435, 217, 437, 218, 439, 219, 441, 220, 443, 221, 445, 222, 447, 223, 449, 224, 451, 225, 453, 226, 455, 227, 457, 228, 459, 229, 461, 230, 463, 231, 465, 232, 467, 233, 469, 234, 471, 235, 473, 236, 475, 237, 477, 238, 479, 239, 481, 240, 483, 241, 485, 242, 487, 243, 489, 244, 491, 245, 493, 246, 495, 247, 497, 248, 499, 249, 501, 250, 503, 251, 505, 252, 507, 253, 509, 254, 511, 255, 513, 256, 515, 257, 517, 258, 519, 259, 521, 260, 523, 261, 525, 0, 527, 262, 529, 263, 531, 264, 533, 265, 535, 266, 537, 267, 539, 268, 541, 269, 543, 270, 545, 271, 547, 272, 549, 273, 551, 274, 553, 275, 555, 276, 557, 277, 559, 278, 561, 279, 563, 280, 565, 281, 567, 282, 569, 283, 571, 284, 573, 285, 575, 286, 577, 0, 579, 0, 581, 287, 583, 288, 585, 289, 587, 290, 589, 291, 591, 292, 593, 293, 595, 294, 597, 295, 599, 296, 601, 297, 603, 298, 605, 299, 607, 300, 609, 301, 611, 302, 1, 0, 12, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 11, 0, 34, 34, 39, 39, 47, 48, 63, 63, 92, 92, 97, 98, 102, 102, 110, 110, 114, 114, 116, 116, 118, 118, 1, 0, 48, 55, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 4, 0, 10, 10, 13, 13, 39, 39, 92, 92, 4, 0, 35, 36, 63, 90, 95, 95, 97, 122, 4, 0, 35, 36, 48, 57, 63, 90, 95, 122, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 10, 10, 13, 13, 4955, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 379, 1, 0, 0, 0, 0, 381, 1, 0, 0, 0, 0, 383, 1, 0, 0, 0, 0, 385, 1, 0, 0, 0, 0, 387, 1, 0, 0, 0, 0, 389, 1, 0, 0, 0, 0, 391, 1, 0, 0, 0, 0, 393, 1, 0, 0, 0, 0, 395, 1, 0, 0, 0, 0, 397, 1, 0, 0, 0, 0, 399, 1, 0, 0, 0, 0, 401, 1, 0, 0, 0, 0, 403, 1, 0, 0, 0, 0, 405, 1, 0, 0, 0, 0, 407, 1, 0, 0, 0, 0, 409, 1, 0, 0, 0, 0, 411, 1, 0, 0, 0, 0, 413, 1, 0, 0, 0, 0, 415, 1, 0, 0, 0, 0, 417, 1, 0, 0, 0, 0, 419, 1, 0, 0, 0, 0, 421, 1, 0, 0, 0, 0, 423, 1, 0, 0, 0, 0, 425, 1, 0, 0, 0, 0, 427, 1, 0, 0, 0, 0, 429, 1, 0, 0, 0, 0, 431, 1, 0, 0, 0, 0, 433, 1, 0, 0, 0, 0, 435, 1, 0, 0, 0, 0, 437, 1, 0, 0, 0, 0, 439, 1, 0, 0, 0, 0, 441, 1, 0, 0, 0, 0, 443, 1, 0, 0, 0, 0, 445, 1, 0, 0, 0, 0, 447, 1, 0, 0, 0, 0, 449, 1, 0, 0, 0, 0, 451, 1, 0, 0, 0, 0, 453, 1, 0, 0, 0, 0, 455, 1, 0, 0, 0, 0, 457, 1, 0, 0, 0, 0, 459, 1, 0, 0, 0, 0, 461, 1, 0, 0, 0, 0, 463, 1, 0, 0, 0, 0, 465, 1, 0, 0, 0, 0, 467, 1, 0, 0, 0, 0, 469, 1, 0, 0, 0, 0, 471, 1, 0, 0, 0, 0, 473, 1, 0, 0, 0, 0, 475, 1, 0, 0, 0, 0, 477, 1, 0, 0, 0, 0, 479, 1, 0, 0, 0, 0, 481, 1, 0, 0, 0, 0, 483, 1, 0, 0, 0, 0, 485, 1, 0, 0, 0, 0, 487, 1, 0, 0, 0, 0, 489, 1, 0, 0, 0, 0, 491, 1, 0, 0, 0, 0, 493, 1, 0, 0, 0, 0, 495, 1, 0, 0, 0, 0, 497, 1, 0, 0, 0, 0, 499, 1, 0, 0, 0, 0, 501, 1, 0, 0, 0, 0, 503, 1, 0, 0, 0, 0, 505, 1, 0, 0, 0, 0, 507, 1, 0, 0, 0, 0, 509, 1, 0, 0, 0, 0, 511, 1, 0, 0, 0, 0, 513, 1, 0, 0, 0, 0, 515, 1, 0, 0, 0, 0, 517, 1, 0, 0, 0, 0, 519, 1, 0, 0, 0, 0, 521, 1, 0, 0, 0, 0, 523, 1, 0, 0, 0, 0, 527, 1, 0, 0, 0, 0, 529, 1, 0, 0, 0, 0, 531, 1, 0, 0, 0, 0, 533, 1, 0, 0, 0, 0, 535, 1, 0, 0, 0, 0, 537, 1, 0, 0, 0, 0, 539, 1, 0, 0, 0, 0, 541, 1, 0, 0, 0, 0, 543, 1, 0, 0, 0, 0, 545, 1, 0, 0, 0, 0, 547, 1, 0, 0, 0, 0, 549, 1, 0, 0, 0, 0, 551, 1, 0, 0, 0, 0, 553, 1, 0, 0, 0, 0, 555, 1, 0, 0, 0, 0, 557, 1, 0, 0, 0, 0, 559, 1, 0, 0, 0, 0, 561, 1, 0, 0, 0, 0, 563, 1, 0, 0, 0, 0, 565, 1, 0, 0, 0, 0, 567, 1, 0, 0, 0, 0, 569, 1, 0, 0, 0, 0, 571, 1, 0, 0, 0, 0, 573, 1, 0, 0, 0, 0, 575, 1, 0, 0, 0, 0, 581, 1, 0, 0, 0, 0, 583, 1, 0, 0, 0, 0, 585, 1, 0, 0, 0, 0, 587, 1, 0, 0, 0, 0, 589, 1, 0, 0, 0, 0, 591, 1, 0, 0, 0, 0, 593, 1, 0, 0, 0, 0, 595, 1, 0, 0, 0, 0, 597, 1, 0, 0, 0, 0, 599, 1, 0, 0, 0, 0, 601, 1, 0, 0, 0, 0, 603, 1, 0, 0, 0, 0, 605, 1, 0, 0, 0, 0, 607, 1, 0, 0, 0, 0, 609, 1, 0, 0, 0, 0, 611, 1, 0, 0, 0, 1, 613, 1, 0, 0, 0, 3, 620, 1, 0, 0, 0, 5, 624, 1, 0, 0, 0, 7, 630, 1, 0, 0, 0, 9, 638, 1, 0, 0, 0, 11, 649, 1, 0, 0, 0, 13, 661, 1, 0, 0, 0, 15, 669, 1, 0, 0, 0, 17, 682, 1, 0, 0, 0, 19, 695, 1, 0, 0, 0, 21, 706, 1, 0, 0, 0, 23, 725, 1, 0, 0, 0, 25, 740, 1, 0, 0, 0, 27, 763, 1, 0, 0, 0, 29, 769, 1, 0, 0, 0, 31, 778, 1, 0, 0, 0, 33, 787, 1, 0, 0, 0, 35, 789, 1, 0, 0, 0, 37, 791, 1, 0, 0, 0, 39, 802, 1, 0, 0, 0, 41, 812, 1, 0, 0, 0, 43, 818, 1, 0, 0, 0, 45, 828, 1, 0, 0, 0, 47, 839, 1, 0, 0, 0, 49, 853, 1, 0, 0, 0, 51, 863, 1, 0, 0, 0, 53, 873, 1, 0, 0, 0, 55, 883, 1, 0, 0, 0, 57, 885, 1, 0, 0, 0, 59, 895, 1, 0, 0, 0, 61, 897, 1, 0, 0, 0, 63, 899, 1, 0, 0, 0, 65, 901, 1, 0, 0, 0, 67, 910, 1, 0, 0, 0, 69, 913, 1, 0, 0, 0, 71, 921, 1, 0, 0, 0, 73, 923, 1, 0, 0, 0, 75, 929, 1, 0, 0, 0, 77, 938, 1, 0, 0, 0, 79, 944, 1, 0, 0, 0, 81, 951, 1, 0, 0, 0, 83, 960, 1, 0, 0, 0, 85, 962, 1, 0, 0, 0, 87, 964, 1, 0, 0, 0, 89, 967, 1, 0, 0, 0, 91, 981, 1, 0, 0, 0, 93, 997, 1, 0, 0, 0, 95, 1013, 1, 0, 0, 0, 97, 1021, 1, 0, 0, 0, 99, 1032, 1, 0, 0, 0, 101, 1039, 1, 0, 0, 0, 103, 1046, 1, 0, 0, 0, 105, 1054, 1, 0, 0, 0, 107, 1061, 1, 0, 0, 0, 109, 1070, 1, 0, 0, 0, 111, 1075, 1, 0, 0, 0, 113, 1086, 1, 0, 0, 0, 115, 1094, 1, 0, 0, 0, 117, 1103, 1, 0, 0, 0, 119, 1110, 1, 0, 0, 0, 121, 1123, 1, 0, 0, 0, 123, 1138, 1, 0, 0, 0, 125, 1145, 1, 0, 0, 0, 127, 1152, 1, 0, 0, 0, 129, 1161, 1, 0, 0, 0, 131, 1173, 1, 0, 0, 0, 133, 1184, 1, 0, 0, 0, 135, 1200, 1, 0, 0, 0, 137, 1212, 1, 0, 0, 0, 139, 1226, 1, 0, 0, 0, 141, 1232, 1, 0, 0, 0, 143, 1240, 1, 0, 0, 0, 145, 1251, 1, 0, 0, 0, 147, 1257, 1, 0, 0, 0, 149, 1263, 1, 0, 0, 0, 151, 1265, 1, 0, 0, 0, 153, 1276, 1, 0, 0, 0, 155, 1289, 1, 0, 0, 0, 157, 1300, 1, 0, 0, 0, 159, 1315, 1, 0, 0, 0, 161, 1319, 1, 0, 0, 0, 163, 1325, 1, 0, 0, 0, 165, 1329, 1, 0, 0, 0, 167, 1335, 1, 0, 0, 0, 169, 1345, 1, 0, 0, 0, 171, 1348, 1, 0, 0, 0, 173, 1350, 1, 0, 0, 0, 175, 1352, 1, 0, 0, 0, 177, 1354, 1, 0, 0, 0, 179, 1364, 1, 0, 0, 0, 181, 1373, 1, 0, 0, 0, 183, 1382, 1, 0, 0, 0, 185, 1389, 1, 0, 0, 0, 187, 1396, 1, 0, 0, 0, 189, 1403, 1, 0, 0, 0, 191, 1408, 1, 0, 0, 0, 193, 1414, 1, 0, 0, 0, 195, 1422, 1, 0, 0, 0, 197, 1429, 1, 0, 0, 0, 199, 1436, 1, 0, 0, 0, 201, 1441, 1, 0, 0, 0, 203, 1452, 1, 0, 0, 0, 205, 1462, 1, 0, 0, 0, 207, 1475, 1, 0, 0, 0, 209, 1482, 1, 0, 0, 0, 211, 1489, 1, 0, 0, 0, 213, 1499, 1, 0, 0, 0, 215, 1511, 1, 0, 0, 0, 217, 1522, 1, 0, 0, 0, 219, 1535, 1, 0, 0, 0, 221, 1552, 1, 0, 0, 0, 223, 1570, 1, 0, 0, 0, 225, 1579, 1, 0, 0, 0, 227, 1587, 1, 0, 0, 0, 229, 1589, 1, 0, 0, 0, 231, 1599, 1, 0, 0, 0, 233, 1605, 1, 0, 0, 0, 235, 1611, 1, 0, 0, 0, 237, 1617, 1, 0, 0, 0, 239, 1622, 1, 0, 0, 0, 241, 1637, 1, 0, 0, 0, 243, 1644, 1, 0, 0, 0, 245, 1652, 1, 0, 0, 0, 247, 1659, 1, 0, 0, 0, 249, 1668, 1, 0, 0, 0, 251, 1681, 1, 0, 0, 0, 253, 1689, 1, 0, 0, 0, 255, 1703, 1, 0, 0, 0, 257, 1710, 1, 0, 0, 0, 259, 1717, 1, 0, 0, 0, 261, 1727, 1, 0, 0, 0, 263, 1733, 1, 0, 0, 0, 265, 1740, 1, 0, 0, 0, 267, 1750, 1, 0, 0, 0, 269, 1755, 1, 0, 0, 0, 271, 1760, 1, 0, 0, 0, 273, 1763, 1, 0, 0, 0, 275, 1767, 1, 0, 0, 0, 277, 1771, 1, 0, 0, 0, 279, 1779, 1, 0, 0, 0, 281, 1785, 1, 0, 0, 0, 283, 1793, 1, 0, 0, 0, 285, 1800, 1, 0, 0, 0, 287, 1810, 1, 0, 0, 0, 289, 1818, 1, 0, 0, 0, 291, 1831, 1, 0, 0, 0, 293, 1841, 1, 0, 0, 0, 295, 1853, 1, 0, 0, 0, 297, 1862, 1, 0, 0, 0, 299, 1870, 1, 0, 0, 0, 301, 1877, 1, 0, 0, 0, 303, 1885, 1, 0, 0, 0, 305, 1888, 1, 0, 0, 0, 307, 1892, 1, 0, 0, 0, 309, 1905, 1, 0, 0, 0, 311, 1912, 1, 0, 0, 0, 313, 1915, 1, 0, 0, 0, 315, 1920, 1, 0, 0, 0, 317, 1925, 1, 0, 0, 0, 319, 1928, 1, 0, 0, 0, 321, 1935, 1, 0, 0, 0, 323, 1941, 1, 0, 0, 0, 325, 1949, 1, 0, 0, 0, 327, 1955, 1, 0, 0, 0, 329, 1963, 1, 0, 0, 0, 331, 1969, 1, 0, 0, 0, 333, 1973, 1, 0, 0, 0, 335, 1984, 1, 0, 0, 0, 337, 1989, 1, 0, 0, 0, 339, 1997, 1, 0, 0, 0, 341, 2013, 1, 0, 0, 0, 343, 2024, 1, 0, 0, 0, 345, 2042, 1, 0, 0, 0, 347, 2060, 1, 0, 0, 0, 349, 2114, 1, 0, 0, 0, 351, 2117, 1, 0, 0, 0, 353, 2121, 1, 0, 0, 0, 355, 2126, 1, 0, 0, 0, 357, 2134, 1, 0, 0, 0, 359, 2149, 1, 0, 0, 0, 361, 2151, 1, 0, 0, 0, 363, 2158, 1, 0, 0, 0, 365, 2163, 1, 0, 0, 0, 367, 2168, 1, 0, 0, 0, 369, 2174, 1, 0, 0, 0, 371, 2180, 1, 0, 0, 0, 373, 2186, 1, 0, 0, 0, 375, 2194, 1, 0, 0, 0, 377, 2202, 1, 0, 0, 0, 379, 2211, 1, 0, 0, 0, 381, 2217, 1, 0, 0, 0, 383, 2224, 1, 0, 0, 0, 385, 2231, 1, 0, 0, 0, 387, 2238, 1, 0, 0, 0, 389, 2242, 1, 0, 0, 0, 391, 2247, 1, 0, 0, 0, 393, 2252, 1, 0, 0, 0, 395, 2259, 1, 0, 0, 0, 397, 2267, 1, 0, 0, 0, 399, 2273, 1, 0, 0, 0, 401, 2283, 1, 0, 0, 0, 403, 2288, 1, 0, 0, 0, 405, 2293, 1, 0, 0, 0, 407, 2300, 1, 0, 0, 0, 409, 2306, 1, 0, 0, 0, 411, 2316, 1, 0, 0, 0, 413, 2322, 1, 0, 0, 0, 415, 2330, 1, 0, 0, 0, 417, 2339, 1, 0, 0, 0, 419, 2347, 1, 0, 0, 0, 421, 2353, 1, 0, 0, 0, 423, 2361, 1, 0, 0, 0, 425, 2366, 1, 0, 0, 0, 427, 2371, 1, 0, 0, 0, 429, 2377, 1, 0, 0, 0, 431, 2384, 1, 0, 0, 0, 433, 2391, 1, 0, 0, 0, 435, 2401, 1, 0, 0, 0, 437, 2410, 1, 0, 0, 0, 439, 2420, 1, 0, 0, 0, 441, 2427, 1, 0, 0, 0, 443, 2437, 1, 0, 0, 0, 445, 2447, 1, 0, 0, 0, 447, 2456, 1, 0, 0, 0, 449, 2461, 1, 0, 0, 0, 451, 2467, 1, 0, 0, 0, 453, 2474, 1, 0, 0, 0, 455, 2478, 1, 0, 0, 0, 457, 2487, 1, 0, 0, 0, 459, 2494, 1, 0, 0, 0, 461, 2502, 1, 0, 0, 0, 463, 2509, 1, 0, 0, 0, 465, 2521, 1, 0, 0, 0, 467, 2528, 1, 0, 0, 0, 469, 2537, 1, 0, 0, 0, 471, 2542, 1, 0, 0, 0, 473, 2549, 1, 0, 0, 0, 475, 2557, 1, 0, 0, 0, 477, 2573, 1, 0, 0, 0, 479, 2587, 1, 0, 0, 0, 481, 2599, 1, 0, 0, 0, 483, 2602, 1, 0, 0, 0, 485, 2608, 1, 0, 0, 0, 487, 2617, 1, 0, 0, 0, 489, 2626, 1, 0, 0, 0, 491, 2634, 1, 0, 0, 0, 493, 2641, 1, 0, 0, 0, 495, 2651, 1, 0, 0, 0, 497, 2657, 1, 0, 0, 0, 499, 2665, 1, 0, 0, 0, 501, 2674, 1, 0, 0, 0, 503, 2683, 1, 0, 0, 0, 505, 2685, 1, 0, 0, 0, 507, 2702, 1, 0, 0, 0, 509, 2704, 1, 0, 0, 0, 511, 2711, 1, 0, 0, 0, 513, 2722, 1, 0, 0, 0, 515, 2728, 1, 0, 0, 0, 517, 2734, 1, 0, 0, 0, 519, 2742, 1, 0, 0, 0, 521, 2744, 1, 0, 0, 0, 523, 2747, 1, 0, 0, 0, 525, 2749, 1, 0, 0, 0, 527, 2764, 1, 0, 0, 0, 529, 2774, 1, 0, 0, 0, 531, 2784, 1, 0, 0, 0, 533, 2786, 1, 0, 0, 0, 535, 2788, 1, 0, 0, 0, 537, 2796, 1, 0, 0, 0, 539, 2803, 1, 0, 0, 0, 541, 2810, 1, 0, 0, 0, 543, 2818, 1, 0, 0, 0, 545, 2824, 1, 0, 0, 0, 547, 2831, 1, 0, 0, 0, 549, 2840, 1, 0, 0, 0, 551, 4039, 1, 0, 0, 0, 553, 4117, 1, 0, 0, 0, 555, 4146, 1, 0, 0, 0, 557, 4148, 1, 0, 0, 0, 559, 4167, 1, 0, 0, 0, 561, 4204, 1, 0, 0, 0, 563, 4206, 1, 0, 0, 0, 565, 4370, 1, 0, 0, 0, 567, 4372, 1, 0, 0, 0, 569, 4493, 1, 0, 0, 0, 571, 4495, 1, 0, 0, 0, 573, 4536, 1, 0, 0, 0, 575, 4538, 1, 0, 0, 0, 577, 4546, 1, 0, 0, 0, 579, 4548, 1, 0, 0, 0, 581, 4553, 1, 0, 0, 0, 583, 4559, 1, 0, 0, 0, 585, 4566, 1, 0, 0, 0, 587, 4569, 1, 0, 0, 0, 589, 4573, 1, 0, 0, 0, 591, 4584, 1, 0, 0, 0, 593, 4598, 1, 0, 0, 0, 595, 4610, 1, 0, 0, 0, 597, 4625, 1, 0, 0, 0, 599, 4635, 1, 0, 0, 0, 601, 4645, 1, 0, 0, 0, 603, 4657, 1, 0, 0, 0, 605, 4667, 1, 0, 0, 0, 607, 4675, 1, 0, 0, 0, 609, 4683, 1, 0, 0, 0, 611, 4693, 1, 0, 0, 0, 613, 614, 5, 110, 0, 0, 614, 615, 5, 97, 0, 0, 615, 616, 5, 116, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 118, 0, 0, 618, 619, 5, 101, 0, 0, 619, 2, 1, 0, 0, 0, 620, 621, 5, 99, 0, 0, 621, 622, 5, 105, 0, 0, 622, 623, 5, 108, 0, 0, 623, 4, 1, 0, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 112, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 108, 0, 0, 629, 6, 1, 0, 0, 0, 630, 631, 5, 109, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 101, 0, 0, 636, 637, 5, 100, 0, 0, 637, 8, 1, 0, 0, 0, 638, 639, 5, 102, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 114, 0, 0, 641, 642, 5, 119, 0, 0, 642, 643, 5, 97, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 100, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 102, 0, 0, 648, 10, 1, 0, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 115, 0, 0, 653, 654, 5, 101, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 118, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 103, 0, 0, 660, 12, 1, 0, 0, 0, 661, 662, 5, 114, 0, 0, 662, 663, 5, 117, 0, 0, 663, 664, 5, 110, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 109, 0, 0, 667, 668, 5, 101, 0, 0, 668, 14, 1, 0, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 110, 0, 0, 671, 672, 5, 116, 0, 0, 672, 673, 5, 101, 0, 0, 673, 674, 5, 114, 0, 0, 674, 675, 5, 110, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 108, 0, 0, 677, 678, 5, 99, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 108, 0, 0, 680, 681, 5, 108, 0, 0, 681, 16, 1, 0, 0, 0, 682, 683, 5, 115, 0, 0, 683, 684, 5, 121, 0, 0, 684, 685, 5, 110, 0, 0, 685, 686, 5, 99, 0, 0, 686, 687, 5, 104, 0, 0, 687, 688, 5, 114, 0, 0, 688, 689, 5, 111, 0, 0, 689, 690, 5, 110, 0, 0, 690, 691, 5, 105, 0, 0, 691, 692, 5, 122, 0, 0, 692, 693, 5, 101, 0, 0, 693, 694, 5, 100, 0, 0, 694, 18, 1, 0, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 111, 0, 0, 697, 698, 5, 105, 0, 0, 698, 699, 5, 110, 0, 0, 699, 700, 5, 108, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 110, 0, 0, 702, 703, 5, 105, 0, 0, 703, 704, 5, 110, 0, 0, 704, 705, 5, 103, 0, 0, 705, 20, 1, 0, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 103, 0, 0, 708, 709, 5, 103, 0, 0, 709, 710, 5, 114, 0, 0, 710, 711, 5, 101, 0, 0, 711, 712, 5, 115, 0, 0, 712, 713, 5, 115, 0, 0, 713, 714, 5, 105, 0, 0, 714, 715, 5, 118, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 105, 0, 0, 717, 718, 5, 110, 0, 0, 718, 719, 5, 108, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 110, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 110, 0, 0, 723, 724, 5, 103, 0, 0, 724, 22, 1, 0, 0, 0, 725, 726, 5, 110, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 112, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 109, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 122, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 105, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 110, 0, 0, 739, 24, 1, 0, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 103, 0, 0, 742, 743, 5, 103, 0, 0, 743, 744, 5, 114, 0, 0, 744, 745, 5, 101, 0, 0, 745, 746, 5, 115, 0, 0, 746, 747, 5, 115, 0, 0, 747, 748, 5, 105, 0, 0, 748, 749, 5, 118, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 111, 0, 0, 751, 752, 5, 112, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 109, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 122, 0, 0, 757, 758, 5, 97, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 105, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 110, 0, 0, 762, 26, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 766, 5, 121, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 99, 0, 0, 768, 28, 1, 0, 0, 0, 769, 770, 5, 101, 0, 0, 770, 771, 5, 120, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 101, 0, 0, 773, 774, 5, 110, 0, 0, 774, 775, 5, 100, 0, 0, 775, 776, 5, 101, 0, 0, 776, 777, 5, 100, 0, 0, 777, 30, 1, 0, 0, 0, 778, 779, 5, 118, 0, 0, 779, 780, 5, 111, 0, 0, 780, 781, 5, 108, 0, 0, 781, 782, 5, 97, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 105, 0, 0, 784, 785, 5, 108, 0, 0, 785, 786, 5, 101, 0, 0, 786, 32, 1, 0, 0, 0, 787, 788, 5, 123, 0, 0, 788, 34, 1, 0, 0, 0, 789, 790, 5, 125, 0, 0, 790, 36, 1, 0, 0, 0, 791, 792, 5, 46, 0, 0, 792, 793, 5, 115, 0, 0, 793, 794, 5, 117, 0, 0, 794, 795, 5, 98, 0, 0, 795, 796, 5, 115, 0, 0, 796, 797, 5, 121, 0, 0, 797, 798, 5, 115, 0, 0, 798, 799, 5, 116, 0, 0, 799, 800, 5, 101, 0, 0, 800, 801, 5, 109, 0, 0, 801, 38, 1, 0, 0, 0, 802, 803, 5, 46, 0, 0, 803, 804, 5, 99, 0, 0, 804, 805, 5, 111, 0, 0, 805, 806, 5, 114, 0, 0, 806, 807, 5, 102, 0, 0, 807, 808, 5, 108, 0, 0, 808, 809, 5, 97, 0, 0, 809, 810, 5, 103, 0, 0, 810, 811, 5, 115, 0, 0, 811, 40, 1, 0, 0, 0, 812, 813, 5, 46, 0, 0, 813, 814, 5, 102, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 108, 0, 0, 816, 817, 5, 101, 0, 0, 817, 42, 1, 0, 0, 0, 818, 819, 5, 97, 0, 0, 819, 820, 5, 108, 0, 0, 820, 821, 5, 105, 0, 0, 821, 822, 5, 103, 0, 0, 822, 823, 5, 110, 0, 0, 823, 824, 5, 109, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 110, 0, 0, 826, 827, 5, 116, 0, 0, 827, 44, 1, 0, 0, 0, 828, 829, 5, 46, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 109, 0, 0, 831, 832, 5, 97, 0, 0, 832, 833, 5, 103, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 98, 0, 0, 835, 836, 5, 97, 0, 0, 836, 837, 5, 115, 0, 0, 837, 838, 5, 101, 0, 0, 838, 46, 1, 0, 0, 0, 839, 840, 5, 46, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 97, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 107, 0, 0, 845, 846, 5, 114, 0, 0, 846, 847, 5, 101, 0, 0, 847, 848, 5, 115, 0, 0, 848, 849, 5, 101, 0, 0, 849, 850, 5, 114, 0, 0, 850, 851, 5, 118, 0, 0, 851, 852, 5, 101, 0, 0, 852, 48, 1, 0, 0, 0, 853, 854, 5, 46, 0, 0, 854, 855, 5, 97, 0, 0, 855, 856, 5, 115, 0, 0, 856, 857, 5, 115, 0, 0, 857, 858, 5, 101, 0, 0, 858, 859, 5, 109, 0, 0, 859, 860, 5, 98, 0, 0, 860, 861, 5, 108, 0, 0, 861, 862, 5, 121, 0, 0, 862, 50, 1, 0, 0, 0, 863, 864, 5, 46, 0, 0, 864, 865, 5, 109, 0, 0, 865, 866, 5, 115, 0, 0, 866, 867, 5, 99, 0, 0, 867, 868, 5, 111, 0, 0, 868, 869, 5, 114, 0, 0, 869, 870, 5, 108, 0, 0, 870, 871, 5, 105, 0, 0, 871, 872, 5, 98, 0, 0, 872, 52, 1, 0, 0, 0, 873, 874, 5, 46, 0, 0, 874, 875, 5, 108, 0, 0, 875, 876, 5, 97, 0, 0, 876, 877, 5, 110, 0, 0, 877, 878, 5, 103, 0, 0, 878, 879, 5, 117, 0, 0, 879, 880, 5, 97, 0, 0, 880, 881, 5, 103, 0, 0, 881, 882, 5, 101, 0, 0, 882, 54, 1, 0, 0, 0, 883, 884, 5, 44, 0, 0, 884, 56, 1, 0, 0, 0, 885, 886, 5, 46, 0, 0, 886, 887, 5, 116, 0, 0, 887, 888, 5, 121, 0, 0, 888, 889, 5, 112, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 108, 0, 0, 891, 892, 5, 105, 0, 0, 892, 893, 5, 115, 0, 0, 893, 894, 5, 116, 0, 0, 894, 58, 1, 0, 0, 0, 895, 896, 5, 40, 0, 0, 896, 60, 1, 0, 0, 0, 897, 898, 5, 41, 0, 0, 898, 62, 1, 0, 0, 0, 899, 900, 5, 59, 0, 0, 900, 64, 1, 0, 0, 0, 901, 902, 5, 46, 0, 0, 902, 903, 5, 116, 0, 0, 903, 904, 5, 121, 0, 0, 904, 905, 5, 112, 0, 0, 905, 906, 5, 101, 0, 0, 906, 907, 5, 100, 0, 0, 907, 908, 5, 101, 0, 0, 908, 909, 5, 102, 0, 0, 909, 66, 1, 0, 0, 0, 910, 911, 5, 97, 0, 0, 911, 912, 5, 115, 0, 0, 912, 68, 1, 0, 0, 0, 913, 914, 5, 46, 0, 0, 914, 915, 5, 99, 0, 0, 915, 916, 5, 117, 0, 0, 916, 917, 5, 115, 0, 0, 917, 918, 5, 116, 0, 0, 918, 919, 5, 111, 0, 0, 919, 920, 5, 109, 0, 0, 920, 70, 1, 0, 0, 0, 921, 922, 5, 61, 0, 0, 922, 72, 1, 0, 0, 0, 923, 924, 5, 102, 0, 0, 924, 925, 5, 105, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 108, 0, 0, 927, 928, 5, 100, 0, 0, 928, 74, 1, 0, 0, 0, 929, 930, 5, 112, 0, 0, 930, 931, 5, 114, 0, 0, 931, 932, 5, 111, 0, 0, 932, 933, 5, 112, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 114, 0, 0, 935, 936, 5, 116, 0, 0, 936, 937, 5, 121, 0, 0, 937, 76, 1, 0, 0, 0, 938, 939, 5, 99, 0, 0, 939, 940, 5, 108, 0, 0, 940, 941, 5, 97, 0, 0, 941, 942, 5, 115, 0, 0, 942, 943, 5, 115, 0, 0, 943, 78, 1, 0, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 120, 0, 0, 946, 947, 5, 116, 0, 0, 947, 948, 5, 101, 0, 0, 948, 949, 5, 114, 0, 0, 949, 950, 5, 110, 0, 0, 950, 80, 1, 0, 0, 0, 951, 952, 5, 46, 0, 0, 952, 953, 5, 118, 0, 0, 953, 954, 5, 116, 0, 0, 954, 955, 5, 102, 0, 0, 955, 956, 5, 105, 0, 0, 956, 957, 5, 120, 0, 0, 957, 958, 5, 117, 0, 0, 958, 959, 5, 112, 0, 0, 959, 82, 1, 0, 0, 0, 960, 961, 5, 91, 0, 0, 961, 84, 1, 0, 0, 0, 962, 963, 5, 93, 0, 0, 963, 86, 1, 0, 0, 0, 964, 965, 5, 97, 0, 0, 965, 966, 5, 116, 0, 0, 966, 88, 1, 0, 0, 0, 967, 968, 5, 102, 0, 0, 968, 969, 5, 114, 0, 0, 969, 970, 5, 111, 0, 0, 970, 971, 5, 109, 0, 0, 971, 972, 5, 117, 0, 0, 972, 973, 5, 110, 0, 0, 973, 974, 5, 109, 0, 0, 974, 975, 5, 97, 0, 0, 975, 976, 5, 110, 0, 0, 976, 977, 5, 97, 0, 0, 977, 978, 5, 103, 0, 0, 978, 979, 5, 101, 0, 0, 979, 980, 5, 100, 0, 0, 980, 90, 1, 0, 0, 0, 981, 982, 5, 99, 0, 0, 982, 983, 5, 97, 0, 0, 983, 984, 5, 108, 0, 0, 984, 985, 5, 108, 0, 0, 985, 986, 5, 109, 0, 0, 986, 987, 5, 111, 0, 0, 987, 988, 5, 115, 0, 0, 988, 989, 5, 116, 0, 0, 989, 990, 5, 100, 0, 0, 990, 991, 5, 101, 0, 0, 991, 992, 5, 114, 0, 0, 992, 993, 5, 105, 0, 0, 993, 994, 5, 118, 0, 0, 994, 995, 5, 101, 0, 0, 995, 996, 5, 100, 0, 0, 996, 92, 1, 0, 0, 0, 997, 998, 5, 114, 0, 0, 998, 999, 5, 101, 0, 0, 999, 1000, 5, 116, 0, 0, 1000, 1001, 5, 97, 0, 0, 1001, 1002, 5, 105, 0, 0, 1002, 1003, 5, 110, 0, 0, 1003, 1004, 5, 97, 0, 0, 1004, 1005, 5, 112, 0, 0, 1005, 1006, 5, 112, 0, 0, 1006, 1007, 5, 100, 0, 0, 1007, 1008, 5, 111, 0, 0, 1008, 1009, 5, 109, 0, 0, 1009, 1010, 5, 97, 0, 0, 1010, 1011, 5, 105, 0, 0, 1011, 1012, 5, 110, 0, 0, 1012, 94, 1, 0, 0, 0, 1013, 1014, 5, 46, 0, 0, 1014, 1015, 5, 118, 0, 0, 1015, 1016, 5, 116, 0, 0, 1016, 1017, 5, 97, 0, 0, 1017, 1018, 5, 98, 0, 0, 1018, 1019, 5, 108, 0, 0, 1019, 1020, 5, 101, 0, 0, 1020, 96, 1, 0, 0, 0, 1021, 1022, 5, 46, 0, 0, 1022, 1023, 5, 110, 0, 0, 1023, 1024, 5, 97, 0, 0, 1024, 1025, 5, 109, 0, 0, 1025, 1026, 5, 101, 0, 0, 1026, 1027, 5, 115, 0, 0, 1027, 1028, 5, 112, 0, 0, 1028, 1029, 5, 97, 0, 0, 1029, 1030, 5, 99, 0, 0, 1030, 1031, 5, 101, 0, 0, 1031, 98, 1, 0, 0, 0, 1032, 1033, 5, 46, 0, 0, 1033, 1034, 5, 99, 0, 0, 1034, 1035, 5, 108, 0, 0, 1035, 1036, 5, 97, 0, 0, 1036, 1037, 5, 115, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 100, 1, 0, 0, 0, 1039, 1040, 5, 112, 0, 0, 1040, 1041, 5, 117, 0, 0, 1041, 1042, 5, 98, 0, 0, 1042, 1043, 5, 108, 0, 0, 1043, 1044, 5, 105, 0, 0, 1044, 1045, 5, 99, 0, 0, 1045, 102, 1, 0, 0, 0, 1046, 1047, 5, 112, 0, 0, 1047, 1048, 5, 114, 0, 0, 1048, 1049, 5, 105, 0, 0, 1049, 1050, 5, 118, 0, 0, 1050, 1051, 5, 97, 0, 0, 1051, 1052, 5, 116, 0, 0, 1052, 1053, 5, 101, 0, 0, 1053, 104, 1, 0, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 101, 0, 0, 1056, 1057, 5, 97, 0, 0, 1057, 1058, 5, 108, 0, 0, 1058, 1059, 5, 101, 0, 0, 1059, 1060, 5, 100, 0, 0, 1060, 106, 1, 0, 0, 0, 1061, 1062, 5, 97, 0, 0, 1062, 1063, 5, 98, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 116, 0, 0, 1065, 1066, 5, 114, 0, 0, 1066, 1067, 5, 97, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 116, 0, 0, 1069, 108, 1, 0, 0, 0, 1070, 1071, 5, 97, 0, 0, 1071, 1072, 5, 117, 0, 0, 1072, 1073, 5, 116, 0, 0, 1073, 1074, 5, 111, 0, 0, 1074, 110, 1, 0, 0, 0, 1075, 1076, 5, 115, 0, 0, 1076, 1077, 5, 101, 0, 0, 1077, 1078, 5, 113, 0, 0, 1078, 1079, 5, 117, 0, 0, 1079, 1080, 5, 101, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 116, 0, 0, 1082, 1083, 5, 105, 0, 0, 1083, 1084, 5, 97, 0, 0, 1084, 1085, 5, 108, 0, 0, 1085, 112, 1, 0, 0, 0, 1086, 1087, 5, 117, 0, 0, 1087, 1088, 5, 110, 0, 0, 1088, 1089, 5, 105, 0, 0, 1089, 1090, 5, 99, 0, 0, 1090, 1091, 5, 111, 0, 0, 1091, 1092, 5, 100, 0, 0, 1092, 1093, 5, 101, 0, 0, 1093, 114, 1, 0, 0, 0, 1094, 1095, 5, 97, 0, 0, 1095, 1096, 5, 117, 0, 0, 1096, 1097, 5, 116, 0, 0, 1097, 1098, 5, 111, 0, 0, 1098, 1099, 5, 99, 0, 0, 1099, 1100, 5, 104, 0, 0, 1100, 1101, 5, 97, 0, 0, 1101, 1102, 5, 114, 0, 0, 1102, 116, 1, 0, 0, 0, 1103, 1104, 5, 105, 0, 0, 1104, 1105, 5, 109, 0, 0, 1105, 1106, 5, 112, 0, 0, 1106, 1107, 5, 111, 0, 0, 1107, 1108, 5, 114, 0, 0, 1108, 1109, 5, 116, 0, 0, 1109, 118, 1, 0, 0, 0, 1110, 1111, 5, 115, 0, 0, 1111, 1112, 5, 101, 0, 0, 1112, 1113, 5, 114, 0, 0, 1113, 1114, 5, 105, 0, 0, 1114, 1115, 5, 97, 0, 0, 1115, 1116, 5, 108, 0, 0, 1116, 1117, 5, 105, 0, 0, 1117, 1118, 5, 122, 0, 0, 1118, 1119, 5, 97, 0, 0, 1119, 1120, 5, 98, 0, 0, 1120, 1121, 5, 108, 0, 0, 1121, 1122, 5, 101, 0, 0, 1122, 120, 1, 0, 0, 0, 1123, 1124, 5, 119, 0, 0, 1124, 1125, 5, 105, 0, 0, 1125, 1126, 5, 110, 0, 0, 1126, 1127, 5, 100, 0, 0, 1127, 1128, 5, 111, 0, 0, 1128, 1129, 5, 119, 0, 0, 1129, 1130, 5, 115, 0, 0, 1130, 1131, 5, 114, 0, 0, 1131, 1132, 5, 117, 0, 0, 1132, 1133, 5, 110, 0, 0, 1133, 1134, 5, 116, 0, 0, 1134, 1135, 5, 105, 0, 0, 1135, 1136, 5, 109, 0, 0, 1136, 1137, 5, 101, 0, 0, 1137, 122, 1, 0, 0, 0, 1138, 1139, 5, 110, 0, 0, 1139, 1140, 5, 101, 0, 0, 1140, 1141, 5, 115, 0, 0, 1141, 1142, 5, 116, 0, 0, 1142, 1143, 5, 101, 0, 0, 1143, 1144, 5, 100, 0, 0, 1144, 124, 1, 0, 0, 0, 1145, 1146, 5, 102, 0, 0, 1146, 1147, 5, 97, 0, 0, 1147, 1148, 5, 109, 0, 0, 1148, 1149, 5, 105, 0, 0, 1149, 1150, 5, 108, 0, 0, 1150, 1151, 5, 121, 0, 0, 1151, 126, 1, 0, 0, 0, 1152, 1153, 5, 97, 0, 0, 1153, 1154, 5, 115, 0, 0, 1154, 1155, 5, 115, 0, 0, 1155, 1156, 5, 101, 0, 0, 1156, 1157, 5, 109, 0, 0, 1157, 1158, 5, 98, 0, 0, 1158, 1159, 5, 108, 0, 0, 1159, 1160, 5, 121, 0, 0, 1160, 128, 1, 0, 0, 0, 1161, 1162, 5, 102, 0, 0, 1162, 1163, 5, 97, 0, 0, 1163, 1164, 5, 109, 0, 0, 1164, 1165, 5, 97, 0, 0, 1165, 1166, 5, 110, 0, 0, 1166, 1167, 5, 100, 0, 0, 1167, 1168, 5, 97, 0, 0, 1168, 1169, 5, 115, 0, 0, 1169, 1170, 5, 115, 0, 0, 1170, 1171, 5, 101, 0, 0, 1171, 1172, 5, 109, 0, 0, 1172, 130, 1, 0, 0, 0, 1173, 1174, 5, 102, 0, 0, 1174, 1175, 5, 97, 0, 0, 1175, 1176, 5, 109, 0, 0, 1176, 1177, 5, 111, 0, 0, 1177, 1178, 5, 114, 0, 0, 1178, 1179, 5, 97, 0, 0, 1179, 1180, 5, 115, 0, 0, 1180, 1181, 5, 115, 0, 0, 1181, 1182, 5, 101, 0, 0, 1182, 1183, 5, 109, 0, 0, 1183, 132, 1, 0, 0, 0, 1184, 1185, 5, 98, 0, 0, 1185, 1186, 5, 101, 0, 0, 1186, 1187, 5, 102, 0, 0, 1187, 1188, 5, 111, 0, 0, 1188, 1189, 5, 114, 0, 0, 1189, 1190, 5, 101, 0, 0, 1190, 1191, 5, 102, 0, 0, 1191, 1192, 5, 105, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 108, 0, 0, 1194, 1195, 5, 100, 0, 0, 1195, 1196, 5, 105, 0, 0, 1196, 1197, 5, 110, 0, 0, 1197, 1198, 5, 105, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 134, 1, 0, 0, 0, 1200, 1201, 5, 115, 0, 0, 1201, 1202, 5, 112, 0, 0, 1202, 1203, 5, 101, 0, 0, 1203, 1204, 5, 99, 0, 0, 1204, 1205, 5, 105, 0, 0, 1205, 1206, 5, 97, 0, 0, 1206, 1207, 5, 108, 0, 0, 1207, 1208, 5, 110, 0, 0, 1208, 1209, 5, 97, 0, 0, 1209, 1210, 5, 109, 0, 0, 1210, 1211, 5, 101, 0, 0, 1211, 136, 1, 0, 0, 0, 1212, 1213, 5, 114, 0, 0, 1213, 1214, 5, 116, 0, 0, 1214, 1215, 5, 115, 0, 0, 1215, 1216, 5, 112, 0, 0, 1216, 1217, 5, 101, 0, 0, 1217, 1218, 5, 99, 0, 0, 1218, 1219, 5, 105, 0, 0, 1219, 1220, 5, 97, 0, 0, 1220, 1221, 5, 108, 0, 0, 1221, 1222, 5, 110, 0, 0, 1222, 1223, 5, 97, 0, 0, 1223, 1224, 5, 109, 0, 0, 1224, 1225, 5, 101, 0, 0, 1225, 138, 1, 0, 0, 0, 1226, 1227, 5, 102, 0, 0, 1227, 1228, 5, 108, 0, 0, 1228, 1229, 5, 97, 0, 0, 1229, 1230, 5, 103, 0, 0, 1230, 1231, 5, 115, 0, 0, 1231, 140, 1, 0, 0, 0, 1232, 1233, 5, 101, 0, 0, 1233, 1234, 5, 120, 0, 0, 1234, 1235, 5, 116, 0, 0, 1235, 1236, 5, 101, 0, 0, 1236, 1237, 5, 110, 0, 0, 1237, 1238, 5, 100, 0, 0, 1238, 1239, 5, 115, 0, 0, 1239, 142, 1, 0, 0, 0, 1240, 1241, 5, 105, 0, 0, 1241, 1242, 5, 109, 0, 0, 1242, 1243, 5, 112, 0, 0, 1243, 1244, 5, 108, 0, 0, 1244, 1245, 5, 101, 0, 0, 1245, 1246, 5, 109, 0, 0, 1246, 1247, 5, 101, 0, 0, 1247, 1248, 5, 110, 0, 0, 1248, 1249, 5, 116, 0, 0, 1249, 1250, 5, 115, 0, 0, 1250, 144, 1, 0, 0, 0, 1251, 1252, 5, 46, 0, 0, 1252, 1253, 5, 108, 0, 0, 1253, 1254, 5, 105, 0, 0, 1254, 1255, 5, 110, 0, 0, 1255, 1256, 5, 101, 0, 0, 1256, 146, 1, 0, 0, 0, 1257, 1258, 5, 35, 0, 0, 1258, 1259, 5, 108, 0, 0, 1259, 1260, 5, 105, 0, 0, 1260, 1261, 5, 110, 0, 0, 1261, 1262, 5, 101, 0, 0, 1262, 148, 1, 0, 0, 0, 1263, 1264, 5, 58, 0, 0, 1264, 150, 1, 0, 0, 0, 1265, 1266, 5, 110, 0, 0, 1266, 1267, 5, 111, 0, 0, 1267, 1268, 5, 109, 0, 0, 1268, 1269, 5, 101, 0, 0, 1269, 1270, 5, 116, 0, 0, 1270, 1271, 5, 97, 0, 0, 1271, 1272, 5, 100, 0, 0, 1272, 1273, 5, 97, 0, 0, 1273, 1274, 5, 116, 0, 0, 1274, 1275, 5, 97, 0, 0, 1275, 152, 1, 0, 0, 0, 1276, 1277, 5, 114, 0, 0, 1277, 1278, 5, 101, 0, 0, 1278, 1279, 5, 116, 0, 0, 1279, 1280, 5, 97, 0, 0, 1280, 1281, 5, 114, 0, 0, 1281, 1282, 5, 103, 0, 0, 1282, 1283, 5, 101, 0, 0, 1283, 1284, 5, 116, 0, 0, 1284, 1285, 5, 97, 0, 0, 1285, 1286, 5, 98, 0, 0, 1286, 1287, 5, 108, 0, 0, 1287, 1288, 5, 101, 0, 0, 1288, 154, 1, 0, 0, 0, 1289, 1290, 5, 110, 0, 0, 1290, 1291, 5, 111, 0, 0, 1291, 1292, 5, 112, 0, 0, 1292, 1293, 5, 108, 0, 0, 1293, 1294, 5, 97, 0, 0, 1294, 1295, 5, 116, 0, 0, 1295, 1296, 5, 102, 0, 0, 1296, 1297, 5, 111, 0, 0, 1297, 1298, 5, 114, 0, 0, 1298, 1299, 5, 109, 0, 0, 1299, 156, 1, 0, 0, 0, 1300, 1301, 5, 108, 0, 0, 1301, 1302, 5, 101, 0, 0, 1302, 1303, 5, 103, 0, 0, 1303, 1304, 5, 97, 0, 0, 1304, 1305, 5, 99, 0, 0, 1305, 1306, 5, 121, 0, 0, 1306, 1307, 5, 32, 0, 0, 1307, 1308, 5, 108, 0, 0, 1308, 1309, 5, 105, 0, 0, 1309, 1310, 5, 98, 0, 0, 1310, 1311, 5, 114, 0, 0, 1311, 1312, 5, 97, 0, 0, 1312, 1313, 5, 114, 0, 0, 1313, 1314, 5, 121, 0, 0, 1314, 158, 1, 0, 0, 0, 1315, 1316, 5, 120, 0, 0, 1316, 1317, 5, 56, 0, 0, 1317, 1318, 5, 54, 0, 0, 1318, 160, 1, 0, 0, 0, 1319, 1320, 5, 97, 0, 0, 1320, 1321, 5, 109, 0, 0, 1321, 1322, 5, 100, 0, 0, 1322, 1323, 5, 54, 0, 0, 1323, 1324, 5, 52, 0, 0, 1324, 162, 1, 0, 0, 0, 1325, 1326, 5, 97, 0, 0, 1326, 1327, 5, 114, 0, 0, 1327, 1328, 5, 109, 0, 0, 1328, 164, 1, 0, 0, 0, 1329, 1330, 5, 97, 0, 0, 1330, 1331, 5, 114, 0, 0, 1331, 1332, 5, 109, 0, 0, 1332, 1333, 5, 54, 0, 0, 1333, 1334, 5, 52, 0, 0, 1334, 166, 1, 0, 0, 0, 1335, 1336, 5, 98, 0, 0, 1336, 1337, 5, 121, 0, 0, 1337, 1338, 5, 116, 0, 0, 1338, 1339, 5, 101, 0, 0, 1339, 1340, 5, 97, 0, 0, 1340, 1341, 5, 114, 0, 0, 1341, 1342, 5, 114, 0, 0, 1342, 1343, 5, 97, 0, 0, 1343, 1344, 5, 121, 0, 0, 1344, 168, 1, 0, 0, 0, 1345, 1346, 5, 40, 0, 0, 1346, 1347, 5, 41, 0, 0, 1347, 170, 1, 0, 0, 0, 1348, 1349, 5, 60, 0, 0, 1349, 172, 1, 0, 0, 0, 1350, 1351, 5, 62, 0, 0, 1351, 174, 1, 0, 0, 0, 1352, 1353, 5, 47, 0, 0, 1353, 176, 1, 0, 0, 0, 1354, 1355, 5, 97, 0, 0, 1355, 1356, 5, 108, 0, 0, 1356, 1357, 5, 103, 0, 0, 1357, 1358, 5, 111, 0, 0, 1358, 1359, 5, 114, 0, 0, 1359, 1360, 5, 105, 0, 0, 1360, 1361, 5, 116, 0, 0, 1361, 1362, 5, 104, 0, 0, 1362, 1363, 5, 109, 0, 0, 1363, 178, 1, 0, 0, 0, 1364, 1365, 5, 117, 0, 0, 1365, 1366, 5, 110, 0, 0, 1366, 1367, 5, 115, 0, 0, 1367, 1368, 5, 105, 0, 0, 1368, 1369, 5, 103, 0, 0, 1369, 1370, 5, 110, 0, 0, 1370, 1371, 5, 101, 0, 0, 1371, 1372, 5, 100, 0, 0, 1372, 180, 1, 0, 0, 0, 1373, 1374, 5, 105, 0, 0, 1374, 1375, 5, 105, 0, 0, 1375, 1376, 5, 100, 0, 0, 1376, 1377, 5, 112, 0, 0, 1377, 1378, 5, 97, 0, 0, 1378, 1379, 5, 114, 0, 0, 1379, 1380, 5, 97, 0, 0, 1380, 1381, 5, 109, 0, 0, 1381, 182, 1, 0, 0, 0, 1382, 1383, 5, 112, 0, 0, 1383, 1384, 5, 105, 0, 0, 1384, 1385, 5, 110, 0, 0, 1385, 1386, 5, 110, 0, 0, 1386, 1387, 5, 101, 0, 0, 1387, 1388, 5, 100, 0, 0, 1388, 184, 1, 0, 0, 0, 1389, 1390, 5, 109, 0, 0, 1390, 1391, 5, 111, 0, 0, 1391, 1392, 5, 100, 0, 0, 1392, 1393, 5, 114, 0, 0, 1393, 1394, 5, 101, 0, 0, 1394, 1395, 5, 113, 0, 0, 1395, 186, 1, 0, 0, 0, 1396, 1397, 5, 109, 0, 0, 1397, 1398, 5, 111, 0, 0, 1398, 1399, 5, 100, 0, 0, 1399, 1400, 5, 111, 0, 0, 1400, 1401, 5, 112, 0, 0, 1401, 1402, 5, 116, 0, 0, 1402, 188, 1, 0, 0, 0, 1403, 1404, 5, 116, 0, 0, 1404, 1405, 5, 114, 0, 0, 1405, 1406, 5, 117, 0, 0, 1406, 1407, 5, 101, 0, 0, 1407, 190, 1, 0, 0, 0, 1408, 1409, 5, 102, 0, 0, 1409, 1410, 5, 97, 0, 0, 1410, 1411, 5, 108, 0, 0, 1411, 1412, 5, 115, 0, 0, 1412, 1413, 5, 101, 0, 0, 1413, 192, 1, 0, 0, 0, 1414, 1415, 5, 114, 0, 0, 1415, 1416, 5, 101, 0, 0, 1416, 1417, 5, 113, 0, 0, 1417, 1418, 5, 117, 0, 0, 1418, 1419, 5, 101, 0, 0, 1419, 1420, 5, 115, 0, 0, 1420, 1421, 5, 116, 0, 0, 1421, 194, 1, 0, 0, 0, 1422, 1423, 5, 100, 0, 0, 1423, 1424, 5, 101, 0, 0, 1424, 1425, 5, 109, 0, 0, 1425, 1426, 5, 97, 0, 0, 1426, 1427, 5, 110, 0, 0, 1427, 1428, 5, 100, 0, 0, 1428, 196, 1, 0, 0, 0, 1429, 1430, 5, 97, 0, 0, 1430, 1431, 5, 115, 0, 0, 1431, 1432, 5, 115, 0, 0, 1432, 1433, 5, 101, 0, 0, 1433, 1434, 5, 114, 0, 0, 1434, 1435, 5, 116, 0, 0, 1435, 198, 1, 0, 0, 0, 1436, 1437, 5, 100, 0, 0, 1437, 1438, 5, 101, 0, 0, 1438, 1439, 5, 110, 0, 0, 1439, 1440, 5, 121, 0, 0, 1440, 200, 1, 0, 0, 0, 1441, 1442, 5, 112, 0, 0, 1442, 1443, 5, 101, 0, 0, 1443, 1444, 5, 114, 0, 0, 1444, 1445, 5, 109, 0, 0, 1445, 1446, 5, 105, 0, 0, 1446, 1447, 5, 116, 0, 0, 1447, 1448, 5, 111, 0, 0, 1448, 1449, 5, 110, 0, 0, 1449, 1450, 5, 108, 0, 0, 1450, 1451, 5, 121, 0, 0, 1451, 202, 1, 0, 0, 0, 1452, 1453, 5, 108, 0, 0, 1453, 1454, 5, 105, 0, 0, 1454, 1455, 5, 110, 0, 0, 1455, 1456, 5, 107, 0, 0, 1456, 1457, 5, 99, 0, 0, 1457, 1458, 5, 104, 0, 0, 1458, 1459, 5, 101, 0, 0, 1459, 1460, 5, 99, 0, 0, 1460, 1461, 5, 107, 0, 0, 1461, 204, 1, 0, 0, 0, 1462, 1463, 5, 105, 0, 0, 1463, 1464, 5, 110, 0, 0, 1464, 1465, 5, 104, 0, 0, 1465, 1466, 5, 101, 0, 0, 1466, 1467, 5, 114, 0, 0, 1467, 1468, 5, 105, 0, 0, 1468, 1469, 5, 116, 0, 0, 1469, 1470, 5, 99, 0, 0, 1470, 1471, 5, 104, 0, 0, 1471, 1472, 5, 101, 0, 0, 1472, 1473, 5, 99, 0, 0, 1473, 1474, 5, 107, 0, 0, 1474, 206, 1, 0, 0, 0, 1475, 1476, 5, 114, 0, 0, 1476, 1477, 5, 101, 0, 0, 1477, 1478, 5, 113, 0, 0, 1478, 1479, 5, 109, 0, 0, 1479, 1480, 5, 105, 0, 0, 1480, 1481, 5, 110, 0, 0, 1481, 208, 1, 0, 0, 0, 1482, 1483, 5, 114, 0, 0, 1483, 1484, 5, 101, 0, 0, 1484, 1485, 5, 113, 0, 0, 1485, 1486, 5, 111, 0, 0, 1486, 1487, 5, 112, 0, 0, 1487, 1488, 5, 116, 0, 0, 1488, 210, 1, 0, 0, 0, 1489, 1490, 5, 114, 0, 0, 1490, 1491, 5, 101, 0, 0, 1491, 1492, 5, 113, 0, 0, 1492, 1493, 5, 114, 0, 0, 1493, 1494, 5, 101, 0, 0, 1494, 1495, 5, 102, 0, 0, 1495, 1496, 5, 117, 0, 0, 1496, 1497, 5, 115, 0, 0, 1497, 1498, 5, 101, 0, 0, 1498, 212, 1, 0, 0, 0, 1499, 1500, 5, 112, 0, 0, 1500, 1501, 5, 114, 0, 0, 1501, 1502, 5, 101, 0, 0, 1502, 1503, 5, 106, 0, 0, 1503, 1504, 5, 105, 0, 0, 1504, 1505, 5, 116, 0, 0, 1505, 1506, 5, 103, 0, 0, 1506, 1507, 5, 114, 0, 0, 1507, 1508, 5, 97, 0, 0, 1508, 1509, 5, 110, 0, 0, 1509, 1510, 5, 116, 0, 0, 1510, 214, 1, 0, 0, 0, 1511, 1512, 5, 112, 0, 0, 1512, 1513, 5, 114, 0, 0, 1513, 1514, 5, 101, 0, 0, 1514, 1515, 5, 106, 0, 0, 1515, 1516, 5, 105, 0, 0, 1516, 1517, 5, 116, 0, 0, 1517, 1518, 5, 100, 0, 0, 1518, 1519, 5, 101, 0, 0, 1519, 1520, 5, 110, 0, 0, 1520, 1521, 5, 121, 0, 0, 1521, 216, 1, 0, 0, 0, 1522, 1523, 5, 110, 0, 0, 1523, 1524, 5, 111, 0, 0, 1524, 1525, 5, 110, 0, 0, 1525, 1526, 5, 99, 0, 0, 1526, 1527, 5, 97, 0, 0, 1527, 1528, 5, 115, 0, 0, 1528, 1529, 5, 100, 0, 0, 1529, 1530, 5, 101, 0, 0, 1530, 1531, 5, 109, 0, 0, 1531, 1532, 5, 97, 0, 0, 1532, 1533, 5, 110, 0, 0, 1533, 1534, 5, 100, 0, 0, 1534, 218, 1, 0, 0, 0, 1535, 1536, 5, 110, 0, 0, 1536, 1537, 5, 111, 0, 0, 1537, 1538, 5, 110, 0, 0, 1538, 1539, 5, 99, 0, 0, 1539, 1540, 5, 97, 0, 0, 1540, 1541, 5, 115, 0, 0, 1541, 1542, 5, 108, 0, 0, 1542, 1543, 5, 105, 0, 0, 1543, 1544, 5, 110, 0, 0, 1544, 1545, 5, 107, 0, 0, 1545, 1546, 5, 100, 0, 0, 1546, 1547, 5, 101, 0, 0, 1547, 1548, 5, 109, 0, 0, 1548, 1549, 5, 97, 0, 0, 1549, 1550, 5, 110, 0, 0, 1550, 1551, 5, 100, 0, 0, 1551, 220, 1, 0, 0, 0, 1552, 1553, 5, 110, 0, 0, 1553, 1554, 5, 111, 0, 0, 1554, 1555, 5, 110, 0, 0, 1555, 1556, 5, 99, 0, 0, 1556, 1557, 5, 97, 0, 0, 1557, 1558, 5, 115, 0, 0, 1558, 1559, 5, 105, 0, 0, 1559, 1560, 5, 110, 0, 0, 1560, 1561, 5, 104, 0, 0, 1561, 1562, 5, 101, 0, 0, 1562, 1563, 5, 114, 0, 0, 1563, 1564, 5, 105, 0, 0, 1564, 1565, 5, 116, 0, 0, 1565, 1566, 5, 97, 0, 0, 1566, 1567, 5, 110, 0, 0, 1567, 1568, 5, 99, 0, 0, 1568, 1569, 5, 101, 0, 0, 1569, 222, 1, 0, 0, 0, 1570, 1571, 5, 99, 0, 0, 1571, 1572, 5, 97, 0, 0, 1572, 1573, 5, 108, 0, 0, 1573, 1574, 5, 108, 0, 0, 1574, 1575, 5, 99, 0, 0, 1575, 1576, 5, 111, 0, 0, 1576, 1577, 5, 110, 0, 0, 1577, 1578, 5, 118, 0, 0, 1578, 224, 1, 0, 0, 0, 1579, 1580, 5, 109, 0, 0, 1580, 1581, 5, 100, 0, 0, 1581, 1582, 5, 116, 0, 0, 1582, 1583, 5, 111, 0, 0, 1583, 1584, 5, 107, 0, 0, 1584, 1585, 5, 101, 0, 0, 1585, 1586, 5, 110, 0, 0, 1586, 226, 1, 0, 0, 0, 1587, 1588, 5, 45, 0, 0, 1588, 228, 1, 0, 0, 0, 1589, 1590, 5, 98, 0, 0, 1590, 1591, 5, 121, 0, 0, 1591, 1592, 5, 114, 0, 0, 1592, 1593, 5, 101, 0, 0, 1593, 1594, 5, 102, 0, 0, 1594, 1595, 5, 108, 0, 0, 1595, 1596, 5, 105, 0, 0, 1596, 1597, 5, 107, 0, 0, 1597, 1598, 5, 101, 0, 0, 1598, 230, 1, 0, 0, 0, 1599, 1600, 5, 46, 0, 0, 1600, 1601, 5, 99, 0, 0, 1601, 1602, 5, 116, 0, 0, 1602, 1603, 5, 111, 0, 0, 1603, 1604, 5, 114, 0, 0, 1604, 232, 1, 0, 0, 0, 1605, 1606, 5, 46, 0, 0, 1606, 1607, 5, 115, 0, 0, 1607, 1608, 5, 105, 0, 0, 1608, 1609, 5, 122, 0, 0, 1609, 1610, 5, 101, 0, 0, 1610, 234, 1, 0, 0, 0, 1611, 1612, 5, 46, 0, 0, 1612, 1613, 5, 112, 0, 0, 1613, 1614, 5, 97, 0, 0, 1614, 1615, 5, 99, 0, 0, 1615, 1616, 5, 107, 0, 0, 1616, 236, 1, 0, 0, 0, 1617, 1618, 5, 119, 0, 0, 1618, 1619, 5, 105, 0, 0, 1619, 1620, 5, 116, 0, 0, 1620, 1621, 5, 104, 0, 0, 1621, 238, 1, 0, 0, 0, 1622, 1623, 5, 46, 0, 0, 1623, 1624, 5, 105, 0, 0, 1624, 1625, 5, 110, 0, 0, 1625, 1626, 5, 116, 0, 0, 1626, 1627, 5, 101, 0, 0, 1627, 1628, 5, 114, 0, 0, 1628, 1629, 5, 102, 0, 0, 1629, 1630, 5, 97, 0, 0, 1630, 1631, 5, 99, 0, 0, 1631, 1632, 5, 101, 0, 0, 1632, 1633, 5, 105, 0, 0, 1633, 1634, 5, 109, 0, 0, 1634, 1635, 5, 112, 0, 0, 1635, 1636, 5, 108, 0, 0, 1636, 240, 1, 0, 0, 0, 1637, 1638, 5, 46, 0, 0, 1638, 1639, 5, 102, 0, 0, 1639, 1640, 5, 105, 0, 0, 1640, 1641, 5, 101, 0, 0, 1641, 1642, 5, 108, 0, 0, 1642, 1643, 5, 100, 0, 0, 1643, 242, 1, 0, 0, 0, 1644, 1645, 5, 109, 0, 0, 1645, 1646, 5, 97, 0, 0, 1646, 1647, 5, 114, 0, 0, 1647, 1648, 5, 115, 0, 0, 1648, 1649, 5, 104, 0, 0, 1649, 1650, 5, 97, 0, 0, 1650, 1651, 5, 108, 0, 0, 1651, 244, 1, 0, 0, 0, 1652, 1653, 5, 115, 0, 0, 1653, 1654, 5, 116, 0, 0, 1654, 1655, 5, 97, 0, 0, 1655, 1656, 5, 116, 0, 0, 1656, 1657, 5, 105, 0, 0, 1657, 1658, 5, 99, 0, 0, 1658, 246, 1, 0, 0, 0, 1659, 1660, 5, 105, 0, 0, 1660, 1661, 5, 110, 0, 0, 1661, 1662, 5, 105, 0, 0, 1662, 1663, 5, 116, 0, 0, 1663, 1664, 5, 111, 0, 0, 1664, 1665, 5, 110, 0, 0, 1665, 1666, 5, 108, 0, 0, 1666, 1667, 5, 121, 0, 0, 1667, 248, 1, 0, 0, 0, 1668, 1669, 5, 112, 0, 0, 1669, 1670, 5, 114, 0, 0, 1670, 1671, 5, 105, 0, 0, 1671, 1672, 5, 118, 0, 0, 1672, 1673, 5, 97, 0, 0, 1673, 1674, 5, 116, 0, 0, 1674, 1675, 5, 101, 0, 0, 1675, 1676, 5, 115, 0, 0, 1676, 1677, 5, 99, 0, 0, 1677, 1678, 5, 111, 0, 0, 1678, 1679, 5, 112, 0, 0, 1679, 1680, 5, 101, 0, 0, 1680, 250, 1, 0, 0, 0, 1681, 1682, 5, 108, 0, 0, 1682, 1683, 5, 105, 0, 0, 1683, 1684, 5, 116, 0, 0, 1684, 1685, 5, 101, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 97, 0, 0, 1687, 1688, 5, 108, 0, 0, 1688, 252, 1, 0, 0, 0, 1689, 1690, 5, 110, 0, 0, 1690, 1691, 5, 111, 0, 0, 1691, 1692, 5, 116, 0, 0, 1692, 1693, 5, 115, 0, 0, 1693, 1694, 5, 101, 0, 0, 1694, 1695, 5, 114, 0, 0, 1695, 1696, 5, 105, 0, 0, 1696, 1697, 5, 97, 0, 0, 1697, 1698, 5, 108, 0, 0, 1698, 1699, 5, 105, 0, 0, 1699, 1700, 5, 122, 0, 0, 1700, 1701, 5, 101, 0, 0, 1701, 1702, 5, 100, 0, 0, 1702, 254, 1, 0, 0, 0, 1703, 1704, 5, 46, 0, 0, 1704, 1705, 5, 101, 0, 0, 1705, 1706, 5, 118, 0, 0, 1706, 1707, 5, 101, 0, 0, 1707, 1708, 5, 110, 0, 0, 1708, 1709, 5, 116, 0, 0, 1709, 256, 1, 0, 0, 0, 1710, 1711, 5, 46, 0, 0, 1711, 1712, 5, 97, 0, 0, 1712, 1713, 5, 100, 0, 0, 1713, 1714, 5, 100, 0, 0, 1714, 1715, 5, 111, 0, 0, 1715, 1716, 5, 110, 0, 0, 1716, 258, 1, 0, 0, 0, 1717, 1718, 5, 46, 0, 0, 1718, 1719, 5, 114, 0, 0, 1719, 1720, 5, 101, 0, 0, 1720, 1721, 5, 109, 0, 0, 1721, 1722, 5, 111, 0, 0, 1722, 1723, 5, 118, 0, 0, 1723, 1724, 5, 101, 0, 0, 1724, 1725, 5, 111, 0, 0, 1725, 1726, 5, 110, 0, 0, 1726, 260, 1, 0, 0, 0, 1727, 1728, 5, 46, 0, 0, 1728, 1729, 5, 102, 0, 0, 1729, 1730, 5, 105, 0, 0, 1730, 1731, 5, 114, 0, 0, 1731, 1732, 5, 101, 0, 0, 1732, 262, 1, 0, 0, 0, 1733, 1734, 5, 46, 0, 0, 1734, 1735, 5, 111, 0, 0, 1735, 1736, 5, 116, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 1738, 5, 101, 0, 0, 1738, 1739, 5, 114, 0, 0, 1739, 264, 1, 0, 0, 0, 1740, 1741, 5, 46, 0, 0, 1741, 1742, 5, 112, 0, 0, 1742, 1743, 5, 114, 0, 0, 1743, 1744, 5, 111, 0, 0, 1744, 1745, 5, 112, 0, 0, 1745, 1746, 5, 101, 0, 0, 1746, 1747, 5, 114, 0, 0, 1747, 1748, 5, 116, 0, 0, 1748, 1749, 5, 121, 0, 0, 1749, 266, 1, 0, 0, 0, 1750, 1751, 5, 46, 0, 0, 1751, 1752, 5, 115, 0, 0, 1752, 1753, 5, 101, 0, 0, 1753, 1754, 5, 116, 0, 0, 1754, 268, 1, 0, 0, 0, 1755, 1756, 5, 46, 0, 0, 1756, 1757, 5, 103, 0, 0, 1757, 1758, 5, 101, 0, 0, 1758, 1759, 5, 116, 0, 0, 1759, 270, 1, 0, 0, 0, 1760, 1761, 5, 105, 0, 0, 1761, 1762, 5, 110, 0, 0, 1762, 272, 1, 0, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 117, 0, 0, 1765, 1766, 5, 116, 0, 0, 1766, 274, 1, 0, 0, 0, 1767, 1768, 5, 111, 0, 0, 1768, 1769, 5, 112, 0, 0, 1769, 1770, 5, 116, 0, 0, 1770, 276, 1, 0, 0, 0, 1771, 1772, 5, 46, 0, 0, 1772, 1773, 5, 109, 0, 0, 1773, 1774, 5, 101, 0, 0, 1774, 1775, 5, 116, 0, 0, 1775, 1776, 5, 104, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 100, 0, 0, 1778, 278, 1, 0, 0, 0, 1779, 1780, 5, 102, 0, 0, 1780, 1781, 5, 105, 0, 0, 1781, 1782, 5, 110, 0, 0, 1782, 1783, 5, 97, 0, 0, 1783, 1784, 5, 108, 0, 0, 1784, 280, 1, 0, 0, 0, 1785, 1786, 5, 118, 0, 0, 1786, 1787, 5, 105, 0, 0, 1787, 1788, 5, 114, 0, 0, 1788, 1789, 5, 116, 0, 0, 1789, 1790, 5, 117, 0, 0, 1790, 1791, 5, 97, 0, 0, 1791, 1792, 5, 108, 0, 0, 1792, 282, 1, 0, 0, 0, 1793, 1794, 5, 115, 0, 0, 1794, 1795, 5, 116, 0, 0, 1795, 1796, 5, 114, 0, 0, 1796, 1797, 5, 105, 0, 0, 1797, 1798, 5, 99, 0, 0, 1798, 1799, 5, 116, 0, 0, 1799, 284, 1, 0, 0, 0, 1800, 1801, 5, 104, 0, 0, 1801, 1802, 5, 105, 0, 0, 1802, 1803, 5, 100, 0, 0, 1803, 1804, 5, 101, 0, 0, 1804, 1805, 5, 98, 0, 0, 1805, 1806, 5, 121, 0, 0, 1806, 1807, 5, 115, 0, 0, 1807, 1808, 5, 105, 0, 0, 1808, 1809, 5, 103, 0, 0, 1809, 286, 1, 0, 0, 0, 1810, 1811, 5, 110, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 1813, 5, 119, 0, 0, 1813, 1814, 5, 115, 0, 0, 1814, 1815, 5, 108, 0, 0, 1815, 1816, 5, 111, 0, 0, 1816, 1817, 5, 116, 0, 0, 1817, 288, 1, 0, 0, 0, 1818, 1819, 5, 117, 0, 0, 1819, 1820, 5, 110, 0, 0, 1820, 1821, 5, 109, 0, 0, 1821, 1822, 5, 97, 0, 0, 1822, 1823, 5, 110, 0, 0, 1823, 1824, 5, 97, 0, 0, 1824, 1825, 5, 103, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 100, 0, 0, 1827, 1828, 5, 101, 0, 0, 1828, 1829, 5, 120, 0, 0, 1829, 1830, 5, 112, 0, 0, 1830, 290, 1, 0, 0, 0, 1831, 1832, 5, 114, 0, 0, 1832, 1833, 5, 101, 0, 0, 1833, 1834, 5, 113, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 101, 0, 0, 1836, 1837, 5, 99, 0, 0, 1837, 1838, 5, 111, 0, 0, 1838, 1839, 5, 98, 0, 0, 1839, 1840, 5, 106, 0, 0, 1840, 292, 1, 0, 0, 0, 1841, 1842, 5, 112, 0, 0, 1842, 1843, 5, 105, 0, 0, 1843, 1844, 5, 110, 0, 0, 1844, 1845, 5, 118, 0, 0, 1845, 1846, 5, 111, 0, 0, 1846, 1847, 5, 107, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 105, 0, 0, 1849, 1850, 5, 109, 0, 0, 1850, 1851, 5, 112, 0, 0, 1851, 1852, 5, 108, 0, 0, 1852, 294, 1, 0, 0, 0, 1853, 1854, 5, 110, 0, 0, 1854, 1855, 5, 111, 0, 0, 1855, 1856, 5, 109, 0, 0, 1856, 1857, 5, 97, 0, 0, 1857, 1858, 5, 110, 0, 0, 1858, 1859, 5, 103, 0, 0, 1859, 1860, 5, 108, 0, 0, 1860, 1861, 5, 101, 0, 0, 1861, 296, 1, 0, 0, 0, 1862, 1863, 5, 108, 0, 0, 1863, 1864, 5, 97, 0, 0, 1864, 1865, 5, 115, 0, 0, 1865, 1866, 5, 116, 0, 0, 1866, 1867, 5, 101, 0, 0, 1867, 1868, 5, 114, 0, 0, 1868, 1869, 5, 114, 0, 0, 1869, 298, 1, 0, 0, 0, 1870, 1871, 5, 119, 0, 0, 1871, 1872, 5, 105, 0, 0, 1872, 1873, 5, 110, 0, 0, 1873, 1874, 5, 97, 0, 0, 1874, 1875, 5, 112, 0, 0, 1875, 1876, 5, 105, 0, 0, 1876, 300, 1, 0, 0, 0, 1877, 1878, 5, 98, 0, 0, 1878, 1879, 5, 101, 0, 0, 1879, 1880, 5, 115, 0, 0, 1880, 1881, 5, 116, 0, 0, 1881, 1882, 5, 102, 0, 0, 1882, 1883, 5, 105, 0, 0, 1883, 1884, 5, 116, 0, 0, 1884, 302, 1, 0, 0, 0, 1885, 1886, 5, 111, 0, 0, 1886, 1887, 5, 110, 0, 0, 1887, 304, 1, 0, 0, 0, 1888, 1889, 5, 111, 0, 0, 1889, 1890, 5, 102, 0, 0, 1890, 1891, 5, 102, 0, 0, 1891, 306, 1, 0, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 104, 0, 0, 1894, 1895, 5, 97, 0, 0, 1895, 1896, 5, 114, 0, 0, 1896, 1897, 5, 109, 0, 0, 1897, 1898, 5, 97, 0, 0, 1898, 1899, 5, 112, 0, 0, 1899, 1900, 5, 101, 0, 0, 1900, 1901, 5, 114, 0, 0, 1901, 1902, 5, 114, 0, 0, 1902, 1903, 5, 111, 0, 0, 1903, 1904, 5, 114, 0, 0, 1904, 308, 1, 0, 0, 0, 1905, 1906, 5, 46, 0, 0, 1906, 1907, 5, 99, 0, 0, 1907, 1908, 5, 99, 0, 0, 1908, 1909, 5, 116, 0, 0, 1909, 1910, 5, 111, 0, 0, 1910, 1911, 5, 114, 0, 0, 1911, 310, 1, 0, 0, 0, 1912, 1913, 5, 105, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 312, 1, 0, 0, 0, 1915, 1916, 5, 105, 0, 0, 1916, 1917, 5, 110, 0, 0, 1917, 1918, 5, 105, 0, 0, 1918, 1919, 5, 116, 0, 0, 1919, 314, 1, 0, 0, 0, 1920, 1921, 5, 46, 0, 0, 1921, 1922, 5, 116, 0, 0, 1922, 1923, 5, 114, 0, 0, 1923, 1924, 5, 121, 0, 0, 1924, 316, 1, 0, 0, 0, 1925, 1926, 5, 116, 0, 0, 1926, 1927, 5, 111, 0, 0, 1927, 318, 1, 0, 0, 0, 1928, 1929, 5, 102, 0, 0, 1929, 1930, 5, 105, 0, 0, 1930, 1931, 5, 108, 0, 0, 1931, 1932, 5, 116, 0, 0, 1932, 1933, 5, 101, 0, 0, 1933, 1934, 5, 114, 0, 0, 1934, 320, 1, 0, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 97, 0, 0, 1937, 1938, 5, 116, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1940, 5, 104, 0, 0, 1940, 322, 1, 0, 0, 0, 1941, 1942, 5, 102, 0, 0, 1942, 1943, 5, 105, 0, 0, 1943, 1944, 5, 110, 0, 0, 1944, 1945, 5, 97, 0, 0, 1945, 1946, 5, 108, 0, 0, 1946, 1947, 5, 108, 0, 0, 1947, 1948, 5, 121, 0, 0, 1948, 324, 1, 0, 0, 0, 1949, 1950, 5, 102, 0, 0, 1950, 1951, 5, 97, 0, 0, 1951, 1952, 5, 117, 0, 0, 1952, 1953, 5, 108, 0, 0, 1953, 1954, 5, 116, 0, 0, 1954, 326, 1, 0, 0, 0, 1955, 1956, 5, 104, 0, 0, 1956, 1957, 5, 97, 0, 0, 1957, 1958, 5, 110, 0, 0, 1958, 1959, 5, 100, 0, 0, 1959, 1960, 5, 108, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 114, 0, 0, 1962, 328, 1, 0, 0, 0, 1963, 1964, 5, 46, 0, 0, 1964, 1965, 5, 100, 0, 0, 1965, 1966, 5, 97, 0, 0, 1966, 1967, 5, 116, 0, 0, 1967, 1968, 5, 97, 0, 0, 1968, 330, 1, 0, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 108, 0, 0, 1971, 1972, 5, 115, 0, 0, 1972, 332, 1, 0, 0, 0, 1973, 1974, 5, 46, 0, 0, 1974, 1975, 5, 112, 0, 0, 1975, 1976, 5, 117, 0, 0, 1976, 1977, 5, 98, 0, 0, 1977, 1978, 5, 108, 0, 0, 1978, 1979, 5, 105, 0, 0, 1979, 1980, 5, 99, 0, 0, 1980, 1981, 5, 107, 0, 0, 1981, 1982, 5, 101, 0, 0, 1982, 1983, 5, 121, 0, 0, 1983, 334, 1, 0, 0, 0, 1984, 1985, 5, 46, 0, 0, 1985, 1986, 5, 118, 0, 0, 1986, 1987, 5, 101, 0, 0, 1987, 1988, 5, 114, 0, 0, 1988, 336, 1, 0, 0, 0, 1989, 1990, 5, 46, 0, 0, 1990, 1991, 5, 108, 0, 0, 1991, 1992, 5, 111, 0, 0, 1992, 1993, 5, 99, 0, 0, 1993, 1994, 5, 97, 0, 0, 1994, 1995, 5, 108, 0, 0, 1995, 1996, 5, 101, 0, 0, 1996, 338, 1, 0, 0, 0, 1997, 1998, 5, 46, 0, 0, 1998, 1999, 5, 112, 0, 0, 1999, 2000, 5, 117, 0, 0, 2000, 2001, 5, 98, 0, 0, 2001, 2002, 5, 108, 0, 0, 2002, 2003, 5, 105, 0, 0, 2003, 2004, 5, 99, 0, 0, 2004, 2005, 5, 107, 0, 0, 2005, 2006, 5, 101, 0, 0, 2006, 2007, 5, 121, 0, 0, 2007, 2008, 5, 116, 0, 0, 2008, 2009, 5, 111, 0, 0, 2009, 2010, 5, 107, 0, 0, 2010, 2011, 5, 101, 0, 0, 2011, 2012, 5, 110, 0, 0, 2012, 340, 1, 0, 0, 0, 2013, 2014, 5, 102, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 114, 0, 0, 2016, 2017, 5, 119, 0, 0, 2017, 2018, 5, 97, 0, 0, 2018, 2019, 5, 114, 0, 0, 2019, 2020, 5, 100, 0, 0, 2020, 2021, 5, 101, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 342, 1, 0, 0, 0, 2023, 2025, 5, 45, 0, 0, 2024, 2023, 1, 0, 0, 0, 2024, 2025, 1, 0, 0, 0, 2025, 2039, 1, 0, 0, 0, 2026, 2027, 5, 48, 0, 0, 2027, 2028, 5, 120, 0, 0, 2028, 2030, 1, 0, 0, 0, 2029, 2031, 7, 0, 0, 0, 2030, 2029, 1, 0, 0, 0, 2031, 2032, 1, 0, 0, 0, 2032, 2030, 1, 0, 0, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2040, 1, 0, 0, 0, 2034, 2036, 7, 1, 0, 0, 2035, 2034, 1, 0, 0, 0, 2036, 2037, 1, 0, 0, 0, 2037, 2035, 1, 0, 0, 0, 2037, 2038, 1, 0, 0, 0, 2038, 2040, 1, 0, 0, 0, 2039, 2026, 1, 0, 0, 0, 2039, 2035, 1, 0, 0, 0, 2040, 344, 1, 0, 0, 0, 2041, 2043, 5, 45, 0, 0, 2042, 2041, 1, 0, 0, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2057, 1, 0, 0, 0, 2044, 2045, 5, 48, 0, 0, 2045, 2046, 5, 120, 0, 0, 2046, 2048, 1, 0, 0, 0, 2047, 2049, 7, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 2050, 1, 0, 0, 0, 2050, 2048, 1, 0, 0, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2058, 1, 0, 0, 0, 2052, 2054, 7, 1, 0, 0, 2053, 2052, 1, 0, 0, 0, 2054, 2055, 1, 0, 0, 0, 2055, 2053, 1, 0, 0, 0, 2055, 2056, 1, 0, 0, 0, 2056, 2058, 1, 0, 0, 0, 2057, 2044, 1, 0, 0, 0, 2057, 2053, 1, 0, 0, 0, 2058, 346, 1, 0, 0, 0, 2059, 2061, 5, 45, 0, 0, 2060, 2059, 1, 0, 0, 0, 2060, 2061, 1, 0, 0, 0, 2061, 2112, 1, 0, 0, 0, 2062, 2064, 7, 1, 0, 0, 2063, 2062, 1, 0, 0, 0, 2064, 2065, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2066, 1, 0, 0, 0, 2066, 2093, 1, 0, 0, 0, 2067, 2069, 5, 46, 0, 0, 2068, 2070, 7, 1, 0, 0, 2069, 2068, 1, 0, 0, 0, 2070, 2071, 1, 0, 0, 0, 2071, 2069, 1, 0, 0, 0, 2071, 2072, 1, 0, 0, 0, 2072, 2082, 1, 0, 0, 0, 2073, 2075, 7, 2, 0, 0, 2074, 2076, 7, 3, 0, 0, 2075, 2074, 1, 0, 0, 0, 2075, 2076, 1, 0, 0, 0, 2076, 2078, 1, 0, 0, 0, 2077, 2079, 7, 1, 0, 0, 2078, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2078, 1, 0, 0, 0, 2080, 2081, 1, 0, 0, 0, 2081, 2083, 1, 0, 0, 0, 2082, 2073, 1, 0, 0, 0, 2082, 2083, 1, 0, 0, 0, 2083, 2094, 1, 0, 0, 0, 2084, 2086, 7, 2, 0, 0, 2085, 2087, 7, 3, 0, 0, 2086, 2085, 1, 0, 0, 0, 2086, 2087, 1, 0, 0, 0, 2087, 2089, 1, 0, 0, 0, 2088, 2090, 7, 1, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2094, 1, 0, 0, 0, 2093, 2067, 1, 0, 0, 0, 2093, 2084, 1, 0, 0, 0, 2094, 2113, 1, 0, 0, 0, 2095, 2097, 5, 46, 0, 0, 2096, 2098, 7, 1, 0, 0, 2097, 2096, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2097, 1, 0, 0, 0, 2099, 2100, 1, 0, 0, 0, 2100, 2110, 1, 0, 0, 0, 2101, 2103, 7, 2, 0, 0, 2102, 2104, 7, 3, 0, 0, 2103, 2102, 1, 0, 0, 0, 2103, 2104, 1, 0, 0, 0, 2104, 2106, 1, 0, 0, 0, 2105, 2107, 7, 1, 0, 0, 2106, 2105, 1, 0, 0, 0, 2107, 2108, 1, 0, 0, 0, 2108, 2106, 1, 0, 0, 0, 2108, 2109, 1, 0, 0, 0, 2109, 2111, 1, 0, 0, 0, 2110, 2101, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2113, 1, 0, 0, 0, 2112, 2063, 1, 0, 0, 0, 2112, 2095, 1, 0, 0, 0, 2113, 348, 1, 0, 0, 0, 2114, 2115, 5, 58, 0, 0, 2115, 2116, 5, 58, 0, 0, 2116, 350, 1, 0, 0, 0, 2117, 2118, 5, 46, 0, 0, 2118, 2119, 5, 46, 0, 0, 2119, 2120, 5, 46, 0, 0, 2120, 352, 1, 0, 0, 0, 2121, 2122, 5, 110, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 108, 0, 0, 2125, 354, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 117, 0, 0, 2128, 2129, 5, 108, 0, 0, 2129, 2130, 5, 108, 0, 0, 2130, 2131, 5, 114, 0, 0, 2131, 2132, 5, 101, 0, 0, 2132, 2133, 5, 102, 0, 0, 2133, 356, 1, 0, 0, 0, 2134, 2135, 5, 46, 0, 0, 2135, 2136, 5, 104, 0, 0, 2136, 2137, 5, 97, 0, 0, 2137, 2138, 5, 115, 0, 0, 2138, 2139, 5, 104, 0, 0, 2139, 358, 1, 0, 0, 0, 2140, 2141, 5, 99, 0, 0, 2141, 2142, 5, 104, 0, 0, 2142, 2143, 5, 97, 0, 0, 2143, 2150, 5, 114, 0, 0, 2144, 2145, 5, 119, 0, 0, 2145, 2146, 5, 99, 0, 0, 2146, 2147, 5, 104, 0, 0, 2147, 2148, 5, 97, 0, 0, 2148, 2150, 5, 114, 0, 0, 2149, 2140, 1, 0, 0, 0, 2149, 2144, 1, 0, 0, 0, 2150, 360, 1, 0, 0, 0, 2151, 2152, 5, 115, 0, 0, 2152, 2153, 5, 116, 0, 0, 2153, 2154, 5, 114, 0, 0, 2154, 2155, 5, 105, 0, 0, 2155, 2156, 5, 110, 0, 0, 2156, 2157, 5, 103, 0, 0, 2157, 362, 1, 0, 0, 0, 2158, 2159, 5, 98, 0, 0, 2159, 2160, 5, 111, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 108, 0, 0, 2162, 364, 1, 0, 0, 0, 2163, 2164, 5, 105, 0, 0, 2164, 2165, 5, 110, 0, 0, 2165, 2166, 5, 116, 0, 0, 2166, 2167, 5, 56, 0, 0, 2167, 366, 1, 0, 0, 0, 2168, 2169, 5, 105, 0, 0, 2169, 2170, 5, 110, 0, 0, 2170, 2171, 5, 116, 0, 0, 2171, 2172, 5, 49, 0, 0, 2172, 2173, 5, 54, 0, 0, 2173, 368, 1, 0, 0, 0, 2174, 2175, 5, 105, 0, 0, 2175, 2176, 5, 110, 0, 0, 2176, 2177, 5, 116, 0, 0, 2177, 2178, 5, 51, 0, 0, 2178, 2179, 5, 50, 0, 0, 2179, 370, 1, 0, 0, 0, 2180, 2181, 5, 105, 0, 0, 2181, 2182, 5, 110, 0, 0, 2182, 2183, 5, 116, 0, 0, 2183, 2184, 5, 54, 0, 0, 2184, 2185, 5, 52, 0, 0, 2185, 372, 1, 0, 0, 0, 2186, 2187, 5, 102, 0, 0, 2187, 2188, 5, 108, 0, 0, 2188, 2189, 5, 111, 0, 0, 2189, 2190, 5, 97, 0, 0, 2190, 2191, 5, 116, 0, 0, 2191, 2192, 5, 51, 0, 0, 2192, 2193, 5, 50, 0, 0, 2193, 374, 1, 0, 0, 0, 2194, 2195, 5, 102, 0, 0, 2195, 2196, 5, 108, 0, 0, 2196, 2197, 5, 111, 0, 0, 2197, 2198, 5, 97, 0, 0, 2198, 2199, 5, 116, 0, 0, 2199, 2200, 5, 54, 0, 0, 2200, 2201, 5, 52, 0, 0, 2201, 376, 1, 0, 0, 0, 2202, 2203, 5, 117, 0, 0, 2203, 2204, 5, 110, 0, 0, 2204, 2205, 5, 115, 0, 0, 2205, 2206, 5, 105, 0, 0, 2206, 2207, 5, 103, 0, 0, 2207, 2208, 5, 110, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 100, 0, 0, 2210, 378, 1, 0, 0, 0, 2211, 2212, 5, 117, 0, 0, 2212, 2213, 5, 105, 0, 0, 2213, 2214, 5, 110, 0, 0, 2214, 2215, 5, 116, 0, 0, 2215, 2216, 5, 56, 0, 0, 2216, 380, 1, 0, 0, 0, 2217, 2218, 5, 117, 0, 0, 2218, 2219, 5, 105, 0, 0, 2219, 2220, 5, 110, 0, 0, 2220, 2221, 5, 116, 0, 0, 2221, 2222, 5, 49, 0, 0, 2222, 2223, 5, 54, 0, 0, 2223, 382, 1, 0, 0, 0, 2224, 2225, 5, 117, 0, 0, 2225, 2226, 5, 105, 0, 0, 2226, 2227, 5, 110, 0, 0, 2227, 2228, 5, 116, 0, 0, 2228, 2229, 5, 51, 0, 0, 2229, 2230, 5, 50, 0, 0, 2230, 384, 1, 0, 0, 0, 2231, 2232, 5, 117, 0, 0, 2232, 2233, 5, 105, 0, 0, 2233, 2234, 5, 110, 0, 0, 2234, 2235, 5, 116, 0, 0, 2235, 2236, 5, 54, 0, 0, 2236, 2237, 5, 52, 0, 0, 2237, 386, 1, 0, 0, 0, 2238, 2239, 5, 105, 0, 0, 2239, 2240, 5, 110, 0, 0, 2240, 2241, 5, 116, 0, 0, 2241, 388, 1, 0, 0, 0, 2242, 2243, 5, 117, 0, 0, 2243, 2244, 5, 105, 0, 0, 2244, 2245, 5, 110, 0, 0, 2245, 2246, 5, 116, 0, 0, 2246, 390, 1, 0, 0, 0, 2247, 2248, 5, 116, 0, 0, 2248, 2249, 5, 121, 0, 0, 2249, 2250, 5, 112, 0, 0, 2250, 2251, 5, 101, 0, 0, 2251, 392, 1, 0, 0, 0, 2252, 2253, 5, 111, 0, 0, 2253, 2254, 5, 98, 0, 0, 2254, 2255, 5, 106, 0, 0, 2255, 2256, 5, 101, 0, 0, 2256, 2257, 5, 99, 0, 0, 2257, 2258, 5, 116, 0, 0, 2258, 394, 1, 0, 0, 0, 2259, 2260, 5, 46, 0, 0, 2260, 2261, 5, 109, 0, 0, 2261, 2262, 5, 111, 0, 0, 2262, 2263, 5, 100, 0, 0, 2263, 2264, 5, 117, 0, 0, 2264, 2265, 5, 108, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 396, 1, 0, 0, 0, 2267, 2268, 5, 118, 0, 0, 2268, 2269, 5, 97, 0, 0, 2269, 2270, 5, 108, 0, 0, 2270, 2271, 5, 117, 0, 0, 2271, 2272, 5, 101, 0, 0, 2272, 398, 1, 0, 0, 0, 2273, 2274, 5, 118, 0, 0, 2274, 2275, 5, 97, 0, 0, 2275, 2276, 5, 108, 0, 0, 2276, 2277, 5, 117, 0, 0, 2277, 2278, 5, 101, 0, 0, 2278, 2279, 5, 116, 0, 0, 2279, 2280, 5, 121, 0, 0, 2280, 2281, 5, 112, 0, 0, 2281, 2282, 5, 101, 0, 0, 2282, 400, 1, 0, 0, 0, 2283, 2284, 5, 118, 0, 0, 2284, 2285, 5, 111, 0, 0, 2285, 2286, 5, 105, 0, 0, 2286, 2287, 5, 100, 0, 0, 2287, 402, 1, 0, 0, 0, 2288, 2289, 5, 101, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 117, 0, 0, 2291, 2292, 5, 109, 0, 0, 2292, 404, 1, 0, 0, 0, 2293, 2294, 5, 99, 0, 0, 2294, 2295, 5, 117, 0, 0, 2295, 2296, 5, 115, 0, 0, 2296, 2297, 5, 116, 0, 0, 2297, 2298, 5, 111, 0, 0, 2298, 2299, 5, 109, 0, 0, 2299, 406, 1, 0, 0, 0, 2300, 2301, 5, 102, 0, 0, 2301, 2302, 5, 105, 0, 0, 2302, 2303, 5, 120, 0, 0, 2303, 2304, 5, 101, 0, 0, 2304, 2305, 5, 100, 0, 0, 2305, 408, 1, 0, 0, 0, 2306, 2307, 5, 115, 0, 0, 2307, 2308, 5, 121, 0, 0, 2308, 2309, 5, 115, 0, 0, 2309, 2310, 5, 115, 0, 0, 2310, 2311, 5, 116, 0, 0, 2311, 2312, 5, 114, 0, 0, 2312, 2313, 5, 105, 0, 0, 2313, 2314, 5, 110, 0, 0, 2314, 2315, 5, 103, 0, 0, 2315, 410, 1, 0, 0, 0, 2316, 2317, 5, 97, 0, 0, 2317, 2318, 5, 114, 0, 0, 2318, 2319, 5, 114, 0, 0, 2319, 2320, 5, 97, 0, 0, 2320, 2321, 5, 121, 0, 0, 2321, 412, 1, 0, 0, 0, 2322, 2323, 5, 118, 0, 0, 2323, 2324, 5, 97, 0, 0, 2324, 2325, 5, 114, 0, 0, 2325, 2326, 5, 105, 0, 0, 2326, 2327, 5, 97, 0, 0, 2327, 2328, 5, 110, 0, 0, 2328, 2329, 5, 116, 0, 0, 2329, 414, 1, 0, 0, 0, 2330, 2331, 5, 99, 0, 0, 2331, 2332, 5, 117, 0, 0, 2332, 2333, 5, 114, 0, 0, 2333, 2334, 5, 114, 0, 0, 2334, 2335, 5, 101, 0, 0, 2335, 2336, 5, 110, 0, 0, 2336, 2337, 5, 99, 0, 0, 2337, 2338, 5, 121, 0, 0, 2338, 416, 1, 0, 0, 0, 2339, 2340, 5, 115, 0, 0, 2340, 2341, 5, 121, 0, 0, 2341, 2342, 5, 115, 0, 0, 2342, 2343, 5, 99, 0, 0, 2343, 2344, 5, 104, 0, 0, 2344, 2345, 5, 97, 0, 0, 2345, 2346, 5, 114, 0, 0, 2346, 418, 1, 0, 0, 0, 2347, 2348, 5, 101, 0, 0, 2348, 2349, 5, 114, 0, 0, 2349, 2350, 5, 114, 0, 0, 2350, 2351, 5, 111, 0, 0, 2351, 2352, 5, 114, 0, 0, 2352, 420, 1, 0, 0, 0, 2353, 2354, 5, 100, 0, 0, 2354, 2355, 5, 101, 0, 0, 2355, 2356, 5, 99, 0, 0, 2356, 2357, 5, 105, 0, 0, 2357, 2358, 5, 109, 0, 0, 2358, 2359, 5, 97, 0, 0, 2359, 2360, 5, 108, 0, 0, 2360, 422, 1, 0, 0, 0, 2361, 2362, 5, 100, 0, 0, 2362, 2363, 5, 97, 0, 0, 2363, 2364, 5, 116, 0, 0, 2364, 2365, 5, 101, 0, 0, 2365, 424, 1, 0, 0, 0, 2366, 2367, 5, 98, 0, 0, 2367, 2368, 5, 115, 0, 0, 2368, 2369, 5, 116, 0, 0, 2369, 2370, 5, 114, 0, 0, 2370, 426, 1, 0, 0, 0, 2371, 2372, 5, 108, 0, 0, 2372, 2373, 5, 112, 0, 0, 2373, 2374, 5, 115, 0, 0, 2374, 2375, 5, 116, 0, 0, 2375, 2376, 5, 114, 0, 0, 2376, 428, 1, 0, 0, 0, 2377, 2378, 5, 108, 0, 0, 2378, 2379, 5, 112, 0, 0, 2379, 2380, 5, 119, 0, 0, 2380, 2381, 5, 115, 0, 0, 2381, 2382, 5, 116, 0, 0, 2382, 2383, 5, 114, 0, 0, 2383, 430, 1, 0, 0, 0, 2384, 2385, 5, 108, 0, 0, 2385, 2386, 5, 112, 0, 0, 2386, 2387, 5, 116, 0, 0, 2387, 2388, 5, 115, 0, 0, 2388, 2389, 5, 116, 0, 0, 2389, 2390, 5, 114, 0, 0, 2390, 432, 1, 0, 0, 0, 2391, 2392, 5, 111, 0, 0, 2392, 2393, 5, 98, 0, 0, 2393, 2394, 5, 106, 0, 0, 2394, 2395, 5, 101, 0, 0, 2395, 2396, 5, 99, 0, 0, 2396, 2397, 5, 116, 0, 0, 2397, 2398, 5, 114, 0, 0, 2398, 2399, 5, 101, 0, 0, 2399, 2400, 5, 102, 0, 0, 2400, 434, 1, 0, 0, 0, 2401, 2402, 5, 105, 0, 0, 2402, 2403, 5, 117, 0, 0, 2403, 2404, 5, 110, 0, 0, 2404, 2405, 5, 107, 0, 0, 2405, 2406, 5, 110, 0, 0, 2406, 2407, 5, 111, 0, 0, 2407, 2408, 5, 119, 0, 0, 2408, 2409, 5, 110, 0, 0, 2409, 436, 1, 0, 0, 0, 2410, 2411, 5, 105, 0, 0, 2411, 2412, 5, 100, 0, 0, 2412, 2413, 5, 105, 0, 0, 2413, 2414, 5, 115, 0, 0, 2414, 2415, 5, 112, 0, 0, 2415, 2416, 5, 97, 0, 0, 2416, 2417, 5, 116, 0, 0, 2417, 2418, 5, 99, 0, 0, 2418, 2419, 5, 104, 0, 0, 2419, 438, 1, 0, 0, 0, 2420, 2421, 5, 115, 0, 0, 2421, 2422, 5, 116, 0, 0, 2422, 2423, 5, 114, 0, 0, 2423, 2424, 5, 117, 0, 0, 2424, 2425, 5, 99, 0, 0, 2425, 2426, 5, 116, 0, 0, 2426, 440, 1, 0, 0, 0, 2427, 2428, 5, 105, 0, 0, 2428, 2429, 5, 110, 0, 0, 2429, 2430, 5, 116, 0, 0, 2430, 2431, 5, 101, 0, 0, 2431, 2432, 5, 114, 0, 0, 2432, 2433, 5, 102, 0, 0, 2433, 2434, 5, 97, 0, 0, 2434, 2435, 5, 99, 0, 0, 2435, 2436, 5, 101, 0, 0, 2436, 442, 1, 0, 0, 0, 2437, 2438, 5, 115, 0, 0, 2438, 2439, 5, 97, 0, 0, 2439, 2440, 5, 102, 0, 0, 2440, 2441, 5, 101, 0, 0, 2441, 2442, 5, 97, 0, 0, 2442, 2443, 5, 114, 0, 0, 2443, 2444, 5, 114, 0, 0, 2444, 2445, 5, 97, 0, 0, 2445, 2446, 5, 121, 0, 0, 2446, 444, 1, 0, 0, 0, 2447, 2448, 5, 98, 0, 0, 2448, 2449, 5, 121, 0, 0, 2449, 2450, 5, 118, 0, 0, 2450, 2451, 5, 97, 0, 0, 2451, 2452, 5, 108, 0, 0, 2452, 2453, 5, 115, 0, 0, 2453, 2454, 5, 116, 0, 0, 2454, 2455, 5, 114, 0, 0, 2455, 446, 1, 0, 0, 0, 2456, 2457, 5, 97, 0, 0, 2457, 2458, 5, 110, 0, 0, 2458, 2459, 5, 115, 0, 0, 2459, 2460, 5, 105, 0, 0, 2460, 448, 1, 0, 0, 0, 2461, 2462, 5, 116, 0, 0, 2462, 2463, 5, 98, 0, 0, 2463, 2464, 5, 115, 0, 0, 2464, 2465, 5, 116, 0, 0, 2465, 2466, 5, 114, 0, 0, 2466, 450, 1, 0, 0, 0, 2467, 2468, 5, 109, 0, 0, 2468, 2469, 5, 101, 0, 0, 2469, 2470, 5, 116, 0, 0, 2470, 2471, 5, 104, 0, 0, 2471, 2472, 5, 111, 0, 0, 2472, 2473, 5, 100, 0, 0, 2473, 452, 1, 0, 0, 0, 2474, 2475, 5, 97, 0, 0, 2475, 2476, 5, 110, 0, 0, 2476, 2477, 5, 121, 0, 0, 2477, 454, 1, 0, 0, 0, 2478, 2479, 5, 108, 0, 0, 2479, 2480, 5, 112, 0, 0, 2480, 2481, 5, 115, 0, 0, 2481, 2482, 5, 116, 0, 0, 2482, 2483, 5, 114, 0, 0, 2483, 2484, 5, 117, 0, 0, 2484, 2485, 5, 99, 0, 0, 2485, 2486, 5, 116, 0, 0, 2486, 456, 1, 0, 0, 0, 2487, 2488, 5, 118, 0, 0, 2488, 2489, 5, 101, 0, 0, 2489, 2490, 5, 99, 0, 0, 2490, 2491, 5, 116, 0, 0, 2491, 2492, 5, 111, 0, 0, 2492, 2493, 5, 114, 0, 0, 2493, 458, 1, 0, 0, 0, 2494, 2495, 5, 104, 0, 0, 2495, 2496, 5, 114, 0, 0, 2496, 2497, 5, 101, 0, 0, 2497, 2498, 5, 115, 0, 0, 2498, 2499, 5, 117, 0, 0, 2499, 2500, 5, 108, 0, 0, 2500, 2501, 5, 116, 0, 0, 2501, 460, 1, 0, 0, 0, 2502, 2503, 5, 99, 0, 0, 2503, 2504, 5, 97, 0, 0, 2504, 2505, 5, 114, 0, 0, 2505, 2506, 5, 114, 0, 0, 2506, 2507, 5, 97, 0, 0, 2507, 2508, 5, 121, 0, 0, 2508, 462, 1, 0, 0, 0, 2509, 2510, 5, 117, 0, 0, 2510, 2511, 5, 115, 0, 0, 2511, 2512, 5, 101, 0, 0, 2512, 2513, 5, 114, 0, 0, 2513, 2514, 5, 100, 0, 0, 2514, 2515, 5, 101, 0, 0, 2515, 2516, 5, 102, 0, 0, 2516, 2517, 5, 105, 0, 0, 2517, 2518, 5, 110, 0, 0, 2518, 2519, 5, 101, 0, 0, 2519, 2520, 5, 100, 0, 0, 2520, 464, 1, 0, 0, 0, 2521, 2522, 5, 114, 0, 0, 2522, 2523, 5, 101, 0, 0, 2523, 2524, 5, 99, 0, 0, 2524, 2525, 5, 111, 0, 0, 2525, 2526, 5, 114, 0, 0, 2526, 2527, 5, 100, 0, 0, 2527, 466, 1, 0, 0, 0, 2528, 2529, 5, 102, 0, 0, 2529, 2530, 5, 105, 0, 0, 2530, 2531, 5, 108, 0, 0, 2531, 2532, 5, 101, 0, 0, 2532, 2533, 5, 116, 0, 0, 2533, 2534, 5, 105, 0, 0, 2534, 2535, 5, 109, 0, 0, 2535, 2536, 5, 101, 0, 0, 2536, 468, 1, 0, 0, 0, 2537, 2538, 5, 98, 0, 0, 2538, 2539, 5, 108, 0, 0, 2539, 2540, 5, 111, 0, 0, 2540, 2541, 5, 98, 0, 0, 2541, 470, 1, 0, 0, 0, 2542, 2543, 5, 115, 0, 0, 2543, 2544, 5, 116, 0, 0, 2544, 2545, 5, 114, 0, 0, 2545, 2546, 5, 101, 0, 0, 2546, 2547, 5, 97, 0, 0, 2547, 2548, 5, 109, 0, 0, 2548, 472, 1, 0, 0, 0, 2549, 2550, 5, 115, 0, 0, 2550, 2551, 5, 116, 0, 0, 2551, 2552, 5, 111, 0, 0, 2552, 2553, 5, 114, 0, 0, 2553, 2554, 5, 97, 0, 0, 2554, 2555, 5, 103, 0, 0, 2555, 2556, 5, 101, 0, 0, 2556, 474, 1, 0, 0, 0, 2557, 2558, 5, 115, 0, 0, 2558, 2559, 5, 116, 0, 0, 2559, 2560, 5, 114, 0, 0, 2560, 2561, 5, 101, 0, 0, 2561, 2562, 5, 97, 0, 0, 2562, 2563, 5, 109, 0, 0, 2563, 2564, 5, 101, 0, 0, 2564, 2565, 5, 100, 0, 0, 2565, 2566, 5, 95, 0, 0, 2566, 2567, 5, 111, 0, 0, 2567, 2568, 5, 98, 0, 0, 2568, 2569, 5, 106, 0, 0, 2569, 2570, 5, 101, 0, 0, 2570, 2571, 5, 99, 0, 0, 2571, 2572, 5, 116, 0, 0, 2572, 476, 1, 0, 0, 0, 2573, 2574, 5, 115, 0, 0, 2574, 2575, 5, 116, 0, 0, 2575, 2576, 5, 111, 0, 0, 2576, 2577, 5, 114, 0, 0, 2577, 2578, 5, 101, 0, 0, 2578, 2579, 5, 100, 0, 0, 2579, 2580, 5, 95, 0, 0, 2580, 2581, 5, 111, 0, 0, 2581, 2582, 5, 98, 0, 0, 2582, 2583, 5, 106, 0, 0, 2583, 2584, 5, 101, 0, 0, 2584, 2585, 5, 99, 0, 0, 2585, 2586, 5, 116, 0, 0, 2586, 478, 1, 0, 0, 0, 2587, 2588, 5, 98, 0, 0, 2588, 2589, 5, 108, 0, 0, 2589, 2590, 5, 111, 0, 0, 2590, 2591, 5, 98, 0, 0, 2591, 2592, 5, 95, 0, 0, 2592, 2593, 5, 111, 0, 0, 2593, 2594, 5, 98, 0, 0, 2594, 2595, 5, 106, 0, 0, 2595, 2596, 5, 101, 0, 0, 2596, 2597, 5, 99, 0, 0, 2597, 2598, 5, 116, 0, 0, 2598, 480, 1, 0, 0, 0, 2599, 2600, 5, 99, 0, 0, 2600, 2601, 5, 102, 0, 0, 2601, 482, 1, 0, 0, 0, 2602, 2603, 5, 99, 0, 0, 2603, 2604, 5, 108, 0, 0, 2604, 2605, 5, 115, 0, 0, 2605, 2606, 5, 105, 0, 0, 2606, 2607, 5, 100, 0, 0, 2607, 484, 1, 0, 0, 0, 2608, 2609, 5, 105, 0, 0, 2609, 2610, 5, 110, 0, 0, 2610, 2611, 5, 115, 0, 0, 2611, 2612, 5, 116, 0, 0, 2612, 2613, 5, 97, 0, 0, 2613, 2614, 5, 110, 0, 0, 2614, 2615, 5, 99, 0, 0, 2615, 2616, 5, 101, 0, 0, 2616, 486, 1, 0, 0, 0, 2617, 2618, 5, 101, 0, 0, 2618, 2619, 5, 120, 0, 0, 2619, 2620, 5, 112, 0, 0, 2620, 2621, 5, 108, 0, 0, 2621, 2622, 5, 105, 0, 0, 2622, 2623, 5, 99, 0, 0, 2623, 2624, 5, 105, 0, 0, 2624, 2625, 5, 116, 0, 0, 2625, 488, 1, 0, 0, 0, 2626, 2627, 5, 100, 0, 0, 2627, 2628, 5, 101, 0, 0, 2628, 2629, 5, 102, 0, 0, 2629, 2630, 5, 97, 0, 0, 2630, 2631, 5, 117, 0, 0, 2631, 2632, 5, 108, 0, 0, 2632, 2633, 5, 116, 0, 0, 2633, 490, 1, 0, 0, 0, 2634, 2635, 5, 118, 0, 0, 2635, 2636, 5, 97, 0, 0, 2636, 2637, 5, 114, 0, 0, 2637, 2638, 5, 97, 0, 0, 2638, 2639, 5, 114, 0, 0, 2639, 2640, 5, 103, 0, 0, 2640, 492, 1, 0, 0, 0, 2641, 2642, 5, 117, 0, 0, 2642, 2643, 5, 110, 0, 0, 2643, 2644, 5, 109, 0, 0, 2644, 2645, 5, 97, 0, 0, 2645, 2646, 5, 110, 0, 0, 2646, 2647, 5, 97, 0, 0, 2647, 2648, 5, 103, 0, 0, 2648, 2649, 5, 101, 0, 0, 2649, 2650, 5, 100, 0, 0, 2650, 494, 1, 0, 0, 0, 2651, 2652, 5, 99, 0, 0, 2652, 2653, 5, 100, 0, 0, 2653, 2654, 5, 101, 0, 0, 2654, 2655, 5, 99, 0, 0, 2655, 2656, 5, 108, 0, 0, 2656, 496, 1, 0, 0, 0, 2657, 2658, 5, 115, 0, 0, 2658, 2659, 5, 116, 0, 0, 2659, 2660, 5, 100, 0, 0, 2660, 2661, 5, 99, 0, 0, 2661, 2662, 5, 97, 0, 0, 2662, 2663, 5, 108, 0, 0, 2663, 2664, 5, 108, 0, 0, 2664, 498, 1, 0, 0, 0, 2665, 2666, 5, 116, 0, 0, 2666, 2667, 5, 104, 0, 0, 2667, 2668, 5, 105, 0, 0, 2668, 2669, 5, 115, 0, 0, 2669, 2670, 5, 99, 0, 0, 2670, 2671, 5, 97, 0, 0, 2671, 2672, 5, 108, 0, 0, 2672, 2673, 5, 108, 0, 0, 2673, 500, 1, 0, 0, 0, 2674, 2675, 5, 102, 0, 0, 2675, 2676, 5, 97, 0, 0, 2676, 2677, 5, 115, 0, 0, 2677, 2678, 5, 116, 0, 0, 2678, 2679, 5, 99, 0, 0, 2679, 2680, 5, 97, 0, 0, 2680, 2681, 5, 108, 0, 0, 2681, 2682, 5, 108, 0, 0, 2682, 502, 1, 0, 0, 0, 2683, 2684, 5, 33, 0, 0, 2684, 504, 1, 0, 0, 0, 2685, 2686, 5, 33, 0, 0, 2686, 2687, 5, 33, 0, 0, 2687, 506, 1, 0, 0, 0, 2688, 2689, 5, 116, 0, 0, 2689, 2690, 5, 121, 0, 0, 2690, 2691, 5, 112, 0, 0, 2691, 2692, 5, 101, 0, 0, 2692, 2693, 5, 100, 0, 0, 2693, 2694, 5, 114, 0, 0, 2694, 2695, 5, 101, 0, 0, 2695, 2703, 5, 102, 0, 0, 2696, 2697, 5, 114, 0, 0, 2697, 2698, 5, 101, 0, 0, 2698, 2699, 5, 102, 0, 0, 2699, 2700, 5, 97, 0, 0, 2700, 2701, 5, 110, 0, 0, 2701, 2703, 5, 121, 0, 0, 2702, 2688, 1, 0, 0, 0, 2702, 2696, 1, 0, 0, 0, 2703, 508, 1, 0, 0, 0, 2704, 2705, 5, 46, 0, 0, 2705, 2706, 5, 112, 0, 0, 2706, 2707, 5, 97, 0, 0, 2707, 2708, 5, 114, 0, 0, 2708, 2709, 5, 97, 0, 0, 2709, 2710, 5, 109, 0, 0, 2710, 510, 1, 0, 0, 0, 2711, 2712, 5, 99, 0, 0, 2712, 2713, 5, 111, 0, 0, 2713, 2714, 5, 110, 0, 0, 2714, 2715, 5, 115, 0, 0, 2715, 2716, 5, 116, 0, 0, 2716, 2717, 5, 114, 0, 0, 2717, 2718, 5, 97, 0, 0, 2718, 2719, 5, 105, 0, 0, 2719, 2720, 5, 110, 0, 0, 2720, 2721, 5, 116, 0, 0, 2721, 512, 1, 0, 0, 0, 2722, 2723, 5, 46, 0, 0, 2723, 2724, 5, 116, 0, 0, 2724, 2725, 5, 104, 0, 0, 2725, 2726, 5, 105, 0, 0, 2726, 2727, 5, 115, 0, 0, 2727, 514, 1, 0, 0, 0, 2728, 2729, 5, 46, 0, 0, 2729, 2730, 5, 98, 0, 0, 2730, 2731, 5, 97, 0, 0, 2731, 2732, 5, 115, 0, 0, 2732, 2733, 5, 101, 0, 0, 2733, 516, 1, 0, 0, 0, 2734, 2735, 5, 46, 0, 0, 2735, 2736, 5, 110, 0, 0, 2736, 2737, 5, 101, 0, 0, 2737, 2738, 5, 115, 0, 0, 2738, 2739, 5, 116, 0, 0, 2739, 2740, 5, 101, 0, 0, 2740, 2741, 5, 114, 0, 0, 2741, 518, 1, 0, 0, 0, 2742, 2743, 5, 38, 0, 0, 2743, 520, 1, 0, 0, 0, 2744, 2745, 5, 91, 0, 0, 2745, 2746, 5, 93, 0, 0, 2746, 522, 1, 0, 0, 0, 2747, 2748, 5, 42, 0, 0, 2748, 524, 1, 0, 0, 0, 2749, 2762, 5, 92, 0, 0, 2750, 2763, 7, 4, 0, 0, 2751, 2753, 7, 5, 0, 0, 2752, 2754, 7, 5, 0, 0, 2753, 2752, 1, 0, 0, 0, 2753, 2754, 1, 0, 0, 0, 2754, 2756, 1, 0, 0, 0, 2755, 2757, 7, 5, 0, 0, 2756, 2755, 1, 0, 0, 0, 2756, 2757, 1, 0, 0, 0, 2757, 2763, 1, 0, 0, 0, 2758, 2760, 5, 13, 0, 0, 2759, 2758, 1, 0, 0, 0, 2759, 2760, 1, 0, 0, 0, 2760, 2761, 1, 0, 0, 0, 2761, 2763, 5, 10, 0, 0, 2762, 2750, 1, 0, 0, 0, 2762, 2751, 1, 0, 0, 0, 2762, 2759, 1, 0, 0, 0, 2763, 526, 1, 0, 0, 0, 2764, 2769, 5, 34, 0, 0, 2765, 2768, 8, 6, 0, 0, 2766, 2768, 3, 525, 262, 0, 2767, 2765, 1, 0, 0, 0, 2767, 2766, 1, 0, 0, 0, 2768, 2771, 1, 0, 0, 0, 2769, 2767, 1, 0, 0, 0, 2769, 2770, 1, 0, 0, 0, 2770, 2772, 1, 0, 0, 0, 2771, 2769, 1, 0, 0, 0, 2772, 2773, 5, 34, 0, 0, 2773, 528, 1, 0, 0, 0, 2774, 2779, 5, 39, 0, 0, 2775, 2778, 8, 7, 0, 0, 2776, 2778, 3, 525, 262, 0, 2777, 2775, 1, 0, 0, 0, 2777, 2776, 1, 0, 0, 0, 2778, 2781, 1, 0, 0, 0, 2779, 2777, 1, 0, 0, 0, 2779, 2780, 1, 0, 0, 0, 2780, 2782, 1, 0, 0, 0, 2781, 2779, 1, 0, 0, 0, 2782, 2783, 5, 39, 0, 0, 2783, 530, 1, 0, 0, 0, 2784, 2785, 5, 46, 0, 0, 2785, 532, 1, 0, 0, 0, 2786, 2787, 5, 43, 0, 0, 2787, 534, 1, 0, 0, 0, 2788, 2789, 5, 35, 0, 0, 2789, 2790, 5, 100, 0, 0, 2790, 2791, 5, 101, 0, 0, 2791, 2792, 5, 102, 0, 0, 2792, 2793, 5, 105, 0, 0, 2793, 2794, 5, 110, 0, 0, 2794, 2795, 5, 101, 0, 0, 2795, 536, 1, 0, 0, 0, 2796, 2797, 5, 35, 0, 0, 2797, 2798, 5, 117, 0, 0, 2798, 2799, 5, 110, 0, 0, 2799, 2800, 5, 100, 0, 0, 2800, 2801, 5, 101, 0, 0, 2801, 2802, 5, 102, 0, 0, 2802, 538, 1, 0, 0, 0, 2803, 2804, 5, 35, 0, 0, 2804, 2805, 5, 105, 0, 0, 2805, 2806, 5, 102, 0, 0, 2806, 2807, 5, 100, 0, 0, 2807, 2808, 5, 101, 0, 0, 2808, 2809, 5, 102, 0, 0, 2809, 540, 1, 0, 0, 0, 2810, 2811, 5, 35, 0, 0, 2811, 2812, 5, 105, 0, 0, 2812, 2813, 5, 102, 0, 0, 2813, 2814, 5, 110, 0, 0, 2814, 2815, 5, 100, 0, 0, 2815, 2816, 5, 101, 0, 0, 2816, 2817, 5, 102, 0, 0, 2817, 542, 1, 0, 0, 0, 2818, 2819, 5, 35, 0, 0, 2819, 2820, 5, 101, 0, 0, 2820, 2821, 5, 108, 0, 0, 2821, 2822, 5, 115, 0, 0, 2822, 2823, 5, 101, 0, 0, 2823, 544, 1, 0, 0, 0, 2824, 2825, 5, 35, 0, 0, 2825, 2826, 5, 101, 0, 0, 2826, 2827, 5, 110, 0, 0, 2827, 2828, 5, 100, 0, 0, 2828, 2829, 5, 105, 0, 0, 2829, 2830, 5, 102, 0, 0, 2830, 546, 1, 0, 0, 0, 2831, 2832, 5, 35, 0, 0, 2832, 2833, 5, 105, 0, 0, 2833, 2834, 5, 110, 0, 0, 2834, 2835, 5, 99, 0, 0, 2835, 2836, 5, 108, 0, 0, 2836, 2837, 5, 117, 0, 0, 2837, 2838, 5, 100, 0, 0, 2838, 2839, 5, 101, 0, 0, 2839, 548, 1, 0, 0, 0, 2840, 2841, 5, 46, 0, 0, 2841, 2842, 5, 109, 0, 0, 2842, 2843, 5, 114, 0, 0, 2843, 2844, 5, 101, 0, 0, 2844, 2845, 5, 115, 0, 0, 2845, 2846, 5, 111, 0, 0, 2846, 2847, 5, 117, 0, 0, 2847, 2848, 5, 114, 0, 0, 2848, 2849, 5, 99, 0, 0, 2849, 2850, 5, 101, 0, 0, 2850, 550, 1, 0, 0, 0, 2851, 2852, 5, 110, 0, 0, 2852, 2853, 5, 111, 0, 0, 2853, 4040, 5, 112, 0, 0, 2854, 2855, 5, 117, 0, 0, 2855, 2856, 5, 110, 0, 0, 2856, 2857, 5, 117, 0, 0, 2857, 2858, 5, 115, 0, 0, 2858, 2859, 5, 101, 0, 0, 2859, 4040, 5, 100, 0, 0, 2860, 2861, 5, 98, 0, 0, 2861, 2862, 5, 114, 0, 0, 2862, 2863, 5, 101, 0, 0, 2863, 2864, 5, 97, 0, 0, 2864, 4040, 5, 107, 0, 0, 2865, 2866, 5, 108, 0, 0, 2866, 2867, 5, 100, 0, 0, 2867, 2868, 5, 97, 0, 0, 2868, 2869, 5, 114, 0, 0, 2869, 2870, 5, 103, 0, 0, 2870, 2871, 5, 46, 0, 0, 2871, 4040, 5, 48, 0, 0, 2872, 2873, 5, 108, 0, 0, 2873, 2874, 5, 100, 0, 0, 2874, 2875, 5, 97, 0, 0, 2875, 2876, 5, 114, 0, 0, 2876, 2877, 5, 103, 0, 0, 2877, 2878, 5, 46, 0, 0, 2878, 4040, 5, 49, 0, 0, 2879, 2880, 5, 108, 0, 0, 2880, 2881, 5, 100, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 114, 0, 0, 2883, 2884, 5, 103, 0, 0, 2884, 2885, 5, 46, 0, 0, 2885, 4040, 5, 50, 0, 0, 2886, 2887, 5, 108, 0, 0, 2887, 2888, 5, 100, 0, 0, 2888, 2889, 5, 97, 0, 0, 2889, 2890, 5, 114, 0, 0, 2890, 2891, 5, 103, 0, 0, 2891, 2892, 5, 46, 0, 0, 2892, 4040, 5, 51, 0, 0, 2893, 2894, 5, 108, 0, 0, 2894, 2895, 5, 100, 0, 0, 2895, 2896, 5, 108, 0, 0, 2896, 2897, 5, 111, 0, 0, 2897, 2898, 5, 99, 0, 0, 2898, 2899, 5, 46, 0, 0, 2899, 4040, 5, 48, 0, 0, 2900, 2901, 5, 108, 0, 0, 2901, 2902, 5, 100, 0, 0, 2902, 2903, 5, 108, 0, 0, 2903, 2904, 5, 111, 0, 0, 2904, 2905, 5, 99, 0, 0, 2905, 2906, 5, 46, 0, 0, 2906, 4040, 5, 49, 0, 0, 2907, 2908, 5, 108, 0, 0, 2908, 2909, 5, 100, 0, 0, 2909, 2910, 5, 108, 0, 0, 2910, 2911, 5, 111, 0, 0, 2911, 2912, 5, 99, 0, 0, 2912, 2913, 5, 46, 0, 0, 2913, 4040, 5, 50, 0, 0, 2914, 2915, 5, 108, 0, 0, 2915, 2916, 5, 100, 0, 0, 2916, 2917, 5, 108, 0, 0, 2917, 2918, 5, 111, 0, 0, 2918, 2919, 5, 99, 0, 0, 2919, 2920, 5, 46, 0, 0, 2920, 4040, 5, 51, 0, 0, 2921, 2922, 5, 115, 0, 0, 2922, 2923, 5, 116, 0, 0, 2923, 2924, 5, 108, 0, 0, 2924, 2925, 5, 111, 0, 0, 2925, 2926, 5, 99, 0, 0, 2926, 2927, 5, 46, 0, 0, 2927, 4040, 5, 48, 0, 0, 2928, 2929, 5, 115, 0, 0, 2929, 2930, 5, 116, 0, 0, 2930, 2931, 5, 108, 0, 0, 2931, 2932, 5, 111, 0, 0, 2932, 2933, 5, 99, 0, 0, 2933, 2934, 5, 46, 0, 0, 2934, 4040, 5, 49, 0, 0, 2935, 2936, 5, 115, 0, 0, 2936, 2937, 5, 116, 0, 0, 2937, 2938, 5, 108, 0, 0, 2938, 2939, 5, 111, 0, 0, 2939, 2940, 5, 99, 0, 0, 2940, 2941, 5, 46, 0, 0, 2941, 4040, 5, 50, 0, 0, 2942, 2943, 5, 115, 0, 0, 2943, 2944, 5, 116, 0, 0, 2944, 2945, 5, 108, 0, 0, 2945, 2946, 5, 111, 0, 0, 2946, 2947, 5, 99, 0, 0, 2947, 2948, 5, 46, 0, 0, 2948, 4040, 5, 51, 0, 0, 2949, 2950, 5, 108, 0, 0, 2950, 2951, 5, 100, 0, 0, 2951, 2952, 5, 110, 0, 0, 2952, 2953, 5, 117, 0, 0, 2953, 2954, 5, 108, 0, 0, 2954, 4040, 5, 108, 0, 0, 2955, 2956, 5, 108, 0, 0, 2956, 2957, 5, 100, 0, 0, 2957, 2958, 5, 99, 0, 0, 2958, 2959, 5, 46, 0, 0, 2959, 2960, 5, 105, 0, 0, 2960, 2961, 5, 52, 0, 0, 2961, 2962, 5, 46, 0, 0, 2962, 2963, 5, 109, 0, 0, 2963, 4040, 5, 49, 0, 0, 2964, 2965, 5, 108, 0, 0, 2965, 2966, 5, 100, 0, 0, 2966, 2967, 5, 99, 0, 0, 2967, 2968, 5, 46, 0, 0, 2968, 2969, 5, 105, 0, 0, 2969, 2970, 5, 52, 0, 0, 2970, 2971, 5, 46, 0, 0, 2971, 2972, 5, 77, 0, 0, 2972, 4040, 5, 49, 0, 0, 2973, 2974, 5, 108, 0, 0, 2974, 2975, 5, 100, 0, 0, 2975, 2976, 5, 99, 0, 0, 2976, 2977, 5, 46, 0, 0, 2977, 2978, 5, 105, 0, 0, 2978, 2979, 5, 52, 0, 0, 2979, 2980, 5, 46, 0, 0, 2980, 4040, 5, 48, 0, 0, 2981, 2982, 5, 108, 0, 0, 2982, 2983, 5, 100, 0, 0, 2983, 2984, 5, 99, 0, 0, 2984, 2985, 5, 46, 0, 0, 2985, 2986, 5, 105, 0, 0, 2986, 2987, 5, 52, 0, 0, 2987, 2988, 5, 46, 0, 0, 2988, 4040, 5, 49, 0, 0, 2989, 2990, 5, 108, 0, 0, 2990, 2991, 5, 100, 0, 0, 2991, 2992, 5, 99, 0, 0, 2992, 2993, 5, 46, 0, 0, 2993, 2994, 5, 105, 0, 0, 2994, 2995, 5, 52, 0, 0, 2995, 2996, 5, 46, 0, 0, 2996, 4040, 5, 50, 0, 0, 2997, 2998, 5, 108, 0, 0, 2998, 2999, 5, 100, 0, 0, 2999, 3000, 5, 99, 0, 0, 3000, 3001, 5, 46, 0, 0, 3001, 3002, 5, 105, 0, 0, 3002, 3003, 5, 52, 0, 0, 3003, 3004, 5, 46, 0, 0, 3004, 4040, 5, 51, 0, 0, 3005, 3006, 5, 108, 0, 0, 3006, 3007, 5, 100, 0, 0, 3007, 3008, 5, 99, 0, 0, 3008, 3009, 5, 46, 0, 0, 3009, 3010, 5, 105, 0, 0, 3010, 3011, 5, 52, 0, 0, 3011, 3012, 5, 46, 0, 0, 3012, 4040, 5, 52, 0, 0, 3013, 3014, 5, 108, 0, 0, 3014, 3015, 5, 100, 0, 0, 3015, 3016, 5, 99, 0, 0, 3016, 3017, 5, 46, 0, 0, 3017, 3018, 5, 105, 0, 0, 3018, 3019, 5, 52, 0, 0, 3019, 3020, 5, 46, 0, 0, 3020, 4040, 5, 53, 0, 0, 3021, 3022, 5, 108, 0, 0, 3022, 3023, 5, 100, 0, 0, 3023, 3024, 5, 99, 0, 0, 3024, 3025, 5, 46, 0, 0, 3025, 3026, 5, 105, 0, 0, 3026, 3027, 5, 52, 0, 0, 3027, 3028, 5, 46, 0, 0, 3028, 4040, 5, 54, 0, 0, 3029, 3030, 5, 108, 0, 0, 3030, 3031, 5, 100, 0, 0, 3031, 3032, 5, 99, 0, 0, 3032, 3033, 5, 46, 0, 0, 3033, 3034, 5, 105, 0, 0, 3034, 3035, 5, 52, 0, 0, 3035, 3036, 5, 46, 0, 0, 3036, 4040, 5, 55, 0, 0, 3037, 3038, 5, 108, 0, 0, 3038, 3039, 5, 100, 0, 0, 3039, 3040, 5, 99, 0, 0, 3040, 3041, 5, 46, 0, 0, 3041, 3042, 5, 105, 0, 0, 3042, 3043, 5, 52, 0, 0, 3043, 3044, 5, 46, 0, 0, 3044, 4040, 5, 56, 0, 0, 3045, 3046, 5, 100, 0, 0, 3046, 3047, 5, 117, 0, 0, 3047, 4040, 5, 112, 0, 0, 3048, 3049, 5, 112, 0, 0, 3049, 3050, 5, 111, 0, 0, 3050, 4040, 5, 112, 0, 0, 3051, 3052, 5, 114, 0, 0, 3052, 3053, 5, 101, 0, 0, 3053, 4040, 5, 116, 0, 0, 3054, 3055, 5, 108, 0, 0, 3055, 3056, 5, 100, 0, 0, 3056, 3057, 5, 105, 0, 0, 3057, 3058, 5, 110, 0, 0, 3058, 3059, 5, 100, 0, 0, 3059, 3060, 5, 46, 0, 0, 3060, 3061, 5, 105, 0, 0, 3061, 4040, 5, 49, 0, 0, 3062, 3063, 5, 108, 0, 0, 3063, 3064, 5, 100, 0, 0, 3064, 3065, 5, 105, 0, 0, 3065, 3066, 5, 110, 0, 0, 3066, 3067, 5, 100, 0, 0, 3067, 3068, 5, 46, 0, 0, 3068, 3069, 5, 117, 0, 0, 3069, 4040, 5, 49, 0, 0, 3070, 3071, 5, 108, 0, 0, 3071, 3072, 5, 100, 0, 0, 3072, 3073, 5, 105, 0, 0, 3073, 3074, 5, 110, 0, 0, 3074, 3075, 5, 100, 0, 0, 3075, 3076, 5, 46, 0, 0, 3076, 3077, 5, 105, 0, 0, 3077, 4040, 5, 50, 0, 0, 3078, 3079, 5, 108, 0, 0, 3079, 3080, 5, 100, 0, 0, 3080, 3081, 5, 105, 0, 0, 3081, 3082, 5, 110, 0, 0, 3082, 3083, 5, 100, 0, 0, 3083, 3084, 5, 46, 0, 0, 3084, 3085, 5, 117, 0, 0, 3085, 4040, 5, 50, 0, 0, 3086, 3087, 5, 108, 0, 0, 3087, 3088, 5, 100, 0, 0, 3088, 3089, 5, 105, 0, 0, 3089, 3090, 5, 110, 0, 0, 3090, 3091, 5, 100, 0, 0, 3091, 3092, 5, 46, 0, 0, 3092, 3093, 5, 105, 0, 0, 3093, 4040, 5, 52, 0, 0, 3094, 3095, 5, 108, 0, 0, 3095, 3096, 5, 100, 0, 0, 3096, 3097, 5, 105, 0, 0, 3097, 3098, 5, 110, 0, 0, 3098, 3099, 5, 100, 0, 0, 3099, 3100, 5, 46, 0, 0, 3100, 3101, 5, 117, 0, 0, 3101, 4040, 5, 52, 0, 0, 3102, 3103, 5, 108, 0, 0, 3103, 3104, 5, 100, 0, 0, 3104, 3105, 5, 105, 0, 0, 3105, 3106, 5, 110, 0, 0, 3106, 3107, 5, 100, 0, 0, 3107, 3108, 5, 46, 0, 0, 3108, 3109, 5, 105, 0, 0, 3109, 4040, 5, 56, 0, 0, 3110, 3111, 5, 108, 0, 0, 3111, 3112, 5, 100, 0, 0, 3112, 3113, 5, 105, 0, 0, 3113, 3114, 5, 110, 0, 0, 3114, 3115, 5, 100, 0, 0, 3115, 3116, 5, 46, 0, 0, 3116, 3117, 5, 117, 0, 0, 3117, 4040, 5, 56, 0, 0, 3118, 3119, 5, 108, 0, 0, 3119, 3120, 5, 100, 0, 0, 3120, 3121, 5, 105, 0, 0, 3121, 3122, 5, 110, 0, 0, 3122, 3123, 5, 100, 0, 0, 3123, 3124, 5, 46, 0, 0, 3124, 4040, 5, 105, 0, 0, 3125, 3126, 5, 108, 0, 0, 3126, 3127, 5, 100, 0, 0, 3127, 3128, 5, 105, 0, 0, 3128, 3129, 5, 110, 0, 0, 3129, 3130, 5, 100, 0, 0, 3130, 3131, 5, 46, 0, 0, 3131, 3132, 5, 114, 0, 0, 3132, 4040, 5, 52, 0, 0, 3133, 3134, 5, 108, 0, 0, 3134, 3135, 5, 100, 0, 0, 3135, 3136, 5, 105, 0, 0, 3136, 3137, 5, 110, 0, 0, 3137, 3138, 5, 100, 0, 0, 3138, 3139, 5, 46, 0, 0, 3139, 3140, 5, 114, 0, 0, 3140, 4040, 5, 56, 0, 0, 3141, 3142, 5, 108, 0, 0, 3142, 3143, 5, 100, 0, 0, 3143, 3144, 5, 105, 0, 0, 3144, 3145, 5, 110, 0, 0, 3145, 3146, 5, 100, 0, 0, 3146, 3147, 5, 46, 0, 0, 3147, 3148, 5, 114, 0, 0, 3148, 3149, 5, 101, 0, 0, 3149, 4040, 5, 102, 0, 0, 3150, 3151, 5, 115, 0, 0, 3151, 3152, 5, 116, 0, 0, 3152, 3153, 5, 105, 0, 0, 3153, 3154, 5, 110, 0, 0, 3154, 3155, 5, 100, 0, 0, 3155, 3156, 5, 46, 0, 0, 3156, 3157, 5, 114, 0, 0, 3157, 3158, 5, 101, 0, 0, 3158, 4040, 5, 102, 0, 0, 3159, 3160, 5, 115, 0, 0, 3160, 3161, 5, 116, 0, 0, 3161, 3162, 5, 105, 0, 0, 3162, 3163, 5, 110, 0, 0, 3163, 3164, 5, 100, 0, 0, 3164, 3165, 5, 46, 0, 0, 3165, 3166, 5, 105, 0, 0, 3166, 4040, 5, 49, 0, 0, 3167, 3168, 5, 115, 0, 0, 3168, 3169, 5, 116, 0, 0, 3169, 3170, 5, 105, 0, 0, 3170, 3171, 5, 110, 0, 0, 3171, 3172, 5, 100, 0, 0, 3172, 3173, 5, 46, 0, 0, 3173, 3174, 5, 105, 0, 0, 3174, 4040, 5, 50, 0, 0, 3175, 3176, 5, 115, 0, 0, 3176, 3177, 5, 116, 0, 0, 3177, 3178, 5, 105, 0, 0, 3178, 3179, 5, 110, 0, 0, 3179, 3180, 5, 100, 0, 0, 3180, 3181, 5, 46, 0, 0, 3181, 3182, 5, 105, 0, 0, 3182, 4040, 5, 52, 0, 0, 3183, 3184, 5, 115, 0, 0, 3184, 3185, 5, 116, 0, 0, 3185, 3186, 5, 105, 0, 0, 3186, 3187, 5, 110, 0, 0, 3187, 3188, 5, 100, 0, 0, 3188, 3189, 5, 46, 0, 0, 3189, 3190, 5, 105, 0, 0, 3190, 4040, 5, 56, 0, 0, 3191, 3192, 5, 115, 0, 0, 3192, 3193, 5, 116, 0, 0, 3193, 3194, 5, 105, 0, 0, 3194, 3195, 5, 110, 0, 0, 3195, 3196, 5, 100, 0, 0, 3196, 3197, 5, 46, 0, 0, 3197, 3198, 5, 114, 0, 0, 3198, 4040, 5, 52, 0, 0, 3199, 3200, 5, 115, 0, 0, 3200, 3201, 5, 116, 0, 0, 3201, 3202, 5, 105, 0, 0, 3202, 3203, 5, 110, 0, 0, 3203, 3204, 5, 100, 0, 0, 3204, 3205, 5, 46, 0, 0, 3205, 3206, 5, 114, 0, 0, 3206, 4040, 5, 56, 0, 0, 3207, 3208, 5, 97, 0, 0, 3208, 3209, 5, 100, 0, 0, 3209, 4040, 5, 100, 0, 0, 3210, 3211, 5, 115, 0, 0, 3211, 3212, 5, 117, 0, 0, 3212, 4040, 5, 98, 0, 0, 3213, 3214, 5, 109, 0, 0, 3214, 3215, 5, 117, 0, 0, 3215, 4040, 5, 108, 0, 0, 3216, 3217, 5, 100, 0, 0, 3217, 3218, 5, 105, 0, 0, 3218, 4040, 5, 118, 0, 0, 3219, 3220, 5, 100, 0, 0, 3220, 3221, 5, 105, 0, 0, 3221, 3222, 5, 118, 0, 0, 3222, 3223, 5, 46, 0, 0, 3223, 3224, 5, 117, 0, 0, 3224, 4040, 5, 110, 0, 0, 3225, 3226, 5, 114, 0, 0, 3226, 3227, 5, 101, 0, 0, 3227, 4040, 5, 109, 0, 0, 3228, 3229, 5, 114, 0, 0, 3229, 3230, 5, 101, 0, 0, 3230, 3231, 5, 109, 0, 0, 3231, 3232, 5, 46, 0, 0, 3232, 3233, 5, 117, 0, 0, 3233, 4040, 5, 110, 0, 0, 3234, 3235, 5, 97, 0, 0, 3235, 3236, 5, 110, 0, 0, 3236, 4040, 5, 100, 0, 0, 3237, 3238, 5, 111, 0, 0, 3238, 4040, 5, 114, 0, 0, 3239, 3240, 5, 120, 0, 0, 3240, 3241, 5, 111, 0, 0, 3241, 4040, 5, 114, 0, 0, 3242, 3243, 5, 115, 0, 0, 3243, 3244, 5, 104, 0, 0, 3244, 4040, 5, 108, 0, 0, 3245, 3246, 5, 115, 0, 0, 3246, 3247, 5, 104, 0, 0, 3247, 4040, 5, 114, 0, 0, 3248, 3249, 5, 115, 0, 0, 3249, 3250, 5, 104, 0, 0, 3250, 3251, 5, 114, 0, 0, 3251, 3252, 5, 46, 0, 0, 3252, 3253, 5, 117, 0, 0, 3253, 4040, 5, 110, 0, 0, 3254, 3255, 5, 110, 0, 0, 3255, 3256, 5, 101, 0, 0, 3256, 4040, 5, 103, 0, 0, 3257, 3258, 5, 110, 0, 0, 3258, 3259, 5, 111, 0, 0, 3259, 4040, 5, 116, 0, 0, 3260, 3261, 5, 99, 0, 0, 3261, 3262, 5, 111, 0, 0, 3262, 3263, 5, 110, 0, 0, 3263, 3264, 5, 118, 0, 0, 3264, 3265, 5, 46, 0, 0, 3265, 3266, 5, 105, 0, 0, 3266, 4040, 5, 49, 0, 0, 3267, 3268, 5, 99, 0, 0, 3268, 3269, 5, 111, 0, 0, 3269, 3270, 5, 110, 0, 0, 3270, 3271, 5, 118, 0, 0, 3271, 3272, 5, 46, 0, 0, 3272, 3273, 5, 105, 0, 0, 3273, 4040, 5, 50, 0, 0, 3274, 3275, 5, 99, 0, 0, 3275, 3276, 5, 111, 0, 0, 3276, 3277, 5, 110, 0, 0, 3277, 3278, 5, 118, 0, 0, 3278, 3279, 5, 46, 0, 0, 3279, 3280, 5, 105, 0, 0, 3280, 4040, 5, 52, 0, 0, 3281, 3282, 5, 99, 0, 0, 3282, 3283, 5, 111, 0, 0, 3283, 3284, 5, 110, 0, 0, 3284, 3285, 5, 118, 0, 0, 3285, 3286, 5, 46, 0, 0, 3286, 3287, 5, 105, 0, 0, 3287, 4040, 5, 56, 0, 0, 3288, 3289, 5, 99, 0, 0, 3289, 3290, 5, 111, 0, 0, 3290, 3291, 5, 110, 0, 0, 3291, 3292, 5, 118, 0, 0, 3292, 3293, 5, 46, 0, 0, 3293, 3294, 5, 114, 0, 0, 3294, 4040, 5, 52, 0, 0, 3295, 3296, 5, 99, 0, 0, 3296, 3297, 5, 111, 0, 0, 3297, 3298, 5, 110, 0, 0, 3298, 3299, 5, 118, 0, 0, 3299, 3300, 5, 46, 0, 0, 3300, 3301, 5, 114, 0, 0, 3301, 4040, 5, 56, 0, 0, 3302, 3303, 5, 99, 0, 0, 3303, 3304, 5, 111, 0, 0, 3304, 3305, 5, 110, 0, 0, 3305, 3306, 5, 118, 0, 0, 3306, 3307, 5, 46, 0, 0, 3307, 3308, 5, 117, 0, 0, 3308, 4040, 5, 52, 0, 0, 3309, 3310, 5, 99, 0, 0, 3310, 3311, 5, 111, 0, 0, 3311, 3312, 5, 110, 0, 0, 3312, 3313, 5, 118, 0, 0, 3313, 3314, 5, 46, 0, 0, 3314, 3315, 5, 117, 0, 0, 3315, 4040, 5, 56, 0, 0, 3316, 3317, 5, 99, 0, 0, 3317, 3318, 5, 111, 0, 0, 3318, 3319, 5, 110, 0, 0, 3319, 3320, 5, 118, 0, 0, 3320, 3321, 5, 46, 0, 0, 3321, 3322, 5, 114, 0, 0, 3322, 3323, 5, 46, 0, 0, 3323, 3324, 5, 117, 0, 0, 3324, 4040, 5, 110, 0, 0, 3325, 3326, 5, 116, 0, 0, 3326, 3327, 5, 104, 0, 0, 3327, 3328, 5, 114, 0, 0, 3328, 3329, 5, 111, 0, 0, 3329, 4040, 5, 119, 0, 0, 3330, 3331, 5, 99, 0, 0, 3331, 3332, 5, 111, 0, 0, 3332, 3333, 5, 110, 0, 0, 3333, 3334, 5, 118, 0, 0, 3334, 3335, 5, 46, 0, 0, 3335, 3336, 5, 111, 0, 0, 3336, 3337, 5, 118, 0, 0, 3337, 3338, 5, 102, 0, 0, 3338, 3339, 5, 46, 0, 0, 3339, 3340, 5, 105, 0, 0, 3340, 3341, 5, 49, 0, 0, 3341, 3342, 5, 46, 0, 0, 3342, 3343, 5, 117, 0, 0, 3343, 4040, 5, 110, 0, 0, 3344, 3345, 5, 99, 0, 0, 3345, 3346, 5, 111, 0, 0, 3346, 3347, 5, 110, 0, 0, 3347, 3348, 5, 118, 0, 0, 3348, 3349, 5, 46, 0, 0, 3349, 3350, 5, 111, 0, 0, 3350, 3351, 5, 118, 0, 0, 3351, 3352, 5, 102, 0, 0, 3352, 3353, 5, 46, 0, 0, 3353, 3354, 5, 105, 0, 0, 3354, 3355, 5, 50, 0, 0, 3355, 3356, 5, 46, 0, 0, 3356, 3357, 5, 117, 0, 0, 3357, 4040, 5, 110, 0, 0, 3358, 3359, 5, 99, 0, 0, 3359, 3360, 5, 111, 0, 0, 3360, 3361, 5, 110, 0, 0, 3361, 3362, 5, 118, 0, 0, 3362, 3363, 5, 46, 0, 0, 3363, 3364, 5, 111, 0, 0, 3364, 3365, 5, 118, 0, 0, 3365, 3366, 5, 102, 0, 0, 3366, 3367, 5, 46, 0, 0, 3367, 3368, 5, 105, 0, 0, 3368, 3369, 5, 52, 0, 0, 3369, 3370, 5, 46, 0, 0, 3370, 3371, 5, 117, 0, 0, 3371, 4040, 5, 110, 0, 0, 3372, 3373, 5, 99, 0, 0, 3373, 3374, 5, 111, 0, 0, 3374, 3375, 5, 110, 0, 0, 3375, 3376, 5, 118, 0, 0, 3376, 3377, 5, 46, 0, 0, 3377, 3378, 5, 111, 0, 0, 3378, 3379, 5, 118, 0, 0, 3379, 3380, 5, 102, 0, 0, 3380, 3381, 5, 46, 0, 0, 3381, 3382, 5, 105, 0, 0, 3382, 3383, 5, 56, 0, 0, 3383, 3384, 5, 46, 0, 0, 3384, 3385, 5, 117, 0, 0, 3385, 4040, 5, 110, 0, 0, 3386, 3387, 5, 99, 0, 0, 3387, 3388, 5, 111, 0, 0, 3388, 3389, 5, 110, 0, 0, 3389, 3390, 5, 118, 0, 0, 3390, 3391, 5, 46, 0, 0, 3391, 3392, 5, 111, 0, 0, 3392, 3393, 5, 118, 0, 0, 3393, 3394, 5, 102, 0, 0, 3394, 3395, 5, 46, 0, 0, 3395, 3396, 5, 117, 0, 0, 3396, 3397, 5, 49, 0, 0, 3397, 3398, 5, 46, 0, 0, 3398, 3399, 5, 117, 0, 0, 3399, 4040, 5, 110, 0, 0, 3400, 3401, 5, 99, 0, 0, 3401, 3402, 5, 111, 0, 0, 3402, 3403, 5, 110, 0, 0, 3403, 3404, 5, 118, 0, 0, 3404, 3405, 5, 46, 0, 0, 3405, 3406, 5, 111, 0, 0, 3406, 3407, 5, 118, 0, 0, 3407, 3408, 5, 102, 0, 0, 3408, 3409, 5, 46, 0, 0, 3409, 3410, 5, 117, 0, 0, 3410, 3411, 5, 50, 0, 0, 3411, 3412, 5, 46, 0, 0, 3412, 3413, 5, 117, 0, 0, 3413, 4040, 5, 110, 0, 0, 3414, 3415, 5, 99, 0, 0, 3415, 3416, 5, 111, 0, 0, 3416, 3417, 5, 110, 0, 0, 3417, 3418, 5, 118, 0, 0, 3418, 3419, 5, 46, 0, 0, 3419, 3420, 5, 111, 0, 0, 3420, 3421, 5, 118, 0, 0, 3421, 3422, 5, 102, 0, 0, 3422, 3423, 5, 46, 0, 0, 3423, 3424, 5, 117, 0, 0, 3424, 3425, 5, 52, 0, 0, 3425, 3426, 5, 46, 0, 0, 3426, 3427, 5, 117, 0, 0, 3427, 4040, 5, 110, 0, 0, 3428, 3429, 5, 99, 0, 0, 3429, 3430, 5, 111, 0, 0, 3430, 3431, 5, 110, 0, 0, 3431, 3432, 5, 118, 0, 0, 3432, 3433, 5, 46, 0, 0, 3433, 3434, 5, 111, 0, 0, 3434, 3435, 5, 118, 0, 0, 3435, 3436, 5, 102, 0, 0, 3436, 3437, 5, 46, 0, 0, 3437, 3438, 5, 117, 0, 0, 3438, 3439, 5, 56, 0, 0, 3439, 3440, 5, 46, 0, 0, 3440, 3441, 5, 117, 0, 0, 3441, 4040, 5, 110, 0, 0, 3442, 3443, 5, 99, 0, 0, 3443, 3444, 5, 111, 0, 0, 3444, 3445, 5, 110, 0, 0, 3445, 3446, 5, 118, 0, 0, 3446, 3447, 5, 46, 0, 0, 3447, 3448, 5, 111, 0, 0, 3448, 3449, 5, 118, 0, 0, 3449, 3450, 5, 102, 0, 0, 3450, 3451, 5, 46, 0, 0, 3451, 3452, 5, 105, 0, 0, 3452, 3453, 5, 46, 0, 0, 3453, 3454, 5, 117, 0, 0, 3454, 4040, 5, 110, 0, 0, 3455, 3456, 5, 99, 0, 0, 3456, 3457, 5, 111, 0, 0, 3457, 3458, 5, 110, 0, 0, 3458, 3459, 5, 118, 0, 0, 3459, 3460, 5, 46, 0, 0, 3460, 3461, 5, 111, 0, 0, 3461, 3462, 5, 118, 0, 0, 3462, 3463, 5, 102, 0, 0, 3463, 3464, 5, 46, 0, 0, 3464, 3465, 5, 117, 0, 0, 3465, 3466, 5, 46, 0, 0, 3466, 3467, 5, 117, 0, 0, 3467, 4040, 5, 110, 0, 0, 3468, 3469, 5, 108, 0, 0, 3469, 3470, 5, 100, 0, 0, 3470, 3471, 5, 108, 0, 0, 3471, 3472, 5, 101, 0, 0, 3472, 4040, 5, 110, 0, 0, 3473, 3474, 5, 108, 0, 0, 3474, 3475, 5, 100, 0, 0, 3475, 3476, 5, 101, 0, 0, 3476, 3477, 5, 108, 0, 0, 3477, 3478, 5, 101, 0, 0, 3478, 3479, 5, 109, 0, 0, 3479, 3480, 5, 46, 0, 0, 3480, 3481, 5, 105, 0, 0, 3481, 4040, 5, 49, 0, 0, 3482, 3483, 5, 108, 0, 0, 3483, 3484, 5, 100, 0, 0, 3484, 3485, 5, 101, 0, 0, 3485, 3486, 5, 108, 0, 0, 3486, 3487, 5, 101, 0, 0, 3487, 3488, 5, 109, 0, 0, 3488, 3489, 5, 46, 0, 0, 3489, 3490, 5, 117, 0, 0, 3490, 4040, 5, 49, 0, 0, 3491, 3492, 5, 108, 0, 0, 3492, 3493, 5, 100, 0, 0, 3493, 3494, 5, 101, 0, 0, 3494, 3495, 5, 108, 0, 0, 3495, 3496, 5, 101, 0, 0, 3496, 3497, 5, 109, 0, 0, 3497, 3498, 5, 46, 0, 0, 3498, 3499, 5, 105, 0, 0, 3499, 4040, 5, 50, 0, 0, 3500, 3501, 5, 108, 0, 0, 3501, 3502, 5, 100, 0, 0, 3502, 3503, 5, 101, 0, 0, 3503, 3504, 5, 108, 0, 0, 3504, 3505, 5, 101, 0, 0, 3505, 3506, 5, 109, 0, 0, 3506, 3507, 5, 46, 0, 0, 3507, 3508, 5, 117, 0, 0, 3508, 4040, 5, 50, 0, 0, 3509, 3510, 5, 108, 0, 0, 3510, 3511, 5, 100, 0, 0, 3511, 3512, 5, 101, 0, 0, 3512, 3513, 5, 108, 0, 0, 3513, 3514, 5, 101, 0, 0, 3514, 3515, 5, 109, 0, 0, 3515, 3516, 5, 46, 0, 0, 3516, 3517, 5, 105, 0, 0, 3517, 4040, 5, 52, 0, 0, 3518, 3519, 5, 108, 0, 0, 3519, 3520, 5, 100, 0, 0, 3520, 3521, 5, 101, 0, 0, 3521, 3522, 5, 108, 0, 0, 3522, 3523, 5, 101, 0, 0, 3523, 3524, 5, 109, 0, 0, 3524, 3525, 5, 46, 0, 0, 3525, 3526, 5, 117, 0, 0, 3526, 4040, 5, 52, 0, 0, 3527, 3528, 5, 108, 0, 0, 3528, 3529, 5, 100, 0, 0, 3529, 3530, 5, 101, 0, 0, 3530, 3531, 5, 108, 0, 0, 3531, 3532, 5, 101, 0, 0, 3532, 3533, 5, 109, 0, 0, 3533, 3534, 5, 46, 0, 0, 3534, 3535, 5, 105, 0, 0, 3535, 4040, 5, 56, 0, 0, 3536, 3537, 5, 108, 0, 0, 3537, 3538, 5, 100, 0, 0, 3538, 3539, 5, 101, 0, 0, 3539, 3540, 5, 108, 0, 0, 3540, 3541, 5, 101, 0, 0, 3541, 3542, 5, 109, 0, 0, 3542, 3543, 5, 46, 0, 0, 3543, 3544, 5, 117, 0, 0, 3544, 4040, 5, 56, 0, 0, 3545, 3546, 5, 108, 0, 0, 3546, 3547, 5, 100, 0, 0, 3547, 3548, 5, 101, 0, 0, 3548, 3549, 5, 108, 0, 0, 3549, 3550, 5, 101, 0, 0, 3550, 3551, 5, 109, 0, 0, 3551, 3552, 5, 46, 0, 0, 3552, 4040, 5, 105, 0, 0, 3553, 3554, 5, 108, 0, 0, 3554, 3555, 5, 100, 0, 0, 3555, 3556, 5, 101, 0, 0, 3556, 3557, 5, 108, 0, 0, 3557, 3558, 5, 101, 0, 0, 3558, 3559, 5, 109, 0, 0, 3559, 3560, 5, 46, 0, 0, 3560, 3561, 5, 114, 0, 0, 3561, 4040, 5, 52, 0, 0, 3562, 3563, 5, 108, 0, 0, 3563, 3564, 5, 100, 0, 0, 3564, 3565, 5, 101, 0, 0, 3565, 3566, 5, 108, 0, 0, 3566, 3567, 5, 101, 0, 0, 3567, 3568, 5, 109, 0, 0, 3568, 3569, 5, 46, 0, 0, 3569, 3570, 5, 114, 0, 0, 3570, 4040, 5, 56, 0, 0, 3571, 3572, 5, 108, 0, 0, 3572, 3573, 5, 100, 0, 0, 3573, 3574, 5, 101, 0, 0, 3574, 3575, 5, 108, 0, 0, 3575, 3576, 5, 101, 0, 0, 3576, 3577, 5, 109, 0, 0, 3577, 3578, 5, 46, 0, 0, 3578, 3579, 5, 114, 0, 0, 3579, 3580, 5, 101, 0, 0, 3580, 4040, 5, 102, 0, 0, 3581, 3582, 5, 115, 0, 0, 3582, 3583, 5, 116, 0, 0, 3583, 3584, 5, 101, 0, 0, 3584, 3585, 5, 108, 0, 0, 3585, 3586, 5, 101, 0, 0, 3586, 3587, 5, 109, 0, 0, 3587, 3588, 5, 46, 0, 0, 3588, 4040, 5, 105, 0, 0, 3589, 3590, 5, 115, 0, 0, 3590, 3591, 5, 116, 0, 0, 3591, 3592, 5, 101, 0, 0, 3592, 3593, 5, 108, 0, 0, 3593, 3594, 5, 101, 0, 0, 3594, 3595, 5, 109, 0, 0, 3595, 3596, 5, 46, 0, 0, 3596, 3597, 5, 105, 0, 0, 3597, 4040, 5, 49, 0, 0, 3598, 3599, 5, 115, 0, 0, 3599, 3600, 5, 116, 0, 0, 3600, 3601, 5, 101, 0, 0, 3601, 3602, 5, 108, 0, 0, 3602, 3603, 5, 101, 0, 0, 3603, 3604, 5, 109, 0, 0, 3604, 3605, 5, 46, 0, 0, 3605, 3606, 5, 105, 0, 0, 3606, 4040, 5, 50, 0, 0, 3607, 3608, 5, 115, 0, 0, 3608, 3609, 5, 116, 0, 0, 3609, 3610, 5, 101, 0, 0, 3610, 3611, 5, 108, 0, 0, 3611, 3612, 5, 101, 0, 0, 3612, 3613, 5, 109, 0, 0, 3613, 3614, 5, 46, 0, 0, 3614, 3615, 5, 105, 0, 0, 3615, 4040, 5, 52, 0, 0, 3616, 3617, 5, 115, 0, 0, 3617, 3618, 5, 116, 0, 0, 3618, 3619, 5, 101, 0, 0, 3619, 3620, 5, 108, 0, 0, 3620, 3621, 5, 101, 0, 0, 3621, 3622, 5, 109, 0, 0, 3622, 3623, 5, 46, 0, 0, 3623, 3624, 5, 105, 0, 0, 3624, 4040, 5, 56, 0, 0, 3625, 3626, 5, 115, 0, 0, 3626, 3627, 5, 116, 0, 0, 3627, 3628, 5, 101, 0, 0, 3628, 3629, 5, 108, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 109, 0, 0, 3631, 3632, 5, 46, 0, 0, 3632, 3633, 5, 114, 0, 0, 3633, 4040, 5, 52, 0, 0, 3634, 3635, 5, 115, 0, 0, 3635, 3636, 5, 116, 0, 0, 3636, 3637, 5, 101, 0, 0, 3637, 3638, 5, 108, 0, 0, 3638, 3639, 5, 101, 0, 0, 3639, 3640, 5, 109, 0, 0, 3640, 3641, 5, 46, 0, 0, 3641, 3642, 5, 114, 0, 0, 3642, 4040, 5, 56, 0, 0, 3643, 3644, 5, 115, 0, 0, 3644, 3645, 5, 116, 0, 0, 3645, 3646, 5, 101, 0, 0, 3646, 3647, 5, 108, 0, 0, 3647, 3648, 5, 101, 0, 0, 3648, 3649, 5, 109, 0, 0, 3649, 3650, 5, 46, 0, 0, 3650, 3651, 5, 114, 0, 0, 3651, 3652, 5, 101, 0, 0, 3652, 4040, 5, 102, 0, 0, 3653, 3654, 5, 99, 0, 0, 3654, 3655, 5, 111, 0, 0, 3655, 3656, 5, 110, 0, 0, 3656, 3657, 5, 118, 0, 0, 3657, 3658, 5, 46, 0, 0, 3658, 3659, 5, 111, 0, 0, 3659, 3660, 5, 118, 0, 0, 3660, 3661, 5, 102, 0, 0, 3661, 3662, 5, 46, 0, 0, 3662, 3663, 5, 105, 0, 0, 3663, 4040, 5, 49, 0, 0, 3664, 3665, 5, 99, 0, 0, 3665, 3666, 5, 111, 0, 0, 3666, 3667, 5, 110, 0, 0, 3667, 3668, 5, 118, 0, 0, 3668, 3669, 5, 46, 0, 0, 3669, 3670, 5, 111, 0, 0, 3670, 3671, 5, 118, 0, 0, 3671, 3672, 5, 102, 0, 0, 3672, 3673, 5, 46, 0, 0, 3673, 3674, 5, 117, 0, 0, 3674, 4040, 5, 49, 0, 0, 3675, 3676, 5, 99, 0, 0, 3676, 3677, 5, 111, 0, 0, 3677, 3678, 5, 110, 0, 0, 3678, 3679, 5, 118, 0, 0, 3679, 3680, 5, 46, 0, 0, 3680, 3681, 5, 111, 0, 0, 3681, 3682, 5, 118, 0, 0, 3682, 3683, 5, 102, 0, 0, 3683, 3684, 5, 46, 0, 0, 3684, 3685, 5, 105, 0, 0, 3685, 4040, 5, 50, 0, 0, 3686, 3687, 5, 99, 0, 0, 3687, 3688, 5, 111, 0, 0, 3688, 3689, 5, 110, 0, 0, 3689, 3690, 5, 118, 0, 0, 3690, 3691, 5, 46, 0, 0, 3691, 3692, 5, 111, 0, 0, 3692, 3693, 5, 118, 0, 0, 3693, 3694, 5, 102, 0, 0, 3694, 3695, 5, 46, 0, 0, 3695, 3696, 5, 117, 0, 0, 3696, 4040, 5, 50, 0, 0, 3697, 3698, 5, 99, 0, 0, 3698, 3699, 5, 111, 0, 0, 3699, 3700, 5, 110, 0, 0, 3700, 3701, 5, 118, 0, 0, 3701, 3702, 5, 46, 0, 0, 3702, 3703, 5, 111, 0, 0, 3703, 3704, 5, 118, 0, 0, 3704, 3705, 5, 102, 0, 0, 3705, 3706, 5, 46, 0, 0, 3706, 3707, 5, 105, 0, 0, 3707, 4040, 5, 52, 0, 0, 3708, 3709, 5, 99, 0, 0, 3709, 3710, 5, 111, 0, 0, 3710, 3711, 5, 110, 0, 0, 3711, 3712, 5, 118, 0, 0, 3712, 3713, 5, 46, 0, 0, 3713, 3714, 5, 111, 0, 0, 3714, 3715, 5, 118, 0, 0, 3715, 3716, 5, 102, 0, 0, 3716, 3717, 5, 46, 0, 0, 3717, 3718, 5, 117, 0, 0, 3718, 4040, 5, 52, 0, 0, 3719, 3720, 5, 99, 0, 0, 3720, 3721, 5, 111, 0, 0, 3721, 3722, 5, 110, 0, 0, 3722, 3723, 5, 118, 0, 0, 3723, 3724, 5, 46, 0, 0, 3724, 3725, 5, 111, 0, 0, 3725, 3726, 5, 118, 0, 0, 3726, 3727, 5, 102, 0, 0, 3727, 3728, 5, 46, 0, 0, 3728, 3729, 5, 105, 0, 0, 3729, 4040, 5, 56, 0, 0, 3730, 3731, 5, 99, 0, 0, 3731, 3732, 5, 111, 0, 0, 3732, 3733, 5, 110, 0, 0, 3733, 3734, 5, 118, 0, 0, 3734, 3735, 5, 46, 0, 0, 3735, 3736, 5, 111, 0, 0, 3736, 3737, 5, 118, 0, 0, 3737, 3738, 5, 102, 0, 0, 3738, 3739, 5, 46, 0, 0, 3739, 3740, 5, 117, 0, 0, 3740, 4040, 5, 56, 0, 0, 3741, 3742, 5, 99, 0, 0, 3742, 3743, 5, 107, 0, 0, 3743, 3744, 5, 102, 0, 0, 3744, 3745, 5, 105, 0, 0, 3745, 3746, 5, 110, 0, 0, 3746, 3747, 5, 105, 0, 0, 3747, 3748, 5, 116, 0, 0, 3748, 4040, 5, 101, 0, 0, 3749, 3750, 5, 99, 0, 0, 3750, 3751, 5, 111, 0, 0, 3751, 3752, 5, 110, 0, 0, 3752, 3753, 5, 118, 0, 0, 3753, 3754, 5, 46, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 4040, 5, 50, 0, 0, 3756, 3757, 5, 99, 0, 0, 3757, 3758, 5, 111, 0, 0, 3758, 3759, 5, 110, 0, 0, 3759, 3760, 5, 118, 0, 0, 3760, 3761, 5, 46, 0, 0, 3761, 3762, 5, 117, 0, 0, 3762, 4040, 5, 49, 0, 0, 3763, 3764, 5, 99, 0, 0, 3764, 3765, 5, 111, 0, 0, 3765, 3766, 5, 110, 0, 0, 3766, 3767, 5, 118, 0, 0, 3767, 3768, 5, 46, 0, 0, 3768, 4040, 5, 105, 0, 0, 3769, 3770, 5, 99, 0, 0, 3770, 3771, 5, 111, 0, 0, 3771, 3772, 5, 110, 0, 0, 3772, 3773, 5, 118, 0, 0, 3773, 3774, 5, 46, 0, 0, 3774, 3775, 5, 111, 0, 0, 3775, 3776, 5, 118, 0, 0, 3776, 3777, 5, 102, 0, 0, 3777, 3778, 5, 46, 0, 0, 3778, 4040, 5, 105, 0, 0, 3779, 3780, 5, 99, 0, 0, 3780, 3781, 5, 111, 0, 0, 3781, 3782, 5, 110, 0, 0, 3782, 3783, 5, 118, 0, 0, 3783, 3784, 5, 46, 0, 0, 3784, 3785, 5, 111, 0, 0, 3785, 3786, 5, 118, 0, 0, 3786, 3787, 5, 102, 0, 0, 3787, 3788, 5, 46, 0, 0, 3788, 4040, 5, 117, 0, 0, 3789, 3790, 5, 97, 0, 0, 3790, 3791, 5, 100, 0, 0, 3791, 3792, 5, 100, 0, 0, 3792, 3793, 5, 46, 0, 0, 3793, 3794, 5, 111, 0, 0, 3794, 3795, 5, 118, 0, 0, 3795, 4040, 5, 102, 0, 0, 3796, 3797, 5, 97, 0, 0, 3797, 3798, 5, 100, 0, 0, 3798, 3799, 5, 100, 0, 0, 3799, 3800, 5, 46, 0, 0, 3800, 3801, 5, 111, 0, 0, 3801, 3802, 5, 118, 0, 0, 3802, 3803, 5, 102, 0, 0, 3803, 3804, 5, 46, 0, 0, 3804, 3805, 5, 117, 0, 0, 3805, 4040, 5, 110, 0, 0, 3806, 3807, 5, 109, 0, 0, 3807, 3808, 5, 117, 0, 0, 3808, 3809, 5, 108, 0, 0, 3809, 3810, 5, 46, 0, 0, 3810, 3811, 5, 111, 0, 0, 3811, 3812, 5, 118, 0, 0, 3812, 4040, 5, 102, 0, 0, 3813, 3814, 5, 109, 0, 0, 3814, 3815, 5, 117, 0, 0, 3815, 3816, 5, 108, 0, 0, 3816, 3817, 5, 46, 0, 0, 3817, 3818, 5, 111, 0, 0, 3818, 3819, 5, 118, 0, 0, 3819, 3820, 5, 102, 0, 0, 3820, 3821, 5, 46, 0, 0, 3821, 3822, 5, 117, 0, 0, 3822, 4040, 5, 110, 0, 0, 3823, 3824, 5, 115, 0, 0, 3824, 3825, 5, 117, 0, 0, 3825, 3826, 5, 98, 0, 0, 3826, 3827, 5, 46, 0, 0, 3827, 3828, 5, 111, 0, 0, 3828, 3829, 5, 118, 0, 0, 3829, 4040, 5, 102, 0, 0, 3830, 3831, 5, 115, 0, 0, 3831, 3832, 5, 117, 0, 0, 3832, 3833, 5, 98, 0, 0, 3833, 3834, 5, 46, 0, 0, 3834, 3835, 5, 111, 0, 0, 3835, 3836, 5, 118, 0, 0, 3836, 3837, 5, 102, 0, 0, 3837, 3838, 5, 46, 0, 0, 3838, 3839, 5, 117, 0, 0, 3839, 4040, 5, 110, 0, 0, 3840, 3841, 5, 101, 0, 0, 3841, 3842, 5, 110, 0, 0, 3842, 3843, 5, 100, 0, 0, 3843, 3844, 5, 102, 0, 0, 3844, 3845, 5, 105, 0, 0, 3845, 3846, 5, 110, 0, 0, 3846, 3847, 5, 97, 0, 0, 3847, 3848, 5, 108, 0, 0, 3848, 3849, 5, 108, 0, 0, 3849, 4040, 5, 121, 0, 0, 3850, 3851, 5, 101, 0, 0, 3851, 3852, 5, 110, 0, 0, 3852, 3853, 5, 100, 0, 0, 3853, 3854, 5, 102, 0, 0, 3854, 3855, 5, 97, 0, 0, 3855, 3856, 5, 117, 0, 0, 3856, 3857, 5, 108, 0, 0, 3857, 4040, 5, 116, 0, 0, 3858, 3859, 5, 115, 0, 0, 3859, 3860, 5, 116, 0, 0, 3860, 3861, 5, 105, 0, 0, 3861, 3862, 5, 110, 0, 0, 3862, 3863, 5, 100, 0, 0, 3863, 3864, 5, 46, 0, 0, 3864, 4040, 5, 105, 0, 0, 3865, 3866, 5, 99, 0, 0, 3866, 3867, 5, 111, 0, 0, 3867, 3868, 5, 110, 0, 0, 3868, 3869, 5, 118, 0, 0, 3869, 3870, 5, 46, 0, 0, 3870, 4040, 5, 117, 0, 0, 3871, 3872, 5, 112, 0, 0, 3872, 3873, 5, 114, 0, 0, 3873, 3874, 5, 101, 0, 0, 3874, 3875, 5, 102, 0, 0, 3875, 3876, 5, 105, 0, 0, 3876, 3877, 5, 120, 0, 0, 3877, 4040, 5, 55, 0, 0, 3878, 3879, 5, 112, 0, 0, 3879, 3880, 5, 114, 0, 0, 3880, 3881, 5, 101, 0, 0, 3881, 3882, 5, 102, 0, 0, 3882, 3883, 5, 105, 0, 0, 3883, 3884, 5, 120, 0, 0, 3884, 4040, 5, 54, 0, 0, 3885, 3886, 5, 112, 0, 0, 3886, 3887, 5, 114, 0, 0, 3887, 3888, 5, 101, 0, 0, 3888, 3889, 5, 102, 0, 0, 3889, 3890, 5, 105, 0, 0, 3890, 3891, 5, 120, 0, 0, 3891, 4040, 5, 53, 0, 0, 3892, 3893, 5, 112, 0, 0, 3893, 3894, 5, 114, 0, 0, 3894, 3895, 5, 101, 0, 0, 3895, 3896, 5, 102, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 120, 0, 0, 3898, 4040, 5, 52, 0, 0, 3899, 3900, 5, 112, 0, 0, 3900, 3901, 5, 114, 0, 0, 3901, 3902, 5, 101, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 105, 0, 0, 3904, 3905, 5, 120, 0, 0, 3905, 4040, 5, 51, 0, 0, 3906, 3907, 5, 112, 0, 0, 3907, 3908, 5, 114, 0, 0, 3908, 3909, 5, 101, 0, 0, 3909, 3910, 5, 102, 0, 0, 3910, 3911, 5, 105, 0, 0, 3911, 3912, 5, 120, 0, 0, 3912, 4040, 5, 50, 0, 0, 3913, 3914, 5, 112, 0, 0, 3914, 3915, 5, 114, 0, 0, 3915, 3916, 5, 101, 0, 0, 3916, 3917, 5, 102, 0, 0, 3917, 3918, 5, 105, 0, 0, 3918, 3919, 5, 120, 0, 0, 3919, 4040, 5, 49, 0, 0, 3920, 3921, 5, 112, 0, 0, 3921, 3922, 5, 114, 0, 0, 3922, 3923, 5, 101, 0, 0, 3923, 3924, 5, 102, 0, 0, 3924, 3925, 5, 105, 0, 0, 3925, 3926, 5, 120, 0, 0, 3926, 3927, 5, 114, 0, 0, 3927, 3928, 5, 101, 0, 0, 3928, 4040, 5, 102, 0, 0, 3929, 3930, 5, 97, 0, 0, 3930, 3931, 5, 114, 0, 0, 3931, 3932, 5, 103, 0, 0, 3932, 3933, 5, 108, 0, 0, 3933, 3934, 5, 105, 0, 0, 3934, 3935, 5, 115, 0, 0, 3935, 4040, 5, 116, 0, 0, 3936, 3937, 5, 99, 0, 0, 3937, 3938, 5, 101, 0, 0, 3938, 4040, 5, 113, 0, 0, 3939, 3940, 5, 99, 0, 0, 3940, 3941, 5, 103, 0, 0, 3941, 4040, 5, 116, 0, 0, 3942, 3943, 5, 99, 0, 0, 3943, 3944, 5, 103, 0, 0, 3944, 3945, 5, 116, 0, 0, 3945, 3946, 5, 46, 0, 0, 3946, 3947, 5, 117, 0, 0, 3947, 4040, 5, 110, 0, 0, 3948, 3949, 5, 99, 0, 0, 3949, 3950, 5, 108, 0, 0, 3950, 4040, 5, 116, 0, 0, 3951, 3952, 5, 99, 0, 0, 3952, 3953, 5, 108, 0, 0, 3953, 3954, 5, 116, 0, 0, 3954, 3955, 5, 46, 0, 0, 3955, 3956, 5, 117, 0, 0, 3956, 4040, 5, 110, 0, 0, 3957, 3958, 5, 108, 0, 0, 3958, 3959, 5, 111, 0, 0, 3959, 3960, 5, 99, 0, 0, 3960, 3961, 5, 97, 0, 0, 3961, 3962, 5, 108, 0, 0, 3962, 3963, 5, 108, 0, 0, 3963, 3964, 5, 111, 0, 0, 3964, 4040, 5, 99, 0, 0, 3965, 3966, 5, 101, 0, 0, 3966, 3967, 5, 110, 0, 0, 3967, 3968, 5, 100, 0, 0, 3968, 3969, 5, 102, 0, 0, 3969, 3970, 5, 105, 0, 0, 3970, 3971, 5, 108, 0, 0, 3971, 3972, 5, 116, 0, 0, 3972, 3973, 5, 101, 0, 0, 3973, 4040, 5, 114, 0, 0, 3974, 3975, 5, 118, 0, 0, 3975, 3976, 5, 111, 0, 0, 3976, 3977, 5, 108, 0, 0, 3977, 3978, 5, 97, 0, 0, 3978, 3979, 5, 116, 0, 0, 3979, 3980, 5, 105, 0, 0, 3980, 3981, 5, 108, 0, 0, 3981, 3982, 5, 101, 0, 0, 3982, 4040, 5, 46, 0, 0, 3983, 3984, 5, 116, 0, 0, 3984, 3985, 5, 97, 0, 0, 3985, 3986, 5, 105, 0, 0, 3986, 3987, 5, 108, 0, 0, 3987, 4040, 5, 46, 0, 0, 3988, 3989, 5, 99, 0, 0, 3989, 3990, 5, 112, 0, 0, 3990, 3991, 5, 98, 0, 0, 3991, 3992, 5, 108, 0, 0, 3992, 4040, 5, 107, 0, 0, 3993, 3994, 5, 105, 0, 0, 3994, 3995, 5, 110, 0, 0, 3995, 3996, 5, 105, 0, 0, 3996, 3997, 5, 116, 0, 0, 3997, 3998, 5, 98, 0, 0, 3998, 3999, 5, 108, 0, 0, 3999, 4040, 5, 107, 0, 0, 4000, 4001, 5, 114, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 116, 0, 0, 4003, 4004, 5, 104, 0, 0, 4004, 4005, 5, 114, 0, 0, 4005, 4006, 5, 111, 0, 0, 4006, 4040, 5, 119, 0, 0, 4007, 4008, 5, 114, 0, 0, 4008, 4009, 5, 101, 0, 0, 4009, 4010, 5, 102, 0, 0, 4010, 4011, 5, 97, 0, 0, 4011, 4012, 5, 110, 0, 0, 4012, 4013, 5, 121, 0, 0, 4013, 4014, 5, 116, 0, 0, 4014, 4015, 5, 121, 0, 0, 4015, 4016, 5, 112, 0, 0, 4016, 4040, 5, 101, 0, 0, 4017, 4018, 5, 114, 0, 0, 4018, 4019, 5, 101, 0, 0, 4019, 4020, 5, 97, 0, 0, 4020, 4021, 5, 100, 0, 0, 4021, 4022, 5, 111, 0, 0, 4022, 4023, 5, 110, 0, 0, 4023, 4024, 5, 108, 0, 0, 4024, 4025, 5, 121, 0, 0, 4025, 4040, 5, 46, 0, 0, 4026, 4027, 5, 105, 0, 0, 4027, 4028, 5, 108, 0, 0, 4028, 4029, 5, 108, 0, 0, 4029, 4030, 5, 101, 0, 0, 4030, 4031, 5, 103, 0, 0, 4031, 4032, 5, 97, 0, 0, 4032, 4040, 5, 108, 0, 0, 4033, 4034, 5, 101, 0, 0, 4034, 4035, 5, 110, 0, 0, 4035, 4036, 5, 100, 0, 0, 4036, 4037, 5, 109, 0, 0, 4037, 4038, 5, 97, 0, 0, 4038, 4040, 5, 99, 0, 0, 4039, 2851, 1, 0, 0, 0, 4039, 2854, 1, 0, 0, 0, 4039, 2860, 1, 0, 0, 0, 4039, 2865, 1, 0, 0, 0, 4039, 2872, 1, 0, 0, 0, 4039, 2879, 1, 0, 0, 0, 4039, 2886, 1, 0, 0, 0, 4039, 2893, 1, 0, 0, 0, 4039, 2900, 1, 0, 0, 0, 4039, 2907, 1, 0, 0, 0, 4039, 2914, 1, 0, 0, 0, 4039, 2921, 1, 0, 0, 0, 4039, 2928, 1, 0, 0, 0, 4039, 2935, 1, 0, 0, 0, 4039, 2942, 1, 0, 0, 0, 4039, 2949, 1, 0, 0, 0, 4039, 2955, 1, 0, 0, 0, 4039, 2964, 1, 0, 0, 0, 4039, 2973, 1, 0, 0, 0, 4039, 2981, 1, 0, 0, 0, 4039, 2989, 1, 0, 0, 0, 4039, 2997, 1, 0, 0, 0, 4039, 3005, 1, 0, 0, 0, 4039, 3013, 1, 0, 0, 0, 4039, 3021, 1, 0, 0, 0, 4039, 3029, 1, 0, 0, 0, 4039, 3037, 1, 0, 0, 0, 4039, 3045, 1, 0, 0, 0, 4039, 3048, 1, 0, 0, 0, 4039, 3051, 1, 0, 0, 0, 4039, 3054, 1, 0, 0, 0, 4039, 3062, 1, 0, 0, 0, 4039, 3070, 1, 0, 0, 0, 4039, 3078, 1, 0, 0, 0, 4039, 3086, 1, 0, 0, 0, 4039, 3094, 1, 0, 0, 0, 4039, 3102, 1, 0, 0, 0, 4039, 3110, 1, 0, 0, 0, 4039, 3118, 1, 0, 0, 0, 4039, 3125, 1, 0, 0, 0, 4039, 3133, 1, 0, 0, 0, 4039, 3141, 1, 0, 0, 0, 4039, 3150, 1, 0, 0, 0, 4039, 3159, 1, 0, 0, 0, 4039, 3167, 1, 0, 0, 0, 4039, 3175, 1, 0, 0, 0, 4039, 3183, 1, 0, 0, 0, 4039, 3191, 1, 0, 0, 0, 4039, 3199, 1, 0, 0, 0, 4039, 3207, 1, 0, 0, 0, 4039, 3210, 1, 0, 0, 0, 4039, 3213, 1, 0, 0, 0, 4039, 3216, 1, 0, 0, 0, 4039, 3219, 1, 0, 0, 0, 4039, 3225, 1, 0, 0, 0, 4039, 3228, 1, 0, 0, 0, 4039, 3234, 1, 0, 0, 0, 4039, 3237, 1, 0, 0, 0, 4039, 3239, 1, 0, 0, 0, 4039, 3242, 1, 0, 0, 0, 4039, 3245, 1, 0, 0, 0, 4039, 3248, 1, 0, 0, 0, 4039, 3254, 1, 0, 0, 0, 4039, 3257, 1, 0, 0, 0, 4039, 3260, 1, 0, 0, 0, 4039, 3267, 1, 0, 0, 0, 4039, 3274, 1, 0, 0, 0, 4039, 3281, 1, 0, 0, 0, 4039, 3288, 1, 0, 0, 0, 4039, 3295, 1, 0, 0, 0, 4039, 3302, 1, 0, 0, 0, 4039, 3309, 1, 0, 0, 0, 4039, 3316, 1, 0, 0, 0, 4039, 3325, 1, 0, 0, 0, 4039, 3330, 1, 0, 0, 0, 4039, 3344, 1, 0, 0, 0, 4039, 3358, 1, 0, 0, 0, 4039, 3372, 1, 0, 0, 0, 4039, 3386, 1, 0, 0, 0, 4039, 3400, 1, 0, 0, 0, 4039, 3414, 1, 0, 0, 0, 4039, 3428, 1, 0, 0, 0, 4039, 3442, 1, 0, 0, 0, 4039, 3455, 1, 0, 0, 0, 4039, 3468, 1, 0, 0, 0, 4039, 3473, 1, 0, 0, 0, 4039, 3482, 1, 0, 0, 0, 4039, 3491, 1, 0, 0, 0, 4039, 3500, 1, 0, 0, 0, 4039, 3509, 1, 0, 0, 0, 4039, 3518, 1, 0, 0, 0, 4039, 3527, 1, 0, 0, 0, 4039, 3536, 1, 0, 0, 0, 4039, 3545, 1, 0, 0, 0, 4039, 3553, 1, 0, 0, 0, 4039, 3562, 1, 0, 0, 0, 4039, 3571, 1, 0, 0, 0, 4039, 3581, 1, 0, 0, 0, 4039, 3589, 1, 0, 0, 0, 4039, 3598, 1, 0, 0, 0, 4039, 3607, 1, 0, 0, 0, 4039, 3616, 1, 0, 0, 0, 4039, 3625, 1, 0, 0, 0, 4039, 3634, 1, 0, 0, 0, 4039, 3643, 1, 0, 0, 0, 4039, 3653, 1, 0, 0, 0, 4039, 3664, 1, 0, 0, 0, 4039, 3675, 1, 0, 0, 0, 4039, 3686, 1, 0, 0, 0, 4039, 3697, 1, 0, 0, 0, 4039, 3708, 1, 0, 0, 0, 4039, 3719, 1, 0, 0, 0, 4039, 3730, 1, 0, 0, 0, 4039, 3741, 1, 0, 0, 0, 4039, 3749, 1, 0, 0, 0, 4039, 3756, 1, 0, 0, 0, 4039, 3763, 1, 0, 0, 0, 4039, 3769, 1, 0, 0, 0, 4039, 3779, 1, 0, 0, 0, 4039, 3789, 1, 0, 0, 0, 4039, 3796, 1, 0, 0, 0, 4039, 3806, 1, 0, 0, 0, 4039, 3813, 1, 0, 0, 0, 4039, 3823, 1, 0, 0, 0, 4039, 3830, 1, 0, 0, 0, 4039, 3840, 1, 0, 0, 0, 4039, 3850, 1, 0, 0, 0, 4039, 3858, 1, 0, 0, 0, 4039, 3865, 1, 0, 0, 0, 4039, 3871, 1, 0, 0, 0, 4039, 3878, 1, 0, 0, 0, 4039, 3885, 1, 0, 0, 0, 4039, 3892, 1, 0, 0, 0, 4039, 3899, 1, 0, 0, 0, 4039, 3906, 1, 0, 0, 0, 4039, 3913, 1, 0, 0, 0, 4039, 3920, 1, 0, 0, 0, 4039, 3929, 1, 0, 0, 0, 4039, 3936, 1, 0, 0, 0, 4039, 3939, 1, 0, 0, 0, 4039, 3942, 1, 0, 0, 0, 4039, 3948, 1, 0, 0, 0, 4039, 3951, 1, 0, 0, 0, 4039, 3957, 1, 0, 0, 0, 4039, 3965, 1, 0, 0, 0, 4039, 3974, 1, 0, 0, 0, 4039, 3983, 1, 0, 0, 0, 4039, 3988, 1, 0, 0, 0, 4039, 3993, 1, 0, 0, 0, 4039, 4000, 1, 0, 0, 0, 4039, 4007, 1, 0, 0, 0, 4039, 4017, 1, 0, 0, 0, 4039, 4026, 1, 0, 0, 0, 4039, 4033, 1, 0, 0, 0, 4040, 552, 1, 0, 0, 0, 4041, 4042, 5, 108, 0, 0, 4042, 4043, 5, 100, 0, 0, 4043, 4044, 5, 97, 0, 0, 4044, 4045, 5, 114, 0, 0, 4045, 4046, 5, 103, 0, 0, 4046, 4047, 5, 46, 0, 0, 4047, 4118, 5, 115, 0, 0, 4048, 4049, 5, 108, 0, 0, 4049, 4050, 5, 100, 0, 0, 4050, 4051, 5, 97, 0, 0, 4051, 4052, 5, 114, 0, 0, 4052, 4053, 5, 103, 0, 0, 4053, 4054, 5, 97, 0, 0, 4054, 4055, 5, 46, 0, 0, 4055, 4118, 5, 115, 0, 0, 4056, 4057, 5, 115, 0, 0, 4057, 4058, 5, 116, 0, 0, 4058, 4059, 5, 97, 0, 0, 4059, 4060, 5, 114, 0, 0, 4060, 4061, 5, 103, 0, 0, 4061, 4062, 5, 46, 0, 0, 4062, 4118, 5, 115, 0, 0, 4063, 4064, 5, 108, 0, 0, 4064, 4065, 5, 100, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 111, 0, 0, 4067, 4068, 5, 99, 0, 0, 4068, 4069, 5, 46, 0, 0, 4069, 4118, 5, 115, 0, 0, 4070, 4071, 5, 108, 0, 0, 4071, 4072, 5, 100, 0, 0, 4072, 4073, 5, 108, 0, 0, 4073, 4074, 5, 111, 0, 0, 4074, 4075, 5, 99, 0, 0, 4075, 4076, 5, 97, 0, 0, 4076, 4077, 5, 46, 0, 0, 4077, 4118, 5, 115, 0, 0, 4078, 4079, 5, 115, 0, 0, 4079, 4080, 5, 116, 0, 0, 4080, 4081, 5, 108, 0, 0, 4081, 4082, 5, 111, 0, 0, 4082, 4083, 5, 99, 0, 0, 4083, 4084, 5, 46, 0, 0, 4084, 4118, 5, 115, 0, 0, 4085, 4086, 5, 108, 0, 0, 4086, 4087, 5, 100, 0, 0, 4087, 4088, 5, 97, 0, 0, 4088, 4089, 5, 114, 0, 0, 4089, 4118, 5, 103, 0, 0, 4090, 4091, 5, 108, 0, 0, 4091, 4092, 5, 100, 0, 0, 4092, 4093, 5, 97, 0, 0, 4093, 4094, 5, 114, 0, 0, 4094, 4095, 5, 103, 0, 0, 4095, 4118, 5, 97, 0, 0, 4096, 4097, 5, 115, 0, 0, 4097, 4098, 5, 116, 0, 0, 4098, 4099, 5, 97, 0, 0, 4099, 4100, 5, 114, 0, 0, 4100, 4118, 5, 103, 0, 0, 4101, 4102, 5, 108, 0, 0, 4102, 4103, 5, 100, 0, 0, 4103, 4104, 5, 108, 0, 0, 4104, 4105, 5, 111, 0, 0, 4105, 4118, 5, 99, 0, 0, 4106, 4107, 5, 108, 0, 0, 4107, 4108, 5, 100, 0, 0, 4108, 4109, 5, 108, 0, 0, 4109, 4110, 5, 111, 0, 0, 4110, 4111, 5, 99, 0, 0, 4111, 4118, 5, 97, 0, 0, 4112, 4113, 5, 115, 0, 0, 4113, 4114, 5, 116, 0, 0, 4114, 4115, 5, 108, 0, 0, 4115, 4116, 5, 111, 0, 0, 4116, 4118, 5, 99, 0, 0, 4117, 4041, 1, 0, 0, 0, 4117, 4048, 1, 0, 0, 0, 4117, 4056, 1, 0, 0, 0, 4117, 4063, 1, 0, 0, 0, 4117, 4070, 1, 0, 0, 0, 4117, 4078, 1, 0, 0, 0, 4117, 4085, 1, 0, 0, 0, 4117, 4090, 1, 0, 0, 0, 4117, 4096, 1, 0, 0, 0, 4117, 4101, 1, 0, 0, 0, 4117, 4106, 1, 0, 0, 0, 4117, 4112, 1, 0, 0, 0, 4118, 554, 1, 0, 0, 0, 4119, 4120, 5, 108, 0, 0, 4120, 4121, 5, 100, 0, 0, 4121, 4122, 5, 99, 0, 0, 4122, 4123, 5, 46, 0, 0, 4123, 4124, 5, 105, 0, 0, 4124, 4125, 5, 52, 0, 0, 4125, 4126, 5, 46, 0, 0, 4126, 4147, 5, 115, 0, 0, 4127, 4128, 5, 108, 0, 0, 4128, 4129, 5, 100, 0, 0, 4129, 4130, 5, 99, 0, 0, 4130, 4131, 5, 46, 0, 0, 4131, 4132, 5, 105, 0, 0, 4132, 4147, 5, 52, 0, 0, 4133, 4134, 5, 117, 0, 0, 4134, 4135, 5, 110, 0, 0, 4135, 4136, 5, 97, 0, 0, 4136, 4137, 5, 108, 0, 0, 4137, 4138, 5, 105, 0, 0, 4138, 4139, 5, 103, 0, 0, 4139, 4140, 5, 110, 0, 0, 4140, 4141, 5, 101, 0, 0, 4141, 4142, 5, 100, 0, 0, 4142, 4147, 5, 46, 0, 0, 4143, 4144, 5, 110, 0, 0, 4144, 4145, 5, 111, 0, 0, 4145, 4147, 5, 46, 0, 0, 4146, 4119, 1, 0, 0, 0, 4146, 4127, 1, 0, 0, 0, 4146, 4133, 1, 0, 0, 0, 4146, 4143, 1, 0, 0, 0, 4147, 556, 1, 0, 0, 0, 4148, 4149, 5, 108, 0, 0, 4149, 4150, 5, 100, 0, 0, 4150, 4151, 5, 99, 0, 0, 4151, 4152, 5, 46, 0, 0, 4152, 4153, 5, 105, 0, 0, 4153, 4154, 5, 56, 0, 0, 4154, 558, 1, 0, 0, 0, 4155, 4156, 5, 108, 0, 0, 4156, 4157, 5, 100, 0, 0, 4157, 4158, 5, 99, 0, 0, 4158, 4159, 5, 46, 0, 0, 4159, 4160, 5, 114, 0, 0, 4160, 4168, 5, 52, 0, 0, 4161, 4162, 5, 108, 0, 0, 4162, 4163, 5, 100, 0, 0, 4163, 4164, 5, 99, 0, 0, 4164, 4165, 5, 46, 0, 0, 4165, 4166, 5, 114, 0, 0, 4166, 4168, 5, 56, 0, 0, 4167, 4155, 1, 0, 0, 0, 4167, 4161, 1, 0, 0, 0, 4168, 560, 1, 0, 0, 0, 4169, 4170, 5, 106, 0, 0, 4170, 4171, 5, 109, 0, 0, 4171, 4205, 5, 112, 0, 0, 4172, 4173, 5, 99, 0, 0, 4173, 4174, 5, 97, 0, 0, 4174, 4175, 5, 108, 0, 0, 4175, 4205, 5, 108, 0, 0, 4176, 4177, 5, 99, 0, 0, 4177, 4178, 5, 97, 0, 0, 4178, 4179, 5, 108, 0, 0, 4179, 4180, 5, 108, 0, 0, 4180, 4181, 5, 118, 0, 0, 4181, 4182, 5, 105, 0, 0, 4182, 4183, 5, 114, 0, 0, 4183, 4205, 5, 116, 0, 0, 4184, 4185, 5, 110, 0, 0, 4185, 4186, 5, 101, 0, 0, 4186, 4187, 5, 119, 0, 0, 4187, 4188, 5, 111, 0, 0, 4188, 4189, 5, 98, 0, 0, 4189, 4205, 5, 106, 0, 0, 4190, 4191, 5, 108, 0, 0, 4191, 4192, 5, 100, 0, 0, 4192, 4193, 5, 102, 0, 0, 4193, 4194, 5, 116, 0, 0, 4194, 4205, 5, 110, 0, 0, 4195, 4196, 5, 108, 0, 0, 4196, 4197, 5, 100, 0, 0, 4197, 4198, 5, 118, 0, 0, 4198, 4199, 5, 105, 0, 0, 4199, 4200, 5, 114, 0, 0, 4200, 4201, 5, 116, 0, 0, 4201, 4202, 5, 102, 0, 0, 4202, 4203, 5, 116, 0, 0, 4203, 4205, 5, 110, 0, 0, 4204, 4169, 1, 0, 0, 0, 4204, 4172, 1, 0, 0, 0, 4204, 4176, 1, 0, 0, 0, 4204, 4184, 1, 0, 0, 0, 4204, 4190, 1, 0, 0, 0, 4204, 4195, 1, 0, 0, 0, 4205, 562, 1, 0, 0, 0, 4206, 4207, 5, 99, 0, 0, 4207, 4208, 5, 97, 0, 0, 4208, 4209, 5, 108, 0, 0, 4209, 4210, 5, 108, 0, 0, 4210, 4211, 5, 105, 0, 0, 4211, 564, 1, 0, 0, 0, 4212, 4213, 5, 98, 0, 0, 4213, 4214, 5, 114, 0, 0, 4214, 4215, 5, 46, 0, 0, 4215, 4371, 5, 115, 0, 0, 4216, 4217, 5, 98, 0, 0, 4217, 4218, 5, 114, 0, 0, 4218, 4219, 5, 102, 0, 0, 4219, 4220, 5, 97, 0, 0, 4220, 4221, 5, 108, 0, 0, 4221, 4222, 5, 115, 0, 0, 4222, 4223, 5, 101, 0, 0, 4223, 4224, 5, 46, 0, 0, 4224, 4371, 5, 115, 0, 0, 4225, 4226, 5, 98, 0, 0, 4226, 4227, 5, 114, 0, 0, 4227, 4228, 5, 116, 0, 0, 4228, 4229, 5, 114, 0, 0, 4229, 4230, 5, 117, 0, 0, 4230, 4231, 5, 101, 0, 0, 4231, 4232, 5, 46, 0, 0, 4232, 4371, 5, 115, 0, 0, 4233, 4234, 5, 98, 0, 0, 4234, 4235, 5, 101, 0, 0, 4235, 4236, 5, 113, 0, 0, 4236, 4237, 5, 46, 0, 0, 4237, 4371, 5, 115, 0, 0, 4238, 4239, 5, 98, 0, 0, 4239, 4240, 5, 103, 0, 0, 4240, 4241, 5, 101, 0, 0, 4241, 4242, 5, 46, 0, 0, 4242, 4371, 5, 115, 0, 0, 4243, 4244, 5, 98, 0, 0, 4244, 4245, 5, 103, 0, 0, 4245, 4246, 5, 116, 0, 0, 4246, 4247, 5, 46, 0, 0, 4247, 4371, 5, 115, 0, 0, 4248, 4249, 5, 98, 0, 0, 4249, 4250, 5, 108, 0, 0, 4250, 4251, 5, 101, 0, 0, 4251, 4252, 5, 46, 0, 0, 4252, 4371, 5, 115, 0, 0, 4253, 4254, 5, 98, 0, 0, 4254, 4255, 5, 108, 0, 0, 4255, 4256, 5, 116, 0, 0, 4256, 4257, 5, 46, 0, 0, 4257, 4371, 5, 115, 0, 0, 4258, 4259, 5, 98, 0, 0, 4259, 4260, 5, 110, 0, 0, 4260, 4261, 5, 101, 0, 0, 4261, 4262, 5, 46, 0, 0, 4262, 4263, 5, 117, 0, 0, 4263, 4264, 5, 110, 0, 0, 4264, 4265, 5, 46, 0, 0, 4265, 4371, 5, 115, 0, 0, 4266, 4267, 5, 98, 0, 0, 4267, 4268, 5, 103, 0, 0, 4268, 4269, 5, 101, 0, 0, 4269, 4270, 5, 46, 0, 0, 4270, 4271, 5, 117, 0, 0, 4271, 4272, 5, 110, 0, 0, 4272, 4273, 5, 46, 0, 0, 4273, 4371, 5, 115, 0, 0, 4274, 4275, 5, 98, 0, 0, 4275, 4276, 5, 103, 0, 0, 4276, 4277, 5, 116, 0, 0, 4277, 4278, 5, 46, 0, 0, 4278, 4279, 5, 117, 0, 0, 4279, 4280, 5, 110, 0, 0, 4280, 4281, 5, 46, 0, 0, 4281, 4371, 5, 115, 0, 0, 4282, 4283, 5, 98, 0, 0, 4283, 4284, 5, 108, 0, 0, 4284, 4285, 5, 101, 0, 0, 4285, 4286, 5, 46, 0, 0, 4286, 4287, 5, 117, 0, 0, 4287, 4288, 5, 110, 0, 0, 4288, 4289, 5, 46, 0, 0, 4289, 4371, 5, 115, 0, 0, 4290, 4291, 5, 98, 0, 0, 4291, 4292, 5, 108, 0, 0, 4292, 4293, 5, 116, 0, 0, 4293, 4294, 5, 46, 0, 0, 4294, 4295, 5, 117, 0, 0, 4295, 4296, 5, 110, 0, 0, 4296, 4297, 5, 46, 0, 0, 4297, 4371, 5, 115, 0, 0, 4298, 4299, 5, 98, 0, 0, 4299, 4371, 5, 114, 0, 0, 4300, 4301, 5, 98, 0, 0, 4301, 4302, 5, 114, 0, 0, 4302, 4303, 5, 102, 0, 0, 4303, 4304, 5, 97, 0, 0, 4304, 4305, 5, 108, 0, 0, 4305, 4306, 5, 115, 0, 0, 4306, 4371, 5, 101, 0, 0, 4307, 4308, 5, 98, 0, 0, 4308, 4309, 5, 114, 0, 0, 4309, 4310, 5, 116, 0, 0, 4310, 4311, 5, 114, 0, 0, 4311, 4312, 5, 117, 0, 0, 4312, 4371, 5, 101, 0, 0, 4313, 4314, 5, 98, 0, 0, 4314, 4315, 5, 101, 0, 0, 4315, 4371, 5, 113, 0, 0, 4316, 4317, 5, 98, 0, 0, 4317, 4318, 5, 103, 0, 0, 4318, 4371, 5, 101, 0, 0, 4319, 4320, 5, 98, 0, 0, 4320, 4321, 5, 103, 0, 0, 4321, 4371, 5, 116, 0, 0, 4322, 4323, 5, 98, 0, 0, 4323, 4324, 5, 108, 0, 0, 4324, 4371, 5, 101, 0, 0, 4325, 4326, 5, 98, 0, 0, 4326, 4327, 5, 108, 0, 0, 4327, 4371, 5, 116, 0, 0, 4328, 4329, 5, 98, 0, 0, 4329, 4330, 5, 110, 0, 0, 4330, 4331, 5, 101, 0, 0, 4331, 4332, 5, 46, 0, 0, 4332, 4333, 5, 117, 0, 0, 4333, 4371, 5, 110, 0, 0, 4334, 4335, 5, 98, 0, 0, 4335, 4336, 5, 103, 0, 0, 4336, 4337, 5, 101, 0, 0, 4337, 4338, 5, 46, 0, 0, 4338, 4339, 5, 117, 0, 0, 4339, 4371, 5, 110, 0, 0, 4340, 4341, 5, 98, 0, 0, 4341, 4342, 5, 103, 0, 0, 4342, 4343, 5, 116, 0, 0, 4343, 4344, 5, 46, 0, 0, 4344, 4345, 5, 117, 0, 0, 4345, 4371, 5, 110, 0, 0, 4346, 4347, 5, 98, 0, 0, 4347, 4348, 5, 108, 0, 0, 4348, 4349, 5, 101, 0, 0, 4349, 4350, 5, 46, 0, 0, 4350, 4351, 5, 117, 0, 0, 4351, 4371, 5, 110, 0, 0, 4352, 4353, 5, 98, 0, 0, 4353, 4354, 5, 108, 0, 0, 4354, 4355, 5, 116, 0, 0, 4355, 4356, 5, 46, 0, 0, 4356, 4357, 5, 117, 0, 0, 4357, 4371, 5, 110, 0, 0, 4358, 4359, 5, 108, 0, 0, 4359, 4360, 5, 101, 0, 0, 4360, 4361, 5, 97, 0, 0, 4361, 4362, 5, 118, 0, 0, 4362, 4371, 5, 101, 0, 0, 4363, 4364, 5, 108, 0, 0, 4364, 4365, 5, 101, 0, 0, 4365, 4366, 5, 97, 0, 0, 4366, 4367, 5, 118, 0, 0, 4367, 4368, 5, 101, 0, 0, 4368, 4369, 5, 46, 0, 0, 4369, 4371, 5, 115, 0, 0, 4370, 4212, 1, 0, 0, 0, 4370, 4216, 1, 0, 0, 0, 4370, 4225, 1, 0, 0, 0, 4370, 4233, 1, 0, 0, 0, 4370, 4238, 1, 0, 0, 0, 4370, 4243, 1, 0, 0, 0, 4370, 4248, 1, 0, 0, 0, 4370, 4253, 1, 0, 0, 0, 4370, 4258, 1, 0, 0, 0, 4370, 4266, 1, 0, 0, 0, 4370, 4274, 1, 0, 0, 0, 4370, 4282, 1, 0, 0, 0, 4370, 4290, 1, 0, 0, 0, 4370, 4298, 1, 0, 0, 0, 4370, 4300, 1, 0, 0, 0, 4370, 4307, 1, 0, 0, 0, 4370, 4313, 1, 0, 0, 0, 4370, 4316, 1, 0, 0, 0, 4370, 4319, 1, 0, 0, 0, 4370, 4322, 1, 0, 0, 0, 4370, 4325, 1, 0, 0, 0, 4370, 4328, 1, 0, 0, 0, 4370, 4334, 1, 0, 0, 0, 4370, 4340, 1, 0, 0, 0, 4370, 4346, 1, 0, 0, 0, 4370, 4352, 1, 0, 0, 0, 4370, 4358, 1, 0, 0, 0, 4370, 4363, 1, 0, 0, 0, 4371, 566, 1, 0, 0, 0, 4372, 4373, 5, 115, 0, 0, 4373, 4374, 5, 119, 0, 0, 4374, 4375, 5, 105, 0, 0, 4375, 4376, 5, 116, 0, 0, 4376, 4377, 5, 99, 0, 0, 4377, 4378, 5, 104, 0, 0, 4378, 568, 1, 0, 0, 0, 4379, 4380, 5, 99, 0, 0, 4380, 4381, 5, 112, 0, 0, 4381, 4382, 5, 111, 0, 0, 4382, 4383, 5, 98, 0, 0, 4383, 4494, 5, 106, 0, 0, 4384, 4385, 5, 108, 0, 0, 4385, 4386, 5, 100, 0, 0, 4386, 4387, 5, 111, 0, 0, 4387, 4388, 5, 98, 0, 0, 4388, 4494, 5, 106, 0, 0, 4389, 4390, 5, 99, 0, 0, 4390, 4391, 5, 97, 0, 0, 4391, 4392, 5, 115, 0, 0, 4392, 4393, 5, 116, 0, 0, 4393, 4394, 5, 99, 0, 0, 4394, 4395, 5, 108, 0, 0, 4395, 4396, 5, 97, 0, 0, 4396, 4397, 5, 115, 0, 0, 4397, 4494, 5, 115, 0, 0, 4398, 4399, 5, 105, 0, 0, 4399, 4400, 5, 115, 0, 0, 4400, 4401, 5, 105, 0, 0, 4401, 4402, 5, 110, 0, 0, 4402, 4403, 5, 115, 0, 0, 4403, 4494, 5, 116, 0, 0, 4404, 4405, 5, 117, 0, 0, 4405, 4406, 5, 110, 0, 0, 4406, 4407, 5, 98, 0, 0, 4407, 4408, 5, 111, 0, 0, 4408, 4494, 5, 120, 0, 0, 4409, 4410, 5, 115, 0, 0, 4410, 4411, 5, 116, 0, 0, 4411, 4412, 5, 111, 0, 0, 4412, 4413, 5, 98, 0, 0, 4413, 4494, 5, 106, 0, 0, 4414, 4415, 5, 98, 0, 0, 4415, 4416, 5, 111, 0, 0, 4416, 4494, 5, 120, 0, 0, 4417, 4418, 5, 110, 0, 0, 4418, 4419, 5, 101, 0, 0, 4419, 4420, 5, 119, 0, 0, 4420, 4421, 5, 97, 0, 0, 4421, 4422, 5, 114, 0, 0, 4422, 4494, 5, 114, 0, 0, 4423, 4424, 5, 108, 0, 0, 4424, 4425, 5, 100, 0, 0, 4425, 4426, 5, 101, 0, 0, 4426, 4427, 5, 108, 0, 0, 4427, 4428, 5, 101, 0, 0, 4428, 4429, 5, 109, 0, 0, 4429, 4494, 5, 97, 0, 0, 4430, 4431, 5, 108, 0, 0, 4431, 4432, 5, 100, 0, 0, 4432, 4433, 5, 101, 0, 0, 4433, 4434, 5, 108, 0, 0, 4434, 4435, 5, 101, 0, 0, 4435, 4494, 5, 109, 0, 0, 4436, 4437, 5, 115, 0, 0, 4437, 4438, 5, 116, 0, 0, 4438, 4439, 5, 101, 0, 0, 4439, 4440, 5, 108, 0, 0, 4440, 4441, 5, 101, 0, 0, 4441, 4494, 5, 109, 0, 0, 4442, 4443, 5, 117, 0, 0, 4443, 4444, 5, 110, 0, 0, 4444, 4445, 5, 98, 0, 0, 4445, 4446, 5, 111, 0, 0, 4446, 4447, 5, 120, 0, 0, 4447, 4448, 5, 46, 0, 0, 4448, 4449, 5, 97, 0, 0, 4449, 4450, 5, 110, 0, 0, 4450, 4494, 5, 121, 0, 0, 4451, 4452, 5, 114, 0, 0, 4452, 4453, 5, 101, 0, 0, 4453, 4454, 5, 102, 0, 0, 4454, 4455, 5, 97, 0, 0, 4455, 4456, 5, 110, 0, 0, 4456, 4457, 5, 121, 0, 0, 4457, 4458, 5, 118, 0, 0, 4458, 4459, 5, 97, 0, 0, 4459, 4494, 5, 108, 0, 0, 4460, 4461, 5, 109, 0, 0, 4461, 4462, 5, 107, 0, 0, 4462, 4463, 5, 114, 0, 0, 4463, 4464, 5, 101, 0, 0, 4464, 4465, 5, 102, 0, 0, 4465, 4466, 5, 97, 0, 0, 4466, 4467, 5, 110, 0, 0, 4467, 4494, 5, 121, 0, 0, 4468, 4469, 5, 105, 0, 0, 4469, 4470, 5, 110, 0, 0, 4470, 4471, 5, 105, 0, 0, 4471, 4472, 5, 116, 0, 0, 4472, 4473, 5, 111, 0, 0, 4473, 4474, 5, 98, 0, 0, 4474, 4494, 5, 106, 0, 0, 4475, 4476, 5, 99, 0, 0, 4476, 4477, 5, 111, 0, 0, 4477, 4478, 5, 110, 0, 0, 4478, 4479, 5, 115, 0, 0, 4479, 4480, 5, 116, 0, 0, 4480, 4481, 5, 114, 0, 0, 4481, 4482, 5, 97, 0, 0, 4482, 4483, 5, 105, 0, 0, 4483, 4484, 5, 110, 0, 0, 4484, 4485, 5, 101, 0, 0, 4485, 4486, 5, 100, 0, 0, 4486, 4494, 5, 46, 0, 0, 4487, 4488, 5, 115, 0, 0, 4488, 4489, 5, 105, 0, 0, 4489, 4490, 5, 122, 0, 0, 4490, 4491, 5, 101, 0, 0, 4491, 4492, 5, 111, 0, 0, 4492, 4494, 5, 102, 0, 0, 4493, 4379, 1, 0, 0, 0, 4493, 4384, 1, 0, 0, 0, 4493, 4389, 1, 0, 0, 0, 4493, 4398, 1, 0, 0, 0, 4493, 4404, 1, 0, 0, 0, 4493, 4409, 1, 0, 0, 0, 4493, 4414, 1, 0, 0, 0, 4493, 4417, 1, 0, 0, 0, 4493, 4423, 1, 0, 0, 0, 4493, 4430, 1, 0, 0, 0, 4493, 4436, 1, 0, 0, 0, 4493, 4442, 1, 0, 0, 0, 4493, 4451, 1, 0, 0, 0, 4493, 4460, 1, 0, 0, 0, 4493, 4468, 1, 0, 0, 0, 4493, 4475, 1, 0, 0, 0, 4493, 4487, 1, 0, 0, 0, 4494, 570, 1, 0, 0, 0, 4495, 4496, 5, 108, 0, 0, 4496, 4497, 5, 100, 0, 0, 4497, 4498, 5, 115, 0, 0, 4498, 4499, 5, 116, 0, 0, 4499, 4500, 5, 114, 0, 0, 4500, 572, 1, 0, 0, 0, 4501, 4502, 5, 108, 0, 0, 4502, 4503, 5, 100, 0, 0, 4503, 4504, 5, 102, 0, 0, 4504, 4505, 5, 108, 0, 0, 4505, 4537, 5, 100, 0, 0, 4506, 4507, 5, 108, 0, 0, 4507, 4508, 5, 100, 0, 0, 4508, 4509, 5, 102, 0, 0, 4509, 4510, 5, 108, 0, 0, 4510, 4511, 5, 100, 0, 0, 4511, 4537, 5, 97, 0, 0, 4512, 4513, 5, 115, 0, 0, 4513, 4514, 5, 116, 0, 0, 4514, 4515, 5, 102, 0, 0, 4515, 4516, 5, 108, 0, 0, 4516, 4537, 5, 100, 0, 0, 4517, 4518, 5, 108, 0, 0, 4518, 4519, 5, 100, 0, 0, 4519, 4520, 5, 115, 0, 0, 4520, 4521, 5, 102, 0, 0, 4521, 4522, 5, 108, 0, 0, 4522, 4537, 5, 100, 0, 0, 4523, 4524, 5, 108, 0, 0, 4524, 4525, 5, 100, 0, 0, 4525, 4526, 5, 115, 0, 0, 4526, 4527, 5, 102, 0, 0, 4527, 4528, 5, 108, 0, 0, 4528, 4529, 5, 100, 0, 0, 4529, 4537, 5, 97, 0, 0, 4530, 4531, 5, 115, 0, 0, 4531, 4532, 5, 116, 0, 0, 4532, 4533, 5, 115, 0, 0, 4533, 4534, 5, 102, 0, 0, 4534, 4535, 5, 108, 0, 0, 4535, 4537, 5, 100, 0, 0, 4536, 4501, 1, 0, 0, 0, 4536, 4506, 1, 0, 0, 0, 4536, 4512, 1, 0, 0, 0, 4536, 4517, 1, 0, 0, 0, 4536, 4523, 1, 0, 0, 0, 4536, 4530, 1, 0, 0, 0, 4537, 574, 1, 0, 0, 0, 4538, 4539, 5, 108, 0, 0, 4539, 4540, 5, 100, 0, 0, 4540, 4541, 5, 116, 0, 0, 4541, 4542, 5, 111, 0, 0, 4542, 4543, 5, 107, 0, 0, 4543, 4544, 5, 101, 0, 0, 4544, 4545, 5, 110, 0, 0, 4545, 576, 1, 0, 0, 0, 4546, 4547, 7, 8, 0, 0, 4547, 578, 1, 0, 0, 0, 4548, 4549, 7, 9, 0, 0, 4549, 580, 1, 0, 0, 0, 4550, 4551, 3, 583, 291, 0, 4551, 4552, 3, 531, 265, 0, 4552, 4554, 1, 0, 0, 0, 4553, 4550, 1, 0, 0, 0, 4554, 4555, 1, 0, 0, 0, 4555, 4553, 1, 0, 0, 0, 4555, 4556, 1, 0, 0, 0, 4556, 4557, 1, 0, 0, 0, 4557, 4558, 3, 583, 291, 0, 4558, 582, 1, 0, 0, 0, 4559, 4563, 3, 577, 288, 0, 4560, 4562, 3, 579, 289, 0, 4561, 4560, 1, 0, 0, 0, 4562, 4565, 1, 0, 0, 0, 4563, 4561, 1, 0, 0, 0, 4563, 4564, 1, 0, 0, 0, 4564, 584, 1, 0, 0, 0, 4565, 4563, 1, 0, 0, 0, 4566, 4567, 7, 0, 0, 0, 4567, 4568, 7, 0, 0, 0, 4568, 586, 1, 0, 0, 0, 4569, 4570, 7, 10, 0, 0, 4570, 4571, 1, 0, 0, 0, 4571, 4572, 6, 293, 0, 0, 4572, 588, 1, 0, 0, 0, 4573, 4574, 5, 47, 0, 0, 4574, 4575, 5, 47, 0, 0, 4575, 4579, 1, 0, 0, 0, 4576, 4578, 8, 11, 0, 0, 4577, 4576, 1, 0, 0, 0, 4578, 4581, 1, 0, 0, 0, 4579, 4577, 1, 0, 0, 0, 4579, 4580, 1, 0, 0, 0, 4580, 4582, 1, 0, 0, 0, 4581, 4579, 1, 0, 0, 0, 4582, 4583, 6, 294, 0, 0, 4583, 590, 1, 0, 0, 0, 4584, 4585, 5, 47, 0, 0, 4585, 4586, 5, 42, 0, 0, 4586, 4590, 1, 0, 0, 0, 4587, 4589, 9, 0, 0, 0, 4588, 4587, 1, 0, 0, 0, 4589, 4592, 1, 0, 0, 0, 4590, 4591, 1, 0, 0, 0, 4590, 4588, 1, 0, 0, 0, 4591, 4593, 1, 0, 0, 0, 4592, 4590, 1, 0, 0, 0, 4593, 4594, 5, 42, 0, 0, 4594, 4595, 5, 47, 0, 0, 4595, 4596, 1, 0, 0, 0, 4596, 4597, 6, 295, 0, 0, 4597, 592, 1, 0, 0, 0, 4598, 4599, 5, 46, 0, 0, 4599, 4600, 5, 112, 0, 0, 4600, 4601, 5, 101, 0, 0, 4601, 4602, 5, 114, 0, 0, 4602, 4603, 5, 109, 0, 0, 4603, 4604, 5, 105, 0, 0, 4604, 4605, 5, 115, 0, 0, 4605, 4606, 5, 115, 0, 0, 4606, 4607, 5, 105, 0, 0, 4607, 4608, 5, 111, 0, 0, 4608, 4609, 5, 110, 0, 0, 4609, 594, 1, 0, 0, 0, 4610, 4611, 5, 46, 0, 0, 4611, 4612, 5, 112, 0, 0, 4612, 4613, 5, 101, 0, 0, 4613, 4614, 5, 114, 0, 0, 4614, 4615, 5, 109, 0, 0, 4615, 4616, 5, 105, 0, 0, 4616, 4617, 5, 115, 0, 0, 4617, 4618, 5, 115, 0, 0, 4618, 4619, 5, 105, 0, 0, 4619, 4620, 5, 111, 0, 0, 4620, 4621, 5, 110, 0, 0, 4621, 4622, 5, 115, 0, 0, 4622, 4623, 5, 101, 0, 0, 4623, 4624, 5, 116, 0, 0, 4624, 596, 1, 0, 0, 0, 4625, 4626, 5, 46, 0, 0, 4626, 4627, 5, 101, 0, 0, 4627, 4628, 5, 109, 0, 0, 4628, 4629, 5, 105, 0, 0, 4629, 4630, 5, 116, 0, 0, 4630, 4631, 5, 98, 0, 0, 4631, 4632, 5, 121, 0, 0, 4632, 4633, 5, 116, 0, 0, 4633, 4634, 5, 101, 0, 0, 4634, 598, 1, 0, 0, 0, 4635, 4636, 5, 46, 0, 0, 4636, 4637, 5, 109, 0, 0, 4637, 4638, 5, 97, 0, 0, 4638, 4639, 5, 120, 0, 0, 4639, 4640, 5, 115, 0, 0, 4640, 4641, 5, 116, 0, 0, 4641, 4642, 5, 97, 0, 0, 4642, 4643, 5, 99, 0, 0, 4643, 4644, 5, 107, 0, 0, 4644, 600, 1, 0, 0, 0, 4645, 4646, 5, 46, 0, 0, 4646, 4647, 5, 101, 0, 0, 4647, 4648, 5, 110, 0, 0, 4648, 4649, 5, 116, 0, 0, 4649, 4650, 5, 114, 0, 0, 4650, 4651, 5, 121, 0, 0, 4651, 4652, 5, 112, 0, 0, 4652, 4653, 5, 111, 0, 0, 4653, 4654, 5, 105, 0, 0, 4654, 4655, 5, 110, 0, 0, 4655, 4656, 5, 116, 0, 0, 4656, 602, 1, 0, 0, 0, 4657, 4658, 5, 46, 0, 0, 4658, 4659, 5, 122, 0, 0, 4659, 4660, 5, 101, 0, 0, 4660, 4661, 5, 114, 0, 0, 4661, 4662, 5, 111, 0, 0, 4662, 4663, 5, 105, 0, 0, 4663, 4664, 5, 110, 0, 0, 4664, 4665, 5, 105, 0, 0, 4665, 4666, 5, 116, 0, 0, 4666, 604, 1, 0, 0, 0, 4667, 4668, 5, 46, 0, 0, 4668, 4669, 5, 108, 0, 0, 4669, 4670, 5, 111, 0, 0, 4670, 4671, 5, 99, 0, 0, 4671, 4672, 5, 97, 0, 0, 4672, 4673, 5, 108, 0, 0, 4673, 4674, 5, 115, 0, 0, 4674, 606, 1, 0, 0, 0, 4675, 4676, 5, 46, 0, 0, 4676, 4677, 5, 101, 0, 0, 4677, 4678, 5, 120, 0, 0, 4678, 4679, 5, 112, 0, 0, 4679, 4680, 5, 111, 0, 0, 4680, 4681, 5, 114, 0, 0, 4681, 4682, 5, 116, 0, 0, 4682, 608, 1, 0, 0, 0, 4683, 4684, 5, 46, 0, 0, 4684, 4685, 5, 111, 0, 0, 4685, 4686, 5, 118, 0, 0, 4686, 4687, 5, 101, 0, 0, 4687, 4688, 5, 114, 0, 0, 4688, 4689, 5, 114, 0, 0, 4689, 4690, 5, 105, 0, 0, 4690, 4691, 5, 100, 0, 0, 4691, 4692, 5, 101, 0, 0, 4692, 610, 1, 0, 0, 0, 4693, 4694, 5, 46, 0, 0, 4694, 4695, 5, 118, 0, 0, 4695, 4696, 5, 116, 0, 0, 4696, 4697, 5, 101, 0, 0, 4697, 4698, 5, 110, 0, 0, 4698, 4699, 5, 116, 0, 0, 4699, 4700, 5, 114, 0, 0, 4700, 4701, 5, 121, 0, 0, 4701, 612, 1, 0, 0, 0, 45, 0, 2024, 2032, 2037, 2039, 2042, 2050, 2055, 2057, 2060, 2065, 2071, 2075, 2080, 2082, 2086, 2091, 2093, 2099, 2103, 2108, 2110, 2112, 2149, 2702, 2753, 2756, 2759, 2762, 2767, 2769, 2777, 2779, 4039, 4117, 4146, 4167, 4204, 4370, 4493, 4536, 4555, 4563, 4579, 4590, 1, 6, 0, 0]
\ No newline at end of file
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens
index 30f6003a7e601b..1a9debd1c99eb1 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILLexer.tokens
@@ -315,118 +315,118 @@ VTENTRY=302
'aggressiveoptimization'=13
'async'=14
'extended'=15
-'{'=16
-'}'=17
-'.subsystem'=18
-'.corflags'=19
-'.file'=20
-'alignment'=21
-'.imagebase'=22
-'.stackreserve'=23
-'.assembly'=24
-'.mscorlib'=25
-'.language'=26
-','=27
-'.typelist'=28
-'('=29
-')'=30
-';'=31
-'.typedef'=32
-'as'=33
-'.custom'=34
-'='=35
-'field'=36
-'property'=37
-'class'=38
-'extern'=39
-'.vtfixup'=40
-'['=41
-']'=42
-'at'=43
-'fromunmanaged'=44
-'callmostderived'=45
-'retainappdomain'=46
-'.vtable'=47
-'.namespace'=48
-'.class'=49
-'public'=50
-'private'=51
-'sealed'=52
-'abstract'=53
-'auto'=54
-'sequential'=55
-'unicode'=56
-'autochar'=57
-'import'=58
-'serializable'=59
-'windowsruntime'=60
-'nested'=61
-'family'=62
-'assembly'=63
-'famandassem'=64
-'famorassem'=65
-'beforefieldinit'=66
-'specialname'=67
-'rtspecialname'=68
-'flags'=69
-'extends'=70
-'implements'=71
-'.line'=72
-'#line'=73
-':'=74
-'nometadata'=75
-'retargetable'=76
-'noplatform'=77
-'legacy library'=78
-'x86'=79
-'amd64'=80
-'arm'=81
-'arm64'=82
-'bytearray'=83
-'()'=84
-'<'=85
-'>'=86
-'/'=87
-'algorithm'=88
-'iidparam'=89
-'pinned'=90
-'modreq'=91
-'modopt'=92
-'unsigned'=93
-'true'=94
-'false'=95
-'request'=96
-'demand'=97
-'assert'=98
-'deny'=99
-'permitonly'=100
-'linkcheck'=101
-'inheritcheck'=102
-'reqmin'=103
-'reqopt'=104
-'reqrefuse'=105
-'prejitgrant'=106
-'prejitdeny'=107
-'noncasdemand'=108
-'noncaslinkdemand'=109
-'noncasinheritance'=110
-'callconv'=111
-'mdtoken'=112
-'-'=113
-'byreflike'=114
-'.ctor'=115
-'.size'=116
-'.pack'=117
-'with'=118
-'.interfaceimpl'=119
-'.field'=120
-'marshal'=121
-'static'=122
-'initonly'=123
-'privatescope'=124
-'literal'=125
-'notserialized'=126
-'volatile'=127
+'volatile'=16
+'{'=17
+'}'=18
+'.subsystem'=19
+'.corflags'=20
+'.file'=21
+'alignment'=22
+'.imagebase'=23
+'.stackreserve'=24
+'.assembly'=25
+'.mscorlib'=26
+'.language'=27
+','=28
+'.typelist'=29
+'('=30
+')'=31
+';'=32
+'.typedef'=33
+'as'=34
+'.custom'=35
+'='=36
+'field'=37
+'property'=38
+'class'=39
+'extern'=40
+'.vtfixup'=41
+'['=42
+']'=43
+'at'=44
+'fromunmanaged'=45
+'callmostderived'=46
+'retainappdomain'=47
+'.vtable'=48
+'.namespace'=49
+'.class'=50
+'public'=51
+'private'=52
+'sealed'=53
+'abstract'=54
+'auto'=55
+'sequential'=56
+'unicode'=57
+'autochar'=58
+'import'=59
+'serializable'=60
+'windowsruntime'=61
+'nested'=62
+'family'=63
+'assembly'=64
+'famandassem'=65
+'famorassem'=66
+'beforefieldinit'=67
+'specialname'=68
+'rtspecialname'=69
+'flags'=70
+'extends'=71
+'implements'=72
+'.line'=73
+'#line'=74
+':'=75
+'nometadata'=76
+'retargetable'=77
+'noplatform'=78
+'legacy library'=79
+'x86'=80
+'amd64'=81
+'arm'=82
+'arm64'=83
+'bytearray'=84
+'()'=85
+'<'=86
+'>'=87
+'/'=88
+'algorithm'=89
+'unsigned'=90
+'iidparam'=91
+'pinned'=92
+'modreq'=93
+'modopt'=94
+'true'=95
+'false'=96
+'request'=97
+'demand'=98
+'assert'=99
+'deny'=100
+'permitonly'=101
+'linkcheck'=102
+'inheritcheck'=103
+'reqmin'=104
+'reqopt'=105
+'reqrefuse'=106
+'prejitgrant'=107
+'prejitdeny'=108
+'noncasdemand'=109
+'noncaslinkdemand'=110
+'noncasinheritance'=111
+'callconv'=112
+'mdtoken'=113
+'-'=114
+'byreflike'=115
+'.ctor'=116
+'.size'=117
+'.pack'=118
+'with'=119
+'.interfaceimpl'=120
+'.field'=121
+'marshal'=122
+'static'=123
+'initonly'=124
+'privatescope'=125
+'literal'=126
+'notserialized'=127
'.event'=128
'.addon'=129
'.removeon'=130
@@ -466,7 +466,7 @@ VTENTRY=302
'handler'=164
'.data'=165
'tls'=166
-'.publicKey'=167
+'.publickey'=167
'.ver'=168
'.locale'=169
'.publickeytoken'=170
@@ -499,7 +499,7 @@ VTENTRY=302
'enum'=201
'custom'=202
'fixed'=203
-'systring'=204
+'sysstring'=204
'array'=205
'variant'=206
'currency'=207
diff --git a/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs b/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs
index 42f16fafdfc2a6..161163a56f1c43 100644
--- a/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs
+++ b/src/tools/ilasm/src/ILAssembler/gen/CILParser.cs
@@ -37,232 +37,232 @@ public partial class CILParser : Parser {
protected static DFA[] decisionToDFA;
protected static PredictionContextCache sharedContextCache = new PredictionContextCache();
public const int
- T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
- T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
- T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
- T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
- T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
- T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
- T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
- T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
- T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
- T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
- T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
- T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
- T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
- T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
- T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107,
- T__107=108, T__108=109, T__109=110, T__110=111, T__111=112, T__112=113,
- T__113=114, T__114=115, T__115=116, T__116=117, T__117=118, T__118=119,
- T__119=120, T__120=121, T__121=122, T__122=123, T__123=124, T__124=125,
- T__125=126, T__126=127, T__127=128, T__128=129, T__129=130, T__130=131,
- T__131=132, T__132=133, T__133=134, T__134=135, T__135=136, T__136=137,
- T__137=138, T__138=139, T__139=140, T__140=141, T__141=142, T__142=143,
- T__143=144, T__144=145, T__145=146, T__146=147, T__147=148, T__148=149,
- T__149=150, T__150=151, T__151=152, T__152=153, T__153=154, T__154=155,
- T__155=156, T__156=157, T__157=158, T__158=159, T__159=160, T__160=161,
- T__161=162, T__162=163, T__163=164, T__164=165, T__165=166, T__166=167,
- T__167=168, T__168=169, T__169=170, T__170=171, INT32=172, INT64=173,
- FLOAT64=174, DCOLON=175, ELLIPSIS=176, NULL=177, NULLREF=178, HASH=179,
- CHAR=180, STRING=181, BOOL=182, INT8=183, INT16=184, INT32_=185, INT64_=186,
- FLOAT32=187, FLOAT64_=188, UINT8=189, UINT16=190, UINT32=191, UINT64=192,
- INT=193, UINT=194, TYPE=195, OBJECT=196, MODULE=197, VALUE=198, VALUETYPE=199,
- VOID=200, ENUM=201, CUSTOM=202, FIXED=203, SYSSTRING=204, ARRAY=205, VARIANT=206,
- CURRENCY=207, SYSCHAR=208, ERROR=209, DECIMAL=210, DATE=211, BSTR=212,
- LPSTR=213, LPWSTR=214, LPTSTR=215, OBJECTREF=216, IUNKNOWN=217, IDISPATCH=218,
- STRUCT=219, INTERFACE=220, SAFEARRAY=221, BYVALSTR=222, ANSI=223, TBSTR=224,
- METHOD=225, ANY=226, LPSTRUCT=227, VECTOR=228, HRESULT=229, CARRAY=230,
- USERDEFINED=231, RECORD=232, FILETIME=233, BLOB=234, STREAM=235, STORAGE=236,
- STREAMED_OBJECT=237, STORED_OBJECT=238, BLOB_OBJECT=239, CF=240, CLSID=241,
- INSTANCE=242, EXPLICIT=243, DEFAULT=244, VARARG=245, UNMANAGED=246, CDECL=247,
- STDCALL=248, THISCALL=249, FASTCALL=250, TYPE_PARAMETER=251, METHOD_TYPE_PARAMETER=252,
- TYPEDREF=253, PARAM=254, CONSTRAINT=255, THIS=256, BASE=257, NESTER=258,
- REF=259, ARRAY_TYPE_NO_BOUNDS=260, PTR=261, QSTRING=262, SQSTRING=263,
- DOT=264, PLUS=265, PP_DEFINE=266, PP_UNDEF=267, PP_IFDEF=268, PP_IFNDEF=269,
- PP_ELSE=270, PP_ENDIF=271, PP_INCLUDE=272, MRESOURCE=273, INSTR_NONE=274,
- INSTR_VAR=275, INSTR_I=276, INSTR_I8=277, INSTR_R=278, INSTR_METHOD=279,
- INSTR_SIG=280, INSTR_BRTARGET=281, INSTR_SWITCH=282, INSTR_TYPE=283, INSTR_STRING=284,
- INSTR_FIELD=285, INSTR_TOK=286, DOTTEDNAME=287, ID=288, HEXBYTE=289, WS=290,
- SINGLE_LINE_COMMENT=291, COMMENT=292, PERMISSION=293, PERMISSIONSET=294,
- EMITBYTE=295, MAXSTACK=296, ENTRYPOINT=297, ZEROINIT=298, LOCALS=299,
+ T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
+ T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
+ T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
+ T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
+ T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
+ T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
+ T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
+ T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
+ T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
+ T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
+ T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
+ T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
+ T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
+ T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
+ T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107,
+ T__107=108, T__108=109, T__109=110, T__110=111, T__111=112, T__112=113,
+ T__113=114, T__114=115, T__115=116, T__116=117, T__117=118, T__118=119,
+ T__119=120, T__120=121, T__121=122, T__122=123, T__123=124, T__124=125,
+ T__125=126, T__126=127, T__127=128, T__128=129, T__129=130, T__130=131,
+ T__131=132, T__132=133, T__133=134, T__134=135, T__135=136, T__136=137,
+ T__137=138, T__138=139, T__139=140, T__140=141, T__141=142, T__142=143,
+ T__143=144, T__144=145, T__145=146, T__146=147, T__147=148, T__148=149,
+ T__149=150, T__150=151, T__151=152, T__152=153, T__153=154, T__154=155,
+ T__155=156, T__156=157, T__157=158, T__158=159, T__159=160, T__160=161,
+ T__161=162, T__162=163, T__163=164, T__164=165, T__165=166, T__166=167,
+ T__167=168, T__168=169, T__169=170, T__170=171, INT32=172, INT64=173,
+ FLOAT64=174, DCOLON=175, ELLIPSIS=176, NULL=177, NULLREF=178, HASH=179,
+ CHAR=180, STRING=181, BOOL=182, INT8=183, INT16=184, INT32_=185, INT64_=186,
+ FLOAT32=187, FLOAT64_=188, UINT8=189, UINT16=190, UINT32=191, UINT64=192,
+ INT=193, UINT=194, TYPE=195, OBJECT=196, MODULE=197, VALUE=198, VALUETYPE=199,
+ VOID=200, ENUM=201, CUSTOM=202, FIXED=203, SYSSTRING=204, ARRAY=205, VARIANT=206,
+ CURRENCY=207, SYSCHAR=208, ERROR=209, DECIMAL=210, DATE=211, BSTR=212,
+ LPSTR=213, LPWSTR=214, LPTSTR=215, OBJECTREF=216, IUNKNOWN=217, IDISPATCH=218,
+ STRUCT=219, INTERFACE=220, SAFEARRAY=221, BYVALSTR=222, ANSI=223, TBSTR=224,
+ METHOD=225, ANY=226, LPSTRUCT=227, VECTOR=228, HRESULT=229, CARRAY=230,
+ USERDEFINED=231, RECORD=232, FILETIME=233, BLOB=234, STREAM=235, STORAGE=236,
+ STREAMED_OBJECT=237, STORED_OBJECT=238, BLOB_OBJECT=239, CF=240, CLSID=241,
+ INSTANCE=242, EXPLICIT=243, DEFAULT=244, VARARG=245, UNMANAGED=246, CDECL=247,
+ STDCALL=248, THISCALL=249, FASTCALL=250, TYPE_PARAMETER=251, METHOD_TYPE_PARAMETER=252,
+ TYPEDREF=253, PARAM=254, CONSTRAINT=255, THIS=256, BASE=257, NESTER=258,
+ REF=259, ARRAY_TYPE_NO_BOUNDS=260, PTR=261, QSTRING=262, SQSTRING=263,
+ DOT=264, PLUS=265, PP_DEFINE=266, PP_UNDEF=267, PP_IFDEF=268, PP_IFNDEF=269,
+ PP_ELSE=270, PP_ENDIF=271, PP_INCLUDE=272, MRESOURCE=273, INSTR_NONE=274,
+ INSTR_VAR=275, INSTR_I=276, INSTR_I8=277, INSTR_R=278, INSTR_METHOD=279,
+ INSTR_SIG=280, INSTR_BRTARGET=281, INSTR_SWITCH=282, INSTR_TYPE=283, INSTR_STRING=284,
+ INSTR_FIELD=285, INSTR_TOK=286, DOTTEDNAME=287, ID=288, HEXBYTE=289, WS=290,
+ SINGLE_LINE_COMMENT=291, COMMENT=292, PERMISSION=293, PERMISSIONSET=294,
+ EMITBYTE=295, MAXSTACK=296, ENTRYPOINT=297, ZEROINIT=298, LOCALS=299,
EXPORT=300, OVERRIDE=301, VTENTRY=302, IncludedFileEof=303, SyntheticIncludedFileEof=304;
public const int
- RULE_id = 0, RULE_dottedName = 1, RULE_dottedNamePart = 2, RULE_compQstring = 3,
- RULE_decls = 4, RULE_decl = 5, RULE_subsystem = 6, RULE_corflags = 7,
- RULE_alignment = 8, RULE_imagebase = 9, RULE_stackreserve = 10, RULE_assemblyBlock = 11,
- RULE_mscorlib = 12, RULE_languageDecl = 13, RULE_languageString = 14,
- RULE_typelist = 15, RULE_int32 = 16, RULE_int64 = 17, RULE_float64 = 18,
- RULE_intOrWildcard = 19, RULE_compControl = 20, RULE_typedefDecl = 21,
- RULE_customDescr = 22, RULE_customDescrWithOwner = 23, RULE_customType = 24,
- RULE_ownerType = 25, RULE_customBlobDescr = 26, RULE_customBlobArgs = 27,
- RULE_customBlobNVPairs = 28, RULE_fieldOrProp = 29, RULE_serializType = 30,
- RULE_serializTypeElement = 31, RULE_moduleHead = 32, RULE_vtfixupDecl = 33,
- RULE_vtfixupAttr = 34, RULE_vtableDecl = 35, RULE_nameSpaceHead = 36,
- RULE_classHead = 37, RULE_classAttr = 38, RULE_extendsClause = 39, RULE_implClause = 40,
- RULE_classDecls = 41, RULE_implList = 42, RULE_esHead = 43, RULE_extSourceSpec = 44,
- RULE_fileDecl = 45, RULE_fileAttr = 46, RULE_fileEntry = 47, RULE_asmAttrAny = 48,
- RULE_asmAttr = 49, RULE_instr_none = 50, RULE_instr_var = 51, RULE_instr_i = 52,
- RULE_instr_i8 = 53, RULE_instr_r = 54, RULE_instr_brtarget = 55, RULE_instr_method = 56,
- RULE_instr_field = 57, RULE_instr_type = 58, RULE_instr_string = 59, RULE_instr_sig = 60,
- RULE_instr_tok = 61, RULE_instr_switch = 62, RULE_instr = 63, RULE_labels = 64,
- RULE_typeArgs = 65, RULE_bounds = 66, RULE_sigArgs = 67, RULE_sigArg = 68,
- RULE_className = 69, RULE_slashedName = 70, RULE_assemblyDecls = 71, RULE_assemblyDecl = 72,
- RULE_typeSpec = 73, RULE_nativeType = 74, RULE_nativeTypeArrayPointerInfo = 75,
- RULE_nativeTypeElement = 76, RULE_iidParamIndex = 77, RULE_variantType = 78,
- RULE_variantTypeElement = 79, RULE_type = 80, RULE_typeModifiers = 81,
- RULE_elementType = 82, RULE_simpleType = 83, RULE_bound = 84, RULE_nativeInt = 85,
- RULE_nativeUint = 86, RULE_secDecl = 87, RULE_secAttrSetBlob = 88, RULE_secAttrBlob = 89,
- RULE_nameValPairs = 90, RULE_nameValPair = 91, RULE_truefalse = 92, RULE_caValue = 93,
- RULE_secAction = 94, RULE_methodRef = 95, RULE_callConv = 96, RULE_callKind = 97,
- RULE_mdtoken = 98, RULE_memberRef = 99, RULE_fieldRef = 100, RULE_typeList = 101,
- RULE_typarsClause = 102, RULE_typarAttrib = 103, RULE_typarAttribs = 104,
- RULE_typar = 105, RULE_typars = 106, RULE_tyBound = 107, RULE_genArity = 108,
- RULE_genArityNotEmpty = 109, RULE_classDecl = 110, RULE_fieldDecl = 111,
- RULE_fieldAttr = 112, RULE_atOpt = 113, RULE_initOpt = 114, RULE_repeatOpt = 115,
- RULE_eventHead = 116, RULE_eventAttr = 117, RULE_eventDecls = 118, RULE_eventDecl = 119,
- RULE_propHead = 120, RULE_propAttr = 121, RULE_propDecls = 122, RULE_propDecl = 123,
- RULE_marshalClause = 124, RULE_marshalBlob = 125, RULE_paramAttr = 126,
- RULE_paramAttrElement = 127, RULE_methodHead = 128, RULE_methAttr = 129,
- RULE_pinvImpl = 130, RULE_pinvAttr = 131, RULE_methodName = 132, RULE_implAttr = 133,
- RULE_methodDecls = 134, RULE_methodDecl = 135, RULE_labelDecl = 136, RULE_customDescrInMethodBody = 137,
- RULE_scopeBlock = 138, RULE_sehBlock = 139, RULE_sehClauses = 140, RULE_tryBlock = 141,
- RULE_sehClause = 142, RULE_filterClause = 143, RULE_catchClause = 144,
- RULE_finallyClause = 145, RULE_faultClause = 146, RULE_handlerBlock = 147,
- RULE_dataDecl = 148, RULE_ddHead = 149, RULE_tls = 150, RULE_ddBody = 151,
- RULE_ddItemList = 152, RULE_ddItemCount = 153, RULE_ddItem = 154, RULE_fieldSerInit = 155,
- RULE_bytes = 156, RULE_hexbyte = 157, RULE_fieldInit = 158, RULE_serInit = 159,
- RULE_f32seq = 160, RULE_f64seq = 161, RULE_i64seq = 162, RULE_i32seq = 163,
- RULE_i16seq = 164, RULE_i8seq = 165, RULE_boolSeq = 166, RULE_sqstringSeq = 167,
- RULE_classSeq = 168, RULE_classSeqElement = 169, RULE_objSeq = 170, RULE_customAttrDecl = 171,
- RULE_asmOrRefDecl = 172, RULE_assemblyRefHead = 173, RULE_assemblyRefDecls = 174,
- RULE_assemblyRefDecl = 175, RULE_exptypeHead = 176, RULE_exportHead = 177,
- RULE_exptAttr = 178, RULE_exptypeDecls = 179, RULE_exptypeDecl = 180,
- RULE_manifestResHead = 181, RULE_manresAttr = 182, RULE_manifestResDecls = 183,
+ RULE_id = 0, RULE_dottedName = 1, RULE_dottedNamePart = 2, RULE_compQstring = 3,
+ RULE_decls = 4, RULE_decl = 5, RULE_subsystem = 6, RULE_corflags = 7,
+ RULE_alignment = 8, RULE_imagebase = 9, RULE_stackreserve = 10, RULE_assemblyBlock = 11,
+ RULE_mscorlib = 12, RULE_languageDecl = 13, RULE_languageString = 14,
+ RULE_typelist = 15, RULE_int32 = 16, RULE_int64 = 17, RULE_float64 = 18,
+ RULE_intOrWildcard = 19, RULE_compControl = 20, RULE_typedefDecl = 21,
+ RULE_customDescr = 22, RULE_customDescrWithOwner = 23, RULE_customType = 24,
+ RULE_ownerType = 25, RULE_customBlobDescr = 26, RULE_customBlobArgs = 27,
+ RULE_customBlobNVPairs = 28, RULE_fieldOrProp = 29, RULE_serializType = 30,
+ RULE_serializTypeElement = 31, RULE_moduleHead = 32, RULE_vtfixupDecl = 33,
+ RULE_vtfixupAttr = 34, RULE_vtableDecl = 35, RULE_nameSpaceHead = 36,
+ RULE_classHead = 37, RULE_classAttr = 38, RULE_extendsClause = 39, RULE_implClause = 40,
+ RULE_classDecls = 41, RULE_implList = 42, RULE_esHead = 43, RULE_extSourceSpec = 44,
+ RULE_fileDecl = 45, RULE_fileAttr = 46, RULE_fileEntry = 47, RULE_asmAttrAny = 48,
+ RULE_asmAttr = 49, RULE_instr_none = 50, RULE_instr_var = 51, RULE_instr_i = 52,
+ RULE_instr_i8 = 53, RULE_instr_r = 54, RULE_instr_brtarget = 55, RULE_instr_method = 56,
+ RULE_instr_field = 57, RULE_instr_type = 58, RULE_instr_string = 59, RULE_instr_sig = 60,
+ RULE_instr_tok = 61, RULE_instr_switch = 62, RULE_instr = 63, RULE_labels = 64,
+ RULE_typeArgs = 65, RULE_bounds = 66, RULE_sigArgs = 67, RULE_sigArg = 68,
+ RULE_className = 69, RULE_slashedName = 70, RULE_assemblyDecls = 71, RULE_assemblyDecl = 72,
+ RULE_typeSpec = 73, RULE_nativeType = 74, RULE_nativeTypeArrayPointerInfo = 75,
+ RULE_nativeTypeElement = 76, RULE_iidParamIndex = 77, RULE_variantType = 78,
+ RULE_variantTypeElement = 79, RULE_type = 80, RULE_typeModifiers = 81,
+ RULE_elementType = 82, RULE_simpleType = 83, RULE_bound = 84, RULE_nativeInt = 85,
+ RULE_nativeUint = 86, RULE_secDecl = 87, RULE_secAttrSetBlob = 88, RULE_secAttrBlob = 89,
+ RULE_nameValPairs = 90, RULE_nameValPair = 91, RULE_truefalse = 92, RULE_caValue = 93,
+ RULE_secAction = 94, RULE_methodRef = 95, RULE_callConv = 96, RULE_callKind = 97,
+ RULE_mdtoken = 98, RULE_memberRef = 99, RULE_fieldRef = 100, RULE_typeList = 101,
+ RULE_typarsClause = 102, RULE_typarAttrib = 103, RULE_typarAttribs = 104,
+ RULE_typar = 105, RULE_typars = 106, RULE_tyBound = 107, RULE_genArity = 108,
+ RULE_genArityNotEmpty = 109, RULE_classDecl = 110, RULE_fieldDecl = 111,
+ RULE_fieldAttr = 112, RULE_atOpt = 113, RULE_initOpt = 114, RULE_repeatOpt = 115,
+ RULE_eventHead = 116, RULE_eventAttr = 117, RULE_eventDecls = 118, RULE_eventDecl = 119,
+ RULE_propHead = 120, RULE_propAttr = 121, RULE_propDecls = 122, RULE_propDecl = 123,
+ RULE_marshalClause = 124, RULE_marshalBlob = 125, RULE_paramAttr = 126,
+ RULE_paramAttrElement = 127, RULE_methodHead = 128, RULE_methAttr = 129,
+ RULE_pinvImpl = 130, RULE_pinvAttr = 131, RULE_methodName = 132, RULE_implAttr = 133,
+ RULE_methodDecls = 134, RULE_methodDecl = 135, RULE_labelDecl = 136, RULE_customDescrInMethodBody = 137,
+ RULE_scopeBlock = 138, RULE_sehBlock = 139, RULE_sehClauses = 140, RULE_tryBlock = 141,
+ RULE_sehClause = 142, RULE_filterClause = 143, RULE_catchClause = 144,
+ RULE_finallyClause = 145, RULE_faultClause = 146, RULE_handlerBlock = 147,
+ RULE_dataDecl = 148, RULE_ddHead = 149, RULE_tls = 150, RULE_ddBody = 151,
+ RULE_ddItemList = 152, RULE_ddItemCount = 153, RULE_ddItem = 154, RULE_fieldSerInit = 155,
+ RULE_bytes = 156, RULE_hexbyte = 157, RULE_fieldInit = 158, RULE_serInit = 159,
+ RULE_f32seq = 160, RULE_f64seq = 161, RULE_i64seq = 162, RULE_i32seq = 163,
+ RULE_i16seq = 164, RULE_i8seq = 165, RULE_boolSeq = 166, RULE_sqstringSeq = 167,
+ RULE_classSeq = 168, RULE_classSeqElement = 169, RULE_objSeq = 170, RULE_customAttrDecl = 171,
+ RULE_asmOrRefDecl = 172, RULE_assemblyRefHead = 173, RULE_assemblyRefDecls = 174,
+ RULE_assemblyRefDecl = 175, RULE_exptypeHead = 176, RULE_exportHead = 177,
+ RULE_exptAttr = 178, RULE_exptypeDecls = 179, RULE_exptypeDecl = 180,
+ RULE_manifestResHead = 181, RULE_manresAttr = 182, RULE_manifestResDecls = 183,
RULE_manifestResDecl = 184;
public static readonly string[] ruleNames = {
- "id", "dottedName", "dottedNamePart", "compQstring", "decls", "decl",
- "subsystem", "corflags", "alignment", "imagebase", "stackreserve", "assemblyBlock",
- "mscorlib", "languageDecl", "languageString", "typelist", "int32", "int64",
- "float64", "intOrWildcard", "compControl", "typedefDecl", "customDescr",
- "customDescrWithOwner", "customType", "ownerType", "customBlobDescr",
- "customBlobArgs", "customBlobNVPairs", "fieldOrProp", "serializType",
- "serializTypeElement", "moduleHead", "vtfixupDecl", "vtfixupAttr", "vtableDecl",
- "nameSpaceHead", "classHead", "classAttr", "extendsClause", "implClause",
- "classDecls", "implList", "esHead", "extSourceSpec", "fileDecl", "fileAttr",
- "fileEntry", "asmAttrAny", "asmAttr", "instr_none", "instr_var", "instr_i",
- "instr_i8", "instr_r", "instr_brtarget", "instr_method", "instr_field",
- "instr_type", "instr_string", "instr_sig", "instr_tok", "instr_switch",
- "instr", "labels", "typeArgs", "bounds", "sigArgs", "sigArg", "className",
- "slashedName", "assemblyDecls", "assemblyDecl", "typeSpec", "nativeType",
- "nativeTypeArrayPointerInfo", "nativeTypeElement", "iidParamIndex", "variantType",
- "variantTypeElement", "type", "typeModifiers", "elementType", "simpleType",
- "bound", "nativeInt", "nativeUint", "secDecl", "secAttrSetBlob", "secAttrBlob",
- "nameValPairs", "nameValPair", "truefalse", "caValue", "secAction", "methodRef",
- "callConv", "callKind", "mdtoken", "memberRef", "fieldRef", "typeList",
- "typarsClause", "typarAttrib", "typarAttribs", "typar", "typars", "tyBound",
- "genArity", "genArityNotEmpty", "classDecl", "fieldDecl", "fieldAttr",
- "atOpt", "initOpt", "repeatOpt", "eventHead", "eventAttr", "eventDecls",
- "eventDecl", "propHead", "propAttr", "propDecls", "propDecl", "marshalClause",
- "marshalBlob", "paramAttr", "paramAttrElement", "methodHead", "methAttr",
- "pinvImpl", "pinvAttr", "methodName", "implAttr", "methodDecls", "methodDecl",
- "labelDecl", "customDescrInMethodBody", "scopeBlock", "sehBlock", "sehClauses",
- "tryBlock", "sehClause", "filterClause", "catchClause", "finallyClause",
- "faultClause", "handlerBlock", "dataDecl", "ddHead", "tls", "ddBody",
- "ddItemList", "ddItemCount", "ddItem", "fieldSerInit", "bytes", "hexbyte",
- "fieldInit", "serInit", "f32seq", "f64seq", "i64seq", "i32seq", "i16seq",
- "i8seq", "boolSeq", "sqstringSeq", "classSeq", "classSeqElement", "objSeq",
- "customAttrDecl", "asmOrRefDecl", "assemblyRefHead", "assemblyRefDecls",
- "assemblyRefDecl", "exptypeHead", "exportHead", "exptAttr", "exptypeDecls",
+ "id", "dottedName", "dottedNamePart", "compQstring", "decls", "decl",
+ "subsystem", "corflags", "alignment", "imagebase", "stackreserve", "assemblyBlock",
+ "mscorlib", "languageDecl", "languageString", "typelist", "int32", "int64",
+ "float64", "intOrWildcard", "compControl", "typedefDecl", "customDescr",
+ "customDescrWithOwner", "customType", "ownerType", "customBlobDescr",
+ "customBlobArgs", "customBlobNVPairs", "fieldOrProp", "serializType",
+ "serializTypeElement", "moduleHead", "vtfixupDecl", "vtfixupAttr", "vtableDecl",
+ "nameSpaceHead", "classHead", "classAttr", "extendsClause", "implClause",
+ "classDecls", "implList", "esHead", "extSourceSpec", "fileDecl", "fileAttr",
+ "fileEntry", "asmAttrAny", "asmAttr", "instr_none", "instr_var", "instr_i",
+ "instr_i8", "instr_r", "instr_brtarget", "instr_method", "instr_field",
+ "instr_type", "instr_string", "instr_sig", "instr_tok", "instr_switch",
+ "instr", "labels", "typeArgs", "bounds", "sigArgs", "sigArg", "className",
+ "slashedName", "assemblyDecls", "assemblyDecl", "typeSpec", "nativeType",
+ "nativeTypeArrayPointerInfo", "nativeTypeElement", "iidParamIndex", "variantType",
+ "variantTypeElement", "type", "typeModifiers", "elementType", "simpleType",
+ "bound", "nativeInt", "nativeUint", "secDecl", "secAttrSetBlob", "secAttrBlob",
+ "nameValPairs", "nameValPair", "truefalse", "caValue", "secAction", "methodRef",
+ "callConv", "callKind", "mdtoken", "memberRef", "fieldRef", "typeList",
+ "typarsClause", "typarAttrib", "typarAttribs", "typar", "typars", "tyBound",
+ "genArity", "genArityNotEmpty", "classDecl", "fieldDecl", "fieldAttr",
+ "atOpt", "initOpt", "repeatOpt", "eventHead", "eventAttr", "eventDecls",
+ "eventDecl", "propHead", "propAttr", "propDecls", "propDecl", "marshalClause",
+ "marshalBlob", "paramAttr", "paramAttrElement", "methodHead", "methAttr",
+ "pinvImpl", "pinvAttr", "methodName", "implAttr", "methodDecls", "methodDecl",
+ "labelDecl", "customDescrInMethodBody", "scopeBlock", "sehBlock", "sehClauses",
+ "tryBlock", "sehClause", "filterClause", "catchClause", "finallyClause",
+ "faultClause", "handlerBlock", "dataDecl", "ddHead", "tls", "ddBody",
+ "ddItemList", "ddItemCount", "ddItem", "fieldSerInit", "bytes", "hexbyte",
+ "fieldInit", "serInit", "f32seq", "f64seq", "i64seq", "i32seq", "i16seq",
+ "i8seq", "boolSeq", "sqstringSeq", "classSeq", "classSeqElement", "objSeq",
+ "customAttrDecl", "asmOrRefDecl", "assemblyRefHead", "assemblyRefDecls",
+ "assemblyRefDecl", "exptypeHead", "exportHead", "exptAttr", "exptypeDecls",
"exptypeDecl", "manifestResHead", "manresAttr", "manifestResDecls", "manifestResDecl"
};
private static readonly string[] _LiteralNames = {
- null, "'native'", "'cil'", "'optil'", "'managed'", "'forwardref'", "'preservesig'",
- "'runtime'", "'internalcall'", "'synchronized'", "'noinlining'", "'aggressiveinlining'",
- "'nooptimization'", "'aggressiveoptimization'", "'async'", "'extended'",
- "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'", "'alignment'",
- "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'", "'.language'",
- "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'", "'as'", "'.custom'",
- "'='", "'field'", "'property'", "'class'", "'extern'", "'.vtfixup'", "'['",
- "']'", "'at'", "'fromunmanaged'", "'callmostderived'", "'retainappdomain'",
- "'.vtable'", "'.namespace'", "'.class'", "'public'", "'private'", "'sealed'",
- "'abstract'", "'auto'", "'sequential'", "'unicode'", "'autochar'", "'import'",
- "'serializable'", "'windowsruntime'", "'nested'", "'family'", "'assembly'",
- "'famandassem'", "'famorassem'", "'beforefieldinit'", "'specialname'",
- "'rtspecialname'", "'flags'", "'extends'", "'implements'", "'.line'",
- "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'", "'legacy library'",
- "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'", "'()'", "'<'",
- "'>'", "'/'", "'algorithm'", "'iidparam'", "'pinned'", "'modreq'", "'modopt'",
- "'unsigned'", "'true'", "'false'", "'request'", "'demand'", "'assert'",
- "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'", "'reqmin'",
- "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'", "'noncasdemand'",
- "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'", "'mdtoken'",
- "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'", "'.interfaceimpl'",
- "'.field'", "'marshal'", "'static'", "'initonly'", "'privatescope'", "'literal'",
- "'notserialized'", "'volatile'", "'.event'", "'.addon'", "'.removeon'",
- "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'", "'in'", "'out'",
- "'opt'", "'.method'", "'final'", "'virtual'", "'strict'", "'hidebysig'",
- "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'", "'nomangle'",
- "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
- "'.cctor'", "'il'", "'init'", "'.try'", "'to'", "'filter'", "'catch'",
- "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publicKey'",
- "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'", null, null,
- null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null, "'string'",
- "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'", "'float64'",
- "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'", "'type'",
- "'object'", "'.module'", "'value'", "'valuetype'", "'void'", "'enum'",
- "'custom'", "'fixed'", "'systring'", "'array'", "'variant'", "'currency'",
- "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'", "'lpstr'", "'lpwstr'",
- "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'", "'struct'", "'interface'",
- "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'", "'method'", "'any'",
- "'lpstruct'", "'vector'", "'hresult'", "'carray'", "'userdefined'", "'record'",
- "'filetime'", "'blob'", "'stream'", "'storage'", "'streamed_object'",
- "'stored_object'", "'blob_object'", "'cf'", "'clsid'", "'instance'", "'explicit'",
- "'default'", "'vararg'", "'unmanaged'", "'cdecl'", "'stdcall'", "'thiscall'",
- "'fastcall'", "'!'", null, null, "'.param'", "'constraint'", "'.this'",
- "'.base'", "'.nester'", "'&'", null, "'*'", null, null, "'.'", "'+'",
- "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'", "'#else'", "'#endif'",
- "'#include'", "'.mresource'", null, null, null, "'ldc.i8'", null, null,
- "'calli'", null, "'switch'", null, "'ldstr'", null, "'ldtoken'", null,
- null, null, null, null, null, "'.permission'", "'.permissionset'", "'.emitbyte'",
- "'.maxstack'", "'.entrypoint'", "'.zeroinit'", "'.locals'", "'.export'",
+ null, "'native'", "'cil'", "'optil'", "'managed'", "'forwardref'", "'preservesig'",
+ "'runtime'", "'internalcall'", "'synchronized'", "'noinlining'", "'aggressiveinlining'",
+ "'nooptimization'", "'aggressiveoptimization'", "'async'", "'extended'",
+ "'volatile'", "'{'", "'}'", "'.subsystem'", "'.corflags'", "'.file'",
+ "'alignment'", "'.imagebase'", "'.stackreserve'", "'.assembly'", "'.mscorlib'",
+ "'.language'", "','", "'.typelist'", "'('", "')'", "';'", "'.typedef'",
+ "'as'", "'.custom'", "'='", "'field'", "'property'", "'class'", "'extern'",
+ "'.vtfixup'", "'['", "']'", "'at'", "'fromunmanaged'", "'callmostderived'",
+ "'retainappdomain'", "'.vtable'", "'.namespace'", "'.class'", "'public'",
+ "'private'", "'sealed'", "'abstract'", "'auto'", "'sequential'", "'unicode'",
+ "'autochar'", "'import'", "'serializable'", "'windowsruntime'", "'nested'",
+ "'family'", "'assembly'", "'famandassem'", "'famorassem'", "'beforefieldinit'",
+ "'specialname'", "'rtspecialname'", "'flags'", "'extends'", "'implements'",
+ "'.line'", "'#line'", "':'", "'nometadata'", "'retargetable'", "'noplatform'",
+ "'legacy library'", "'x86'", "'amd64'", "'arm'", "'arm64'", "'bytearray'",
+ "'()'", "'<'", "'>'", "'/'", "'algorithm'", "'unsigned'", "'iidparam'",
+ "'pinned'", "'modreq'", "'modopt'", "'true'", "'false'", "'request'",
+ "'demand'", "'assert'", "'deny'", "'permitonly'", "'linkcheck'", "'inheritcheck'",
+ "'reqmin'", "'reqopt'", "'reqrefuse'", "'prejitgrant'", "'prejitdeny'",
+ "'noncasdemand'", "'noncaslinkdemand'", "'noncasinheritance'", "'callconv'",
+ "'mdtoken'", "'-'", "'byreflike'", "'.ctor'", "'.size'", "'.pack'", "'with'",
+ "'.interfaceimpl'", "'.field'", "'marshal'", "'static'", "'initonly'",
+ "'privatescope'", "'literal'", "'notserialized'", "'.event'", "'.addon'",
+ "'.removeon'", "'.fire'", "'.other'", "'.property'", "'.set'", "'.get'",
+ "'in'", "'out'", "'opt'", "'.method'", "'final'", "'virtual'", "'strict'",
+ "'hidebysig'", "'newslot'", "'unmanagedexp'", "'reqsecobj'", "'pinvokeimpl'",
+ "'nomangle'", "'lasterr'", "'winapi'", "'bestfit'", "'on'", "'off'", "'charmaperror'",
+ "'.cctor'", "'il'", "'init'", "'.try'", "'to'", "'filter'", "'catch'",
+ "'finally'", "'fault'", "'handler'", "'.data'", "'tls'", "'.publickey'",
+ "'.ver'", "'.locale'", "'.publickeytoken'", "'forwarder'", null, null,
+ null, "'::'", "'...'", "'null'", "'nullref'", "'.hash'", null, "'string'",
+ "'bool'", "'int8'", "'int16'", "'int32'", "'int64'", "'float32'", "'float64'",
+ "'uint8'", "'uint16'", "'uint32'", "'uint64'", "'int'", "'uint'", "'type'",
+ "'object'", "'.module'", "'value'", "'valuetype'", "'void'", "'enum'",
+ "'custom'", "'fixed'", "'sysstring'", "'array'", "'variant'", "'currency'",
+ "'syschar'", "'error'", "'decimal'", "'date'", "'bstr'", "'lpstr'", "'lpwstr'",
+ "'lptstr'", "'objectref'", "'iunknown'", "'idispatch'", "'struct'", "'interface'",
+ "'safearray'", "'byvalstr'", "'ansi'", "'tbstr'", "'method'", "'any'",
+ "'lpstruct'", "'vector'", "'hresult'", "'carray'", "'userdefined'", "'record'",
+ "'filetime'", "'blob'", "'stream'", "'storage'", "'streamed_object'",
+ "'stored_object'", "'blob_object'", "'cf'", "'clsid'", "'instance'", "'explicit'",
+ "'default'", "'vararg'", "'unmanaged'", "'cdecl'", "'stdcall'", "'thiscall'",
+ "'fastcall'", "'!'", null, null, "'.param'", "'constraint'", "'.this'",
+ "'.base'", "'.nester'", "'&'", null, "'*'", null, null, "'.'", "'+'",
+ "'#define'", "'#undef'", "'#ifdef'", "'#ifndef'", "'#else'", "'#endif'",
+ "'#include'", "'.mresource'", null, null, null, "'ldc.i8'", null, null,
+ "'calli'", null, "'switch'", null, "'ldstr'", null, "'ldtoken'", null,
+ null, null, null, null, null, "'.permission'", "'.permissionset'", "'.emitbyte'",
+ "'.maxstack'", "'.entrypoint'", "'.zeroinit'", "'.locals'", "'.export'",
"'.override'", "'.vtentry'"
};
private static readonly string[] _SymbolicNames = {
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
- "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
- "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UINT8", "UINT16", "UINT32",
- "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE", "VALUETYPE",
- "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY", "VARIANT", "CURRENCY",
- "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR", "LPSTR", "LPWSTR", "LPTSTR",
- "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT", "INTERFACE", "SAFEARRAY",
- "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY", "LPSTRUCT", "VECTOR", "HRESULT",
- "CARRAY", "USERDEFINED", "RECORD", "FILETIME", "BLOB", "STREAM", "STORAGE",
- "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT", "CF", "CLSID", "INSTANCE",
- "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED", "CDECL", "STDCALL", "THISCALL",
- "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER", "TYPEDREF", "PARAM",
- "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
- "PTR", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
- "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
- "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
- "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
- "INSTR_FIELD", "INSTR_TOK", "DOTTEDNAME", "ID", "HEXBYTE", "WS", "SINGLE_LINE_COMMENT",
- "COMMENT", "PERMISSION", "PERMISSIONSET", "EMITBYTE", "MAXSTACK", "ENTRYPOINT",
- "ZEROINIT", "LOCALS", "EXPORT", "OVERRIDE", "VTENTRY", "IncludedFileEof",
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ null, null, null, null, "INT32", "INT64", "FLOAT64", "DCOLON", "ELLIPSIS",
+ "NULL", "NULLREF", "HASH", "CHAR", "STRING", "BOOL", "INT8", "INT16",
+ "INT32_", "INT64_", "FLOAT32", "FLOAT64_", "UINT8", "UINT16", "UINT32",
+ "UINT64", "INT", "UINT", "TYPE", "OBJECT", "MODULE", "VALUE", "VALUETYPE",
+ "VOID", "ENUM", "CUSTOM", "FIXED", "SYSSTRING", "ARRAY", "VARIANT", "CURRENCY",
+ "SYSCHAR", "ERROR", "DECIMAL", "DATE", "BSTR", "LPSTR", "LPWSTR", "LPTSTR",
+ "OBJECTREF", "IUNKNOWN", "IDISPATCH", "STRUCT", "INTERFACE", "SAFEARRAY",
+ "BYVALSTR", "ANSI", "TBSTR", "METHOD", "ANY", "LPSTRUCT", "VECTOR", "HRESULT",
+ "CARRAY", "USERDEFINED", "RECORD", "FILETIME", "BLOB", "STREAM", "STORAGE",
+ "STREAMED_OBJECT", "STORED_OBJECT", "BLOB_OBJECT", "CF", "CLSID", "INSTANCE",
+ "EXPLICIT", "DEFAULT", "VARARG", "UNMANAGED", "CDECL", "STDCALL", "THISCALL",
+ "FASTCALL", "TYPE_PARAMETER", "METHOD_TYPE_PARAMETER", "TYPEDREF", "PARAM",
+ "CONSTRAINT", "THIS", "BASE", "NESTER", "REF", "ARRAY_TYPE_NO_BOUNDS",
+ "PTR", "QSTRING", "SQSTRING", "DOT", "PLUS", "PP_DEFINE", "PP_UNDEF",
+ "PP_IFDEF", "PP_IFNDEF", "PP_ELSE", "PP_ENDIF", "PP_INCLUDE", "MRESOURCE",
+ "INSTR_NONE", "INSTR_VAR", "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_METHOD",
+ "INSTR_SIG", "INSTR_BRTARGET", "INSTR_SWITCH", "INSTR_TYPE", "INSTR_STRING",
+ "INSTR_FIELD", "INSTR_TOK", "DOTTEDNAME", "ID", "HEXBYTE", "WS", "SINGLE_LINE_COMMENT",
+ "COMMENT", "PERMISSION", "PERMISSIONSET", "EMITBYTE", "MAXSTACK", "ENTRYPOINT",
+ "ZEROINIT", "LOCALS", "EXPORT", "OVERRIDE", "VTENTRY", "IncludedFileEof",
"SyntheticIncludedFileEof"
};
public static readonly IVocabulary DefaultVocabulary = new Vocabulary(_LiteralNames, _SymbolicNames);
@@ -300,7 +300,6 @@ public CILParser(ITokenStream input, TextWriter output, TextWriter errorOutput)
public partial class IdContext : ParserRuleContext {
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode ID() { return GetToken(CILParser.ID, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode UNMANAGED() { return GetToken(CILParser.UNMANAGED, 0); }
- [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode VALUE() { return GetToken(CILParser.VALUE, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode INSTANCE() { return GetToken(CILParser.INSTANCE, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SQSTRING() { return GetToken(CILParser.SQSTRING, 0); }
public IdContext(ParserRuleContext parent, int invokingState)
@@ -326,7 +325,7 @@ public IdContext id() {
{
State = 370;
_la = TokenStream.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 299067162755073L) != 0) || _la==SQSTRING || _la==ID) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 70368746274833L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -358,6 +357,7 @@ [System.Diagnostics.DebuggerNonUserCode] public DottedNamePartContext dottedName
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode DOT(int i) {
return GetToken(CILParser.DOT, i);
}
+ [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SQSTRING() { return GetToken(CILParser.SQSTRING, 0); }
public DottedNameContext(ParserRuleContext parent, int invokingState)
: base(parent, invokingState)
{
@@ -377,20 +377,17 @@ public DottedNameContext dottedName() {
EnterRule(_localctx, 2, RULE_dottedName);
try {
int _alt;
- State = 382;
+ State = 383;
ErrorHandler.Sync(this);
- switch (TokenStream.LA(1)) {
- case DOTTEDNAME:
+ switch ( Interpreter.AdaptivePredict(TokenStream,1,Context) ) {
+ case 1:
EnterOuterAlt(_localctx, 1);
{
State = 372;
Match(DOTTEDNAME);
}
break;
- case VALUE:
- case INSTANCE:
- case SQSTRING:
- case ID:
+ case 2:
EnterOuterAlt(_localctx, 2);
{
{
@@ -406,7 +403,7 @@ public DottedNameContext dottedName() {
State = 374;
Match(DOT);
}
- }
+ }
}
State = 380;
ErrorHandler.Sync(this);
@@ -417,8 +414,13 @@ public DottedNameContext dottedName() {
}
}
break;
- default:
- throw new NoViableAltException(this);
+ case 3:
+ EnterOuterAlt(_localctx, 3);
+ {
+ State = 382;
+ Match(SQSTRING);
+ }
+ break;
}
}
catch (RecognitionException re) {
@@ -434,9 +436,9 @@ public DottedNameContext dottedName() {
public partial class DottedNamePartContext : ParserRuleContext {
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode ID() { return GetToken(CILParser.ID, 0); }
- [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode VALUE() { return GetToken(CILParser.VALUE, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode INSTANCE() { return GetToken(CILParser.INSTANCE, 0); }
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SQSTRING() { return GetToken(CILParser.SQSTRING, 0); }
+ [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode DOTTEDNAME() { return GetToken(CILParser.DOTTEDNAME, 0); }
public DottedNamePartContext(ParserRuleContext parent, int invokingState)
: base(parent, invokingState)
{
@@ -458,9 +460,9 @@ public DottedNamePartContext dottedNamePart() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 384;
+ State = 385;
_la = TokenStream.LA(1);
- if ( !(_la==VALUE || _la==INSTANCE || _la==SQSTRING || _la==ID) ) {
+ if ( !(_la==T__15 || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105553118363649L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -510,25 +512,25 @@ public CompQstringContext compQstring() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 390;
+ State = 391;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,2,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 386;
- Match(QSTRING);
State = 387;
+ Match(QSTRING);
+ State = 388;
Match(PLUS);
}
- }
+ }
}
- State = 392;
+ State = 393;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,2,Context);
}
- State = 393;
+ State = 394;
Match(QSTRING);
}
}
@@ -571,17 +573,17 @@ public DeclsContext decls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 398;
+ State = 399;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 986285952729088L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 281474976710659L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 864691128522244097L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 6860956837609473L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1972571905523712L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 281474976710659L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 288230376218820609L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 6860956837609473L) != 0)) {
{
{
- State = 395;
+ State = 396;
decl();
}
}
- State = 400;
+ State = 401;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -713,224 +715,224 @@ public DeclContext decl() {
DeclContext _localctx = new DeclContext(Context, State);
EnterRule(_localctx, 10, RULE_decl);
try {
- State = 451;
+ State = 452;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,4,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 401;
- classHead();
State = 402;
- Match(T__15);
+ classHead();
State = 403;
- classDecls();
- State = 404;
Match(T__16);
+ State = 404;
+ classDecls();
+ State = 405;
+ Match(T__17);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 406;
- nameSpaceHead();
State = 407;
- Match(T__15);
+ nameSpaceHead();
State = 408;
- decls();
- State = 409;
Match(T__16);
+ State = 409;
+ decls();
+ State = 410;
+ Match(T__17);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 411;
- methodHead();
State = 412;
- Match(T__15);
+ methodHead();
State = 413;
- methodDecls();
- State = 414;
Match(T__16);
+ State = 414;
+ methodDecls();
+ State = 415;
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 416;
+ State = 417;
fieldDecl();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 417;
+ State = 418;
dataDecl();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 418;
+ State = 419;
vtableDecl();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 419;
+ State = 420;
vtfixupDecl();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 420;
+ State = 421;
extSourceSpec();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 421;
+ State = 422;
fileDecl();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 422;
+ State = 423;
assemblyBlock();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 423;
- assemblyRefHead();
State = 424;
- Match(T__15);
+ assemblyRefHead();
State = 425;
- assemblyRefDecls();
- State = 426;
Match(T__16);
+ State = 426;
+ assemblyRefDecls();
+ State = 427;
+ Match(T__17);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 428;
- exptypeHead();
State = 429;
- Match(T__15);
+ exptypeHead();
State = 430;
- exptypeDecls();
- State = 431;
Match(T__16);
+ State = 431;
+ exptypeDecls();
+ State = 432;
+ Match(T__17);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 433;
- manifestResHead();
State = 434;
- Match(T__15);
+ manifestResHead();
State = 435;
- manifestResDecls();
- State = 436;
Match(T__16);
+ State = 436;
+ manifestResDecls();
+ State = 437;
+ Match(T__17);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 438;
+ State = 439;
moduleHead();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 439;
+ State = 440;
secDecl();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 440;
+ State = 441;
customAttrDecl();
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 441;
+ State = 442;
subsystem();
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 442;
+ State = 443;
corflags();
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 443;
+ State = 444;
alignment();
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 444;
+ State = 445;
imagebase();
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 445;
+ State = 446;
stackreserve();
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 446;
+ State = 447;
languageDecl();
}
break;
case 23:
EnterOuterAlt(_localctx, 23);
{
- State = 447;
+ State = 448;
typedefDecl();
}
break;
case 24:
EnterOuterAlt(_localctx, 24);
{
- State = 448;
+ State = 449;
compControl();
}
break;
case 25:
EnterOuterAlt(_localctx, 25);
{
- State = 449;
+ State = 450;
typelist();
}
break;
case 26:
EnterOuterAlt(_localctx, 26);
{
- State = 450;
+ State = 451;
mscorlib();
}
break;
@@ -971,9 +973,9 @@ public SubsystemContext subsystem() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 453;
- Match(T__17);
State = 454;
+ Match(T__18);
+ State = 455;
int32();
}
}
@@ -1012,9 +1014,9 @@ public CorflagsContext corflags() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 456;
- Match(T__18);
State = 457;
+ Match(T__19);
+ State = 458;
int32();
}
}
@@ -1053,11 +1055,11 @@ public AlignmentContext alignment() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 459;
- Match(T__19);
State = 460;
Match(T__20);
State = 461;
+ Match(T__21);
+ State = 462;
int32();
}
}
@@ -1096,9 +1098,9 @@ public ImagebaseContext imagebase() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 463;
- Match(T__21);
State = 464;
+ Match(T__22);
+ State = 465;
int64();
}
}
@@ -1137,9 +1139,9 @@ public StackreserveContext stackreserve() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 466;
- Match(T__22);
State = 467;
+ Match(T__23);
+ State = 468;
int64();
}
}
@@ -1184,18 +1186,18 @@ public AssemblyBlockContext assemblyBlock() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 469;
- Match(T__23);
State = 470;
- asmAttr();
+ Match(T__24);
State = 471;
- dottedName();
+ asmAttr();
State = 472;
- Match(T__15);
+ dottedName();
State = 473;
- assemblyDecls();
- State = 474;
Match(T__16);
+ State = 474;
+ assemblyDecls();
+ State = 475;
+ Match(T__17);
}
}
catch (RecognitionException re) {
@@ -1230,8 +1232,8 @@ public MscorlibContext mscorlib() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 476;
- Match(T__24);
+ State = 477;
+ Match(T__25);
}
}
catch (RecognitionException re) {
@@ -1270,45 +1272,45 @@ public LanguageDeclContext languageDecl() {
LanguageDeclContext _localctx = new LanguageDeclContext(Context, State);
EnterRule(_localctx, 26, RULE_languageDecl);
try {
- State = 492;
+ State = 493;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,5,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 478;
- Match(T__25);
State = 479;
+ Match(T__26);
+ State = 480;
languageString();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 480;
- Match(T__25);
State = 481;
- languageString();
- State = 482;
Match(T__26);
+ State = 482;
+ languageString();
State = 483;
+ Match(T__27);
+ State = 484;
languageString();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 485;
- Match(T__25);
State = 486;
- languageString();
- State = 487;
Match(T__26);
- State = 488;
+ State = 487;
languageString();
+ State = 488;
+ Match(T__27);
State = 489;
- Match(T__26);
+ languageString();
State = 490;
+ Match(T__27);
+ State = 491;
languageString();
}
break;
@@ -1327,7 +1329,6 @@ public LanguageDeclContext languageDecl() {
public partial class LanguageStringContext : ParserRuleContext {
[System.Diagnostics.DebuggerNonUserCode] public ITerminalNode SQSTRING() { return GetToken(CILParser.SQSTRING, 0); }
- [System.Diagnostics.DebuggerNonUserCode] public ITerminalNode QSTRING() { return GetToken(CILParser.QSTRING, 0); }
public LanguageStringContext(ParserRuleContext parent, int invokingState)
: base(parent, invokingState)
{
@@ -1345,19 +1346,11 @@ public override TResult Accept(IParseTreeVisitor visitor) {
public LanguageStringContext languageString() {
LanguageStringContext _localctx = new LanguageStringContext(Context, State);
EnterRule(_localctx, 28, RULE_languageString);
- int _la;
try {
EnterOuterAlt(_localctx, 1);
{
- State = 494;
- _la = TokenStream.LA(1);
- if ( !(_la==QSTRING || _la==SQSTRING) ) {
- ErrorHandler.RecoverInline(this);
- }
- else {
- ErrorHandler.ReportMatch(this);
- Consume();
- }
+ State = 495;
+ Match(SQSTRING);
}
}
catch (RecognitionException re) {
@@ -1399,26 +1392,26 @@ public TypelistContext typelist() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 496;
- Match(T__27);
State = 497;
- Match(T__15);
- State = 501;
+ Match(T__28);
+ State = 498;
+ Match(T__16);
+ State = 502;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__40 || _la==T__111 || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 2017630225248026625L) != 0) || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50331649L) != 0)) {
+ while (_la==T__15 || _la==T__41 || _la==T__112 || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105553118478337L) != 0)) {
{
{
- State = 498;
+ State = 499;
className();
}
}
- State = 503;
+ State = 504;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 504;
- Match(T__16);
+ State = 505;
+ Match(T__17);
}
}
catch (RecognitionException re) {
@@ -1454,7 +1447,7 @@ public Int32Context int32() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 506;
+ State = 507;
Match(INT32);
}
}
@@ -1493,7 +1486,7 @@ public Int64Context int64() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 508;
+ State = 509;
_la = TokenStream.LA(1);
if ( !(_la==INT32 || _la==INT64) ) {
ErrorHandler.RecoverInline(this);
@@ -1544,56 +1537,56 @@ public Float64Context float64() {
Float64Context _localctx = new Float64Context(Context, State);
EnterRule(_localctx, 36, RULE_float64);
try {
- State = 525;
+ State = 526;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,7,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 510;
+ State = 511;
Match(FLOAT64);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 511;
- int32();
State = 512;
+ int32();
+ State = 513;
Match(DOT);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 514;
+ State = 515;
int32();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 515;
- Match(FLOAT32);
State = 516;
- Match(T__28);
+ Match(FLOAT32);
State = 517;
- int32();
- State = 518;
Match(T__29);
+ State = 518;
+ int32();
+ State = 519;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 520;
- Match(FLOAT64_);
State = 521;
- Match(T__28);
+ Match(FLOAT64_);
State = 522;
- int64();
- State = 523;
Match(T__29);
+ State = 523;
+ int64();
+ State = 524;
+ Match(T__30);
}
break;
}
@@ -1632,20 +1625,20 @@ public IntOrWildcardContext intOrWildcard() {
IntOrWildcardContext _localctx = new IntOrWildcardContext(Context, State);
EnterRule(_localctx, 38, RULE_intOrWildcard);
try {
- State = 529;
+ State = 530;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case INT32:
EnterOuterAlt(_localctx, 1);
{
- State = 527;
+ State = 528;
int32();
}
break;
case PTR:
EnterOuterAlt(_localctx, 2);
{
- State = 528;
+ State = 529;
Match(PTR);
}
break;
@@ -1692,84 +1685,84 @@ public CompControlContext compControl() {
CompControlContext _localctx = new CompControlContext(Context, State);
EnterRule(_localctx, 40, RULE_compControl);
try {
- State = 547;
+ State = 548;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,9,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 531;
- Match(PP_DEFINE);
State = 532;
+ Match(PP_DEFINE);
+ State = 533;
Match(ID);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 533;
- Match(PP_DEFINE);
State = 534;
- Match(ID);
+ Match(PP_DEFINE);
State = 535;
+ Match(ID);
+ State = 536;
Match(QSTRING);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 536;
- Match(PP_UNDEF);
State = 537;
+ Match(PP_UNDEF);
+ State = 538;
Match(ID);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 538;
- Match(PP_IFDEF);
State = 539;
+ Match(PP_IFDEF);
+ State = 540;
Match(ID);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 540;
- Match(PP_IFNDEF);
State = 541;
+ Match(PP_IFNDEF);
+ State = 542;
Match(ID);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 542;
+ State = 543;
Match(PP_ELSE);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 543;
+ State = 544;
Match(PP_ENDIF);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 544;
- Match(PP_INCLUDE);
State = 545;
+ Match(PP_INCLUDE);
+ State = 546;
Match(QSTRING);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 546;
- Match(T__30);
+ State = 547;
+ Match(T__31);
}
break;
}
@@ -1822,71 +1815,71 @@ public TypedefDeclContext typedefDecl() {
TypedefDeclContext _localctx = new TypedefDeclContext(Context, State);
EnterRule(_localctx, 42, RULE_typedefDecl);
try {
- State = 574;
+ State = 575;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,10,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 549;
- Match(T__31);
State = 550;
- type();
- State = 551;
Match(T__32);
+ State = 551;
+ type();
State = 552;
+ Match(T__33);
+ State = 553;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 554;
- Match(T__31);
State = 555;
- className();
- State = 556;
Match(T__32);
+ State = 556;
+ className();
State = 557;
+ Match(T__33);
+ State = 558;
dottedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 559;
- Match(T__31);
State = 560;
- memberRef();
- State = 561;
Match(T__32);
+ State = 561;
+ memberRef();
State = 562;
+ Match(T__33);
+ State = 563;
dottedName();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 564;
- Match(T__31);
State = 565;
- customDescr();
- State = 566;
Match(T__32);
+ State = 566;
+ customDescr();
State = 567;
+ Match(T__33);
+ State = 568;
dottedName();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 569;
- Match(T__31);
State = 570;
- customDescrWithOwner();
- State = 571;
Match(T__32);
+ State = 571;
+ customDescrWithOwner();
State = 572;
+ Match(T__33);
+ State = 573;
dottedName();
}
break;
@@ -1934,63 +1927,63 @@ public CustomDescrContext customDescr() {
CustomDescrContext _localctx = new CustomDescrContext(Context, State);
EnterRule(_localctx, 44, RULE_customDescr);
try {
- State = 597;
+ State = 598;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,11,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 576;
- Match(T__33);
State = 577;
+ Match(T__34);
+ State = 578;
customType();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 578;
- Match(T__33);
State = 579;
- customType();
- State = 580;
Match(T__34);
+ State = 580;
+ customType();
State = 581;
+ Match(T__35);
+ State = 582;
compQstring();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 583;
- Match(T__33);
State = 584;
- customType();
- State = 585;
Match(T__34);
+ State = 585;
+ customType();
State = 586;
- Match(T__15);
+ Match(T__35);
State = 587;
- customBlobDescr();
- State = 588;
Match(T__16);
+ State = 588;
+ customBlobDescr();
+ State = 589;
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 590;
- Match(T__33);
State = 591;
- customType();
- State = 592;
Match(T__34);
+ State = 592;
+ customType();
State = 593;
- Match(T__28);
+ Match(T__35);
State = 594;
- bytes();
- State = 595;
Match(T__29);
+ State = 595;
+ bytes();
+ State = 596;
+ Match(T__30);
}
break;
}
@@ -2040,87 +2033,87 @@ public CustomDescrWithOwnerContext customDescrWithOwner() {
CustomDescrWithOwnerContext _localctx = new CustomDescrWithOwnerContext(Context, State);
EnterRule(_localctx, 46, RULE_customDescrWithOwner);
try {
- State = 633;
+ State = 634;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,12,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 599;
- Match(T__33);
State = 600;
- Match(T__28);
+ Match(T__34);
State = 601;
- ownerType();
- State = 602;
Match(T__29);
+ State = 602;
+ ownerType();
State = 603;
+ Match(T__30);
+ State = 604;
customType();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 605;
- Match(T__33);
State = 606;
- Match(T__28);
+ Match(T__34);
State = 607;
- ownerType();
- State = 608;
Match(T__29);
+ State = 608;
+ ownerType();
State = 609;
- customType();
+ Match(T__30);
State = 610;
- Match(T__34);
+ customType();
State = 611;
+ Match(T__35);
+ State = 612;
compQstring();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 613;
- Match(T__33);
State = 614;
- Match(T__28);
+ Match(T__34);
State = 615;
- ownerType();
- State = 616;
Match(T__29);
+ State = 616;
+ ownerType();
State = 617;
- customType();
+ Match(T__30);
State = 618;
- Match(T__34);
+ customType();
State = 619;
- Match(T__15);
+ Match(T__35);
State = 620;
- customBlobDescr();
- State = 621;
Match(T__16);
+ State = 621;
+ customBlobDescr();
+ State = 622;
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 623;
- Match(T__33);
State = 624;
- Match(T__28);
+ Match(T__34);
State = 625;
- ownerType();
- State = 626;
Match(T__29);
+ State = 626;
+ ownerType();
State = 627;
- customType();
+ Match(T__30);
State = 628;
- Match(T__34);
+ customType();
State = 629;
- Match(T__28);
+ Match(T__35);
State = 630;
- bytes();
- State = 631;
Match(T__29);
+ State = 631;
+ bytes();
+ State = 632;
+ Match(T__30);
}
break;
}
@@ -2160,7 +2153,7 @@ public CustomTypeContext customType() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 635;
+ State = 636;
methodRef();
}
}
@@ -2200,20 +2193,20 @@ public OwnerTypeContext ownerType() {
OwnerTypeContext _localctx = new OwnerTypeContext(Context, State);
EnterRule(_localctx, 50, RULE_ownerType);
try {
- State = 639;
+ State = 640;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,13,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 637;
+ State = 638;
typeSpec();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 638;
+ State = 639;
memberRef();
}
break;
@@ -2257,9 +2250,9 @@ public CustomBlobDescrContext customBlobDescr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 641;
- customBlobArgs();
State = 642;
+ customBlobArgs();
+ State = 643;
customBlobNVPairs();
}
}
@@ -2308,16 +2301,16 @@ public CustomBlobArgsContext customBlobArgs() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 648;
+ State = 649;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,15,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
- State = 646;
+ State = 647;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__82:
+ case T__83:
case CHAR:
case STRING:
case BOOL:
@@ -2334,11 +2327,11 @@ public CustomBlobArgsContext customBlobArgs() {
case TYPE:
case OBJECT:
{
- State = 644;
+ State = 645;
serInit();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -2347,16 +2340,16 @@ public CustomBlobArgsContext customBlobArgs() {
case PP_ENDIF:
case PP_INCLUDE:
{
- State = 645;
+ State = 646;
compControl();
}
break;
default:
throw new NoViableAltException(this);
}
- }
+ }
}
- State = 650;
+ State = 651;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,15,Context);
}
@@ -2425,30 +2418,30 @@ public CustomBlobNVPairsContext customBlobNVPairs() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 660;
+ State = 661;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 208305913856L) != 0) || ((((_la - 266)) & ~0x3f) == 0 && ((1L << (_la - 266)) & 127L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 416611827712L) != 0) || ((((_la - 266)) & ~0x3f) == 0 && ((1L << (_la - 266)) & 127L) != 0)) {
{
- State = 658;
+ State = 659;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__35:
case T__36:
+ case T__37:
{
- State = 651;
- fieldOrProp();
State = 652;
- serializType();
+ fieldOrProp();
State = 653;
- dottedName();
+ serializType();
State = 654;
- Match(T__34);
+ dottedName();
State = 655;
+ Match(T__35);
+ State = 656;
serInit();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -2457,7 +2450,7 @@ public CustomBlobNVPairsContext customBlobNVPairs() {
case PP_ENDIF:
case PP_INCLUDE:
{
- State = 657;
+ State = 658;
compControl();
}
break;
@@ -2465,7 +2458,7 @@ public CustomBlobNVPairsContext customBlobNVPairs() {
throw new NoViableAltException(this);
}
}
- State = 662;
+ State = 663;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -2504,9 +2497,9 @@ public FieldOrPropContext fieldOrProp() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 663;
+ State = 664;
_la = TokenStream.LA(1);
- if ( !(_la==T__35 || _la==T__36) ) {
+ if ( !(_la==T__36 || _la==T__37) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -2552,14 +2545,14 @@ public SerializTypeContext serializType() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 665;
+ State = 666;
serializTypeElement();
- State = 667;
+ State = 668;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
if (_la==ARRAY_TYPE_NO_BOUNDS) {
{
- State = 666;
+ State = 667;
Match(ARRAY_TYPE_NO_BOUNDS);
}
}
@@ -2609,54 +2602,54 @@ public SerializTypeElementContext serializTypeElement() {
SerializTypeElementContext _localctx = new SerializTypeElementContext(Context, State);
EnterRule(_localctx, 62, RULE_serializTypeElement);
try {
- State = 678;
+ State = 679;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,19,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 669;
+ State = 670;
simpleType();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 670;
+ State = 671;
dottedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 671;
+ State = 672;
Match(TYPE);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 672;
+ State = 673;
Match(OBJECT);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 673;
- Match(ENUM);
State = 674;
- Match(T__37);
+ Match(ENUM);
State = 675;
+ Match(T__38);
+ State = 676;
Match(SQSTRING);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 676;
- Match(ENUM);
State = 677;
+ Match(ENUM);
+ State = 678;
className();
}
break;
@@ -2696,33 +2689,33 @@ public ModuleHeadContext moduleHead() {
ModuleHeadContext _localctx = new ModuleHeadContext(Context, State);
EnterRule(_localctx, 64, RULE_moduleHead);
try {
- State = 686;
+ State = 687;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,20,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 680;
- Match(MODULE);
State = 681;
- Match(T__38);
+ Match(MODULE);
State = 682;
+ Match(T__39);
+ State = 683;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 683;
- Match(MODULE);
State = 684;
+ Match(MODULE);
+ State = 685;
dottedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 685;
+ State = 686;
Match(MODULE);
}
break;
@@ -2769,19 +2762,19 @@ public VtfixupDeclContext vtfixupDecl() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 688;
- Match(T__39);
State = 689;
Match(T__40);
State = 690;
- int32();
- State = 691;
Match(T__41);
+ State = 691;
+ int32();
State = 692;
- vtfixupAttr(0);
- State = 693;
Match(T__42);
+ State = 693;
+ vtfixupAttr(0);
State = 694;
+ Match(T__43);
+ State = 695;
id();
}
}
@@ -2834,7 +2827,7 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
{
}
Context.Stop = TokenStream.LT(-1);
- State = 709;
+ State = 710;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,22,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
@@ -2843,16 +2836,16 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
TriggerExitRuleEvent();
_prevctx = _localctx;
{
- State = 707;
+ State = 708;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,21,Context) ) {
case 1:
{
_localctx = new VtfixupAttrContext(_parentctx, _parentState);
PushNewRecursionContext(_localctx, _startState, RULE_vtfixupAttr);
- State = 697;
- if (!(Precpred(Context, 5))) throw new FailedPredicateException(this, "Precpred(Context, 5)");
State = 698;
+ if (!(Precpred(Context, 5))) throw new FailedPredicateException(this, "Precpred(Context, 5)");
+ State = 699;
Match(INT32_);
}
break;
@@ -2860,9 +2853,9 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
{
_localctx = new VtfixupAttrContext(_parentctx, _parentState);
PushNewRecursionContext(_localctx, _startState, RULE_vtfixupAttr);
- State = 699;
- if (!(Precpred(Context, 4))) throw new FailedPredicateException(this, "Precpred(Context, 4)");
State = 700;
+ if (!(Precpred(Context, 4))) throw new FailedPredicateException(this, "Precpred(Context, 4)");
+ State = 701;
Match(INT64_);
}
break;
@@ -2870,36 +2863,36 @@ private VtfixupAttrContext vtfixupAttr(int _p) {
{
_localctx = new VtfixupAttrContext(_parentctx, _parentState);
PushNewRecursionContext(_localctx, _startState, RULE_vtfixupAttr);
- State = 701;
- if (!(Precpred(Context, 3))) throw new FailedPredicateException(this, "Precpred(Context, 3)");
State = 702;
- Match(T__43);
+ if (!(Precpred(Context, 3))) throw new FailedPredicateException(this, "Precpred(Context, 3)");
+ State = 703;
+ Match(T__44);
}
break;
case 4:
{
_localctx = new VtfixupAttrContext(_parentctx, _parentState);
PushNewRecursionContext(_localctx, _startState, RULE_vtfixupAttr);
- State = 703;
- if (!(Precpred(Context, 2))) throw new FailedPredicateException(this, "Precpred(Context, 2)");
State = 704;
- Match(T__44);
+ if (!(Precpred(Context, 2))) throw new FailedPredicateException(this, "Precpred(Context, 2)");
+ State = 705;
+ Match(T__45);
}
break;
case 5:
{
_localctx = new VtfixupAttrContext(_parentctx, _parentState);
PushNewRecursionContext(_localctx, _startState, RULE_vtfixupAttr);
- State = 705;
- if (!(Precpred(Context, 1))) throw new FailedPredicateException(this, "Precpred(Context, 1)");
State = 706;
- Match(T__45);
+ if (!(Precpred(Context, 1))) throw new FailedPredicateException(this, "Precpred(Context, 1)");
+ State = 707;
+ Match(T__46);
}
break;
}
- }
+ }
}
- State = 711;
+ State = 712;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,22,Context);
}
@@ -2940,16 +2933,16 @@ public VtableDeclContext vtableDecl() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 712;
- Match(T__46);
State = 713;
- Match(T__34);
+ Match(T__47);
State = 714;
- Match(T__28);
+ Match(T__35);
State = 715;
- bytes();
- State = 716;
Match(T__29);
+ State = 716;
+ bytes();
+ State = 717;
+ Match(T__30);
}
}
catch (RecognitionException re) {
@@ -2987,9 +2980,9 @@ public NameSpaceHeadContext nameSpaceHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 718;
- Match(T__47);
State = 719;
+ Match(T__48);
+ State = 720;
dottedName();
}
}
@@ -3040,35 +3033,33 @@ public override TResult Accept(IParseTreeVisitor visitor) {
public ClassHeadContext classHead() {
ClassHeadContext _localctx = new ClassHeadContext(Context, State);
EnterRule(_localctx, 74, RULE_classHead);
+ int _la;
try {
- int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 721;
- Match(T__48);
- State = 725;
+ State = 722;
+ Match(T__49);
+ State = 726;
ErrorHandler.Sync(this);
- _alt = Interpreter.AdaptivePredict(TokenStream,23,Context);
- while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
- if ( _alt==1 ) {
- {
- {
- State = 722;
- classAttr();
- }
- }
+ _la = TokenStream.LA(1);
+ while (((((_la - 15)) & ~0x3f) == 0 && ((1L << (_la - 15)) & 67835400667791361L) != 0) || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 35184409837577L) != 0)) {
+ {
+ {
+ State = 723;
+ classAttr();
+ }
}
- State = 727;
+ State = 728;
ErrorHandler.Sync(this);
- _alt = Interpreter.AdaptivePredict(TokenStream,23,Context);
+ _la = TokenStream.LA(1);
}
- State = 728;
- dottedName();
State = 729;
- typarsClause();
+ dottedName();
State = 730;
- extendsClause();
+ typarsClause();
State = 731;
+ extendsClause();
+ State = 732;
implClause();
}
}
@@ -3110,214 +3101,214 @@ public ClassAttrContext classAttr() {
ClassAttrContext _localctx = new ClassAttrContext(Context, State);
EnterRule(_localctx, 76, RULE_classAttr);
try {
- State = 770;
+ State = 771;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,24,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 733;
- Match(T__49);
+ State = 734;
+ Match(T__50);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 734;
- Match(T__50);
+ State = 735;
+ Match(T__51);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 735;
+ State = 736;
Match(VALUE);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 736;
+ State = 737;
Match(ENUM);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 737;
+ State = 738;
Match(INTERFACE);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 738;
- Match(T__51);
+ State = 739;
+ Match(T__52);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 739;
- Match(T__52);
+ State = 740;
+ Match(T__53);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 740;
- Match(T__53);
+ State = 741;
+ Match(T__54);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 741;
- Match(T__54);
+ State = 742;
+ Match(T__55);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 742;
+ State = 743;
Match(EXPLICIT);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 743;
+ State = 744;
Match(T__14);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 744;
+ State = 745;
Match(ANSI);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 745;
- Match(T__55);
+ State = 746;
+ Match(T__56);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 746;
- Match(T__56);
+ State = 747;
+ Match(T__57);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 747;
- Match(T__57);
+ State = 748;
+ Match(T__58);
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 748;
- Match(T__58);
+ State = 749;
+ Match(T__59);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 749;
- Match(T__59);
+ State = 750;
+ Match(T__60);
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 750;
- Match(T__60);
State = 751;
- Match(T__49);
+ Match(T__61);
+ State = 752;
+ Match(T__50);
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 752;
- Match(T__60);
State = 753;
- Match(T__50);
+ Match(T__61);
+ State = 754;
+ Match(T__51);
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 754;
- Match(T__60);
State = 755;
Match(T__61);
+ State = 756;
+ Match(T__62);
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 756;
- Match(T__60);
State = 757;
- Match(T__62);
+ Match(T__61);
+ State = 758;
+ Match(T__63);
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 758;
- Match(T__60);
State = 759;
- Match(T__63);
+ Match(T__61);
+ State = 760;
+ Match(T__64);
}
break;
case 23:
EnterOuterAlt(_localctx, 23);
{
- State = 760;
- Match(T__60);
State = 761;
- Match(T__64);
+ Match(T__61);
+ State = 762;
+ Match(T__65);
}
break;
case 24:
EnterOuterAlt(_localctx, 24);
{
- State = 762;
- Match(T__65);
+ State = 763;
+ Match(T__66);
}
break;
case 25:
EnterOuterAlt(_localctx, 25);
{
- State = 763;
- Match(T__66);
+ State = 764;
+ Match(T__67);
}
break;
case 26:
EnterOuterAlt(_localctx, 26);
{
- State = 764;
- Match(T__67);
+ State = 765;
+ Match(T__68);
}
break;
case 27:
EnterOuterAlt(_localctx, 27);
{
- State = 765;
- Match(T__68);
State = 766;
- Match(T__28);
+ Match(T__69);
State = 767;
- int32();
- State = 768;
Match(T__29);
+ State = 768;
+ int32();
+ State = 769;
+ Match(T__30);
}
break;
}
@@ -3355,21 +3346,21 @@ public ExtendsClauseContext extendsClause() {
ExtendsClauseContext _localctx = new ExtendsClauseContext(Context, State);
EnterRule(_localctx, 78, RULE_extendsClause);
try {
- State = 775;
+ State = 776;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
- case T__70:
+ case T__16:
+ case T__71:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__69:
+ case T__70:
EnterOuterAlt(_localctx, 2);
{
- State = 773;
- Match(T__69);
State = 774;
+ Match(T__70);
+ State = 775;
typeSpec();
}
break;
@@ -3410,20 +3401,20 @@ public ImplClauseContext implClause() {
ImplClauseContext _localctx = new ImplClauseContext(Context, State);
EnterRule(_localctx, 80, RULE_implClause);
try {
- State = 780;
+ State = 781;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
+ case T__16:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__70:
+ case T__71:
EnterOuterAlt(_localctx, 2);
{
- State = 778;
- Match(T__70);
State = 779;
+ Match(T__71);
+ State = 780;
implList();
}
break;
@@ -3470,17 +3461,17 @@ public ClassDeclsContext classDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 785;
+ State = 786;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 562969347883008L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 2378375592274821123L) != 0) || ((((_la - 139)) & ~0x3f) == 0 && ((1L << (_la - 139)) & 576460752370532353L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 871552083145265153L) != 0)) {
+ while (((((_la - 16)) & ~0x3f) == 0 && ((1L << (_la - 16)) & 432345581408028673L) != 0) || ((((_la - 117)) & ~0x3f) == 0 && ((1L << (_la - 117)) & 281474980972571L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 871552083145265153L) != 0)) {
{
{
- State = 782;
+ State = 783;
classDecl();
}
}
- State = 787;
+ State = 788;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -3525,25 +3516,25 @@ public ImplListContext implList() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 793;
+ State = 794;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,28,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 788;
- typeSpec();
State = 789;
- Match(T__26);
+ typeSpec();
+ State = 790;
+ Match(T__27);
+ }
}
- }
}
- State = 795;
+ State = 796;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,28,Context);
}
- State = 796;
+ State = 797;
typeSpec();
}
}
@@ -3580,9 +3571,9 @@ public EsHeadContext esHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 798;
+ State = 799;
_la = TokenStream.LA(1);
- if ( !(_la==T__71 || _la==T__72) ) {
+ if ( !(_la==T__72 || _la==T__73) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -3632,257 +3623,181 @@ public ExtSourceSpecContext extSourceSpec() {
ExtSourceSpecContext _localctx = new ExtSourceSpecContext(Context, State);
EnterRule(_localctx, 88, RULE_extSourceSpec);
try {
- State = 903;
+ State = 872;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,29,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 800;
- esHead();
State = 801;
- int32();
+ esHead();
State = 802;
+ int32();
+ State = 803;
Match(SQSTRING);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 804;
- esHead();
State = 805;
+ esHead();
+ State = 806;
int32();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 807;
- esHead();
State = 808;
- int32();
+ esHead();
State = 809;
- Match(T__73);
- State = 810;
int32();
+ State = 810;
+ Match(T__74);
State = 811;
+ int32();
+ State = 812;
Match(SQSTRING);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 813;
- esHead();
State = 814;
- int32();
+ esHead();
State = 815;
- Match(T__73);
+ int32();
State = 816;
+ Match(T__74);
+ State = 817;
int32();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 818;
- esHead();
State = 819;
- int32();
+ esHead();
State = 820;
- Match(T__73);
- State = 821;
int32();
+ State = 821;
+ Match(T__74);
State = 822;
- Match(T__26);
- State = 823;
int32();
+ State = 823;
+ Match(T__27);
State = 824;
+ int32();
+ State = 825;
Match(SQSTRING);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 826;
- esHead();
State = 827;
- int32();
+ esHead();
State = 828;
- Match(T__73);
- State = 829;
int32();
+ State = 829;
+ Match(T__74);
State = 830;
- Match(T__26);
+ int32();
State = 831;
+ Match(T__27);
+ State = 832;
int32();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 833;
- esHead();
State = 834;
- int32();
+ esHead();
State = 835;
- Match(T__26);
- State = 836;
int32();
+ State = 836;
+ Match(T__27);
State = 837;
- Match(T__73);
- State = 838;
int32();
+ State = 838;
+ Match(T__74);
State = 839;
+ int32();
+ State = 840;
Match(SQSTRING);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 841;
- esHead();
State = 842;
- int32();
+ esHead();
State = 843;
- Match(T__26);
- State = 844;
int32();
+ State = 844;
+ Match(T__27);
State = 845;
- Match(T__73);
+ int32();
State = 846;
+ Match(T__74);
+ State = 847;
int32();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 848;
- esHead();
State = 849;
- int32();
+ esHead();
State = 850;
- Match(T__26);
- State = 851;
int32();
+ State = 851;
+ Match(T__27);
State = 852;
- Match(T__73);
- State = 853;
int32();
+ State = 853;
+ Match(T__74);
State = 854;
- Match(T__26);
- State = 855;
int32();
+ State = 855;
+ Match(T__27);
State = 856;
+ int32();
+ State = 857;
Match(SQSTRING);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 858;
- esHead();
State = 859;
- int32();
+ esHead();
State = 860;
- Match(T__26);
- State = 861;
int32();
+ State = 861;
+ Match(T__27);
State = 862;
- Match(T__73);
- State = 863;
int32();
+ State = 863;
+ Match(T__74);
State = 864;
- Match(T__26);
+ int32();
State = 865;
+ Match(T__27);
+ State = 866;
int32();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 867;
- esHead();
State = 868;
- int32();
- State = 869;
- Match(QSTRING);
- }
- break;
- case 12:
- EnterOuterAlt(_localctx, 12);
- {
- State = 871;
- esHead();
- State = 872;
- int32();
- State = 873;
- Match(T__73);
- State = 874;
- int32();
- State = 875;
- Match(QSTRING);
- }
- break;
- case 13:
- EnterOuterAlt(_localctx, 13);
- {
- State = 877;
- esHead();
- State = 878;
- int32();
- State = 879;
- Match(T__73);
- State = 880;
- int32();
- State = 881;
- Match(T__26);
- State = 882;
- int32();
- State = 883;
- Match(QSTRING);
- }
- break;
- case 14:
- EnterOuterAlt(_localctx, 14);
- {
- State = 885;
- esHead();
- State = 886;
- int32();
- State = 887;
- Match(T__26);
- State = 888;
- int32();
- State = 889;
- Match(T__73);
- State = 890;
- int32();
- State = 891;
- Match(QSTRING);
- }
- break;
- case 15:
- EnterOuterAlt(_localctx, 15);
- {
- State = 893;
esHead();
- State = 894;
- int32();
- State = 895;
- Match(T__26);
- State = 896;
- int32();
- State = 897;
- Match(T__73);
- State = 898;
- int32();
- State = 899;
- Match(T__26);
- State = 900;
+ State = 869;
int32();
- State = 901;
+ State = 870;
Match(QSTRING);
}
break;
@@ -3938,68 +3853,68 @@ public FileDeclContext fileDecl() {
EnterRule(_localctx, 90, RULE_fileDecl);
int _la;
try {
- State = 931;
+ State = 900;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,32,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 905;
- Match(T__19);
- State = 909;
+ State = 874;
+ Match(T__20);
+ State = 878;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__74) {
+ while (_la==T__75) {
{
{
- State = 906;
+ State = 875;
fileAttr();
}
}
- State = 911;
+ State = 880;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 912;
+ State = 881;
dottedName();
- State = 913;
+ State = 882;
fileEntry();
- State = 914;
+ State = 883;
Match(HASH);
- State = 915;
- Match(T__34);
- State = 916;
- Match(T__28);
- State = 917;
- bytes();
- State = 918;
+ State = 884;
+ Match(T__35);
+ State = 885;
Match(T__29);
- State = 919;
+ State = 886;
+ bytes();
+ State = 887;
+ Match(T__30);
+ State = 888;
fileEntry();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 921;
- Match(T__19);
- State = 925;
+ State = 890;
+ Match(T__20);
+ State = 894;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__74) {
+ while (_la==T__75) {
{
{
- State = 922;
+ State = 891;
fileAttr();
}
}
- State = 927;
+ State = 896;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 928;
+ State = 897;
dottedName();
- State = 929;
+ State = 898;
fileEntry();
}
break;
@@ -4037,8 +3952,8 @@ public FileAttrContext fileAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 933;
- Match(T__74);
+ State = 902;
+ Match(T__75);
}
}
catch (RecognitionException re) {
@@ -4072,34 +3987,34 @@ public FileEntryContext fileEntry() {
FileEntryContext _localctx = new FileEntryContext(Context, State);
EnterRule(_localctx, 94, RULE_fileEntry);
try {
- State = 937;
+ State = 906;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__16:
+ case T__15:
case T__17:
case T__18:
case T__19:
- case T__21:
+ case T__20:
case T__22:
case T__23:
case T__24:
case T__25:
- case T__27:
- case T__30:
+ case T__26:
+ case T__28:
case T__31:
- case T__33:
- case T__39:
- case T__46:
+ case T__32:
+ case T__34:
+ case T__40:
case T__47:
case T__48:
- case T__71:
+ case T__49:
case T__72:
- case T__119:
+ case T__73:
+ case T__120:
case T__138:
case T__164:
case HASH:
case MODULE:
- case VALUE:
case INSTANCE:
case SQSTRING:
case PP_DEFINE:
@@ -4121,7 +4036,7 @@ public FileEntryContext fileEntry() {
case ENTRYPOINT:
EnterOuterAlt(_localctx, 2);
{
- State = 936;
+ State = 905;
Match(ENTRYPOINT);
}
break;
@@ -4162,9 +4077,9 @@ public AsmAttrAnyContext asmAttrAny() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 939;
+ State = 908;
_la = TokenStream.LA(1);
- if ( !(_la==T__1 || _la==T__59 || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & 127L) != 0)) ) {
+ if ( !(_la==T__1 || _la==T__60 || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 127L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -4212,17 +4127,17 @@ public AsmAttrContext asmAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 944;
+ State = 913;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__1 || _la==T__59 || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & 127L) != 0)) {
+ while (_la==T__1 || _la==T__60 || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 127L) != 0)) {
{
{
- State = 941;
+ State = 910;
asmAttrAny();
}
}
- State = 946;
+ State = 915;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -4261,7 +4176,7 @@ public Instr_noneContext instr_none() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 947;
+ State = 916;
Match(INSTR_NONE);
}
}
@@ -4298,7 +4213,7 @@ public Instr_varContext instr_var() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 949;
+ State = 918;
Match(INSTR_VAR);
}
}
@@ -4335,7 +4250,7 @@ public Instr_iContext instr_i() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 951;
+ State = 920;
Match(INSTR_I);
}
}
@@ -4372,7 +4287,7 @@ public Instr_i8Context instr_i8() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 953;
+ State = 922;
Match(INSTR_I8);
}
}
@@ -4409,7 +4324,7 @@ public Instr_rContext instr_r() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 955;
+ State = 924;
Match(INSTR_R);
}
}
@@ -4446,7 +4361,7 @@ public Instr_brtargetContext instr_brtarget() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 957;
+ State = 926;
Match(INSTR_BRTARGET);
}
}
@@ -4483,7 +4398,7 @@ public Instr_methodContext instr_method() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 959;
+ State = 928;
Match(INSTR_METHOD);
}
}
@@ -4520,7 +4435,7 @@ public Instr_fieldContext instr_field() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 961;
+ State = 930;
Match(INSTR_FIELD);
}
}
@@ -4557,7 +4472,7 @@ public Instr_typeContext instr_type() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 963;
+ State = 932;
Match(INSTR_TYPE);
}
}
@@ -4594,7 +4509,7 @@ public Instr_stringContext instr_string() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 965;
+ State = 934;
Match(INSTR_STRING);
}
}
@@ -4631,7 +4546,7 @@ public Instr_sigContext instr_sig() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 967;
+ State = 936;
Match(INSTR_SIG);
}
}
@@ -4668,7 +4583,7 @@ public Instr_tokContext instr_tok() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 969;
+ State = 938;
Match(INSTR_TOK);
}
}
@@ -4705,7 +4620,7 @@ public Instr_switchContext instr_switch() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 971;
+ State = 940;
Match(INSTR_SWITCH);
}
}
@@ -4824,233 +4739,242 @@ public InstrContext instr() {
InstrContext _localctx = new InstrContext(Context, State);
EnterRule(_localctx, 126, RULE_instr);
try {
- State = 1052;
+ State = 1024;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,35,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 973;
+ State = 942;
instr_none();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 974;
+ State = 943;
instr_var();
- State = 975;
+ State = 944;
int32();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 977;
+ State = 946;
instr_var();
- State = 978;
+ State = 947;
id();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 980;
+ State = 949;
instr_i();
- State = 981;
+ State = 950;
int32();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 983;
+ State = 952;
instr_i8();
- State = 984;
+ State = 953;
int64();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 986;
+ State = 955;
instr_r();
- State = 987;
+ State = 956;
float64();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 989;
+ State = 958;
instr_r();
- State = 990;
+ State = 959;
int64();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 992;
+ State = 961;
instr_r();
- State = 993;
- Match(T__28);
- State = 994;
- bytes();
- State = 995;
+ State = 962;
Match(T__29);
+ State = 963;
+ bytes();
+ State = 964;
+ Match(T__30);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 997;
+ State = 966;
instr_r();
- State = 998;
- Match(T__82);
- State = 999;
- Match(T__28);
- State = 1000;
- bytes();
- State = 1001;
+ State = 967;
+ Match(T__83);
+ State = 968;
Match(T__29);
+ State = 969;
+ bytes();
+ State = 970;
+ Match(T__30);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1003;
+ State = 972;
instr_brtarget();
- State = 1004;
+ State = 973;
int32();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1006;
+ State = 975;
instr_brtarget();
- State = 1007;
+ State = 976;
id();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1009;
+ State = 978;
instr_method();
- State = 1010;
+ State = 979;
methodRef();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1012;
+ State = 981;
instr_field();
- State = 1013;
+ State = 982;
fieldRef();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1015;
+ State = 984;
instr_field();
- State = 1016;
+ State = 985;
mdtoken();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1018;
+ State = 987;
instr_type();
- State = 1019;
+ State = 988;
typeSpec();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1021;
+ State = 990;
instr_string();
- State = 1022;
+ State = 991;
compQstring();
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1024;
+ State = 993;
instr_string();
- State = 1025;
+ State = 994;
Match(ANSI);
- State = 1026;
- Match(T__28);
- State = 1027;
- compQstring();
- State = 1028;
+ State = 995;
Match(T__29);
+ State = 996;
+ compQstring();
+ State = 997;
+ Match(T__30);
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 1030;
+ State = 999;
instr_string();
- State = 1031;
- Match(T__82);
- State = 1032;
- Match(T__28);
- State = 1033;
- bytes();
- State = 1034;
+ State = 1000;
+ Match(T__83);
+ State = 1001;
Match(T__29);
+ State = 1002;
+ bytes();
+ State = 1003;
+ Match(T__30);
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 1036;
+ State = 1005;
instr_sig();
- State = 1037;
+ State = 1006;
callConv();
- State = 1038;
+ State = 1007;
type();
- State = 1039;
+ State = 1008;
sigArgs();
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 1041;
+ State = 1010;
instr_tok();
- State = 1042;
+ State = 1011;
ownerType();
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 1044;
- instr_switch();
- State = 1045;
- Match(T__28);
- State = 1046;
- labels();
- State = 1047;
- Match(T__29);
+ State = 1013;
+ instr_tok();
+ State = 1014;
+ int32();
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 1049;
+ State = 1016;
instr_switch();
- State = 1050;
- Match(T__83);
+ State = 1017;
+ Match(T__29);
+ State = 1018;
+ labels();
+ State = 1019;
+ Match(T__30);
+ }
+ break;
+ case 23:
+ EnterOuterAlt(_localctx, 23);
+ {
+ State = 1021;
+ instr_switch();
+ State = 1022;
+ Match(T__84);
}
break;
}
@@ -5098,10 +5022,10 @@ public LabelsContext labels() {
EnterRule(_localctx, 128, RULE_labels);
try {
int _alt;
- State = 1070;
+ State = 1042;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__29:
+ case T__30:
EnterOuterAlt(_localctx, 1);
{
}
@@ -5122,21 +5046,20 @@ public LabelsContext labels() {
case T__13:
case T__14:
case INT32:
- case VALUE:
case INSTANCE:
case UNMANAGED:
case SQSTRING:
case ID:
EnterOuterAlt(_localctx, 2);
{
- State = 1063;
+ State = 1035;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,37,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1057;
+ State = 1029;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -5154,35 +5077,34 @@ public LabelsContext labels() {
case T__12:
case T__13:
case T__14:
- case VALUE:
case INSTANCE:
case UNMANAGED:
case SQSTRING:
case ID:
{
- State = 1055;
+ State = 1027;
id();
}
break;
case INT32:
{
- State = 1056;
+ State = 1028;
int32();
}
break;
default:
throw new NoViableAltException(this);
}
- State = 1059;
- Match(T__26);
+ State = 1031;
+ Match(T__27);
+ }
}
- }
}
- State = 1065;
+ State = 1037;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,37,Context);
}
- State = 1068;
+ State = 1040;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -5200,19 +5122,18 @@ public LabelsContext labels() {
case T__12:
case T__13:
case T__14:
- case VALUE:
case INSTANCE:
case UNMANAGED:
case SQSTRING:
case ID:
{
- State = 1066;
+ State = 1038;
id();
}
break;
case INT32:
{
- State = 1067;
+ State = 1039;
int32();
}
break;
@@ -5264,30 +5185,30 @@ public TypeArgsContext typeArgs() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1072;
- Match(T__84);
- State = 1078;
+ State = 1044;
+ Match(T__85);
+ State = 1050;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,40,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1073;
+ State = 1045;
type();
- State = 1074;
- Match(T__26);
+ State = 1046;
+ Match(T__27);
+ }
}
- }
}
- State = 1080;
+ State = 1052;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,40,Context);
}
- State = 1081;
+ State = 1053;
type();
- State = 1082;
- Match(T__85);
+ State = 1054;
+ Match(T__86);
}
}
catch (RecognitionException re) {
@@ -5329,30 +5250,30 @@ public BoundsContext bounds() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1084;
- Match(T__40);
- State = 1090;
+ State = 1056;
+ Match(T__41);
+ State = 1062;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,41,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1085;
+ State = 1057;
bound();
- State = 1086;
- Match(T__26);
+ State = 1058;
+ Match(T__27);
+ }
}
- }
}
- State = 1092;
+ State = 1064;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,41,Context);
}
- State = 1093;
+ State = 1065;
bound();
- State = 1094;
- Match(T__41);
+ State = 1066;
+ Match(T__42);
}
}
catch (RecognitionException re) {
@@ -5392,43 +5313,43 @@ public SigArgsContext sigArgs() {
EnterRule(_localctx, 134, RULE_sigArgs);
try {
int _alt;
- State = 1109;
+ State = 1081;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__28:
+ case T__29:
EnterOuterAlt(_localctx, 1);
{
- State = 1096;
- Match(T__28);
- State = 1102;
+ State = 1068;
+ Match(T__29);
+ State = 1074;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,42,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1097;
+ State = 1069;
sigArg();
- State = 1098;
- Match(T__26);
+ State = 1070;
+ Match(T__27);
+ }
}
- }
}
- State = 1104;
+ State = 1076;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,42,Context);
}
- State = 1105;
+ State = 1077;
sigArg();
- State = 1106;
- Match(T__29);
+ State = 1078;
+ Match(T__30);
}
break;
- case T__83:
+ case T__84:
EnterOuterAlt(_localctx, 2);
{
- State = 1108;
- Match(T__83);
+ State = 1080;
+ Match(T__84);
}
break;
default:
@@ -5479,31 +5400,31 @@ public SigArgContext sigArg() {
EnterRule(_localctx, 136, RULE_sigArg);
int _la;
try {
- State = 1118;
+ State = 1090;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,45,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1111;
+ State = 1083;
Match(ELLIPSIS);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1112;
+ State = 1084;
paramAttr();
- State = 1113;
+ State = 1085;
type();
- State = 1114;
+ State = 1086;
marshalClause();
- State = 1116;
+ State = 1088;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 198)) & ~0x3f) == 0 && ((1L << (_la - 198)) & 299067162755073L) != 0) || _la==SQSTRING || _la==ID) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 65534L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 70368746274833L) != 0)) {
{
- State = 1115;
+ State = 1087;
id();
}
}
@@ -5556,95 +5477,95 @@ public ClassNameContext className() {
ClassNameContext _localctx = new ClassNameContext(Context, State);
EnterRule(_localctx, 138, RULE_className);
try {
- State = 1145;
+ State = 1117;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,46,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1120;
- Match(T__40);
- State = 1121;
- dottedName();
- State = 1122;
+ State = 1092;
Match(T__41);
- State = 1123;
+ State = 1093;
+ dottedName();
+ State = 1094;
+ Match(T__42);
+ State = 1095;
slashedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1125;
- Match(T__40);
- State = 1126;
- mdtoken();
- State = 1127;
+ State = 1097;
Match(T__41);
- State = 1128;
+ State = 1098;
+ mdtoken();
+ State = 1099;
+ Match(T__42);
+ State = 1100;
slashedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1130;
- Match(T__40);
- State = 1131;
- Match(PTR);
- State = 1132;
+ State = 1102;
Match(T__41);
- State = 1133;
+ State = 1103;
+ Match(PTR);
+ State = 1104;
+ Match(T__42);
+ State = 1105;
slashedName();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1134;
- Match(T__40);
- State = 1135;
+ State = 1106;
+ Match(T__41);
+ State = 1107;
Match(MODULE);
- State = 1136;
+ State = 1108;
dottedName();
- State = 1137;
- Match(T__41);
- State = 1138;
+ State = 1109;
+ Match(T__42);
+ State = 1110;
slashedName();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1140;
+ State = 1112;
slashedName();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1141;
+ State = 1113;
mdtoken();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1142;
+ State = 1114;
Match(THIS);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1143;
+ State = 1115;
Match(BASE);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1144;
+ State = 1116;
Match(NESTER);
}
break;
@@ -5689,25 +5610,25 @@ public SlashedNameContext slashedName() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1152;
+ State = 1124;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,47,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1147;
+ State = 1119;
dottedName();
- State = 1148;
- Match(T__86);
+ State = 1120;
+ Match(T__87);
+ }
}
- }
}
- State = 1154;
+ State = 1126;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,47,Context);
}
- State = 1155;
+ State = 1127;
dottedName();
}
}
@@ -5750,17 +5671,17 @@ public AssemblyDeclsContext assemblyDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1160;
+ State = 1132;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__30 || _la==T__33 || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 2147487751L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 6860954690125825L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38654771200L) != 0) || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 4103L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 6860954690125825L) != 0)) {
{
{
- State = 1157;
+ State = 1129;
assemblyDecl();
}
}
- State = 1162;
+ State = 1134;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -5806,18 +5727,18 @@ public AssemblyDeclContext assemblyDecl() {
AssemblyDeclContext _localctx = new AssemblyDeclContext(Context, State);
EnterRule(_localctx, 144, RULE_assemblyDecl);
try {
- State = 1168;
+ State = 1140;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case HASH:
EnterOuterAlt(_localctx, 1);
{
{
- State = 1163;
+ State = 1135;
Match(HASH);
- State = 1164;
- Match(T__87);
- State = 1165;
+ State = 1136;
+ Match(T__88);
+ State = 1137;
int32();
}
}
@@ -5826,16 +5747,16 @@ public AssemblyDeclContext assemblyDecl() {
case PERMISSIONSET:
EnterOuterAlt(_localctx, 2);
{
- State = 1166;
+ State = 1138;
secDecl();
}
break;
- case T__30:
- case T__33:
+ case T__15:
+ case T__31:
+ case T__34:
case T__166:
case T__167:
case T__168:
- case VALUE:
case INSTANCE:
case SQSTRING:
case PP_DEFINE:
@@ -5849,7 +5770,7 @@ public AssemblyDeclContext assemblyDecl() {
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 1167;
+ State = 1139;
asmOrRefDecl();
}
break;
@@ -5897,44 +5818,44 @@ public TypeSpecContext typeSpec() {
TypeSpecContext _localctx = new TypeSpecContext(Context, State);
EnterRule(_localctx, 146, RULE_typeSpec);
try {
- State = 1181;
+ State = 1153;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,50,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1170;
+ State = 1142;
className();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1171;
- Match(T__40);
- State = 1172;
- dottedName();
- State = 1173;
+ State = 1143;
Match(T__41);
+ State = 1144;
+ dottedName();
+ State = 1145;
+ Match(T__42);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1175;
- Match(T__40);
- State = 1176;
+ State = 1147;
+ Match(T__41);
+ State = 1148;
Match(MODULE);
- State = 1177;
+ State = 1149;
dottedName();
- State = 1178;
- Match(T__41);
+ State = 1150;
+ Match(T__42);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1180;
+ State = 1152;
type();
}
break;
@@ -5980,7 +5901,7 @@ public NativeTypeContext nativeType() {
EnterRule(_localctx, 148, RULE_nativeType);
try {
int _alt;
- State = 1191;
+ State = 1163;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,52,Context) ) {
case 1:
@@ -5991,21 +5912,21 @@ public NativeTypeContext nativeType() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1184;
+ State = 1156;
nativeTypeElement();
- State = 1188;
+ State = 1160;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,51,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1185;
+ State = 1157;
nativeTypeArrayPointerInfo();
}
- }
+ }
}
- State = 1190;
+ State = 1162;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,51,Context);
}
@@ -6030,7 +5951,7 @@ public NativeTypeArrayPointerInfoContext(ParserRuleContext parent, int invokingS
{
}
public override int RuleIndex { get { return RULE_nativeTypeArrayPointerInfo; } }
-
+
public NativeTypeArrayPointerInfoContext() { }
public virtual void CopyFrom(NativeTypeArrayPointerInfoContext context) {
base.CopyFrom(context);
@@ -6103,14 +6024,14 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
NativeTypeArrayPointerInfoContext _localctx = new NativeTypeArrayPointerInfoContext(Context, State);
EnterRule(_localctx, 150, RULE_nativeTypeArrayPointerInfo);
try {
- State = 1210;
+ State = 1182;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,53,Context) ) {
case 1:
_localctx = new PointerNativeTypeContext(_localctx);
EnterOuterAlt(_localctx, 1);
{
- State = 1193;
+ State = 1165;
Match(PTR);
}
break;
@@ -6118,7 +6039,7 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
_localctx = new PointerArrayTypeNoSizeDataContext(_localctx);
EnterOuterAlt(_localctx, 2);
{
- State = 1194;
+ State = 1166;
Match(ARRAY_TYPE_NO_BOUNDS);
}
break;
@@ -6126,42 +6047,42 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
_localctx = new PointerArrayTypeSizeContext(_localctx);
EnterOuterAlt(_localctx, 3);
{
- State = 1195;
- Match(T__40);
- State = 1196;
- int32();
- State = 1197;
+ State = 1167;
Match(T__41);
+ State = 1168;
+ int32();
+ State = 1169;
+ Match(T__42);
}
break;
case 4:
_localctx = new PointerArrayTypeSizeParamIndexContext(_localctx);
EnterOuterAlt(_localctx, 4);
{
- State = 1199;
- Match(T__40);
- State = 1200;
+ State = 1171;
+ Match(T__41);
+ State = 1172;
int32();
- State = 1201;
+ State = 1173;
Match(PLUS);
- State = 1202;
+ State = 1174;
int32();
- State = 1203;
- Match(T__41);
+ State = 1175;
+ Match(T__42);
}
break;
case 5:
_localctx = new PointerArrayTypeParamIndexContext(_localctx);
EnterOuterAlt(_localctx, 5);
{
- State = 1205;
- Match(T__40);
- State = 1206;
+ State = 1177;
+ Match(T__41);
+ State = 1178;
Match(PLUS);
- State = 1207;
+ State = 1179;
int32();
- State = 1208;
- Match(T__41);
+ State = 1180;
+ Match(T__42);
}
break;
}
@@ -6179,6 +6100,7 @@ public NativeTypeArrayPointerInfoContext nativeTypeArrayPointerInfo() {
public partial class NativeTypeElementContext : ParserRuleContext {
public IToken marshalType;
+ public IToken unsignedMarshalType;
public IToken marshalBool;
[System.Diagnostics.DebuggerNonUserCode] public CompQstringContext[] compQstring() {
return GetRuleContexts();
@@ -6259,7 +6181,7 @@ public NativeTypeElementContext nativeTypeElement() {
NativeTypeElementContext _localctx = new NativeTypeElementContext(Context, State);
EnterRule(_localctx, 152, RULE_nativeTypeElement);
try {
- State = 1296;
+ State = 1276;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,54,Context) ) {
case 1:
@@ -6270,376 +6192,412 @@ public NativeTypeElementContext nativeTypeElement() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1213;
+ State = 1185;
_localctx.marshalType = Match(CUSTOM);
- State = 1214;
- Match(T__28);
- State = 1215;
+ State = 1186;
+ Match(T__29);
+ State = 1187;
compQstring();
- State = 1216;
- Match(T__26);
- State = 1217;
+ State = 1188;
+ Match(T__27);
+ State = 1189;
compQstring();
- State = 1218;
- Match(T__26);
- State = 1219;
+ State = 1190;
+ Match(T__27);
+ State = 1191;
compQstring();
- State = 1220;
- Match(T__26);
- State = 1221;
+ State = 1192;
+ Match(T__27);
+ State = 1193;
compQstring();
- State = 1222;
- Match(T__29);
+ State = 1194;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1224;
+ State = 1196;
_localctx.marshalType = Match(CUSTOM);
- State = 1225;
- Match(T__28);
- State = 1226;
+ State = 1197;
+ Match(T__29);
+ State = 1198;
compQstring();
- State = 1227;
- Match(T__26);
- State = 1228;
+ State = 1199;
+ Match(T__27);
+ State = 1200;
compQstring();
- State = 1229;
- Match(T__29);
+ State = 1201;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1231;
+ State = 1203;
Match(FIXED);
- State = 1232;
+ State = 1204;
_localctx.marshalType = Match(SYSSTRING);
- State = 1233;
- Match(T__40);
- State = 1234;
- int32();
- State = 1235;
+ State = 1205;
Match(T__41);
+ State = 1206;
+ int32();
+ State = 1207;
+ Match(T__42);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1237;
+ State = 1209;
Match(FIXED);
- State = 1238;
+ State = 1210;
_localctx.marshalType = Match(ARRAY);
- State = 1239;
- Match(T__40);
- State = 1240;
- int32();
- State = 1241;
+ State = 1211;
Match(T__41);
- State = 1242;
+ State = 1212;
+ int32();
+ State = 1213;
+ Match(T__42);
+ State = 1214;
nativeType();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1244;
+ State = 1216;
_localctx.marshalType = Match(VARIANT);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1245;
+ State = 1217;
_localctx.marshalType = Match(CURRENCY);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1246;
+ State = 1218;
_localctx.marshalType = Match(SYSCHAR);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1247;
+ State = 1219;
_localctx.marshalType = Match(VOID);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1248;
+ State = 1220;
_localctx.marshalType = Match(BOOL);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1249;
+ State = 1221;
_localctx.marshalType = Match(INT8);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1250;
+ State = 1222;
_localctx.marshalType = Match(INT16);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1251;
+ State = 1223;
_localctx.marshalType = Match(INT32_);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1252;
+ State = 1224;
_localctx.marshalType = Match(INT64_);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1253;
+ State = 1225;
_localctx.marshalType = Match(FLOAT32);
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1254;
+ State = 1226;
_localctx.marshalType = Match(FLOAT64_);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1255;
+ State = 1227;
_localctx.marshalType = Match(ERROR);
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 1256;
+ State = 1228;
_localctx.marshalType = Match(UINT8);
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 1257;
+ State = 1229;
_localctx.marshalType = Match(UINT16);
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 1258;
+ State = 1230;
_localctx.marshalType = Match(UINT32);
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 1259;
+ State = 1231;
_localctx.marshalType = Match(UINT64);
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 1260;
+ State = 1232;
_localctx.marshalType = Match(DECIMAL);
}
break;
case 23:
EnterOuterAlt(_localctx, 23);
{
- State = 1261;
+ State = 1233;
_localctx.marshalType = Match(DATE);
}
break;
case 24:
EnterOuterAlt(_localctx, 24);
{
- State = 1262;
+ State = 1234;
_localctx.marshalType = Match(BSTR);
}
break;
case 25:
EnterOuterAlt(_localctx, 25);
{
- State = 1263;
+ State = 1235;
_localctx.marshalType = Match(LPSTR);
}
break;
case 26:
EnterOuterAlt(_localctx, 26);
{
- State = 1264;
+ State = 1236;
_localctx.marshalType = Match(LPWSTR);
}
break;
case 27:
EnterOuterAlt(_localctx, 27);
{
- State = 1265;
+ State = 1237;
_localctx.marshalType = Match(LPTSTR);
}
break;
case 28:
EnterOuterAlt(_localctx, 28);
{
- State = 1266;
+ State = 1238;
_localctx.marshalType = Match(OBJECTREF);
}
break;
case 29:
EnterOuterAlt(_localctx, 29);
{
- State = 1267;
+ State = 1239;
_localctx.marshalType = Match(IUNKNOWN);
- State = 1268;
+ State = 1240;
iidParamIndex();
}
break;
case 30:
EnterOuterAlt(_localctx, 30);
{
- State = 1269;
+ State = 1241;
_localctx.marshalType = Match(IDISPATCH);
- State = 1270;
+ State = 1242;
iidParamIndex();
}
break;
case 31:
EnterOuterAlt(_localctx, 31);
{
- State = 1271;
+ State = 1243;
_localctx.marshalType = Match(STRUCT);
}
break;
case 32:
EnterOuterAlt(_localctx, 32);
{
- State = 1272;
+ State = 1244;
_localctx.marshalType = Match(INTERFACE);
- State = 1273;
+ State = 1245;
iidParamIndex();
}
break;
case 33:
EnterOuterAlt(_localctx, 33);
{
- State = 1274;
+ State = 1246;
_localctx.marshalType = Match(SAFEARRAY);
- State = 1275;
+ State = 1247;
variantType();
}
break;
case 34:
EnterOuterAlt(_localctx, 34);
{
- State = 1276;
+ State = 1248;
_localctx.marshalType = Match(SAFEARRAY);
- State = 1277;
+ State = 1249;
variantType();
- State = 1278;
- Match(T__26);
- State = 1279;
+ State = 1250;
+ Match(T__27);
+ State = 1251;
compQstring();
}
break;
case 35:
EnterOuterAlt(_localctx, 35);
{
- State = 1281;
+ State = 1253;
_localctx.marshalType = Match(INT);
}
break;
case 36:
EnterOuterAlt(_localctx, 36);
{
- State = 1282;
+ State = 1254;
_localctx.marshalType = Match(UINT);
}
break;
case 37:
EnterOuterAlt(_localctx, 37);
{
- State = 1283;
- Match(T__60);
- State = 1284;
- _localctx.marshalType = Match(STRUCT);
+ State = 1255;
+ Match(T__89);
+ State = 1256;
+ _localctx.unsignedMarshalType = Match(INT8);
}
break;
case 38:
EnterOuterAlt(_localctx, 38);
{
- State = 1285;
- _localctx.marshalType = Match(BYVALSTR);
+ State = 1257;
+ Match(T__89);
+ State = 1258;
+ _localctx.unsignedMarshalType = Match(INT16);
}
break;
case 39:
EnterOuterAlt(_localctx, 39);
{
- State = 1286;
- Match(ANSI);
- State = 1287;
- _localctx.marshalType = Match(BSTR);
+ State = 1259;
+ Match(T__89);
+ State = 1260;
+ _localctx.unsignedMarshalType = Match(INT32_);
}
break;
case 40:
EnterOuterAlt(_localctx, 40);
{
- State = 1288;
- _localctx.marshalType = Match(TBSTR);
+ State = 1261;
+ Match(T__89);
+ State = 1262;
+ _localctx.unsignedMarshalType = Match(INT64_);
}
break;
case 41:
EnterOuterAlt(_localctx, 41);
{
- State = 1289;
- Match(VARIANT);
- State = 1290;
- _localctx.marshalBool = Match(BOOL);
+ State = 1263;
+ Match(T__61);
+ State = 1264;
+ _localctx.marshalType = Match(STRUCT);
}
break;
case 42:
EnterOuterAlt(_localctx, 42);
{
- State = 1291;
- _localctx.marshalType = Match(METHOD);
+ State = 1265;
+ _localctx.marshalType = Match(BYVALSTR);
}
break;
case 43:
EnterOuterAlt(_localctx, 43);
{
- State = 1292;
- _localctx.marshalType = Match(LPSTRUCT);
+ State = 1266;
+ Match(ANSI);
+ State = 1267;
+ _localctx.marshalType = Match(BSTR);
}
break;
case 44:
EnterOuterAlt(_localctx, 44);
{
- State = 1293;
- Match(T__32);
- State = 1294;
- _localctx.marshalType = Match(ANY);
+ State = 1268;
+ _localctx.marshalType = Match(TBSTR);
}
break;
case 45:
EnterOuterAlt(_localctx, 45);
{
- State = 1295;
+ State = 1269;
+ Match(VARIANT);
+ State = 1270;
+ _localctx.marshalBool = Match(BOOL);
+ }
+ break;
+ case 46:
+ EnterOuterAlt(_localctx, 46);
+ {
+ State = 1271;
+ _localctx.marshalType = Match(METHOD);
+ }
+ break;
+ case 47:
+ EnterOuterAlt(_localctx, 47);
+ {
+ State = 1272;
+ _localctx.marshalType = Match(LPSTRUCT);
+ }
+ break;
+ case 48:
+ EnterOuterAlt(_localctx, 48);
+ {
+ State = 1273;
+ Match(T__33);
+ State = 1274;
+ _localctx.marshalType = Match(ANY);
+ }
+ break;
+ case 49:
+ EnterOuterAlt(_localctx, 49);
+ {
+ State = 1275;
dottedName();
}
break;
@@ -6678,30 +6636,30 @@ public IidParamIndexContext iidParamIndex() {
IidParamIndexContext _localctx = new IidParamIndexContext(Context, State);
EnterRule(_localctx, 154, RULE_iidParamIndex);
try {
- State = 1305;
+ State = 1285;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__29:
- case T__40:
+ case T__30:
+ case T__41:
case ARRAY_TYPE_NO_BOUNDS:
case PTR:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__28:
+ case T__29:
EnterOuterAlt(_localctx, 2);
{
- State = 1299;
- Match(T__28);
- State = 1300;
- Match(T__88);
- State = 1301;
- Match(T__34);
- State = 1302;
- int32();
- State = 1303;
+ State = 1279;
Match(T__29);
+ State = 1280;
+ Match(T__90);
+ State = 1281;
+ Match(T__35);
+ State = 1282;
+ int32();
+ State = 1283;
+ Match(T__30);
}
break;
default:
@@ -6755,7 +6713,7 @@ public VariantTypeContext variantType() {
int _la;
try {
int _alt;
- State = 1315;
+ State = 1295;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,57,Context) ) {
case 1:
@@ -6766,16 +6724,16 @@ public VariantTypeContext variantType() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1308;
+ State = 1288;
variantTypeElement();
- State = 1312;
+ State = 1292;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,56,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1309;
+ State = 1289;
_la = TokenStream.LA(1);
if ( !(((((_la - 228)) & ~0x3f) == 0 && ((1L << (_la - 228)) & 6442450945L) != 0)) ) {
ErrorHandler.RecoverInline(this);
@@ -6785,9 +6743,9 @@ public VariantTypeContext variantType() {
Consume();
}
}
- }
+ }
}
- State = 1314;
+ State = 1294;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,56,Context);
}
@@ -6868,7 +6826,7 @@ public VariantTypeElementContext variantTypeElement() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1317;
+ State = 1297;
_la = TokenStream.LA(1);
if ( !(((((_la - 177)) & ~0x3f) == 0 && ((1L << (_la - 177)) & -4482436704239647L) != 0) || _la==CLSID || _la==PTR) ) {
ErrorHandler.RecoverInline(this);
@@ -6921,21 +6879,21 @@ public TypeContext type() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1319;
+ State = 1299;
elementType();
- State = 1323;
+ State = 1303;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,58,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1320;
+ State = 1300;
typeModifiers();
}
- }
+ }
}
- State = 1325;
+ State = 1305;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,58,Context);
}
@@ -6958,7 +6916,7 @@ public TypeModifiersContext(ParserRuleContext parent, int invokingState)
{
}
public override int RuleIndex { get { return RULE_typeModifiers; } }
-
+
public TypeModifiersContext() { }
public virtual void CopyFrom(TypeModifiersContext context) {
base.CopyFrom(context);
@@ -7057,14 +7015,14 @@ public TypeModifiersContext typeModifiers() {
TypeModifiersContext _localctx = new TypeModifiersContext(Context, State);
EnterRule(_localctx, 162, RULE_typeModifiers);
try {
- State = 1344;
+ State = 1324;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,59,Context) ) {
case 1:
_localctx = new SZArrayModifierContext(_localctx);
EnterOuterAlt(_localctx, 1);
{
- State = 1326;
+ State = 1306;
Match(ARRAY_TYPE_NO_BOUNDS);
}
break;
@@ -7072,17 +7030,17 @@ public TypeModifiersContext typeModifiers() {
_localctx = new SZArrayModifierContext(_localctx);
EnterOuterAlt(_localctx, 2);
{
- State = 1327;
- Match(T__40);
- State = 1328;
+ State = 1307;
Match(T__41);
+ State = 1308;
+ Match(T__42);
}
break;
case 3:
_localctx = new ArrayModifierContext(_localctx);
EnterOuterAlt(_localctx, 3);
{
- State = 1329;
+ State = 1309;
bounds();
}
break;
@@ -7090,7 +7048,7 @@ public TypeModifiersContext typeModifiers() {
_localctx = new ByRefModifierContext(_localctx);
EnterOuterAlt(_localctx, 4);
{
- State = 1330;
+ State = 1310;
Match(REF);
}
break;
@@ -7098,7 +7056,7 @@ public TypeModifiersContext typeModifiers() {
_localctx = new PtrModifierContext(_localctx);
EnterOuterAlt(_localctx, 5);
{
- State = 1331;
+ State = 1311;
Match(PTR);
}
break;
@@ -7106,43 +7064,43 @@ public TypeModifiersContext typeModifiers() {
_localctx = new PinnedModifierContext(_localctx);
EnterOuterAlt(_localctx, 6);
{
- State = 1332;
- Match(T__89);
+ State = 1312;
+ Match(T__91);
}
break;
case 7:
_localctx = new RequiredModifierContext(_localctx);
EnterOuterAlt(_localctx, 7);
{
- State = 1333;
- Match(T__90);
- State = 1334;
- Match(T__28);
- State = 1335;
- typeSpec();
- State = 1336;
+ State = 1313;
+ Match(T__92);
+ State = 1314;
Match(T__29);
+ State = 1315;
+ typeSpec();
+ State = 1316;
+ Match(T__30);
}
break;
case 8:
_localctx = new OptionalModifierContext(_localctx);
EnterOuterAlt(_localctx, 8);
{
- State = 1338;
- Match(T__91);
- State = 1339;
- Match(T__28);
- State = 1340;
- typeSpec();
- State = 1341;
+ State = 1318;
+ Match(T__93);
+ State = 1319;
Match(T__29);
+ State = 1320;
+ typeSpec();
+ State = 1321;
+ Match(T__30);
}
break;
case 9:
_localctx = new GenericArgumentsModifierContext(_localctx);
EnterOuterAlt(_localctx, 9);
{
- State = 1343;
+ State = 1323;
typeArgs();
}
break;
@@ -7215,144 +7173,144 @@ public ElementTypeContext elementType() {
ElementTypeContext _localctx = new ElementTypeContext(Context, State);
EnterRule(_localctx, 164, RULE_elementType);
try {
- State = 1376;
+ State = 1356;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,60,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1346;
- Match(T__37);
- State = 1347;
+ State = 1326;
+ Match(T__38);
+ State = 1327;
className();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1348;
+ State = 1328;
Match(OBJECT);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1349;
+ State = 1329;
Match(VALUE);
- State = 1350;
- Match(T__37);
- State = 1351;
+ State = 1330;
+ Match(T__38);
+ State = 1331;
className();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1352;
+ State = 1332;
Match(VALUETYPE);
- State = 1353;
+ State = 1333;
className();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1354;
+ State = 1334;
Match(METHOD);
- State = 1355;
+ State = 1335;
callConv();
- State = 1356;
+ State = 1336;
type();
- State = 1357;
+ State = 1337;
Match(PTR);
- State = 1358;
+ State = 1338;
sigArgs();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1360;
+ State = 1340;
Match(METHOD_TYPE_PARAMETER);
- State = 1361;
+ State = 1341;
int32();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1362;
+ State = 1342;
Match(TYPE_PARAMETER);
- State = 1363;
+ State = 1343;
int32();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1364;
+ State = 1344;
Match(METHOD_TYPE_PARAMETER);
- State = 1365;
+ State = 1345;
dottedName();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1366;
+ State = 1346;
Match(TYPE_PARAMETER);
- State = 1367;
+ State = 1347;
dottedName();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1368;
+ State = 1348;
Match(TYPEDREF);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1369;
+ State = 1349;
Match(VOID);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1370;
+ State = 1350;
nativeInt();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1371;
+ State = 1351;
nativeUint();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1372;
+ State = 1352;
simpleType();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1373;
+ State = 1353;
dottedName();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1374;
+ State = 1354;
Match(ELLIPSIS);
- State = 1375;
+ State = 1355;
type();
}
break;
@@ -7401,133 +7359,133 @@ public SimpleTypeContext simpleType() {
SimpleTypeContext _localctx = new SimpleTypeContext(Context, State);
EnterRule(_localctx, 166, RULE_simpleType);
try {
- State = 1399;
+ State = 1379;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,61,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1378;
+ State = 1358;
Match(CHAR);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1379;
+ State = 1359;
Match(STRING);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1380;
+ State = 1360;
Match(BOOL);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1381;
+ State = 1361;
Match(INT8);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1382;
+ State = 1362;
Match(INT16);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1383;
+ State = 1363;
Match(INT32_);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1384;
+ State = 1364;
Match(INT64_);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1385;
+ State = 1365;
Match(FLOAT32);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1386;
+ State = 1366;
Match(FLOAT64_);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1387;
+ State = 1367;
Match(UINT8);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1388;
+ State = 1368;
Match(UINT16);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1389;
+ State = 1369;
Match(UINT32);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1390;
+ State = 1370;
Match(UINT64);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1391;
- Match(T__92);
- State = 1392;
+ State = 1371;
+ Match(T__89);
+ State = 1372;
Match(INT8);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1393;
- Match(T__92);
- State = 1394;
+ State = 1373;
+ Match(T__89);
+ State = 1374;
Match(INT16);
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1395;
- Match(T__92);
- State = 1396;
+ State = 1375;
+ Match(T__89);
+ State = 1376;
Match(INT32_);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1397;
- Match(T__92);
- State = 1398;
+ State = 1377;
+ Match(T__89);
+ State = 1378;
Match(INT64_);
}
break;
@@ -7570,7 +7528,7 @@ public BoundContext bound() {
BoundContext _localctx = new BoundContext(Context, State);
EnterRule(_localctx, 168, RULE_bound);
try {
- State = 1411;
+ State = 1391;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,62,Context) ) {
case 1:
@@ -7581,34 +7539,34 @@ public BoundContext bound() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1402;
+ State = 1382;
Match(ELLIPSIS);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1403;
+ State = 1383;
int32();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1404;
+ State = 1384;
int32();
- State = 1405;
+ State = 1385;
Match(ELLIPSIS);
- State = 1406;
+ State = 1386;
int32();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1408;
+ State = 1388;
int32();
- State = 1409;
+ State = 1389;
Match(ELLIPSIS);
}
break;
@@ -7647,9 +7605,9 @@ public NativeIntContext nativeInt() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1413;
+ State = 1393;
Match(T__0);
- State = 1414;
+ State = 1394;
Match(INT);
}
}
@@ -7687,22 +7645,22 @@ public NativeUintContext nativeUint() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1416;
+ State = 1396;
Match(T__0);
- State = 1420;
+ State = 1400;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__92:
+ case T__89:
{
- State = 1417;
- Match(T__92);
- State = 1418;
+ State = 1397;
+ Match(T__89);
+ State = 1398;
Match(INT);
}
break;
case UINT:
{
- State = 1419;
+ State = 1399;
Match(UINT);
}
break;
@@ -7765,109 +7723,126 @@ public SecDeclContext secDecl() {
EnterRule(_localctx, 174, RULE_secDecl);
int _la;
try {
- State = 1462;
+ State = 1449;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,65,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1422;
+ State = 1402;
Match(PERMISSION);
- State = 1423;
+ State = 1403;
secAction();
- State = 1424;
+ State = 1404;
typeSpec();
- State = 1425;
- Match(T__28);
- State = 1426;
- nameValPairs();
- State = 1427;
+ State = 1405;
Match(T__29);
+ State = 1406;
+ nameValPairs();
+ State = 1407;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1429;
+ State = 1409;
Match(PERMISSION);
- State = 1430;
+ State = 1410;
secAction();
- State = 1431;
+ State = 1411;
typeSpec();
- State = 1432;
- Match(T__34);
- State = 1433;
- Match(T__15);
- State = 1434;
- customBlobDescr();
- State = 1435;
+ State = 1412;
+ Match(T__35);
+ State = 1413;
Match(T__16);
+ State = 1414;
+ customBlobDescr();
+ State = 1415;
+ Match(T__17);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1437;
+ State = 1417;
Match(PERMISSION);
- State = 1438;
+ State = 1418;
secAction();
- State = 1439;
+ State = 1419;
typeSpec();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1441;
+ State = 1421;
Match(PERMISSIONSET);
- State = 1442;
+ State = 1422;
secAction();
- State = 1443;
- Match(T__34);
- State = 1445;
+ State = 1423;
+ Match(T__35);
+ State = 1425;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__82) {
+ if (_la==T__83) {
{
- State = 1444;
- Match(T__82);
+ State = 1424;
+ Match(T__83);
}
}
- State = 1447;
- Match(T__28);
- State = 1448;
- bytes();
- State = 1449;
+ State = 1427;
Match(T__29);
+ State = 1428;
+ bytes();
+ State = 1429;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1451;
+ State = 1431;
Match(PERMISSIONSET);
- State = 1452;
+ State = 1432;
secAction();
- State = 1453;
- compQstring();
+ State = 1433;
+ Match(T__83);
+ State = 1434;
+ Match(T__29);
+ State = 1435;
+ bytes();
+ State = 1436;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1455;
+ State = 1438;
Match(PERMISSIONSET);
- State = 1456;
+ State = 1439;
secAction();
- State = 1457;
- Match(T__34);
- State = 1458;
- Match(T__15);
- State = 1459;
- secAttrSetBlob();
- State = 1460;
+ State = 1440;
+ compQstring();
+ }
+ break;
+ case 7:
+ EnterOuterAlt(_localctx, 7);
+ {
+ State = 1442;
+ Match(PERMISSIONSET);
+ State = 1443;
+ secAction();
+ State = 1444;
+ Match(T__35);
+ State = 1445;
Match(T__16);
+ State = 1446;
+ secAttrSetBlob();
+ State = 1447;
+ Match(T__17);
}
break;
}
@@ -7909,19 +7884,20 @@ public SecAttrSetBlobContext secAttrSetBlob() {
EnterRule(_localctx, 176, RULE_secAttrSetBlob);
try {
int _alt;
- State = 1474;
+ State = 1461;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__16:
+ case T__17:
EnterOuterAlt(_localctx, 1);
{
}
break;
case T__0:
- case T__37:
- case T__40:
- case T__92:
- case T__111:
+ case T__15:
+ case T__38:
+ case T__41:
+ case T__89:
+ case T__112:
case ELLIPSIS:
case CHAR:
case STRING:
@@ -7953,25 +7929,25 @@ public SecAttrSetBlobContext secAttrSetBlob() {
case ID:
EnterOuterAlt(_localctx, 2);
{
- State = 1470;
+ State = 1457;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,66,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1465;
+ State = 1452;
secAttrBlob();
- State = 1466;
- Match(T__26);
+ State = 1453;
+ Match(T__27);
+ }
}
- }
}
- State = 1472;
+ State = 1459;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,66,Context);
}
- State = 1473;
+ State = 1460;
secAttrBlob();
}
break;
@@ -8016,39 +7992,39 @@ public SecAttrBlobContext secAttrBlob() {
SecAttrBlobContext _localctx = new SecAttrBlobContext(Context, State);
EnterRule(_localctx, 178, RULE_secAttrBlob);
try {
- State = 1489;
+ State = 1476;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,68,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1476;
- Match(T__37);
- State = 1477;
+ State = 1463;
+ Match(T__38);
+ State = 1464;
Match(SQSTRING);
- State = 1478;
- Match(T__34);
- State = 1479;
- Match(T__15);
- State = 1480;
- customBlobNVPairs();
- State = 1481;
+ State = 1465;
+ Match(T__35);
+ State = 1466;
Match(T__16);
+ State = 1467;
+ customBlobNVPairs();
+ State = 1468;
+ Match(T__17);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1483;
+ State = 1470;
typeSpec();
- State = 1484;
- Match(T__34);
- State = 1485;
- Match(T__15);
- State = 1486;
- customBlobNVPairs();
- State = 1487;
+ State = 1471;
+ Match(T__35);
+ State = 1472;
Match(T__16);
+ State = 1473;
+ customBlobNVPairs();
+ State = 1474;
+ Match(T__17);
}
break;
}
@@ -8092,25 +8068,25 @@ public NameValPairsContext nameValPairs() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1496;
+ State = 1483;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,69,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1491;
+ State = 1478;
nameValPair();
- State = 1492;
- Match(T__26);
+ State = 1479;
+ Match(T__27);
+ }
}
- }
}
- State = 1498;
+ State = 1485;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,69,Context);
}
- State = 1499;
+ State = 1486;
nameValPair();
}
}
@@ -8152,11 +8128,11 @@ public NameValPairContext nameValPair() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1501;
+ State = 1488;
compQstring();
- State = 1502;
- Match(T__34);
- State = 1503;
+ State = 1489;
+ Match(T__35);
+ State = 1490;
caValue();
}
}
@@ -8193,9 +8169,9 @@ public TruefalseContext truefalse() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1505;
+ State = 1492;
_la = TokenStream.LA(1);
- if ( !(_la==T__93 || _la==T__94) ) {
+ if ( !(_la==T__94 || _la==T__95) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -8249,105 +8225,105 @@ public CaValueContext caValue() {
CaValueContext _localctx = new CaValueContext(Context, State);
EnterRule(_localctx, 186, RULE_caValue);
try {
- State = 1541;
+ State = 1528;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,70,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1507;
+ State = 1494;
truefalse();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1508;
+ State = 1495;
int32();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1509;
+ State = 1496;
Match(INT32_);
- State = 1510;
- Match(T__28);
- State = 1511;
- int32();
- State = 1512;
+ State = 1497;
Match(T__29);
+ State = 1498;
+ int32();
+ State = 1499;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1514;
+ State = 1501;
compQstring();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1515;
+ State = 1502;
className();
- State = 1516;
- Match(T__28);
- State = 1517;
+ State = 1503;
+ Match(T__29);
+ State = 1504;
Match(INT8);
- State = 1518;
- Match(T__73);
- State = 1519;
+ State = 1505;
+ Match(T__74);
+ State = 1506;
int32();
- State = 1520;
- Match(T__29);
+ State = 1507;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1522;
+ State = 1509;
className();
- State = 1523;
- Match(T__28);
- State = 1524;
+ State = 1510;
+ Match(T__29);
+ State = 1511;
Match(INT16);
- State = 1525;
- Match(T__73);
- State = 1526;
+ State = 1512;
+ Match(T__74);
+ State = 1513;
int32();
- State = 1527;
- Match(T__29);
+ State = 1514;
+ Match(T__30);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1529;
+ State = 1516;
className();
- State = 1530;
- Match(T__28);
- State = 1531;
+ State = 1517;
+ Match(T__29);
+ State = 1518;
Match(INT32_);
- State = 1532;
- Match(T__73);
- State = 1533;
+ State = 1519;
+ Match(T__74);
+ State = 1520;
int32();
- State = 1534;
- Match(T__29);
+ State = 1521;
+ Match(T__30);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1536;
+ State = 1523;
className();
- State = 1537;
- Match(T__28);
- State = 1538;
- int32();
- State = 1539;
+ State = 1524;
Match(T__29);
+ State = 1525;
+ int32();
+ State = 1526;
+ Match(T__30);
}
break;
}
@@ -8385,9 +8361,9 @@ public SecActionContext secAction() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1543;
+ State = 1530;
_la = TokenStream.LA(1);
- if ( !(((((_la - 96)) & ~0x3f) == 0 && ((1L << (_la - 96)) & 32767L) != 0)) ) {
+ if ( !(((((_la - 97)) & ~0x3f) == 0 && ((1L << (_la - 97)) & 32767L) != 0)) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -8455,104 +8431,104 @@ public MethodRefContext methodRef() {
EnterRule(_localctx, 190, RULE_methodRef);
int _la;
try {
- State = 1579;
+ State = 1566;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,73,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1545;
+ State = 1532;
callConv();
- State = 1546;
+ State = 1533;
type();
- State = 1547;
+ State = 1534;
typeSpec();
- State = 1548;
+ State = 1535;
Match(DCOLON);
- State = 1549;
+ State = 1536;
methodName();
- State = 1551;
+ State = 1538;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__84) {
+ if (_la==T__85) {
{
- State = 1550;
+ State = 1537;
typeArgs();
}
}
- State = 1553;
+ State = 1540;
sigArgs();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1555;
+ State = 1542;
callConv();
- State = 1556;
+ State = 1543;
type();
- State = 1557;
+ State = 1544;
typeSpec();
- State = 1558;
+ State = 1545;
Match(DCOLON);
- State = 1559;
+ State = 1546;
methodName();
- State = 1560;
+ State = 1547;
genArityNotEmpty();
- State = 1561;
+ State = 1548;
sigArgs();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1563;
+ State = 1550;
callConv();
- State = 1564;
+ State = 1551;
type();
- State = 1565;
+ State = 1552;
methodName();
- State = 1567;
+ State = 1554;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__84) {
+ if (_la==T__85) {
{
- State = 1566;
+ State = 1553;
typeArgs();
}
}
- State = 1569;
+ State = 1556;
sigArgs();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1571;
+ State = 1558;
callConv();
- State = 1572;
+ State = 1559;
type();
- State = 1573;
+ State = 1560;
methodName();
- State = 1574;
+ State = 1561;
genArityNotEmpty();
- State = 1575;
+ State = 1562;
sigArgs();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1577;
+ State = 1564;
mdtoken();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1578;
+ State = 1565;
dottedName();
}
break;
@@ -8599,45 +8575,45 @@ public CallConvContext callConv() {
CallConvContext _localctx = new CallConvContext(Context, State);
EnterRule(_localctx, 192, RULE_callConv);
try {
- State = 1591;
+ State = 1578;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,74,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1581;
+ State = 1568;
Match(INSTANCE);
- State = 1582;
+ State = 1569;
callConv();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1583;
+ State = 1570;
Match(EXPLICIT);
- State = 1584;
+ State = 1571;
callConv();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1585;
+ State = 1572;
callKind();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1586;
- Match(T__110);
- State = 1587;
- Match(T__28);
- State = 1588;
- int32();
- State = 1589;
+ State = 1573;
+ Match(T__111);
+ State = 1574;
Match(T__29);
+ State = 1575;
+ int32();
+ State = 1576;
+ Match(T__30);
}
break;
}
@@ -8679,7 +8655,7 @@ public CallKindContext callKind() {
CallKindContext _localctx = new CallKindContext(Context, State);
EnterRule(_localctx, 194, RULE_callKind);
try {
- State = 1605;
+ State = 1592;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,75,Context) ) {
case 1:
@@ -8690,57 +8666,57 @@ public CallKindContext callKind() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1594;
+ State = 1581;
Match(DEFAULT);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1595;
+ State = 1582;
Match(VARARG);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1596;
+ State = 1583;
Match(UNMANAGED);
- State = 1597;
+ State = 1584;
Match(CDECL);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1598;
+ State = 1585;
Match(UNMANAGED);
- State = 1599;
+ State = 1586;
Match(STDCALL);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1600;
+ State = 1587;
Match(UNMANAGED);
- State = 1601;
+ State = 1588;
Match(THISCALL);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1602;
+ State = 1589;
Match(UNMANAGED);
- State = 1603;
+ State = 1590;
Match(FASTCALL);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1604;
+ State = 1591;
Match(UNMANAGED);
}
break;
@@ -8781,14 +8757,14 @@ public MdtokenContext mdtoken() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1607;
- Match(T__111);
- State = 1608;
- Match(T__28);
- State = 1609;
- int32();
- State = 1610;
+ State = 1594;
+ Match(T__112);
+ State = 1595;
Match(T__29);
+ State = 1596;
+ int32();
+ State = 1597;
+ Match(T__30);
}
}
catch (RecognitionException re) {
@@ -8831,31 +8807,31 @@ public MemberRefContext memberRef() {
MemberRefContext _localctx = new MemberRefContext(Context, State);
EnterRule(_localctx, 198, RULE_memberRef);
try {
- State = 1617;
+ State = 1604;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case METHOD:
EnterOuterAlt(_localctx, 1);
{
- State = 1612;
+ State = 1599;
Match(METHOD);
- State = 1613;
+ State = 1600;
methodRef();
}
break;
- case T__35:
+ case T__36:
EnterOuterAlt(_localctx, 2);
{
- State = 1614;
- Match(T__35);
- State = 1615;
+ State = 1601;
+ Match(T__36);
+ State = 1602;
fieldRef();
}
break;
- case T__111:
+ case T__112:
EnterOuterAlt(_localctx, 3);
{
- State = 1616;
+ State = 1603;
mdtoken();
}
break;
@@ -8903,35 +8879,35 @@ public FieldRefContext fieldRef() {
FieldRefContext _localctx = new FieldRefContext(Context, State);
EnterRule(_localctx, 200, RULE_fieldRef);
try {
- State = 1628;
+ State = 1615;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,77,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1619;
+ State = 1606;
type();
- State = 1620;
+ State = 1607;
typeSpec();
- State = 1621;
+ State = 1608;
Match(DCOLON);
- State = 1622;
+ State = 1609;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1624;
+ State = 1611;
type();
- State = 1625;
+ State = 1612;
dottedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1627;
+ State = 1614;
dottedName();
}
break;
@@ -8976,25 +8952,25 @@ public TypeListContext typeList() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1635;
+ State = 1622;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,78,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1630;
+ State = 1617;
typeSpec();
- State = 1631;
- Match(T__26);
+ State = 1618;
+ Match(T__27);
+ }
}
- }
}
- State = 1637;
+ State = 1624;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,78,Context);
}
- State = 1638;
+ State = 1625;
typeSpec();
}
}
@@ -9031,27 +9007,27 @@ public TyparsClauseContext typarsClause() {
TyparsClauseContext _localctx = new TyparsClauseContext(Context, State);
EnterRule(_localctx, 204, RULE_typarsClause);
try {
- State = 1645;
+ State = 1632;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
- case T__28:
- case T__69:
+ case T__16:
+ case T__29:
case T__70:
- case T__83:
+ case T__71:
+ case T__84:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__84:
+ case T__85:
EnterOuterAlt(_localctx, 2);
{
- State = 1641;
- Match(T__84);
- State = 1642;
- typars();
- State = 1643;
+ State = 1628;
Match(T__85);
+ State = 1629;
+ typars();
+ State = 1630;
+ Match(T__86);
}
break;
default:
@@ -9100,62 +9076,62 @@ public TyparAttribContext typarAttrib() {
TyparAttribContext _localctx = new TyparAttribContext(Context, State);
EnterRule(_localctx, 206, RULE_typarAttrib);
try {
- State = 1658;
+ State = 1645;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case PLUS:
EnterOuterAlt(_localctx, 1);
{
- State = 1647;
+ State = 1634;
_localctx.covariant = Match(PLUS);
}
break;
- case T__112:
+ case T__113:
EnterOuterAlt(_localctx, 2);
{
- State = 1648;
- _localctx.contravariant = Match(T__112);
+ State = 1635;
+ _localctx.contravariant = Match(T__113);
}
break;
- case T__37:
+ case T__38:
EnterOuterAlt(_localctx, 3);
{
- State = 1649;
- _localctx.@class = Match(T__37);
+ State = 1636;
+ _localctx.@class = Match(T__38);
}
break;
case VALUETYPE:
EnterOuterAlt(_localctx, 4);
{
- State = 1650;
+ State = 1637;
_localctx.valuetype = Match(VALUETYPE);
}
break;
- case T__113:
+ case T__114:
EnterOuterAlt(_localctx, 5);
{
- State = 1651;
- _localctx.byrefLike = Match(T__113);
+ State = 1638;
+ _localctx.byrefLike = Match(T__114);
}
break;
- case T__114:
+ case T__115:
EnterOuterAlt(_localctx, 6);
{
- State = 1652;
- _localctx.ctor = Match(T__114);
+ State = 1639;
+ _localctx.ctor = Match(T__115);
}
break;
- case T__68:
+ case T__69:
EnterOuterAlt(_localctx, 7);
{
- State = 1653;
- Match(T__68);
- State = 1654;
- Match(T__28);
- State = 1655;
- _localctx.flags = int32();
- State = 1656;
+ State = 1640;
+ Match(T__69);
+ State = 1641;
Match(T__29);
+ State = 1642;
+ _localctx.flags = int32();
+ State = 1643;
+ Match(T__30);
}
break;
default:
@@ -9201,17 +9177,17 @@ public TyparAttribsContext typarAttribs() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1663;
+ State = 1650;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__37 || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 123145302310913L) != 0) || _la==VALUETYPE || _la==PLUS) {
+ while (_la==T__38 || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 123145302310913L) != 0) || _la==VALUETYPE || _la==PLUS) {
{
{
- State = 1660;
+ State = 1647;
typarAttrib();
}
}
- State = 1665;
+ State = 1652;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -9259,19 +9235,19 @@ public TyparContext typar() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1666;
+ State = 1653;
typarAttribs();
- State = 1668;
+ State = 1655;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__28) {
+ if (_la==T__29) {
{
- State = 1667;
+ State = 1654;
tyBound();
}
}
- State = 1670;
+ State = 1657;
dottedName();
}
}
@@ -9314,25 +9290,25 @@ public TyparsContext typars() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1677;
+ State = 1664;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,83,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1672;
+ State = 1659;
typar();
- State = 1673;
- Match(T__26);
+ State = 1660;
+ Match(T__27);
+ }
}
- }
}
- State = 1679;
+ State = 1666;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,83,Context);
}
- State = 1680;
+ State = 1667;
typar();
}
}
@@ -9371,12 +9347,12 @@ public TyBoundContext tyBound() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1682;
- Match(T__28);
- State = 1683;
- typeList();
- State = 1684;
+ State = 1669;
Match(T__29);
+ State = 1670;
+ typeList();
+ State = 1671;
+ Match(T__30);
}
}
catch (RecognitionException re) {
@@ -9412,19 +9388,19 @@ public GenArityContext genArity() {
GenArityContext _localctx = new GenArityContext(Context, State);
EnterRule(_localctx, 216, RULE_genArity);
try {
- State = 1688;
+ State = 1675;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__28:
- case T__83:
+ case T__29:
+ case T__84:
EnterOuterAlt(_localctx, 1);
{
}
break;
- case T__84:
+ case T__85:
EnterOuterAlt(_localctx, 2);
{
- State = 1687;
+ State = 1674;
genArityNotEmpty();
}
break;
@@ -9467,16 +9443,16 @@ public GenArityNotEmptyContext genArityNotEmpty() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1690;
- Match(T__84);
- State = 1691;
- Match(T__40);
- State = 1692;
- int32();
- State = 1693;
- Match(T__41);
- State = 1694;
+ State = 1677;
Match(T__85);
+ State = 1678;
+ Match(T__41);
+ State = 1679;
+ int32();
+ State = 1680;
+ Match(T__42);
+ State = 1681;
+ Match(T__86);
}
}
catch (RecognitionException re) {
@@ -9621,235 +9597,235 @@ public ClassDeclContext classDecl() {
EnterRule(_localctx, 220, RULE_classDecl);
try {
int _alt;
- State = 1812;
+ State = 1799;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,89,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1696;
+ State = 1683;
methodHead();
- State = 1697;
- Match(T__15);
- State = 1698;
- methodDecls();
- State = 1699;
+ State = 1684;
Match(T__16);
+ State = 1685;
+ methodDecls();
+ State = 1686;
+ Match(T__17);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1701;
+ State = 1688;
classHead();
- State = 1702;
- Match(T__15);
- State = 1703;
- classDecls();
- State = 1704;
+ State = 1689;
Match(T__16);
+ State = 1690;
+ classDecls();
+ State = 1691;
+ Match(T__17);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1706;
+ State = 1693;
eventHead();
- State = 1707;
- Match(T__15);
- State = 1708;
- eventDecls();
- State = 1709;
+ State = 1694;
Match(T__16);
+ State = 1695;
+ eventDecls();
+ State = 1696;
+ Match(T__17);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1711;
+ State = 1698;
propHead();
- State = 1712;
- Match(T__15);
- State = 1713;
- propDecls();
- State = 1714;
+ State = 1699;
Match(T__16);
+ State = 1700;
+ propDecls();
+ State = 1701;
+ Match(T__17);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 1716;
+ State = 1703;
fieldDecl();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 1717;
+ State = 1704;
dataDecl();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 1718;
+ State = 1705;
secDecl();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 1719;
+ State = 1706;
extSourceSpec();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 1720;
+ State = 1707;
customAttrDecl();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 1721;
- Match(T__115);
- State = 1722;
+ State = 1708;
+ Match(T__116);
+ State = 1709;
int32();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 1723;
- Match(T__116);
- State = 1724;
+ State = 1710;
+ Match(T__117);
+ State = 1711;
int32();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 1725;
+ State = 1712;
exportHead();
- State = 1726;
- Match(T__15);
- State = 1727;
- exptypeDecls();
- State = 1728;
+ State = 1713;
Match(T__16);
+ State = 1714;
+ exptypeDecls();
+ State = 1715;
+ Match(T__17);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 1730;
+ State = 1717;
Match(OVERRIDE);
- State = 1731;
+ State = 1718;
typeSpec();
- State = 1732;
+ State = 1719;
Match(DCOLON);
- State = 1733;
+ State = 1720;
methodName();
- State = 1734;
- Match(T__117);
- State = 1735;
+ State = 1721;
+ Match(T__118);
+ State = 1722;
callConv();
- State = 1736;
+ State = 1723;
type();
- State = 1737;
+ State = 1724;
typeSpec();
- State = 1738;
+ State = 1725;
Match(DCOLON);
- State = 1739;
+ State = 1726;
methodName();
- State = 1740;
+ State = 1727;
sigArgs();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 1742;
+ State = 1729;
Match(OVERRIDE);
- State = 1743;
+ State = 1730;
Match(METHOD);
- State = 1744;
+ State = 1731;
callConv();
- State = 1745;
+ State = 1732;
type();
- State = 1746;
+ State = 1733;
typeSpec();
- State = 1747;
+ State = 1734;
Match(DCOLON);
- State = 1748;
+ State = 1735;
methodName();
- State = 1749;
+ State = 1736;
genArity();
- State = 1750;
+ State = 1737;
sigArgs();
- State = 1751;
- Match(T__117);
- State = 1752;
+ State = 1738;
+ Match(T__118);
+ State = 1739;
Match(METHOD);
- State = 1753;
+ State = 1740;
callConv();
- State = 1754;
+ State = 1741;
type();
- State = 1755;
+ State = 1742;
typeSpec();
- State = 1756;
+ State = 1743;
Match(DCOLON);
- State = 1757;
+ State = 1744;
methodName();
- State = 1758;
+ State = 1745;
genArity();
- State = 1759;
+ State = 1746;
sigArgs();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 1761;
+ State = 1748;
languageDecl();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 1762;
+ State = 1749;
compControl();
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 1763;
+ State = 1750;
Match(PARAM);
- State = 1764;
+ State = 1751;
Match(TYPE);
- State = 1765;
- Match(T__40);
- State = 1766;
- int32();
- State = 1767;
+ State = 1752;
Match(T__41);
- State = 1771;
+ State = 1753;
+ int32();
+ State = 1754;
+ Match(T__42);
+ State = 1758;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,85,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1768;
+ State = 1755;
customAttrDecl();
}
- }
+ }
}
- State = 1773;
+ State = 1760;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,85,Context);
}
@@ -9858,25 +9834,25 @@ public ClassDeclContext classDecl() {
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 1774;
+ State = 1761;
Match(PARAM);
- State = 1775;
+ State = 1762;
Match(TYPE);
- State = 1776;
+ State = 1763;
dottedName();
- State = 1780;
+ State = 1767;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,86,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1777;
+ State = 1764;
customAttrDecl();
}
- }
+ }
}
- State = 1782;
+ State = 1769;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,86,Context);
}
@@ -9885,33 +9861,33 @@ public ClassDeclContext classDecl() {
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 1783;
+ State = 1770;
Match(PARAM);
- State = 1784;
+ State = 1771;
Match(CONSTRAINT);
- State = 1785;
- Match(T__40);
- State = 1786;
- int32();
- State = 1787;
+ State = 1772;
Match(T__41);
- State = 1788;
- Match(T__26);
- State = 1789;
+ State = 1773;
+ int32();
+ State = 1774;
+ Match(T__42);
+ State = 1775;
+ Match(T__27);
+ State = 1776;
typeSpec();
- State = 1793;
+ State = 1780;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,87,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1790;
+ State = 1777;
customAttrDecl();
}
- }
+ }
}
- State = 1795;
+ State = 1782;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,87,Context);
}
@@ -9920,29 +9896,29 @@ public ClassDeclContext classDecl() {
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 1796;
+ State = 1783;
Match(PARAM);
- State = 1797;
+ State = 1784;
Match(CONSTRAINT);
- State = 1798;
+ State = 1785;
dottedName();
- State = 1799;
- Match(T__26);
- State = 1800;
+ State = 1786;
+ Match(T__27);
+ State = 1787;
typeSpec();
- State = 1804;
+ State = 1791;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,88,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 1801;
+ State = 1788;
customAttrDecl();
}
- }
+ }
}
- State = 1806;
+ State = 1793;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,88,Context);
}
@@ -9951,13 +9927,13 @@ public ClassDeclContext classDecl() {
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 1807;
- Match(T__118);
- State = 1808;
+ State = 1794;
+ Match(T__119);
+ State = 1795;
Match(TYPE);
- State = 1809;
+ State = 1796;
typeSpec();
- State = 1810;
+ State = 1797;
customDescr();
}
break;
@@ -10019,69 +9995,71 @@ public override TResult Accept(IParseTreeVisitor visitor) {
public FieldDeclContext fieldDecl() {
FieldDeclContext _localctx = new FieldDeclContext(Context, State);
EnterRule(_localctx, 222, RULE_fieldDecl);
- int _la;
try {
+ int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 1814;
- Match(T__119);
- State = 1815;
+ State = 1801;
+ Match(T__120);
+ State = 1802;
repeatOpt();
- State = 1824;
+ State = 1811;
ErrorHandler.Sync(this);
- _la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & -4608308318706860032L) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & -144115188075855813L) != 0)) {
- {
- State = 1822;
- ErrorHandler.Sync(this);
- switch (TokenStream.LA(1)) {
- case T__49:
- case T__50:
- case T__61:
- case T__62:
- case T__63:
- case T__64:
- case T__66:
- case T__67:
- case T__68:
- case T__121:
- case T__122:
- case T__123:
- case T__124:
- case T__125:
- case T__126:
+ _alt = Interpreter.AdaptivePredict(TokenStream,91,Context);
+ while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
+ if ( _alt==1 ) {
{
- State = 1816;
- fieldAttr();
+ State = 1809;
+ ErrorHandler.Sync(this);
+ switch (TokenStream.LA(1)) {
+ case T__15:
+ case T__50:
+ case T__51:
+ case T__62:
+ case T__63:
+ case T__64:
+ case T__65:
+ case T__67:
+ case T__68:
+ case T__69:
+ case T__122:
+ case T__123:
+ case T__124:
+ case T__125:
+ case T__126:
+ {
+ State = 1803;
+ fieldAttr();
+ }
+ break;
+ case T__121:
+ {
+ State = 1804;
+ Match(T__121);
+ State = 1805;
+ Match(T__29);
+ State = 1806;
+ marshalBlob();
+ State = 1807;
+ Match(T__30);
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
}
- break;
- case T__120:
- {
- State = 1817;
- Match(T__120);
- State = 1818;
- Match(T__28);
- State = 1819;
- marshalBlob();
- State = 1820;
- Match(T__29);
}
- break;
- default:
- throw new NoViableAltException(this);
}
- }
- State = 1826;
+ State = 1813;
ErrorHandler.Sync(this);
- _la = TokenStream.LA(1);
+ _alt = Interpreter.AdaptivePredict(TokenStream,91,Context);
}
- State = 1827;
+ State = 1814;
type();
- State = 1828;
+ State = 1815;
dottedName();
- State = 1829;
+ State = 1816;
atOpt();
- State = 1830;
+ State = 1817;
initOpt();
}
}
@@ -10118,118 +10096,118 @@ public FieldAttrContext fieldAttr() {
FieldAttrContext _localctx = new FieldAttrContext(Context, State);
EnterRule(_localctx, 224, RULE_fieldAttr);
try {
- State = 1851;
+ State = 1838;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__121:
+ case T__122:
EnterOuterAlt(_localctx, 1);
{
- State = 1832;
- Match(T__121);
+ State = 1819;
+ Match(T__122);
}
break;
- case T__49:
+ case T__50:
EnterOuterAlt(_localctx, 2);
{
- State = 1833;
- Match(T__49);
+ State = 1820;
+ Match(T__50);
}
break;
- case T__50:
+ case T__51:
EnterOuterAlt(_localctx, 3);
{
- State = 1834;
- Match(T__50);
+ State = 1821;
+ Match(T__51);
}
break;
- case T__61:
+ case T__62:
EnterOuterAlt(_localctx, 4);
{
- State = 1835;
- Match(T__61);
+ State = 1822;
+ Match(T__62);
}
break;
- case T__122:
+ case T__123:
EnterOuterAlt(_localctx, 5);
{
- State = 1836;
- Match(T__122);
+ State = 1823;
+ Match(T__123);
}
break;
- case T__67:
+ case T__68:
EnterOuterAlt(_localctx, 6);
{
- State = 1837;
- Match(T__67);
+ State = 1824;
+ Match(T__68);
}
break;
- case T__66:
+ case T__67:
EnterOuterAlt(_localctx, 7);
{
- State = 1838;
- Match(T__66);
- }
- break;
- case T__62:
- EnterOuterAlt(_localctx, 8);
- {
- State = 1839;
- Match(T__62);
+ State = 1825;
+ Match(T__67);
}
break;
case T__63:
- EnterOuterAlt(_localctx, 9);
+ EnterOuterAlt(_localctx, 8);
{
- State = 1840;
+ State = 1826;
Match(T__63);
}
break;
case T__64:
- EnterOuterAlt(_localctx, 10);
+ EnterOuterAlt(_localctx, 9);
{
- State = 1841;
+ State = 1827;
Match(T__64);
}
break;
- case T__123:
- EnterOuterAlt(_localctx, 11);
+ case T__65:
+ EnterOuterAlt(_localctx, 10);
{
- State = 1842;
- Match(T__123);
+ State = 1828;
+ Match(T__65);
}
break;
case T__124:
- EnterOuterAlt(_localctx, 12);
+ EnterOuterAlt(_localctx, 11);
{
- State = 1843;
+ State = 1829;
Match(T__124);
}
break;
case T__125:
- EnterOuterAlt(_localctx, 13);
+ EnterOuterAlt(_localctx, 12);
{
- State = 1844;
+ State = 1830;
Match(T__125);
}
break;
case T__126:
- EnterOuterAlt(_localctx, 14);
+ EnterOuterAlt(_localctx, 13);
{
- State = 1845;
+ State = 1831;
Match(T__126);
}
break;
- case T__68:
+ case T__15:
+ EnterOuterAlt(_localctx, 14);
+ {
+ State = 1832;
+ Match(T__15);
+ }
+ break;
+ case T__69:
EnterOuterAlt(_localctx, 15);
{
- State = 1846;
- Match(T__68);
- State = 1847;
- Match(T__28);
- State = 1848;
- int32();
- State = 1849;
+ State = 1833;
+ Match(T__69);
+ State = 1834;
Match(T__29);
+ State = 1835;
+ int32();
+ State = 1836;
+ Match(T__30);
}
break;
default:
@@ -10272,7 +10250,7 @@ public AtOptContext atOpt() {
AtOptContext _localctx = new AtOptContext(Context, State);
EnterRule(_localctx, 226, RULE_atOpt);
try {
- State = 1858;
+ State = 1845;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,93,Context) ) {
case 1:
@@ -10283,18 +10261,18 @@ public AtOptContext atOpt() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1854;
- Match(T__42);
- State = 1855;
+ State = 1841;
+ Match(T__43);
+ State = 1842;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1856;
- Match(T__42);
- State = 1857;
+ State = 1843;
+ Match(T__43);
+ State = 1844;
int32();
}
break;
@@ -10333,7 +10311,7 @@ public InitOptContext initOpt() {
InitOptContext _localctx = new InitOptContext(Context, State);
EnterRule(_localctx, 228, RULE_initOpt);
try {
- State = 1863;
+ State = 1850;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -10356,32 +10334,32 @@ public InitOptContext initOpt() {
case T__17:
case T__18:
case T__19:
- case T__21:
+ case T__20:
case T__22:
case T__23:
case T__24:
case T__25:
- case T__27:
- case T__30:
+ case T__26:
+ case T__28:
case T__31:
- case T__33:
- case T__39:
- case T__46:
+ case T__32:
+ case T__34:
+ case T__40:
case T__47:
case T__48:
- case T__71:
+ case T__49:
case T__72:
- case T__115:
+ case T__73:
case T__116:
- case T__118:
+ case T__117:
case T__119:
+ case T__120:
case T__127:
case T__132:
case T__138:
case T__157:
case T__164:
case MODULE:
- case VALUE:
case INSTANCE:
case UNMANAGED:
case PARAM:
@@ -10423,12 +10401,12 @@ public InitOptContext initOpt() {
{
}
break;
- case T__34:
+ case T__35:
EnterOuterAlt(_localctx, 2);
{
- State = 1861;
- Match(T__34);
- State = 1862;
+ State = 1848;
+ Match(T__35);
+ State = 1849;
fieldInit();
}
break;
@@ -10469,22 +10447,22 @@ public RepeatOptContext repeatOpt() {
RepeatOptContext _localctx = new RepeatOptContext(Context, State);
EnterRule(_localctx, 230, RULE_repeatOpt);
try {
- State = 1870;
+ State = 1857;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
- case T__37:
- case T__49:
+ case T__15:
+ case T__38:
case T__50:
- case T__61:
+ case T__51:
case T__62:
case T__63:
case T__64:
- case T__66:
+ case T__65:
case T__67:
case T__68:
- case T__92:
- case T__120:
+ case T__69:
+ case T__89:
case T__121:
case T__122:
case T__123:
@@ -10521,15 +10499,15 @@ public RepeatOptContext repeatOpt() {
{
}
break;
- case T__40:
+ case T__41:
EnterOuterAlt(_localctx, 2);
{
- State = 1866;
- Match(T__40);
- State = 1867;
- int32();
- State = 1868;
+ State = 1853;
Match(T__41);
+ State = 1854;
+ int32();
+ State = 1855;
+ Match(T__42);
}
break;
default:
@@ -10579,54 +10557,54 @@ public EventHeadContext eventHead() {
EnterRule(_localctx, 232, RULE_eventHead);
int _la;
try {
- State = 1890;
+ State = 1877;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,98,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1872;
+ State = 1859;
Match(T__127);
- State = 1876;
+ State = 1863;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__66 || _la==T__67) {
+ while (_la==T__67 || _la==T__68) {
{
{
- State = 1873;
+ State = 1860;
eventAttr();
}
}
- State = 1878;
+ State = 1865;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1879;
+ State = 1866;
typeSpec();
- State = 1880;
+ State = 1867;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1882;
+ State = 1869;
Match(T__127);
- State = 1886;
+ State = 1873;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__66 || _la==T__67) {
+ while (_la==T__67 || _la==T__68) {
{
{
- State = 1883;
+ State = 1870;
eventAttr();
}
}
- State = 1888;
+ State = 1875;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1889;
+ State = 1876;
dottedName();
}
break;
@@ -10665,9 +10643,9 @@ public EventAttrContext eventAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1892;
+ State = 1879;
_la = TokenStream.LA(1);
- if ( !(_la==T__66 || _la==T__67) ) {
+ if ( !(_la==T__67 || _la==T__68) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -10715,17 +10693,17 @@ public EventDeclsContext eventDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1897;
+ State = 1884;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19394461696L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 2161727821137838083L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38788988928L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 1080863910568919043L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
{
{
- State = 1894;
+ State = 1881;
eventDecl();
}
}
- State = 1899;
+ State = 1886;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -10776,73 +10754,73 @@ public EventDeclContext eventDecl() {
EventDeclContext _localctx = new EventDeclContext(Context, State);
EnterRule(_localctx, 238, RULE_eventDecl);
try {
- State = 1912;
+ State = 1899;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__128:
EnterOuterAlt(_localctx, 1);
{
- State = 1900;
+ State = 1887;
Match(T__128);
- State = 1901;
+ State = 1888;
methodRef();
}
break;
case T__129:
EnterOuterAlt(_localctx, 2);
{
- State = 1902;
+ State = 1889;
Match(T__129);
- State = 1903;
+ State = 1890;
methodRef();
}
break;
case T__130:
EnterOuterAlt(_localctx, 3);
{
- State = 1904;
+ State = 1891;
Match(T__130);
- State = 1905;
+ State = 1892;
methodRef();
}
break;
case T__131:
EnterOuterAlt(_localctx, 4);
{
- State = 1906;
+ State = 1893;
Match(T__131);
- State = 1907;
+ State = 1894;
methodRef();
}
break;
- case T__71:
case T__72:
+ case T__73:
EnterOuterAlt(_localctx, 5);
{
- State = 1908;
+ State = 1895;
extSourceSpec();
}
break;
- case T__33:
- case VALUE:
+ case T__15:
+ case T__34:
case INSTANCE:
case SQSTRING:
case DOTTEDNAME:
case ID:
EnterOuterAlt(_localctx, 6);
{
- State = 1909;
+ State = 1896;
customAttrDecl();
}
break;
- case T__25:
+ case T__26:
EnterOuterAlt(_localctx, 7);
{
- State = 1910;
+ State = 1897;
languageDecl();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -10852,7 +10830,7 @@ public EventDeclContext eventDecl() {
case PP_INCLUDE:
EnterOuterAlt(_localctx, 8);
{
- State = 1911;
+ State = 1898;
compControl();
}
break;
@@ -10914,31 +10892,31 @@ public PropHeadContext propHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1914;
+ State = 1901;
Match(T__132);
- State = 1918;
+ State = 1905;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__66 || _la==T__67) {
+ while (_la==T__67 || _la==T__68) {
{
{
- State = 1915;
+ State = 1902;
propAttr();
}
}
- State = 1920;
+ State = 1907;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1921;
+ State = 1908;
callConv();
- State = 1922;
+ State = 1909;
type();
- State = 1923;
+ State = 1910;
dottedName();
- State = 1924;
+ State = 1911;
sigArgs();
- State = 1925;
+ State = 1912;
initOpt();
}
}
@@ -10975,9 +10953,9 @@ public PropAttrContext propAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1927;
+ State = 1914;
_la = TokenStream.LA(1);
- if ( !(_la==T__66 || _la==T__67) ) {
+ if ( !(_la==T__67 || _la==T__68) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -11025,17 +11003,17 @@ public PropDeclsContext propDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1932;
+ State = 1919;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19394461696L) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & -3458764513820540925L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38788988928L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 7493989779944505347L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
{
{
- State = 1929;
+ State = 1916;
propDecl();
}
}
- State = 1934;
+ State = 1921;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -11086,64 +11064,64 @@ public PropDeclContext propDecl() {
PropDeclContext _localctx = new PropDeclContext(Context, State);
EnterRule(_localctx, 246, RULE_propDecl);
try {
- State = 1945;
+ State = 1932;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__133:
EnterOuterAlt(_localctx, 1);
{
- State = 1935;
+ State = 1922;
Match(T__133);
- State = 1936;
+ State = 1923;
methodRef();
}
break;
case T__134:
EnterOuterAlt(_localctx, 2);
{
- State = 1937;
+ State = 1924;
Match(T__134);
- State = 1938;
+ State = 1925;
methodRef();
}
break;
case T__131:
EnterOuterAlt(_localctx, 3);
{
- State = 1939;
+ State = 1926;
Match(T__131);
- State = 1940;
+ State = 1927;
methodRef();
}
break;
- case T__33:
- case VALUE:
+ case T__15:
+ case T__34:
case INSTANCE:
case SQSTRING:
case DOTTEDNAME:
case ID:
EnterOuterAlt(_localctx, 4);
{
- State = 1941;
+ State = 1928;
customAttrDecl();
}
break;
- case T__71:
case T__72:
+ case T__73:
EnterOuterAlt(_localctx, 5);
{
- State = 1942;
+ State = 1929;
extSourceSpec();
}
break;
- case T__25:
+ case T__26:
EnterOuterAlt(_localctx, 6);
{
- State = 1943;
+ State = 1930;
languageDecl();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -11153,7 +11131,7 @@ public PropDeclContext propDecl() {
case PP_INCLUDE:
EnterOuterAlt(_localctx, 7);
{
- State = 1944;
+ State = 1931;
compControl();
}
break;
@@ -11194,7 +11172,7 @@ public MarshalClauseContext marshalClause() {
MarshalClauseContext _localctx = new MarshalClauseContext(Context, State);
EnterRule(_localctx, 248, RULE_marshalClause);
try {
- State = 1953;
+ State = 1940;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -11212,11 +11190,11 @@ public MarshalClauseContext marshalClause() {
case T__12:
case T__13:
case T__14:
- case T__26:
- case T__29:
- case T__114:
+ case T__15:
+ case T__27:
+ case T__30:
+ case T__115:
case T__154:
- case VALUE:
case INSTANCE:
case UNMANAGED:
case SQSTRING:
@@ -11226,17 +11204,17 @@ public MarshalClauseContext marshalClause() {
{
}
break;
- case T__120:
+ case T__121:
EnterOuterAlt(_localctx, 2);
{
- State = 1948;
- Match(T__120);
- State = 1949;
- Match(T__28);
- State = 1950;
- marshalBlob();
- State = 1951;
+ State = 1935;
+ Match(T__121);
+ State = 1936;
Match(T__29);
+ State = 1937;
+ marshalBlob();
+ State = 1938;
+ Match(T__30);
}
break;
default:
@@ -11283,13 +11261,15 @@ public MarshalBlobContext marshalBlob() {
EnterRule(_localctx, 250, RULE_marshalBlob);
int _la;
try {
- State = 1964;
+ State = 1951;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__29:
- case T__32:
- case T__40:
- case T__60:
+ case T__15:
+ case T__30:
+ case T__33:
+ case T__41:
+ case T__61:
+ case T__89:
case BOOL:
case INT8:
case INT16:
@@ -11303,7 +11283,6 @@ public MarshalBlobContext marshalBlob() {
case UINT64:
case INT:
case UINT:
- case VALUE:
case VOID:
case CUSTOM:
case FIXED:
@@ -11336,31 +11315,31 @@ public MarshalBlobContext marshalBlob() {
case ID:
EnterOuterAlt(_localctx, 1);
{
- State = 1955;
+ State = 1942;
nativeType();
}
break;
- case T__15:
+ case T__16:
EnterOuterAlt(_localctx, 2);
{
- State = 1956;
- Match(T__15);
- State = 1958;
+ State = 1943;
+ Match(T__16);
+ State = 1945;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
do {
{
{
- State = 1957;
+ State = 1944;
hexbyte();
}
}
- State = 1960;
+ State = 1947;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
} while ( _la==INT32 || _la==ID || _la==HEXBYTE );
- State = 1962;
- Match(T__16);
+ State = 1949;
+ Match(T__17);
}
break;
default:
@@ -11406,17 +11385,17 @@ public ParamAttrContext paramAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1969;
+ State = 1956;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__40) {
+ while (_la==T__41) {
{
{
- State = 1966;
+ State = 1953;
paramAttrElement();
}
}
- State = 1971;
+ State = 1958;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -11458,51 +11437,51 @@ public ParamAttrElementContext paramAttrElement() {
ParamAttrElementContext _localctx = new ParamAttrElementContext(Context, State);
EnterRule(_localctx, 254, RULE_paramAttrElement);
try {
- State = 1985;
+ State = 1972;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,108,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 1972;
- Match(T__40);
- State = 1973;
- _localctx.@in = Match(T__135);
- State = 1974;
+ State = 1959;
Match(T__41);
+ State = 1960;
+ _localctx.@in = Match(T__135);
+ State = 1961;
+ Match(T__42);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 1975;
- Match(T__40);
- State = 1976;
- _localctx.@out = Match(T__136);
- State = 1977;
+ State = 1962;
Match(T__41);
+ State = 1963;
+ _localctx.@out = Match(T__136);
+ State = 1964;
+ Match(T__42);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 1978;
- Match(T__40);
- State = 1979;
- _localctx.opt = Match(T__137);
- State = 1980;
+ State = 1965;
Match(T__41);
+ State = 1966;
+ _localctx.opt = Match(T__137);
+ State = 1967;
+ Match(T__42);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 1981;
- Match(T__40);
- State = 1982;
- int32();
- State = 1983;
+ State = 1968;
Match(T__41);
+ State = 1969;
+ int32();
+ State = 1970;
+ Match(T__42);
}
break;
}
@@ -11579,28 +11558,28 @@ public MethodHeadContext methodHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 1987;
+ State = 1974;
Match(T__138);
- State = 1992;
+ State = 1979;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (((((_la - 50)) & ~0x3f) == 0 && ((1L << (_la - 50)) & 978955L) != 0) || ((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & 66846725L) != 0)) {
+ while (((((_la - 51)) & ~0x3f) == 0 && ((1L << (_la - 51)) & 978955L) != 0) || ((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & 33423365L) != 0)) {
{
- State = 1990;
+ State = 1977;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__49:
case T__50:
- case T__52:
- case T__61:
+ case T__51:
+ case T__53:
case T__62:
case T__63:
case T__64:
- case T__66:
+ case T__65:
case T__67:
case T__68:
- case T__121:
- case T__123:
+ case T__69:
+ case T__122:
+ case T__124:
case T__139:
case T__140:
case T__141:
@@ -11609,13 +11588,13 @@ public MethodHeadContext methodHead() {
case T__144:
case T__145:
{
- State = 1988;
+ State = 1975;
methAttr();
}
break;
case T__146:
{
- State = 1989;
+ State = 1976;
pinvImpl();
}
break;
@@ -11623,35 +11602,35 @@ public MethodHeadContext methodHead() {
throw new NoViableAltException(this);
}
}
- State = 1994;
+ State = 1981;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 1995;
+ State = 1982;
callConv();
- State = 1996;
+ State = 1983;
paramAttr();
- State = 1997;
+ State = 1984;
type();
- State = 1998;
+ State = 1985;
marshalClause();
- State = 1999;
+ State = 1986;
methodName();
- State = 2000;
+ State = 1987;
typarsClause();
- State = 2001;
+ State = 1988;
sigArgs();
- State = 2005;
+ State = 1992;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 32766L) != 0) || _la==T__68 || _la==T__155 || _la==UNMANAGED) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 32766L) != 0) || _la==T__69 || _la==T__155 || _la==UNMANAGED) {
{
{
- State = 2002;
+ State = 1989;
implAttr();
}
}
- State = 2007;
+ State = 1994;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -11690,146 +11669,146 @@ public MethAttrContext methAttr() {
MethAttrContext _localctx = new MethAttrContext(Context, State);
EnterRule(_localctx, 258, RULE_methAttr);
try {
- State = 2031;
+ State = 2018;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__121:
+ case T__122:
EnterOuterAlt(_localctx, 1);
{
- State = 2008;
- Match(T__121);
+ State = 1995;
+ Match(T__122);
}
break;
- case T__49:
+ case T__50:
EnterOuterAlt(_localctx, 2);
{
- State = 2009;
- Match(T__49);
+ State = 1996;
+ Match(T__50);
}
break;
- case T__50:
+ case T__51:
EnterOuterAlt(_localctx, 3);
{
- State = 2010;
- Match(T__50);
+ State = 1997;
+ Match(T__51);
}
break;
- case T__61:
+ case T__62:
EnterOuterAlt(_localctx, 4);
{
- State = 2011;
- Match(T__61);
+ State = 1998;
+ Match(T__62);
}
break;
case T__139:
EnterOuterAlt(_localctx, 5);
{
- State = 2012;
+ State = 1999;
Match(T__139);
}
break;
- case T__66:
+ case T__67:
EnterOuterAlt(_localctx, 6);
{
- State = 2013;
- Match(T__66);
+ State = 2000;
+ Match(T__67);
}
break;
case T__140:
EnterOuterAlt(_localctx, 7);
{
- State = 2014;
+ State = 2001;
Match(T__140);
}
break;
case T__141:
EnterOuterAlt(_localctx, 8);
{
- State = 2015;
+ State = 2002;
Match(T__141);
}
break;
- case T__52:
+ case T__53:
EnterOuterAlt(_localctx, 9);
{
- State = 2016;
- Match(T__52);
+ State = 2003;
+ Match(T__53);
}
break;
- case T__62:
+ case T__63:
EnterOuterAlt(_localctx, 10);
{
- State = 2017;
- Match(T__62);
+ State = 2004;
+ Match(T__63);
}
break;
- case T__63:
+ case T__64:
EnterOuterAlt(_localctx, 11);
{
- State = 2018;
- Match(T__63);
+ State = 2005;
+ Match(T__64);
}
break;
- case T__64:
+ case T__65:
EnterOuterAlt(_localctx, 12);
{
- State = 2019;
- Match(T__64);
+ State = 2006;
+ Match(T__65);
}
break;
- case T__123:
+ case T__124:
EnterOuterAlt(_localctx, 13);
{
- State = 2020;
- Match(T__123);
+ State = 2007;
+ Match(T__124);
}
break;
case T__142:
EnterOuterAlt(_localctx, 14);
{
- State = 2021;
+ State = 2008;
Match(T__142);
}
break;
case T__143:
EnterOuterAlt(_localctx, 15);
{
- State = 2022;
+ State = 2009;
Match(T__143);
}
break;
- case T__67:
+ case T__68:
EnterOuterAlt(_localctx, 16);
{
- State = 2023;
- Match(T__67);
+ State = 2010;
+ Match(T__68);
}
break;
case T__144:
EnterOuterAlt(_localctx, 17);
{
- State = 2024;
+ State = 2011;
Match(T__144);
}
break;
case T__145:
EnterOuterAlt(_localctx, 18);
{
- State = 2025;
+ State = 2012;
Match(T__145);
}
break;
- case T__68:
+ case T__69:
EnterOuterAlt(_localctx, 19);
{
- State = 2026;
- Match(T__68);
- State = 2027;
- Match(T__28);
- State = 2028;
- int32();
- State = 2029;
+ State = 2013;
+ Match(T__69);
+ State = 2014;
Match(T__29);
+ State = 2015;
+ int32();
+ State = 2016;
+ Match(T__30);
}
break;
default:
@@ -11879,31 +11858,31 @@ public PinvImplContext pinvImpl() {
EnterRule(_localctx, 260, RULE_pinvImpl);
int _la;
try {
- State = 2051;
+ State = 2038;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,116,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2033;
+ State = 2020;
Match(T__146);
- State = 2034;
- Match(T__28);
- State = 2040;
+ State = 2021;
+ Match(T__29);
+ State = 2027;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
if (_la==QSTRING) {
{
- State = 2035;
+ State = 2022;
compQstring();
- State = 2038;
+ State = 2025;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- if (_la==T__32) {
+ if (_la==T__33) {
{
- State = 2036;
- Match(T__32);
- State = 2037;
+ State = 2023;
+ Match(T__33);
+ State = 2024;
compQstring();
}
}
@@ -11911,31 +11890,31 @@ public PinvImplContext pinvImpl() {
}
}
- State = 2045;
+ State = 2032;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (((((_la - 56)) & ~0x3f) == 0 && ((1L << (_la - 56)) & 8195L) != 0) || ((((_la - 148)) & ~0x3f) == 0 && ((1L << (_la - 148)) & 79L) != 0) || ((((_la - 223)) & ~0x3f) == 0 && ((1L << (_la - 223)) & 251658241L) != 0)) {
+ while (((((_la - 57)) & ~0x3f) == 0 && ((1L << (_la - 57)) & 8195L) != 0) || ((((_la - 148)) & ~0x3f) == 0 && ((1L << (_la - 148)) & 79L) != 0) || ((((_la - 223)) & ~0x3f) == 0 && ((1L << (_la - 223)) & 251658241L) != 0)) {
{
{
- State = 2042;
+ State = 2029;
pinvAttr();
}
}
- State = 2047;
+ State = 2034;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2048;
- Match(T__29);
+ State = 2035;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2049;
+ State = 2036;
Match(T__146);
- State = 2050;
- Match(T__83);
+ State = 2037;
+ Match(T__84);
}
break;
}
@@ -11978,134 +11957,134 @@ public PinvAttrContext pinvAttr() {
PinvAttrContext _localctx = new PinvAttrContext(Context, State);
EnterRule(_localctx, 262, RULE_pinvAttr);
try {
- State = 2080;
+ State = 2067;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,117,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2053;
+ State = 2040;
Match(T__147);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2054;
+ State = 2041;
Match(ANSI);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2055;
- Match(T__55);
+ State = 2042;
+ Match(T__56);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2056;
- Match(T__56);
+ State = 2043;
+ Match(T__57);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2057;
+ State = 2044;
Match(T__148);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2058;
+ State = 2045;
Match(T__149);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2059;
+ State = 2046;
Match(CDECL);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2060;
+ State = 2047;
Match(STDCALL);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2061;
+ State = 2048;
Match(THISCALL);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2062;
+ State = 2049;
Match(FASTCALL);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2063;
+ State = 2050;
Match(T__150);
- State = 2064;
- Match(T__73);
- State = 2065;
+ State = 2051;
+ Match(T__74);
+ State = 2052;
Match(T__151);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2066;
+ State = 2053;
Match(T__150);
- State = 2067;
- Match(T__73);
- State = 2068;
+ State = 2054;
+ Match(T__74);
+ State = 2055;
Match(T__152);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2069;
+ State = 2056;
Match(T__153);
- State = 2070;
- Match(T__73);
- State = 2071;
+ State = 2057;
+ Match(T__74);
+ State = 2058;
Match(T__151);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2072;
+ State = 2059;
Match(T__153);
- State = 2073;
- Match(T__73);
- State = 2074;
+ State = 2060;
+ Match(T__74);
+ State = 2061;
Match(T__152);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2075;
- Match(T__68);
- State = 2076;
- Match(T__28);
- State = 2077;
- int32();
- State = 2078;
+ State = 2062;
+ Match(T__69);
+ State = 2063;
Match(T__29);
+ State = 2064;
+ int32();
+ State = 2065;
+ Match(T__30);
}
break;
}
@@ -12143,31 +12122,31 @@ public MethodNameContext methodName() {
MethodNameContext _localctx = new MethodNameContext(Context, State);
EnterRule(_localctx, 264, RULE_methodName);
try {
- State = 2085;
+ State = 2072;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__114:
+ case T__115:
EnterOuterAlt(_localctx, 1);
{
- State = 2082;
- Match(T__114);
+ State = 2069;
+ Match(T__115);
}
break;
case T__154:
EnterOuterAlt(_localctx, 2);
{
- State = 2083;
+ State = 2070;
Match(T__154);
}
break;
- case VALUE:
+ case T__15:
case INSTANCE:
case SQSTRING:
case DOTTEDNAME:
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 2084;
+ State = 2071;
dottedName();
}
break;
@@ -12209,132 +12188,132 @@ public ImplAttrContext implAttr() {
ImplAttrContext _localctx = new ImplAttrContext(Context, State);
EnterRule(_localctx, 266, RULE_implAttr);
try {
- State = 2108;
+ State = 2095;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
EnterOuterAlt(_localctx, 1);
{
- State = 2087;
+ State = 2074;
Match(T__0);
}
break;
case T__1:
EnterOuterAlt(_localctx, 2);
{
- State = 2088;
+ State = 2075;
Match(T__1);
}
break;
case T__155:
EnterOuterAlt(_localctx, 3);
{
- State = 2089;
+ State = 2076;
Match(T__155);
}
break;
case T__2:
EnterOuterAlt(_localctx, 4);
{
- State = 2090;
+ State = 2077;
Match(T__2);
}
break;
case T__3:
EnterOuterAlt(_localctx, 5);
{
- State = 2091;
+ State = 2078;
Match(T__3);
}
break;
case UNMANAGED:
EnterOuterAlt(_localctx, 6);
{
- State = 2092;
+ State = 2079;
Match(UNMANAGED);
}
break;
case T__4:
EnterOuterAlt(_localctx, 7);
{
- State = 2093;
+ State = 2080;
Match(T__4);
}
break;
case T__5:
EnterOuterAlt(_localctx, 8);
{
- State = 2094;
+ State = 2081;
Match(T__5);
}
break;
case T__6:
EnterOuterAlt(_localctx, 9);
{
- State = 2095;
+ State = 2082;
Match(T__6);
}
break;
case T__7:
EnterOuterAlt(_localctx, 10);
{
- State = 2096;
+ State = 2083;
Match(T__7);
}
break;
case T__8:
EnterOuterAlt(_localctx, 11);
{
- State = 2097;
+ State = 2084;
Match(T__8);
}
break;
case T__9:
EnterOuterAlt(_localctx, 12);
{
- State = 2098;
+ State = 2085;
Match(T__9);
}
break;
case T__10:
EnterOuterAlt(_localctx, 13);
{
- State = 2099;
+ State = 2086;
Match(T__10);
}
break;
case T__11:
EnterOuterAlt(_localctx, 14);
{
- State = 2100;
+ State = 2087;
Match(T__11);
}
break;
case T__12:
EnterOuterAlt(_localctx, 15);
{
- State = 2101;
+ State = 2088;
Match(T__12);
}
break;
case T__13:
EnterOuterAlt(_localctx, 16);
{
- State = 2102;
+ State = 2089;
Match(T__13);
}
break;
- case T__68:
+ case T__69:
EnterOuterAlt(_localctx, 17);
{
- State = 2103;
- Match(T__68);
- State = 2104;
- Match(T__28);
- State = 2105;
- int32();
- State = 2106;
+ State = 2090;
+ Match(T__69);
+ State = 2091;
Match(T__29);
+ State = 2092;
+ int32();
+ State = 2093;
+ Match(T__30);
}
break;
default:
@@ -12380,17 +12359,17 @@ public MethodDeclsContext methodDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2113;
+ State = 2100;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19394592766L) != 0) || _la==T__71 || _la==T__72 || ((((_la - 158)) & ~0x3f) == 0 && ((1L << (_la - 158)) & 1099511627905L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 2303696760354115601L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38789119998L) != 0) || _la==T__72 || _la==T__73 || _la==T__157 || _la==T__164 || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 2303696760354115601L) != 0)) {
{
{
- State = 2110;
+ State = 2097;
methodDecl();
}
}
- State = 2115;
+ State = 2102;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -12509,236 +12488,236 @@ public MethodDeclContext methodDecl() {
EnterRule(_localctx, 270, RULE_methodDecl);
try {
int _alt;
- State = 2224;
+ State = 2211;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,126,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2116;
+ State = 2103;
instr();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2117;
+ State = 2104;
Match(EMITBYTE);
- State = 2118;
+ State = 2105;
int32();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2119;
+ State = 2106;
sehBlock();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2120;
+ State = 2107;
Match(MAXSTACK);
- State = 2121;
+ State = 2108;
int32();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2122;
+ State = 2109;
Match(LOCALS);
- State = 2123;
+ State = 2110;
sigArgs();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2124;
+ State = 2111;
Match(LOCALS);
- State = 2125;
+ State = 2112;
Match(T__156);
- State = 2126;
+ State = 2113;
sigArgs();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2127;
+ State = 2114;
Match(ENTRYPOINT);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2128;
+ State = 2115;
Match(ZEROINIT);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2129;
+ State = 2116;
dataDecl();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2130;
+ State = 2117;
labelDecl();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2131;
+ State = 2118;
secDecl();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2132;
+ State = 2119;
extSourceSpec();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2133;
+ State = 2120;
languageDecl();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2134;
+ State = 2121;
customDescrInMethodBody();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2135;
+ State = 2122;
compControl();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 2136;
+ State = 2123;
Match(EXPORT);
- State = 2137;
- Match(T__40);
- State = 2138;
- int32();
- State = 2139;
+ State = 2124;
Match(T__41);
+ State = 2125;
+ int32();
+ State = 2126;
+ Match(T__42);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 2141;
+ State = 2128;
Match(EXPORT);
- State = 2142;
- Match(T__40);
- State = 2143;
- int32();
- State = 2144;
+ State = 2129;
Match(T__41);
- State = 2145;
- Match(T__32);
- State = 2146;
+ State = 2130;
+ int32();
+ State = 2131;
+ Match(T__42);
+ State = 2132;
+ Match(T__33);
+ State = 2133;
id();
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 2148;
+ State = 2135;
Match(VTENTRY);
- State = 2149;
+ State = 2136;
int32();
- State = 2150;
- Match(T__73);
- State = 2151;
+ State = 2137;
+ Match(T__74);
+ State = 2138;
int32();
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 2153;
+ State = 2140;
Match(OVERRIDE);
- State = 2154;
+ State = 2141;
typeSpec();
- State = 2155;
+ State = 2142;
Match(DCOLON);
- State = 2156;
+ State = 2143;
methodName();
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 2158;
+ State = 2145;
Match(OVERRIDE);
- State = 2159;
+ State = 2146;
Match(METHOD);
- State = 2160;
+ State = 2147;
callConv();
- State = 2161;
+ State = 2148;
type();
- State = 2162;
+ State = 2149;
typeSpec();
- State = 2163;
+ State = 2150;
Match(DCOLON);
- State = 2164;
+ State = 2151;
methodName();
- State = 2165;
+ State = 2152;
genArity();
- State = 2166;
+ State = 2153;
sigArgs();
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 2168;
+ State = 2155;
scopeBlock();
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 2169;
+ State = 2156;
Match(PARAM);
- State = 2170;
+ State = 2157;
Match(TYPE);
- State = 2171;
- Match(T__40);
- State = 2172;
- int32();
- State = 2173;
+ State = 2158;
Match(T__41);
- State = 2177;
+ State = 2159;
+ int32();
+ State = 2160;
+ Match(T__42);
+ State = 2164;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,121,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2174;
+ State = 2161;
customAttrDecl();
}
- }
+ }
}
- State = 2179;
+ State = 2166;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,121,Context);
}
@@ -12747,25 +12726,25 @@ public MethodDeclContext methodDecl() {
case 23:
EnterOuterAlt(_localctx, 23);
{
- State = 2180;
+ State = 2167;
Match(PARAM);
- State = 2181;
+ State = 2168;
Match(TYPE);
- State = 2182;
+ State = 2169;
dottedName();
- State = 2186;
+ State = 2173;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,122,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2183;
+ State = 2170;
customAttrDecl();
}
- }
+ }
}
- State = 2188;
+ State = 2175;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,122,Context);
}
@@ -12774,33 +12753,33 @@ public MethodDeclContext methodDecl() {
case 24:
EnterOuterAlt(_localctx, 24);
{
- State = 2189;
+ State = 2176;
Match(PARAM);
- State = 2190;
+ State = 2177;
Match(CONSTRAINT);
- State = 2191;
- Match(T__40);
- State = 2192;
- int32();
- State = 2193;
+ State = 2178;
Match(T__41);
- State = 2194;
- Match(T__26);
- State = 2195;
+ State = 2179;
+ int32();
+ State = 2180;
+ Match(T__42);
+ State = 2181;
+ Match(T__27);
+ State = 2182;
typeSpec();
- State = 2199;
+ State = 2186;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,123,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2196;
+ State = 2183;
customAttrDecl();
}
- }
+ }
}
- State = 2201;
+ State = 2188;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,123,Context);
}
@@ -12809,29 +12788,29 @@ public MethodDeclContext methodDecl() {
case 25:
EnterOuterAlt(_localctx, 25);
{
- State = 2202;
+ State = 2189;
Match(PARAM);
- State = 2203;
+ State = 2190;
Match(CONSTRAINT);
- State = 2204;
+ State = 2191;
dottedName();
- State = 2205;
- Match(T__26);
- State = 2206;
+ State = 2192;
+ Match(T__27);
+ State = 2193;
typeSpec();
- State = 2210;
+ State = 2197;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,124,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2207;
+ State = 2194;
customAttrDecl();
}
- }
+ }
}
- State = 2212;
+ State = 2199;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,124,Context);
}
@@ -12840,29 +12819,29 @@ public MethodDeclContext methodDecl() {
case 26:
EnterOuterAlt(_localctx, 26);
{
- State = 2213;
+ State = 2200;
Match(PARAM);
- State = 2214;
- Match(T__40);
- State = 2215;
- int32();
- State = 2216;
+ State = 2201;
Match(T__41);
- State = 2217;
+ State = 2202;
+ int32();
+ State = 2203;
+ Match(T__42);
+ State = 2204;
initOpt();
- State = 2221;
+ State = 2208;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,125,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2218;
+ State = 2205;
customAttrDecl();
}
- }
+ }
}
- State = 2223;
+ State = 2210;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,125,Context);
}
@@ -12905,10 +12884,10 @@ public LabelDeclContext labelDecl() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2226;
+ State = 2213;
id();
- State = 2227;
- Match(T__73);
+ State = 2214;
+ Match(T__74);
}
}
catch (RecognitionException re) {
@@ -12947,20 +12926,20 @@ public CustomDescrInMethodBodyContext customDescrInMethodBody() {
CustomDescrInMethodBodyContext _localctx = new CustomDescrInMethodBodyContext(Context, State);
EnterRule(_localctx, 274, RULE_customDescrInMethodBody);
try {
- State = 2231;
+ State = 2218;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,127,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2229;
+ State = 2216;
customDescr();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2230;
+ State = 2217;
customDescrWithOwner();
}
break;
@@ -13001,12 +12980,12 @@ public ScopeBlockContext scopeBlock() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2233;
- Match(T__15);
- State = 2234;
- methodDecls();
- State = 2235;
+ State = 2220;
Match(T__16);
+ State = 2221;
+ methodDecls();
+ State = 2222;
+ Match(T__17);
}
}
catch (RecognitionException re) {
@@ -13047,9 +13026,9 @@ public SehBlockContext sehBlock() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2237;
+ State = 2224;
tryBlock();
- State = 2238;
+ State = 2225;
sehClauses();
}
}
@@ -13092,17 +13071,17 @@ public SehClausesContext sehClauses() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2241;
+ State = 2228;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
do {
{
{
- State = 2240;
+ State = 2227;
sehClause();
}
}
- State = 2243;
+ State = 2230;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
} while ( ((((_la - 160)) & ~0x3f) == 0 && ((1L << (_la - 160)) & 15L) != 0) );
@@ -13153,41 +13132,41 @@ public TryBlockContext tryBlock() {
TryBlockContext _localctx = new TryBlockContext(Context, State);
EnterRule(_localctx, 282, RULE_tryBlock);
try {
- State = 2257;
+ State = 2244;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,129,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2245;
+ State = 2232;
Match(T__157);
- State = 2246;
+ State = 2233;
scopeBlock();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2247;
+ State = 2234;
Match(T__157);
- State = 2248;
+ State = 2235;
id();
- State = 2249;
+ State = 2236;
Match(T__158);
- State = 2250;
+ State = 2237;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2252;
+ State = 2239;
Match(T__157);
- State = 2253;
+ State = 2240;
int32();
- State = 2254;
+ State = 2241;
Match(T__158);
- State = 2255;
+ State = 2242;
int32();
}
break;
@@ -13238,42 +13217,42 @@ public SehClauseContext sehClause() {
SehClauseContext _localctx = new SehClauseContext(Context, State);
EnterRule(_localctx, 284, RULE_sehClause);
try {
- State = 2271;
+ State = 2258;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__160:
EnterOuterAlt(_localctx, 1);
{
- State = 2259;
+ State = 2246;
catchClause();
- State = 2260;
+ State = 2247;
handlerBlock();
}
break;
case T__159:
EnterOuterAlt(_localctx, 2);
{
- State = 2262;
+ State = 2249;
filterClause();
- State = 2263;
+ State = 2250;
handlerBlock();
}
break;
case T__161:
EnterOuterAlt(_localctx, 3);
{
- State = 2265;
+ State = 2252;
finallyClause();
- State = 2266;
+ State = 2253;
handlerBlock();
}
break;
case T__162:
EnterOuterAlt(_localctx, 4);
{
- State = 2268;
+ State = 2255;
faultClause();
- State = 2269;
+ State = 2256;
handlerBlock();
}
break;
@@ -13320,33 +13299,33 @@ public FilterClauseContext filterClause() {
FilterClauseContext _localctx = new FilterClauseContext(Context, State);
EnterRule(_localctx, 286, RULE_filterClause);
try {
- State = 2279;
+ State = 2266;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,131,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2273;
+ State = 2260;
Match(T__159);
- State = 2274;
+ State = 2261;
scopeBlock();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2275;
+ State = 2262;
Match(T__159);
- State = 2276;
+ State = 2263;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2277;
+ State = 2264;
Match(T__159);
- State = 2278;
+ State = 2265;
int32();
}
break;
@@ -13387,9 +13366,9 @@ public CatchClauseContext catchClause() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2281;
+ State = 2268;
Match(T__160);
- State = 2282;
+ State = 2269;
typeSpec();
}
}
@@ -13425,7 +13404,7 @@ public FinallyClauseContext finallyClause() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2284;
+ State = 2271;
Match(T__161);
}
}
@@ -13461,7 +13440,7 @@ public FaultClauseContext faultClause() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2286;
+ State = 2273;
Match(T__162);
}
}
@@ -13510,39 +13489,39 @@ public HandlerBlockContext handlerBlock() {
HandlerBlockContext _localctx = new HandlerBlockContext(Context, State);
EnterRule(_localctx, 294, RULE_handlerBlock);
try {
- State = 2299;
+ State = 2286;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,132,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2288;
+ State = 2275;
scopeBlock();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2289;
+ State = 2276;
Match(T__163);
- State = 2290;
+ State = 2277;
id();
- State = 2291;
+ State = 2278;
Match(T__158);
- State = 2292;
+ State = 2279;
id();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2294;
+ State = 2281;
Match(T__163);
- State = 2295;
+ State = 2282;
int32();
- State = 2296;
+ State = 2283;
Match(T__158);
- State = 2297;
+ State = 2284;
int32();
}
break;
@@ -13586,9 +13565,9 @@ public DataDeclContext dataDecl() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2301;
+ State = 2288;
ddHead();
- State = 2302;
+ State = 2289;
ddBody();
}
}
@@ -13628,28 +13607,28 @@ public DdHeadContext ddHead() {
DdHeadContext _localctx = new DdHeadContext(Context, State);
EnterRule(_localctx, 298, RULE_ddHead);
try {
- State = 2311;
+ State = 2298;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,133,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2304;
+ State = 2291;
Match(T__164);
- State = 2305;
+ State = 2292;
tls();
- State = 2306;
+ State = 2293;
id();
- State = 2307;
- Match(T__34);
+ State = 2294;
+ Match(T__35);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2309;
+ State = 2296;
Match(T__164);
- State = 2310;
+ State = 2297;
tls();
}
break;
@@ -13685,7 +13664,7 @@ public TlsContext tls() {
TlsContext _localctx = new TlsContext(Context, State);
EnterRule(_localctx, 300, RULE_tls);
try {
- State = 2316;
+ State = 2303;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,134,Context) ) {
case 1:
@@ -13696,14 +13675,14 @@ public TlsContext tls() {
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2314;
+ State = 2301;
Match(T__165);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2315;
+ State = 2302;
Match(T__1);
}
break;
@@ -13749,21 +13728,21 @@ public DdBodyContext ddBody() {
EnterRule(_localctx, 302, RULE_ddBody);
int _la;
try {
- State = 2327;
+ State = 2314;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__15:
+ case T__16:
EnterOuterAlt(_localctx, 1);
{
- State = 2318;
- Match(T__15);
- State = 2319;
- ddItemList();
- State = 2320;
+ State = 2305;
Match(T__16);
+ State = 2306;
+ ddItemList();
+ State = 2307;
+ Match(T__17);
}
break;
- case T__82:
+ case T__83:
case CHAR:
case INT8:
case INT16:
@@ -13774,20 +13753,20 @@ public DdBodyContext ddBody() {
case REF:
EnterOuterAlt(_localctx, 2);
{
- State = 2323;
+ State = 2310;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
do {
{
{
- State = 2322;
+ State = 2309;
ddItem();
}
}
- State = 2325;
+ State = 2312;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- } while ( _la==T__82 || ((((_la - 180)) & ~0x3f) == 0 && ((1L << (_la - 180)) & 505L) != 0) || _la==REF );
+ } while ( _la==T__83 || ((((_la - 180)) & ~0x3f) == 0 && ((1L << (_la - 180)) & 505L) != 0) || _la==REF );
}
break;
default:
@@ -13833,25 +13812,25 @@ public DdItemListContext ddItemList() {
int _alt;
EnterOuterAlt(_localctx, 1);
{
- State = 2334;
+ State = 2321;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,137,Context);
while ( _alt!=2 && _alt!=global::Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- State = 2329;
+ State = 2316;
ddItem();
- State = 2330;
- Match(T__26);
+ State = 2317;
+ Match(T__27);
+ }
}
- }
}
- State = 2336;
+ State = 2323;
ErrorHandler.Sync(this);
_alt = Interpreter.AdaptivePredict(TokenStream,137,Context);
}
- State = 2337;
+ State = 2324;
ddItem();
}
}
@@ -13888,7 +13867,7 @@ public DdItemCountContext ddItemCount() {
DdItemCountContext _localctx = new DdItemCountContext(Context, State);
EnterRule(_localctx, 306, RULE_ddItemCount);
try {
- State = 2344;
+ State = 2331;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case T__0:
@@ -13911,27 +13890,28 @@ public DdItemCountContext ddItemCount() {
case T__17:
case T__18:
case T__19:
- case T__21:
+ case T__20:
case T__22:
case T__23:
case T__24:
case T__25:
case T__26:
case T__27:
- case T__30:
+ case T__28:
case T__31:
- case T__33:
- case T__39:
- case T__46:
+ case T__32:
+ case T__34:
+ case T__40:
case T__47:
case T__48:
- case T__71:
+ case T__49:
case T__72:
- case T__82:
- case T__115:
+ case T__73:
+ case T__83:
case T__116:
- case T__118:
+ case T__117:
case T__119:
+ case T__120:
case T__127:
case T__132:
case T__138:
@@ -13945,7 +13925,6 @@ public DdItemCountContext ddItemCount() {
case FLOAT32:
case FLOAT64_:
case MODULE:
- case VALUE:
case INSTANCE:
case UNMANAGED:
case PARAM:
@@ -13988,15 +13967,15 @@ public DdItemCountContext ddItemCount() {
{
}
break;
- case T__40:
+ case T__41:
EnterOuterAlt(_localctx, 2);
{
- State = 2340;
- Match(T__40);
- State = 2341;
- int32();
- State = 2342;
+ State = 2327;
Match(T__41);
+ State = 2328;
+ int32();
+ State = 2329;
+ Match(T__42);
}
break;
default:
@@ -14063,200 +14042,200 @@ public DdItemContext ddItem() {
DdItemContext _localctx = new DdItemContext(Context, State);
EnterRule(_localctx, 308, RULE_ddItem);
try {
- State = 2412;
+ State = 2399;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,139,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2346;
+ State = 2333;
Match(CHAR);
- State = 2347;
+ State = 2334;
Match(PTR);
- State = 2348;
- Match(T__28);
- State = 2349;
- compQstring();
- State = 2350;
+ State = 2335;
Match(T__29);
+ State = 2336;
+ compQstring();
+ State = 2337;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2352;
+ State = 2339;
Match(REF);
- State = 2353;
- Match(T__28);
- State = 2354;
- id();
- State = 2355;
+ State = 2340;
Match(T__29);
+ State = 2341;
+ id();
+ State = 2342;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2357;
+ State = 2344;
Match(REF);
- State = 2358;
+ State = 2345;
id();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2359;
- Match(T__82);
- State = 2360;
- Match(T__28);
- State = 2361;
- bytes();
- State = 2362;
+ State = 2346;
+ Match(T__83);
+ State = 2347;
Match(T__29);
+ State = 2348;
+ bytes();
+ State = 2349;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2364;
+ State = 2351;
Match(FLOAT32);
- State = 2365;
- Match(T__28);
- State = 2366;
- float64();
- State = 2367;
+ State = 2352;
Match(T__29);
- State = 2368;
+ State = 2353;
+ float64();
+ State = 2354;
+ Match(T__30);
+ State = 2355;
ddItemCount();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2370;
+ State = 2357;
Match(FLOAT64_);
- State = 2371;
- Match(T__28);
- State = 2372;
- float64();
- State = 2373;
+ State = 2358;
Match(T__29);
- State = 2374;
+ State = 2359;
+ float64();
+ State = 2360;
+ Match(T__30);
+ State = 2361;
ddItemCount();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2376;
+ State = 2363;
Match(INT64_);
- State = 2377;
- Match(T__28);
- State = 2378;
- int64();
- State = 2379;
+ State = 2364;
Match(T__29);
- State = 2380;
+ State = 2365;
+ int64();
+ State = 2366;
+ Match(T__30);
+ State = 2367;
ddItemCount();
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2382;
+ State = 2369;
Match(INT32_);
- State = 2383;
- Match(T__28);
- State = 2384;
- int32();
- State = 2385;
+ State = 2370;
Match(T__29);
- State = 2386;
+ State = 2371;
+ int32();
+ State = 2372;
+ Match(T__30);
+ State = 2373;
ddItemCount();
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2388;
+ State = 2375;
Match(INT16);
- State = 2389;
- Match(T__28);
- State = 2390;
- int32();
- State = 2391;
+ State = 2376;
Match(T__29);
- State = 2392;
+ State = 2377;
+ int32();
+ State = 2378;
+ Match(T__30);
+ State = 2379;
ddItemCount();
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2394;
+ State = 2381;
Match(INT8);
- State = 2395;
- Match(T__28);
- State = 2396;
- int32();
- State = 2397;
+ State = 2382;
Match(T__29);
- State = 2398;
+ State = 2383;
+ int32();
+ State = 2384;
+ Match(T__30);
+ State = 2385;
ddItemCount();
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2400;
+ State = 2387;
Match(FLOAT32);
- State = 2401;
+ State = 2388;
ddItemCount();
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2402;
+ State = 2389;
Match(FLOAT64_);
- State = 2403;
+ State = 2390;
ddItemCount();
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2404;
+ State = 2391;
Match(INT64_);
- State = 2405;
+ State = 2392;
ddItemCount();
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2406;
+ State = 2393;
Match(INT32_);
- State = 2407;
+ State = 2394;
ddItemCount();
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2408;
+ State = 2395;
Match(INT16);
- State = 2409;
+ State = 2396;
ddItemCount();
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 2410;
+ State = 2397;
Match(INT8);
- State = 2411;
+ State = 2398;
ddItemCount();
}
break;
@@ -14319,202 +14298,202 @@ public FieldSerInitContext fieldSerInit() {
FieldSerInitContext _localctx = new FieldSerInitContext(Context, State);
EnterRule(_localctx, 310, RULE_fieldSerInit);
try {
- State = 2489;
+ State = 2476;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,140,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2414;
+ State = 2401;
Match(FLOAT32);
- State = 2415;
- Match(T__28);
- State = 2416;
- float64();
- State = 2417;
+ State = 2402;
Match(T__29);
+ State = 2403;
+ float64();
+ State = 2404;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2419;
+ State = 2406;
Match(FLOAT64_);
- State = 2420;
- Match(T__28);
- State = 2421;
- float64();
- State = 2422;
+ State = 2407;
Match(T__29);
+ State = 2408;
+ float64();
+ State = 2409;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2424;
+ State = 2411;
Match(FLOAT32);
- State = 2425;
- Match(T__28);
- State = 2426;
- int32();
- State = 2427;
+ State = 2412;
Match(T__29);
+ State = 2413;
+ int32();
+ State = 2414;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2429;
+ State = 2416;
Match(FLOAT64_);
- State = 2430;
- Match(T__28);
- State = 2431;
- int64();
- State = 2432;
+ State = 2417;
Match(T__29);
+ State = 2418;
+ int64();
+ State = 2419;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2434;
+ State = 2421;
Match(INT64_);
- State = 2435;
- Match(T__28);
- State = 2436;
- int64();
- State = 2437;
+ State = 2422;
Match(T__29);
+ State = 2423;
+ int64();
+ State = 2424;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2439;
+ State = 2426;
Match(INT32_);
- State = 2440;
- Match(T__28);
- State = 2441;
- int32();
- State = 2442;
+ State = 2427;
Match(T__29);
+ State = 2428;
+ int32();
+ State = 2429;
+ Match(T__30);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2444;
+ State = 2431;
Match(INT16);
- State = 2445;
- Match(T__28);
- State = 2446;
- int32();
- State = 2447;
+ State = 2432;
Match(T__29);
+ State = 2433;
+ int32();
+ State = 2434;
+ Match(T__30);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2449;
+ State = 2436;
Match(INT8);
- State = 2450;
- Match(T__28);
- State = 2451;
- int32();
- State = 2452;
+ State = 2437;
Match(T__29);
+ State = 2438;
+ int32();
+ State = 2439;
+ Match(T__30);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2454;
+ State = 2441;
Match(UINT64);
- State = 2455;
- Match(T__28);
- State = 2456;
- int64();
- State = 2457;
+ State = 2442;
Match(T__29);
+ State = 2443;
+ int64();
+ State = 2444;
+ Match(T__30);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2459;
+ State = 2446;
Match(UINT32);
- State = 2460;
- Match(T__28);
- State = 2461;
- int32();
- State = 2462;
+ State = 2447;
Match(T__29);
+ State = 2448;
+ int32();
+ State = 2449;
+ Match(T__30);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2464;
+ State = 2451;
Match(UINT16);
- State = 2465;
- Match(T__28);
- State = 2466;
- int32();
- State = 2467;
+ State = 2452;
Match(T__29);
+ State = 2453;
+ int32();
+ State = 2454;
+ Match(T__30);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2469;
+ State = 2456;
Match(UINT8);
- State = 2470;
- Match(T__28);
- State = 2471;
- int32();
- State = 2472;
+ State = 2457;
Match(T__29);
+ State = 2458;
+ int32();
+ State = 2459;
+ Match(T__30);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2474;
+ State = 2461;
Match(CHAR);
- State = 2475;
- Match(T__28);
- State = 2476;
- int32();
- State = 2477;
+ State = 2462;
Match(T__29);
+ State = 2463;
+ int32();
+ State = 2464;
+ Match(T__30);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2479;
+ State = 2466;
Match(BOOL);
- State = 2480;
- Match(T__28);
- State = 2481;
- truefalse();
- State = 2482;
+ State = 2467;
Match(T__29);
+ State = 2468;
+ truefalse();
+ State = 2469;
+ Match(T__30);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2484;
- Match(T__82);
- State = 2485;
- Match(T__28);
- State = 2486;
- bytes();
- State = 2487;
+ State = 2471;
+ Match(T__83);
+ State = 2472;
Match(T__29);
+ State = 2473;
+ bytes();
+ State = 2474;
+ Match(T__30);
}
break;
}
@@ -14558,17 +14537,17 @@ public BytesContext bytes() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2494;
+ State = 2481;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32 || _la==ID || _la==HEXBYTE) {
{
{
- State = 2491;
+ State = 2478;
hexbyte();
}
}
- State = 2496;
+ State = 2483;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -14610,7 +14589,7 @@ public HexbyteContext hexbyte() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2497;
+ State = 2484;
_la = TokenStream.LA(1);
if ( !(_la==INT32 || _la==ID || _la==HEXBYTE) ) {
ErrorHandler.RecoverInline(this);
@@ -14658,10 +14637,10 @@ public FieldInitContext fieldInit() {
FieldInitContext _localctx = new FieldInitContext(Context, State);
EnterRule(_localctx, 316, RULE_fieldInit);
try {
- State = 2502;
+ State = 2489;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__82:
+ case T__83:
case CHAR:
case BOOL:
case INT8:
@@ -14676,21 +14655,21 @@ public FieldInitContext fieldInit() {
case UINT64:
EnterOuterAlt(_localctx, 1);
{
- State = 2499;
+ State = 2486;
fieldSerInit();
}
break;
case QSTRING:
EnterOuterAlt(_localctx, 2);
{
- State = 2500;
+ State = 2487;
compQstring();
}
break;
case NULLREF:
EnterOuterAlt(_localctx, 3);
{
- State = 2501;
+ State = 2488;
Match(NULLREF);
}
break;
@@ -14787,379 +14766,379 @@ public SerInitContext serInit() {
SerInitContext _localctx = new SerInitContext(Context, State);
EnterRule(_localctx, 318, RULE_serInit);
try {
- State = 2652;
+ State = 2639;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,143,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2504;
+ State = 2491;
fieldSerInit();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2505;
+ State = 2492;
Match(STRING);
- State = 2506;
- Match(T__28);
- State = 2507;
- Match(NULLREF);
- State = 2508;
+ State = 2493;
Match(T__29);
+ State = 2494;
+ Match(NULLREF);
+ State = 2495;
+ Match(T__30);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2509;
+ State = 2496;
Match(STRING);
- State = 2510;
- Match(T__28);
- State = 2511;
- Match(SQSTRING);
- State = 2512;
+ State = 2497;
Match(T__29);
+ State = 2498;
+ Match(SQSTRING);
+ State = 2499;
+ Match(T__30);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2513;
+ State = 2500;
Match(TYPE);
- State = 2514;
- Match(T__28);
- State = 2515;
- Match(T__37);
- State = 2516;
- Match(SQSTRING);
- State = 2517;
+ State = 2501;
Match(T__29);
+ State = 2502;
+ Match(T__38);
+ State = 2503;
+ Match(SQSTRING);
+ State = 2504;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2518;
+ State = 2505;
Match(TYPE);
- State = 2519;
- Match(T__28);
- State = 2520;
- className();
- State = 2521;
+ State = 2506;
Match(T__29);
+ State = 2507;
+ className();
+ State = 2508;
+ Match(T__30);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2523;
+ State = 2510;
Match(TYPE);
- State = 2524;
- Match(T__28);
- State = 2525;
- Match(NULLREF);
- State = 2526;
+ State = 2511;
Match(T__29);
+ State = 2512;
+ Match(NULLREF);
+ State = 2513;
+ Match(T__30);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2527;
+ State = 2514;
Match(OBJECT);
- State = 2528;
- Match(T__28);
- State = 2529;
- serInit();
- State = 2530;
+ State = 2515;
Match(T__29);
+ State = 2516;
+ serInit();
+ State = 2517;
+ Match(T__30);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2532;
+ State = 2519;
Match(FLOAT32);
- State = 2533;
- Match(T__40);
- State = 2534;
- int32();
- State = 2535;
+ State = 2520;
Match(T__41);
- State = 2536;
- Match(T__28);
- State = 2537;
- f32seq();
- State = 2538;
+ State = 2521;
+ int32();
+ State = 2522;
+ Match(T__42);
+ State = 2523;
Match(T__29);
+ State = 2524;
+ f32seq();
+ State = 2525;
+ Match(T__30);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2540;
+ State = 2527;
Match(FLOAT64_);
- State = 2541;
- Match(T__40);
- State = 2542;
- int32();
- State = 2543;
+ State = 2528;
Match(T__41);
- State = 2544;
- Match(T__28);
- State = 2545;
- f64seq();
- State = 2546;
+ State = 2529;
+ int32();
+ State = 2530;
+ Match(T__42);
+ State = 2531;
Match(T__29);
+ State = 2532;
+ f64seq();
+ State = 2533;
+ Match(T__30);
}
break;
case 10:
EnterOuterAlt(_localctx, 10);
{
- State = 2548;
+ State = 2535;
Match(INT64_);
- State = 2549;
- Match(T__40);
- State = 2550;
- int32();
- State = 2551;
+ State = 2536;
Match(T__41);
- State = 2552;
- Match(T__28);
- State = 2553;
- i64seq();
- State = 2554;
+ State = 2537;
+ int32();
+ State = 2538;
+ Match(T__42);
+ State = 2539;
Match(T__29);
+ State = 2540;
+ i64seq();
+ State = 2541;
+ Match(T__30);
}
break;
case 11:
EnterOuterAlt(_localctx, 11);
{
- State = 2556;
+ State = 2543;
Match(INT32_);
- State = 2557;
- Match(T__40);
- State = 2558;
- int32();
- State = 2559;
+ State = 2544;
Match(T__41);
- State = 2560;
- Match(T__28);
- State = 2561;
- i32seq();
- State = 2562;
+ State = 2545;
+ int32();
+ State = 2546;
+ Match(T__42);
+ State = 2547;
Match(T__29);
+ State = 2548;
+ i32seq();
+ State = 2549;
+ Match(T__30);
}
break;
case 12:
EnterOuterAlt(_localctx, 12);
{
- State = 2564;
+ State = 2551;
Match(INT16);
- State = 2565;
- Match(T__40);
- State = 2566;
- int32();
- State = 2567;
+ State = 2552;
Match(T__41);
- State = 2568;
- Match(T__28);
- State = 2569;
- i16seq();
- State = 2570;
+ State = 2553;
+ int32();
+ State = 2554;
+ Match(T__42);
+ State = 2555;
Match(T__29);
+ State = 2556;
+ i16seq();
+ State = 2557;
+ Match(T__30);
}
break;
case 13:
EnterOuterAlt(_localctx, 13);
{
- State = 2572;
+ State = 2559;
Match(INT8);
- State = 2573;
- Match(T__40);
- State = 2574;
- int32();
- State = 2575;
+ State = 2560;
Match(T__41);
- State = 2576;
- Match(T__28);
- State = 2577;
- i8seq();
- State = 2578;
+ State = 2561;
+ int32();
+ State = 2562;
+ Match(T__42);
+ State = 2563;
Match(T__29);
+ State = 2564;
+ i8seq();
+ State = 2565;
+ Match(T__30);
}
break;
case 14:
EnterOuterAlt(_localctx, 14);
{
- State = 2580;
+ State = 2567;
Match(UINT64);
- State = 2581;
- Match(T__40);
- State = 2582;
- int32();
- State = 2583;
+ State = 2568;
Match(T__41);
- State = 2584;
- Match(T__28);
- State = 2585;
- i64seq();
- State = 2586;
+ State = 2569;
+ int32();
+ State = 2570;
+ Match(T__42);
+ State = 2571;
Match(T__29);
+ State = 2572;
+ i64seq();
+ State = 2573;
+ Match(T__30);
}
break;
case 15:
EnterOuterAlt(_localctx, 15);
{
- State = 2588;
+ State = 2575;
Match(UINT32);
- State = 2589;
- Match(T__40);
- State = 2590;
- int32();
- State = 2591;
+ State = 2576;
Match(T__41);
- State = 2592;
- Match(T__28);
- State = 2593;
- i32seq();
- State = 2594;
+ State = 2577;
+ int32();
+ State = 2578;
+ Match(T__42);
+ State = 2579;
Match(T__29);
+ State = 2580;
+ i32seq();
+ State = 2581;
+ Match(T__30);
}
break;
case 16:
EnterOuterAlt(_localctx, 16);
{
- State = 2596;
+ State = 2583;
Match(UINT16);
- State = 2597;
- Match(T__40);
- State = 2598;
- int32();
- State = 2599;
+ State = 2584;
Match(T__41);
- State = 2600;
- Match(T__28);
- State = 2601;
- i16seq();
- State = 2602;
+ State = 2585;
+ int32();
+ State = 2586;
+ Match(T__42);
+ State = 2587;
Match(T__29);
+ State = 2588;
+ i16seq();
+ State = 2589;
+ Match(T__30);
}
break;
case 17:
EnterOuterAlt(_localctx, 17);
{
- State = 2604;
+ State = 2591;
Match(UINT8);
- State = 2605;
- Match(T__40);
- State = 2606;
- int32();
- State = 2607;
+ State = 2592;
Match(T__41);
- State = 2608;
- Match(T__28);
- State = 2609;
- i8seq();
- State = 2610;
+ State = 2593;
+ int32();
+ State = 2594;
+ Match(T__42);
+ State = 2595;
Match(T__29);
+ State = 2596;
+ i8seq();
+ State = 2597;
+ Match(T__30);
}
break;
case 18:
EnterOuterAlt(_localctx, 18);
{
- State = 2612;
+ State = 2599;
Match(CHAR);
- State = 2613;
- Match(T__40);
- State = 2614;
- int32();
- State = 2615;
+ State = 2600;
Match(T__41);
- State = 2616;
- Match(T__28);
- State = 2617;
- i16seq();
- State = 2618;
+ State = 2601;
+ int32();
+ State = 2602;
+ Match(T__42);
+ State = 2603;
Match(T__29);
+ State = 2604;
+ i16seq();
+ State = 2605;
+ Match(T__30);
}
break;
case 19:
EnterOuterAlt(_localctx, 19);
{
- State = 2620;
+ State = 2607;
Match(BOOL);
- State = 2621;
- Match(T__40);
- State = 2622;
- int32();
- State = 2623;
+ State = 2608;
Match(T__41);
- State = 2624;
- Match(T__28);
- State = 2625;
- boolSeq();
- State = 2626;
+ State = 2609;
+ int32();
+ State = 2610;
+ Match(T__42);
+ State = 2611;
Match(T__29);
+ State = 2612;
+ boolSeq();
+ State = 2613;
+ Match(T__30);
}
break;
case 20:
EnterOuterAlt(_localctx, 20);
{
- State = 2628;
+ State = 2615;
Match(STRING);
- State = 2629;
- Match(T__40);
- State = 2630;
- int32();
- State = 2631;
+ State = 2616;
Match(T__41);
- State = 2632;
- Match(T__28);
- State = 2633;
- sqstringSeq();
- State = 2634;
+ State = 2617;
+ int32();
+ State = 2618;
+ Match(T__42);
+ State = 2619;
Match(T__29);
+ State = 2620;
+ sqstringSeq();
+ State = 2621;
+ Match(T__30);
}
break;
case 21:
EnterOuterAlt(_localctx, 21);
{
- State = 2636;
+ State = 2623;
Match(TYPE);
- State = 2637;
- Match(T__40);
- State = 2638;
- int32();
- State = 2639;
+ State = 2624;
Match(T__41);
- State = 2640;
- Match(T__28);
- State = 2641;
- classSeq();
- State = 2642;
+ State = 2625;
+ int32();
+ State = 2626;
+ Match(T__42);
+ State = 2627;
Match(T__29);
+ State = 2628;
+ classSeq();
+ State = 2629;
+ Match(T__30);
}
break;
case 22:
EnterOuterAlt(_localctx, 22);
{
- State = 2644;
+ State = 2631;
Match(OBJECT);
- State = 2645;
- Match(T__40);
- State = 2646;
- int32();
- State = 2647;
+ State = 2632;
Match(T__41);
- State = 2648;
- Match(T__28);
- State = 2649;
- objSeq();
- State = 2650;
+ State = 2633;
+ int32();
+ State = 2634;
+ Match(T__42);
+ State = 2635;
Match(T__29);
+ State = 2636;
+ objSeq();
+ State = 2637;
+ Match(T__30);
}
break;
}
@@ -15209,29 +15188,29 @@ public F32seqContext f32seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2658;
+ State = 2645;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (((((_la - 172)) & ~0x3f) == 0 && ((1L << (_la - 172)) & 98309L) != 0)) {
{
- State = 2656;
+ State = 2643;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,144,Context) ) {
case 1:
{
- State = 2654;
+ State = 2641;
float64();
}
break;
case 2:
{
- State = 2655;
+ State = 2642;
int32();
}
break;
}
}
- State = 2660;
+ State = 2647;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15282,29 +15261,29 @@ public F64seqContext f64seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2665;
+ State = 2652;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (((((_la - 172)) & ~0x3f) == 0 && ((1L << (_la - 172)) & 98311L) != 0)) {
{
- State = 2663;
+ State = 2650;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,146,Context) ) {
case 1:
{
- State = 2661;
+ State = 2648;
float64();
}
break;
case 2:
{
- State = 2662;
+ State = 2649;
int64();
}
break;
}
}
- State = 2667;
+ State = 2654;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15349,17 +15328,17 @@ public I64seqContext i64seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2671;
+ State = 2658;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32 || _la==INT64) {
{
{
- State = 2668;
+ State = 2655;
int64();
}
}
- State = 2673;
+ State = 2660;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15404,17 +15383,17 @@ public I32seqContext i32seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2677;
+ State = 2664;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32) {
{
{
- State = 2674;
+ State = 2661;
int32();
}
}
- State = 2679;
+ State = 2666;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15459,17 +15438,17 @@ public I16seqContext i16seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2683;
+ State = 2670;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32) {
{
{
- State = 2680;
+ State = 2667;
int32();
}
}
- State = 2685;
+ State = 2672;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15514,17 +15493,17 @@ public I8seqContext i8seq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2689;
+ State = 2676;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==INT32) {
{
{
- State = 2686;
+ State = 2673;
int32();
}
}
- State = 2691;
+ State = 2678;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15569,17 +15548,17 @@ public BoolSeqContext boolSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2695;
+ State = 2682;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__93 || _la==T__94) {
+ while (_la==T__94 || _la==T__95) {
{
{
- State = 2692;
+ State = 2679;
truefalse();
}
}
- State = 2697;
+ State = 2684;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15626,13 +15605,13 @@ public SqstringSeqContext sqstringSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2701;
+ State = 2688;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
while (_la==NULLREF || _la==SQSTRING) {
{
{
- State = 2698;
+ State = 2685;
_la = TokenStream.LA(1);
if ( !(_la==NULLREF || _la==SQSTRING) ) {
ErrorHandler.RecoverInline(this);
@@ -15643,7 +15622,7 @@ public SqstringSeqContext sqstringSeq() {
}
}
}
- State = 2703;
+ State = 2690;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15688,17 +15667,17 @@ public ClassSeqContext classSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2707;
+ State = 2694;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__37 || _la==T__40 || _la==T__111 || _la==NULLREF || _la==VALUE || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105553118478337L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4947802390528L) != 0) || _la==T__112 || _la==NULLREF || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105553118478337L) != 0)) {
{
{
- State = 2704;
+ State = 2691;
classSeqElement();
}
}
- State = 2709;
+ State = 2696;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15739,28 +15718,28 @@ public ClassSeqElementContext classSeqElement() {
ClassSeqElementContext _localctx = new ClassSeqElementContext(Context, State);
EnterRule(_localctx, 338, RULE_classSeqElement);
try {
- State = 2714;
+ State = 2701;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case NULLREF:
EnterOuterAlt(_localctx, 1);
{
- State = 2710;
+ State = 2697;
Match(NULLREF);
}
break;
- case T__37:
+ case T__38:
EnterOuterAlt(_localctx, 2);
{
- State = 2711;
- Match(T__37);
- State = 2712;
+ State = 2698;
+ Match(T__38);
+ State = 2699;
Match(SQSTRING);
}
break;
- case T__40:
- case T__111:
- case VALUE:
+ case T__15:
+ case T__41:
+ case T__112:
case INSTANCE:
case THIS:
case BASE:
@@ -15770,7 +15749,7 @@ public ClassSeqElementContext classSeqElement() {
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 2713;
+ State = 2700;
className();
}
break;
@@ -15817,17 +15796,17 @@ public ObjSeqContext objSeq() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2719;
+ State = 2706;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__82 || ((((_la - 180)) & ~0x3f) == 0 && ((1L << (_la - 180)) & 106495L) != 0)) {
+ while (_la==T__83 || ((((_la - 180)) & ~0x3f) == 0 && ((1L << (_la - 180)) & 106495L) != 0)) {
{
{
- State = 2716;
+ State = 2703;
serInit();
}
}
- State = 2721;
+ State = 2708;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -15872,27 +15851,27 @@ public CustomAttrDeclContext customAttrDecl() {
CustomAttrDeclContext _localctx = new CustomAttrDeclContext(Context, State);
EnterRule(_localctx, 342, RULE_customAttrDecl);
try {
- State = 2725;
+ State = 2712;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,157,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2722;
+ State = 2709;
customDescr();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2723;
+ State = 2710;
customDescrWithOwner();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2724;
+ State = 2711;
dottedName();
}
break;
@@ -15946,80 +15925,80 @@ public AsmOrRefDeclContext asmOrRefDecl() {
AsmOrRefDeclContext _localctx = new AsmOrRefDeclContext(Context, State);
EnterRule(_localctx, 344, RULE_asmOrRefDecl);
try {
- State = 2752;
+ State = 2739;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,158,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2727;
+ State = 2714;
Match(T__166);
- State = 2728;
- Match(T__34);
- State = 2729;
- Match(T__28);
- State = 2730;
- bytes();
- State = 2731;
+ State = 2715;
+ Match(T__35);
+ State = 2716;
Match(T__29);
+ State = 2717;
+ bytes();
+ State = 2718;
+ Match(T__30);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2733;
+ State = 2720;
Match(T__167);
- State = 2734;
+ State = 2721;
intOrWildcard();
- State = 2735;
- Match(T__73);
- State = 2736;
+ State = 2722;
+ Match(T__74);
+ State = 2723;
intOrWildcard();
- State = 2737;
- Match(T__73);
- State = 2738;
+ State = 2724;
+ Match(T__74);
+ State = 2725;
intOrWildcard();
- State = 2739;
- Match(T__73);
- State = 2740;
+ State = 2726;
+ Match(T__74);
+ State = 2727;
intOrWildcard();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2742;
+ State = 2729;
Match(T__168);
- State = 2743;
+ State = 2730;
compQstring();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2744;
+ State = 2731;
Match(T__168);
- State = 2745;
- Match(T__34);
- State = 2746;
- Match(T__28);
- State = 2747;
- bytes();
- State = 2748;
+ State = 2732;
+ Match(T__35);
+ State = 2733;
Match(T__29);
+ State = 2734;
+ bytes();
+ State = 2735;
+ Match(T__30);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2750;
+ State = 2737;
customAttrDecl();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2751;
+ State = 2738;
compControl();
}
break;
@@ -16064,36 +16043,36 @@ public AssemblyRefHeadContext assemblyRefHead() {
AssemblyRefHeadContext _localctx = new AssemblyRefHeadContext(Context, State);
EnterRule(_localctx, 346, RULE_assemblyRefHead);
try {
- State = 2766;
+ State = 2753;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,159,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2754;
- Match(T__23);
- State = 2755;
- Match(T__38);
- State = 2756;
+ State = 2741;
+ Match(T__24);
+ State = 2742;
+ Match(T__39);
+ State = 2743;
asmAttr();
- State = 2757;
+ State = 2744;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2759;
- Match(T__23);
- State = 2760;
- Match(T__38);
- State = 2761;
+ State = 2746;
+ Match(T__24);
+ State = 2747;
+ Match(T__39);
+ State = 2748;
asmAttr();
- State = 2762;
+ State = 2749;
dottedName();
- State = 2763;
- Match(T__32);
- State = 2764;
+ State = 2750;
+ Match(T__33);
+ State = 2751;
dottedName();
}
break;
@@ -16138,17 +16117,17 @@ public AssemblyRefDeclsContext assemblyRefDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2771;
+ State = 2758;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 18014417836834816L) != 0) || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 2147487759L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 36028835673735168L) != 0) || ((((_la - 167)) & ~0x3f) == 0 && ((1L << (_la - 167)) & 4111L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
{
{
- State = 2768;
+ State = 2755;
assemblyRefDecl();
}
}
- State = 2773;
+ State = 2760;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -16191,30 +16170,30 @@ public AssemblyRefDeclContext assemblyRefDecl() {
AssemblyRefDeclContext _localctx = new AssemblyRefDeclContext(Context, State);
EnterRule(_localctx, 350, RULE_assemblyRefDecl);
try {
- State = 2788;
+ State = 2775;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
case HASH:
EnterOuterAlt(_localctx, 1);
{
- State = 2774;
+ State = 2761;
Match(HASH);
- State = 2775;
- Match(T__34);
- State = 2776;
- Match(T__28);
- State = 2777;
- bytes();
- State = 2778;
+ State = 2762;
+ Match(T__35);
+ State = 2763;
Match(T__29);
+ State = 2764;
+ bytes();
+ State = 2765;
+ Match(T__30);
}
break;
- case T__30:
- case T__33:
+ case T__15:
+ case T__31:
+ case T__34:
case T__166:
case T__167:
case T__168:
- case VALUE:
case INSTANCE:
case SQSTRING:
case PP_DEFINE:
@@ -16228,30 +16207,30 @@ public AssemblyRefDeclContext assemblyRefDecl() {
case ID:
EnterOuterAlt(_localctx, 2);
{
- State = 2780;
+ State = 2767;
asmOrRefDecl();
}
break;
case T__169:
EnterOuterAlt(_localctx, 3);
{
- State = 2781;
+ State = 2768;
Match(T__169);
- State = 2782;
- Match(T__34);
- State = 2783;
- Match(T__28);
- State = 2784;
- bytes();
- State = 2785;
+ State = 2769;
+ Match(T__35);
+ State = 2770;
Match(T__29);
+ State = 2771;
+ bytes();
+ State = 2772;
+ Match(T__30);
}
break;
- case T__53:
+ case T__54:
EnterOuterAlt(_localctx, 4);
{
- State = 2787;
- Match(T__53);
+ State = 2774;
+ Match(T__54);
}
break;
default:
@@ -16300,25 +16279,25 @@ public ExptypeHeadContext exptypeHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2790;
- Match(T__48);
- State = 2791;
- Match(T__38);
- State = 2795;
+ State = 2777;
+ Match(T__49);
+ State = 2778;
+ Match(T__39);
+ State = 2782;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2309220708934221824L) != 0) || _la==T__170) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4618441417868443648L) != 0) || _la==T__170) {
{
{
- State = 2792;
+ State = 2779;
exptAttr();
}
}
- State = 2797;
+ State = 2784;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2798;
+ State = 2785;
dottedName();
}
}
@@ -16365,23 +16344,23 @@ public ExportHeadContext exportHead() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2800;
+ State = 2787;
Match(EXPORT);
- State = 2804;
+ State = 2791;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 2309220708934221824L) != 0) || _la==T__170) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 4618441417868443648L) != 0) || _la==T__170) {
{
{
- State = 2801;
+ State = 2788;
exptAttr();
}
}
- State = 2806;
+ State = 2793;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2807;
+ State = 2794;
dottedName();
}
}
@@ -16415,82 +16394,82 @@ public ExptAttrContext exptAttr() {
ExptAttrContext _localctx = new ExptAttrContext(Context, State);
EnterRule(_localctx, 356, RULE_exptAttr);
try {
- State = 2824;
+ State = 2811;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,164,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2809;
- Match(T__50);
+ State = 2796;
+ Match(T__51);
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2810;
- Match(T__49);
+ State = 2797;
+ Match(T__50);
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2811;
+ State = 2798;
Match(T__170);
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2812;
- Match(T__60);
- State = 2813;
- Match(T__49);
+ State = 2799;
+ Match(T__61);
+ State = 2800;
+ Match(T__50);
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2814;
- Match(T__60);
- State = 2815;
- Match(T__50);
+ State = 2801;
+ Match(T__61);
+ State = 2802;
+ Match(T__51);
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2816;
- Match(T__60);
- State = 2817;
+ State = 2803;
Match(T__61);
+ State = 2804;
+ Match(T__62);
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2818;
- Match(T__60);
- State = 2819;
- Match(T__62);
+ State = 2805;
+ Match(T__61);
+ State = 2806;
+ Match(T__63);
}
break;
case 8:
EnterOuterAlt(_localctx, 8);
{
- State = 2820;
- Match(T__60);
- State = 2821;
- Match(T__63);
+ State = 2807;
+ Match(T__61);
+ State = 2808;
+ Match(T__64);
}
break;
case 9:
EnterOuterAlt(_localctx, 9);
{
- State = 2822;
- Match(T__60);
- State = 2823;
- Match(T__64);
+ State = 2809;
+ Match(T__61);
+ State = 2810;
+ Match(T__65);
}
break;
}
@@ -16534,17 +16513,17 @@ public ExptypeDeclsContext exptypeDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2829;
+ State = 2816;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 562969298599936L) != 0) || _la==T__111 || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 1125938597265408L) != 0) || _la==T__112 || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
{
{
- State = 2826;
+ State = 2813;
exptypeDecl();
}
}
- State = 2831;
+ State = 2818;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -16598,67 +16577,67 @@ public ExptypeDeclContext exptypeDecl() {
ExptypeDeclContext _localctx = new ExptypeDeclContext(Context, State);
EnterRule(_localctx, 360, RULE_exptypeDecl);
try {
- State = 2845;
+ State = 2832;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,166,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2832;
- Match(T__19);
- State = 2833;
+ State = 2819;
+ Match(T__20);
+ State = 2820;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2834;
- Match(T__48);
- State = 2835;
- Match(T__38);
- State = 2836;
+ State = 2821;
+ Match(T__49);
+ State = 2822;
+ Match(T__39);
+ State = 2823;
slashedName();
}
break;
case 3:
EnterOuterAlt(_localctx, 3);
{
- State = 2837;
- Match(T__23);
- State = 2838;
- Match(T__38);
- State = 2839;
+ State = 2824;
+ Match(T__24);
+ State = 2825;
+ Match(T__39);
+ State = 2826;
dottedName();
}
break;
case 4:
EnterOuterAlt(_localctx, 4);
{
- State = 2840;
+ State = 2827;
mdtoken();
}
break;
case 5:
EnterOuterAlt(_localctx, 5);
{
- State = 2841;
- Match(T__48);
- State = 2842;
+ State = 2828;
+ Match(T__49);
+ State = 2829;
int32();
}
break;
case 6:
EnterOuterAlt(_localctx, 6);
{
- State = 2843;
+ State = 2830;
customAttrDecl();
}
break;
case 7:
EnterOuterAlt(_localctx, 7);
{
- State = 2844;
+ State = 2831;
compControl();
}
break;
@@ -16708,56 +16687,56 @@ public ManifestResHeadContext manifestResHead() {
EnterRule(_localctx, 362, RULE_manifestResHead);
int _la;
try {
- State = 2866;
+ State = 2853;
ErrorHandler.Sync(this);
switch ( Interpreter.AdaptivePredict(TokenStream,169,Context) ) {
case 1:
EnterOuterAlt(_localctx, 1);
{
- State = 2847;
+ State = 2834;
Match(MRESOURCE);
- State = 2851;
+ State = 2838;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__49 || _la==T__50) {
+ while (_la==T__50 || _la==T__51) {
{
{
- State = 2848;
+ State = 2835;
manresAttr();
}
}
- State = 2853;
+ State = 2840;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2854;
+ State = 2841;
dottedName();
}
break;
case 2:
EnterOuterAlt(_localctx, 2);
{
- State = 2855;
+ State = 2842;
Match(MRESOURCE);
- State = 2859;
+ State = 2846;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while (_la==T__49 || _la==T__50) {
+ while (_la==T__50 || _la==T__51) {
{
{
- State = 2856;
+ State = 2843;
manresAttr();
}
}
- State = 2861;
+ State = 2848;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
- State = 2862;
+ State = 2849;
dottedName();
- State = 2863;
- Match(T__32);
- State = 2864;
+ State = 2850;
+ Match(T__33);
+ State = 2851;
dottedName();
}
break;
@@ -16796,9 +16775,9 @@ public ManresAttrContext manresAttr() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2868;
+ State = 2855;
_la = TokenStream.LA(1);
- if ( !(_la==T__49 || _la==T__50) ) {
+ if ( !(_la==T__50 || _la==T__51) ) {
ErrorHandler.RecoverInline(this);
}
else {
@@ -16846,17 +16825,17 @@ public ManifestResDeclsContext manifestResDecls() {
try {
EnterOuterAlt(_localctx, 1);
{
- State = 2873;
+ State = 2860;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 19345178624L) != 0) || _la==VALUE || _la==INSTANCE || ((((_la - 263)) & ~0x3f) == 0 && ((1L << (_la - 263)) & 50332665L) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 38690422784L) != 0) || ((((_la - 242)) & ~0x3f) == 0 && ((1L << (_la - 242)) & 105555249070081L) != 0)) {
{
{
- State = 2870;
+ State = 2857;
manifestResDecl();
}
}
- State = 2875;
+ State = 2862;
ErrorHandler.Sync(this);
_la = TokenStream.LA(1);
}
@@ -16904,46 +16883,46 @@ public ManifestResDeclContext manifestResDecl() {
ManifestResDeclContext _localctx = new ManifestResDeclContext(Context, State);
EnterRule(_localctx, 368, RULE_manifestResDecl);
try {
- State = 2886;
+ State = 2873;
ErrorHandler.Sync(this);
switch (TokenStream.LA(1)) {
- case T__19:
+ case T__20:
EnterOuterAlt(_localctx, 1);
{
- State = 2876;
- Match(T__19);
- State = 2877;
+ State = 2863;
+ Match(T__20);
+ State = 2864;
dottedName();
- State = 2878;
- Match(T__42);
- State = 2879;
+ State = 2865;
+ Match(T__43);
+ State = 2866;
int32();
}
break;
- case T__23:
+ case T__24:
EnterOuterAlt(_localctx, 2);
{
- State = 2881;
- Match(T__23);
- State = 2882;
- Match(T__38);
- State = 2883;
+ State = 2868;
+ Match(T__24);
+ State = 2869;
+ Match(T__39);
+ State = 2870;
dottedName();
}
break;
- case T__33:
- case VALUE:
+ case T__15:
+ case T__34:
case INSTANCE:
case SQSTRING:
case DOTTEDNAME:
case ID:
EnterOuterAlt(_localctx, 3);
{
- State = 2884;
+ State = 2871;
customAttrDecl();
}
break;
- case T__30:
+ case T__31:
case PP_DEFINE:
case PP_UNDEF:
case PP_IFDEF:
@@ -16953,7 +16932,7 @@ public ManifestResDeclContext manifestResDecl() {
case PP_INCLUDE:
EnterOuterAlt(_localctx, 4);
{
- State = 2885;
+ State = 2872;
compControl();
}
break;
@@ -16990,7 +16969,7 @@ private bool vtfixupAttr_sempred(VtfixupAttrContext _localctx, int predIndex) {
}
private static int[] _serializedATN = {
- 4,1,304,2889,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,
+ 4,1,304,2876,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,
7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,
2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,
2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,
@@ -17019,182 +16998,181 @@ private bool vtfixupAttr_sempred(VtfixupAttrContext _localctx, int predIndex) {
2,171,7,171,2,172,7,172,2,173,7,173,2,174,7,174,2,175,7,175,2,176,7,176,
2,177,7,177,2,178,7,178,2,179,7,179,2,180,7,180,2,181,7,181,2,182,7,182,
2,183,7,183,2,184,7,184,1,0,1,0,1,1,1,1,1,1,1,1,5,1,377,8,1,10,1,12,1,
- 380,9,1,1,1,3,1,383,8,1,1,2,1,2,1,3,1,3,5,3,389,8,3,10,3,12,3,392,9,3,
- 1,3,1,3,1,4,5,4,397,8,4,10,4,12,4,400,9,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,
+ 380,9,1,1,1,1,1,3,1,384,8,1,1,2,1,2,1,3,1,3,5,3,390,8,3,10,3,12,3,393,
+ 9,3,1,3,1,3,1,4,5,4,398,8,4,10,4,12,4,401,9,4,1,5,1,5,1,5,1,5,1,5,1,5,
1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,
5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,
- 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,452,8,5,1,6,1,6,1,6,1,7,1,7,1,7,1,
- 8,1,8,1,8,1,8,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,
- 1,11,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,
- 1,13,1,13,1,13,3,13,493,8,13,1,14,1,14,1,15,1,15,1,15,5,15,500,8,15,10,
- 15,12,15,503,9,15,1,15,1,15,1,16,1,16,1,17,1,17,1,18,1,18,1,18,1,18,1,
- 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,526,8,18,1,19,
- 1,19,3,19,530,8,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,
- 20,1,20,1,20,1,20,1,20,1,20,3,20,548,8,20,1,21,1,21,1,21,1,21,1,21,1,21,
+ 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,453,8,5,1,6,1,6,1,6,1,7,1,7,1,
+ 7,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,
+ 1,11,1,11,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,
+ 1,13,1,13,1,13,1,13,3,13,494,8,13,1,14,1,14,1,15,1,15,1,15,5,15,501,8,
+ 15,10,15,12,15,504,9,15,1,15,1,15,1,16,1,16,1,17,1,17,1,18,1,18,1,18,1,
+ 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,527,8,18,
+ 1,19,1,19,3,19,531,8,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,
+ 20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,549,8,20,1,21,1,21,1,21,1,21,1,21,
1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,
- 1,21,1,21,1,21,1,21,1,21,3,21,575,8,21,1,22,1,22,1,22,1,22,1,22,1,22,1,
+ 1,21,1,21,1,21,1,21,1,21,1,21,3,21,576,8,21,1,22,1,22,1,22,1,22,1,22,1,
22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,
- 22,3,22,598,8,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,
+ 22,1,22,3,22,599,8,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,
1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,
- 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,634,8,23,1,24,1,24,1,
- 25,1,25,3,25,640,8,25,1,26,1,26,1,26,1,27,1,27,5,27,647,8,27,10,27,12,
- 27,650,9,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,659,8,28,10,28,12,
- 28,662,9,28,1,29,1,29,1,30,1,30,3,30,668,8,30,1,31,1,31,1,31,1,31,1,31,
- 1,31,1,31,1,31,1,31,3,31,679,8,31,1,32,1,32,1,32,1,32,1,32,1,32,3,32,687,
- 8,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,
- 1,34,1,34,1,34,1,34,1,34,1,34,5,34,708,8,34,10,34,12,34,711,9,34,1,35,
- 1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,37,1,37,5,37,724,8,37,10,37,
- 12,37,727,9,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,
- 1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,
- 1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,
- 1,38,1,38,1,38,3,38,771,8,38,1,39,1,39,1,39,3,39,776,8,39,1,40,1,40,1,
- 40,3,40,781,8,40,1,41,5,41,784,8,41,10,41,12,41,787,9,41,1,42,1,42,1,42,
- 5,42,792,8,42,10,42,12,42,795,9,42,1,42,1,42,1,43,1,43,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,
- 1,44,1,44,3,44,904,8,44,1,45,1,45,5,45,908,8,45,10,45,12,45,911,9,45,1,
- 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,5,45,924,8,45,10,
- 45,12,45,927,9,45,1,45,1,45,1,45,3,45,932,8,45,1,46,1,46,1,47,1,47,3,47,
- 938,8,47,1,48,1,48,1,49,5,49,943,8,49,10,49,12,49,946,9,49,1,50,1,50,1,
- 51,1,51,1,52,1,52,1,53,1,53,1,54,1,54,1,55,1,55,1,56,1,56,1,57,1,57,1,
- 58,1,58,1,59,1,59,1,60,1,60,1,61,1,61,1,62,1,62,1,63,1,63,1,63,1,63,1,
+ 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,635,8,23,1,24,1,
+ 24,1,25,1,25,3,25,641,8,25,1,26,1,26,1,26,1,27,1,27,5,27,648,8,27,10,27,
+ 12,27,651,9,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,5,28,660,8,28,10,28,
+ 12,28,663,9,28,1,29,1,29,1,30,1,30,3,30,669,8,30,1,31,1,31,1,31,1,31,1,
+ 31,1,31,1,31,1,31,1,31,3,31,680,8,31,1,32,1,32,1,32,1,32,1,32,1,32,3,32,
+ 688,8,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,
+ 34,1,34,1,34,1,34,1,34,1,34,1,34,5,34,709,8,34,10,34,12,34,712,9,34,1,
+ 35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,37,1,37,5,37,725,8,37,10,
+ 37,12,37,728,9,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,
+ 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,
+ 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,
+ 38,1,38,1,38,1,38,3,38,772,8,38,1,39,1,39,1,39,3,39,777,8,39,1,40,1,40,
+ 1,40,3,40,782,8,40,1,41,5,41,785,8,41,10,41,12,41,788,9,41,1,42,1,42,1,
+ 42,5,42,793,8,42,10,42,12,42,796,9,42,1,42,1,42,1,43,1,43,1,44,1,44,1,
+ 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,
+ 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,
+ 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,
+ 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,
+ 44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,3,44,873,
+ 8,44,1,45,1,45,5,45,877,8,45,10,45,12,45,880,9,45,1,45,1,45,1,45,1,45,
+ 1,45,1,45,1,45,1,45,1,45,1,45,1,45,5,45,893,8,45,10,45,12,45,896,9,45,
+ 1,45,1,45,1,45,3,45,901,8,45,1,46,1,46,1,47,1,47,3,47,907,8,47,1,48,1,
+ 48,1,49,5,49,912,8,49,10,49,12,49,915,9,49,1,50,1,50,1,51,1,51,1,52,1,
+ 52,1,53,1,53,1,54,1,54,1,55,1,55,1,56,1,56,1,57,1,57,1,58,1,58,1,59,1,
+ 59,1,60,1,60,1,61,1,61,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
- 63,1,63,1,63,1,63,1,63,3,63,1053,8,63,1,64,1,64,1,64,3,64,1058,8,64,1,
- 64,1,64,5,64,1062,8,64,10,64,12,64,1065,9,64,1,64,1,64,3,64,1069,8,64,
- 3,64,1071,8,64,1,65,1,65,1,65,1,65,5,65,1077,8,65,10,65,12,65,1080,9,65,
- 1,65,1,65,1,65,1,66,1,66,1,66,1,66,5,66,1089,8,66,10,66,12,66,1092,9,66,
- 1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1101,8,67,10,67,12,67,1104,9,67,
- 1,67,1,67,1,67,1,67,3,67,1110,8,67,1,68,1,68,1,68,1,68,1,68,3,68,1117,
- 8,68,3,68,1119,8,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,
+ 63,1,63,1,63,1,63,1,63,3,63,1025,8,63,1,64,1,64,1,64,3,64,1030,8,64,1,
+ 64,1,64,5,64,1034,8,64,10,64,12,64,1037,9,64,1,64,1,64,3,64,1041,8,64,
+ 3,64,1043,8,64,1,65,1,65,1,65,1,65,5,65,1049,8,65,10,65,12,65,1052,9,65,
+ 1,65,1,65,1,65,1,66,1,66,1,66,1,66,5,66,1061,8,66,10,66,12,66,1064,9,66,
+ 1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1073,8,67,10,67,12,67,1076,9,67,
+ 1,67,1,67,1,67,1,67,3,67,1082,8,67,1,68,1,68,1,68,1,68,1,68,3,68,1089,
+ 8,68,3,68,1091,8,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,
1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,
- 1,69,3,69,1146,8,69,1,70,1,70,1,70,5,70,1151,8,70,10,70,12,70,1154,9,70,
- 1,70,1,70,1,71,5,71,1159,8,71,10,71,12,71,1162,9,71,1,72,1,72,1,72,1,72,
- 1,72,3,72,1169,8,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,
- 1,73,3,73,1182,8,73,1,74,1,74,1,74,5,74,1187,8,74,10,74,12,74,1190,9,74,
- 3,74,1192,8,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,
- 1,75,1,75,1,75,1,75,1,75,1,75,3,75,1211,8,75,1,76,1,76,1,76,1,76,1,76,
+ 1,69,3,69,1118,8,69,1,70,1,70,1,70,5,70,1123,8,70,10,70,12,70,1126,9,70,
+ 1,70,1,70,1,71,5,71,1131,8,71,10,71,12,71,1134,9,71,1,72,1,72,1,72,1,72,
+ 1,72,3,72,1141,8,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,
+ 1,73,3,73,1154,8,73,1,74,1,74,1,74,5,74,1159,8,74,10,74,12,74,1162,9,74,
+ 3,74,1164,8,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,
+ 1,75,1,75,1,75,1,75,1,75,1,75,3,75,1183,8,75,1,76,1,76,1,76,1,76,1,76,
1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
- 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,3,76,1297,8,76,1,77,1,77,
- 1,77,1,77,1,77,1,77,1,77,3,77,1306,8,77,1,78,1,78,1,78,5,78,1311,8,78,
- 10,78,12,78,1314,9,78,3,78,1316,8,78,1,79,1,79,1,80,1,80,5,80,1322,8,80,
- 10,80,12,80,1325,9,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,
- 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,3,81,1345,8,81,1,82,1,82,1,82,
+ 1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,
+ 1,76,1,76,1,76,3,76,1277,8,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,3,77,
+ 1286,8,77,1,78,1,78,1,78,5,78,1291,8,78,10,78,12,78,1294,9,78,3,78,1296,
+ 8,78,1,79,1,79,1,80,1,80,5,80,1302,8,80,10,80,12,80,1305,9,80,1,81,1,81,
+ 1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,
+ 1,81,1,81,3,81,1325,8,81,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,
1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,
- 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,3,82,
- 1377,8,82,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,
- 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,3,83,1400,8,83,1,84,1,84,
- 1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,3,84,1412,8,84,1,85,1,85,1,85,
- 1,86,1,86,1,86,1,86,3,86,1421,8,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
+ 1,82,1,82,1,82,1,82,1,82,1,82,1,82,3,82,1357,8,82,1,83,1,83,1,83,1,83,
+ 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,
+ 1,83,1,83,1,83,3,83,1380,8,83,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,
+ 1,84,1,84,3,84,1392,8,84,1,85,1,85,1,85,1,86,1,86,1,86,1,86,3,86,1401,
+ 8,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
+ 1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,3,87,1426,8,87,1,87,
1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
- 1,87,1,87,3,87,1446,8,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,
- 1,87,1,87,1,87,1,87,1,87,1,87,3,87,1463,8,87,1,88,1,88,1,88,1,88,5,88,
- 1469,8,88,10,88,12,88,1472,9,88,1,88,3,88,1475,8,88,1,89,1,89,1,89,1,89,
- 1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,3,89,1490,8,89,1,90,1,90,
- 1,90,5,90,1495,8,90,10,90,12,90,1498,9,90,1,90,1,90,1,91,1,91,1,91,1,91,
- 1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,
+ 1,87,1,87,1,87,1,87,1,87,1,87,1,87,3,87,1450,8,87,1,88,1,88,1,88,1,88,
+ 5,88,1456,8,88,10,88,12,88,1459,9,88,1,88,3,88,1462,8,88,1,89,1,89,1,89,
+ 1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,89,3,89,1477,8,89,1,90,
+ 1,90,1,90,5,90,1482,8,90,10,90,12,90,1485,9,90,1,90,1,90,1,91,1,91,1,91,
+ 1,91,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,
1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,
- 1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,3,93,1542,8,93,1,94,1,94,1,95,
- 1,95,1,95,1,95,1,95,1,95,3,95,1552,8,95,1,95,1,95,1,95,1,95,1,95,1,95,
- 1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1568,8,95,1,95,1,95,1,95,
- 1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1580,8,95,1,96,1,96,1,96,1,96,
- 1,96,1,96,1,96,1,96,1,96,1,96,3,96,1592,8,96,1,97,1,97,1,97,1,97,1,97,
- 1,97,1,97,1,97,1,97,1,97,1,97,1,97,3,97,1606,8,97,1,98,1,98,1,98,1,98,
- 1,98,1,99,1,99,1,99,1,99,1,99,3,99,1618,8,99,1,100,1,100,1,100,1,100,1,
- 100,1,100,1,100,1,100,1,100,3,100,1629,8,100,1,101,1,101,1,101,5,101,1634,
- 8,101,10,101,12,101,1637,9,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,
- 3,102,1646,8,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,1,103,
- 1,103,1,103,3,103,1659,8,103,1,104,5,104,1662,8,104,10,104,12,104,1665,
- 9,104,1,105,1,105,3,105,1669,8,105,1,105,1,105,1,106,1,106,1,106,5,106,
- 1676,8,106,10,106,12,106,1679,9,106,1,106,1,106,1,107,1,107,1,107,1,107,
- 1,108,1,108,3,108,1689,8,108,1,109,1,109,1,109,1,109,1,109,1,109,1,110,
- 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
+ 1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,3,93,1529,8,93,1,94,1,94,
+ 1,95,1,95,1,95,1,95,1,95,1,95,3,95,1539,8,95,1,95,1,95,1,95,1,95,1,95,
+ 1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1555,8,95,1,95,1,95,
+ 1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,3,95,1567,8,95,1,96,1,96,1,96,
+ 1,96,1,96,1,96,1,96,1,96,1,96,1,96,3,96,1579,8,96,1,97,1,97,1,97,1,97,
+ 1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97,3,97,1593,8,97,1,98,1,98,1,98,
+ 1,98,1,98,1,99,1,99,1,99,1,99,1,99,3,99,1605,8,99,1,100,1,100,1,100,1,
+ 100,1,100,1,100,1,100,1,100,1,100,3,100,1616,8,100,1,101,1,101,1,101,5,
+ 101,1621,8,101,10,101,12,101,1624,9,101,1,101,1,101,1,102,1,102,1,102,
+ 1,102,1,102,3,102,1633,8,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103,
+ 1,103,1,103,1,103,1,103,3,103,1646,8,103,1,104,5,104,1649,8,104,10,104,
+ 12,104,1652,9,104,1,105,1,105,3,105,1656,8,105,1,105,1,105,1,106,1,106,
+ 1,106,5,106,1663,8,106,10,106,12,106,1666,9,106,1,106,1,106,1,107,1,107,
+ 1,107,1,107,1,108,1,108,3,108,1676,8,108,1,109,1,109,1,109,1,109,1,109,
+ 1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 5,110,1770,8,110,10,110,12,110,1773,9,110,1,110,1,110,1,110,1,110,5,110,
- 1779,8,110,10,110,12,110,1782,9,110,1,110,1,110,1,110,1,110,1,110,1,110,
- 1,110,1,110,5,110,1792,8,110,10,110,12,110,1795,9,110,1,110,1,110,1,110,
- 1,110,1,110,1,110,5,110,1803,8,110,10,110,12,110,1806,9,110,1,110,1,110,
- 1,110,1,110,1,110,3,110,1813,8,110,1,111,1,111,1,111,1,111,1,111,1,111,
- 1,111,1,111,5,111,1823,8,111,10,111,12,111,1826,9,111,1,111,1,111,1,111,
- 1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,
- 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,3,112,1852,8,112,
- 1,113,1,113,1,113,1,113,1,113,3,113,1859,8,113,1,114,1,114,1,114,3,114,
- 1864,8,114,1,115,1,115,1,115,1,115,1,115,3,115,1871,8,115,1,116,1,116,
- 5,116,1875,8,116,10,116,12,116,1878,9,116,1,116,1,116,1,116,1,116,1,116,
- 5,116,1885,8,116,10,116,12,116,1888,9,116,1,116,3,116,1891,8,116,1,117,
- 1,117,1,118,5,118,1896,8,118,10,118,12,118,1899,9,118,1,119,1,119,1,119,
- 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,3,119,1913,8,119,
- 1,120,1,120,5,120,1917,8,120,10,120,12,120,1920,9,120,1,120,1,120,1,120,
- 1,120,1,120,1,120,1,121,1,121,1,122,5,122,1931,8,122,10,122,12,122,1934,
- 9,122,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,3,123,
- 1946,8,123,1,124,1,124,1,124,1,124,1,124,1,124,3,124,1954,8,124,1,125,
- 1,125,1,125,4,125,1959,8,125,11,125,12,125,1960,1,125,1,125,3,125,1965,
- 8,125,1,126,5,126,1968,8,126,10,126,12,126,1971,9,126,1,127,1,127,1,127,
- 1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,3,127,1986,
- 8,127,1,128,1,128,1,128,5,128,1991,8,128,10,128,12,128,1994,9,128,1,128,
- 1,128,1,128,1,128,1,128,1,128,1,128,1,128,5,128,2004,8,128,10,128,12,128,
- 2007,9,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
+ 1,110,1,110,5,110,1757,8,110,10,110,12,110,1760,9,110,1,110,1,110,1,110,
+ 1,110,5,110,1766,8,110,10,110,12,110,1769,9,110,1,110,1,110,1,110,1,110,
+ 1,110,1,110,1,110,1,110,5,110,1779,8,110,10,110,12,110,1782,9,110,1,110,
+ 1,110,1,110,1,110,1,110,1,110,5,110,1790,8,110,10,110,12,110,1793,9,110,
+ 1,110,1,110,1,110,1,110,1,110,3,110,1800,8,110,1,111,1,111,1,111,1,111,
+ 1,111,1,111,1,111,1,111,5,111,1810,8,111,10,111,12,111,1813,9,111,1,111,
+ 1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,
+ 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,3,112,
+ 1839,8,112,1,113,1,113,1,113,1,113,1,113,3,113,1846,8,113,1,114,1,114,
+ 1,114,3,114,1851,8,114,1,115,1,115,1,115,1,115,1,115,3,115,1858,8,115,
+ 1,116,1,116,5,116,1862,8,116,10,116,12,116,1865,9,116,1,116,1,116,1,116,
+ 1,116,1,116,5,116,1872,8,116,10,116,12,116,1875,9,116,1,116,3,116,1878,
+ 8,116,1,117,1,117,1,118,5,118,1883,8,118,10,118,12,118,1886,9,118,1,119,
+ 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,3,119,
+ 1900,8,119,1,120,1,120,5,120,1904,8,120,10,120,12,120,1907,9,120,1,120,
+ 1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,122,5,122,1918,8,122,10,122,
+ 12,122,1921,9,122,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123,
+ 1,123,3,123,1933,8,123,1,124,1,124,1,124,1,124,1,124,1,124,3,124,1941,
+ 8,124,1,125,1,125,1,125,4,125,1946,8,125,11,125,12,125,1947,1,125,1,125,
+ 3,125,1952,8,125,1,126,5,126,1955,8,126,10,126,12,126,1958,9,126,1,127,
+ 1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,127,
+ 3,127,1973,8,127,1,128,1,128,1,128,5,128,1978,8,128,10,128,12,128,1981,
+ 9,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,5,128,1991,8,128,
+ 10,128,12,128,1994,9,128,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,1,129,
- 1,129,3,129,2032,8,129,1,130,1,130,1,130,1,130,1,130,3,130,2039,8,130,
- 3,130,2041,8,130,1,130,5,130,2044,8,130,10,130,12,130,2047,9,130,1,130,
- 1,130,1,130,3,130,2052,8,130,1,131,1,131,1,131,1,131,1,131,1,131,1,131,
+ 1,129,1,129,1,129,3,129,2019,8,129,1,130,1,130,1,130,1,130,1,130,3,130,
+ 2026,8,130,3,130,2028,8,130,1,130,5,130,2031,8,130,10,130,12,130,2034,
+ 9,130,1,130,1,130,1,130,3,130,2039,8,130,1,131,1,131,1,131,1,131,1,131,
1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,
- 1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,3,131,2081,8,131,1,132,
- 1,132,1,132,3,132,2086,8,132,1,133,1,133,1,133,1,133,1,133,1,133,1,133,
+ 1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,1,131,3,131,2068,
+ 8,131,1,132,1,132,1,132,3,132,2073,8,132,1,133,1,133,1,133,1,133,1,133,
1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,133,
- 1,133,1,133,3,133,2109,8,133,1,134,5,134,2112,8,134,10,134,12,134,2115,
- 9,134,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
+ 1,133,1,133,1,133,1,133,3,133,2096,8,133,1,134,5,134,2099,8,134,10,134,
+ 12,134,2102,9,134,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,1,135,
- 5,135,2176,8,135,10,135,12,135,2179,9,135,1,135,1,135,1,135,1,135,5,135,
- 2185,8,135,10,135,12,135,2188,9,135,1,135,1,135,1,135,1,135,1,135,1,135,
- 1,135,1,135,5,135,2198,8,135,10,135,12,135,2201,9,135,1,135,1,135,1,135,
- 1,135,1,135,1,135,5,135,2209,8,135,10,135,12,135,2212,9,135,1,135,1,135,
- 1,135,1,135,1,135,1,135,5,135,2220,8,135,10,135,12,135,2223,9,135,3,135,
- 2225,8,135,1,136,1,136,1,136,1,137,1,137,3,137,2232,8,137,1,138,1,138,
- 1,138,1,138,1,139,1,139,1,139,1,140,4,140,2242,8,140,11,140,12,140,2243,
- 1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,
- 3,141,2258,8,141,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,
- 1,142,1,142,1,142,3,142,2272,8,142,1,143,1,143,1,143,1,143,1,143,1,143,
- 3,143,2280,8,143,1,144,1,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,
- 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,3,147,2300,8,147,
- 1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,149,1,149,3,149,2312,
- 8,149,1,150,1,150,1,150,3,150,2317,8,150,1,151,1,151,1,151,1,151,1,151,
- 4,151,2324,8,151,11,151,12,151,2325,3,151,2328,8,151,1,152,1,152,1,152,
- 5,152,2333,8,152,10,152,12,152,2336,9,152,1,152,1,152,1,153,1,153,1,153,
- 1,153,1,153,3,153,2345,8,153,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
+ 1,135,1,135,5,135,2163,8,135,10,135,12,135,2166,9,135,1,135,1,135,1,135,
+ 1,135,5,135,2172,8,135,10,135,12,135,2175,9,135,1,135,1,135,1,135,1,135,
+ 1,135,1,135,1,135,1,135,5,135,2185,8,135,10,135,12,135,2188,9,135,1,135,
+ 1,135,1,135,1,135,1,135,1,135,5,135,2196,8,135,10,135,12,135,2199,9,135,
+ 1,135,1,135,1,135,1,135,1,135,1,135,5,135,2207,8,135,10,135,12,135,2210,
+ 9,135,3,135,2212,8,135,1,136,1,136,1,136,1,137,1,137,3,137,2219,8,137,
+ 1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,140,4,140,2229,8,140,11,140,
+ 12,140,2230,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,1,141,
+ 1,141,1,141,3,141,2245,8,141,1,142,1,142,1,142,1,142,1,142,1,142,1,142,
+ 1,142,1,142,1,142,1,142,1,142,3,142,2259,8,142,1,143,1,143,1,143,1,143,
+ 1,143,1,143,3,143,2267,8,143,1,144,1,144,1,144,1,145,1,145,1,146,1,146,
+ 1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,1,147,3,147,
+ 2287,8,147,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,149,1,149,
+ 3,149,2299,8,149,1,150,1,150,1,150,3,150,2304,8,150,1,151,1,151,1,151,
+ 1,151,1,151,4,151,2311,8,151,11,151,12,151,2312,3,151,2315,8,151,1,152,
+ 1,152,1,152,5,152,2320,8,152,10,152,12,152,2323,9,152,1,152,1,152,1,153,
+ 1,153,1,153,1,153,1,153,3,153,2332,8,153,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
- 1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,3,154,
- 2413,8,154,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
+ 1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,1,154,
+ 1,154,3,154,2400,8,154,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,
- 1,155,1,155,1,155,1,155,1,155,3,155,2490,8,155,1,156,5,156,2493,8,156,
- 10,156,12,156,2496,9,156,1,157,1,157,1,158,1,158,1,158,3,158,2503,8,158,
- 1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
+ 1,155,1,155,1,155,1,155,1,155,1,155,1,155,3,155,2477,8,155,1,156,5,156,
+ 2480,8,156,10,156,12,156,2483,9,156,1,157,1,157,1,158,1,158,1,158,3,158,
+ 2490,8,158,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
@@ -17206,905 +17184,903 @@ private bool vtfixupAttr_sempred(VtfixupAttrContext _localctx, int predIndex) {
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,1,159,
- 1,159,1,159,1,159,1,159,3,159,2653,8,159,1,160,1,160,5,160,2657,8,160,
- 10,160,12,160,2660,9,160,1,161,1,161,5,161,2664,8,161,10,161,12,161,2667,
- 9,161,1,162,5,162,2670,8,162,10,162,12,162,2673,9,162,1,163,5,163,2676,
- 8,163,10,163,12,163,2679,9,163,1,164,5,164,2682,8,164,10,164,12,164,2685,
- 9,164,1,165,5,165,2688,8,165,10,165,12,165,2691,9,165,1,166,5,166,2694,
- 8,166,10,166,12,166,2697,9,166,1,167,5,167,2700,8,167,10,167,12,167,2703,
- 9,167,1,168,5,168,2706,8,168,10,168,12,168,2709,9,168,1,169,1,169,1,169,
- 1,169,3,169,2715,8,169,1,170,5,170,2718,8,170,10,170,12,170,2721,9,170,
- 1,171,1,171,1,171,3,171,2726,8,171,1,172,1,172,1,172,1,172,1,172,1,172,
+ 1,159,1,159,1,159,1,159,1,159,1,159,3,159,2640,8,159,1,160,1,160,5,160,
+ 2644,8,160,10,160,12,160,2647,9,160,1,161,1,161,5,161,2651,8,161,10,161,
+ 12,161,2654,9,161,1,162,5,162,2657,8,162,10,162,12,162,2660,9,162,1,163,
+ 5,163,2663,8,163,10,163,12,163,2666,9,163,1,164,5,164,2669,8,164,10,164,
+ 12,164,2672,9,164,1,165,5,165,2675,8,165,10,165,12,165,2678,9,165,1,166,
+ 5,166,2681,8,166,10,166,12,166,2684,9,166,1,167,5,167,2687,8,167,10,167,
+ 12,167,2690,9,167,1,168,5,168,2693,8,168,10,168,12,168,2696,9,168,1,169,
+ 1,169,1,169,1,169,3,169,2702,8,169,1,170,5,170,2705,8,170,10,170,12,170,
+ 2708,9,170,1,171,1,171,1,171,3,171,2713,8,171,1,172,1,172,1,172,1,172,
1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,
- 1,172,1,172,1,172,1,172,1,172,1,172,1,172,3,172,2753,8,172,1,173,1,173,
- 1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,3,173,2767,
- 8,173,1,174,5,174,2770,8,174,10,174,12,174,2773,9,174,1,175,1,175,1,175,
- 1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,3,175,
- 2789,8,175,1,176,1,176,1,176,5,176,2794,8,176,10,176,12,176,2797,9,176,
- 1,176,1,176,1,177,1,177,5,177,2803,8,177,10,177,12,177,2806,9,177,1,177,
- 1,177,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,
- 1,178,1,178,1,178,1,178,3,178,2825,8,178,1,179,5,179,2828,8,179,10,179,
- 12,179,2831,9,179,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,1,180,
- 1,180,1,180,1,180,1,180,3,180,2846,8,180,1,181,1,181,5,181,2850,8,181,
- 10,181,12,181,2853,9,181,1,181,1,181,1,181,5,181,2858,8,181,10,181,12,
- 181,2861,9,181,1,181,1,181,1,181,1,181,3,181,2867,8,181,1,182,1,182,1,
- 183,5,183,2872,8,183,10,183,12,183,2875,9,183,1,184,1,184,1,184,1,184,
- 1,184,1,184,1,184,1,184,1,184,1,184,3,184,2887,8,184,1,184,0,1,68,185,
- 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,
- 50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,
- 98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,
- 134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,
- 170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,
- 206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,
- 242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,
- 278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,
- 314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,
- 350,352,354,356,358,360,362,364,366,368,0,15,6,0,1,15,198,198,242,242,
- 246,246,263,263,288,288,4,0,198,198,242,242,263,263,288,288,1,0,262,263,
- 1,0,172,173,1,0,36,37,1,0,72,73,3,0,2,2,60,60,76,82,2,0,228,228,259,260,
- 9,0,177,177,182,194,200,200,206,207,209,214,217,218,221,221,229,241,261,
- 261,1,0,94,95,1,0,96,110,1,0,67,68,2,0,172,172,288,289,2,0,178,178,263,
- 263,1,0,50,51,3299,0,370,1,0,0,0,2,382,1,0,0,0,4,384,1,0,0,0,6,390,1,0,
- 0,0,8,398,1,0,0,0,10,451,1,0,0,0,12,453,1,0,0,0,14,456,1,0,0,0,16,459,
- 1,0,0,0,18,463,1,0,0,0,20,466,1,0,0,0,22,469,1,0,0,0,24,476,1,0,0,0,26,
- 492,1,0,0,0,28,494,1,0,0,0,30,496,1,0,0,0,32,506,1,0,0,0,34,508,1,0,0,
- 0,36,525,1,0,0,0,38,529,1,0,0,0,40,547,1,0,0,0,42,574,1,0,0,0,44,597,1,
- 0,0,0,46,633,1,0,0,0,48,635,1,0,0,0,50,639,1,0,0,0,52,641,1,0,0,0,54,648,
- 1,0,0,0,56,660,1,0,0,0,58,663,1,0,0,0,60,665,1,0,0,0,62,678,1,0,0,0,64,
- 686,1,0,0,0,66,688,1,0,0,0,68,696,1,0,0,0,70,712,1,0,0,0,72,718,1,0,0,
- 0,74,721,1,0,0,0,76,770,1,0,0,0,78,775,1,0,0,0,80,780,1,0,0,0,82,785,1,
- 0,0,0,84,793,1,0,0,0,86,798,1,0,0,0,88,903,1,0,0,0,90,931,1,0,0,0,92,933,
- 1,0,0,0,94,937,1,0,0,0,96,939,1,0,0,0,98,944,1,0,0,0,100,947,1,0,0,0,102,
- 949,1,0,0,0,104,951,1,0,0,0,106,953,1,0,0,0,108,955,1,0,0,0,110,957,1,
- 0,0,0,112,959,1,0,0,0,114,961,1,0,0,0,116,963,1,0,0,0,118,965,1,0,0,0,
- 120,967,1,0,0,0,122,969,1,0,0,0,124,971,1,0,0,0,126,1052,1,0,0,0,128,1070,
- 1,0,0,0,130,1072,1,0,0,0,132,1084,1,0,0,0,134,1109,1,0,0,0,136,1118,1,
- 0,0,0,138,1145,1,0,0,0,140,1152,1,0,0,0,142,1160,1,0,0,0,144,1168,1,0,
- 0,0,146,1181,1,0,0,0,148,1191,1,0,0,0,150,1210,1,0,0,0,152,1296,1,0,0,
- 0,154,1305,1,0,0,0,156,1315,1,0,0,0,158,1317,1,0,0,0,160,1319,1,0,0,0,
- 162,1344,1,0,0,0,164,1376,1,0,0,0,166,1399,1,0,0,0,168,1411,1,0,0,0,170,
- 1413,1,0,0,0,172,1416,1,0,0,0,174,1462,1,0,0,0,176,1474,1,0,0,0,178,1489,
- 1,0,0,0,180,1496,1,0,0,0,182,1501,1,0,0,0,184,1505,1,0,0,0,186,1541,1,
- 0,0,0,188,1543,1,0,0,0,190,1579,1,0,0,0,192,1591,1,0,0,0,194,1605,1,0,
- 0,0,196,1607,1,0,0,0,198,1617,1,0,0,0,200,1628,1,0,0,0,202,1635,1,0,0,
- 0,204,1645,1,0,0,0,206,1658,1,0,0,0,208,1663,1,0,0,0,210,1666,1,0,0,0,
- 212,1677,1,0,0,0,214,1682,1,0,0,0,216,1688,1,0,0,0,218,1690,1,0,0,0,220,
- 1812,1,0,0,0,222,1814,1,0,0,0,224,1851,1,0,0,0,226,1858,1,0,0,0,228,1863,
- 1,0,0,0,230,1870,1,0,0,0,232,1890,1,0,0,0,234,1892,1,0,0,0,236,1897,1,
- 0,0,0,238,1912,1,0,0,0,240,1914,1,0,0,0,242,1927,1,0,0,0,244,1932,1,0,
- 0,0,246,1945,1,0,0,0,248,1953,1,0,0,0,250,1964,1,0,0,0,252,1969,1,0,0,
- 0,254,1985,1,0,0,0,256,1987,1,0,0,0,258,2031,1,0,0,0,260,2051,1,0,0,0,
- 262,2080,1,0,0,0,264,2085,1,0,0,0,266,2108,1,0,0,0,268,2113,1,0,0,0,270,
- 2224,1,0,0,0,272,2226,1,0,0,0,274,2231,1,0,0,0,276,2233,1,0,0,0,278,2237,
- 1,0,0,0,280,2241,1,0,0,0,282,2257,1,0,0,0,284,2271,1,0,0,0,286,2279,1,
- 0,0,0,288,2281,1,0,0,0,290,2284,1,0,0,0,292,2286,1,0,0,0,294,2299,1,0,
- 0,0,296,2301,1,0,0,0,298,2311,1,0,0,0,300,2316,1,0,0,0,302,2327,1,0,0,
- 0,304,2334,1,0,0,0,306,2344,1,0,0,0,308,2412,1,0,0,0,310,2489,1,0,0,0,
- 312,2494,1,0,0,0,314,2497,1,0,0,0,316,2502,1,0,0,0,318,2652,1,0,0,0,320,
- 2658,1,0,0,0,322,2665,1,0,0,0,324,2671,1,0,0,0,326,2677,1,0,0,0,328,2683,
- 1,0,0,0,330,2689,1,0,0,0,332,2695,1,0,0,0,334,2701,1,0,0,0,336,2707,1,
- 0,0,0,338,2714,1,0,0,0,340,2719,1,0,0,0,342,2725,1,0,0,0,344,2752,1,0,
- 0,0,346,2766,1,0,0,0,348,2771,1,0,0,0,350,2788,1,0,0,0,352,2790,1,0,0,
- 0,354,2800,1,0,0,0,356,2824,1,0,0,0,358,2829,1,0,0,0,360,2845,1,0,0,0,
- 362,2866,1,0,0,0,364,2868,1,0,0,0,366,2873,1,0,0,0,368,2886,1,0,0,0,370,
- 371,7,0,0,0,371,1,1,0,0,0,372,383,5,287,0,0,373,374,3,4,2,0,374,375,5,
- 264,0,0,375,377,1,0,0,0,376,373,1,0,0,0,377,380,1,0,0,0,378,376,1,0,0,
- 0,378,379,1,0,0,0,379,381,1,0,0,0,380,378,1,0,0,0,381,383,3,4,2,0,382,
- 372,1,0,0,0,382,378,1,0,0,0,383,3,1,0,0,0,384,385,7,1,0,0,385,5,1,0,0,
- 0,386,387,5,262,0,0,387,389,5,265,0,0,388,386,1,0,0,0,389,392,1,0,0,0,
- 390,388,1,0,0,0,390,391,1,0,0,0,391,393,1,0,0,0,392,390,1,0,0,0,393,394,
- 5,262,0,0,394,7,1,0,0,0,395,397,3,10,5,0,396,395,1,0,0,0,397,400,1,0,0,
- 0,398,396,1,0,0,0,398,399,1,0,0,0,399,9,1,0,0,0,400,398,1,0,0,0,401,402,
- 3,74,37,0,402,403,5,16,0,0,403,404,3,82,41,0,404,405,5,17,0,0,405,452,
- 1,0,0,0,406,407,3,72,36,0,407,408,5,16,0,0,408,409,3,8,4,0,409,410,5,17,
- 0,0,410,452,1,0,0,0,411,412,3,256,128,0,412,413,5,16,0,0,413,414,3,268,
- 134,0,414,415,5,17,0,0,415,452,1,0,0,0,416,452,3,222,111,0,417,452,3,296,
- 148,0,418,452,3,70,35,0,419,452,3,66,33,0,420,452,3,88,44,0,421,452,3,
- 90,45,0,422,452,3,22,11,0,423,424,3,346,173,0,424,425,5,16,0,0,425,426,
- 3,348,174,0,426,427,5,17,0,0,427,452,1,0,0,0,428,429,3,352,176,0,429,430,
- 5,16,0,0,430,431,3,358,179,0,431,432,5,17,0,0,432,452,1,0,0,0,433,434,
- 3,362,181,0,434,435,5,16,0,0,435,436,3,366,183,0,436,437,5,17,0,0,437,
- 452,1,0,0,0,438,452,3,64,32,0,439,452,3,174,87,0,440,452,3,342,171,0,441,
- 452,3,12,6,0,442,452,3,14,7,0,443,452,3,16,8,0,444,452,3,18,9,0,445,452,
- 3,20,10,0,446,452,3,26,13,0,447,452,3,42,21,0,448,452,3,40,20,0,449,452,
- 3,30,15,0,450,452,3,24,12,0,451,401,1,0,0,0,451,406,1,0,0,0,451,411,1,
- 0,0,0,451,416,1,0,0,0,451,417,1,0,0,0,451,418,1,0,0,0,451,419,1,0,0,0,
- 451,420,1,0,0,0,451,421,1,0,0,0,451,422,1,0,0,0,451,423,1,0,0,0,451,428,
- 1,0,0,0,451,433,1,0,0,0,451,438,1,0,0,0,451,439,1,0,0,0,451,440,1,0,0,
- 0,451,441,1,0,0,0,451,442,1,0,0,0,451,443,1,0,0,0,451,444,1,0,0,0,451,
- 445,1,0,0,0,451,446,1,0,0,0,451,447,1,0,0,0,451,448,1,0,0,0,451,449,1,
- 0,0,0,451,450,1,0,0,0,452,11,1,0,0,0,453,454,5,18,0,0,454,455,3,32,16,
- 0,455,13,1,0,0,0,456,457,5,19,0,0,457,458,3,32,16,0,458,15,1,0,0,0,459,
- 460,5,20,0,0,460,461,5,21,0,0,461,462,3,32,16,0,462,17,1,0,0,0,463,464,
- 5,22,0,0,464,465,3,34,17,0,465,19,1,0,0,0,466,467,5,23,0,0,467,468,3,34,
- 17,0,468,21,1,0,0,0,469,470,5,24,0,0,470,471,3,98,49,0,471,472,3,2,1,0,
- 472,473,5,16,0,0,473,474,3,142,71,0,474,475,5,17,0,0,475,23,1,0,0,0,476,
- 477,5,25,0,0,477,25,1,0,0,0,478,479,5,26,0,0,479,493,3,28,14,0,480,481,
- 5,26,0,0,481,482,3,28,14,0,482,483,5,27,0,0,483,484,3,28,14,0,484,493,
- 1,0,0,0,485,486,5,26,0,0,486,487,3,28,14,0,487,488,5,27,0,0,488,489,3,
- 28,14,0,489,490,5,27,0,0,490,491,3,28,14,0,491,493,1,0,0,0,492,478,1,0,
- 0,0,492,480,1,0,0,0,492,485,1,0,0,0,493,27,1,0,0,0,494,495,7,2,0,0,495,
- 29,1,0,0,0,496,497,5,28,0,0,497,501,5,16,0,0,498,500,3,138,69,0,499,498,
- 1,0,0,0,500,503,1,0,0,0,501,499,1,0,0,0,501,502,1,0,0,0,502,504,1,0,0,
- 0,503,501,1,0,0,0,504,505,5,17,0,0,505,31,1,0,0,0,506,507,5,172,0,0,507,
- 33,1,0,0,0,508,509,7,3,0,0,509,35,1,0,0,0,510,526,5,174,0,0,511,512,3,
- 32,16,0,512,513,5,264,0,0,513,526,1,0,0,0,514,526,3,32,16,0,515,516,5,
- 187,0,0,516,517,5,29,0,0,517,518,3,32,16,0,518,519,5,30,0,0,519,526,1,
- 0,0,0,520,521,5,188,0,0,521,522,5,29,0,0,522,523,3,34,17,0,523,524,5,30,
- 0,0,524,526,1,0,0,0,525,510,1,0,0,0,525,511,1,0,0,0,525,514,1,0,0,0,525,
- 515,1,0,0,0,525,520,1,0,0,0,526,37,1,0,0,0,527,530,3,32,16,0,528,530,5,
- 261,0,0,529,527,1,0,0,0,529,528,1,0,0,0,530,39,1,0,0,0,531,532,5,266,0,
- 0,532,548,5,288,0,0,533,534,5,266,0,0,534,535,5,288,0,0,535,548,5,262,
- 0,0,536,537,5,267,0,0,537,548,5,288,0,0,538,539,5,268,0,0,539,548,5,288,
- 0,0,540,541,5,269,0,0,541,548,5,288,0,0,542,548,5,270,0,0,543,548,5,271,
- 0,0,544,545,5,272,0,0,545,548,5,262,0,0,546,548,5,31,0,0,547,531,1,0,0,
- 0,547,533,1,0,0,0,547,536,1,0,0,0,547,538,1,0,0,0,547,540,1,0,0,0,547,
- 542,1,0,0,0,547,543,1,0,0,0,547,544,1,0,0,0,547,546,1,0,0,0,548,41,1,0,
- 0,0,549,550,5,32,0,0,550,551,3,160,80,0,551,552,5,33,0,0,552,553,3,2,1,
- 0,553,575,1,0,0,0,554,555,5,32,0,0,555,556,3,138,69,0,556,557,5,33,0,0,
- 557,558,3,2,1,0,558,575,1,0,0,0,559,560,5,32,0,0,560,561,3,198,99,0,561,
- 562,5,33,0,0,562,563,3,2,1,0,563,575,1,0,0,0,564,565,5,32,0,0,565,566,
- 3,44,22,0,566,567,5,33,0,0,567,568,3,2,1,0,568,575,1,0,0,0,569,570,5,32,
- 0,0,570,571,3,46,23,0,571,572,5,33,0,0,572,573,3,2,1,0,573,575,1,0,0,0,
- 574,549,1,0,0,0,574,554,1,0,0,0,574,559,1,0,0,0,574,564,1,0,0,0,574,569,
- 1,0,0,0,575,43,1,0,0,0,576,577,5,34,0,0,577,598,3,48,24,0,578,579,5,34,
- 0,0,579,580,3,48,24,0,580,581,5,35,0,0,581,582,3,6,3,0,582,598,1,0,0,0,
- 583,584,5,34,0,0,584,585,3,48,24,0,585,586,5,35,0,0,586,587,5,16,0,0,587,
- 588,3,52,26,0,588,589,5,17,0,0,589,598,1,0,0,0,590,591,5,34,0,0,591,592,
- 3,48,24,0,592,593,5,35,0,0,593,594,5,29,0,0,594,595,3,312,156,0,595,596,
- 5,30,0,0,596,598,1,0,0,0,597,576,1,0,0,0,597,578,1,0,0,0,597,583,1,0,0,
- 0,597,590,1,0,0,0,598,45,1,0,0,0,599,600,5,34,0,0,600,601,5,29,0,0,601,
- 602,3,50,25,0,602,603,5,30,0,0,603,604,3,48,24,0,604,634,1,0,0,0,605,606,
- 5,34,0,0,606,607,5,29,0,0,607,608,3,50,25,0,608,609,5,30,0,0,609,610,3,
- 48,24,0,610,611,5,35,0,0,611,612,3,6,3,0,612,634,1,0,0,0,613,614,5,34,
- 0,0,614,615,5,29,0,0,615,616,3,50,25,0,616,617,5,30,0,0,617,618,3,48,24,
- 0,618,619,5,35,0,0,619,620,5,16,0,0,620,621,3,52,26,0,621,622,5,17,0,0,
- 622,634,1,0,0,0,623,624,5,34,0,0,624,625,5,29,0,0,625,626,3,50,25,0,626,
- 627,5,30,0,0,627,628,3,48,24,0,628,629,5,35,0,0,629,630,5,29,0,0,630,631,
- 3,312,156,0,631,632,5,30,0,0,632,634,1,0,0,0,633,599,1,0,0,0,633,605,1,
- 0,0,0,633,613,1,0,0,0,633,623,1,0,0,0,634,47,1,0,0,0,635,636,3,190,95,
- 0,636,49,1,0,0,0,637,640,3,146,73,0,638,640,3,198,99,0,639,637,1,0,0,0,
- 639,638,1,0,0,0,640,51,1,0,0,0,641,642,3,54,27,0,642,643,3,56,28,0,643,
- 53,1,0,0,0,644,647,3,318,159,0,645,647,3,40,20,0,646,644,1,0,0,0,646,645,
- 1,0,0,0,647,650,1,0,0,0,648,646,1,0,0,0,648,649,1,0,0,0,649,55,1,0,0,0,
- 650,648,1,0,0,0,651,652,3,58,29,0,652,653,3,60,30,0,653,654,3,2,1,0,654,
- 655,5,35,0,0,655,656,3,318,159,0,656,659,1,0,0,0,657,659,3,40,20,0,658,
- 651,1,0,0,0,658,657,1,0,0,0,659,662,1,0,0,0,660,658,1,0,0,0,660,661,1,
- 0,0,0,661,57,1,0,0,0,662,660,1,0,0,0,663,664,7,4,0,0,664,59,1,0,0,0,665,
- 667,3,62,31,0,666,668,5,260,0,0,667,666,1,0,0,0,667,668,1,0,0,0,668,61,
- 1,0,0,0,669,679,3,166,83,0,670,679,3,2,1,0,671,679,5,195,0,0,672,679,5,
- 196,0,0,673,674,5,201,0,0,674,675,5,38,0,0,675,679,5,263,0,0,676,677,5,
- 201,0,0,677,679,3,138,69,0,678,669,1,0,0,0,678,670,1,0,0,0,678,671,1,0,
- 0,0,678,672,1,0,0,0,678,673,1,0,0,0,678,676,1,0,0,0,679,63,1,0,0,0,680,
- 681,5,197,0,0,681,682,5,39,0,0,682,687,3,2,1,0,683,684,5,197,0,0,684,687,
- 3,2,1,0,685,687,5,197,0,0,686,680,1,0,0,0,686,683,1,0,0,0,686,685,1,0,
- 0,0,687,65,1,0,0,0,688,689,5,40,0,0,689,690,5,41,0,0,690,691,3,32,16,0,
- 691,692,5,42,0,0,692,693,3,68,34,0,693,694,5,43,0,0,694,695,3,0,0,0,695,
- 67,1,0,0,0,696,709,6,34,-1,0,697,698,10,5,0,0,698,708,5,185,0,0,699,700,
- 10,4,0,0,700,708,5,186,0,0,701,702,10,3,0,0,702,708,5,44,0,0,703,704,10,
- 2,0,0,704,708,5,45,0,0,705,706,10,1,0,0,706,708,5,46,0,0,707,697,1,0,0,
- 0,707,699,1,0,0,0,707,701,1,0,0,0,707,703,1,0,0,0,707,705,1,0,0,0,708,
- 711,1,0,0,0,709,707,1,0,0,0,709,710,1,0,0,0,710,69,1,0,0,0,711,709,1,0,
- 0,0,712,713,5,47,0,0,713,714,5,35,0,0,714,715,5,29,0,0,715,716,3,312,156,
- 0,716,717,5,30,0,0,717,71,1,0,0,0,718,719,5,48,0,0,719,720,3,2,1,0,720,
- 73,1,0,0,0,721,725,5,49,0,0,722,724,3,76,38,0,723,722,1,0,0,0,724,727,
- 1,0,0,0,725,723,1,0,0,0,725,726,1,0,0,0,726,728,1,0,0,0,727,725,1,0,0,
- 0,728,729,3,2,1,0,729,730,3,204,102,0,730,731,3,78,39,0,731,732,3,80,40,
- 0,732,75,1,0,0,0,733,771,5,50,0,0,734,771,5,51,0,0,735,771,5,198,0,0,736,
- 771,5,201,0,0,737,771,5,220,0,0,738,771,5,52,0,0,739,771,5,53,0,0,740,
- 771,5,54,0,0,741,771,5,55,0,0,742,771,5,243,0,0,743,771,5,15,0,0,744,771,
- 5,223,0,0,745,771,5,56,0,0,746,771,5,57,0,0,747,771,5,58,0,0,748,771,5,
- 59,0,0,749,771,5,60,0,0,750,751,5,61,0,0,751,771,5,50,0,0,752,753,5,61,
- 0,0,753,771,5,51,0,0,754,755,5,61,0,0,755,771,5,62,0,0,756,757,5,61,0,
- 0,757,771,5,63,0,0,758,759,5,61,0,0,759,771,5,64,0,0,760,761,5,61,0,0,
- 761,771,5,65,0,0,762,771,5,66,0,0,763,771,5,67,0,0,764,771,5,68,0,0,765,
- 766,5,69,0,0,766,767,5,29,0,0,767,768,3,32,16,0,768,769,5,30,0,0,769,771,
- 1,0,0,0,770,733,1,0,0,0,770,734,1,0,0,0,770,735,1,0,0,0,770,736,1,0,0,
- 0,770,737,1,0,0,0,770,738,1,0,0,0,770,739,1,0,0,0,770,740,1,0,0,0,770,
- 741,1,0,0,0,770,742,1,0,0,0,770,743,1,0,0,0,770,744,1,0,0,0,770,745,1,
- 0,0,0,770,746,1,0,0,0,770,747,1,0,0,0,770,748,1,0,0,0,770,749,1,0,0,0,
- 770,750,1,0,0,0,770,752,1,0,0,0,770,754,1,0,0,0,770,756,1,0,0,0,770,758,
- 1,0,0,0,770,760,1,0,0,0,770,762,1,0,0,0,770,763,1,0,0,0,770,764,1,0,0,
- 0,770,765,1,0,0,0,771,77,1,0,0,0,772,776,1,0,0,0,773,774,5,70,0,0,774,
- 776,3,146,73,0,775,772,1,0,0,0,775,773,1,0,0,0,776,79,1,0,0,0,777,781,
- 1,0,0,0,778,779,5,71,0,0,779,781,3,84,42,0,780,777,1,0,0,0,780,778,1,0,
- 0,0,781,81,1,0,0,0,782,784,3,220,110,0,783,782,1,0,0,0,784,787,1,0,0,0,
- 785,783,1,0,0,0,785,786,1,0,0,0,786,83,1,0,0,0,787,785,1,0,0,0,788,789,
- 3,146,73,0,789,790,5,27,0,0,790,792,1,0,0,0,791,788,1,0,0,0,792,795,1,
- 0,0,0,793,791,1,0,0,0,793,794,1,0,0,0,794,796,1,0,0,0,795,793,1,0,0,0,
- 796,797,3,146,73,0,797,85,1,0,0,0,798,799,7,5,0,0,799,87,1,0,0,0,800,801,
- 3,86,43,0,801,802,3,32,16,0,802,803,5,263,0,0,803,904,1,0,0,0,804,805,
- 3,86,43,0,805,806,3,32,16,0,806,904,1,0,0,0,807,808,3,86,43,0,808,809,
- 3,32,16,0,809,810,5,74,0,0,810,811,3,32,16,0,811,812,5,263,0,0,812,904,
- 1,0,0,0,813,814,3,86,43,0,814,815,3,32,16,0,815,816,5,74,0,0,816,817,3,
- 32,16,0,817,904,1,0,0,0,818,819,3,86,43,0,819,820,3,32,16,0,820,821,5,
- 74,0,0,821,822,3,32,16,0,822,823,5,27,0,0,823,824,3,32,16,0,824,825,5,
- 263,0,0,825,904,1,0,0,0,826,827,3,86,43,0,827,828,3,32,16,0,828,829,5,
- 74,0,0,829,830,3,32,16,0,830,831,5,27,0,0,831,832,3,32,16,0,832,904,1,
- 0,0,0,833,834,3,86,43,0,834,835,3,32,16,0,835,836,5,27,0,0,836,837,3,32,
- 16,0,837,838,5,74,0,0,838,839,3,32,16,0,839,840,5,263,0,0,840,904,1,0,
- 0,0,841,842,3,86,43,0,842,843,3,32,16,0,843,844,5,27,0,0,844,845,3,32,
- 16,0,845,846,5,74,0,0,846,847,3,32,16,0,847,904,1,0,0,0,848,849,3,86,43,
- 0,849,850,3,32,16,0,850,851,5,27,0,0,851,852,3,32,16,0,852,853,5,74,0,
- 0,853,854,3,32,16,0,854,855,5,27,0,0,855,856,3,32,16,0,856,857,5,263,0,
- 0,857,904,1,0,0,0,858,859,3,86,43,0,859,860,3,32,16,0,860,861,5,27,0,0,
- 861,862,3,32,16,0,862,863,5,74,0,0,863,864,3,32,16,0,864,865,5,27,0,0,
- 865,866,3,32,16,0,866,904,1,0,0,0,867,868,3,86,43,0,868,869,3,32,16,0,
- 869,870,5,262,0,0,870,904,1,0,0,0,871,872,3,86,43,0,872,873,3,32,16,0,
- 873,874,5,74,0,0,874,875,3,32,16,0,875,876,5,262,0,0,876,904,1,0,0,0,877,
- 878,3,86,43,0,878,879,3,32,16,0,879,880,5,74,0,0,880,881,3,32,16,0,881,
- 882,5,27,0,0,882,883,3,32,16,0,883,884,5,262,0,0,884,904,1,0,0,0,885,886,
- 3,86,43,0,886,887,3,32,16,0,887,888,5,27,0,0,888,889,3,32,16,0,889,890,
- 5,74,0,0,890,891,3,32,16,0,891,892,5,262,0,0,892,904,1,0,0,0,893,894,3,
- 86,43,0,894,895,3,32,16,0,895,896,5,27,0,0,896,897,3,32,16,0,897,898,5,
- 74,0,0,898,899,3,32,16,0,899,900,5,27,0,0,900,901,3,32,16,0,901,902,5,
- 262,0,0,902,904,1,0,0,0,903,800,1,0,0,0,903,804,1,0,0,0,903,807,1,0,0,
- 0,903,813,1,0,0,0,903,818,1,0,0,0,903,826,1,0,0,0,903,833,1,0,0,0,903,
- 841,1,0,0,0,903,848,1,0,0,0,903,858,1,0,0,0,903,867,1,0,0,0,903,871,1,
- 0,0,0,903,877,1,0,0,0,903,885,1,0,0,0,903,893,1,0,0,0,904,89,1,0,0,0,905,
- 909,5,20,0,0,906,908,3,92,46,0,907,906,1,0,0,0,908,911,1,0,0,0,909,907,
- 1,0,0,0,909,910,1,0,0,0,910,912,1,0,0,0,911,909,1,0,0,0,912,913,3,2,1,
- 0,913,914,3,94,47,0,914,915,5,179,0,0,915,916,5,35,0,0,916,917,5,29,0,
- 0,917,918,3,312,156,0,918,919,5,30,0,0,919,920,3,94,47,0,920,932,1,0,0,
- 0,921,925,5,20,0,0,922,924,3,92,46,0,923,922,1,0,0,0,924,927,1,0,0,0,925,
- 923,1,0,0,0,925,926,1,0,0,0,926,928,1,0,0,0,927,925,1,0,0,0,928,929,3,
- 2,1,0,929,930,3,94,47,0,930,932,1,0,0,0,931,905,1,0,0,0,931,921,1,0,0,
- 0,932,91,1,0,0,0,933,934,5,75,0,0,934,93,1,0,0,0,935,938,1,0,0,0,936,938,
- 5,297,0,0,937,935,1,0,0,0,937,936,1,0,0,0,938,95,1,0,0,0,939,940,7,6,0,
- 0,940,97,1,0,0,0,941,943,3,96,48,0,942,941,1,0,0,0,943,946,1,0,0,0,944,
- 942,1,0,0,0,944,945,1,0,0,0,945,99,1,0,0,0,946,944,1,0,0,0,947,948,5,274,
- 0,0,948,101,1,0,0,0,949,950,5,275,0,0,950,103,1,0,0,0,951,952,5,276,0,
- 0,952,105,1,0,0,0,953,954,5,277,0,0,954,107,1,0,0,0,955,956,5,278,0,0,
- 956,109,1,0,0,0,957,958,5,281,0,0,958,111,1,0,0,0,959,960,5,279,0,0,960,
- 113,1,0,0,0,961,962,5,285,0,0,962,115,1,0,0,0,963,964,5,283,0,0,964,117,
- 1,0,0,0,965,966,5,284,0,0,966,119,1,0,0,0,967,968,5,280,0,0,968,121,1,
- 0,0,0,969,970,5,286,0,0,970,123,1,0,0,0,971,972,5,282,0,0,972,125,1,0,
- 0,0,973,1053,3,100,50,0,974,975,3,102,51,0,975,976,3,32,16,0,976,1053,
- 1,0,0,0,977,978,3,102,51,0,978,979,3,0,0,0,979,1053,1,0,0,0,980,981,3,
- 104,52,0,981,982,3,32,16,0,982,1053,1,0,0,0,983,984,3,106,53,0,984,985,
- 3,34,17,0,985,1053,1,0,0,0,986,987,3,108,54,0,987,988,3,36,18,0,988,1053,
- 1,0,0,0,989,990,3,108,54,0,990,991,3,34,17,0,991,1053,1,0,0,0,992,993,
- 3,108,54,0,993,994,5,29,0,0,994,995,3,312,156,0,995,996,5,30,0,0,996,1053,
- 1,0,0,0,997,998,3,108,54,0,998,999,5,83,0,0,999,1000,5,29,0,0,1000,1001,
- 3,312,156,0,1001,1002,5,30,0,0,1002,1053,1,0,0,0,1003,1004,3,110,55,0,
- 1004,1005,3,32,16,0,1005,1053,1,0,0,0,1006,1007,3,110,55,0,1007,1008,3,
- 0,0,0,1008,1053,1,0,0,0,1009,1010,3,112,56,0,1010,1011,3,190,95,0,1011,
- 1053,1,0,0,0,1012,1013,3,114,57,0,1013,1014,3,200,100,0,1014,1053,1,0,
- 0,0,1015,1016,3,114,57,0,1016,1017,3,196,98,0,1017,1053,1,0,0,0,1018,1019,
- 3,116,58,0,1019,1020,3,146,73,0,1020,1053,1,0,0,0,1021,1022,3,118,59,0,
- 1022,1023,3,6,3,0,1023,1053,1,0,0,0,1024,1025,3,118,59,0,1025,1026,5,223,
- 0,0,1026,1027,5,29,0,0,1027,1028,3,6,3,0,1028,1029,5,30,0,0,1029,1053,
- 1,0,0,0,1030,1031,3,118,59,0,1031,1032,5,83,0,0,1032,1033,5,29,0,0,1033,
- 1034,3,312,156,0,1034,1035,5,30,0,0,1035,1053,1,0,0,0,1036,1037,3,120,
- 60,0,1037,1038,3,192,96,0,1038,1039,3,160,80,0,1039,1040,3,134,67,0,1040,
- 1053,1,0,0,0,1041,1042,3,122,61,0,1042,1043,3,50,25,0,1043,1053,1,0,0,
- 0,1044,1045,3,124,62,0,1045,1046,5,29,0,0,1046,1047,3,128,64,0,1047,1048,
- 5,30,0,0,1048,1053,1,0,0,0,1049,1050,3,124,62,0,1050,1051,5,84,0,0,1051,
- 1053,1,0,0,0,1052,973,1,0,0,0,1052,974,1,0,0,0,1052,977,1,0,0,0,1052,980,
- 1,0,0,0,1052,983,1,0,0,0,1052,986,1,0,0,0,1052,989,1,0,0,0,1052,992,1,
- 0,0,0,1052,997,1,0,0,0,1052,1003,1,0,0,0,1052,1006,1,0,0,0,1052,1009,1,
- 0,0,0,1052,1012,1,0,0,0,1052,1015,1,0,0,0,1052,1018,1,0,0,0,1052,1021,
- 1,0,0,0,1052,1024,1,0,0,0,1052,1030,1,0,0,0,1052,1036,1,0,0,0,1052,1041,
- 1,0,0,0,1052,1044,1,0,0,0,1052,1049,1,0,0,0,1053,127,1,0,0,0,1054,1071,
- 1,0,0,0,1055,1058,3,0,0,0,1056,1058,3,32,16,0,1057,1055,1,0,0,0,1057,1056,
- 1,0,0,0,1058,1059,1,0,0,0,1059,1060,5,27,0,0,1060,1062,1,0,0,0,1061,1057,
- 1,0,0,0,1062,1065,1,0,0,0,1063,1061,1,0,0,0,1063,1064,1,0,0,0,1064,1068,
- 1,0,0,0,1065,1063,1,0,0,0,1066,1069,3,0,0,0,1067,1069,3,32,16,0,1068,1066,
- 1,0,0,0,1068,1067,1,0,0,0,1069,1071,1,0,0,0,1070,1054,1,0,0,0,1070,1063,
- 1,0,0,0,1071,129,1,0,0,0,1072,1078,5,85,0,0,1073,1074,3,160,80,0,1074,
- 1075,5,27,0,0,1075,1077,1,0,0,0,1076,1073,1,0,0,0,1077,1080,1,0,0,0,1078,
- 1076,1,0,0,0,1078,1079,1,0,0,0,1079,1081,1,0,0,0,1080,1078,1,0,0,0,1081,
- 1082,3,160,80,0,1082,1083,5,86,0,0,1083,131,1,0,0,0,1084,1090,5,41,0,0,
- 1085,1086,3,168,84,0,1086,1087,5,27,0,0,1087,1089,1,0,0,0,1088,1085,1,
- 0,0,0,1089,1092,1,0,0,0,1090,1088,1,0,0,0,1090,1091,1,0,0,0,1091,1093,
- 1,0,0,0,1092,1090,1,0,0,0,1093,1094,3,168,84,0,1094,1095,5,42,0,0,1095,
- 133,1,0,0,0,1096,1102,5,29,0,0,1097,1098,3,136,68,0,1098,1099,5,27,0,0,
- 1099,1101,1,0,0,0,1100,1097,1,0,0,0,1101,1104,1,0,0,0,1102,1100,1,0,0,
- 0,1102,1103,1,0,0,0,1103,1105,1,0,0,0,1104,1102,1,0,0,0,1105,1106,3,136,
- 68,0,1106,1107,5,30,0,0,1107,1110,1,0,0,0,1108,1110,5,84,0,0,1109,1096,
- 1,0,0,0,1109,1108,1,0,0,0,1110,135,1,0,0,0,1111,1119,5,176,0,0,1112,1113,
- 3,252,126,0,1113,1114,3,160,80,0,1114,1116,3,248,124,0,1115,1117,3,0,0,
- 0,1116,1115,1,0,0,0,1116,1117,1,0,0,0,1117,1119,1,0,0,0,1118,1111,1,0,
- 0,0,1118,1112,1,0,0,0,1119,137,1,0,0,0,1120,1121,5,41,0,0,1121,1122,3,
- 2,1,0,1122,1123,5,42,0,0,1123,1124,3,140,70,0,1124,1146,1,0,0,0,1125,1126,
- 5,41,0,0,1126,1127,3,196,98,0,1127,1128,5,42,0,0,1128,1129,3,140,70,0,
- 1129,1146,1,0,0,0,1130,1131,5,41,0,0,1131,1132,5,261,0,0,1132,1133,5,42,
- 0,0,1133,1146,3,140,70,0,1134,1135,5,41,0,0,1135,1136,5,197,0,0,1136,1137,
- 3,2,1,0,1137,1138,5,42,0,0,1138,1139,3,140,70,0,1139,1146,1,0,0,0,1140,
- 1146,3,140,70,0,1141,1146,3,196,98,0,1142,1146,5,256,0,0,1143,1146,5,257,
- 0,0,1144,1146,5,258,0,0,1145,1120,1,0,0,0,1145,1125,1,0,0,0,1145,1130,
- 1,0,0,0,1145,1134,1,0,0,0,1145,1140,1,0,0,0,1145,1141,1,0,0,0,1145,1142,
- 1,0,0,0,1145,1143,1,0,0,0,1145,1144,1,0,0,0,1146,139,1,0,0,0,1147,1148,
- 3,2,1,0,1148,1149,5,87,0,0,1149,1151,1,0,0,0,1150,1147,1,0,0,0,1151,1154,
- 1,0,0,0,1152,1150,1,0,0,0,1152,1153,1,0,0,0,1153,1155,1,0,0,0,1154,1152,
- 1,0,0,0,1155,1156,3,2,1,0,1156,141,1,0,0,0,1157,1159,3,144,72,0,1158,1157,
- 1,0,0,0,1159,1162,1,0,0,0,1160,1158,1,0,0,0,1160,1161,1,0,0,0,1161,143,
- 1,0,0,0,1162,1160,1,0,0,0,1163,1164,5,179,0,0,1164,1165,5,88,0,0,1165,
- 1169,3,32,16,0,1166,1169,3,174,87,0,1167,1169,3,344,172,0,1168,1163,1,
- 0,0,0,1168,1166,1,0,0,0,1168,1167,1,0,0,0,1169,145,1,0,0,0,1170,1182,3,
- 138,69,0,1171,1172,5,41,0,0,1172,1173,3,2,1,0,1173,1174,5,42,0,0,1174,
- 1182,1,0,0,0,1175,1176,5,41,0,0,1176,1177,5,197,0,0,1177,1178,3,2,1,0,
- 1178,1179,5,42,0,0,1179,1182,1,0,0,0,1180,1182,3,160,80,0,1181,1170,1,
- 0,0,0,1181,1171,1,0,0,0,1181,1175,1,0,0,0,1181,1180,1,0,0,0,1182,147,1,
- 0,0,0,1183,1192,1,0,0,0,1184,1188,3,152,76,0,1185,1187,3,150,75,0,1186,
- 1185,1,0,0,0,1187,1190,1,0,0,0,1188,1186,1,0,0,0,1188,1189,1,0,0,0,1189,
- 1192,1,0,0,0,1190,1188,1,0,0,0,1191,1183,1,0,0,0,1191,1184,1,0,0,0,1192,
- 149,1,0,0,0,1193,1211,5,261,0,0,1194,1211,5,260,0,0,1195,1196,5,41,0,0,
- 1196,1197,3,32,16,0,1197,1198,5,42,0,0,1198,1211,1,0,0,0,1199,1200,5,41,
- 0,0,1200,1201,3,32,16,0,1201,1202,5,265,0,0,1202,1203,3,32,16,0,1203,1204,
- 5,42,0,0,1204,1211,1,0,0,0,1205,1206,5,41,0,0,1206,1207,5,265,0,0,1207,
- 1208,3,32,16,0,1208,1209,5,42,0,0,1209,1211,1,0,0,0,1210,1193,1,0,0,0,
- 1210,1194,1,0,0,0,1210,1195,1,0,0,0,1210,1199,1,0,0,0,1210,1205,1,0,0,
- 0,1211,151,1,0,0,0,1212,1297,1,0,0,0,1213,1214,5,202,0,0,1214,1215,5,29,
- 0,0,1215,1216,3,6,3,0,1216,1217,5,27,0,0,1217,1218,3,6,3,0,1218,1219,5,
- 27,0,0,1219,1220,3,6,3,0,1220,1221,5,27,0,0,1221,1222,3,6,3,0,1222,1223,
- 5,30,0,0,1223,1297,1,0,0,0,1224,1225,5,202,0,0,1225,1226,5,29,0,0,1226,
- 1227,3,6,3,0,1227,1228,5,27,0,0,1228,1229,3,6,3,0,1229,1230,5,30,0,0,1230,
- 1297,1,0,0,0,1231,1232,5,203,0,0,1232,1233,5,204,0,0,1233,1234,5,41,0,
- 0,1234,1235,3,32,16,0,1235,1236,5,42,0,0,1236,1297,1,0,0,0,1237,1238,5,
- 203,0,0,1238,1239,5,205,0,0,1239,1240,5,41,0,0,1240,1241,3,32,16,0,1241,
- 1242,5,42,0,0,1242,1243,3,148,74,0,1243,1297,1,0,0,0,1244,1297,5,206,0,
- 0,1245,1297,5,207,0,0,1246,1297,5,208,0,0,1247,1297,5,200,0,0,1248,1297,
- 5,182,0,0,1249,1297,5,183,0,0,1250,1297,5,184,0,0,1251,1297,5,185,0,0,
- 1252,1297,5,186,0,0,1253,1297,5,187,0,0,1254,1297,5,188,0,0,1255,1297,
- 5,209,0,0,1256,1297,5,189,0,0,1257,1297,5,190,0,0,1258,1297,5,191,0,0,
- 1259,1297,5,192,0,0,1260,1297,5,210,0,0,1261,1297,5,211,0,0,1262,1297,
- 5,212,0,0,1263,1297,5,213,0,0,1264,1297,5,214,0,0,1265,1297,5,215,0,0,
- 1266,1297,5,216,0,0,1267,1268,5,217,0,0,1268,1297,3,154,77,0,1269,1270,
- 5,218,0,0,1270,1297,3,154,77,0,1271,1297,5,219,0,0,1272,1273,5,220,0,0,
- 1273,1297,3,154,77,0,1274,1275,5,221,0,0,1275,1297,3,156,78,0,1276,1277,
- 5,221,0,0,1277,1278,3,156,78,0,1278,1279,5,27,0,0,1279,1280,3,6,3,0,1280,
- 1297,1,0,0,0,1281,1297,5,193,0,0,1282,1297,5,194,0,0,1283,1284,5,61,0,
- 0,1284,1297,5,219,0,0,1285,1297,5,222,0,0,1286,1287,5,223,0,0,1287,1297,
- 5,212,0,0,1288,1297,5,224,0,0,1289,1290,5,206,0,0,1290,1297,5,182,0,0,
- 1291,1297,5,225,0,0,1292,1297,5,227,0,0,1293,1294,5,33,0,0,1294,1297,5,
- 226,0,0,1295,1297,3,2,1,0,1296,1212,1,0,0,0,1296,1213,1,0,0,0,1296,1224,
- 1,0,0,0,1296,1231,1,0,0,0,1296,1237,1,0,0,0,1296,1244,1,0,0,0,1296,1245,
- 1,0,0,0,1296,1246,1,0,0,0,1296,1247,1,0,0,0,1296,1248,1,0,0,0,1296,1249,
- 1,0,0,0,1296,1250,1,0,0,0,1296,1251,1,0,0,0,1296,1252,1,0,0,0,1296,1253,
- 1,0,0,0,1296,1254,1,0,0,0,1296,1255,1,0,0,0,1296,1256,1,0,0,0,1296,1257,
- 1,0,0,0,1296,1258,1,0,0,0,1296,1259,1,0,0,0,1296,1260,1,0,0,0,1296,1261,
- 1,0,0,0,1296,1262,1,0,0,0,1296,1263,1,0,0,0,1296,1264,1,0,0,0,1296,1265,
- 1,0,0,0,1296,1266,1,0,0,0,1296,1267,1,0,0,0,1296,1269,1,0,0,0,1296,1271,
- 1,0,0,0,1296,1272,1,0,0,0,1296,1274,1,0,0,0,1296,1276,1,0,0,0,1296,1281,
- 1,0,0,0,1296,1282,1,0,0,0,1296,1283,1,0,0,0,1296,1285,1,0,0,0,1296,1286,
- 1,0,0,0,1296,1288,1,0,0,0,1296,1289,1,0,0,0,1296,1291,1,0,0,0,1296,1292,
- 1,0,0,0,1296,1293,1,0,0,0,1296,1295,1,0,0,0,1297,153,1,0,0,0,1298,1306,
- 1,0,0,0,1299,1300,5,29,0,0,1300,1301,5,89,0,0,1301,1302,5,35,0,0,1302,
- 1303,3,32,16,0,1303,1304,5,30,0,0,1304,1306,1,0,0,0,1305,1298,1,0,0,0,
- 1305,1299,1,0,0,0,1306,155,1,0,0,0,1307,1316,1,0,0,0,1308,1312,3,158,79,
- 0,1309,1311,7,7,0,0,1310,1309,1,0,0,0,1311,1314,1,0,0,0,1312,1310,1,0,
- 0,0,1312,1313,1,0,0,0,1313,1316,1,0,0,0,1314,1312,1,0,0,0,1315,1307,1,
- 0,0,0,1315,1308,1,0,0,0,1316,157,1,0,0,0,1317,1318,7,8,0,0,1318,159,1,
- 0,0,0,1319,1323,3,164,82,0,1320,1322,3,162,81,0,1321,1320,1,0,0,0,1322,
- 1325,1,0,0,0,1323,1321,1,0,0,0,1323,1324,1,0,0,0,1324,161,1,0,0,0,1325,
- 1323,1,0,0,0,1326,1345,5,260,0,0,1327,1328,5,41,0,0,1328,1345,5,42,0,0,
- 1329,1345,3,132,66,0,1330,1345,5,259,0,0,1331,1345,5,261,0,0,1332,1345,
- 5,90,0,0,1333,1334,5,91,0,0,1334,1335,5,29,0,0,1335,1336,3,146,73,0,1336,
- 1337,5,30,0,0,1337,1345,1,0,0,0,1338,1339,5,92,0,0,1339,1340,5,29,0,0,
- 1340,1341,3,146,73,0,1341,1342,5,30,0,0,1342,1345,1,0,0,0,1343,1345,3,
- 130,65,0,1344,1326,1,0,0,0,1344,1327,1,0,0,0,1344,1329,1,0,0,0,1344,1330,
- 1,0,0,0,1344,1331,1,0,0,0,1344,1332,1,0,0,0,1344,1333,1,0,0,0,1344,1338,
- 1,0,0,0,1344,1343,1,0,0,0,1345,163,1,0,0,0,1346,1347,5,38,0,0,1347,1377,
- 3,138,69,0,1348,1377,5,196,0,0,1349,1350,5,198,0,0,1350,1351,5,38,0,0,
- 1351,1377,3,138,69,0,1352,1353,5,199,0,0,1353,1377,3,138,69,0,1354,1355,
- 5,225,0,0,1355,1356,3,192,96,0,1356,1357,3,160,80,0,1357,1358,5,261,0,
- 0,1358,1359,3,134,67,0,1359,1377,1,0,0,0,1360,1361,5,252,0,0,1361,1377,
- 3,32,16,0,1362,1363,5,251,0,0,1363,1377,3,32,16,0,1364,1365,5,252,0,0,
- 1365,1377,3,2,1,0,1366,1367,5,251,0,0,1367,1377,3,2,1,0,1368,1377,5,253,
- 0,0,1369,1377,5,200,0,0,1370,1377,3,170,85,0,1371,1377,3,172,86,0,1372,
- 1377,3,166,83,0,1373,1377,3,2,1,0,1374,1375,5,176,0,0,1375,1377,3,160,
- 80,0,1376,1346,1,0,0,0,1376,1348,1,0,0,0,1376,1349,1,0,0,0,1376,1352,1,
- 0,0,0,1376,1354,1,0,0,0,1376,1360,1,0,0,0,1376,1362,1,0,0,0,1376,1364,
- 1,0,0,0,1376,1366,1,0,0,0,1376,1368,1,0,0,0,1376,1369,1,0,0,0,1376,1370,
- 1,0,0,0,1376,1371,1,0,0,0,1376,1372,1,0,0,0,1376,1373,1,0,0,0,1376,1374,
- 1,0,0,0,1377,165,1,0,0,0,1378,1400,5,180,0,0,1379,1400,5,181,0,0,1380,
- 1400,5,182,0,0,1381,1400,5,183,0,0,1382,1400,5,184,0,0,1383,1400,5,185,
- 0,0,1384,1400,5,186,0,0,1385,1400,5,187,0,0,1386,1400,5,188,0,0,1387,1400,
- 5,189,0,0,1388,1400,5,190,0,0,1389,1400,5,191,0,0,1390,1400,5,192,0,0,
- 1391,1392,5,93,0,0,1392,1400,5,183,0,0,1393,1394,5,93,0,0,1394,1400,5,
- 184,0,0,1395,1396,5,93,0,0,1396,1400,5,185,0,0,1397,1398,5,93,0,0,1398,
- 1400,5,186,0,0,1399,1378,1,0,0,0,1399,1379,1,0,0,0,1399,1380,1,0,0,0,1399,
- 1381,1,0,0,0,1399,1382,1,0,0,0,1399,1383,1,0,0,0,1399,1384,1,0,0,0,1399,
- 1385,1,0,0,0,1399,1386,1,0,0,0,1399,1387,1,0,0,0,1399,1388,1,0,0,0,1399,
- 1389,1,0,0,0,1399,1390,1,0,0,0,1399,1391,1,0,0,0,1399,1393,1,0,0,0,1399,
- 1395,1,0,0,0,1399,1397,1,0,0,0,1400,167,1,0,0,0,1401,1412,1,0,0,0,1402,
- 1412,5,176,0,0,1403,1412,3,32,16,0,1404,1405,3,32,16,0,1405,1406,5,176,
- 0,0,1406,1407,3,32,16,0,1407,1412,1,0,0,0,1408,1409,3,32,16,0,1409,1410,
- 5,176,0,0,1410,1412,1,0,0,0,1411,1401,1,0,0,0,1411,1402,1,0,0,0,1411,1403,
- 1,0,0,0,1411,1404,1,0,0,0,1411,1408,1,0,0,0,1412,169,1,0,0,0,1413,1414,
- 5,1,0,0,1414,1415,5,193,0,0,1415,171,1,0,0,0,1416,1420,5,1,0,0,1417,1418,
- 5,93,0,0,1418,1421,5,193,0,0,1419,1421,5,194,0,0,1420,1417,1,0,0,0,1420,
- 1419,1,0,0,0,1421,173,1,0,0,0,1422,1423,5,293,0,0,1423,1424,3,188,94,0,
- 1424,1425,3,146,73,0,1425,1426,5,29,0,0,1426,1427,3,180,90,0,1427,1428,
- 5,30,0,0,1428,1463,1,0,0,0,1429,1430,5,293,0,0,1430,1431,3,188,94,0,1431,
- 1432,3,146,73,0,1432,1433,5,35,0,0,1433,1434,5,16,0,0,1434,1435,3,52,26,
- 0,1435,1436,5,17,0,0,1436,1463,1,0,0,0,1437,1438,5,293,0,0,1438,1439,3,
- 188,94,0,1439,1440,3,146,73,0,1440,1463,1,0,0,0,1441,1442,5,294,0,0,1442,
- 1443,3,188,94,0,1443,1445,5,35,0,0,1444,1446,5,83,0,0,1445,1444,1,0,0,
- 0,1445,1446,1,0,0,0,1446,1447,1,0,0,0,1447,1448,5,29,0,0,1448,1449,3,312,
- 156,0,1449,1450,5,30,0,0,1450,1463,1,0,0,0,1451,1452,5,294,0,0,1452,1453,
- 3,188,94,0,1453,1454,3,6,3,0,1454,1463,1,0,0,0,1455,1456,5,294,0,0,1456,
- 1457,3,188,94,0,1457,1458,5,35,0,0,1458,1459,5,16,0,0,1459,1460,3,176,
- 88,0,1460,1461,5,17,0,0,1461,1463,1,0,0,0,1462,1422,1,0,0,0,1462,1429,
- 1,0,0,0,1462,1437,1,0,0,0,1462,1441,1,0,0,0,1462,1451,1,0,0,0,1462,1455,
- 1,0,0,0,1463,175,1,0,0,0,1464,1475,1,0,0,0,1465,1466,3,178,89,0,1466,1467,
- 5,27,0,0,1467,1469,1,0,0,0,1468,1465,1,0,0,0,1469,1472,1,0,0,0,1470,1468,
- 1,0,0,0,1470,1471,1,0,0,0,1471,1473,1,0,0,0,1472,1470,1,0,0,0,1473,1475,
- 3,178,89,0,1474,1464,1,0,0,0,1474,1470,1,0,0,0,1475,177,1,0,0,0,1476,1477,
- 5,38,0,0,1477,1478,5,263,0,0,1478,1479,5,35,0,0,1479,1480,5,16,0,0,1480,
- 1481,3,56,28,0,1481,1482,5,17,0,0,1482,1490,1,0,0,0,1483,1484,3,146,73,
- 0,1484,1485,5,35,0,0,1485,1486,5,16,0,0,1486,1487,3,56,28,0,1487,1488,
- 5,17,0,0,1488,1490,1,0,0,0,1489,1476,1,0,0,0,1489,1483,1,0,0,0,1490,179,
- 1,0,0,0,1491,1492,3,182,91,0,1492,1493,5,27,0,0,1493,1495,1,0,0,0,1494,
- 1491,1,0,0,0,1495,1498,1,0,0,0,1496,1494,1,0,0,0,1496,1497,1,0,0,0,1497,
- 1499,1,0,0,0,1498,1496,1,0,0,0,1499,1500,3,182,91,0,1500,181,1,0,0,0,1501,
- 1502,3,6,3,0,1502,1503,5,35,0,0,1503,1504,3,186,93,0,1504,183,1,0,0,0,
- 1505,1506,7,9,0,0,1506,185,1,0,0,0,1507,1542,3,184,92,0,1508,1542,3,32,
- 16,0,1509,1510,5,185,0,0,1510,1511,5,29,0,0,1511,1512,3,32,16,0,1512,1513,
- 5,30,0,0,1513,1542,1,0,0,0,1514,1542,3,6,3,0,1515,1516,3,138,69,0,1516,
- 1517,5,29,0,0,1517,1518,5,183,0,0,1518,1519,5,74,0,0,1519,1520,3,32,16,
- 0,1520,1521,5,30,0,0,1521,1542,1,0,0,0,1522,1523,3,138,69,0,1523,1524,
- 5,29,0,0,1524,1525,5,184,0,0,1525,1526,5,74,0,0,1526,1527,3,32,16,0,1527,
- 1528,5,30,0,0,1528,1542,1,0,0,0,1529,1530,3,138,69,0,1530,1531,5,29,0,
- 0,1531,1532,5,185,0,0,1532,1533,5,74,0,0,1533,1534,3,32,16,0,1534,1535,
- 5,30,0,0,1535,1542,1,0,0,0,1536,1537,3,138,69,0,1537,1538,5,29,0,0,1538,
- 1539,3,32,16,0,1539,1540,5,30,0,0,1540,1542,1,0,0,0,1541,1507,1,0,0,0,
- 1541,1508,1,0,0,0,1541,1509,1,0,0,0,1541,1514,1,0,0,0,1541,1515,1,0,0,
- 0,1541,1522,1,0,0,0,1541,1529,1,0,0,0,1541,1536,1,0,0,0,1542,187,1,0,0,
- 0,1543,1544,7,10,0,0,1544,189,1,0,0,0,1545,1546,3,192,96,0,1546,1547,3,
- 160,80,0,1547,1548,3,146,73,0,1548,1549,5,175,0,0,1549,1551,3,264,132,
- 0,1550,1552,3,130,65,0,1551,1550,1,0,0,0,1551,1552,1,0,0,0,1552,1553,1,
- 0,0,0,1553,1554,3,134,67,0,1554,1580,1,0,0,0,1555,1556,3,192,96,0,1556,
- 1557,3,160,80,0,1557,1558,3,146,73,0,1558,1559,5,175,0,0,1559,1560,3,264,
- 132,0,1560,1561,3,218,109,0,1561,1562,3,134,67,0,1562,1580,1,0,0,0,1563,
- 1564,3,192,96,0,1564,1565,3,160,80,0,1565,1567,3,264,132,0,1566,1568,3,
- 130,65,0,1567,1566,1,0,0,0,1567,1568,1,0,0,0,1568,1569,1,0,0,0,1569,1570,
- 3,134,67,0,1570,1580,1,0,0,0,1571,1572,3,192,96,0,1572,1573,3,160,80,0,
- 1573,1574,3,264,132,0,1574,1575,3,218,109,0,1575,1576,3,134,67,0,1576,
- 1580,1,0,0,0,1577,1580,3,196,98,0,1578,1580,3,2,1,0,1579,1545,1,0,0,0,
- 1579,1555,1,0,0,0,1579,1563,1,0,0,0,1579,1571,1,0,0,0,1579,1577,1,0,0,
- 0,1579,1578,1,0,0,0,1580,191,1,0,0,0,1581,1582,5,242,0,0,1582,1592,3,192,
- 96,0,1583,1584,5,243,0,0,1584,1592,3,192,96,0,1585,1592,3,194,97,0,1586,
- 1587,5,111,0,0,1587,1588,5,29,0,0,1588,1589,3,32,16,0,1589,1590,5,30,0,
- 0,1590,1592,1,0,0,0,1591,1581,1,0,0,0,1591,1583,1,0,0,0,1591,1585,1,0,
- 0,0,1591,1586,1,0,0,0,1592,193,1,0,0,0,1593,1606,1,0,0,0,1594,1606,5,244,
- 0,0,1595,1606,5,245,0,0,1596,1597,5,246,0,0,1597,1606,5,247,0,0,1598,1599,
- 5,246,0,0,1599,1606,5,248,0,0,1600,1601,5,246,0,0,1601,1606,5,249,0,0,
- 1602,1603,5,246,0,0,1603,1606,5,250,0,0,1604,1606,5,246,0,0,1605,1593,
- 1,0,0,0,1605,1594,1,0,0,0,1605,1595,1,0,0,0,1605,1596,1,0,0,0,1605,1598,
- 1,0,0,0,1605,1600,1,0,0,0,1605,1602,1,0,0,0,1605,1604,1,0,0,0,1606,195,
- 1,0,0,0,1607,1608,5,112,0,0,1608,1609,5,29,0,0,1609,1610,3,32,16,0,1610,
- 1611,5,30,0,0,1611,197,1,0,0,0,1612,1613,5,225,0,0,1613,1618,3,190,95,
- 0,1614,1615,5,36,0,0,1615,1618,3,200,100,0,1616,1618,3,196,98,0,1617,1612,
- 1,0,0,0,1617,1614,1,0,0,0,1617,1616,1,0,0,0,1618,199,1,0,0,0,1619,1620,
- 3,160,80,0,1620,1621,3,146,73,0,1621,1622,5,175,0,0,1622,1623,3,2,1,0,
- 1623,1629,1,0,0,0,1624,1625,3,160,80,0,1625,1626,3,2,1,0,1626,1629,1,0,
- 0,0,1627,1629,3,2,1,0,1628,1619,1,0,0,0,1628,1624,1,0,0,0,1628,1627,1,
- 0,0,0,1629,201,1,0,0,0,1630,1631,3,146,73,0,1631,1632,5,27,0,0,1632,1634,
- 1,0,0,0,1633,1630,1,0,0,0,1634,1637,1,0,0,0,1635,1633,1,0,0,0,1635,1636,
- 1,0,0,0,1636,1638,1,0,0,0,1637,1635,1,0,0,0,1638,1639,3,146,73,0,1639,
- 203,1,0,0,0,1640,1646,1,0,0,0,1641,1642,5,85,0,0,1642,1643,3,212,106,0,
- 1643,1644,5,86,0,0,1644,1646,1,0,0,0,1645,1640,1,0,0,0,1645,1641,1,0,0,
- 0,1646,205,1,0,0,0,1647,1659,5,265,0,0,1648,1659,5,113,0,0,1649,1659,5,
- 38,0,0,1650,1659,5,199,0,0,1651,1659,5,114,0,0,1652,1659,5,115,0,0,1653,
- 1654,5,69,0,0,1654,1655,5,29,0,0,1655,1656,3,32,16,0,1656,1657,5,30,0,
- 0,1657,1659,1,0,0,0,1658,1647,1,0,0,0,1658,1648,1,0,0,0,1658,1649,1,0,
- 0,0,1658,1650,1,0,0,0,1658,1651,1,0,0,0,1658,1652,1,0,0,0,1658,1653,1,
- 0,0,0,1659,207,1,0,0,0,1660,1662,3,206,103,0,1661,1660,1,0,0,0,1662,1665,
- 1,0,0,0,1663,1661,1,0,0,0,1663,1664,1,0,0,0,1664,209,1,0,0,0,1665,1663,
- 1,0,0,0,1666,1668,3,208,104,0,1667,1669,3,214,107,0,1668,1667,1,0,0,0,
- 1668,1669,1,0,0,0,1669,1670,1,0,0,0,1670,1671,3,2,1,0,1671,211,1,0,0,0,
- 1672,1673,3,210,105,0,1673,1674,5,27,0,0,1674,1676,1,0,0,0,1675,1672,1,
- 0,0,0,1676,1679,1,0,0,0,1677,1675,1,0,0,0,1677,1678,1,0,0,0,1678,1680,
- 1,0,0,0,1679,1677,1,0,0,0,1680,1681,3,210,105,0,1681,213,1,0,0,0,1682,
- 1683,5,29,0,0,1683,1684,3,202,101,0,1684,1685,5,30,0,0,1685,215,1,0,0,
- 0,1686,1689,1,0,0,0,1687,1689,3,218,109,0,1688,1686,1,0,0,0,1688,1687,
- 1,0,0,0,1689,217,1,0,0,0,1690,1691,5,85,0,0,1691,1692,5,41,0,0,1692,1693,
- 3,32,16,0,1693,1694,5,42,0,0,1694,1695,5,86,0,0,1695,219,1,0,0,0,1696,
- 1697,3,256,128,0,1697,1698,5,16,0,0,1698,1699,3,268,134,0,1699,1700,5,
- 17,0,0,1700,1813,1,0,0,0,1701,1702,3,74,37,0,1702,1703,5,16,0,0,1703,1704,
- 3,82,41,0,1704,1705,5,17,0,0,1705,1813,1,0,0,0,1706,1707,3,232,116,0,1707,
- 1708,5,16,0,0,1708,1709,3,236,118,0,1709,1710,5,17,0,0,1710,1813,1,0,0,
- 0,1711,1712,3,240,120,0,1712,1713,5,16,0,0,1713,1714,3,244,122,0,1714,
- 1715,5,17,0,0,1715,1813,1,0,0,0,1716,1813,3,222,111,0,1717,1813,3,296,
- 148,0,1718,1813,3,174,87,0,1719,1813,3,88,44,0,1720,1813,3,342,171,0,1721,
- 1722,5,116,0,0,1722,1813,3,32,16,0,1723,1724,5,117,0,0,1724,1813,3,32,
- 16,0,1725,1726,3,354,177,0,1726,1727,5,16,0,0,1727,1728,3,358,179,0,1728,
- 1729,5,17,0,0,1729,1813,1,0,0,0,1730,1731,5,301,0,0,1731,1732,3,146,73,
- 0,1732,1733,5,175,0,0,1733,1734,3,264,132,0,1734,1735,5,118,0,0,1735,1736,
- 3,192,96,0,1736,1737,3,160,80,0,1737,1738,3,146,73,0,1738,1739,5,175,0,
- 0,1739,1740,3,264,132,0,1740,1741,3,134,67,0,1741,1813,1,0,0,0,1742,1743,
- 5,301,0,0,1743,1744,5,225,0,0,1744,1745,3,192,96,0,1745,1746,3,160,80,
- 0,1746,1747,3,146,73,0,1747,1748,5,175,0,0,1748,1749,3,264,132,0,1749,
- 1750,3,216,108,0,1750,1751,3,134,67,0,1751,1752,5,118,0,0,1752,1753,5,
- 225,0,0,1753,1754,3,192,96,0,1754,1755,3,160,80,0,1755,1756,3,146,73,0,
- 1756,1757,5,175,0,0,1757,1758,3,264,132,0,1758,1759,3,216,108,0,1759,1760,
- 3,134,67,0,1760,1813,1,0,0,0,1761,1813,3,26,13,0,1762,1813,3,40,20,0,1763,
- 1764,5,254,0,0,1764,1765,5,195,0,0,1765,1766,5,41,0,0,1766,1767,3,32,16,
- 0,1767,1771,5,42,0,0,1768,1770,3,342,171,0,1769,1768,1,0,0,0,1770,1773,
- 1,0,0,0,1771,1769,1,0,0,0,1771,1772,1,0,0,0,1772,1813,1,0,0,0,1773,1771,
- 1,0,0,0,1774,1775,5,254,0,0,1775,1776,5,195,0,0,1776,1780,3,2,1,0,1777,
- 1779,3,342,171,0,1778,1777,1,0,0,0,1779,1782,1,0,0,0,1780,1778,1,0,0,0,
- 1780,1781,1,0,0,0,1781,1813,1,0,0,0,1782,1780,1,0,0,0,1783,1784,5,254,
- 0,0,1784,1785,5,255,0,0,1785,1786,5,41,0,0,1786,1787,3,32,16,0,1787,1788,
- 5,42,0,0,1788,1789,5,27,0,0,1789,1793,3,146,73,0,1790,1792,3,342,171,0,
- 1791,1790,1,0,0,0,1792,1795,1,0,0,0,1793,1791,1,0,0,0,1793,1794,1,0,0,
- 0,1794,1813,1,0,0,0,1795,1793,1,0,0,0,1796,1797,5,254,0,0,1797,1798,5,
- 255,0,0,1798,1799,3,2,1,0,1799,1800,5,27,0,0,1800,1804,3,146,73,0,1801,
- 1803,3,342,171,0,1802,1801,1,0,0,0,1803,1806,1,0,0,0,1804,1802,1,0,0,0,
- 1804,1805,1,0,0,0,1805,1813,1,0,0,0,1806,1804,1,0,0,0,1807,1808,5,119,
- 0,0,1808,1809,5,195,0,0,1809,1810,3,146,73,0,1810,1811,3,44,22,0,1811,
- 1813,1,0,0,0,1812,1696,1,0,0,0,1812,1701,1,0,0,0,1812,1706,1,0,0,0,1812,
- 1711,1,0,0,0,1812,1716,1,0,0,0,1812,1717,1,0,0,0,1812,1718,1,0,0,0,1812,
- 1719,1,0,0,0,1812,1720,1,0,0,0,1812,1721,1,0,0,0,1812,1723,1,0,0,0,1812,
- 1725,1,0,0,0,1812,1730,1,0,0,0,1812,1742,1,0,0,0,1812,1761,1,0,0,0,1812,
- 1762,1,0,0,0,1812,1763,1,0,0,0,1812,1774,1,0,0,0,1812,1783,1,0,0,0,1812,
- 1796,1,0,0,0,1812,1807,1,0,0,0,1813,221,1,0,0,0,1814,1815,5,120,0,0,1815,
- 1824,3,230,115,0,1816,1823,3,224,112,0,1817,1818,5,121,0,0,1818,1819,5,
- 29,0,0,1819,1820,3,250,125,0,1820,1821,5,30,0,0,1821,1823,1,0,0,0,1822,
- 1816,1,0,0,0,1822,1817,1,0,0,0,1823,1826,1,0,0,0,1824,1822,1,0,0,0,1824,
- 1825,1,0,0,0,1825,1827,1,0,0,0,1826,1824,1,0,0,0,1827,1828,3,160,80,0,
- 1828,1829,3,2,1,0,1829,1830,3,226,113,0,1830,1831,3,228,114,0,1831,223,
- 1,0,0,0,1832,1852,5,122,0,0,1833,1852,5,50,0,0,1834,1852,5,51,0,0,1835,
- 1852,5,62,0,0,1836,1852,5,123,0,0,1837,1852,5,68,0,0,1838,1852,5,67,0,
- 0,1839,1852,5,63,0,0,1840,1852,5,64,0,0,1841,1852,5,65,0,0,1842,1852,5,
- 124,0,0,1843,1852,5,125,0,0,1844,1852,5,126,0,0,1845,1852,5,127,0,0,1846,
- 1847,5,69,0,0,1847,1848,5,29,0,0,1848,1849,3,32,16,0,1849,1850,5,30,0,
- 0,1850,1852,1,0,0,0,1851,1832,1,0,0,0,1851,1833,1,0,0,0,1851,1834,1,0,
- 0,0,1851,1835,1,0,0,0,1851,1836,1,0,0,0,1851,1837,1,0,0,0,1851,1838,1,
- 0,0,0,1851,1839,1,0,0,0,1851,1840,1,0,0,0,1851,1841,1,0,0,0,1851,1842,
- 1,0,0,0,1851,1843,1,0,0,0,1851,1844,1,0,0,0,1851,1845,1,0,0,0,1851,1846,
- 1,0,0,0,1852,225,1,0,0,0,1853,1859,1,0,0,0,1854,1855,5,43,0,0,1855,1859,
- 3,0,0,0,1856,1857,5,43,0,0,1857,1859,3,32,16,0,1858,1853,1,0,0,0,1858,
- 1854,1,0,0,0,1858,1856,1,0,0,0,1859,227,1,0,0,0,1860,1864,1,0,0,0,1861,
- 1862,5,35,0,0,1862,1864,3,316,158,0,1863,1860,1,0,0,0,1863,1861,1,0,0,
- 0,1864,229,1,0,0,0,1865,1871,1,0,0,0,1866,1867,5,41,0,0,1867,1868,3,32,
- 16,0,1868,1869,5,42,0,0,1869,1871,1,0,0,0,1870,1865,1,0,0,0,1870,1866,
- 1,0,0,0,1871,231,1,0,0,0,1872,1876,5,128,0,0,1873,1875,3,234,117,0,1874,
- 1873,1,0,0,0,1875,1878,1,0,0,0,1876,1874,1,0,0,0,1876,1877,1,0,0,0,1877,
- 1879,1,0,0,0,1878,1876,1,0,0,0,1879,1880,3,146,73,0,1880,1881,3,2,1,0,
- 1881,1891,1,0,0,0,1882,1886,5,128,0,0,1883,1885,3,234,117,0,1884,1883,
- 1,0,0,0,1885,1888,1,0,0,0,1886,1884,1,0,0,0,1886,1887,1,0,0,0,1887,1889,
- 1,0,0,0,1888,1886,1,0,0,0,1889,1891,3,2,1,0,1890,1872,1,0,0,0,1890,1882,
- 1,0,0,0,1891,233,1,0,0,0,1892,1893,7,11,0,0,1893,235,1,0,0,0,1894,1896,
- 3,238,119,0,1895,1894,1,0,0,0,1896,1899,1,0,0,0,1897,1895,1,0,0,0,1897,
- 1898,1,0,0,0,1898,237,1,0,0,0,1899,1897,1,0,0,0,1900,1901,5,129,0,0,1901,
- 1913,3,190,95,0,1902,1903,5,130,0,0,1903,1913,3,190,95,0,1904,1905,5,131,
- 0,0,1905,1913,3,190,95,0,1906,1907,5,132,0,0,1907,1913,3,190,95,0,1908,
- 1913,3,88,44,0,1909,1913,3,342,171,0,1910,1913,3,26,13,0,1911,1913,3,40,
- 20,0,1912,1900,1,0,0,0,1912,1902,1,0,0,0,1912,1904,1,0,0,0,1912,1906,1,
- 0,0,0,1912,1908,1,0,0,0,1912,1909,1,0,0,0,1912,1910,1,0,0,0,1912,1911,
- 1,0,0,0,1913,239,1,0,0,0,1914,1918,5,133,0,0,1915,1917,3,242,121,0,1916,
- 1915,1,0,0,0,1917,1920,1,0,0,0,1918,1916,1,0,0,0,1918,1919,1,0,0,0,1919,
- 1921,1,0,0,0,1920,1918,1,0,0,0,1921,1922,3,192,96,0,1922,1923,3,160,80,
- 0,1923,1924,3,2,1,0,1924,1925,3,134,67,0,1925,1926,3,228,114,0,1926,241,
- 1,0,0,0,1927,1928,7,11,0,0,1928,243,1,0,0,0,1929,1931,3,246,123,0,1930,
- 1929,1,0,0,0,1931,1934,1,0,0,0,1932,1930,1,0,0,0,1932,1933,1,0,0,0,1933,
- 245,1,0,0,0,1934,1932,1,0,0,0,1935,1936,5,134,0,0,1936,1946,3,190,95,0,
- 1937,1938,5,135,0,0,1938,1946,3,190,95,0,1939,1940,5,132,0,0,1940,1946,
- 3,190,95,0,1941,1946,3,342,171,0,1942,1946,3,88,44,0,1943,1946,3,26,13,
- 0,1944,1946,3,40,20,0,1945,1935,1,0,0,0,1945,1937,1,0,0,0,1945,1939,1,
- 0,0,0,1945,1941,1,0,0,0,1945,1942,1,0,0,0,1945,1943,1,0,0,0,1945,1944,
- 1,0,0,0,1946,247,1,0,0,0,1947,1954,1,0,0,0,1948,1949,5,121,0,0,1949,1950,
- 5,29,0,0,1950,1951,3,250,125,0,1951,1952,5,30,0,0,1952,1954,1,0,0,0,1953,
- 1947,1,0,0,0,1953,1948,1,0,0,0,1954,249,1,0,0,0,1955,1965,3,148,74,0,1956,
- 1958,5,16,0,0,1957,1959,3,314,157,0,1958,1957,1,0,0,0,1959,1960,1,0,0,
- 0,1960,1958,1,0,0,0,1960,1961,1,0,0,0,1961,1962,1,0,0,0,1962,1963,5,17,
- 0,0,1963,1965,1,0,0,0,1964,1955,1,0,0,0,1964,1956,1,0,0,0,1965,251,1,0,
- 0,0,1966,1968,3,254,127,0,1967,1966,1,0,0,0,1968,1971,1,0,0,0,1969,1967,
- 1,0,0,0,1969,1970,1,0,0,0,1970,253,1,0,0,0,1971,1969,1,0,0,0,1972,1973,
- 5,41,0,0,1973,1974,5,136,0,0,1974,1986,5,42,0,0,1975,1976,5,41,0,0,1976,
- 1977,5,137,0,0,1977,1986,5,42,0,0,1978,1979,5,41,0,0,1979,1980,5,138,0,
- 0,1980,1986,5,42,0,0,1981,1982,5,41,0,0,1982,1983,3,32,16,0,1983,1984,
- 5,42,0,0,1984,1986,1,0,0,0,1985,1972,1,0,0,0,1985,1975,1,0,0,0,1985,1978,
- 1,0,0,0,1985,1981,1,0,0,0,1986,255,1,0,0,0,1987,1992,5,139,0,0,1988,1991,
- 3,258,129,0,1989,1991,3,260,130,0,1990,1988,1,0,0,0,1990,1989,1,0,0,0,
- 1991,1994,1,0,0,0,1992,1990,1,0,0,0,1992,1993,1,0,0,0,1993,1995,1,0,0,
- 0,1994,1992,1,0,0,0,1995,1996,3,192,96,0,1996,1997,3,252,126,0,1997,1998,
- 3,160,80,0,1998,1999,3,248,124,0,1999,2000,3,264,132,0,2000,2001,3,204,
- 102,0,2001,2005,3,134,67,0,2002,2004,3,266,133,0,2003,2002,1,0,0,0,2004,
- 2007,1,0,0,0,2005,2003,1,0,0,0,2005,2006,1,0,0,0,2006,257,1,0,0,0,2007,
- 2005,1,0,0,0,2008,2032,5,122,0,0,2009,2032,5,50,0,0,2010,2032,5,51,0,0,
- 2011,2032,5,62,0,0,2012,2032,5,140,0,0,2013,2032,5,67,0,0,2014,2032,5,
- 141,0,0,2015,2032,5,142,0,0,2016,2032,5,53,0,0,2017,2032,5,63,0,0,2018,
- 2032,5,64,0,0,2019,2032,5,65,0,0,2020,2032,5,124,0,0,2021,2032,5,143,0,
- 0,2022,2032,5,144,0,0,2023,2032,5,68,0,0,2024,2032,5,145,0,0,2025,2032,
- 5,146,0,0,2026,2027,5,69,0,0,2027,2028,5,29,0,0,2028,2029,3,32,16,0,2029,
- 2030,5,30,0,0,2030,2032,1,0,0,0,2031,2008,1,0,0,0,2031,2009,1,0,0,0,2031,
- 2010,1,0,0,0,2031,2011,1,0,0,0,2031,2012,1,0,0,0,2031,2013,1,0,0,0,2031,
- 2014,1,0,0,0,2031,2015,1,0,0,0,2031,2016,1,0,0,0,2031,2017,1,0,0,0,2031,
- 2018,1,0,0,0,2031,2019,1,0,0,0,2031,2020,1,0,0,0,2031,2021,1,0,0,0,2031,
- 2022,1,0,0,0,2031,2023,1,0,0,0,2031,2024,1,0,0,0,2031,2025,1,0,0,0,2031,
- 2026,1,0,0,0,2032,259,1,0,0,0,2033,2034,5,147,0,0,2034,2040,5,29,0,0,2035,
- 2038,3,6,3,0,2036,2037,5,33,0,0,2037,2039,3,6,3,0,2038,2036,1,0,0,0,2038,
- 2039,1,0,0,0,2039,2041,1,0,0,0,2040,2035,1,0,0,0,2040,2041,1,0,0,0,2041,
- 2045,1,0,0,0,2042,2044,3,262,131,0,2043,2042,1,0,0,0,2044,2047,1,0,0,0,
- 2045,2043,1,0,0,0,2045,2046,1,0,0,0,2046,2048,1,0,0,0,2047,2045,1,0,0,
- 0,2048,2052,5,30,0,0,2049,2050,5,147,0,0,2050,2052,5,84,0,0,2051,2033,
- 1,0,0,0,2051,2049,1,0,0,0,2052,261,1,0,0,0,2053,2081,5,148,0,0,2054,2081,
- 5,223,0,0,2055,2081,5,56,0,0,2056,2081,5,57,0,0,2057,2081,5,149,0,0,2058,
- 2081,5,150,0,0,2059,2081,5,247,0,0,2060,2081,5,248,0,0,2061,2081,5,249,
- 0,0,2062,2081,5,250,0,0,2063,2064,5,151,0,0,2064,2065,5,74,0,0,2065,2081,
- 5,152,0,0,2066,2067,5,151,0,0,2067,2068,5,74,0,0,2068,2081,5,153,0,0,2069,
- 2070,5,154,0,0,2070,2071,5,74,0,0,2071,2081,5,152,0,0,2072,2073,5,154,
- 0,0,2073,2074,5,74,0,0,2074,2081,5,153,0,0,2075,2076,5,69,0,0,2076,2077,
- 5,29,0,0,2077,2078,3,32,16,0,2078,2079,5,30,0,0,2079,2081,1,0,0,0,2080,
- 2053,1,0,0,0,2080,2054,1,0,0,0,2080,2055,1,0,0,0,2080,2056,1,0,0,0,2080,
- 2057,1,0,0,0,2080,2058,1,0,0,0,2080,2059,1,0,0,0,2080,2060,1,0,0,0,2080,
- 2061,1,0,0,0,2080,2062,1,0,0,0,2080,2063,1,0,0,0,2080,2066,1,0,0,0,2080,
- 2069,1,0,0,0,2080,2072,1,0,0,0,2080,2075,1,0,0,0,2081,263,1,0,0,0,2082,
- 2086,5,115,0,0,2083,2086,5,155,0,0,2084,2086,3,2,1,0,2085,2082,1,0,0,0,
- 2085,2083,1,0,0,0,2085,2084,1,0,0,0,2086,265,1,0,0,0,2087,2109,5,1,0,0,
- 2088,2109,5,2,0,0,2089,2109,5,156,0,0,2090,2109,5,3,0,0,2091,2109,5,4,
- 0,0,2092,2109,5,246,0,0,2093,2109,5,5,0,0,2094,2109,5,6,0,0,2095,2109,
- 5,7,0,0,2096,2109,5,8,0,0,2097,2109,5,9,0,0,2098,2109,5,10,0,0,2099,2109,
- 5,11,0,0,2100,2109,5,12,0,0,2101,2109,5,13,0,0,2102,2109,5,14,0,0,2103,
- 2104,5,69,0,0,2104,2105,5,29,0,0,2105,2106,3,32,16,0,2106,2107,5,30,0,
- 0,2107,2109,1,0,0,0,2108,2087,1,0,0,0,2108,2088,1,0,0,0,2108,2089,1,0,
- 0,0,2108,2090,1,0,0,0,2108,2091,1,0,0,0,2108,2092,1,0,0,0,2108,2093,1,
- 0,0,0,2108,2094,1,0,0,0,2108,2095,1,0,0,0,2108,2096,1,0,0,0,2108,2097,
- 1,0,0,0,2108,2098,1,0,0,0,2108,2099,1,0,0,0,2108,2100,1,0,0,0,2108,2101,
- 1,0,0,0,2108,2102,1,0,0,0,2108,2103,1,0,0,0,2109,267,1,0,0,0,2110,2112,
- 3,270,135,0,2111,2110,1,0,0,0,2112,2115,1,0,0,0,2113,2111,1,0,0,0,2113,
- 2114,1,0,0,0,2114,269,1,0,0,0,2115,2113,1,0,0,0,2116,2225,3,126,63,0,2117,
- 2118,5,295,0,0,2118,2225,3,32,16,0,2119,2225,3,278,139,0,2120,2121,5,296,
- 0,0,2121,2225,3,32,16,0,2122,2123,5,299,0,0,2123,2225,3,134,67,0,2124,
- 2125,5,299,0,0,2125,2126,5,157,0,0,2126,2225,3,134,67,0,2127,2225,5,297,
- 0,0,2128,2225,5,298,0,0,2129,2225,3,296,148,0,2130,2225,3,272,136,0,2131,
- 2225,3,174,87,0,2132,2225,3,88,44,0,2133,2225,3,26,13,0,2134,2225,3,274,
- 137,0,2135,2225,3,40,20,0,2136,2137,5,300,0,0,2137,2138,5,41,0,0,2138,
- 2139,3,32,16,0,2139,2140,5,42,0,0,2140,2225,1,0,0,0,2141,2142,5,300,0,
- 0,2142,2143,5,41,0,0,2143,2144,3,32,16,0,2144,2145,5,42,0,0,2145,2146,
- 5,33,0,0,2146,2147,3,0,0,0,2147,2225,1,0,0,0,2148,2149,5,302,0,0,2149,
- 2150,3,32,16,0,2150,2151,5,74,0,0,2151,2152,3,32,16,0,2152,2225,1,0,0,
- 0,2153,2154,5,301,0,0,2154,2155,3,146,73,0,2155,2156,5,175,0,0,2156,2157,
- 3,264,132,0,2157,2225,1,0,0,0,2158,2159,5,301,0,0,2159,2160,5,225,0,0,
- 2160,2161,3,192,96,0,2161,2162,3,160,80,0,2162,2163,3,146,73,0,2163,2164,
- 5,175,0,0,2164,2165,3,264,132,0,2165,2166,3,216,108,0,2166,2167,3,134,
- 67,0,2167,2225,1,0,0,0,2168,2225,3,276,138,0,2169,2170,5,254,0,0,2170,
- 2171,5,195,0,0,2171,2172,5,41,0,0,2172,2173,3,32,16,0,2173,2177,5,42,0,
- 0,2174,2176,3,342,171,0,2175,2174,1,0,0,0,2176,2179,1,0,0,0,2177,2175,
- 1,0,0,0,2177,2178,1,0,0,0,2178,2225,1,0,0,0,2179,2177,1,0,0,0,2180,2181,
- 5,254,0,0,2181,2182,5,195,0,0,2182,2186,3,2,1,0,2183,2185,3,342,171,0,
- 2184,2183,1,0,0,0,2185,2188,1,0,0,0,2186,2184,1,0,0,0,2186,2187,1,0,0,
- 0,2187,2225,1,0,0,0,2188,2186,1,0,0,0,2189,2190,5,254,0,0,2190,2191,5,
- 255,0,0,2191,2192,5,41,0,0,2192,2193,3,32,16,0,2193,2194,5,42,0,0,2194,
- 2195,5,27,0,0,2195,2199,3,146,73,0,2196,2198,3,342,171,0,2197,2196,1,0,
- 0,0,2198,2201,1,0,0,0,2199,2197,1,0,0,0,2199,2200,1,0,0,0,2200,2225,1,
- 0,0,0,2201,2199,1,0,0,0,2202,2203,5,254,0,0,2203,2204,5,255,0,0,2204,2205,
- 3,2,1,0,2205,2206,5,27,0,0,2206,2210,3,146,73,0,2207,2209,3,342,171,0,
- 2208,2207,1,0,0,0,2209,2212,1,0,0,0,2210,2208,1,0,0,0,2210,2211,1,0,0,
- 0,2211,2225,1,0,0,0,2212,2210,1,0,0,0,2213,2214,5,254,0,0,2214,2215,5,
- 41,0,0,2215,2216,3,32,16,0,2216,2217,5,42,0,0,2217,2221,3,228,114,0,2218,
- 2220,3,342,171,0,2219,2218,1,0,0,0,2220,2223,1,0,0,0,2221,2219,1,0,0,0,
- 2221,2222,1,0,0,0,2222,2225,1,0,0,0,2223,2221,1,0,0,0,2224,2116,1,0,0,
- 0,2224,2117,1,0,0,0,2224,2119,1,0,0,0,2224,2120,1,0,0,0,2224,2122,1,0,
- 0,0,2224,2124,1,0,0,0,2224,2127,1,0,0,0,2224,2128,1,0,0,0,2224,2129,1,
- 0,0,0,2224,2130,1,0,0,0,2224,2131,1,0,0,0,2224,2132,1,0,0,0,2224,2133,
- 1,0,0,0,2224,2134,1,0,0,0,2224,2135,1,0,0,0,2224,2136,1,0,0,0,2224,2141,
- 1,0,0,0,2224,2148,1,0,0,0,2224,2153,1,0,0,0,2224,2158,1,0,0,0,2224,2168,
- 1,0,0,0,2224,2169,1,0,0,0,2224,2180,1,0,0,0,2224,2189,1,0,0,0,2224,2202,
- 1,0,0,0,2224,2213,1,0,0,0,2225,271,1,0,0,0,2226,2227,3,0,0,0,2227,2228,
- 5,74,0,0,2228,273,1,0,0,0,2229,2232,3,44,22,0,2230,2232,3,46,23,0,2231,
- 2229,1,0,0,0,2231,2230,1,0,0,0,2232,275,1,0,0,0,2233,2234,5,16,0,0,2234,
- 2235,3,268,134,0,2235,2236,5,17,0,0,2236,277,1,0,0,0,2237,2238,3,282,141,
- 0,2238,2239,3,280,140,0,2239,279,1,0,0,0,2240,2242,3,284,142,0,2241,2240,
- 1,0,0,0,2242,2243,1,0,0,0,2243,2241,1,0,0,0,2243,2244,1,0,0,0,2244,281,
- 1,0,0,0,2245,2246,5,158,0,0,2246,2258,3,276,138,0,2247,2248,5,158,0,0,
- 2248,2249,3,0,0,0,2249,2250,5,159,0,0,2250,2251,3,0,0,0,2251,2258,1,0,
- 0,0,2252,2253,5,158,0,0,2253,2254,3,32,16,0,2254,2255,5,159,0,0,2255,2256,
- 3,32,16,0,2256,2258,1,0,0,0,2257,2245,1,0,0,0,2257,2247,1,0,0,0,2257,2252,
- 1,0,0,0,2258,283,1,0,0,0,2259,2260,3,288,144,0,2260,2261,3,294,147,0,2261,
- 2272,1,0,0,0,2262,2263,3,286,143,0,2263,2264,3,294,147,0,2264,2272,1,0,
- 0,0,2265,2266,3,290,145,0,2266,2267,3,294,147,0,2267,2272,1,0,0,0,2268,
- 2269,3,292,146,0,2269,2270,3,294,147,0,2270,2272,1,0,0,0,2271,2259,1,0,
- 0,0,2271,2262,1,0,0,0,2271,2265,1,0,0,0,2271,2268,1,0,0,0,2272,285,1,0,
- 0,0,2273,2274,5,160,0,0,2274,2280,3,276,138,0,2275,2276,5,160,0,0,2276,
- 2280,3,0,0,0,2277,2278,5,160,0,0,2278,2280,3,32,16,0,2279,2273,1,0,0,0,
- 2279,2275,1,0,0,0,2279,2277,1,0,0,0,2280,287,1,0,0,0,2281,2282,5,161,0,
- 0,2282,2283,3,146,73,0,2283,289,1,0,0,0,2284,2285,5,162,0,0,2285,291,1,
- 0,0,0,2286,2287,5,163,0,0,2287,293,1,0,0,0,2288,2300,3,276,138,0,2289,
- 2290,5,164,0,0,2290,2291,3,0,0,0,2291,2292,5,159,0,0,2292,2293,3,0,0,0,
- 2293,2300,1,0,0,0,2294,2295,5,164,0,0,2295,2296,3,32,16,0,2296,2297,5,
- 159,0,0,2297,2298,3,32,16,0,2298,2300,1,0,0,0,2299,2288,1,0,0,0,2299,2289,
- 1,0,0,0,2299,2294,1,0,0,0,2300,295,1,0,0,0,2301,2302,3,298,149,0,2302,
- 2303,3,302,151,0,2303,297,1,0,0,0,2304,2305,5,165,0,0,2305,2306,3,300,
- 150,0,2306,2307,3,0,0,0,2307,2308,5,35,0,0,2308,2312,1,0,0,0,2309,2310,
- 5,165,0,0,2310,2312,3,300,150,0,2311,2304,1,0,0,0,2311,2309,1,0,0,0,2312,
- 299,1,0,0,0,2313,2317,1,0,0,0,2314,2317,5,166,0,0,2315,2317,5,2,0,0,2316,
- 2313,1,0,0,0,2316,2314,1,0,0,0,2316,2315,1,0,0,0,2317,301,1,0,0,0,2318,
- 2319,5,16,0,0,2319,2320,3,304,152,0,2320,2321,5,17,0,0,2321,2328,1,0,0,
- 0,2322,2324,3,308,154,0,2323,2322,1,0,0,0,2324,2325,1,0,0,0,2325,2323,
- 1,0,0,0,2325,2326,1,0,0,0,2326,2328,1,0,0,0,2327,2318,1,0,0,0,2327,2323,
- 1,0,0,0,2328,303,1,0,0,0,2329,2330,3,308,154,0,2330,2331,5,27,0,0,2331,
- 2333,1,0,0,0,2332,2329,1,0,0,0,2333,2336,1,0,0,0,2334,2332,1,0,0,0,2334,
- 2335,1,0,0,0,2335,2337,1,0,0,0,2336,2334,1,0,0,0,2337,2338,3,308,154,0,
- 2338,305,1,0,0,0,2339,2345,1,0,0,0,2340,2341,5,41,0,0,2341,2342,3,32,16,
- 0,2342,2343,5,42,0,0,2343,2345,1,0,0,0,2344,2339,1,0,0,0,2344,2340,1,0,
- 0,0,2345,307,1,0,0,0,2346,2347,5,180,0,0,2347,2348,5,261,0,0,2348,2349,
- 5,29,0,0,2349,2350,3,6,3,0,2350,2351,5,30,0,0,2351,2413,1,0,0,0,2352,2353,
- 5,259,0,0,2353,2354,5,29,0,0,2354,2355,3,0,0,0,2355,2356,5,30,0,0,2356,
- 2413,1,0,0,0,2357,2358,5,259,0,0,2358,2413,3,0,0,0,2359,2360,5,83,0,0,
- 2360,2361,5,29,0,0,2361,2362,3,312,156,0,2362,2363,5,30,0,0,2363,2413,
- 1,0,0,0,2364,2365,5,187,0,0,2365,2366,5,29,0,0,2366,2367,3,36,18,0,2367,
- 2368,5,30,0,0,2368,2369,3,306,153,0,2369,2413,1,0,0,0,2370,2371,5,188,
- 0,0,2371,2372,5,29,0,0,2372,2373,3,36,18,0,2373,2374,5,30,0,0,2374,2375,
- 3,306,153,0,2375,2413,1,0,0,0,2376,2377,5,186,0,0,2377,2378,5,29,0,0,2378,
- 2379,3,34,17,0,2379,2380,5,30,0,0,2380,2381,3,306,153,0,2381,2413,1,0,
- 0,0,2382,2383,5,185,0,0,2383,2384,5,29,0,0,2384,2385,3,32,16,0,2385,2386,
- 5,30,0,0,2386,2387,3,306,153,0,2387,2413,1,0,0,0,2388,2389,5,184,0,0,2389,
- 2390,5,29,0,0,2390,2391,3,32,16,0,2391,2392,5,30,0,0,2392,2393,3,306,153,
- 0,2393,2413,1,0,0,0,2394,2395,5,183,0,0,2395,2396,5,29,0,0,2396,2397,3,
- 32,16,0,2397,2398,5,30,0,0,2398,2399,3,306,153,0,2399,2413,1,0,0,0,2400,
- 2401,5,187,0,0,2401,2413,3,306,153,0,2402,2403,5,188,0,0,2403,2413,3,306,
- 153,0,2404,2405,5,186,0,0,2405,2413,3,306,153,0,2406,2407,5,185,0,0,2407,
- 2413,3,306,153,0,2408,2409,5,184,0,0,2409,2413,3,306,153,0,2410,2411,5,
- 183,0,0,2411,2413,3,306,153,0,2412,2346,1,0,0,0,2412,2352,1,0,0,0,2412,
- 2357,1,0,0,0,2412,2359,1,0,0,0,2412,2364,1,0,0,0,2412,2370,1,0,0,0,2412,
- 2376,1,0,0,0,2412,2382,1,0,0,0,2412,2388,1,0,0,0,2412,2394,1,0,0,0,2412,
- 2400,1,0,0,0,2412,2402,1,0,0,0,2412,2404,1,0,0,0,2412,2406,1,0,0,0,2412,
- 2408,1,0,0,0,2412,2410,1,0,0,0,2413,309,1,0,0,0,2414,2415,5,187,0,0,2415,
- 2416,5,29,0,0,2416,2417,3,36,18,0,2417,2418,5,30,0,0,2418,2490,1,0,0,0,
- 2419,2420,5,188,0,0,2420,2421,5,29,0,0,2421,2422,3,36,18,0,2422,2423,5,
- 30,0,0,2423,2490,1,0,0,0,2424,2425,5,187,0,0,2425,2426,5,29,0,0,2426,2427,
- 3,32,16,0,2427,2428,5,30,0,0,2428,2490,1,0,0,0,2429,2430,5,188,0,0,2430,
- 2431,5,29,0,0,2431,2432,3,34,17,0,2432,2433,5,30,0,0,2433,2490,1,0,0,0,
- 2434,2435,5,186,0,0,2435,2436,5,29,0,0,2436,2437,3,34,17,0,2437,2438,5,
- 30,0,0,2438,2490,1,0,0,0,2439,2440,5,185,0,0,2440,2441,5,29,0,0,2441,2442,
- 3,32,16,0,2442,2443,5,30,0,0,2443,2490,1,0,0,0,2444,2445,5,184,0,0,2445,
- 2446,5,29,0,0,2446,2447,3,32,16,0,2447,2448,5,30,0,0,2448,2490,1,0,0,0,
- 2449,2450,5,183,0,0,2450,2451,5,29,0,0,2451,2452,3,32,16,0,2452,2453,5,
- 30,0,0,2453,2490,1,0,0,0,2454,2455,5,192,0,0,2455,2456,5,29,0,0,2456,2457,
- 3,34,17,0,2457,2458,5,30,0,0,2458,2490,1,0,0,0,2459,2460,5,191,0,0,2460,
- 2461,5,29,0,0,2461,2462,3,32,16,0,2462,2463,5,30,0,0,2463,2490,1,0,0,0,
- 2464,2465,5,190,0,0,2465,2466,5,29,0,0,2466,2467,3,32,16,0,2467,2468,5,
- 30,0,0,2468,2490,1,0,0,0,2469,2470,5,189,0,0,2470,2471,5,29,0,0,2471,2472,
- 3,32,16,0,2472,2473,5,30,0,0,2473,2490,1,0,0,0,2474,2475,5,180,0,0,2475,
- 2476,5,29,0,0,2476,2477,3,32,16,0,2477,2478,5,30,0,0,2478,2490,1,0,0,0,
- 2479,2480,5,182,0,0,2480,2481,5,29,0,0,2481,2482,3,184,92,0,2482,2483,
- 5,30,0,0,2483,2490,1,0,0,0,2484,2485,5,83,0,0,2485,2486,5,29,0,0,2486,
- 2487,3,312,156,0,2487,2488,5,30,0,0,2488,2490,1,0,0,0,2489,2414,1,0,0,
- 0,2489,2419,1,0,0,0,2489,2424,1,0,0,0,2489,2429,1,0,0,0,2489,2434,1,0,
- 0,0,2489,2439,1,0,0,0,2489,2444,1,0,0,0,2489,2449,1,0,0,0,2489,2454,1,
- 0,0,0,2489,2459,1,0,0,0,2489,2464,1,0,0,0,2489,2469,1,0,0,0,2489,2474,
- 1,0,0,0,2489,2479,1,0,0,0,2489,2484,1,0,0,0,2490,311,1,0,0,0,2491,2493,
- 3,314,157,0,2492,2491,1,0,0,0,2493,2496,1,0,0,0,2494,2492,1,0,0,0,2494,
- 2495,1,0,0,0,2495,313,1,0,0,0,2496,2494,1,0,0,0,2497,2498,7,12,0,0,2498,
- 315,1,0,0,0,2499,2503,3,310,155,0,2500,2503,3,6,3,0,2501,2503,5,178,0,
- 0,2502,2499,1,0,0,0,2502,2500,1,0,0,0,2502,2501,1,0,0,0,2503,317,1,0,0,
- 0,2504,2653,3,310,155,0,2505,2506,5,181,0,0,2506,2507,5,29,0,0,2507,2508,
- 5,178,0,0,2508,2653,5,30,0,0,2509,2510,5,181,0,0,2510,2511,5,29,0,0,2511,
- 2512,5,263,0,0,2512,2653,5,30,0,0,2513,2514,5,195,0,0,2514,2515,5,29,0,
- 0,2515,2516,5,38,0,0,2516,2517,5,263,0,0,2517,2653,5,30,0,0,2518,2519,
- 5,195,0,0,2519,2520,5,29,0,0,2520,2521,3,138,69,0,2521,2522,5,30,0,0,2522,
- 2653,1,0,0,0,2523,2524,5,195,0,0,2524,2525,5,29,0,0,2525,2526,5,178,0,
- 0,2526,2653,5,30,0,0,2527,2528,5,196,0,0,2528,2529,5,29,0,0,2529,2530,
- 3,318,159,0,2530,2531,5,30,0,0,2531,2653,1,0,0,0,2532,2533,5,187,0,0,2533,
- 2534,5,41,0,0,2534,2535,3,32,16,0,2535,2536,5,42,0,0,2536,2537,5,29,0,
- 0,2537,2538,3,320,160,0,2538,2539,5,30,0,0,2539,2653,1,0,0,0,2540,2541,
- 5,188,0,0,2541,2542,5,41,0,0,2542,2543,3,32,16,0,2543,2544,5,42,0,0,2544,
- 2545,5,29,0,0,2545,2546,3,322,161,0,2546,2547,5,30,0,0,2547,2653,1,0,0,
- 0,2548,2549,5,186,0,0,2549,2550,5,41,0,0,2550,2551,3,32,16,0,2551,2552,
- 5,42,0,0,2552,2553,5,29,0,0,2553,2554,3,324,162,0,2554,2555,5,30,0,0,2555,
- 2653,1,0,0,0,2556,2557,5,185,0,0,2557,2558,5,41,0,0,2558,2559,3,32,16,
- 0,2559,2560,5,42,0,0,2560,2561,5,29,0,0,2561,2562,3,326,163,0,2562,2563,
- 5,30,0,0,2563,2653,1,0,0,0,2564,2565,5,184,0,0,2565,2566,5,41,0,0,2566,
- 2567,3,32,16,0,2567,2568,5,42,0,0,2568,2569,5,29,0,0,2569,2570,3,328,164,
- 0,2570,2571,5,30,0,0,2571,2653,1,0,0,0,2572,2573,5,183,0,0,2573,2574,5,
- 41,0,0,2574,2575,3,32,16,0,2575,2576,5,42,0,0,2576,2577,5,29,0,0,2577,
- 2578,3,330,165,0,2578,2579,5,30,0,0,2579,2653,1,0,0,0,2580,2581,5,192,
- 0,0,2581,2582,5,41,0,0,2582,2583,3,32,16,0,2583,2584,5,42,0,0,2584,2585,
- 5,29,0,0,2585,2586,3,324,162,0,2586,2587,5,30,0,0,2587,2653,1,0,0,0,2588,
- 2589,5,191,0,0,2589,2590,5,41,0,0,2590,2591,3,32,16,0,2591,2592,5,42,0,
- 0,2592,2593,5,29,0,0,2593,2594,3,326,163,0,2594,2595,5,30,0,0,2595,2653,
- 1,0,0,0,2596,2597,5,190,0,0,2597,2598,5,41,0,0,2598,2599,3,32,16,0,2599,
- 2600,5,42,0,0,2600,2601,5,29,0,0,2601,2602,3,328,164,0,2602,2603,5,30,
- 0,0,2603,2653,1,0,0,0,2604,2605,5,189,0,0,2605,2606,5,41,0,0,2606,2607,
- 3,32,16,0,2607,2608,5,42,0,0,2608,2609,5,29,0,0,2609,2610,3,330,165,0,
- 2610,2611,5,30,0,0,2611,2653,1,0,0,0,2612,2613,5,180,0,0,2613,2614,5,41,
- 0,0,2614,2615,3,32,16,0,2615,2616,5,42,0,0,2616,2617,5,29,0,0,2617,2618,
- 3,328,164,0,2618,2619,5,30,0,0,2619,2653,1,0,0,0,2620,2621,5,182,0,0,2621,
- 2622,5,41,0,0,2622,2623,3,32,16,0,2623,2624,5,42,0,0,2624,2625,5,29,0,
- 0,2625,2626,3,332,166,0,2626,2627,5,30,0,0,2627,2653,1,0,0,0,2628,2629,
- 5,181,0,0,2629,2630,5,41,0,0,2630,2631,3,32,16,0,2631,2632,5,42,0,0,2632,
- 2633,5,29,0,0,2633,2634,3,334,167,0,2634,2635,5,30,0,0,2635,2653,1,0,0,
- 0,2636,2637,5,195,0,0,2637,2638,5,41,0,0,2638,2639,3,32,16,0,2639,2640,
- 5,42,0,0,2640,2641,5,29,0,0,2641,2642,3,336,168,0,2642,2643,5,30,0,0,2643,
- 2653,1,0,0,0,2644,2645,5,196,0,0,2645,2646,5,41,0,0,2646,2647,3,32,16,
- 0,2647,2648,5,42,0,0,2648,2649,5,29,0,0,2649,2650,3,340,170,0,2650,2651,
- 5,30,0,0,2651,2653,1,0,0,0,2652,2504,1,0,0,0,2652,2505,1,0,0,0,2652,2509,
- 1,0,0,0,2652,2513,1,0,0,0,2652,2518,1,0,0,0,2652,2523,1,0,0,0,2652,2527,
- 1,0,0,0,2652,2532,1,0,0,0,2652,2540,1,0,0,0,2652,2548,1,0,0,0,2652,2556,
- 1,0,0,0,2652,2564,1,0,0,0,2652,2572,1,0,0,0,2652,2580,1,0,0,0,2652,2588,
- 1,0,0,0,2652,2596,1,0,0,0,2652,2604,1,0,0,0,2652,2612,1,0,0,0,2652,2620,
- 1,0,0,0,2652,2628,1,0,0,0,2652,2636,1,0,0,0,2652,2644,1,0,0,0,2653,319,
- 1,0,0,0,2654,2657,3,36,18,0,2655,2657,3,32,16,0,2656,2654,1,0,0,0,2656,
- 2655,1,0,0,0,2657,2660,1,0,0,0,2658,2656,1,0,0,0,2658,2659,1,0,0,0,2659,
- 321,1,0,0,0,2660,2658,1,0,0,0,2661,2664,3,36,18,0,2662,2664,3,34,17,0,
- 2663,2661,1,0,0,0,2663,2662,1,0,0,0,2664,2667,1,0,0,0,2665,2663,1,0,0,
- 0,2665,2666,1,0,0,0,2666,323,1,0,0,0,2667,2665,1,0,0,0,2668,2670,3,34,
- 17,0,2669,2668,1,0,0,0,2670,2673,1,0,0,0,2671,2669,1,0,0,0,2671,2672,1,
- 0,0,0,2672,325,1,0,0,0,2673,2671,1,0,0,0,2674,2676,3,32,16,0,2675,2674,
- 1,0,0,0,2676,2679,1,0,0,0,2677,2675,1,0,0,0,2677,2678,1,0,0,0,2678,327,
- 1,0,0,0,2679,2677,1,0,0,0,2680,2682,3,32,16,0,2681,2680,1,0,0,0,2682,2685,
- 1,0,0,0,2683,2681,1,0,0,0,2683,2684,1,0,0,0,2684,329,1,0,0,0,2685,2683,
- 1,0,0,0,2686,2688,3,32,16,0,2687,2686,1,0,0,0,2688,2691,1,0,0,0,2689,2687,
- 1,0,0,0,2689,2690,1,0,0,0,2690,331,1,0,0,0,2691,2689,1,0,0,0,2692,2694,
- 3,184,92,0,2693,2692,1,0,0,0,2694,2697,1,0,0,0,2695,2693,1,0,0,0,2695,
- 2696,1,0,0,0,2696,333,1,0,0,0,2697,2695,1,0,0,0,2698,2700,7,13,0,0,2699,
- 2698,1,0,0,0,2700,2703,1,0,0,0,2701,2699,1,0,0,0,2701,2702,1,0,0,0,2702,
- 335,1,0,0,0,2703,2701,1,0,0,0,2704,2706,3,338,169,0,2705,2704,1,0,0,0,
- 2706,2709,1,0,0,0,2707,2705,1,0,0,0,2707,2708,1,0,0,0,2708,337,1,0,0,0,
- 2709,2707,1,0,0,0,2710,2715,5,178,0,0,2711,2712,5,38,0,0,2712,2715,5,263,
- 0,0,2713,2715,3,138,69,0,2714,2710,1,0,0,0,2714,2711,1,0,0,0,2714,2713,
- 1,0,0,0,2715,339,1,0,0,0,2716,2718,3,318,159,0,2717,2716,1,0,0,0,2718,
- 2721,1,0,0,0,2719,2717,1,0,0,0,2719,2720,1,0,0,0,2720,341,1,0,0,0,2721,
- 2719,1,0,0,0,2722,2726,3,44,22,0,2723,2726,3,46,23,0,2724,2726,3,2,1,0,
- 2725,2722,1,0,0,0,2725,2723,1,0,0,0,2725,2724,1,0,0,0,2726,343,1,0,0,0,
- 2727,2728,5,167,0,0,2728,2729,5,35,0,0,2729,2730,5,29,0,0,2730,2731,3,
- 312,156,0,2731,2732,5,30,0,0,2732,2753,1,0,0,0,2733,2734,5,168,0,0,2734,
- 2735,3,38,19,0,2735,2736,5,74,0,0,2736,2737,3,38,19,0,2737,2738,5,74,0,
- 0,2738,2739,3,38,19,0,2739,2740,5,74,0,0,2740,2741,3,38,19,0,2741,2753,
- 1,0,0,0,2742,2743,5,169,0,0,2743,2753,3,6,3,0,2744,2745,5,169,0,0,2745,
- 2746,5,35,0,0,2746,2747,5,29,0,0,2747,2748,3,312,156,0,2748,2749,5,30,
- 0,0,2749,2753,1,0,0,0,2750,2753,3,342,171,0,2751,2753,3,40,20,0,2752,2727,
- 1,0,0,0,2752,2733,1,0,0,0,2752,2742,1,0,0,0,2752,2744,1,0,0,0,2752,2750,
- 1,0,0,0,2752,2751,1,0,0,0,2753,345,1,0,0,0,2754,2755,5,24,0,0,2755,2756,
- 5,39,0,0,2756,2757,3,98,49,0,2757,2758,3,2,1,0,2758,2767,1,0,0,0,2759,
- 2760,5,24,0,0,2760,2761,5,39,0,0,2761,2762,3,98,49,0,2762,2763,3,2,1,0,
- 2763,2764,5,33,0,0,2764,2765,3,2,1,0,2765,2767,1,0,0,0,2766,2754,1,0,0,
- 0,2766,2759,1,0,0,0,2767,347,1,0,0,0,2768,2770,3,350,175,0,2769,2768,1,
- 0,0,0,2770,2773,1,0,0,0,2771,2769,1,0,0,0,2771,2772,1,0,0,0,2772,349,1,
- 0,0,0,2773,2771,1,0,0,0,2774,2775,5,179,0,0,2775,2776,5,35,0,0,2776,2777,
- 5,29,0,0,2777,2778,3,312,156,0,2778,2779,5,30,0,0,2779,2789,1,0,0,0,2780,
- 2789,3,344,172,0,2781,2782,5,170,0,0,2782,2783,5,35,0,0,2783,2784,5,29,
- 0,0,2784,2785,3,312,156,0,2785,2786,5,30,0,0,2786,2789,1,0,0,0,2787,2789,
- 5,54,0,0,2788,2774,1,0,0,0,2788,2780,1,0,0,0,2788,2781,1,0,0,0,2788,2787,
- 1,0,0,0,2789,351,1,0,0,0,2790,2791,5,49,0,0,2791,2795,5,39,0,0,2792,2794,
- 3,356,178,0,2793,2792,1,0,0,0,2794,2797,1,0,0,0,2795,2793,1,0,0,0,2795,
- 2796,1,0,0,0,2796,2798,1,0,0,0,2797,2795,1,0,0,0,2798,2799,3,2,1,0,2799,
- 353,1,0,0,0,2800,2804,5,300,0,0,2801,2803,3,356,178,0,2802,2801,1,0,0,
- 0,2803,2806,1,0,0,0,2804,2802,1,0,0,0,2804,2805,1,0,0,0,2805,2807,1,0,
- 0,0,2806,2804,1,0,0,0,2807,2808,3,2,1,0,2808,355,1,0,0,0,2809,2825,5,51,
- 0,0,2810,2825,5,50,0,0,2811,2825,5,171,0,0,2812,2813,5,61,0,0,2813,2825,
- 5,50,0,0,2814,2815,5,61,0,0,2815,2825,5,51,0,0,2816,2817,5,61,0,0,2817,
- 2825,5,62,0,0,2818,2819,5,61,0,0,2819,2825,5,63,0,0,2820,2821,5,61,0,0,
- 2821,2825,5,64,0,0,2822,2823,5,61,0,0,2823,2825,5,65,0,0,2824,2809,1,0,
- 0,0,2824,2810,1,0,0,0,2824,2811,1,0,0,0,2824,2812,1,0,0,0,2824,2814,1,
- 0,0,0,2824,2816,1,0,0,0,2824,2818,1,0,0,0,2824,2820,1,0,0,0,2824,2822,
- 1,0,0,0,2825,357,1,0,0,0,2826,2828,3,360,180,0,2827,2826,1,0,0,0,2828,
- 2831,1,0,0,0,2829,2827,1,0,0,0,2829,2830,1,0,0,0,2830,359,1,0,0,0,2831,
- 2829,1,0,0,0,2832,2833,5,20,0,0,2833,2846,3,2,1,0,2834,2835,5,49,0,0,2835,
- 2836,5,39,0,0,2836,2846,3,140,70,0,2837,2838,5,24,0,0,2838,2839,5,39,0,
- 0,2839,2846,3,2,1,0,2840,2846,3,196,98,0,2841,2842,5,49,0,0,2842,2846,
- 3,32,16,0,2843,2846,3,342,171,0,2844,2846,3,40,20,0,2845,2832,1,0,0,0,
- 2845,2834,1,0,0,0,2845,2837,1,0,0,0,2845,2840,1,0,0,0,2845,2841,1,0,0,
- 0,2845,2843,1,0,0,0,2845,2844,1,0,0,0,2846,361,1,0,0,0,2847,2851,5,273,
- 0,0,2848,2850,3,364,182,0,2849,2848,1,0,0,0,2850,2853,1,0,0,0,2851,2849,
- 1,0,0,0,2851,2852,1,0,0,0,2852,2854,1,0,0,0,2853,2851,1,0,0,0,2854,2867,
- 3,2,1,0,2855,2859,5,273,0,0,2856,2858,3,364,182,0,2857,2856,1,0,0,0,2858,
- 2861,1,0,0,0,2859,2857,1,0,0,0,2859,2860,1,0,0,0,2860,2862,1,0,0,0,2861,
- 2859,1,0,0,0,2862,2863,3,2,1,0,2863,2864,5,33,0,0,2864,2865,3,2,1,0,2865,
- 2867,1,0,0,0,2866,2847,1,0,0,0,2866,2855,1,0,0,0,2867,363,1,0,0,0,2868,
- 2869,7,14,0,0,2869,365,1,0,0,0,2870,2872,3,368,184,0,2871,2870,1,0,0,0,
- 2872,2875,1,0,0,0,2873,2871,1,0,0,0,2873,2874,1,0,0,0,2874,367,1,0,0,0,
- 2875,2873,1,0,0,0,2876,2877,5,20,0,0,2877,2878,3,2,1,0,2878,2879,5,43,
- 0,0,2879,2880,3,32,16,0,2880,2887,1,0,0,0,2881,2882,5,24,0,0,2882,2883,
- 5,39,0,0,2883,2887,3,2,1,0,2884,2887,3,342,171,0,2885,2887,3,40,20,0,2886,
- 2876,1,0,0,0,2886,2881,1,0,0,0,2886,2884,1,0,0,0,2886,2885,1,0,0,0,2887,
- 369,1,0,0,0,172,378,382,390,398,451,492,501,525,529,547,574,597,633,639,
- 646,648,658,660,667,678,686,707,709,725,770,775,780,785,793,903,909,925,
- 931,937,944,1052,1057,1063,1068,1070,1078,1090,1102,1109,1116,1118,1145,
- 1152,1160,1168,1181,1188,1191,1210,1296,1305,1312,1315,1323,1344,1376,
- 1399,1411,1420,1445,1462,1470,1474,1489,1496,1541,1551,1567,1579,1591,
- 1605,1617,1628,1635,1645,1658,1663,1668,1677,1688,1771,1780,1793,1804,
- 1812,1822,1824,1851,1858,1863,1870,1876,1886,1890,1897,1912,1918,1932,
- 1945,1953,1960,1964,1969,1985,1990,1992,2005,2031,2038,2040,2045,2051,
- 2080,2085,2108,2113,2177,2186,2199,2210,2221,2224,2231,2243,2257,2271,
- 2279,2299,2311,2316,2325,2327,2334,2344,2412,2489,2494,2502,2652,2656,
- 2658,2663,2665,2671,2677,2683,2689,2695,2701,2707,2714,2719,2725,2752,
- 2766,2771,2788,2795,2804,2824,2829,2845,2851,2859,2866,2873,2886
+ 1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,1,172,3,172,2740,8,172,
+ 1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,1,173,
+ 3,173,2754,8,173,1,174,5,174,2757,8,174,10,174,12,174,2760,9,174,1,175,
+ 1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,1,175,
+ 1,175,3,175,2776,8,175,1,176,1,176,1,176,5,176,2781,8,176,10,176,12,176,
+ 2784,9,176,1,176,1,176,1,177,1,177,5,177,2790,8,177,10,177,12,177,2793,
+ 9,177,1,177,1,177,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,1,178,
+ 1,178,1,178,1,178,1,178,1,178,1,178,3,178,2812,8,178,1,179,5,179,2815,
+ 8,179,10,179,12,179,2818,9,179,1,180,1,180,1,180,1,180,1,180,1,180,1,180,
+ 1,180,1,180,1,180,1,180,1,180,1,180,3,180,2833,8,180,1,181,1,181,5,181,
+ 2837,8,181,10,181,12,181,2840,9,181,1,181,1,181,1,181,5,181,2845,8,181,
+ 10,181,12,181,2848,9,181,1,181,1,181,1,181,1,181,3,181,2854,8,181,1,182,
+ 1,182,1,183,5,183,2859,8,183,10,183,12,183,2862,9,183,1,184,1,184,1,184,
+ 1,184,1,184,1,184,1,184,1,184,1,184,1,184,3,184,2874,8,184,1,184,0,1,68,
+ 185,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,
+ 48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,
+ 96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,
+ 132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,
+ 168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,
+ 204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,
+ 240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,
+ 276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,
+ 312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,
+ 348,350,352,354,356,358,360,362,364,366,368,0,14,5,0,1,15,242,242,246,
+ 246,263,263,288,288,4,0,16,16,242,242,263,263,287,288,1,0,172,173,1,0,
+ 37,38,1,0,73,74,3,0,2,2,61,61,77,83,2,0,228,228,259,260,9,0,177,177,182,
+ 194,200,200,206,207,209,214,217,218,221,221,229,241,261,261,1,0,95,96,
+ 1,0,97,111,1,0,68,69,2,0,172,172,288,289,2,0,178,178,263,263,1,0,51,52,
+ 3289,0,370,1,0,0,0,2,383,1,0,0,0,4,385,1,0,0,0,6,391,1,0,0,0,8,399,1,0,
+ 0,0,10,452,1,0,0,0,12,454,1,0,0,0,14,457,1,0,0,0,16,460,1,0,0,0,18,464,
+ 1,0,0,0,20,467,1,0,0,0,22,470,1,0,0,0,24,477,1,0,0,0,26,493,1,0,0,0,28,
+ 495,1,0,0,0,30,497,1,0,0,0,32,507,1,0,0,0,34,509,1,0,0,0,36,526,1,0,0,
+ 0,38,530,1,0,0,0,40,548,1,0,0,0,42,575,1,0,0,0,44,598,1,0,0,0,46,634,1,
+ 0,0,0,48,636,1,0,0,0,50,640,1,0,0,0,52,642,1,0,0,0,54,649,1,0,0,0,56,661,
+ 1,0,0,0,58,664,1,0,0,0,60,666,1,0,0,0,62,679,1,0,0,0,64,687,1,0,0,0,66,
+ 689,1,0,0,0,68,697,1,0,0,0,70,713,1,0,0,0,72,719,1,0,0,0,74,722,1,0,0,
+ 0,76,771,1,0,0,0,78,776,1,0,0,0,80,781,1,0,0,0,82,786,1,0,0,0,84,794,1,
+ 0,0,0,86,799,1,0,0,0,88,872,1,0,0,0,90,900,1,0,0,0,92,902,1,0,0,0,94,906,
+ 1,0,0,0,96,908,1,0,0,0,98,913,1,0,0,0,100,916,1,0,0,0,102,918,1,0,0,0,
+ 104,920,1,0,0,0,106,922,1,0,0,0,108,924,1,0,0,0,110,926,1,0,0,0,112,928,
+ 1,0,0,0,114,930,1,0,0,0,116,932,1,0,0,0,118,934,1,0,0,0,120,936,1,0,0,
+ 0,122,938,1,0,0,0,124,940,1,0,0,0,126,1024,1,0,0,0,128,1042,1,0,0,0,130,
+ 1044,1,0,0,0,132,1056,1,0,0,0,134,1081,1,0,0,0,136,1090,1,0,0,0,138,1117,
+ 1,0,0,0,140,1124,1,0,0,0,142,1132,1,0,0,0,144,1140,1,0,0,0,146,1153,1,
+ 0,0,0,148,1163,1,0,0,0,150,1182,1,0,0,0,152,1276,1,0,0,0,154,1285,1,0,
+ 0,0,156,1295,1,0,0,0,158,1297,1,0,0,0,160,1299,1,0,0,0,162,1324,1,0,0,
+ 0,164,1356,1,0,0,0,166,1379,1,0,0,0,168,1391,1,0,0,0,170,1393,1,0,0,0,
+ 172,1396,1,0,0,0,174,1449,1,0,0,0,176,1461,1,0,0,0,178,1476,1,0,0,0,180,
+ 1483,1,0,0,0,182,1488,1,0,0,0,184,1492,1,0,0,0,186,1528,1,0,0,0,188,1530,
+ 1,0,0,0,190,1566,1,0,0,0,192,1578,1,0,0,0,194,1592,1,0,0,0,196,1594,1,
+ 0,0,0,198,1604,1,0,0,0,200,1615,1,0,0,0,202,1622,1,0,0,0,204,1632,1,0,
+ 0,0,206,1645,1,0,0,0,208,1650,1,0,0,0,210,1653,1,0,0,0,212,1664,1,0,0,
+ 0,214,1669,1,0,0,0,216,1675,1,0,0,0,218,1677,1,0,0,0,220,1799,1,0,0,0,
+ 222,1801,1,0,0,0,224,1838,1,0,0,0,226,1845,1,0,0,0,228,1850,1,0,0,0,230,
+ 1857,1,0,0,0,232,1877,1,0,0,0,234,1879,1,0,0,0,236,1884,1,0,0,0,238,1899,
+ 1,0,0,0,240,1901,1,0,0,0,242,1914,1,0,0,0,244,1919,1,0,0,0,246,1932,1,
+ 0,0,0,248,1940,1,0,0,0,250,1951,1,0,0,0,252,1956,1,0,0,0,254,1972,1,0,
+ 0,0,256,1974,1,0,0,0,258,2018,1,0,0,0,260,2038,1,0,0,0,262,2067,1,0,0,
+ 0,264,2072,1,0,0,0,266,2095,1,0,0,0,268,2100,1,0,0,0,270,2211,1,0,0,0,
+ 272,2213,1,0,0,0,274,2218,1,0,0,0,276,2220,1,0,0,0,278,2224,1,0,0,0,280,
+ 2228,1,0,0,0,282,2244,1,0,0,0,284,2258,1,0,0,0,286,2266,1,0,0,0,288,2268,
+ 1,0,0,0,290,2271,1,0,0,0,292,2273,1,0,0,0,294,2286,1,0,0,0,296,2288,1,
+ 0,0,0,298,2298,1,0,0,0,300,2303,1,0,0,0,302,2314,1,0,0,0,304,2321,1,0,
+ 0,0,306,2331,1,0,0,0,308,2399,1,0,0,0,310,2476,1,0,0,0,312,2481,1,0,0,
+ 0,314,2484,1,0,0,0,316,2489,1,0,0,0,318,2639,1,0,0,0,320,2645,1,0,0,0,
+ 322,2652,1,0,0,0,324,2658,1,0,0,0,326,2664,1,0,0,0,328,2670,1,0,0,0,330,
+ 2676,1,0,0,0,332,2682,1,0,0,0,334,2688,1,0,0,0,336,2694,1,0,0,0,338,2701,
+ 1,0,0,0,340,2706,1,0,0,0,342,2712,1,0,0,0,344,2739,1,0,0,0,346,2753,1,
+ 0,0,0,348,2758,1,0,0,0,350,2775,1,0,0,0,352,2777,1,0,0,0,354,2787,1,0,
+ 0,0,356,2811,1,0,0,0,358,2816,1,0,0,0,360,2832,1,0,0,0,362,2853,1,0,0,
+ 0,364,2855,1,0,0,0,366,2860,1,0,0,0,368,2873,1,0,0,0,370,371,7,0,0,0,371,
+ 1,1,0,0,0,372,384,5,287,0,0,373,374,3,4,2,0,374,375,5,264,0,0,375,377,
+ 1,0,0,0,376,373,1,0,0,0,377,380,1,0,0,0,378,376,1,0,0,0,378,379,1,0,0,
+ 0,379,381,1,0,0,0,380,378,1,0,0,0,381,384,3,4,2,0,382,384,5,263,0,0,383,
+ 372,1,0,0,0,383,378,1,0,0,0,383,382,1,0,0,0,384,3,1,0,0,0,385,386,7,1,
+ 0,0,386,5,1,0,0,0,387,388,5,262,0,0,388,390,5,265,0,0,389,387,1,0,0,0,
+ 390,393,1,0,0,0,391,389,1,0,0,0,391,392,1,0,0,0,392,394,1,0,0,0,393,391,
+ 1,0,0,0,394,395,5,262,0,0,395,7,1,0,0,0,396,398,3,10,5,0,397,396,1,0,0,
+ 0,398,401,1,0,0,0,399,397,1,0,0,0,399,400,1,0,0,0,400,9,1,0,0,0,401,399,
+ 1,0,0,0,402,403,3,74,37,0,403,404,5,17,0,0,404,405,3,82,41,0,405,406,5,
+ 18,0,0,406,453,1,0,0,0,407,408,3,72,36,0,408,409,5,17,0,0,409,410,3,8,
+ 4,0,410,411,5,18,0,0,411,453,1,0,0,0,412,413,3,256,128,0,413,414,5,17,
+ 0,0,414,415,3,268,134,0,415,416,5,18,0,0,416,453,1,0,0,0,417,453,3,222,
+ 111,0,418,453,3,296,148,0,419,453,3,70,35,0,420,453,3,66,33,0,421,453,
+ 3,88,44,0,422,453,3,90,45,0,423,453,3,22,11,0,424,425,3,346,173,0,425,
+ 426,5,17,0,0,426,427,3,348,174,0,427,428,5,18,0,0,428,453,1,0,0,0,429,
+ 430,3,352,176,0,430,431,5,17,0,0,431,432,3,358,179,0,432,433,5,18,0,0,
+ 433,453,1,0,0,0,434,435,3,362,181,0,435,436,5,17,0,0,436,437,3,366,183,
+ 0,437,438,5,18,0,0,438,453,1,0,0,0,439,453,3,64,32,0,440,453,3,174,87,
+ 0,441,453,3,342,171,0,442,453,3,12,6,0,443,453,3,14,7,0,444,453,3,16,8,
+ 0,445,453,3,18,9,0,446,453,3,20,10,0,447,453,3,26,13,0,448,453,3,42,21,
+ 0,449,453,3,40,20,0,450,453,3,30,15,0,451,453,3,24,12,0,452,402,1,0,0,
+ 0,452,407,1,0,0,0,452,412,1,0,0,0,452,417,1,0,0,0,452,418,1,0,0,0,452,
+ 419,1,0,0,0,452,420,1,0,0,0,452,421,1,0,0,0,452,422,1,0,0,0,452,423,1,
+ 0,0,0,452,424,1,0,0,0,452,429,1,0,0,0,452,434,1,0,0,0,452,439,1,0,0,0,
+ 452,440,1,0,0,0,452,441,1,0,0,0,452,442,1,0,0,0,452,443,1,0,0,0,452,444,
+ 1,0,0,0,452,445,1,0,0,0,452,446,1,0,0,0,452,447,1,0,0,0,452,448,1,0,0,
+ 0,452,449,1,0,0,0,452,450,1,0,0,0,452,451,1,0,0,0,453,11,1,0,0,0,454,455,
+ 5,19,0,0,455,456,3,32,16,0,456,13,1,0,0,0,457,458,5,20,0,0,458,459,3,32,
+ 16,0,459,15,1,0,0,0,460,461,5,21,0,0,461,462,5,22,0,0,462,463,3,32,16,
+ 0,463,17,1,0,0,0,464,465,5,23,0,0,465,466,3,34,17,0,466,19,1,0,0,0,467,
+ 468,5,24,0,0,468,469,3,34,17,0,469,21,1,0,0,0,470,471,5,25,0,0,471,472,
+ 3,98,49,0,472,473,3,2,1,0,473,474,5,17,0,0,474,475,3,142,71,0,475,476,
+ 5,18,0,0,476,23,1,0,0,0,477,478,5,26,0,0,478,25,1,0,0,0,479,480,5,27,0,
+ 0,480,494,3,28,14,0,481,482,5,27,0,0,482,483,3,28,14,0,483,484,5,28,0,
+ 0,484,485,3,28,14,0,485,494,1,0,0,0,486,487,5,27,0,0,487,488,3,28,14,0,
+ 488,489,5,28,0,0,489,490,3,28,14,0,490,491,5,28,0,0,491,492,3,28,14,0,
+ 492,494,1,0,0,0,493,479,1,0,0,0,493,481,1,0,0,0,493,486,1,0,0,0,494,27,
+ 1,0,0,0,495,496,5,263,0,0,496,29,1,0,0,0,497,498,5,29,0,0,498,502,5,17,
+ 0,0,499,501,3,138,69,0,500,499,1,0,0,0,501,504,1,0,0,0,502,500,1,0,0,0,
+ 502,503,1,0,0,0,503,505,1,0,0,0,504,502,1,0,0,0,505,506,5,18,0,0,506,31,
+ 1,0,0,0,507,508,5,172,0,0,508,33,1,0,0,0,509,510,7,2,0,0,510,35,1,0,0,
+ 0,511,527,5,174,0,0,512,513,3,32,16,0,513,514,5,264,0,0,514,527,1,0,0,
+ 0,515,527,3,32,16,0,516,517,5,187,0,0,517,518,5,30,0,0,518,519,3,32,16,
+ 0,519,520,5,31,0,0,520,527,1,0,0,0,521,522,5,188,0,0,522,523,5,30,0,0,
+ 523,524,3,34,17,0,524,525,5,31,0,0,525,527,1,0,0,0,526,511,1,0,0,0,526,
+ 512,1,0,0,0,526,515,1,0,0,0,526,516,1,0,0,0,526,521,1,0,0,0,527,37,1,0,
+ 0,0,528,531,3,32,16,0,529,531,5,261,0,0,530,528,1,0,0,0,530,529,1,0,0,
+ 0,531,39,1,0,0,0,532,533,5,266,0,0,533,549,5,288,0,0,534,535,5,266,0,0,
+ 535,536,5,288,0,0,536,549,5,262,0,0,537,538,5,267,0,0,538,549,5,288,0,
+ 0,539,540,5,268,0,0,540,549,5,288,0,0,541,542,5,269,0,0,542,549,5,288,
+ 0,0,543,549,5,270,0,0,544,549,5,271,0,0,545,546,5,272,0,0,546,549,5,262,
+ 0,0,547,549,5,32,0,0,548,532,1,0,0,0,548,534,1,0,0,0,548,537,1,0,0,0,548,
+ 539,1,0,0,0,548,541,1,0,0,0,548,543,1,0,0,0,548,544,1,0,0,0,548,545,1,
+ 0,0,0,548,547,1,0,0,0,549,41,1,0,0,0,550,551,5,33,0,0,551,552,3,160,80,
+ 0,552,553,5,34,0,0,553,554,3,2,1,0,554,576,1,0,0,0,555,556,5,33,0,0,556,
+ 557,3,138,69,0,557,558,5,34,0,0,558,559,3,2,1,0,559,576,1,0,0,0,560,561,
+ 5,33,0,0,561,562,3,198,99,0,562,563,5,34,0,0,563,564,3,2,1,0,564,576,1,
+ 0,0,0,565,566,5,33,0,0,566,567,3,44,22,0,567,568,5,34,0,0,568,569,3,2,
+ 1,0,569,576,1,0,0,0,570,571,5,33,0,0,571,572,3,46,23,0,572,573,5,34,0,
+ 0,573,574,3,2,1,0,574,576,1,0,0,0,575,550,1,0,0,0,575,555,1,0,0,0,575,
+ 560,1,0,0,0,575,565,1,0,0,0,575,570,1,0,0,0,576,43,1,0,0,0,577,578,5,35,
+ 0,0,578,599,3,48,24,0,579,580,5,35,0,0,580,581,3,48,24,0,581,582,5,36,
+ 0,0,582,583,3,6,3,0,583,599,1,0,0,0,584,585,5,35,0,0,585,586,3,48,24,0,
+ 586,587,5,36,0,0,587,588,5,17,0,0,588,589,3,52,26,0,589,590,5,18,0,0,590,
+ 599,1,0,0,0,591,592,5,35,0,0,592,593,3,48,24,0,593,594,5,36,0,0,594,595,
+ 5,30,0,0,595,596,3,312,156,0,596,597,5,31,0,0,597,599,1,0,0,0,598,577,
+ 1,0,0,0,598,579,1,0,0,0,598,584,1,0,0,0,598,591,1,0,0,0,599,45,1,0,0,0,
+ 600,601,5,35,0,0,601,602,5,30,0,0,602,603,3,50,25,0,603,604,5,31,0,0,604,
+ 605,3,48,24,0,605,635,1,0,0,0,606,607,5,35,0,0,607,608,5,30,0,0,608,609,
+ 3,50,25,0,609,610,5,31,0,0,610,611,3,48,24,0,611,612,5,36,0,0,612,613,
+ 3,6,3,0,613,635,1,0,0,0,614,615,5,35,0,0,615,616,5,30,0,0,616,617,3,50,
+ 25,0,617,618,5,31,0,0,618,619,3,48,24,0,619,620,5,36,0,0,620,621,5,17,
+ 0,0,621,622,3,52,26,0,622,623,5,18,0,0,623,635,1,0,0,0,624,625,5,35,0,
+ 0,625,626,5,30,0,0,626,627,3,50,25,0,627,628,5,31,0,0,628,629,3,48,24,
+ 0,629,630,5,36,0,0,630,631,5,30,0,0,631,632,3,312,156,0,632,633,5,31,0,
+ 0,633,635,1,0,0,0,634,600,1,0,0,0,634,606,1,0,0,0,634,614,1,0,0,0,634,
+ 624,1,0,0,0,635,47,1,0,0,0,636,637,3,190,95,0,637,49,1,0,0,0,638,641,3,
+ 146,73,0,639,641,3,198,99,0,640,638,1,0,0,0,640,639,1,0,0,0,641,51,1,0,
+ 0,0,642,643,3,54,27,0,643,644,3,56,28,0,644,53,1,0,0,0,645,648,3,318,159,
+ 0,646,648,3,40,20,0,647,645,1,0,0,0,647,646,1,0,0,0,648,651,1,0,0,0,649,
+ 647,1,0,0,0,649,650,1,0,0,0,650,55,1,0,0,0,651,649,1,0,0,0,652,653,3,58,
+ 29,0,653,654,3,60,30,0,654,655,3,2,1,0,655,656,5,36,0,0,656,657,3,318,
+ 159,0,657,660,1,0,0,0,658,660,3,40,20,0,659,652,1,0,0,0,659,658,1,0,0,
+ 0,660,663,1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662,57,1,0,0,0,663,661,
+ 1,0,0,0,664,665,7,3,0,0,665,59,1,0,0,0,666,668,3,62,31,0,667,669,5,260,
+ 0,0,668,667,1,0,0,0,668,669,1,0,0,0,669,61,1,0,0,0,670,680,3,166,83,0,
+ 671,680,3,2,1,0,672,680,5,195,0,0,673,680,5,196,0,0,674,675,5,201,0,0,
+ 675,676,5,39,0,0,676,680,5,263,0,0,677,678,5,201,0,0,678,680,3,138,69,
+ 0,679,670,1,0,0,0,679,671,1,0,0,0,679,672,1,0,0,0,679,673,1,0,0,0,679,
+ 674,1,0,0,0,679,677,1,0,0,0,680,63,1,0,0,0,681,682,5,197,0,0,682,683,5,
+ 40,0,0,683,688,3,2,1,0,684,685,5,197,0,0,685,688,3,2,1,0,686,688,5,197,
+ 0,0,687,681,1,0,0,0,687,684,1,0,0,0,687,686,1,0,0,0,688,65,1,0,0,0,689,
+ 690,5,41,0,0,690,691,5,42,0,0,691,692,3,32,16,0,692,693,5,43,0,0,693,694,
+ 3,68,34,0,694,695,5,44,0,0,695,696,3,0,0,0,696,67,1,0,0,0,697,710,6,34,
+ -1,0,698,699,10,5,0,0,699,709,5,185,0,0,700,701,10,4,0,0,701,709,5,186,
+ 0,0,702,703,10,3,0,0,703,709,5,45,0,0,704,705,10,2,0,0,705,709,5,46,0,
+ 0,706,707,10,1,0,0,707,709,5,47,0,0,708,698,1,0,0,0,708,700,1,0,0,0,708,
+ 702,1,0,0,0,708,704,1,0,0,0,708,706,1,0,0,0,709,712,1,0,0,0,710,708,1,
+ 0,0,0,710,711,1,0,0,0,711,69,1,0,0,0,712,710,1,0,0,0,713,714,5,48,0,0,
+ 714,715,5,36,0,0,715,716,5,30,0,0,716,717,3,312,156,0,717,718,5,31,0,0,
+ 718,71,1,0,0,0,719,720,5,49,0,0,720,721,3,2,1,0,721,73,1,0,0,0,722,726,
+ 5,50,0,0,723,725,3,76,38,0,724,723,1,0,0,0,725,728,1,0,0,0,726,724,1,0,
+ 0,0,726,727,1,0,0,0,727,729,1,0,0,0,728,726,1,0,0,0,729,730,3,2,1,0,730,
+ 731,3,204,102,0,731,732,3,78,39,0,732,733,3,80,40,0,733,75,1,0,0,0,734,
+ 772,5,51,0,0,735,772,5,52,0,0,736,772,5,198,0,0,737,772,5,201,0,0,738,
+ 772,5,220,0,0,739,772,5,53,0,0,740,772,5,54,0,0,741,772,5,55,0,0,742,772,
+ 5,56,0,0,743,772,5,243,0,0,744,772,5,15,0,0,745,772,5,223,0,0,746,772,
+ 5,57,0,0,747,772,5,58,0,0,748,772,5,59,0,0,749,772,5,60,0,0,750,772,5,
+ 61,0,0,751,752,5,62,0,0,752,772,5,51,0,0,753,754,5,62,0,0,754,772,5,52,
+ 0,0,755,756,5,62,0,0,756,772,5,63,0,0,757,758,5,62,0,0,758,772,5,64,0,
+ 0,759,760,5,62,0,0,760,772,5,65,0,0,761,762,5,62,0,0,762,772,5,66,0,0,
+ 763,772,5,67,0,0,764,772,5,68,0,0,765,772,5,69,0,0,766,767,5,70,0,0,767,
+ 768,5,30,0,0,768,769,3,32,16,0,769,770,5,31,0,0,770,772,1,0,0,0,771,734,
+ 1,0,0,0,771,735,1,0,0,0,771,736,1,0,0,0,771,737,1,0,0,0,771,738,1,0,0,
+ 0,771,739,1,0,0,0,771,740,1,0,0,0,771,741,1,0,0,0,771,742,1,0,0,0,771,
+ 743,1,0,0,0,771,744,1,0,0,0,771,745,1,0,0,0,771,746,1,0,0,0,771,747,1,
+ 0,0,0,771,748,1,0,0,0,771,749,1,0,0,0,771,750,1,0,0,0,771,751,1,0,0,0,
+ 771,753,1,0,0,0,771,755,1,0,0,0,771,757,1,0,0,0,771,759,1,0,0,0,771,761,
+ 1,0,0,0,771,763,1,0,0,0,771,764,1,0,0,0,771,765,1,0,0,0,771,766,1,0,0,
+ 0,772,77,1,0,0,0,773,777,1,0,0,0,774,775,5,71,0,0,775,777,3,146,73,0,776,
+ 773,1,0,0,0,776,774,1,0,0,0,777,79,1,0,0,0,778,782,1,0,0,0,779,780,5,72,
+ 0,0,780,782,3,84,42,0,781,778,1,0,0,0,781,779,1,0,0,0,782,81,1,0,0,0,783,
+ 785,3,220,110,0,784,783,1,0,0,0,785,788,1,0,0,0,786,784,1,0,0,0,786,787,
+ 1,0,0,0,787,83,1,0,0,0,788,786,1,0,0,0,789,790,3,146,73,0,790,791,5,28,
+ 0,0,791,793,1,0,0,0,792,789,1,0,0,0,793,796,1,0,0,0,794,792,1,0,0,0,794,
+ 795,1,0,0,0,795,797,1,0,0,0,796,794,1,0,0,0,797,798,3,146,73,0,798,85,
+ 1,0,0,0,799,800,7,4,0,0,800,87,1,0,0,0,801,802,3,86,43,0,802,803,3,32,
+ 16,0,803,804,5,263,0,0,804,873,1,0,0,0,805,806,3,86,43,0,806,807,3,32,
+ 16,0,807,873,1,0,0,0,808,809,3,86,43,0,809,810,3,32,16,0,810,811,5,75,
+ 0,0,811,812,3,32,16,0,812,813,5,263,0,0,813,873,1,0,0,0,814,815,3,86,43,
+ 0,815,816,3,32,16,0,816,817,5,75,0,0,817,818,3,32,16,0,818,873,1,0,0,0,
+ 819,820,3,86,43,0,820,821,3,32,16,0,821,822,5,75,0,0,822,823,3,32,16,0,
+ 823,824,5,28,0,0,824,825,3,32,16,0,825,826,5,263,0,0,826,873,1,0,0,0,827,
+ 828,3,86,43,0,828,829,3,32,16,0,829,830,5,75,0,0,830,831,3,32,16,0,831,
+ 832,5,28,0,0,832,833,3,32,16,0,833,873,1,0,0,0,834,835,3,86,43,0,835,836,
+ 3,32,16,0,836,837,5,28,0,0,837,838,3,32,16,0,838,839,5,75,0,0,839,840,
+ 3,32,16,0,840,841,5,263,0,0,841,873,1,0,0,0,842,843,3,86,43,0,843,844,
+ 3,32,16,0,844,845,5,28,0,0,845,846,3,32,16,0,846,847,5,75,0,0,847,848,
+ 3,32,16,0,848,873,1,0,0,0,849,850,3,86,43,0,850,851,3,32,16,0,851,852,
+ 5,28,0,0,852,853,3,32,16,0,853,854,5,75,0,0,854,855,3,32,16,0,855,856,
+ 5,28,0,0,856,857,3,32,16,0,857,858,5,263,0,0,858,873,1,0,0,0,859,860,3,
+ 86,43,0,860,861,3,32,16,0,861,862,5,28,0,0,862,863,3,32,16,0,863,864,5,
+ 75,0,0,864,865,3,32,16,0,865,866,5,28,0,0,866,867,3,32,16,0,867,873,1,
+ 0,0,0,868,869,3,86,43,0,869,870,3,32,16,0,870,871,5,262,0,0,871,873,1,
+ 0,0,0,872,801,1,0,0,0,872,805,1,0,0,0,872,808,1,0,0,0,872,814,1,0,0,0,
+ 872,819,1,0,0,0,872,827,1,0,0,0,872,834,1,0,0,0,872,842,1,0,0,0,872,849,
+ 1,0,0,0,872,859,1,0,0,0,872,868,1,0,0,0,873,89,1,0,0,0,874,878,5,21,0,
+ 0,875,877,3,92,46,0,876,875,1,0,0,0,877,880,1,0,0,0,878,876,1,0,0,0,878,
+ 879,1,0,0,0,879,881,1,0,0,0,880,878,1,0,0,0,881,882,3,2,1,0,882,883,3,
+ 94,47,0,883,884,5,179,0,0,884,885,5,36,0,0,885,886,5,30,0,0,886,887,3,
+ 312,156,0,887,888,5,31,0,0,888,889,3,94,47,0,889,901,1,0,0,0,890,894,5,
+ 21,0,0,891,893,3,92,46,0,892,891,1,0,0,0,893,896,1,0,0,0,894,892,1,0,0,
+ 0,894,895,1,0,0,0,895,897,1,0,0,0,896,894,1,0,0,0,897,898,3,2,1,0,898,
+ 899,3,94,47,0,899,901,1,0,0,0,900,874,1,0,0,0,900,890,1,0,0,0,901,91,1,
+ 0,0,0,902,903,5,76,0,0,903,93,1,0,0,0,904,907,1,0,0,0,905,907,5,297,0,
+ 0,906,904,1,0,0,0,906,905,1,0,0,0,907,95,1,0,0,0,908,909,7,5,0,0,909,97,
+ 1,0,0,0,910,912,3,96,48,0,911,910,1,0,0,0,912,915,1,0,0,0,913,911,1,0,
+ 0,0,913,914,1,0,0,0,914,99,1,0,0,0,915,913,1,0,0,0,916,917,5,274,0,0,917,
+ 101,1,0,0,0,918,919,5,275,0,0,919,103,1,0,0,0,920,921,5,276,0,0,921,105,
+ 1,0,0,0,922,923,5,277,0,0,923,107,1,0,0,0,924,925,5,278,0,0,925,109,1,
+ 0,0,0,926,927,5,281,0,0,927,111,1,0,0,0,928,929,5,279,0,0,929,113,1,0,
+ 0,0,930,931,5,285,0,0,931,115,1,0,0,0,932,933,5,283,0,0,933,117,1,0,0,
+ 0,934,935,5,284,0,0,935,119,1,0,0,0,936,937,5,280,0,0,937,121,1,0,0,0,
+ 938,939,5,286,0,0,939,123,1,0,0,0,940,941,5,282,0,0,941,125,1,0,0,0,942,
+ 1025,3,100,50,0,943,944,3,102,51,0,944,945,3,32,16,0,945,1025,1,0,0,0,
+ 946,947,3,102,51,0,947,948,3,0,0,0,948,1025,1,0,0,0,949,950,3,104,52,0,
+ 950,951,3,32,16,0,951,1025,1,0,0,0,952,953,3,106,53,0,953,954,3,34,17,
+ 0,954,1025,1,0,0,0,955,956,3,108,54,0,956,957,3,36,18,0,957,1025,1,0,0,
+ 0,958,959,3,108,54,0,959,960,3,34,17,0,960,1025,1,0,0,0,961,962,3,108,
+ 54,0,962,963,5,30,0,0,963,964,3,312,156,0,964,965,5,31,0,0,965,1025,1,
+ 0,0,0,966,967,3,108,54,0,967,968,5,84,0,0,968,969,5,30,0,0,969,970,3,312,
+ 156,0,970,971,5,31,0,0,971,1025,1,0,0,0,972,973,3,110,55,0,973,974,3,32,
+ 16,0,974,1025,1,0,0,0,975,976,3,110,55,0,976,977,3,0,0,0,977,1025,1,0,
+ 0,0,978,979,3,112,56,0,979,980,3,190,95,0,980,1025,1,0,0,0,981,982,3,114,
+ 57,0,982,983,3,200,100,0,983,1025,1,0,0,0,984,985,3,114,57,0,985,986,3,
+ 196,98,0,986,1025,1,0,0,0,987,988,3,116,58,0,988,989,3,146,73,0,989,1025,
+ 1,0,0,0,990,991,3,118,59,0,991,992,3,6,3,0,992,1025,1,0,0,0,993,994,3,
+ 118,59,0,994,995,5,223,0,0,995,996,5,30,0,0,996,997,3,6,3,0,997,998,5,
+ 31,0,0,998,1025,1,0,0,0,999,1000,3,118,59,0,1000,1001,5,84,0,0,1001,1002,
+ 5,30,0,0,1002,1003,3,312,156,0,1003,1004,5,31,0,0,1004,1025,1,0,0,0,1005,
+ 1006,3,120,60,0,1006,1007,3,192,96,0,1007,1008,3,160,80,0,1008,1009,3,
+ 134,67,0,1009,1025,1,0,0,0,1010,1011,3,122,61,0,1011,1012,3,50,25,0,1012,
+ 1025,1,0,0,0,1013,1014,3,122,61,0,1014,1015,3,32,16,0,1015,1025,1,0,0,
+ 0,1016,1017,3,124,62,0,1017,1018,5,30,0,0,1018,1019,3,128,64,0,1019,1020,
+ 5,31,0,0,1020,1025,1,0,0,0,1021,1022,3,124,62,0,1022,1023,5,85,0,0,1023,
+ 1025,1,0,0,0,1024,942,1,0,0,0,1024,943,1,0,0,0,1024,946,1,0,0,0,1024,949,
+ 1,0,0,0,1024,952,1,0,0,0,1024,955,1,0,0,0,1024,958,1,0,0,0,1024,961,1,
+ 0,0,0,1024,966,1,0,0,0,1024,972,1,0,0,0,1024,975,1,0,0,0,1024,978,1,0,
+ 0,0,1024,981,1,0,0,0,1024,984,1,0,0,0,1024,987,1,0,0,0,1024,990,1,0,0,
+ 0,1024,993,1,0,0,0,1024,999,1,0,0,0,1024,1005,1,0,0,0,1024,1010,1,0,0,
+ 0,1024,1013,1,0,0,0,1024,1016,1,0,0,0,1024,1021,1,0,0,0,1025,127,1,0,0,
+ 0,1026,1043,1,0,0,0,1027,1030,3,0,0,0,1028,1030,3,32,16,0,1029,1027,1,
+ 0,0,0,1029,1028,1,0,0,0,1030,1031,1,0,0,0,1031,1032,5,28,0,0,1032,1034,
+ 1,0,0,0,1033,1029,1,0,0,0,1034,1037,1,0,0,0,1035,1033,1,0,0,0,1035,1036,
+ 1,0,0,0,1036,1040,1,0,0,0,1037,1035,1,0,0,0,1038,1041,3,0,0,0,1039,1041,
+ 3,32,16,0,1040,1038,1,0,0,0,1040,1039,1,0,0,0,1041,1043,1,0,0,0,1042,1026,
+ 1,0,0,0,1042,1035,1,0,0,0,1043,129,1,0,0,0,1044,1050,5,86,0,0,1045,1046,
+ 3,160,80,0,1046,1047,5,28,0,0,1047,1049,1,0,0,0,1048,1045,1,0,0,0,1049,
+ 1052,1,0,0,0,1050,1048,1,0,0,0,1050,1051,1,0,0,0,1051,1053,1,0,0,0,1052,
+ 1050,1,0,0,0,1053,1054,3,160,80,0,1054,1055,5,87,0,0,1055,131,1,0,0,0,
+ 1056,1062,5,42,0,0,1057,1058,3,168,84,0,1058,1059,5,28,0,0,1059,1061,1,
+ 0,0,0,1060,1057,1,0,0,0,1061,1064,1,0,0,0,1062,1060,1,0,0,0,1062,1063,
+ 1,0,0,0,1063,1065,1,0,0,0,1064,1062,1,0,0,0,1065,1066,3,168,84,0,1066,
+ 1067,5,43,0,0,1067,133,1,0,0,0,1068,1074,5,30,0,0,1069,1070,3,136,68,0,
+ 1070,1071,5,28,0,0,1071,1073,1,0,0,0,1072,1069,1,0,0,0,1073,1076,1,0,0,
+ 0,1074,1072,1,0,0,0,1074,1075,1,0,0,0,1075,1077,1,0,0,0,1076,1074,1,0,
+ 0,0,1077,1078,3,136,68,0,1078,1079,5,31,0,0,1079,1082,1,0,0,0,1080,1082,
+ 5,85,0,0,1081,1068,1,0,0,0,1081,1080,1,0,0,0,1082,135,1,0,0,0,1083,1091,
+ 5,176,0,0,1084,1085,3,252,126,0,1085,1086,3,160,80,0,1086,1088,3,248,124,
+ 0,1087,1089,3,0,0,0,1088,1087,1,0,0,0,1088,1089,1,0,0,0,1089,1091,1,0,
+ 0,0,1090,1083,1,0,0,0,1090,1084,1,0,0,0,1091,137,1,0,0,0,1092,1093,5,42,
+ 0,0,1093,1094,3,2,1,0,1094,1095,5,43,0,0,1095,1096,3,140,70,0,1096,1118,
+ 1,0,0,0,1097,1098,5,42,0,0,1098,1099,3,196,98,0,1099,1100,5,43,0,0,1100,
+ 1101,3,140,70,0,1101,1118,1,0,0,0,1102,1103,5,42,0,0,1103,1104,5,261,0,
+ 0,1104,1105,5,43,0,0,1105,1118,3,140,70,0,1106,1107,5,42,0,0,1107,1108,
+ 5,197,0,0,1108,1109,3,2,1,0,1109,1110,5,43,0,0,1110,1111,3,140,70,0,1111,
+ 1118,1,0,0,0,1112,1118,3,140,70,0,1113,1118,3,196,98,0,1114,1118,5,256,
+ 0,0,1115,1118,5,257,0,0,1116,1118,5,258,0,0,1117,1092,1,0,0,0,1117,1097,
+ 1,0,0,0,1117,1102,1,0,0,0,1117,1106,1,0,0,0,1117,1112,1,0,0,0,1117,1113,
+ 1,0,0,0,1117,1114,1,0,0,0,1117,1115,1,0,0,0,1117,1116,1,0,0,0,1118,139,
+ 1,0,0,0,1119,1120,3,2,1,0,1120,1121,5,88,0,0,1121,1123,1,0,0,0,1122,1119,
+ 1,0,0,0,1123,1126,1,0,0,0,1124,1122,1,0,0,0,1124,1125,1,0,0,0,1125,1127,
+ 1,0,0,0,1126,1124,1,0,0,0,1127,1128,3,2,1,0,1128,141,1,0,0,0,1129,1131,
+ 3,144,72,0,1130,1129,1,0,0,0,1131,1134,1,0,0,0,1132,1130,1,0,0,0,1132,
+ 1133,1,0,0,0,1133,143,1,0,0,0,1134,1132,1,0,0,0,1135,1136,5,179,0,0,1136,
+ 1137,5,89,0,0,1137,1141,3,32,16,0,1138,1141,3,174,87,0,1139,1141,3,344,
+ 172,0,1140,1135,1,0,0,0,1140,1138,1,0,0,0,1140,1139,1,0,0,0,1141,145,1,
+ 0,0,0,1142,1154,3,138,69,0,1143,1144,5,42,0,0,1144,1145,3,2,1,0,1145,1146,
+ 5,43,0,0,1146,1154,1,0,0,0,1147,1148,5,42,0,0,1148,1149,5,197,0,0,1149,
+ 1150,3,2,1,0,1150,1151,5,43,0,0,1151,1154,1,0,0,0,1152,1154,3,160,80,0,
+ 1153,1142,1,0,0,0,1153,1143,1,0,0,0,1153,1147,1,0,0,0,1153,1152,1,0,0,
+ 0,1154,147,1,0,0,0,1155,1164,1,0,0,0,1156,1160,3,152,76,0,1157,1159,3,
+ 150,75,0,1158,1157,1,0,0,0,1159,1162,1,0,0,0,1160,1158,1,0,0,0,1160,1161,
+ 1,0,0,0,1161,1164,1,0,0,0,1162,1160,1,0,0,0,1163,1155,1,0,0,0,1163,1156,
+ 1,0,0,0,1164,149,1,0,0,0,1165,1183,5,261,0,0,1166,1183,5,260,0,0,1167,
+ 1168,5,42,0,0,1168,1169,3,32,16,0,1169,1170,5,43,0,0,1170,1183,1,0,0,0,
+ 1171,1172,5,42,0,0,1172,1173,3,32,16,0,1173,1174,5,265,0,0,1174,1175,3,
+ 32,16,0,1175,1176,5,43,0,0,1176,1183,1,0,0,0,1177,1178,5,42,0,0,1178,1179,
+ 5,265,0,0,1179,1180,3,32,16,0,1180,1181,5,43,0,0,1181,1183,1,0,0,0,1182,
+ 1165,1,0,0,0,1182,1166,1,0,0,0,1182,1167,1,0,0,0,1182,1171,1,0,0,0,1182,
+ 1177,1,0,0,0,1183,151,1,0,0,0,1184,1277,1,0,0,0,1185,1186,5,202,0,0,1186,
+ 1187,5,30,0,0,1187,1188,3,6,3,0,1188,1189,5,28,0,0,1189,1190,3,6,3,0,1190,
+ 1191,5,28,0,0,1191,1192,3,6,3,0,1192,1193,5,28,0,0,1193,1194,3,6,3,0,1194,
+ 1195,5,31,0,0,1195,1277,1,0,0,0,1196,1197,5,202,0,0,1197,1198,5,30,0,0,
+ 1198,1199,3,6,3,0,1199,1200,5,28,0,0,1200,1201,3,6,3,0,1201,1202,5,31,
+ 0,0,1202,1277,1,0,0,0,1203,1204,5,203,0,0,1204,1205,5,204,0,0,1205,1206,
+ 5,42,0,0,1206,1207,3,32,16,0,1207,1208,5,43,0,0,1208,1277,1,0,0,0,1209,
+ 1210,5,203,0,0,1210,1211,5,205,0,0,1211,1212,5,42,0,0,1212,1213,3,32,16,
+ 0,1213,1214,5,43,0,0,1214,1215,3,148,74,0,1215,1277,1,0,0,0,1216,1277,
+ 5,206,0,0,1217,1277,5,207,0,0,1218,1277,5,208,0,0,1219,1277,5,200,0,0,
+ 1220,1277,5,182,0,0,1221,1277,5,183,0,0,1222,1277,5,184,0,0,1223,1277,
+ 5,185,0,0,1224,1277,5,186,0,0,1225,1277,5,187,0,0,1226,1277,5,188,0,0,
+ 1227,1277,5,209,0,0,1228,1277,5,189,0,0,1229,1277,5,190,0,0,1230,1277,
+ 5,191,0,0,1231,1277,5,192,0,0,1232,1277,5,210,0,0,1233,1277,5,211,0,0,
+ 1234,1277,5,212,0,0,1235,1277,5,213,0,0,1236,1277,5,214,0,0,1237,1277,
+ 5,215,0,0,1238,1277,5,216,0,0,1239,1240,5,217,0,0,1240,1277,3,154,77,0,
+ 1241,1242,5,218,0,0,1242,1277,3,154,77,0,1243,1277,5,219,0,0,1244,1245,
+ 5,220,0,0,1245,1277,3,154,77,0,1246,1247,5,221,0,0,1247,1277,3,156,78,
+ 0,1248,1249,5,221,0,0,1249,1250,3,156,78,0,1250,1251,5,28,0,0,1251,1252,
+ 3,6,3,0,1252,1277,1,0,0,0,1253,1277,5,193,0,0,1254,1277,5,194,0,0,1255,
+ 1256,5,90,0,0,1256,1277,5,183,0,0,1257,1258,5,90,0,0,1258,1277,5,184,0,
+ 0,1259,1260,5,90,0,0,1260,1277,5,185,0,0,1261,1262,5,90,0,0,1262,1277,
+ 5,186,0,0,1263,1264,5,62,0,0,1264,1277,5,219,0,0,1265,1277,5,222,0,0,1266,
+ 1267,5,223,0,0,1267,1277,5,212,0,0,1268,1277,5,224,0,0,1269,1270,5,206,
+ 0,0,1270,1277,5,182,0,0,1271,1277,5,225,0,0,1272,1277,5,227,0,0,1273,1274,
+ 5,34,0,0,1274,1277,5,226,0,0,1275,1277,3,2,1,0,1276,1184,1,0,0,0,1276,
+ 1185,1,0,0,0,1276,1196,1,0,0,0,1276,1203,1,0,0,0,1276,1209,1,0,0,0,1276,
+ 1216,1,0,0,0,1276,1217,1,0,0,0,1276,1218,1,0,0,0,1276,1219,1,0,0,0,1276,
+ 1220,1,0,0,0,1276,1221,1,0,0,0,1276,1222,1,0,0,0,1276,1223,1,0,0,0,1276,
+ 1224,1,0,0,0,1276,1225,1,0,0,0,1276,1226,1,0,0,0,1276,1227,1,0,0,0,1276,
+ 1228,1,0,0,0,1276,1229,1,0,0,0,1276,1230,1,0,0,0,1276,1231,1,0,0,0,1276,
+ 1232,1,0,0,0,1276,1233,1,0,0,0,1276,1234,1,0,0,0,1276,1235,1,0,0,0,1276,
+ 1236,1,0,0,0,1276,1237,1,0,0,0,1276,1238,1,0,0,0,1276,1239,1,0,0,0,1276,
+ 1241,1,0,0,0,1276,1243,1,0,0,0,1276,1244,1,0,0,0,1276,1246,1,0,0,0,1276,
+ 1248,1,0,0,0,1276,1253,1,0,0,0,1276,1254,1,0,0,0,1276,1255,1,0,0,0,1276,
+ 1257,1,0,0,0,1276,1259,1,0,0,0,1276,1261,1,0,0,0,1276,1263,1,0,0,0,1276,
+ 1265,1,0,0,0,1276,1266,1,0,0,0,1276,1268,1,0,0,0,1276,1269,1,0,0,0,1276,
+ 1271,1,0,0,0,1276,1272,1,0,0,0,1276,1273,1,0,0,0,1276,1275,1,0,0,0,1277,
+ 153,1,0,0,0,1278,1286,1,0,0,0,1279,1280,5,30,0,0,1280,1281,5,91,0,0,1281,
+ 1282,5,36,0,0,1282,1283,3,32,16,0,1283,1284,5,31,0,0,1284,1286,1,0,0,0,
+ 1285,1278,1,0,0,0,1285,1279,1,0,0,0,1286,155,1,0,0,0,1287,1296,1,0,0,0,
+ 1288,1292,3,158,79,0,1289,1291,7,6,0,0,1290,1289,1,0,0,0,1291,1294,1,0,
+ 0,0,1292,1290,1,0,0,0,1292,1293,1,0,0,0,1293,1296,1,0,0,0,1294,1292,1,
+ 0,0,0,1295,1287,1,0,0,0,1295,1288,1,0,0,0,1296,157,1,0,0,0,1297,1298,7,
+ 7,0,0,1298,159,1,0,0,0,1299,1303,3,164,82,0,1300,1302,3,162,81,0,1301,
+ 1300,1,0,0,0,1302,1305,1,0,0,0,1303,1301,1,0,0,0,1303,1304,1,0,0,0,1304,
+ 161,1,0,0,0,1305,1303,1,0,0,0,1306,1325,5,260,0,0,1307,1308,5,42,0,0,1308,
+ 1325,5,43,0,0,1309,1325,3,132,66,0,1310,1325,5,259,0,0,1311,1325,5,261,
+ 0,0,1312,1325,5,92,0,0,1313,1314,5,93,0,0,1314,1315,5,30,0,0,1315,1316,
+ 3,146,73,0,1316,1317,5,31,0,0,1317,1325,1,0,0,0,1318,1319,5,94,0,0,1319,
+ 1320,5,30,0,0,1320,1321,3,146,73,0,1321,1322,5,31,0,0,1322,1325,1,0,0,
+ 0,1323,1325,3,130,65,0,1324,1306,1,0,0,0,1324,1307,1,0,0,0,1324,1309,1,
+ 0,0,0,1324,1310,1,0,0,0,1324,1311,1,0,0,0,1324,1312,1,0,0,0,1324,1313,
+ 1,0,0,0,1324,1318,1,0,0,0,1324,1323,1,0,0,0,1325,163,1,0,0,0,1326,1327,
+ 5,39,0,0,1327,1357,3,138,69,0,1328,1357,5,196,0,0,1329,1330,5,198,0,0,
+ 1330,1331,5,39,0,0,1331,1357,3,138,69,0,1332,1333,5,199,0,0,1333,1357,
+ 3,138,69,0,1334,1335,5,225,0,0,1335,1336,3,192,96,0,1336,1337,3,160,80,
+ 0,1337,1338,5,261,0,0,1338,1339,3,134,67,0,1339,1357,1,0,0,0,1340,1341,
+ 5,252,0,0,1341,1357,3,32,16,0,1342,1343,5,251,0,0,1343,1357,3,32,16,0,
+ 1344,1345,5,252,0,0,1345,1357,3,2,1,0,1346,1347,5,251,0,0,1347,1357,3,
+ 2,1,0,1348,1357,5,253,0,0,1349,1357,5,200,0,0,1350,1357,3,170,85,0,1351,
+ 1357,3,172,86,0,1352,1357,3,166,83,0,1353,1357,3,2,1,0,1354,1355,5,176,
+ 0,0,1355,1357,3,160,80,0,1356,1326,1,0,0,0,1356,1328,1,0,0,0,1356,1329,
+ 1,0,0,0,1356,1332,1,0,0,0,1356,1334,1,0,0,0,1356,1340,1,0,0,0,1356,1342,
+ 1,0,0,0,1356,1344,1,0,0,0,1356,1346,1,0,0,0,1356,1348,1,0,0,0,1356,1349,
+ 1,0,0,0,1356,1350,1,0,0,0,1356,1351,1,0,0,0,1356,1352,1,0,0,0,1356,1353,
+ 1,0,0,0,1356,1354,1,0,0,0,1357,165,1,0,0,0,1358,1380,5,180,0,0,1359,1380,
+ 5,181,0,0,1360,1380,5,182,0,0,1361,1380,5,183,0,0,1362,1380,5,184,0,0,
+ 1363,1380,5,185,0,0,1364,1380,5,186,0,0,1365,1380,5,187,0,0,1366,1380,
+ 5,188,0,0,1367,1380,5,189,0,0,1368,1380,5,190,0,0,1369,1380,5,191,0,0,
+ 1370,1380,5,192,0,0,1371,1372,5,90,0,0,1372,1380,5,183,0,0,1373,1374,5,
+ 90,0,0,1374,1380,5,184,0,0,1375,1376,5,90,0,0,1376,1380,5,185,0,0,1377,
+ 1378,5,90,0,0,1378,1380,5,186,0,0,1379,1358,1,0,0,0,1379,1359,1,0,0,0,
+ 1379,1360,1,0,0,0,1379,1361,1,0,0,0,1379,1362,1,0,0,0,1379,1363,1,0,0,
+ 0,1379,1364,1,0,0,0,1379,1365,1,0,0,0,1379,1366,1,0,0,0,1379,1367,1,0,
+ 0,0,1379,1368,1,0,0,0,1379,1369,1,0,0,0,1379,1370,1,0,0,0,1379,1371,1,
+ 0,0,0,1379,1373,1,0,0,0,1379,1375,1,0,0,0,1379,1377,1,0,0,0,1380,167,1,
+ 0,0,0,1381,1392,1,0,0,0,1382,1392,5,176,0,0,1383,1392,3,32,16,0,1384,1385,
+ 3,32,16,0,1385,1386,5,176,0,0,1386,1387,3,32,16,0,1387,1392,1,0,0,0,1388,
+ 1389,3,32,16,0,1389,1390,5,176,0,0,1390,1392,1,0,0,0,1391,1381,1,0,0,0,
+ 1391,1382,1,0,0,0,1391,1383,1,0,0,0,1391,1384,1,0,0,0,1391,1388,1,0,0,
+ 0,1392,169,1,0,0,0,1393,1394,5,1,0,0,1394,1395,5,193,0,0,1395,171,1,0,
+ 0,0,1396,1400,5,1,0,0,1397,1398,5,90,0,0,1398,1401,5,193,0,0,1399,1401,
+ 5,194,0,0,1400,1397,1,0,0,0,1400,1399,1,0,0,0,1401,173,1,0,0,0,1402,1403,
+ 5,293,0,0,1403,1404,3,188,94,0,1404,1405,3,146,73,0,1405,1406,5,30,0,0,
+ 1406,1407,3,180,90,0,1407,1408,5,31,0,0,1408,1450,1,0,0,0,1409,1410,5,
+ 293,0,0,1410,1411,3,188,94,0,1411,1412,3,146,73,0,1412,1413,5,36,0,0,1413,
+ 1414,5,17,0,0,1414,1415,3,52,26,0,1415,1416,5,18,0,0,1416,1450,1,0,0,0,
+ 1417,1418,5,293,0,0,1418,1419,3,188,94,0,1419,1420,3,146,73,0,1420,1450,
+ 1,0,0,0,1421,1422,5,294,0,0,1422,1423,3,188,94,0,1423,1425,5,36,0,0,1424,
+ 1426,5,84,0,0,1425,1424,1,0,0,0,1425,1426,1,0,0,0,1426,1427,1,0,0,0,1427,
+ 1428,5,30,0,0,1428,1429,3,312,156,0,1429,1430,5,31,0,0,1430,1450,1,0,0,
+ 0,1431,1432,5,294,0,0,1432,1433,3,188,94,0,1433,1434,5,84,0,0,1434,1435,
+ 5,30,0,0,1435,1436,3,312,156,0,1436,1437,5,31,0,0,1437,1450,1,0,0,0,1438,
+ 1439,5,294,0,0,1439,1440,3,188,94,0,1440,1441,3,6,3,0,1441,1450,1,0,0,
+ 0,1442,1443,5,294,0,0,1443,1444,3,188,94,0,1444,1445,5,36,0,0,1445,1446,
+ 5,17,0,0,1446,1447,3,176,88,0,1447,1448,5,18,0,0,1448,1450,1,0,0,0,1449,
+ 1402,1,0,0,0,1449,1409,1,0,0,0,1449,1417,1,0,0,0,1449,1421,1,0,0,0,1449,
+ 1431,1,0,0,0,1449,1438,1,0,0,0,1449,1442,1,0,0,0,1450,175,1,0,0,0,1451,
+ 1462,1,0,0,0,1452,1453,3,178,89,0,1453,1454,5,28,0,0,1454,1456,1,0,0,0,
+ 1455,1452,1,0,0,0,1456,1459,1,0,0,0,1457,1455,1,0,0,0,1457,1458,1,0,0,
+ 0,1458,1460,1,0,0,0,1459,1457,1,0,0,0,1460,1462,3,178,89,0,1461,1451,1,
+ 0,0,0,1461,1457,1,0,0,0,1462,177,1,0,0,0,1463,1464,5,39,0,0,1464,1465,
+ 5,263,0,0,1465,1466,5,36,0,0,1466,1467,5,17,0,0,1467,1468,3,56,28,0,1468,
+ 1469,5,18,0,0,1469,1477,1,0,0,0,1470,1471,3,146,73,0,1471,1472,5,36,0,
+ 0,1472,1473,5,17,0,0,1473,1474,3,56,28,0,1474,1475,5,18,0,0,1475,1477,
+ 1,0,0,0,1476,1463,1,0,0,0,1476,1470,1,0,0,0,1477,179,1,0,0,0,1478,1479,
+ 3,182,91,0,1479,1480,5,28,0,0,1480,1482,1,0,0,0,1481,1478,1,0,0,0,1482,
+ 1485,1,0,0,0,1483,1481,1,0,0,0,1483,1484,1,0,0,0,1484,1486,1,0,0,0,1485,
+ 1483,1,0,0,0,1486,1487,3,182,91,0,1487,181,1,0,0,0,1488,1489,3,6,3,0,1489,
+ 1490,5,36,0,0,1490,1491,3,186,93,0,1491,183,1,0,0,0,1492,1493,7,8,0,0,
+ 1493,185,1,0,0,0,1494,1529,3,184,92,0,1495,1529,3,32,16,0,1496,1497,5,
+ 185,0,0,1497,1498,5,30,0,0,1498,1499,3,32,16,0,1499,1500,5,31,0,0,1500,
+ 1529,1,0,0,0,1501,1529,3,6,3,0,1502,1503,3,138,69,0,1503,1504,5,30,0,0,
+ 1504,1505,5,183,0,0,1505,1506,5,75,0,0,1506,1507,3,32,16,0,1507,1508,5,
+ 31,0,0,1508,1529,1,0,0,0,1509,1510,3,138,69,0,1510,1511,5,30,0,0,1511,
+ 1512,5,184,0,0,1512,1513,5,75,0,0,1513,1514,3,32,16,0,1514,1515,5,31,0,
+ 0,1515,1529,1,0,0,0,1516,1517,3,138,69,0,1517,1518,5,30,0,0,1518,1519,
+ 5,185,0,0,1519,1520,5,75,0,0,1520,1521,3,32,16,0,1521,1522,5,31,0,0,1522,
+ 1529,1,0,0,0,1523,1524,3,138,69,0,1524,1525,5,30,0,0,1525,1526,3,32,16,
+ 0,1526,1527,5,31,0,0,1527,1529,1,0,0,0,1528,1494,1,0,0,0,1528,1495,1,0,
+ 0,0,1528,1496,1,0,0,0,1528,1501,1,0,0,0,1528,1502,1,0,0,0,1528,1509,1,
+ 0,0,0,1528,1516,1,0,0,0,1528,1523,1,0,0,0,1529,187,1,0,0,0,1530,1531,7,
+ 9,0,0,1531,189,1,0,0,0,1532,1533,3,192,96,0,1533,1534,3,160,80,0,1534,
+ 1535,3,146,73,0,1535,1536,5,175,0,0,1536,1538,3,264,132,0,1537,1539,3,
+ 130,65,0,1538,1537,1,0,0,0,1538,1539,1,0,0,0,1539,1540,1,0,0,0,1540,1541,
+ 3,134,67,0,1541,1567,1,0,0,0,1542,1543,3,192,96,0,1543,1544,3,160,80,0,
+ 1544,1545,3,146,73,0,1545,1546,5,175,0,0,1546,1547,3,264,132,0,1547,1548,
+ 3,218,109,0,1548,1549,3,134,67,0,1549,1567,1,0,0,0,1550,1551,3,192,96,
+ 0,1551,1552,3,160,80,0,1552,1554,3,264,132,0,1553,1555,3,130,65,0,1554,
+ 1553,1,0,0,0,1554,1555,1,0,0,0,1555,1556,1,0,0,0,1556,1557,3,134,67,0,
+ 1557,1567,1,0,0,0,1558,1559,3,192,96,0,1559,1560,3,160,80,0,1560,1561,
+ 3,264,132,0,1561,1562,3,218,109,0,1562,1563,3,134,67,0,1563,1567,1,0,0,
+ 0,1564,1567,3,196,98,0,1565,1567,3,2,1,0,1566,1532,1,0,0,0,1566,1542,1,
+ 0,0,0,1566,1550,1,0,0,0,1566,1558,1,0,0,0,1566,1564,1,0,0,0,1566,1565,
+ 1,0,0,0,1567,191,1,0,0,0,1568,1569,5,242,0,0,1569,1579,3,192,96,0,1570,
+ 1571,5,243,0,0,1571,1579,3,192,96,0,1572,1579,3,194,97,0,1573,1574,5,112,
+ 0,0,1574,1575,5,30,0,0,1575,1576,3,32,16,0,1576,1577,5,31,0,0,1577,1579,
+ 1,0,0,0,1578,1568,1,0,0,0,1578,1570,1,0,0,0,1578,1572,1,0,0,0,1578,1573,
+ 1,0,0,0,1579,193,1,0,0,0,1580,1593,1,0,0,0,1581,1593,5,244,0,0,1582,1593,
+ 5,245,0,0,1583,1584,5,246,0,0,1584,1593,5,247,0,0,1585,1586,5,246,0,0,
+ 1586,1593,5,248,0,0,1587,1588,5,246,0,0,1588,1593,5,249,0,0,1589,1590,
+ 5,246,0,0,1590,1593,5,250,0,0,1591,1593,5,246,0,0,1592,1580,1,0,0,0,1592,
+ 1581,1,0,0,0,1592,1582,1,0,0,0,1592,1583,1,0,0,0,1592,1585,1,0,0,0,1592,
+ 1587,1,0,0,0,1592,1589,1,0,0,0,1592,1591,1,0,0,0,1593,195,1,0,0,0,1594,
+ 1595,5,113,0,0,1595,1596,5,30,0,0,1596,1597,3,32,16,0,1597,1598,5,31,0,
+ 0,1598,197,1,0,0,0,1599,1600,5,225,0,0,1600,1605,3,190,95,0,1601,1602,
+ 5,37,0,0,1602,1605,3,200,100,0,1603,1605,3,196,98,0,1604,1599,1,0,0,0,
+ 1604,1601,1,0,0,0,1604,1603,1,0,0,0,1605,199,1,0,0,0,1606,1607,3,160,80,
+ 0,1607,1608,3,146,73,0,1608,1609,5,175,0,0,1609,1610,3,2,1,0,1610,1616,
+ 1,0,0,0,1611,1612,3,160,80,0,1612,1613,3,2,1,0,1613,1616,1,0,0,0,1614,
+ 1616,3,2,1,0,1615,1606,1,0,0,0,1615,1611,1,0,0,0,1615,1614,1,0,0,0,1616,
+ 201,1,0,0,0,1617,1618,3,146,73,0,1618,1619,5,28,0,0,1619,1621,1,0,0,0,
+ 1620,1617,1,0,0,0,1621,1624,1,0,0,0,1622,1620,1,0,0,0,1622,1623,1,0,0,
+ 0,1623,1625,1,0,0,0,1624,1622,1,0,0,0,1625,1626,3,146,73,0,1626,203,1,
+ 0,0,0,1627,1633,1,0,0,0,1628,1629,5,86,0,0,1629,1630,3,212,106,0,1630,
+ 1631,5,87,0,0,1631,1633,1,0,0,0,1632,1627,1,0,0,0,1632,1628,1,0,0,0,1633,
+ 205,1,0,0,0,1634,1646,5,265,0,0,1635,1646,5,114,0,0,1636,1646,5,39,0,0,
+ 1637,1646,5,199,0,0,1638,1646,5,115,0,0,1639,1646,5,116,0,0,1640,1641,
+ 5,70,0,0,1641,1642,5,30,0,0,1642,1643,3,32,16,0,1643,1644,5,31,0,0,1644,
+ 1646,1,0,0,0,1645,1634,1,0,0,0,1645,1635,1,0,0,0,1645,1636,1,0,0,0,1645,
+ 1637,1,0,0,0,1645,1638,1,0,0,0,1645,1639,1,0,0,0,1645,1640,1,0,0,0,1646,
+ 207,1,0,0,0,1647,1649,3,206,103,0,1648,1647,1,0,0,0,1649,1652,1,0,0,0,
+ 1650,1648,1,0,0,0,1650,1651,1,0,0,0,1651,209,1,0,0,0,1652,1650,1,0,0,0,
+ 1653,1655,3,208,104,0,1654,1656,3,214,107,0,1655,1654,1,0,0,0,1655,1656,
+ 1,0,0,0,1656,1657,1,0,0,0,1657,1658,3,2,1,0,1658,211,1,0,0,0,1659,1660,
+ 3,210,105,0,1660,1661,5,28,0,0,1661,1663,1,0,0,0,1662,1659,1,0,0,0,1663,
+ 1666,1,0,0,0,1664,1662,1,0,0,0,1664,1665,1,0,0,0,1665,1667,1,0,0,0,1666,
+ 1664,1,0,0,0,1667,1668,3,210,105,0,1668,213,1,0,0,0,1669,1670,5,30,0,0,
+ 1670,1671,3,202,101,0,1671,1672,5,31,0,0,1672,215,1,0,0,0,1673,1676,1,
+ 0,0,0,1674,1676,3,218,109,0,1675,1673,1,0,0,0,1675,1674,1,0,0,0,1676,217,
+ 1,0,0,0,1677,1678,5,86,0,0,1678,1679,5,42,0,0,1679,1680,3,32,16,0,1680,
+ 1681,5,43,0,0,1681,1682,5,87,0,0,1682,219,1,0,0,0,1683,1684,3,256,128,
+ 0,1684,1685,5,17,0,0,1685,1686,3,268,134,0,1686,1687,5,18,0,0,1687,1800,
+ 1,0,0,0,1688,1689,3,74,37,0,1689,1690,5,17,0,0,1690,1691,3,82,41,0,1691,
+ 1692,5,18,0,0,1692,1800,1,0,0,0,1693,1694,3,232,116,0,1694,1695,5,17,0,
+ 0,1695,1696,3,236,118,0,1696,1697,5,18,0,0,1697,1800,1,0,0,0,1698,1699,
+ 3,240,120,0,1699,1700,5,17,0,0,1700,1701,3,244,122,0,1701,1702,5,18,0,
+ 0,1702,1800,1,0,0,0,1703,1800,3,222,111,0,1704,1800,3,296,148,0,1705,1800,
+ 3,174,87,0,1706,1800,3,88,44,0,1707,1800,3,342,171,0,1708,1709,5,117,0,
+ 0,1709,1800,3,32,16,0,1710,1711,5,118,0,0,1711,1800,3,32,16,0,1712,1713,
+ 3,354,177,0,1713,1714,5,17,0,0,1714,1715,3,358,179,0,1715,1716,5,18,0,
+ 0,1716,1800,1,0,0,0,1717,1718,5,301,0,0,1718,1719,3,146,73,0,1719,1720,
+ 5,175,0,0,1720,1721,3,264,132,0,1721,1722,5,119,0,0,1722,1723,3,192,96,
+ 0,1723,1724,3,160,80,0,1724,1725,3,146,73,0,1725,1726,5,175,0,0,1726,1727,
+ 3,264,132,0,1727,1728,3,134,67,0,1728,1800,1,0,0,0,1729,1730,5,301,0,0,
+ 1730,1731,5,225,0,0,1731,1732,3,192,96,0,1732,1733,3,160,80,0,1733,1734,
+ 3,146,73,0,1734,1735,5,175,0,0,1735,1736,3,264,132,0,1736,1737,3,216,108,
+ 0,1737,1738,3,134,67,0,1738,1739,5,119,0,0,1739,1740,5,225,0,0,1740,1741,
+ 3,192,96,0,1741,1742,3,160,80,0,1742,1743,3,146,73,0,1743,1744,5,175,0,
+ 0,1744,1745,3,264,132,0,1745,1746,3,216,108,0,1746,1747,3,134,67,0,1747,
+ 1800,1,0,0,0,1748,1800,3,26,13,0,1749,1800,3,40,20,0,1750,1751,5,254,0,
+ 0,1751,1752,5,195,0,0,1752,1753,5,42,0,0,1753,1754,3,32,16,0,1754,1758,
+ 5,43,0,0,1755,1757,3,342,171,0,1756,1755,1,0,0,0,1757,1760,1,0,0,0,1758,
+ 1756,1,0,0,0,1758,1759,1,0,0,0,1759,1800,1,0,0,0,1760,1758,1,0,0,0,1761,
+ 1762,5,254,0,0,1762,1763,5,195,0,0,1763,1767,3,2,1,0,1764,1766,3,342,171,
+ 0,1765,1764,1,0,0,0,1766,1769,1,0,0,0,1767,1765,1,0,0,0,1767,1768,1,0,
+ 0,0,1768,1800,1,0,0,0,1769,1767,1,0,0,0,1770,1771,5,254,0,0,1771,1772,
+ 5,255,0,0,1772,1773,5,42,0,0,1773,1774,3,32,16,0,1774,1775,5,43,0,0,1775,
+ 1776,5,28,0,0,1776,1780,3,146,73,0,1777,1779,3,342,171,0,1778,1777,1,0,
+ 0,0,1779,1782,1,0,0,0,1780,1778,1,0,0,0,1780,1781,1,0,0,0,1781,1800,1,
+ 0,0,0,1782,1780,1,0,0,0,1783,1784,5,254,0,0,1784,1785,5,255,0,0,1785,1786,
+ 3,2,1,0,1786,1787,5,28,0,0,1787,1791,3,146,73,0,1788,1790,3,342,171,0,
+ 1789,1788,1,0,0,0,1790,1793,1,0,0,0,1791,1789,1,0,0,0,1791,1792,1,0,0,
+ 0,1792,1800,1,0,0,0,1793,1791,1,0,0,0,1794,1795,5,120,0,0,1795,1796,5,
+ 195,0,0,1796,1797,3,146,73,0,1797,1798,3,44,22,0,1798,1800,1,0,0,0,1799,
+ 1683,1,0,0,0,1799,1688,1,0,0,0,1799,1693,1,0,0,0,1799,1698,1,0,0,0,1799,
+ 1703,1,0,0,0,1799,1704,1,0,0,0,1799,1705,1,0,0,0,1799,1706,1,0,0,0,1799,
+ 1707,1,0,0,0,1799,1708,1,0,0,0,1799,1710,1,0,0,0,1799,1712,1,0,0,0,1799,
+ 1717,1,0,0,0,1799,1729,1,0,0,0,1799,1748,1,0,0,0,1799,1749,1,0,0,0,1799,
+ 1750,1,0,0,0,1799,1761,1,0,0,0,1799,1770,1,0,0,0,1799,1783,1,0,0,0,1799,
+ 1794,1,0,0,0,1800,221,1,0,0,0,1801,1802,5,121,0,0,1802,1811,3,230,115,
+ 0,1803,1810,3,224,112,0,1804,1805,5,122,0,0,1805,1806,5,30,0,0,1806,1807,
+ 3,250,125,0,1807,1808,5,31,0,0,1808,1810,1,0,0,0,1809,1803,1,0,0,0,1809,
+ 1804,1,0,0,0,1810,1813,1,0,0,0,1811,1809,1,0,0,0,1811,1812,1,0,0,0,1812,
+ 1814,1,0,0,0,1813,1811,1,0,0,0,1814,1815,3,160,80,0,1815,1816,3,2,1,0,
+ 1816,1817,3,226,113,0,1817,1818,3,228,114,0,1818,223,1,0,0,0,1819,1839,
+ 5,123,0,0,1820,1839,5,51,0,0,1821,1839,5,52,0,0,1822,1839,5,63,0,0,1823,
+ 1839,5,124,0,0,1824,1839,5,69,0,0,1825,1839,5,68,0,0,1826,1839,5,64,0,
+ 0,1827,1839,5,65,0,0,1828,1839,5,66,0,0,1829,1839,5,125,0,0,1830,1839,
+ 5,126,0,0,1831,1839,5,127,0,0,1832,1839,5,16,0,0,1833,1834,5,70,0,0,1834,
+ 1835,5,30,0,0,1835,1836,3,32,16,0,1836,1837,5,31,0,0,1837,1839,1,0,0,0,
+ 1838,1819,1,0,0,0,1838,1820,1,0,0,0,1838,1821,1,0,0,0,1838,1822,1,0,0,
+ 0,1838,1823,1,0,0,0,1838,1824,1,0,0,0,1838,1825,1,0,0,0,1838,1826,1,0,
+ 0,0,1838,1827,1,0,0,0,1838,1828,1,0,0,0,1838,1829,1,0,0,0,1838,1830,1,
+ 0,0,0,1838,1831,1,0,0,0,1838,1832,1,0,0,0,1838,1833,1,0,0,0,1839,225,1,
+ 0,0,0,1840,1846,1,0,0,0,1841,1842,5,44,0,0,1842,1846,3,0,0,0,1843,1844,
+ 5,44,0,0,1844,1846,3,32,16,0,1845,1840,1,0,0,0,1845,1841,1,0,0,0,1845,
+ 1843,1,0,0,0,1846,227,1,0,0,0,1847,1851,1,0,0,0,1848,1849,5,36,0,0,1849,
+ 1851,3,316,158,0,1850,1847,1,0,0,0,1850,1848,1,0,0,0,1851,229,1,0,0,0,
+ 1852,1858,1,0,0,0,1853,1854,5,42,0,0,1854,1855,3,32,16,0,1855,1856,5,43,
+ 0,0,1856,1858,1,0,0,0,1857,1852,1,0,0,0,1857,1853,1,0,0,0,1858,231,1,0,
+ 0,0,1859,1863,5,128,0,0,1860,1862,3,234,117,0,1861,1860,1,0,0,0,1862,1865,
+ 1,0,0,0,1863,1861,1,0,0,0,1863,1864,1,0,0,0,1864,1866,1,0,0,0,1865,1863,
+ 1,0,0,0,1866,1867,3,146,73,0,1867,1868,3,2,1,0,1868,1878,1,0,0,0,1869,
+ 1873,5,128,0,0,1870,1872,3,234,117,0,1871,1870,1,0,0,0,1872,1875,1,0,0,
+ 0,1873,1871,1,0,0,0,1873,1874,1,0,0,0,1874,1876,1,0,0,0,1875,1873,1,0,
+ 0,0,1876,1878,3,2,1,0,1877,1859,1,0,0,0,1877,1869,1,0,0,0,1878,233,1,0,
+ 0,0,1879,1880,7,10,0,0,1880,235,1,0,0,0,1881,1883,3,238,119,0,1882,1881,
+ 1,0,0,0,1883,1886,1,0,0,0,1884,1882,1,0,0,0,1884,1885,1,0,0,0,1885,237,
+ 1,0,0,0,1886,1884,1,0,0,0,1887,1888,5,129,0,0,1888,1900,3,190,95,0,1889,
+ 1890,5,130,0,0,1890,1900,3,190,95,0,1891,1892,5,131,0,0,1892,1900,3,190,
+ 95,0,1893,1894,5,132,0,0,1894,1900,3,190,95,0,1895,1900,3,88,44,0,1896,
+ 1900,3,342,171,0,1897,1900,3,26,13,0,1898,1900,3,40,20,0,1899,1887,1,0,
+ 0,0,1899,1889,1,0,0,0,1899,1891,1,0,0,0,1899,1893,1,0,0,0,1899,1895,1,
+ 0,0,0,1899,1896,1,0,0,0,1899,1897,1,0,0,0,1899,1898,1,0,0,0,1900,239,1,
+ 0,0,0,1901,1905,5,133,0,0,1902,1904,3,242,121,0,1903,1902,1,0,0,0,1904,
+ 1907,1,0,0,0,1905,1903,1,0,0,0,1905,1906,1,0,0,0,1906,1908,1,0,0,0,1907,
+ 1905,1,0,0,0,1908,1909,3,192,96,0,1909,1910,3,160,80,0,1910,1911,3,2,1,
+ 0,1911,1912,3,134,67,0,1912,1913,3,228,114,0,1913,241,1,0,0,0,1914,1915,
+ 7,10,0,0,1915,243,1,0,0,0,1916,1918,3,246,123,0,1917,1916,1,0,0,0,1918,
+ 1921,1,0,0,0,1919,1917,1,0,0,0,1919,1920,1,0,0,0,1920,245,1,0,0,0,1921,
+ 1919,1,0,0,0,1922,1923,5,134,0,0,1923,1933,3,190,95,0,1924,1925,5,135,
+ 0,0,1925,1933,3,190,95,0,1926,1927,5,132,0,0,1927,1933,3,190,95,0,1928,
+ 1933,3,342,171,0,1929,1933,3,88,44,0,1930,1933,3,26,13,0,1931,1933,3,40,
+ 20,0,1932,1922,1,0,0,0,1932,1924,1,0,0,0,1932,1926,1,0,0,0,1932,1928,1,
+ 0,0,0,1932,1929,1,0,0,0,1932,1930,1,0,0,0,1932,1931,1,0,0,0,1933,247,1,
+ 0,0,0,1934,1941,1,0,0,0,1935,1936,5,122,0,0,1936,1937,5,30,0,0,1937,1938,
+ 3,250,125,0,1938,1939,5,31,0,0,1939,1941,1,0,0,0,1940,1934,1,0,0,0,1940,
+ 1935,1,0,0,0,1941,249,1,0,0,0,1942,1952,3,148,74,0,1943,1945,5,17,0,0,
+ 1944,1946,3,314,157,0,1945,1944,1,0,0,0,1946,1947,1,0,0,0,1947,1945,1,
+ 0,0,0,1947,1948,1,0,0,0,1948,1949,1,0,0,0,1949,1950,5,18,0,0,1950,1952,
+ 1,0,0,0,1951,1942,1,0,0,0,1951,1943,1,0,0,0,1952,251,1,0,0,0,1953,1955,
+ 3,254,127,0,1954,1953,1,0,0,0,1955,1958,1,0,0,0,1956,1954,1,0,0,0,1956,
+ 1957,1,0,0,0,1957,253,1,0,0,0,1958,1956,1,0,0,0,1959,1960,5,42,0,0,1960,
+ 1961,5,136,0,0,1961,1973,5,43,0,0,1962,1963,5,42,0,0,1963,1964,5,137,0,
+ 0,1964,1973,5,43,0,0,1965,1966,5,42,0,0,1966,1967,5,138,0,0,1967,1973,
+ 5,43,0,0,1968,1969,5,42,0,0,1969,1970,3,32,16,0,1970,1971,5,43,0,0,1971,
+ 1973,1,0,0,0,1972,1959,1,0,0,0,1972,1962,1,0,0,0,1972,1965,1,0,0,0,1972,
+ 1968,1,0,0,0,1973,255,1,0,0,0,1974,1979,5,139,0,0,1975,1978,3,258,129,
+ 0,1976,1978,3,260,130,0,1977,1975,1,0,0,0,1977,1976,1,0,0,0,1978,1981,
+ 1,0,0,0,1979,1977,1,0,0,0,1979,1980,1,0,0,0,1980,1982,1,0,0,0,1981,1979,
+ 1,0,0,0,1982,1983,3,192,96,0,1983,1984,3,252,126,0,1984,1985,3,160,80,
+ 0,1985,1986,3,248,124,0,1986,1987,3,264,132,0,1987,1988,3,204,102,0,1988,
+ 1992,3,134,67,0,1989,1991,3,266,133,0,1990,1989,1,0,0,0,1991,1994,1,0,
+ 0,0,1992,1990,1,0,0,0,1992,1993,1,0,0,0,1993,257,1,0,0,0,1994,1992,1,0,
+ 0,0,1995,2019,5,123,0,0,1996,2019,5,51,0,0,1997,2019,5,52,0,0,1998,2019,
+ 5,63,0,0,1999,2019,5,140,0,0,2000,2019,5,68,0,0,2001,2019,5,141,0,0,2002,
+ 2019,5,142,0,0,2003,2019,5,54,0,0,2004,2019,5,64,0,0,2005,2019,5,65,0,
+ 0,2006,2019,5,66,0,0,2007,2019,5,125,0,0,2008,2019,5,143,0,0,2009,2019,
+ 5,144,0,0,2010,2019,5,69,0,0,2011,2019,5,145,0,0,2012,2019,5,146,0,0,2013,
+ 2014,5,70,0,0,2014,2015,5,30,0,0,2015,2016,3,32,16,0,2016,2017,5,31,0,
+ 0,2017,2019,1,0,0,0,2018,1995,1,0,0,0,2018,1996,1,0,0,0,2018,1997,1,0,
+ 0,0,2018,1998,1,0,0,0,2018,1999,1,0,0,0,2018,2000,1,0,0,0,2018,2001,1,
+ 0,0,0,2018,2002,1,0,0,0,2018,2003,1,0,0,0,2018,2004,1,0,0,0,2018,2005,
+ 1,0,0,0,2018,2006,1,0,0,0,2018,2007,1,0,0,0,2018,2008,1,0,0,0,2018,2009,
+ 1,0,0,0,2018,2010,1,0,0,0,2018,2011,1,0,0,0,2018,2012,1,0,0,0,2018,2013,
+ 1,0,0,0,2019,259,1,0,0,0,2020,2021,5,147,0,0,2021,2027,5,30,0,0,2022,2025,
+ 3,6,3,0,2023,2024,5,34,0,0,2024,2026,3,6,3,0,2025,2023,1,0,0,0,2025,2026,
+ 1,0,0,0,2026,2028,1,0,0,0,2027,2022,1,0,0,0,2027,2028,1,0,0,0,2028,2032,
+ 1,0,0,0,2029,2031,3,262,131,0,2030,2029,1,0,0,0,2031,2034,1,0,0,0,2032,
+ 2030,1,0,0,0,2032,2033,1,0,0,0,2033,2035,1,0,0,0,2034,2032,1,0,0,0,2035,
+ 2039,5,31,0,0,2036,2037,5,147,0,0,2037,2039,5,85,0,0,2038,2020,1,0,0,0,
+ 2038,2036,1,0,0,0,2039,261,1,0,0,0,2040,2068,5,148,0,0,2041,2068,5,223,
+ 0,0,2042,2068,5,57,0,0,2043,2068,5,58,0,0,2044,2068,5,149,0,0,2045,2068,
+ 5,150,0,0,2046,2068,5,247,0,0,2047,2068,5,248,0,0,2048,2068,5,249,0,0,
+ 2049,2068,5,250,0,0,2050,2051,5,151,0,0,2051,2052,5,75,0,0,2052,2068,5,
+ 152,0,0,2053,2054,5,151,0,0,2054,2055,5,75,0,0,2055,2068,5,153,0,0,2056,
+ 2057,5,154,0,0,2057,2058,5,75,0,0,2058,2068,5,152,0,0,2059,2060,5,154,
+ 0,0,2060,2061,5,75,0,0,2061,2068,5,153,0,0,2062,2063,5,70,0,0,2063,2064,
+ 5,30,0,0,2064,2065,3,32,16,0,2065,2066,5,31,0,0,2066,2068,1,0,0,0,2067,
+ 2040,1,0,0,0,2067,2041,1,0,0,0,2067,2042,1,0,0,0,2067,2043,1,0,0,0,2067,
+ 2044,1,0,0,0,2067,2045,1,0,0,0,2067,2046,1,0,0,0,2067,2047,1,0,0,0,2067,
+ 2048,1,0,0,0,2067,2049,1,0,0,0,2067,2050,1,0,0,0,2067,2053,1,0,0,0,2067,
+ 2056,1,0,0,0,2067,2059,1,0,0,0,2067,2062,1,0,0,0,2068,263,1,0,0,0,2069,
+ 2073,5,116,0,0,2070,2073,5,155,0,0,2071,2073,3,2,1,0,2072,2069,1,0,0,0,
+ 2072,2070,1,0,0,0,2072,2071,1,0,0,0,2073,265,1,0,0,0,2074,2096,5,1,0,0,
+ 2075,2096,5,2,0,0,2076,2096,5,156,0,0,2077,2096,5,3,0,0,2078,2096,5,4,
+ 0,0,2079,2096,5,246,0,0,2080,2096,5,5,0,0,2081,2096,5,6,0,0,2082,2096,
+ 5,7,0,0,2083,2096,5,8,0,0,2084,2096,5,9,0,0,2085,2096,5,10,0,0,2086,2096,
+ 5,11,0,0,2087,2096,5,12,0,0,2088,2096,5,13,0,0,2089,2096,5,14,0,0,2090,
+ 2091,5,70,0,0,2091,2092,5,30,0,0,2092,2093,3,32,16,0,2093,2094,5,31,0,
+ 0,2094,2096,1,0,0,0,2095,2074,1,0,0,0,2095,2075,1,0,0,0,2095,2076,1,0,
+ 0,0,2095,2077,1,0,0,0,2095,2078,1,0,0,0,2095,2079,1,0,0,0,2095,2080,1,
+ 0,0,0,2095,2081,1,0,0,0,2095,2082,1,0,0,0,2095,2083,1,0,0,0,2095,2084,
+ 1,0,0,0,2095,2085,1,0,0,0,2095,2086,1,0,0,0,2095,2087,1,0,0,0,2095,2088,
+ 1,0,0,0,2095,2089,1,0,0,0,2095,2090,1,0,0,0,2096,267,1,0,0,0,2097,2099,
+ 3,270,135,0,2098,2097,1,0,0,0,2099,2102,1,0,0,0,2100,2098,1,0,0,0,2100,
+ 2101,1,0,0,0,2101,269,1,0,0,0,2102,2100,1,0,0,0,2103,2212,3,126,63,0,2104,
+ 2105,5,295,0,0,2105,2212,3,32,16,0,2106,2212,3,278,139,0,2107,2108,5,296,
+ 0,0,2108,2212,3,32,16,0,2109,2110,5,299,0,0,2110,2212,3,134,67,0,2111,
+ 2112,5,299,0,0,2112,2113,5,157,0,0,2113,2212,3,134,67,0,2114,2212,5,297,
+ 0,0,2115,2212,5,298,0,0,2116,2212,3,296,148,0,2117,2212,3,272,136,0,2118,
+ 2212,3,174,87,0,2119,2212,3,88,44,0,2120,2212,3,26,13,0,2121,2212,3,274,
+ 137,0,2122,2212,3,40,20,0,2123,2124,5,300,0,0,2124,2125,5,42,0,0,2125,
+ 2126,3,32,16,0,2126,2127,5,43,0,0,2127,2212,1,0,0,0,2128,2129,5,300,0,
+ 0,2129,2130,5,42,0,0,2130,2131,3,32,16,0,2131,2132,5,43,0,0,2132,2133,
+ 5,34,0,0,2133,2134,3,0,0,0,2134,2212,1,0,0,0,2135,2136,5,302,0,0,2136,
+ 2137,3,32,16,0,2137,2138,5,75,0,0,2138,2139,3,32,16,0,2139,2212,1,0,0,
+ 0,2140,2141,5,301,0,0,2141,2142,3,146,73,0,2142,2143,5,175,0,0,2143,2144,
+ 3,264,132,0,2144,2212,1,0,0,0,2145,2146,5,301,0,0,2146,2147,5,225,0,0,
+ 2147,2148,3,192,96,0,2148,2149,3,160,80,0,2149,2150,3,146,73,0,2150,2151,
+ 5,175,0,0,2151,2152,3,264,132,0,2152,2153,3,216,108,0,2153,2154,3,134,
+ 67,0,2154,2212,1,0,0,0,2155,2212,3,276,138,0,2156,2157,5,254,0,0,2157,
+ 2158,5,195,0,0,2158,2159,5,42,0,0,2159,2160,3,32,16,0,2160,2164,5,43,0,
+ 0,2161,2163,3,342,171,0,2162,2161,1,0,0,0,2163,2166,1,0,0,0,2164,2162,
+ 1,0,0,0,2164,2165,1,0,0,0,2165,2212,1,0,0,0,2166,2164,1,0,0,0,2167,2168,
+ 5,254,0,0,2168,2169,5,195,0,0,2169,2173,3,2,1,0,2170,2172,3,342,171,0,
+ 2171,2170,1,0,0,0,2172,2175,1,0,0,0,2173,2171,1,0,0,0,2173,2174,1,0,0,
+ 0,2174,2212,1,0,0,0,2175,2173,1,0,0,0,2176,2177,5,254,0,0,2177,2178,5,
+ 255,0,0,2178,2179,5,42,0,0,2179,2180,3,32,16,0,2180,2181,5,43,0,0,2181,
+ 2182,5,28,0,0,2182,2186,3,146,73,0,2183,2185,3,342,171,0,2184,2183,1,0,
+ 0,0,2185,2188,1,0,0,0,2186,2184,1,0,0,0,2186,2187,1,0,0,0,2187,2212,1,
+ 0,0,0,2188,2186,1,0,0,0,2189,2190,5,254,0,0,2190,2191,5,255,0,0,2191,2192,
+ 3,2,1,0,2192,2193,5,28,0,0,2193,2197,3,146,73,0,2194,2196,3,342,171,0,
+ 2195,2194,1,0,0,0,2196,2199,1,0,0,0,2197,2195,1,0,0,0,2197,2198,1,0,0,
+ 0,2198,2212,1,0,0,0,2199,2197,1,0,0,0,2200,2201,5,254,0,0,2201,2202,5,
+ 42,0,0,2202,2203,3,32,16,0,2203,2204,5,43,0,0,2204,2208,3,228,114,0,2205,
+ 2207,3,342,171,0,2206,2205,1,0,0,0,2207,2210,1,0,0,0,2208,2206,1,0,0,0,
+ 2208,2209,1,0,0,0,2209,2212,1,0,0,0,2210,2208,1,0,0,0,2211,2103,1,0,0,
+ 0,2211,2104,1,0,0,0,2211,2106,1,0,0,0,2211,2107,1,0,0,0,2211,2109,1,0,
+ 0,0,2211,2111,1,0,0,0,2211,2114,1,0,0,0,2211,2115,1,0,0,0,2211,2116,1,
+ 0,0,0,2211,2117,1,0,0,0,2211,2118,1,0,0,0,2211,2119,1,0,0,0,2211,2120,
+ 1,0,0,0,2211,2121,1,0,0,0,2211,2122,1,0,0,0,2211,2123,1,0,0,0,2211,2128,
+ 1,0,0,0,2211,2135,1,0,0,0,2211,2140,1,0,0,0,2211,2145,1,0,0,0,2211,2155,
+ 1,0,0,0,2211,2156,1,0,0,0,2211,2167,1,0,0,0,2211,2176,1,0,0,0,2211,2189,
+ 1,0,0,0,2211,2200,1,0,0,0,2212,271,1,0,0,0,2213,2214,3,0,0,0,2214,2215,
+ 5,75,0,0,2215,273,1,0,0,0,2216,2219,3,44,22,0,2217,2219,3,46,23,0,2218,
+ 2216,1,0,0,0,2218,2217,1,0,0,0,2219,275,1,0,0,0,2220,2221,5,17,0,0,2221,
+ 2222,3,268,134,0,2222,2223,5,18,0,0,2223,277,1,0,0,0,2224,2225,3,282,141,
+ 0,2225,2226,3,280,140,0,2226,279,1,0,0,0,2227,2229,3,284,142,0,2228,2227,
+ 1,0,0,0,2229,2230,1,0,0,0,2230,2228,1,0,0,0,2230,2231,1,0,0,0,2231,281,
+ 1,0,0,0,2232,2233,5,158,0,0,2233,2245,3,276,138,0,2234,2235,5,158,0,0,
+ 2235,2236,3,0,0,0,2236,2237,5,159,0,0,2237,2238,3,0,0,0,2238,2245,1,0,
+ 0,0,2239,2240,5,158,0,0,2240,2241,3,32,16,0,2241,2242,5,159,0,0,2242,2243,
+ 3,32,16,0,2243,2245,1,0,0,0,2244,2232,1,0,0,0,2244,2234,1,0,0,0,2244,2239,
+ 1,0,0,0,2245,283,1,0,0,0,2246,2247,3,288,144,0,2247,2248,3,294,147,0,2248,
+ 2259,1,0,0,0,2249,2250,3,286,143,0,2250,2251,3,294,147,0,2251,2259,1,0,
+ 0,0,2252,2253,3,290,145,0,2253,2254,3,294,147,0,2254,2259,1,0,0,0,2255,
+ 2256,3,292,146,0,2256,2257,3,294,147,0,2257,2259,1,0,0,0,2258,2246,1,0,
+ 0,0,2258,2249,1,0,0,0,2258,2252,1,0,0,0,2258,2255,1,0,0,0,2259,285,1,0,
+ 0,0,2260,2261,5,160,0,0,2261,2267,3,276,138,0,2262,2263,5,160,0,0,2263,
+ 2267,3,0,0,0,2264,2265,5,160,0,0,2265,2267,3,32,16,0,2266,2260,1,0,0,0,
+ 2266,2262,1,0,0,0,2266,2264,1,0,0,0,2267,287,1,0,0,0,2268,2269,5,161,0,
+ 0,2269,2270,3,146,73,0,2270,289,1,0,0,0,2271,2272,5,162,0,0,2272,291,1,
+ 0,0,0,2273,2274,5,163,0,0,2274,293,1,0,0,0,2275,2287,3,276,138,0,2276,
+ 2277,5,164,0,0,2277,2278,3,0,0,0,2278,2279,5,159,0,0,2279,2280,3,0,0,0,
+ 2280,2287,1,0,0,0,2281,2282,5,164,0,0,2282,2283,3,32,16,0,2283,2284,5,
+ 159,0,0,2284,2285,3,32,16,0,2285,2287,1,0,0,0,2286,2275,1,0,0,0,2286,2276,
+ 1,0,0,0,2286,2281,1,0,0,0,2287,295,1,0,0,0,2288,2289,3,298,149,0,2289,
+ 2290,3,302,151,0,2290,297,1,0,0,0,2291,2292,5,165,0,0,2292,2293,3,300,
+ 150,0,2293,2294,3,0,0,0,2294,2295,5,36,0,0,2295,2299,1,0,0,0,2296,2297,
+ 5,165,0,0,2297,2299,3,300,150,0,2298,2291,1,0,0,0,2298,2296,1,0,0,0,2299,
+ 299,1,0,0,0,2300,2304,1,0,0,0,2301,2304,5,166,0,0,2302,2304,5,2,0,0,2303,
+ 2300,1,0,0,0,2303,2301,1,0,0,0,2303,2302,1,0,0,0,2304,301,1,0,0,0,2305,
+ 2306,5,17,0,0,2306,2307,3,304,152,0,2307,2308,5,18,0,0,2308,2315,1,0,0,
+ 0,2309,2311,3,308,154,0,2310,2309,1,0,0,0,2311,2312,1,0,0,0,2312,2310,
+ 1,0,0,0,2312,2313,1,0,0,0,2313,2315,1,0,0,0,2314,2305,1,0,0,0,2314,2310,
+ 1,0,0,0,2315,303,1,0,0,0,2316,2317,3,308,154,0,2317,2318,5,28,0,0,2318,
+ 2320,1,0,0,0,2319,2316,1,0,0,0,2320,2323,1,0,0,0,2321,2319,1,0,0,0,2321,
+ 2322,1,0,0,0,2322,2324,1,0,0,0,2323,2321,1,0,0,0,2324,2325,3,308,154,0,
+ 2325,305,1,0,0,0,2326,2332,1,0,0,0,2327,2328,5,42,0,0,2328,2329,3,32,16,
+ 0,2329,2330,5,43,0,0,2330,2332,1,0,0,0,2331,2326,1,0,0,0,2331,2327,1,0,
+ 0,0,2332,307,1,0,0,0,2333,2334,5,180,0,0,2334,2335,5,261,0,0,2335,2336,
+ 5,30,0,0,2336,2337,3,6,3,0,2337,2338,5,31,0,0,2338,2400,1,0,0,0,2339,2340,
+ 5,259,0,0,2340,2341,5,30,0,0,2341,2342,3,0,0,0,2342,2343,5,31,0,0,2343,
+ 2400,1,0,0,0,2344,2345,5,259,0,0,2345,2400,3,0,0,0,2346,2347,5,84,0,0,
+ 2347,2348,5,30,0,0,2348,2349,3,312,156,0,2349,2350,5,31,0,0,2350,2400,
+ 1,0,0,0,2351,2352,5,187,0,0,2352,2353,5,30,0,0,2353,2354,3,36,18,0,2354,
+ 2355,5,31,0,0,2355,2356,3,306,153,0,2356,2400,1,0,0,0,2357,2358,5,188,
+ 0,0,2358,2359,5,30,0,0,2359,2360,3,36,18,0,2360,2361,5,31,0,0,2361,2362,
+ 3,306,153,0,2362,2400,1,0,0,0,2363,2364,5,186,0,0,2364,2365,5,30,0,0,2365,
+ 2366,3,34,17,0,2366,2367,5,31,0,0,2367,2368,3,306,153,0,2368,2400,1,0,
+ 0,0,2369,2370,5,185,0,0,2370,2371,5,30,0,0,2371,2372,3,32,16,0,2372,2373,
+ 5,31,0,0,2373,2374,3,306,153,0,2374,2400,1,0,0,0,2375,2376,5,184,0,0,2376,
+ 2377,5,30,0,0,2377,2378,3,32,16,0,2378,2379,5,31,0,0,2379,2380,3,306,153,
+ 0,2380,2400,1,0,0,0,2381,2382,5,183,0,0,2382,2383,5,30,0,0,2383,2384,3,
+ 32,16,0,2384,2385,5,31,0,0,2385,2386,3,306,153,0,2386,2400,1,0,0,0,2387,
+ 2388,5,187,0,0,2388,2400,3,306,153,0,2389,2390,5,188,0,0,2390,2400,3,306,
+ 153,0,2391,2392,5,186,0,0,2392,2400,3,306,153,0,2393,2394,5,185,0,0,2394,
+ 2400,3,306,153,0,2395,2396,5,184,0,0,2396,2400,3,306,153,0,2397,2398,5,
+ 183,0,0,2398,2400,3,306,153,0,2399,2333,1,0,0,0,2399,2339,1,0,0,0,2399,
+ 2344,1,0,0,0,2399,2346,1,0,0,0,2399,2351,1,0,0,0,2399,2357,1,0,0,0,2399,
+ 2363,1,0,0,0,2399,2369,1,0,0,0,2399,2375,1,0,0,0,2399,2381,1,0,0,0,2399,
+ 2387,1,0,0,0,2399,2389,1,0,0,0,2399,2391,1,0,0,0,2399,2393,1,0,0,0,2399,
+ 2395,1,0,0,0,2399,2397,1,0,0,0,2400,309,1,0,0,0,2401,2402,5,187,0,0,2402,
+ 2403,5,30,0,0,2403,2404,3,36,18,0,2404,2405,5,31,0,0,2405,2477,1,0,0,0,
+ 2406,2407,5,188,0,0,2407,2408,5,30,0,0,2408,2409,3,36,18,0,2409,2410,5,
+ 31,0,0,2410,2477,1,0,0,0,2411,2412,5,187,0,0,2412,2413,5,30,0,0,2413,2414,
+ 3,32,16,0,2414,2415,5,31,0,0,2415,2477,1,0,0,0,2416,2417,5,188,0,0,2417,
+ 2418,5,30,0,0,2418,2419,3,34,17,0,2419,2420,5,31,0,0,2420,2477,1,0,0,0,
+ 2421,2422,5,186,0,0,2422,2423,5,30,0,0,2423,2424,3,34,17,0,2424,2425,5,
+ 31,0,0,2425,2477,1,0,0,0,2426,2427,5,185,0,0,2427,2428,5,30,0,0,2428,2429,
+ 3,32,16,0,2429,2430,5,31,0,0,2430,2477,1,0,0,0,2431,2432,5,184,0,0,2432,
+ 2433,5,30,0,0,2433,2434,3,32,16,0,2434,2435,5,31,0,0,2435,2477,1,0,0,0,
+ 2436,2437,5,183,0,0,2437,2438,5,30,0,0,2438,2439,3,32,16,0,2439,2440,5,
+ 31,0,0,2440,2477,1,0,0,0,2441,2442,5,192,0,0,2442,2443,5,30,0,0,2443,2444,
+ 3,34,17,0,2444,2445,5,31,0,0,2445,2477,1,0,0,0,2446,2447,5,191,0,0,2447,
+ 2448,5,30,0,0,2448,2449,3,32,16,0,2449,2450,5,31,0,0,2450,2477,1,0,0,0,
+ 2451,2452,5,190,0,0,2452,2453,5,30,0,0,2453,2454,3,32,16,0,2454,2455,5,
+ 31,0,0,2455,2477,1,0,0,0,2456,2457,5,189,0,0,2457,2458,5,30,0,0,2458,2459,
+ 3,32,16,0,2459,2460,5,31,0,0,2460,2477,1,0,0,0,2461,2462,5,180,0,0,2462,
+ 2463,5,30,0,0,2463,2464,3,32,16,0,2464,2465,5,31,0,0,2465,2477,1,0,0,0,
+ 2466,2467,5,182,0,0,2467,2468,5,30,0,0,2468,2469,3,184,92,0,2469,2470,
+ 5,31,0,0,2470,2477,1,0,0,0,2471,2472,5,84,0,0,2472,2473,5,30,0,0,2473,
+ 2474,3,312,156,0,2474,2475,5,31,0,0,2475,2477,1,0,0,0,2476,2401,1,0,0,
+ 0,2476,2406,1,0,0,0,2476,2411,1,0,0,0,2476,2416,1,0,0,0,2476,2421,1,0,
+ 0,0,2476,2426,1,0,0,0,2476,2431,1,0,0,0,2476,2436,1,0,0,0,2476,2441,1,
+ 0,0,0,2476,2446,1,0,0,0,2476,2451,1,0,0,0,2476,2456,1,0,0,0,2476,2461,
+ 1,0,0,0,2476,2466,1,0,0,0,2476,2471,1,0,0,0,2477,311,1,0,0,0,2478,2480,
+ 3,314,157,0,2479,2478,1,0,0,0,2480,2483,1,0,0,0,2481,2479,1,0,0,0,2481,
+ 2482,1,0,0,0,2482,313,1,0,0,0,2483,2481,1,0,0,0,2484,2485,7,11,0,0,2485,
+ 315,1,0,0,0,2486,2490,3,310,155,0,2487,2490,3,6,3,0,2488,2490,5,178,0,
+ 0,2489,2486,1,0,0,0,2489,2487,1,0,0,0,2489,2488,1,0,0,0,2490,317,1,0,0,
+ 0,2491,2640,3,310,155,0,2492,2493,5,181,0,0,2493,2494,5,30,0,0,2494,2495,
+ 5,178,0,0,2495,2640,5,31,0,0,2496,2497,5,181,0,0,2497,2498,5,30,0,0,2498,
+ 2499,5,263,0,0,2499,2640,5,31,0,0,2500,2501,5,195,0,0,2501,2502,5,30,0,
+ 0,2502,2503,5,39,0,0,2503,2504,5,263,0,0,2504,2640,5,31,0,0,2505,2506,
+ 5,195,0,0,2506,2507,5,30,0,0,2507,2508,3,138,69,0,2508,2509,5,31,0,0,2509,
+ 2640,1,0,0,0,2510,2511,5,195,0,0,2511,2512,5,30,0,0,2512,2513,5,178,0,
+ 0,2513,2640,5,31,0,0,2514,2515,5,196,0,0,2515,2516,5,30,0,0,2516,2517,
+ 3,318,159,0,2517,2518,5,31,0,0,2518,2640,1,0,0,0,2519,2520,5,187,0,0,2520,
+ 2521,5,42,0,0,2521,2522,3,32,16,0,2522,2523,5,43,0,0,2523,2524,5,30,0,
+ 0,2524,2525,3,320,160,0,2525,2526,5,31,0,0,2526,2640,1,0,0,0,2527,2528,
+ 5,188,0,0,2528,2529,5,42,0,0,2529,2530,3,32,16,0,2530,2531,5,43,0,0,2531,
+ 2532,5,30,0,0,2532,2533,3,322,161,0,2533,2534,5,31,0,0,2534,2640,1,0,0,
+ 0,2535,2536,5,186,0,0,2536,2537,5,42,0,0,2537,2538,3,32,16,0,2538,2539,
+ 5,43,0,0,2539,2540,5,30,0,0,2540,2541,3,324,162,0,2541,2542,5,31,0,0,2542,
+ 2640,1,0,0,0,2543,2544,5,185,0,0,2544,2545,5,42,0,0,2545,2546,3,32,16,
+ 0,2546,2547,5,43,0,0,2547,2548,5,30,0,0,2548,2549,3,326,163,0,2549,2550,
+ 5,31,0,0,2550,2640,1,0,0,0,2551,2552,5,184,0,0,2552,2553,5,42,0,0,2553,
+ 2554,3,32,16,0,2554,2555,5,43,0,0,2555,2556,5,30,0,0,2556,2557,3,328,164,
+ 0,2557,2558,5,31,0,0,2558,2640,1,0,0,0,2559,2560,5,183,0,0,2560,2561,5,
+ 42,0,0,2561,2562,3,32,16,0,2562,2563,5,43,0,0,2563,2564,5,30,0,0,2564,
+ 2565,3,330,165,0,2565,2566,5,31,0,0,2566,2640,1,0,0,0,2567,2568,5,192,
+ 0,0,2568,2569,5,42,0,0,2569,2570,3,32,16,0,2570,2571,5,43,0,0,2571,2572,
+ 5,30,0,0,2572,2573,3,324,162,0,2573,2574,5,31,0,0,2574,2640,1,0,0,0,2575,
+ 2576,5,191,0,0,2576,2577,5,42,0,0,2577,2578,3,32,16,0,2578,2579,5,43,0,
+ 0,2579,2580,5,30,0,0,2580,2581,3,326,163,0,2581,2582,5,31,0,0,2582,2640,
+ 1,0,0,0,2583,2584,5,190,0,0,2584,2585,5,42,0,0,2585,2586,3,32,16,0,2586,
+ 2587,5,43,0,0,2587,2588,5,30,0,0,2588,2589,3,328,164,0,2589,2590,5,31,
+ 0,0,2590,2640,1,0,0,0,2591,2592,5,189,0,0,2592,2593,5,42,0,0,2593,2594,
+ 3,32,16,0,2594,2595,5,43,0,0,2595,2596,5,30,0,0,2596,2597,3,330,165,0,
+ 2597,2598,5,31,0,0,2598,2640,1,0,0,0,2599,2600,5,180,0,0,2600,2601,5,42,
+ 0,0,2601,2602,3,32,16,0,2602,2603,5,43,0,0,2603,2604,5,30,0,0,2604,2605,
+ 3,328,164,0,2605,2606,5,31,0,0,2606,2640,1,0,0,0,2607,2608,5,182,0,0,2608,
+ 2609,5,42,0,0,2609,2610,3,32,16,0,2610,2611,5,43,0,0,2611,2612,5,30,0,
+ 0,2612,2613,3,332,166,0,2613,2614,5,31,0,0,2614,2640,1,0,0,0,2615,2616,
+ 5,181,0,0,2616,2617,5,42,0,0,2617,2618,3,32,16,0,2618,2619,5,43,0,0,2619,
+ 2620,5,30,0,0,2620,2621,3,334,167,0,2621,2622,5,31,0,0,2622,2640,1,0,0,
+ 0,2623,2624,5,195,0,0,2624,2625,5,42,0,0,2625,2626,3,32,16,0,2626,2627,
+ 5,43,0,0,2627,2628,5,30,0,0,2628,2629,3,336,168,0,2629,2630,5,31,0,0,2630,
+ 2640,1,0,0,0,2631,2632,5,196,0,0,2632,2633,5,42,0,0,2633,2634,3,32,16,
+ 0,2634,2635,5,43,0,0,2635,2636,5,30,0,0,2636,2637,3,340,170,0,2637,2638,
+ 5,31,0,0,2638,2640,1,0,0,0,2639,2491,1,0,0,0,2639,2492,1,0,0,0,2639,2496,
+ 1,0,0,0,2639,2500,1,0,0,0,2639,2505,1,0,0,0,2639,2510,1,0,0,0,2639,2514,
+ 1,0,0,0,2639,2519,1,0,0,0,2639,2527,1,0,0,0,2639,2535,1,0,0,0,2639,2543,
+ 1,0,0,0,2639,2551,1,0,0,0,2639,2559,1,0,0,0,2639,2567,1,0,0,0,2639,2575,
+ 1,0,0,0,2639,2583,1,0,0,0,2639,2591,1,0,0,0,2639,2599,1,0,0,0,2639,2607,
+ 1,0,0,0,2639,2615,1,0,0,0,2639,2623,1,0,0,0,2639,2631,1,0,0,0,2640,319,
+ 1,0,0,0,2641,2644,3,36,18,0,2642,2644,3,32,16,0,2643,2641,1,0,0,0,2643,
+ 2642,1,0,0,0,2644,2647,1,0,0,0,2645,2643,1,0,0,0,2645,2646,1,0,0,0,2646,
+ 321,1,0,0,0,2647,2645,1,0,0,0,2648,2651,3,36,18,0,2649,2651,3,34,17,0,
+ 2650,2648,1,0,0,0,2650,2649,1,0,0,0,2651,2654,1,0,0,0,2652,2650,1,0,0,
+ 0,2652,2653,1,0,0,0,2653,323,1,0,0,0,2654,2652,1,0,0,0,2655,2657,3,34,
+ 17,0,2656,2655,1,0,0,0,2657,2660,1,0,0,0,2658,2656,1,0,0,0,2658,2659,1,
+ 0,0,0,2659,325,1,0,0,0,2660,2658,1,0,0,0,2661,2663,3,32,16,0,2662,2661,
+ 1,0,0,0,2663,2666,1,0,0,0,2664,2662,1,0,0,0,2664,2665,1,0,0,0,2665,327,
+ 1,0,0,0,2666,2664,1,0,0,0,2667,2669,3,32,16,0,2668,2667,1,0,0,0,2669,2672,
+ 1,0,0,0,2670,2668,1,0,0,0,2670,2671,1,0,0,0,2671,329,1,0,0,0,2672,2670,
+ 1,0,0,0,2673,2675,3,32,16,0,2674,2673,1,0,0,0,2675,2678,1,0,0,0,2676,2674,
+ 1,0,0,0,2676,2677,1,0,0,0,2677,331,1,0,0,0,2678,2676,1,0,0,0,2679,2681,
+ 3,184,92,0,2680,2679,1,0,0,0,2681,2684,1,0,0,0,2682,2680,1,0,0,0,2682,
+ 2683,1,0,0,0,2683,333,1,0,0,0,2684,2682,1,0,0,0,2685,2687,7,12,0,0,2686,
+ 2685,1,0,0,0,2687,2690,1,0,0,0,2688,2686,1,0,0,0,2688,2689,1,0,0,0,2689,
+ 335,1,0,0,0,2690,2688,1,0,0,0,2691,2693,3,338,169,0,2692,2691,1,0,0,0,
+ 2693,2696,1,0,0,0,2694,2692,1,0,0,0,2694,2695,1,0,0,0,2695,337,1,0,0,0,
+ 2696,2694,1,0,0,0,2697,2702,5,178,0,0,2698,2699,5,39,0,0,2699,2702,5,263,
+ 0,0,2700,2702,3,138,69,0,2701,2697,1,0,0,0,2701,2698,1,0,0,0,2701,2700,
+ 1,0,0,0,2702,339,1,0,0,0,2703,2705,3,318,159,0,2704,2703,1,0,0,0,2705,
+ 2708,1,0,0,0,2706,2704,1,0,0,0,2706,2707,1,0,0,0,2707,341,1,0,0,0,2708,
+ 2706,1,0,0,0,2709,2713,3,44,22,0,2710,2713,3,46,23,0,2711,2713,3,2,1,0,
+ 2712,2709,1,0,0,0,2712,2710,1,0,0,0,2712,2711,1,0,0,0,2713,343,1,0,0,0,
+ 2714,2715,5,167,0,0,2715,2716,5,36,0,0,2716,2717,5,30,0,0,2717,2718,3,
+ 312,156,0,2718,2719,5,31,0,0,2719,2740,1,0,0,0,2720,2721,5,168,0,0,2721,
+ 2722,3,38,19,0,2722,2723,5,75,0,0,2723,2724,3,38,19,0,2724,2725,5,75,0,
+ 0,2725,2726,3,38,19,0,2726,2727,5,75,0,0,2727,2728,3,38,19,0,2728,2740,
+ 1,0,0,0,2729,2730,5,169,0,0,2730,2740,3,6,3,0,2731,2732,5,169,0,0,2732,
+ 2733,5,36,0,0,2733,2734,5,30,0,0,2734,2735,3,312,156,0,2735,2736,5,31,
+ 0,0,2736,2740,1,0,0,0,2737,2740,3,342,171,0,2738,2740,3,40,20,0,2739,2714,
+ 1,0,0,0,2739,2720,1,0,0,0,2739,2729,1,0,0,0,2739,2731,1,0,0,0,2739,2737,
+ 1,0,0,0,2739,2738,1,0,0,0,2740,345,1,0,0,0,2741,2742,5,25,0,0,2742,2743,
+ 5,40,0,0,2743,2744,3,98,49,0,2744,2745,3,2,1,0,2745,2754,1,0,0,0,2746,
+ 2747,5,25,0,0,2747,2748,5,40,0,0,2748,2749,3,98,49,0,2749,2750,3,2,1,0,
+ 2750,2751,5,34,0,0,2751,2752,3,2,1,0,2752,2754,1,0,0,0,2753,2741,1,0,0,
+ 0,2753,2746,1,0,0,0,2754,347,1,0,0,0,2755,2757,3,350,175,0,2756,2755,1,
+ 0,0,0,2757,2760,1,0,0,0,2758,2756,1,0,0,0,2758,2759,1,0,0,0,2759,349,1,
+ 0,0,0,2760,2758,1,0,0,0,2761,2762,5,179,0,0,2762,2763,5,36,0,0,2763,2764,
+ 5,30,0,0,2764,2765,3,312,156,0,2765,2766,5,31,0,0,2766,2776,1,0,0,0,2767,
+ 2776,3,344,172,0,2768,2769,5,170,0,0,2769,2770,5,36,0,0,2770,2771,5,30,
+ 0,0,2771,2772,3,312,156,0,2772,2773,5,31,0,0,2773,2776,1,0,0,0,2774,2776,
+ 5,55,0,0,2775,2761,1,0,0,0,2775,2767,1,0,0,0,2775,2768,1,0,0,0,2775,2774,
+ 1,0,0,0,2776,351,1,0,0,0,2777,2778,5,50,0,0,2778,2782,5,40,0,0,2779,2781,
+ 3,356,178,0,2780,2779,1,0,0,0,2781,2784,1,0,0,0,2782,2780,1,0,0,0,2782,
+ 2783,1,0,0,0,2783,2785,1,0,0,0,2784,2782,1,0,0,0,2785,2786,3,2,1,0,2786,
+ 353,1,0,0,0,2787,2791,5,300,0,0,2788,2790,3,356,178,0,2789,2788,1,0,0,
+ 0,2790,2793,1,0,0,0,2791,2789,1,0,0,0,2791,2792,1,0,0,0,2792,2794,1,0,
+ 0,0,2793,2791,1,0,0,0,2794,2795,3,2,1,0,2795,355,1,0,0,0,2796,2812,5,52,
+ 0,0,2797,2812,5,51,0,0,2798,2812,5,171,0,0,2799,2800,5,62,0,0,2800,2812,
+ 5,51,0,0,2801,2802,5,62,0,0,2802,2812,5,52,0,0,2803,2804,5,62,0,0,2804,
+ 2812,5,63,0,0,2805,2806,5,62,0,0,2806,2812,5,64,0,0,2807,2808,5,62,0,0,
+ 2808,2812,5,65,0,0,2809,2810,5,62,0,0,2810,2812,5,66,0,0,2811,2796,1,0,
+ 0,0,2811,2797,1,0,0,0,2811,2798,1,0,0,0,2811,2799,1,0,0,0,2811,2801,1,
+ 0,0,0,2811,2803,1,0,0,0,2811,2805,1,0,0,0,2811,2807,1,0,0,0,2811,2809,
+ 1,0,0,0,2812,357,1,0,0,0,2813,2815,3,360,180,0,2814,2813,1,0,0,0,2815,
+ 2818,1,0,0,0,2816,2814,1,0,0,0,2816,2817,1,0,0,0,2817,359,1,0,0,0,2818,
+ 2816,1,0,0,0,2819,2820,5,21,0,0,2820,2833,3,2,1,0,2821,2822,5,50,0,0,2822,
+ 2823,5,40,0,0,2823,2833,3,140,70,0,2824,2825,5,25,0,0,2825,2826,5,40,0,
+ 0,2826,2833,3,2,1,0,2827,2833,3,196,98,0,2828,2829,5,50,0,0,2829,2833,
+ 3,32,16,0,2830,2833,3,342,171,0,2831,2833,3,40,20,0,2832,2819,1,0,0,0,
+ 2832,2821,1,0,0,0,2832,2824,1,0,0,0,2832,2827,1,0,0,0,2832,2828,1,0,0,
+ 0,2832,2830,1,0,0,0,2832,2831,1,0,0,0,2833,361,1,0,0,0,2834,2838,5,273,
+ 0,0,2835,2837,3,364,182,0,2836,2835,1,0,0,0,2837,2840,1,0,0,0,2838,2836,
+ 1,0,0,0,2838,2839,1,0,0,0,2839,2841,1,0,0,0,2840,2838,1,0,0,0,2841,2854,
+ 3,2,1,0,2842,2846,5,273,0,0,2843,2845,3,364,182,0,2844,2843,1,0,0,0,2845,
+ 2848,1,0,0,0,2846,2844,1,0,0,0,2846,2847,1,0,0,0,2847,2849,1,0,0,0,2848,
+ 2846,1,0,0,0,2849,2850,3,2,1,0,2850,2851,5,34,0,0,2851,2852,3,2,1,0,2852,
+ 2854,1,0,0,0,2853,2834,1,0,0,0,2853,2842,1,0,0,0,2854,363,1,0,0,0,2855,
+ 2856,7,13,0,0,2856,365,1,0,0,0,2857,2859,3,368,184,0,2858,2857,1,0,0,0,
+ 2859,2862,1,0,0,0,2860,2858,1,0,0,0,2860,2861,1,0,0,0,2861,367,1,0,0,0,
+ 2862,2860,1,0,0,0,2863,2864,5,21,0,0,2864,2865,3,2,1,0,2865,2866,5,44,
+ 0,0,2866,2867,3,32,16,0,2867,2874,1,0,0,0,2868,2869,5,25,0,0,2869,2870,
+ 5,40,0,0,2870,2874,3,2,1,0,2871,2874,3,342,171,0,2872,2874,3,40,20,0,2873,
+ 2863,1,0,0,0,2873,2868,1,0,0,0,2873,2871,1,0,0,0,2873,2872,1,0,0,0,2874,
+ 369,1,0,0,0,172,378,383,391,399,452,493,502,526,530,548,575,598,634,640,
+ 647,649,659,661,668,679,687,708,710,726,771,776,781,786,794,872,878,894,
+ 900,906,913,1024,1029,1035,1040,1042,1050,1062,1074,1081,1088,1090,1117,
+ 1124,1132,1140,1153,1160,1163,1182,1276,1285,1292,1295,1303,1324,1356,
+ 1379,1391,1400,1425,1449,1457,1461,1476,1483,1528,1538,1554,1566,1578,
+ 1592,1604,1615,1622,1632,1645,1650,1655,1664,1675,1758,1767,1780,1791,
+ 1799,1809,1811,1838,1845,1850,1857,1863,1873,1877,1884,1899,1905,1919,
+ 1932,1940,1947,1951,1956,1972,1977,1979,1992,2018,2025,2027,2032,2038,
+ 2067,2072,2095,2100,2164,2173,2186,2197,2208,2211,2218,2230,2244,2258,
+ 2266,2286,2298,2303,2312,2314,2321,2331,2399,2476,2481,2489,2639,2643,
+ 2645,2650,2652,2658,2664,2670,2676,2682,2688,2694,2701,2706,2712,2739,
+ 2753,2758,2775,2782,2791,2811,2816,2832,2838,2846,2853,2860,2873
};
public static readonly ATN _ATN =
diff --git a/src/tools/ilasm/src/ilasm/IlasmRootCommand.cs b/src/tools/ilasm/src/ilasm/IlasmRootCommand.cs
index 8b21295cad25e5..d51fb3c418fcef 100644
--- a/src/tools/ilasm/src/ilasm/IlasmRootCommand.cs
+++ b/src/tools/ilasm/src/ilasm/IlasmRootCommand.cs
@@ -1,7 +1,6 @@
// 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.CommandLine;
namespace ILAssembler;
@@ -102,9 +101,6 @@ internal sealed class IlasmRootCommand : RootCommand
public Option TargetX64 { get; } =
new("--x64") { Description = "Target processor: 64bit AMD processor" };
- public Option TargetArm { get; } =
- new("--arm") { Description = "Target processor: ARM (AArch32) processor" };
-
public Option TargetArm64 { get; } =
new("--arm64") { Description = "Target processor: ARM64 (AArch64) processor" };
@@ -114,8 +110,6 @@ internal sealed class IlasmRootCommand : RootCommand
public Option WaitForDebugger { get; } =
new("--waitfordebugger") { Description = "Pause to give opportunity to attach debugger" };
- public ParseResult Result { get; private set; } = null!;
-
internal const string ProductName = ".NET IL Assembler";
public IlasmRootCommand() : base(ProductName)
@@ -151,33 +145,8 @@ public IlasmRootCommand() : base(ProductName)
Options.Add(NoCorStub);
Options.Add(StripReloc);
Options.Add(TargetX64);
- Options.Add(TargetArm);
Options.Add(TargetArm64);
Options.Add(Prefer32Bit);
Options.Add(WaitForDebugger);
-
- this.SetAction(result =>
- {
- Result = result;
-
- if (result.GetValue(WaitForDebugger))
- {
- Console.WriteLine("Waiting for debugger to attach. Press ENTER to continue");
- Console.ReadLine();
- }
-
- try
- {
- return new Program(this).Run();
- }
- catch (Exception e)
- {
- Console.ResetColor();
- Console.ForegroundColor = ConsoleColor.Red;
- Console.Error.WriteLine("Error: " + e.Message);
- Console.ResetColor();
- return 1;
- }
- });
}
}
diff --git a/src/tools/ilasm/src/ilasm/NativeCommandLine.cs b/src/tools/ilasm/src/ilasm/NativeCommandLine.cs
index 3aa2ac516d4ed4..8a43f649c23f06 100644
--- a/src/tools/ilasm/src/ilasm/NativeCommandLine.cs
+++ b/src/tools/ilasm/src/ilasm/NativeCommandLine.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.CommandLine;
namespace ILAssembler;
@@ -42,45 +43,28 @@ internal static class NativeCommandLine
["X64"] = "--x64",
};
- private static readonly HashSet s_optionsWithValues = new(StringComparer.Ordinal)
- {
- "--alignment",
- "--aname",
- "--base",
- "--flags",
- "--include",
- "--key",
- "--mdv",
- "--output",
- "--ssver",
- "--stack",
- "--subsystem",
- };
-
- private static readonly HashSet s_modernOptionsWithSeparateValues = new(StringComparer.Ordinal)
- {
- "--alignment",
- "--aname",
- "--base",
- "--debug-mode",
- "--flags",
- "--include",
- "--key",
- "--mdv",
- "--output",
- "--ssver",
- "--stack",
- "--subsystem",
- "-I",
- "-k",
- "-o",
- };
-
internal static string[] Normalize(string[] args) =>
- Normalize(args, allowSlashOptions: OperatingSystem.IsWindows());
+ Normalize(args, new IlasmRootCommand(), allowSlashOptions: OperatingSystem.IsWindows());
internal static string[] Normalize(string[] args, bool allowSlashOptions)
+ => Normalize(args, new IlasmRootCommand(), allowSlashOptions);
+
+ internal static string[] Normalize(string[] args, IlasmRootCommand command)
+ => Normalize(args, command, allowSlashOptions: OperatingSystem.IsWindows());
+
+ private static string[] Normalize(string[] args, IlasmRootCommand command, bool allowSlashOptions)
{
+ HashSet optionsWithValues = new(StringComparer.Ordinal);
+ Dictionary modernShortOptions = new(StringComparer.Ordinal);
+ foreach (Option option in command.Options)
+ {
+ AddModernOption(option.Name, option);
+ foreach (string alias in option.Aliases)
+ {
+ AddModernOption(alias, option);
+ }
+ }
+
List result = new(args.Length);
bool preserveRemainingArguments = false;
bool preserveNextArgument = false;
@@ -101,7 +85,7 @@ internal static string[] Normalize(string[] args, bool allowSlashOptions)
continue;
}
- if (s_modernOptionsWithSeparateValues.Contains(arg))
+ if (optionsWithValues.Contains(arg))
{
result.Add(arg);
preserveNextArgument = true;
@@ -122,7 +106,7 @@ internal static string[] Normalize(string[] args, bool allowSlashOptions)
if (optionName.Length < 3)
{
- if (!IsValidModernShortOption(arg[0], optionName, value))
+ if (!IsValidModernShortOption(arg[0], optionName, value, modernShortOptions))
{
throw new ArgumentException($"Invalid native option '{arg}'.");
}
@@ -138,12 +122,8 @@ internal static string[] Normalize(string[] args, bool allowSlashOptions)
}
else if (optionName.Equals("ARM", StringComparison.OrdinalIgnoreCase))
{
- if (value is not null)
- {
- throw new ArgumentException($"Invalid native option '{arg}'.");
- }
-
- normalizedOption = "--arm";
+ throw new ArgumentException(
+ $"Unsupported native option '{arg}'. ARM32 target images are not supported.");
}
else if (optionName.StartsWith("ARM", StringComparison.OrdinalIgnoreCase))
{
@@ -172,7 +152,7 @@ internal static string[] Normalize(string[] args, bool allowSlashOptions)
if (normalizedOption is null)
{
- if (IsValidModernShortOption(arg[0], optionName, value))
+ if (IsValidModernShortOption(arg[0], optionName, value, modernShortOptions))
{
result.Add(arg);
continue;
@@ -195,7 +175,7 @@ internal static string[] Normalize(string[] args, bool allowSlashOptions)
}
result.Add(normalizedOption);
- if (s_optionsWithValues.Contains(normalizedOption))
+ if (optionsWithValues.Contains(normalizedOption))
{
if (value is null)
{
@@ -213,6 +193,29 @@ internal static string[] Normalize(string[] args, bool allowSlashOptions)
}
return result.ToArray();
+
+ void AddModernOption(string name, Option option)
+ {
+ if (!name.StartsWith('-', StringComparison.Ordinal))
+ {
+ return;
+ }
+
+ if (option.Arity.MinimumNumberOfValues > 0)
+ {
+ optionsWithValues.Add(name);
+ }
+
+ AddModernShortOption(name, option);
+ }
+
+ void AddModernShortOption(string name, Option option)
+ {
+ if (name is ['-', _])
+ {
+ modernShortOptions.Add(name, option);
+ }
+ }
}
private static bool TrySplitNativeOption(
@@ -246,20 +249,30 @@ private static bool TrySplitNativeOption(
return true;
}
- private static bool IsValidModernShortOption(char prefix, string optionName, string? value)
+ private static bool IsValidModernShortOption(
+ char prefix,
+ string optionName,
+ string? value,
+ Dictionary modernShortOptions)
{
if (prefix != '-' || optionName.Length != 1)
{
return false;
}
- return optionName switch
+ if (!modernShortOptions.TryGetValue($"-{optionName}", out Option? option))
{
- "I" or "k" or "o" => true,
- "O" or "g" or "q" => value is null || bool.TryParse(value, out _),
- "h" => value is null,
- _ => false,
- };
+ return false;
+ }
+
+ if (value is null)
+ {
+ return true;
+ }
+
+ return option.ValueType == typeof(bool)
+ ? bool.TryParse(value, out _)
+ : option.Arity.MaximumNumberOfValues > 0;
}
private static string NormalizeDebugMode(string value)
diff --git a/src/tools/ilasm/src/ilasm/Program.cs b/src/tools/ilasm/src/ilasm/Program.cs
index 6717eb70155ff7..f3e2e33acb4a98 100644
--- a/src/tools/ilasm/src/ilasm/Program.cs
+++ b/src/tools/ilasm/src/ilasm/Program.cs
@@ -14,10 +14,12 @@ namespace ILAssembler;
internal sealed class Program
{
private readonly IlasmRootCommand _command;
+ private readonly ParseResult _result;
- public Program(IlasmRootCommand command)
+ public Program(IlasmRootCommand command, ParseResult result)
{
_command = command;
+ _result = result;
}
public int Run()
@@ -28,7 +30,7 @@ public int Run()
stopwatch = Stopwatch.StartNew();
}
- string[]? inputFiles = _command.Result.GetValue(_command.InputFilePaths);
+ string[]? inputFiles = _result.GetValue(_command.InputFilePaths);
bool quiet = Get(_command.Quiet);
if (!Get(_command.NoLogo) && !quiet)
@@ -81,9 +83,9 @@ public int Run()
bool errorTolerant = Get(_command.ErrorTolerant);
var options = new Options
{
+ Dll = isDll,
NoAutoInherit = Get(_command.NoAutoInherit),
ErrorTolerant = errorTolerant,
- IsDll = isDll,
};
// Apply PE header overrides from command line
@@ -132,10 +134,6 @@ public int Run()
{
options.Machine = Machine.Amd64;
}
- else if (Get(_command.TargetArm))
- {
- options.Machine = Machine.Arm;
- }
else if (Get(_command.TargetArm64))
{
options.Machine = Machine.Arm64;
@@ -282,16 +280,17 @@ byte[] LoadResource(string path)
return exitCode;
}
- private T Get(Argument argument) => _command.Result.GetValue(argument)!;
+ private T Get(Argument argument) => _result.GetValue(argument)!;
- private T Get(Option option) => _command.Result.GetValue(option)!;
+ private T Get(Option option) => _result.GetValue(option)!;
private static int Main(string[] args)
{
+ IlasmRootCommand command = new();
string[] normalizedArgs;
try
{
- normalizedArgs = NativeCommandLine.Normalize(args);
+ normalizedArgs = NativeCommandLine.Normalize(args, command);
}
catch (ArgumentException e)
{
@@ -299,7 +298,29 @@ private static int Main(string[] args)
return 1;
}
- return new IlasmRootCommand()
+ command.SetAction(result =>
+ {
+ if (result.GetValue(command.WaitForDebugger))
+ {
+ Console.WriteLine("Waiting for debugger to attach. Press ENTER to continue");
+ Console.ReadLine();
+ }
+
+ try
+ {
+ return new Program(command, result).Run();
+ }
+ catch (Exception e)
+ {
+ Console.ResetColor();
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Error.WriteLine("Error: " + e.Message);
+ Console.ResetColor();
+ return 1;
+ }
+ });
+
+ return command
.Parse(normalizedArgs)
.Invoke();
}
diff --git a/src/tools/ilasm/src/ilasm/ilasm.csproj b/src/tools/ilasm/src/ilasm/ilasm.csproj
index 8a1e3d9fe0a6b4..7ba730beca1a97 100644
--- a/src/tools/ilasm/src/ilasm/ilasm.csproj
+++ b/src/tools/ilasm/src/ilasm/ilasm.csproj
@@ -15,7 +15,7 @@
enable
-
+
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs
index 8b7bd749031043..e19b61395bb6dc 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/AssemblyTests.cs
@@ -23,6 +23,63 @@ namespace ILAssembler.Tests
{
public class AssemblyTests
{
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void ImageCharacteristics_AreValid(bool dll)
+ {
+ string source = """
+ .assembly test { }
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { Dll = dll });
+ Characteristics characteristics = pe.PEHeaders.CoffHeader.Characteristics;
+
+ Assert.True(characteristics.HasFlag(Characteristics.ExecutableImage));
+ Assert.True(characteristics.HasFlag(Characteristics.Bit32Machine));
+ Assert.Equal(dll, characteristics.HasFlag(Characteristics.Dll));
+ }
+
+ [Theory]
+ [InlineData(Machine.Amd64)]
+ [InlineData(Machine.Arm64)]
+ public void ImageCharacteristics_64BitImageIsLargeAddressAware(Machine machine)
+ {
+ string source = """
+ .assembly test { }
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { Machine = machine });
+ Characteristics characteristics = pe.PEHeaders.CoffHeader.Characteristics;
+
+ Assert.True(characteristics.HasFlag(Characteristics.ExecutableImage));
+ Assert.True(characteristics.HasFlag(Characteristics.LargeAddressAware));
+ Assert.False(characteristics.HasFlag(Characteristics.Bit32Machine));
+ }
+
+ [Fact]
+ public void Arm32Machine_IsRejected()
+ {
+ string source = """
+ .assembly test { }
+ """;
+
+ Assert.Throws(
+ () => DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { Machine = Machine.ArmThumb2 }));
+ }
+
[Fact]
public void Diagnostic_AssemblyNotFound()
{
@@ -73,6 +130,63 @@ .class public auto ansi beforefieldinit Test
Assert.Equal(asmRefs[0].Name, reader.GetAssemblyReference((AssemblyReferenceHandle)objectRef.ResolutionScope).Name);
}
+ [Fact]
+ public void AssemblyReference_KeywordName_IsAccepted()
+ {
+ string source = """
+ .assembly extern volatile
+ {
+ .ver 0:0:0:0
+ }
+ .assembly test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assemblyReference = Assert.Single(reader.AssemblyReferences);
+
+ Assert.Equal("volatile", reader.GetString(reader.GetAssemblyReference(assemblyReference).Name));
+ }
+
+ [Fact]
+ public void AssemblyDefinition_PublicKeySetsFlag()
+ {
+ string source = """
+ .assembly test
+ {
+ .publickey = (01 02 03 04)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assembly = reader.GetAssemblyDefinition();
+
+ Assert.True(assembly.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([1, 2, 3, 4], reader.GetBlobBytes(assembly.PublicKey));
+ }
+
+ [Theory]
+ [InlineData(".publickey = (01 02 03 04)\n.publickeytoken = (05 06 07 08)")]
+ [InlineData(".publickeytoken = (05 06 07 08)\n.publickey = (01 02 03 04)")]
+ public void AssemblyReference_PublicKeyTokenTakesPrecedence(string declarations)
+ {
+ string source = $$"""
+ .assembly extern External
+ {
+ {{declarations}}
+ }
+ .assembly test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assemblyReference = reader.GetAssemblyReference(Assert.Single(reader.AssemblyReferences));
+
+ Assert.False(assemblyReference.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([5, 6, 7, 8], reader.GetBlobBytes(assemblyReference.PublicKeyOrToken));
+ }
+
[Fact]
public void CoreAssemblyResolution_PrefersSystemPrivateCoreLib()
@@ -184,6 +298,28 @@ .class public auto ansi Test { }
}
+ [Fact]
+ public void AssemblyLegacyLibraryAttribute_IsAccepted()
+ {
+ string source = """
+ .assembly extern legacy library dependency { }
+ .assembly legacy library test { }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ MetadataReader reader = pe.GetMetadataReader();
+
+ Assert.Equal("test", reader.GetString(reader.GetAssemblyDefinition().Name));
+ Assert.Equal(
+ "dependency",
+ reader.AssemblyReferences
+ .Select(reader.GetAssemblyReference)
+ .Select(reference => reader.GetString(reference.Name))
+ .Single(name => name == "dependency"));
+ }
+
+
[Fact]
public void AssemblyArchitecture_SetsArchitectureFlags()
{
@@ -372,7 +508,6 @@ .method public static void Main() cil managed
[InlineData(true, Machine.I386, Characteristics.ExecutableImage | Characteristics.Bit32Machine | Characteristics.Dll)]
[InlineData(false, Machine.Amd64, Characteristics.ExecutableImage | Characteristics.LargeAddressAware)]
[InlineData(true, Machine.Amd64, Characteristics.ExecutableImage | Characteristics.LargeAddressAware | Characteristics.Dll)]
- [InlineData(false, Machine.Arm, Characteristics.ExecutableImage | Characteristics.Bit32Machine)]
[InlineData(false, Machine.Arm64, Characteristics.ExecutableImage | Characteristics.LargeAddressAware)]
public void OutputKindAndMachine_SetCoffCharacteristics(
bool isDll,
@@ -394,7 +529,7 @@ .method static int32 Main()
source,
new Options
{
- IsDll = isDll,
+ Dll = isDll,
Machine = machine,
OutputFileName = isDll ? "test.dll" : "test.exe",
});
@@ -403,7 +538,6 @@ .method static int32 Main()
Assert.Equal(!isDll, pe.PEHeaders.IsExe);
}
-
[Fact]
public void SqstringAssemblyName_ParsedCorrectly()
{
@@ -780,5 +914,90 @@ leave.s DONE
var catchRegion = ehRegions.First(r => r.Kind == ExceptionRegionKind.Catch);
Assert.Equal(HandleKind.TypeDefinition, catchRegion.CatchType.Kind);
}
+
+ [Fact]
+ public void AssemblyReferenceMetadata_EmitsExpectedIdentity()
+ {
+ string source = """
+ .assembly extern Sample.Dependency
+ {
+ .ver 2:5:0:7
+ .locale "en-US"
+ .publickeytoken = (01 23 45 67 89 AB CD EF)
+ .hash = (AA BB CC)
+ }
+ .assembly TestAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var assemblyRef = reader.GetAssemblyReference(MetadataTokens.AssemblyReferenceHandle(1));
+ Assert.Equal("Sample.Dependency", reader.GetString(assemblyRef.Name));
+ Assert.Equal(new Version(2, 5, 0, 7), assemblyRef.Version);
+ Assert.Equal("en-US", reader.GetString(assemblyRef.Culture));
+ Assert.Equal([0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF], reader.GetBlobBytes(assemblyRef.PublicKeyOrToken));
+ Assert.Equal([0xAA, 0xBB, 0xCC], reader.GetBlobBytes(assemblyRef.HashValue));
+ }
+
+ [Fact]
+ public void AssemblyAndAliasedReferenceDeclarations_EmitKeysWildcardsLocalesAndAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern Original.Dependency as Alias
+ {
+ .publickey = (01 02 03 04)
+ .ver *:2:*:4
+ .locale = (65 00 6E 00)
+ .hash = (AA BB)
+ auto
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ;
+ }
+ .assembly test
+ {
+ .publickey = (10 20 30 40)
+ .ver *:5:*:7
+ .locale = (66 00 72 00)
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ ;
+ }
+ .class public auto ansi Test
+ {
+ .field public class [Alias]Contoso.External Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var assembly = reader.GetAssemblyDefinition();
+ var dependencyHandle = reader.AssemblyReferences
+ .Single(handle => reader.GetString(reader.GetAssemblyReference(handle).Name) == "Original.Dependency");
+ var dependency = reader.GetAssemblyReference(dependencyHandle);
+ var externalType = reader.TypeReferences
+ .Select(reader.GetTypeReference)
+ .Single(type => reader.GetString(type.Name) == "External");
+
+ Assert.Equal(new Version(0, 5, 0, 7), assembly.Version);
+ Assert.Equal("fr", reader.GetString(assembly.Culture));
+ Assert.True(assembly.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([0x10, 0x20, 0x30, 0x40], reader.GetBlobBytes(assembly.PublicKey));
+ CustomAttributeValue assemblyAttribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetAssemblyDefinition().GetCustomAttributes()))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ Assert.Equal(true, Assert.Single(assemblyAttribute.FixedArguments).Value);
+
+ Assert.Equal(new Version(0, 2, 0, 4), dependency.Version);
+ Assert.Equal("en", reader.GetString(dependency.Culture));
+ Assert.True(dependency.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal([0x01, 0x02, 0x03, 0x04], reader.GetBlobBytes(dependency.PublicKeyOrToken));
+ Assert.Equal([0xAA, 0xBB], reader.GetBlobBytes(dependency.HashValue));
+ Assert.Single(reader.GetCustomAttributes(dependencyHandle));
+ Assert.Equal(dependencyHandle, externalType.ResolutionScope);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/CommandLineTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/CommandLineTests.cs
index d99c67dc628389..65ee0f6aac90f5 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/CommandLineTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/CommandLineTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.CommandLine;
using Xunit;
namespace ILAssembler.Tests;
@@ -59,24 +60,35 @@ public class CommandLineTests
"SUB",
};
- public static TheoryData ModernValueOptions { get; } = new()
- {
- "--alignment",
- "--aname",
- "--base",
- "--debug-mode",
- "--flags",
- "--include",
- "--key",
- "--mdv",
- "--output",
- "--ssver",
- "--stack",
- "--subsystem",
- "-I",
- "-k",
- "-o",
- };
+ public static TheoryData ModernValueOptions
+ {
+ get
+ {
+ TheoryData options = new();
+ foreach (Option option in new IlasmRootCommand().Options)
+ {
+ if (option.Arity.MinimumNumberOfValues == 0)
+ {
+ continue;
+ }
+
+ if (option.Name.StartsWith("-", StringComparison.Ordinal))
+ {
+ options.Add(option.Name);
+ }
+
+ foreach (string alias in option.Aliases)
+ {
+ if (alias.StartsWith("-", StringComparison.Ordinal))
+ {
+ options.Add(alias);
+ }
+ }
+ }
+
+ return options;
+ }
+ }
[Theory]
[MemberData(nameof(NativeValueOptions))]
@@ -247,11 +259,9 @@ public void SlashOption_DefaultMatchesPlatform()
}
[Theory]
- [InlineData("-ARM", "--arm")]
[InlineData("-arm64", "--arm64")]
[InlineData("-ARM64Anything", "--arm64")]
[InlineData("-ARM64=value", "--arm64")]
- [InlineData("/arm", "--arm")]
[InlineData("/ARM64Anything:value", "--arm64")]
public void ArmOptions_UseNativeDisambiguation(string argument, string expectedOption)
{
@@ -261,13 +271,15 @@ public void ArmOptions_UseNativeDisambiguation(string argument, string expectedO
}
[Theory]
+ [InlineData("-ARM")]
+ [InlineData("/arm")]
[InlineData("-ARMAnything")]
[InlineData("-ARM:value")]
[InlineData("-ARM6")]
- public void InvalidArmOption_Throws(string argument)
+ public void UnsupportedOrInvalidArmOption_Throws(string argument)
{
Assert.Throws(
- () => NativeCommandLine.Normalize([argument], allowSlashOptions: false));
+ () => NativeCommandLine.Normalize([argument], allowSlashOptions: argument[0] == '/'));
}
[Theory]
@@ -308,6 +320,14 @@ public void ModernValueOption_PreservesNextArgument(string option)
NativeCommandLine.Normalize([option, "-DLL", "input.il"], allowSlashOptions: false));
}
+ [Fact]
+ public void BareOptionName_DoesNotPreserveNextArgument()
+ {
+ Assert.Equal(
+ ["output", "--dll", "input.il"],
+ NativeCommandLine.Normalize(["output", "-DLL", "input.il"], allowSlashOptions: false));
+ }
+
[Theory]
[InlineData("-I:include")]
[InlineData("-k:key.snk")]
@@ -330,6 +350,15 @@ public void ModernShortBooleanOption_WithBooleanValueIsPreserved(string argument
NativeCommandLine.Normalize([argument], allowSlashOptions: false));
}
+ [Fact]
+ public void ModernShortBooleanOption_WithZeroArityAndBooleanValueIsPreserved()
+ {
+ IlasmRootCommand command = new();
+ command.Optimize.Arity = new ArgumentArity(0, 0);
+
+ Assert.Equal(["-O:false"], NativeCommandLine.Normalize(["-O:false"], command));
+ }
+
[Theory]
[InlineData("-g:opt", false)]
[InlineData("-O=x.exe", false)]
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/CompilerOptionsTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/CompilerOptionsTests.cs
new file mode 100644
index 00000000000000..ef1ba7797b18a6
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/CompilerOptionsTests.cs
@@ -0,0 +1,431 @@
+// 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.IO;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Reflection.PortableExecutable;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class CompilerOptionsTests
+ {
+ [Fact]
+ public void AssemblyNameMetadataVersionAndModuleNameOptions_AreApplied()
+ {
+ string source = """
+ .assembly SourceAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ AssemblyName = "Overridden.Assembly",
+ MetadataVersion = "vTestMetadata",
+ OutputFileName = "override.dll"
+ });
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("Overridden.Assembly", reader.GetString(reader.GetAssemblyDefinition().Name));
+ Assert.Equal("vTestMetadata", reader.MetadataVersion);
+ Assert.Equal("override.dll", reader.GetString(reader.GetModuleDefinition().Name));
+ }
+
+ [Fact]
+ public void PeHeaderAndCorFlagsOptions_AreApplied()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Machine = Machine.Amd64,
+ FileAlignment = 0x200,
+ ImageBase = 0x140000000,
+ Subsystem = Subsystem.WindowsCui,
+ SubsystemVersion = (6, 1),
+ StackReserve = 0x200000,
+ CorFlags = CorFlags.ILOnly
+ });
+
+ var peHeader = pe.PEHeaders.PEHeader!;
+ Assert.Equal(0x200, peHeader.FileAlignment);
+ Assert.Equal((ulong)0x140000000, peHeader.ImageBase);
+ Assert.Equal(Subsystem.WindowsCui, peHeader.Subsystem);
+ Assert.Equal((ushort)6, peHeader.MajorSubsystemVersion);
+ Assert.Equal((ushort)1, peHeader.MinorSubsystemVersion);
+ Assert.Equal((ulong)0x200000, peHeader.SizeOfStackReserve);
+ Assert.Equal(Machine.Amd64, pe.PEHeaders.CoffHeader.Machine);
+ Assert.Equal(CorFlags.ILOnly, pe.PEHeaders.CorHeader!.Flags);
+ }
+
+ [Fact]
+ public void Prefer32BitOption_AddsPreferredCorFlag()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ CorFlags = CorFlags.ILOnly | CorFlags.Requires32Bit,
+ Prefer32Bit = true
+ });
+
+ CorFlags flags = pe.PEHeaders.CorHeader!.Flags;
+ Assert.True(flags.HasFlag(CorFlags.Requires32Bit));
+ Assert.True(flags.HasFlag(CorFlags.Prefers32Bit));
+ }
+
+ [Fact]
+ public void NoAutoInheritOption_SuppressesImplicitObjectBaseType()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { NoAutoInherit = true });
+ var reader = pe.GetMetadataReader();
+ var typeDef = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(type => reader.GetString(type.Name) == "Test");
+
+ Assert.True(typeDef.BaseType.IsNil);
+ }
+
+ [Fact]
+ public void DebugModeOpt_EmitsDebuggableAttributeBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Debug = true,
+ DebugMode = DebugMode.Opt
+ });
+ var reader = pe.GetMetadataReader();
+
+ var assemblyAttributes = reader.GetAssemblyDefinition().GetCustomAttributes().ToArray();
+ var attributeHandle = Assert.Single(assemblyAttributes);
+ var attribute = reader.GetCustomAttribute(attributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("DebuggableAttribute", reader.GetString(attributeType.Name));
+ AssertDebuggableAttribute(attribute, expectedMode: 0x03);
+ }
+
+ [Fact]
+ public void DllCharacteristicsOptions_EmitExpectedPeBits()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Machine = Machine.Amd64,
+ AppContainer = true,
+ HighEntropyVA = true,
+ StripReloc = true
+ });
+
+ DllCharacteristics characteristics = pe.PEHeaders.PEHeader!.DllCharacteristics;
+ Assert.True(characteristics.HasFlag(DllCharacteristics.AppContainer));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.HighEntropyVirtualAddressSpace));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.NxCompatible));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.NoSeh));
+ Assert.True(characteristics.HasFlag(DllCharacteristics.TerminalServerAware));
+ Assert.False(characteristics.HasFlag(DllCharacteristics.DynamicBase));
+ }
+
+ [Fact]
+ public void DeterministicOption_ProducesValidImageAndMvid()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void Main() cil managed
+ {
+ .entrypoint
+ ret
+ }
+ }
+ """;
+
+ var image = DocumentCompilerTestHelpers.CompileAndGetImageBytes(source, new Options { Deterministic = true });
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ Assert.NotEqual(Guid.Empty, reader.GetGuid(reader.GetModuleDefinition().Mvid));
+ Assert.NotEqual(0, pe.PEHeaders.PEHeader!.SizeOfImage);
+ }
+
+ [Fact]
+ public void PdbOption_EmitsEmbeddedPortablePdbWithoutLineDirectives()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void M() cil managed
+ {
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options { Pdb = true });
+
+ var debugDirectory = pe.ReadDebugDirectory();
+ var embeddedPdbEntry = debugDirectory.Single(entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry);
+ var pdbReader = pdbProvider.GetMetadataReader();
+
+ Assert.Empty(pdbReader.Documents);
+ Assert.NotEmpty(pdbReader.MethodDebugInformation);
+ }
+
+ [Fact]
+ public void DebugModeImpl_EmitsDebuggableAttributeBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Debug = true,
+ DebugMode = DebugMode.Impl
+ });
+ var reader = pe.GetMetadataReader();
+
+ var assemblyAttributes = reader.GetAssemblyDefinition().GetCustomAttributes().ToArray();
+ var attributeHandle = Assert.Single(assemblyAttributes);
+ var attribute = reader.GetCustomAttribute(attributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("DebuggableAttribute", reader.GetString(attributeType.Name));
+ AssertDebuggableAttribute(attribute, expectedMode: 0x103);
+ }
+
+ [Fact]
+ public void DebugOption_WithoutExplicitMode_EmitsDefaultDebuggableAttributeBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ Debug = true
+ });
+ var reader = pe.GetMetadataReader();
+
+ var assemblyAttributes = reader.GetAssemblyDefinition().GetCustomAttributes().ToArray();
+ var attributeHandle = Assert.Single(assemblyAttributes);
+ var attribute = reader.GetCustomAttribute(attributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("DebuggableAttribute", reader.GetString(attributeType.Name));
+ AssertDebuggableAttribute(attribute, expectedMode: 0x101);
+ }
+
+ [Fact]
+ public void ValidKeyFile_EmbedsPublicKeyAndSetsAssemblyFlag()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ string tempDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
+ Directory.CreateDirectory(tempDirectory);
+ string keyFile = Path.Combine(tempDirectory, "test.snk");
+ byte[] expectedKeyBytes = [0x06, 0x02, 0x23, 0x29, 0x47, 0x6B, 0x8D, 0xAF];
+
+ try
+ {
+ File.WriteAllBytes(keyFile, expectedKeyBytes);
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options
+ {
+ KeyFile = keyFile
+ });
+ var reader = pe.GetMetadataReader();
+ var assemblyDefinition = reader.GetAssemblyDefinition();
+
+ Assert.True(assemblyDefinition.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.Equal(expectedKeyBytes, reader.GetBlobBytes(assemblyDefinition.PublicKey));
+ }
+ finally
+ {
+ if (File.Exists(keyFile))
+ {
+ File.Delete(keyFile);
+ }
+
+ if (Directory.Exists(tempDirectory))
+ {
+ Directory.Delete(tempDirectory);
+ }
+ }
+ }
+
+ [Fact]
+ public void InvalidKeyFile_WithErrorTolerantOption_EmitsAssemblyAndReportsDiagnostic()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ string missingKeyFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"), "missing.snk");
+ var sourceText = new SourceText(source, "test.il");
+ var compiler = new DocumentCompiler();
+
+ var (diagnostics, image) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options
+ {
+ ErrorTolerant = true,
+ KeyFile = missingKeyFile
+ });
+
+ var diagnostic = Assert.Single(diagnostics, d => d.Id == DiagnosticIds.KeyFileError);
+ Assert.Contains(missingKeyFile, diagnostic.Message);
+ Assert.NotNull(image);
+
+ var blobBuilder = new BlobBuilder();
+ image!.Serialize(blobBuilder);
+ using var pe = new PEReader(blobBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var assemblyDefinition = reader.GetAssemblyDefinition();
+
+ Assert.False(assemblyDefinition.Flags.HasFlag(AssemblyFlags.PublicKey));
+ Assert.True(assemblyDefinition.PublicKey.IsNil);
+ }
+
+ [Fact]
+ public void ErrorTolerantOption_ReturnsImageForStructuralMetadataError()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class extern public MissingType
+ {
+ .assembly extern MissingAssembly
+ }
+ """;
+ var sourceText = new SourceText(source, "test.il");
+ var compiler = new DocumentCompiler();
+
+ var (strictDiagnostics, strictImage) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options());
+ var strictDiagnostic = Assert.Single(strictDiagnostics, d => d.Id == DiagnosticIds.AssemblyNotFound);
+ Assert.Equal(DiagnosticSeverity.Error, strictDiagnostic.Severity);
+ Assert.Null(strictImage);
+
+ var (tolerantDiagnostics, tolerantImage) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+ var tolerantDiagnostic = Assert.Single(tolerantDiagnostics, d => d.Id == DiagnosticIds.AssemblyNotFound);
+ Assert.Equal(DiagnosticSeverity.Error, tolerantDiagnostic.Severity);
+ Assert.NotNull(tolerantImage);
+
+ var blobBuilder = new BlobBuilder();
+ tolerantImage!.Serialize(blobBuilder);
+ using var pe = new PEReader(blobBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ Assert.True(reader.TypeDefinitions.Count >= 1);
+ }
+
+ [Fact]
+ public void PeDirectives_EmitSpecifiedHeaderValues()
+ {
+ string source = """
+ .assembly test { }
+ .subsystem 0x0002
+ .corflags 0x00000003
+ .file alignment 0x00000400
+ .imagebase 0x10000000
+ .stackreserve 0x00200000
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var peHeader = pe.PEHeaders.PEHeader!;
+ var corHeader = pe.PEHeaders.CorHeader!;
+
+ Assert.Equal(Subsystem.WindowsGui, peHeader.Subsystem);
+ Assert.Equal(0x400, peHeader.FileAlignment);
+ Assert.Equal(0x10000000UL, peHeader.ImageBase);
+ Assert.Equal(0x00200000UL, peHeader.SizeOfStackReserve);
+ Assert.Equal(CorFlags.ILOnly | CorFlags.Requires32Bit, corHeader.Flags);
+ }
+
+ private static void AssertDebuggableAttribute(CustomAttribute attribute, int expectedMode)
+ {
+ CustomAttributeValue value =
+ attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ var argument = Assert.Single(value.FixedArguments);
+ Assert.Equal(expectedMode, argument.Value);
+ Assert.Empty(value.NamedArguments);
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs
index 2511c4be007d41..eebffb4057638f 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/CustomAttributeTests.cs
@@ -178,5 +178,835 @@ .method public static void TestMethod() cil managed
Assert.Equal(0x00, blobBytes[3]); // named arg count high
}
+ [Fact]
+ public void CustomAttribute_LocalAttributeConstructor_UsesMethodDefinitionHandleAndBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed beforefieldinit LocalAttribute extends [mscorlib]System.Attribute
+ {
+ .method public hidebysig specialname rtspecialname instance void .ctor(int32 'value') cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void LocalAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 )
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var testTypeHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var customAttributeHandle = Assert.Single(reader.GetCustomAttributes(testTypeHandle));
+ var customAttribute = reader.GetCustomAttribute(customAttributeHandle);
+
+ Assert.Equal(HandleKind.MethodDefinition, customAttribute.Constructor.Kind);
+
+ var constructorHandle = (MethodDefinitionHandle)customAttribute.Constructor;
+ var constructor = reader.GetMethodDefinition(constructorHandle);
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+
+ var attributeTypeHandle = reader.TypeDefinitions
+ .First(handle => reader.GetTypeDefinition(handle).GetMethods().Contains(constructorHandle));
+ Assert.Equal("LocalAttribute", reader.GetString(reader.GetTypeDefinition(attributeTypeHandle).Name));
+
+ Assert.Equal([0x01, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00], reader.GetBlobBytes(customAttribute.Value));
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalPrimitiveArrays_EmitExpectedBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ArrayAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(
+ float32[] singles,
+ float64[] doubles,
+ float32[] emptySingles,
+ float64[] emptyDoubles,
+ int64[] int64s,
+ int32[] int32s,
+ int16[] int16s,
+ int8[] int8s,
+ uint64[] uint64s,
+ uint32[] uint32s,
+ uint16[] uint16s,
+ uint8[] uint8s,
+ char[] chars,
+ bool[] bools,
+ string[] strings,
+ string[] emptyStrings) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ArrayAttribute::.ctor(
+ float32[],
+ float64[],
+ float32[],
+ float64[],
+ int64[],
+ int32[],
+ int16[],
+ int8[],
+ uint64[],
+ uint32[],
+ uint16[],
+ uint8[],
+ char[],
+ bool[],
+ string[],
+ string[]) = {
+ float32[2](1.5 2)
+ float64[2](3.5 4)
+ float32[0]( )
+ float64[0]( )
+ int64[2](5 6)
+ int32[2](7 8)
+ int16[2](9 10)
+ int8[2](11 12)
+ uint64[2](13 14)
+ uint32[2](15 16)
+ uint16[2](17 18)
+ uint8[2](19 20)
+ char[2](65 66)
+ bool[2](true false)
+ string[2]('alpha' nullref)
+ string[0]( )
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Empty(value.NamedArguments);
+ Assert.Equal(16, value.FixedArguments.Length);
+ AssertArrayArgument(value.FixedArguments[0], "float32[]", 1.5f, 2f);
+ AssertArrayArgument(value.FixedArguments[1], "float64[]", 3.5, 4d);
+ AssertArrayArgument(value.FixedArguments[2], "float32[]");
+ AssertArrayArgument(value.FixedArguments[3], "float64[]");
+ AssertArrayArgument(value.FixedArguments[4], "int64[]", 5L, 6L);
+ AssertArrayArgument(value.FixedArguments[5], "int32[]", 7, 8);
+ AssertArrayArgument(value.FixedArguments[6], "int16[]", (short)9, (short)10);
+ AssertArrayArgument(value.FixedArguments[7], "int8[]", (sbyte)11, (sbyte)12);
+ AssertArrayArgument(value.FixedArguments[8], "uint64[]", 13UL, 14UL);
+ AssertArrayArgument(value.FixedArguments[9], "uint32[]", 15U, 16U);
+ AssertArrayArgument(value.FixedArguments[10], "uint16[]", (ushort)17, (ushort)18);
+ AssertArrayArgument(value.FixedArguments[11], "uint8[]", (byte)19, (byte)20);
+ AssertArrayArgument(value.FixedArguments[12], "char[]", 'A', 'B');
+ AssertArrayArgument(value.FixedArguments[13], "bool[]", true, false);
+ AssertArrayArgument(value.FixedArguments[14], "string[]", "alpha", null);
+ AssertArrayArgument(value.FixedArguments[15], "string[]");
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalScalarArguments_DecodeExpectedValues()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ScalarAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(
+ bool booleanValue,
+ int8 int8Value,
+ uint8 uint8Value,
+ int16 int16Value,
+ uint16 uint16Value,
+ int32 int32Value,
+ uint32 uint32Value,
+ int64 int64Value,
+ uint64 uint64Value,
+ char charValue,
+ float32 singleValue,
+ float32 singleBits,
+ float64 doubleValue,
+ float64 doubleBits,
+ string text,
+ class [mscorlib]System.Type typeValue) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ScalarAttribute::.ctor(
+ bool,
+ int8,
+ uint8,
+ int16,
+ uint16,
+ int32,
+ uint32,
+ int64,
+ uint64,
+ char,
+ float32,
+ float32,
+ float64,
+ float64,
+ string,
+ class [mscorlib]System.Type) = {
+ bool(true)
+ int8(-1)
+ uint8(255)
+ int16(-2)
+ uint16(65535)
+ int32(-3)
+ uint32(4294967295)
+ int64(-4)
+ uint64(9223372036854775807)
+ char(65)
+ float32(1.5)
+ float32(1065353216)
+ float64(2.5)
+ float64(4607182418800017408)
+ string('text')
+ type(class 'Contoso.Target')
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ CustomAttributeValue value = reader
+ .GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Equal(
+ new object?[]
+ {
+ true,
+ (sbyte)-1,
+ (byte)255,
+ (short)-2,
+ (ushort)65535,
+ -3,
+ uint.MaxValue,
+ -4L,
+ 9223372036854775807UL,
+ 'A',
+ 1.5f,
+ 1f,
+ 2.5d,
+ 1d,
+ "text",
+ "Contoso.Target",
+ },
+ value.FixedArguments.Select(argument => argument.Value));
+ Assert.Empty(value.NamedArguments);
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalNamedArguments_EmitExpectedBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed NamedAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor() cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void NamedAttribute::.ctor() = {
+ field int32 Number = int32(42)
+ property string Message = string('hello')
+ property type Target = type(class 'Contoso.Target')
+ property object Boxed = object(int32(7))
+ property int32[] Values = int32[2](1 2)
+ property enum class 'Contoso.Kind' Kind = int32(3)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Empty(value.FixedArguments);
+ Assert.Equal(6, value.NamedArguments.Length);
+ AssertNamedArgument(value.NamedArguments[0], CustomAttributeNamedArgumentKind.Field, "Number", "int32", 42);
+ AssertNamedArgument(value.NamedArguments[1], CustomAttributeNamedArgumentKind.Property, "Message", "string", "hello");
+ AssertNamedArgument(value.NamedArguments[2], CustomAttributeNamedArgumentKind.Property, "Target", "System.Type", "Contoso.Target");
+ AssertNamedArgument(value.NamedArguments[3], CustomAttributeNamedArgumentKind.Property, "Boxed", "int32", 7);
+ Assert.Equal("Values", value.NamedArguments[4].Name);
+ Assert.Equal("int32[]", value.NamedArguments[4].Type);
+ AssertArrayValue(value.NamedArguments[4].Value, 1, 2);
+ AssertNamedArgument(value.NamedArguments[5], CustomAttributeNamedArgumentKind.Property, "Kind", "Contoso.Kind", 3);
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalTypeArgumentFromUnversionedAssemblyReference_EmitsAssemblyQualifiedTypeName()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External.Assembly { }
+ .assembly test { }
+ .class public auto ansi sealed TypeAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(class [mscorlib]System.Type 'value') cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void TypeAttribute::.ctor(class [mscorlib]System.Type) = {
+ type([External.Assembly]Contoso.ExternalType)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var externalAssembly = reader.AssemblyReferences
+ .Select(reader.GetAssemblyReference)
+ .Single(reference => reader.GetString(reference.Name) == "External.Assembly");
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)));
+
+ Assert.Equal(new Version(0, 0, 0, 0), externalAssembly.Version);
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ var argument = Assert.Single(value.FixedArguments);
+ Assert.Equal("System.Type", argument.Type);
+ Assert.Equal(
+ "Contoso.ExternalType, External.Assembly, PublicKeyToken=null",
+ argument.Value);
+ Assert.Empty(value.NamedArguments);
+ }
+
+ [Fact]
+ public void CustomAttribute_VerbalTypeAndObjectArrays_PreserveElementOrder()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External.Assembly { }
+ .assembly test { }
+ .class public auto ansi sealed ArrayAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(
+ class [mscorlib]System.Type[] types,
+ object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ArrayAttribute::.ctor(class [mscorlib]System.Type[], object[]) = {
+ type[3]([External.Assembly]Contoso.ExternalType nullref class 'Quoted.Type')
+ object[3](int32(1) string('text') object(bool(true)))
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(type)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Equal(2, value.FixedArguments.Length);
+ Assert.Equal("System.Type[]", value.FixedArguments[0].Type);
+ AssertArrayValue(
+ value.FixedArguments[0].Value,
+ "Contoso.ExternalType, External.Assembly, PublicKeyToken=null",
+ null,
+ "Quoted.Type");
+
+ Assert.Equal("object[]", value.FixedArguments[1].Type);
+ ImmutableArray> boxedValues =
+ Assert.IsType>>(value.FixedArguments[1].Value);
+ Assert.Collection(
+ boxedValues,
+ item =>
+ {
+ Assert.Equal("int32", item.Type);
+ Assert.Equal(1, item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("string", item.Type);
+ Assert.Equal("text", item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("bool", item.Type);
+ Assert.Equal(true, item.Value);
+ });
+ Assert.Empty(value.NamedArguments);
+ }
+
+ [Fact]
+ public void CustomAttribute_ExplicitOwners_AttachToTypeFieldAndMethod()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public int32 Value
+ .method public static void M() cil managed
+ {
+ ret
+ }
+ }
+
+ .custom (Test) instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom (field int32 Test::Value) instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom (method void Test::M()) instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeHandle = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var type = reader.GetTypeDefinition(typeHandle);
+ var fieldHandle = Assert.Single(type.GetFields());
+ var methodHandle = Assert.Single(type.GetMethods());
+
+ AssertCustomAttributeBlob(reader, Assert.Single(reader.GetCustomAttributes(typeHandle)));
+ AssertCustomAttributeBlob(reader, Assert.Single(reader.GetCustomAttributes(fieldHandle)));
+ AssertCustomAttributeBlob(reader, Assert.Single(reader.GetCustomAttributes(methodHandle)));
+ }
+
+ [Fact]
+ public void CustomAttribute_NoValueAndExplicitOwnerVerbalForms_DecodeExpectedValues()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ValueAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(int32 'value') cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor()
+ }
+ .custom (Test) instance void ValueAttribute::.ctor(int32) = { int32(42) }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attributes = reader.GetCustomAttributes(testType)
+ .Select(reader.GetCustomAttribute)
+ .Select(attribute => attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder))
+ .ToArray();
+
+ Assert.Equal(2, attributes.Length);
+ Assert.Contains(
+ attributes,
+ attribute => attribute.FixedArguments.Length == 0 && attribute.NamedArguments.Length == 0);
+ Assert.Contains(
+ attributes,
+ attribute =>
+ attribute.FixedArguments.Length == 1 &&
+ attribute.FixedArguments[0].Type == "int32" &&
+ Equals(attribute.FixedArguments[0].Value, 42));
+ }
+
+ [Fact]
+ public void CustomAttribute_BoxedByteArray_ReportsErrorAndEmitsDecodableFallback()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ArrayAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ArrayAttribute::.ctor(object[]) = {
+ object[1](bytearray(01))
+ }
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.InvalidMetadataToken);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ CustomAttributeValue attribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ var values = Assert.IsType>>(
+ Assert.Single(attribute.FixedArguments).Value);
+
+ var value = Assert.Single(values);
+ Assert.Equal("string", value.Type);
+ Assert.Null(value.Value);
+ }
+
+ [Fact]
+ public void AssemblyCustomAttribute_PreservesConstructorAndBlob()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly TestAssembly
+ {
+ .custom instance void [System.Runtime]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var customAttributeHandle = Assert.Single(reader.GetAssemblyDefinition().GetCustomAttributes());
+ var customAttribute = reader.GetCustomAttribute(customAttributeHandle);
+ var constructor = reader.GetMemberReference((MemberReferenceHandle)customAttribute.Constructor);
+ var attributeType = reader.GetTypeReference((TypeReferenceHandle)constructor.Parent);
+
+ Assert.Equal(".ctor", reader.GetString(constructor.Name));
+ Assert.Equal("CompilationRelaxationsAttribute", reader.GetString(attributeType.Name));
+ Assert.Equal([0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00], reader.GetBlobBytes(customAttribute.Value));
+ }
+
+ private static void AssertArrayArgument(
+ CustomAttributeTypedArgument argument,
+ string expectedType,
+ params object?[] expectedValues)
+ {
+ Assert.Equal(expectedType, argument.Type);
+ AssertArrayValue(argument.Value, expectedValues);
+ }
+
+ private static void AssertArrayValue(object? value, params object?[] expectedValues)
+ {
+ ImmutableArray> values =
+ Assert.IsType>>(value);
+ Assert.Equal(expectedValues, values.Select(item => item.Value));
+ }
+
+ private static void AssertNamedArgument(
+ CustomAttributeNamedArgument argument,
+ CustomAttributeNamedArgumentKind kind,
+ string name,
+ string type,
+ object? value)
+ {
+ Assert.Equal(kind, argument.Kind);
+ Assert.Equal(name, argument.Name);
+ Assert.Equal(type, argument.Type);
+ Assert.Equal(value, argument.Value);
+ }
+
+ private static void AssertCustomAttributeBlob(MetadataReader reader, CustomAttributeHandle handle)
+ {
+ var attribute = reader.GetCustomAttribute(handle);
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
+ [Fact]
+ public void CustomAttribute_ObjectArrayWithNestedObjectWrapper_DecodesProperly()
+ {
+ // Regression test: object(object(...)) elements in object[] were previously encoded with
+ // a TaggedObject (0x51) type code, which caused BadImageFormatException when decoding.
+ // The fix ensures object(...) wrappers are unwrapped to the concrete inner type.
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ObjArrAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ObjArrAttribute::.ctor(object[]) = {
+ object[2](object(bool(true)) object(int32(42)))
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+
+ Assert.Single(value.FixedArguments);
+ ImmutableArray> elements =
+ Assert.IsType>>(value.FixedArguments[0].Value);
+ Assert.Collection(
+ elements,
+ item =>
+ {
+ Assert.Equal("bool", item.Type);
+ Assert.Equal(true, item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("int32", item.Type);
+ Assert.Equal(42, item.Value);
+ });
+ }
+
+ [Fact]
+ public void CustomAttribute_ObjectArrayWithNestedArrays_DecodesProperly()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi sealed ObjArrAttribute extends [mscorlib]System.Attribute
+ {
+ .method public specialname rtspecialname instance void .ctor(object[] values) cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Attribute::.ctor()
+ ret
+ }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void ObjArrAttribute::.ctor(object[]) = {
+ object[2](int32[2](1 2) object(string[2]('alpha' nullref)))
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)));
+ CustomAttributeValue value = attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ ImmutableArray> elements =
+ Assert.IsType>>(
+ Assert.Single(value.FixedArguments).Value);
+
+ Assert.Collection(
+ elements,
+ element =>
+ {
+ Assert.Equal("int32[]", element.Type);
+ AssertArrayValue(element.Value, 1, 2);
+ },
+ element =>
+ {
+ Assert.Equal("string[]", element.Type);
+ AssertArrayValue(element.Value, "alpha", null);
+ });
+ }
+
+ [Theory]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor(int32) = {
+ float32('a')
+ }
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static literal float32 F = float32('a')
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M(float32 'value') cil managed
+ {
+ .param [1] = float32('a')
+ ret
+ }
+ }
+ """)]
+ public void MalformedScalarInitializer_ReportsDiagnosticsInsteadOfThrowing(string source)
+ {
+ ImmutableArray diagnostics =
+ DocumentCompilerTestHelpers.CompileAndGetDiagnostics(
+ source,
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ }
+
+ [Fact]
+ public void MalformedNestedCustomAttributeSequence_DoesNotLeakFramesIntoNextDocument()
+ {
+ ImmutableArray documents =
+ [
+ new SourceText("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Broken extends [mscorlib]System.Object
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor(object[]) = {
+ object[2](type[1]([Discarded]Namespace.Type)
+ """, "broken.il"),
+ new SourceText("""
+ .class public auto ansi Following extends [mscorlib]System.Object
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = { }
+ }
+ """, "following.il")
+ ];
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ documents,
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ TypeDefinitionHandle followingHandle = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Following");
+
+ Assert.DoesNotContain(
+ reader.AssemblyReferences.Select(reader.GetAssemblyReference),
+ reference => reader.GetString(reference.Name) == "Discarded");
+ AssertCustomAttributeBlob(
+ reader,
+ Assert.Single(reader.GetCustomAttributes(followingHandle)));
+ }
+
+ [Fact]
+ public void MethodBodyCustomAttributes_PreserveOwnerAndOrder()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M(int32 'value') cil managed
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (01 00 00 00)
+ .param [1]
+ .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (01 00 00 00)
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param type T
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (01 00 00 00)
+ .param constraint T, [mscorlib]System.IDisposable
+ .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (01 00 00 00)
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ MethodDefinitionHandle methodHandle = Assert.Single(reader.MethodDefinitions);
+ var method = reader.GetMethodDefinition(methodHandle);
+ ParameterHandle parameterHandle = method.GetParameters()
+ .Single(handle => reader.GetParameter(handle).SequenceNumber == 1);
+ GenericParameterHandle genericParameterHandle = Assert.Single(method.GetGenericParameters());
+ GenericParameterConstraintHandle constraintHandle =
+ Assert.Single(reader.GetGenericParameter(genericParameterHandle).GetConstraints());
+
+ Assert.Equal(
+ ["ObsoleteAttribute", "DebuggerHiddenAttribute"],
+ GetAttributeTypeNames(reader, reader.GetCustomAttributes(methodHandle)));
+ Assert.Equal(
+ ["DebuggerHiddenAttribute", "ObsoleteAttribute"],
+ GetAttributeTypeNames(reader, reader.GetCustomAttributes(parameterHandle)));
+ Assert.Equal(
+ ["ObsoleteAttribute", "DebuggerHiddenAttribute"],
+ GetAttributeTypeNames(reader, reader.GetCustomAttributes(genericParameterHandle)));
+ Assert.Equal(
+ ["DebuggerHiddenAttribute", "ObsoleteAttribute"],
+ GetAttributeTypeNames(reader, reader.GetCustomAttributes(constraintHandle)));
+
+ static string[] GetAttributeTypeNames(
+ MetadataReader reader,
+ CustomAttributeHandleCollection attributes)
+ => attributes
+ .Select(reader.GetCustomAttribute)
+ .Select(attribute => reader.GetMemberReference((MemberReferenceHandle)attribute.Constructor))
+ .Select(constructor => reader.GetTypeReference((TypeReferenceHandle)constructor.Parent))
+ .Select(type => reader.GetString(type.Name))
+ .ToArray();
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs
index b070fd44a541f1..bee32b4291a744 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/DataTests.cs
@@ -6,11 +6,13 @@
using System.Buffers.Binary;
using System.Collections.Generic;
using System.Collections.Immutable;
+using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Internal.IL;
@@ -21,6 +23,138 @@ namespace ILAssembler.Tests
{
public class DataTests
{
+ [Fact]
+ public void DataItems_EmitExpectedTypedBytesAndRepeatCounts()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .data D_STRING = char*("Hi")
+ .data D_BYTES = bytearray(01 02 03 04)
+ .data D_BRACES = { int32(0x11223344), int16(0x5566), int8(0x77) }
+ .data D_REPEAT = int32(7)[3]
+ .data D_F32 = float32(1.5)
+ .data D_F64 = float64(2.25)
+ .data D_ZERO8 = int8[3]
+ .data D_ZERO16 = int16[2]
+ .data D_ZERO32 = int32[2]
+ .data D_ZERO64 = int64[2]
+ .data D_ZEROF32 = float32[2]
+ .data D_ZEROF64 = float64[2]
+
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 64
+ .field [0] public static int8 StringData at D_STRING
+ .field [4] public static int8 ByteData at D_BYTES
+ .field [8] public static int8 BracedData at D_BRACES
+ .field [16] public static int8 RepeatedData at D_REPEAT
+ .field [28] public static int8 Float32Data at D_F32
+ .field [32] public static int8 Float64Data at D_F64
+ .field [40] public static int8 Zero8Data at D_ZERO8
+ .field [44] public static int8 Zero16Data at D_ZERO16
+ .field [48] public static int8 Zero32Data at D_ZERO32
+ .field [52] public static int8 Zero64Data at D_ZERO64
+ .field [56] public static int8 ZeroFloat32Data at D_ZEROF32
+ .field [60] public static int8 ZeroFloat64Data at D_ZEROF64
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+
+ Assert.Equal(
+ [0x48, 0x00, 0x69, 0x00],
+ ReadData(pe, fields["StringData"], 4));
+ Assert.Equal(
+ [0x01, 0x02, 0x03, 0x04],
+ ReadData(pe, fields["ByteData"], 4));
+ Assert.Equal(
+ [0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x77],
+ ReadData(pe, fields["BracedData"], 7));
+
+ byte[] repeatedData = ReadData(pe, fields["RepeatedData"], 12);
+ Assert.Equal(new[] { 7, 7, 7 }, MemoryMarshal.Cast(repeatedData).ToArray());
+ Assert.Equal(1.5f, BitConverter.ToSingle(ReadData(pe, fields["Float32Data"], 4)));
+ Assert.Equal(2.25, BitConverter.ToDouble(ReadData(pe, fields["Float64Data"], 8)));
+
+ Assert.All(ReadData(pe, fields["Zero8Data"], 3), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["Zero16Data"], 4), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["Zero32Data"], 8), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["Zero64Data"], 16), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["ZeroFloat32Data"], 8), value => Assert.Equal(0, value));
+ Assert.All(ReadData(pe, fields["ZeroFloat64Data"], 16), value => Assert.Equal(0, value));
+ }
+
+ [Fact]
+ public void ClassScopedDataDirective_EmitsFieldRvaValue()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 4
+ .data ClassData = int32(1234)
+ .field [0] public static int32 Value at ClassData
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(Assert.Single(reader.FieldDefinitions));
+
+ Assert.Equal(
+ 1234,
+ BitConverter.ToInt32(
+ pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent().AsSpan(0, sizeof(int))));
+ }
+
+ [Fact]
+ public void DataDirectives_EmitExpectedMappedFieldDataBytes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .data IntData = int32(0x12345678)
+ .data ByteData = bytearray (AA BB CC DD)
+ .data FloatData = float32(3.5)
+
+ .class public explicit ansi sealed beforefieldinit DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 16
+ .field [0] public static int32 IntField at IntData
+ .field [4] public static int32 ByteField at ByteData
+ .field [8] public static float32 FloatField at FloatData
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(definition => reader.GetString(definition.Name) == "DataHolder");
+ var fields = new Dictionary();
+
+ foreach (var fieldHandle in type.GetFields())
+ {
+ var field = reader.GetFieldDefinition(fieldHandle);
+ fields.Add(reader.GetString(field.Name), field);
+ }
+
+ int intRva = fields["IntField"].GetRelativeVirtualAddress();
+ int byteRva = fields["ByteField"].GetRelativeVirtualAddress();
+ int floatRva = fields["FloatField"].GetRelativeVirtualAddress();
+
+ Assert.Equal([0x78, 0x56, 0x34, 0x12], pe.GetSectionData(intRva).GetContent().Take(4).ToArray());
+ Assert.Equal([0xAA, 0xBB, 0xCC, 0xDD], pe.GetSectionData(byteRva).GetContent().Take(4).ToArray());
+ Assert.Equal([0x00, 0x00, 0x60, 0x40], pe.GetSectionData(floatRva).GetContent().Take(4).ToArray());
+ }
+
[Fact]
public void Diagnostic_InvalidMetadataToken()
{
@@ -92,5 +226,155 @@ ldsfld int8 result
0x63,
pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent(0, 1)[0]);
}
+
+ [Fact]
+ public void Float64Data_IntegerLiteral_PreservesValue()
+ {
+ string source = """
+ .assembly test { }
+ .data D = float64(4503599627370496.)
+ .class public auto ansi Test
+ {
+ .field public static float64 Value at D
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ ReadOnlySpan data = pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent().AsSpan(0, sizeof(double));
+
+ Assert.Equal(4503599627370496d, BitConverter.Int64BitsToDouble(BinaryPrimitives.ReadInt64LittleEndian(data)));
+ }
+
+ [Fact]
+ public void LargeByteArray_StreamsIntoDataSectionWithoutLosingBytes()
+ {
+ const int Length = 64 * 1024;
+ byte[] expected = new byte[Length];
+ for (int i = 0; i < Length; i++)
+ {
+ expected[i] = (byte)((i * 31) + 7);
+ }
+
+ StringBuilder literal = new(Length * 3);
+ for (int i = 0; i < Length; i++)
+ {
+ if (i > 0)
+ {
+ literal.Append(i % 32 == 0 ? '\n' : ' ');
+ }
+
+ literal.Append(expected[i].ToString("X2", CultureInfo.InvariantCulture));
+ }
+
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .data D_LARGE = bytearray ({{literal}})
+
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 8
+ .field [0] public static int8 LargeData at D_LARGE
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "LargeData");
+
+ Assert.Equal(expected, ReadData(pe, field, Length));
+ }
+
+ [Fact]
+ public void DataDeclaration_SyntaxVariantsPreserveOffsetsAndReferenceFixups()
+ {
+ string source = """
+ .assembly test { }
+ .data int8(0x7A)
+ .data cil CilData = int8(0x22)
+ .data TargetData = int32(0x12345678)
+ .data ParenthesizedReference = &(TargetData)
+
+ .class public explicit ansi sealed DataHolder
+ {
+ .field [0] public static int8 CilValue at CilData
+ .field [1] public static int32 TargetValue at TargetData
+ .field [5] public static int32 ParenthesizedValue at ParenthesizedReference
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ MetadataReader reader = pe.GetMetadataReader();
+ Dictionary fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+
+ int cilRva = fields["CilValue"].GetRelativeVirtualAddress();
+ int targetRva = fields["TargetValue"].GetRelativeVirtualAddress();
+ int parenthesizedRva = fields["ParenthesizedValue"].GetRelativeVirtualAddress();
+
+ Assert.Equal(cilRva + 1, targetRva);
+ Assert.Equal(targetRva + sizeof(int), parenthesizedRva);
+ Assert.Equal(0x22, Assert.Single(ReadData(pe, fields["CilValue"], 1)));
+ Assert.Equal(0x12345678, BitConverter.ToInt32(ReadData(pe, fields["TargetValue"], sizeof(int))));
+ Assert.Equal(
+ pe.PEHeaders.PEHeader!.ImageBase + (uint)targetRva,
+ BitConverter.ToUInt32(ReadData(pe, fields["ParenthesizedValue"], sizeof(int))));
+ }
+
+ [Fact]
+ public void MalformedDataDeclaration_DoesNotLeakBytesOrLabelIntoNextDocument()
+ {
+ ImmutableArray documents =
+ [
+ new SourceText("""
+ .assembly test { }
+ .data Broken = { int8(0xAA), }
+ """, "broken.il"),
+ new SourceText("""
+ .data Good = int32(0x12345678)
+ .class public auto ansi DataHolder
+ {
+ .field public static int8 Missing at Broken
+ .field public static int32 Value at Good
+ }
+ """, "valid.il"),
+ ];
+
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ Dictionary fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+
+ Assert.Equal(0, fields["Missing"].GetRelativeVirtualAddress());
+ Assert.Equal(
+ 0x12345678,
+ BitConverter.ToInt32(ReadData(pe, fields["Value"], sizeof(int))));
+ }
+
+ private static byte[] ReadData(PEReader pe, FieldDefinition field, int length)
+ {
+ int rva = field.GetRelativeVirtualAddress();
+ Assert.NotEqual(0, rva);
+ return pe.GetSectionData(rva).GetContent().AsSpan(0, length).ToArray();
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs
index 6de588a7e45429..9b915d2e25d864 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTestHelpers.cs
@@ -11,6 +11,7 @@
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Text;
using Internal.IL;
using Xunit;
@@ -18,6 +19,42 @@ namespace ILAssembler.Tests
{
internal static class DocumentCompilerTestHelpers
{
+ internal static MetadataStringDecoder Decoder { get; } = new();
+
+ internal static PEReader CompileAndGetReader(string source, Options options)
+ {
+ var sourceText = new SourceText(source, "test.il");
+ return CompileAndGetReader(sourceText, _ =>
+ {
+ Assert.Fail("Expected no includes");
+ return default;
+ }, _ =>
+ {
+ Assert.Fail("Expected no resources");
+ return default;
+ }, options);
+ }
+
+ internal static PEReader CompileAndGetReader(SourceText sourceText, Func includedDocumentLoader, Options options)
+ {
+ return CompileAndGetReader(sourceText, includedDocumentLoader, _ =>
+ {
+ Assert.Fail("Expected no resources");
+ return default;
+ }, options);
+ }
+
+ internal static PEReader CompileAndGetReader(SourceText sourceText, Func includedDocumentLoader, Func resourceLocator, Options options)
+ {
+ var documentCompiler = new DocumentCompiler();
+ var (diagnostics, result) = documentCompiler.Compile(sourceText, includedDocumentLoader, resourceLocator, options);
+ Assert.Empty(diagnostics);
+ Assert.NotNull(result);
+ var blobBuilder = new BlobBuilder();
+ result!.Serialize(blobBuilder);
+ return new PEReader(blobBuilder.ToImmutableArray());
+ }
+
internal static ImmutableArray Compile(string source, Options options)
{
var sourceText = new SourceText(source, "test.il");
@@ -34,9 +71,9 @@ internal static ImmutableArray Compile(string source, Options options)
return blobBuilder.ToImmutableArray();
}
- internal static PEReader CompileAndGetReader(string source, Options options)
+ internal static ImmutableArray CompileAndGetImageBytes(string source, Options options)
{
- return new PEReader(Compile(source, options));
+ return Compile(source, options);
}
internal static ImmutableArray CompileAndGetEmbeddedPortablePdb(string source, Options options)
@@ -99,6 +136,48 @@ internal static int GetFirstTokenOperand(PEReader pe, MetadataReader reader, str
return 0;
}
+ internal static ImmutableArray GetTokenOperands(
+ PEReader pe,
+ MetadataReader reader,
+ string methodName,
+ ILOpcode targetOpcode)
+ {
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == methodName);
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+ var operands = ImmutableArray.CreateBuilder();
+
+ int offset = 0;
+ while (offset < il.Length)
+ {
+ var opcode = (ILOpcode)il[offset];
+ int operandStart = offset + 1;
+ if (opcode == ILOpcode.prefix1)
+ {
+ opcode = (ILOpcode)(0x100 + il[offset + 1]);
+ operandStart = offset + 2;
+ }
+
+ if (opcode == targetOpcode)
+ {
+ operands.Add(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(operandStart)));
+ }
+
+ if (opcode == ILOpcode.switch_)
+ {
+ uint count = BinaryPrimitives.ReadUInt32LittleEndian(il.AsSpan(operandStart));
+ offset = operandStart + 4 + checked((int)count * 4);
+ }
+ else
+ {
+ offset += opcode.GetSize();
+ }
+ }
+
+ return operands.ToImmutable();
+ }
+
internal static void AssertTypeDefToken(MetadataReader reader, int token, string expectedName)
{
var handle = MetadataTokens.EntityHandle(token);
@@ -149,5 +228,162 @@ internal static ImmutableArray CompileAndGetDiagnostics(string sourc
}, _ => { Assert.Fail("Expected no resources"); return default; }, options);
return diagnostics;
}
+
+ internal sealed class MetadataStringDecoder :
+ ISignatureTypeProvider,
+ ICustomAttributeTypeProvider
+ {
+ public string GetArrayType(string elementType, ArrayShape shape)
+ {
+ var builder = new StringBuilder(elementType);
+ builder.Append('[');
+ for (int i = 0; i < shape.Rank; i++)
+ {
+ if (i > 0)
+ {
+ builder.Append(',');
+ }
+
+ int lowerBound = i < shape.LowerBounds.Length ? shape.LowerBounds[i] : 0;
+ if (i < shape.LowerBounds.Length)
+ {
+ builder.Append(lowerBound);
+ }
+
+ builder.Append("...");
+ if (i < shape.Sizes.Length)
+ {
+ builder.Append(lowerBound + shape.Sizes[i] - 1);
+ }
+ }
+
+ builder.Append(']');
+ return builder.ToString();
+ }
+
+ public string GetByReferenceType(string elementType) => elementType + "&";
+
+ public string GetFunctionPointerType(MethodSignature signature)
+ {
+ var builder = new StringBuilder("method ");
+ builder.Append(signature.ReturnType);
+ builder.Append(" *(");
+ for (int i = 0; i < signature.ParameterTypes.Length; i++)
+ {
+ if (i > 0)
+ {
+ builder.Append(", ");
+ }
+
+ if (i == signature.RequiredParameterCount)
+ {
+ builder.Append("..., ");
+ }
+
+ builder.Append(signature.ParameterTypes[i]);
+ }
+
+ builder.Append(')');
+ return builder.ToString();
+ }
+
+ public string GetGenericInstantiation(string genericType, ImmutableArray typeArguments) =>
+ genericType + "<" + string.Join(",", typeArguments) + ">";
+
+ public string GetGenericMethodParameter(object? genericContext, int index) => "!!" + index;
+
+ public string GetGenericTypeParameter(object? genericContext, int index) => "!" + index;
+
+ public string GetModifiedType(string modifier, string unmodifiedType, bool isRequired) =>
+ unmodifiedType + (isRequired ? " modreq(" : " modopt(") + modifier + ")";
+
+ public string GetPinnedType(string elementType) => elementType + " pinned";
+
+ public string GetPointerType(string elementType) => elementType + "*";
+
+ public string GetPrimitiveType(PrimitiveTypeCode typeCode) => typeCode switch
+ {
+ PrimitiveTypeCode.Boolean => "bool",
+ PrimitiveTypeCode.Byte => "uint8",
+ PrimitiveTypeCode.Char => "char",
+ PrimitiveTypeCode.Double => "float64",
+ PrimitiveTypeCode.Int16 => "int16",
+ PrimitiveTypeCode.Int32 => "int32",
+ PrimitiveTypeCode.Int64 => "int64",
+ PrimitiveTypeCode.IntPtr => "native int",
+ PrimitiveTypeCode.Object => "object",
+ PrimitiveTypeCode.SByte => "int8",
+ PrimitiveTypeCode.Single => "float32",
+ PrimitiveTypeCode.String => "string",
+ PrimitiveTypeCode.TypedReference => "typedref",
+ PrimitiveTypeCode.UInt16 => "uint16",
+ PrimitiveTypeCode.UInt32 => "uint32",
+ PrimitiveTypeCode.UInt64 => "uint64",
+ PrimitiveTypeCode.UIntPtr => "native uint",
+ PrimitiveTypeCode.Void => "void",
+ _ => throw new ArgumentOutOfRangeException(nameof(typeCode)),
+ };
+
+ public string GetSZArrayType(string elementType) => elementType + "[]";
+
+ public string GetSystemType() => "System.Type";
+
+ public string GetTypeFromDefinition(
+ MetadataReader reader,
+ TypeDefinitionHandle handle,
+ byte rawTypeKind)
+ {
+ TypeDefinition definition = reader.GetTypeDefinition(handle);
+ string name = definition.Namespace.IsNil
+ ? reader.GetString(definition.Name)
+ : reader.GetString(definition.Namespace) + "." + reader.GetString(definition.Name);
+
+ TypeDefinitionHandle declaringType = definition.GetDeclaringType();
+ return declaringType.IsNil
+ ? name
+ : GetTypeFromDefinition(reader, declaringType, 0) + "/" + reader.GetString(definition.Name);
+ }
+
+ public string GetTypeFromReference(
+ MetadataReader reader,
+ TypeReferenceHandle handle,
+ byte rawTypeKind)
+ {
+ TypeReference reference = reader.GetTypeReference(handle);
+ string name = reference.Namespace.IsNil
+ ? reader.GetString(reference.Name)
+ : reader.GetString(reference.Namespace) + "." + reader.GetString(reference.Name);
+
+ if (name == "System.Type")
+ {
+ return name;
+ }
+
+ return reference.ResolutionScope.Kind switch
+ {
+ HandleKind.AssemblyReference =>
+ "[" + reader.GetString(reader.GetAssemblyReference((AssemblyReferenceHandle)reference.ResolutionScope).Name) + "]" + name,
+ HandleKind.ModuleReference =>
+ "[.module " + reader.GetString(reader.GetModuleReference((ModuleReferenceHandle)reference.ResolutionScope).Name) + "]" + name,
+ HandleKind.TypeReference =>
+ GetTypeFromReference(reader, (TypeReferenceHandle)reference.ResolutionScope, 0) + "/" + name,
+ _ => name,
+ };
+ }
+
+ public string GetTypeFromSerializedName(string name) => name;
+
+ public string GetTypeFromSpecification(
+ MetadataReader reader,
+ object? genericContext,
+ TypeSpecificationHandle handle,
+ byte rawTypeKind) =>
+ reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext);
+
+ public PrimitiveTypeCode GetUnderlyingEnumType(string type) => PrimitiveTypeCode.Int32;
+
+ public bool IsSystemType(string type) =>
+ type is "System.Type" or "[mscorlib]System.Type" or "[System.Runtime]System.Type";
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTests.cs
new file mode 100644
index 00000000000000..8fc79e9ea39886
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/DocumentCompilerTests.cs
@@ -0,0 +1,202 @@
+// 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.Immutable;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.PortableExecutable;
+using Xunit;
+
+namespace ILAssembler.Tests
+{
+ public class DocumentCompilerTests
+ {
+ [Fact]
+ public void ParserDiagnosticInLaterDocument_UsesDocumentPath_AndErrorTolerantStillEmitsImage()
+ {
+ var documents = ImmutableArray.Create(
+ new SourceText("""
+ .assembly test { }
+ .class public auto ansi beforefieldinit ValidFromDoc1
+ {
+ }
+ """, "valid.il"),
+ new SourceText("""
+ .class public auto ansi beforefieldinit Broken
+ {
+ .method public static void M(int32 int32 int32) cil managed
+ {
+ ret
+ }
+ }
+ """, "broken.il"));
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+ var parserDiagnostic = Assert.Single(diagnostics.Where(diagnostic => diagnostic.Id == "Parser"));
+
+ Assert.Equal("broken.il", parserDiagnostic.Location.Source.Path);
+ Assert.True(parserDiagnostic.Location.Span.Start >= 0);
+ Assert.True(parserDiagnostic.Location.Span.Length > 0);
+ Assert.NotNull(image);
+
+ var imageBuilder = new BlobBuilder();
+ image!.Serialize(imageBuilder);
+ using var pe = new PEReader(imageBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var typeNames = reader.TypeDefinitions
+ .Select(handle => reader.GetString(reader.GetTypeDefinition(handle).Name))
+ .ToArray();
+
+ Assert.Contains("ValidFromDoc1", typeNames);
+ }
+
+ [Fact]
+ public void TruncatedDocument_DoesNotLeakScopesIntoTheNextDocument()
+ {
+ var documents = ImmutableArray.Create(
+ new SourceText("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .namespace Leaky
+ {
+ .class public auto ansi Unterminated
+ {
+ .method public static void M() cil managed
+ {
+ ret
+ """, "truncated.il"),
+ new SourceText("""
+ .class public auto ansi AfterTruncation
+ {
+ }
+ """, "next.il"));
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ Assert.NotNull(image);
+
+ var imageBuilder = new BlobBuilder();
+ image!.Serialize(imageBuilder);
+ using var pe = new PEReader(imageBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var afterTruncation = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "AfterTruncation");
+
+ Assert.Equal(string.Empty, reader.GetString(afterTruncation.Namespace));
+ Assert.True(afterTruncation.GetDeclaringType().IsNil);
+ }
+
+ [Theory]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Broken
+ {
+ .method public static void M(int32 int32 int32) cil managed
+ {
+ ret
+ }
+ }
+ .class public auto ansi Following
+ {
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .namespace Broken
+ {
+ .class public auto ansi Nested
+ {
+ .method public static void M(int32 int32 int32) cil managed
+ {
+ ret
+ }
+ }
+ }
+ .class public auto ansi Following
+ {
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .namespace
+ {
+ }
+ .class public auto ansi Following
+ {
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Broken extends
+ {
+ }
+ .class public auto ansi Following
+ {
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Broken
+ {
+ .method public static void M() cil managed
+ {
+ .try
+ {
+ {
+ nop nop nop int32
+ }
+ }
+ finally
+ {
+ endfinally
+ }
+ ret
+ }
+ }
+ .class public auto ansi Following
+ {
+ }
+ """)]
+ public void SyntaxErrorInDeclaration_DoesNotLeakScopesIntoFollowingDeclarations(string source)
+ {
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ Assert.NotNull(image);
+
+ var imageBuilder = new BlobBuilder();
+ image!.Serialize(imageBuilder);
+ using var pe = new PEReader(imageBuilder.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var following = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Following");
+
+ Assert.Equal(string.Empty, reader.GetString(following.Namespace));
+ Assert.True(following.GetDeclaringType().IsNil);
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs
index 4e897e6d1fd3ae..eaf8ea7a7c76b7 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/EventTests.cs
@@ -68,5 +68,142 @@ .event MyDelegate MyEvent
var attrs = reader.GetCustomAttributes(eventHandle);
Assert.True(attrs.Count >= 1, $"Event should have at least 1 custom attribute, got {attrs.Count}");
}
+
+ [Fact]
+ public void EventWithRaiseAccessor_EmitsAccessorMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi MyDelegate extends [mscorlib]System.MulticastDelegate
+ {
+ .method public specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
+ {
+ }
+ .method public virtual instance void Invoke() runtime managed
+ {
+ }
+ }
+ .class public auto ansi MyClass extends [mscorlib]System.Object
+ {
+ .method public hidebysig specialname instance void add_MyEvent(class MyDelegate 'value') cil managed
+ {
+ ret
+ }
+ .method public hidebysig specialname instance void remove_MyEvent(class MyDelegate 'value') cil managed
+ {
+ ret
+ }
+ .method public hidebysig specialname instance void raise_MyEvent() cil managed
+ {
+ ret
+ }
+ .event MyDelegate MyEvent
+ {
+ .addon instance void MyClass::add_MyEvent(class MyDelegate)
+ .removeon instance void MyClass::remove_MyEvent(class MyDelegate)
+ .fire instance void MyClass::raise_MyEvent()
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var eventHandle = reader.EventDefinitions.Single();
+ var @event = reader.GetEventDefinition(eventHandle);
+ var accessors = @event.GetAccessors();
+ string eventTypeName = @event.Type.Kind switch
+ {
+ HandleKind.TypeDefinition => reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)@event.Type).Name),
+ HandleKind.TypeReference => reader.GetString(reader.GetTypeReference((TypeReferenceHandle)@event.Type).Name),
+ _ => throw new InvalidOperationException($"Unexpected event type handle kind '{@event.Type.Kind}'."),
+ };
+
+ Assert.Equal("MyEvent", reader.GetString(@event.Name));
+ Assert.Equal("MyDelegate", eventTypeName);
+ Assert.Equal("add_MyEvent", reader.GetString(reader.GetMethodDefinition(accessors.Adder).Name));
+ Assert.Equal("remove_MyEvent", reader.GetString(reader.GetMethodDefinition(accessors.Remover).Name));
+ Assert.Equal("raise_MyEvent", reader.GetString(reader.GetMethodDefinition(accessors.Raiser).Name));
+ Assert.Equal(3, reader.GetTableRowCount(TableIndex.MethodSemantics));
+ }
+
+ [Fact]
+ public void EventAttributesOtherAccessorAndCustomAttribute_EmitMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi MyDelegate extends [mscorlib]System.MulticastDelegate
+ {
+ .method public specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed { }
+ .method public virtual instance void Invoke() runtime managed { }
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public specialname instance void add_Changed(class MyDelegate 'value') cil managed { ret }
+ .method public specialname instance void remove_Changed(class MyDelegate 'value') cil managed { ret }
+ .method public specialname instance void raise_Changed() cil managed { ret }
+ .method public specialname instance void other_Changed() cil managed { ret }
+
+ .event specialname rtspecialname MyDelegate Changed
+ {
+ .addon instance void Test::add_Changed(class MyDelegate)
+ .removeon instance void Test::remove_Changed(class MyDelegate)
+ .fire instance void Test::raise_Changed()
+ .other instance void Test::other_Changed()
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var eventHandle = Assert.Single(reader.EventDefinitions);
+ var @event = reader.GetEventDefinition(eventHandle);
+ var accessors = @event.GetAccessors();
+
+ Assert.True(@event.Attributes.HasFlag(EventAttributes.SpecialName));
+ Assert.Equal("add_Changed", reader.GetString(reader.GetMethodDefinition(accessors.Adder).Name));
+ Assert.Equal("remove_Changed", reader.GetString(reader.GetMethodDefinition(accessors.Remover).Name));
+ Assert.Equal("raise_Changed", reader.GetString(reader.GetMethodDefinition(accessors.Raiser).Name));
+ Assert.Equal(
+ "other_Changed",
+ reader.GetString(reader.GetMethodDefinition(Assert.Single(accessors.Others)).Name));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(eventHandle))).Value));
+ }
+
+ [Fact]
+ public void EventWithoutType_EmitsNilEventType()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public specialname instance void add_Changed(object) cil managed
+ {
+ ret
+ }
+ .method public specialname instance void remove_Changed(object) cil managed
+ {
+ ret
+ }
+ .event Changed
+ {
+ .addon instance void Test::add_Changed(object)
+ .removeon instance void Test::remove_Changed(object)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var @event = reader.GetEventDefinition(Assert.Single(reader.EventDefinitions));
+
+ Assert.Equal("Changed", reader.GetString(@event.Name));
+ Assert.True(@event.Type.IsNil);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs
index 0096d504f27497..35984ed433dd62 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ExceptionHandlingTests.cs
@@ -196,5 +196,513 @@ leave.s IL_5 // 1-2
Assert.True(methodDef.RelativeVirtualAddress != 0);
}
+ [Fact]
+ public void InvalidExceptionRegion_WithErrorTolerantOption_PreservesMethodBodyAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 3
+ .try 5 to 0 finally handler 0 to 1
+ ret
+ }
+ }
+ """;
+
+ var sourceText = new SourceText(source, "test.il");
+ DocumentCompiler compiler = new();
+ var (_, result) = compiler.Compile(
+ sourceText,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ MethodDefinition method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "TestMethod");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(3, body.MaxStack);
+ Assert.False(body.LocalVariablesInitialized);
+ Assert.Empty(body.ExceptionRegions);
+ }
+
+ [Theory]
+ [InlineData("br -9", ILOpCode.Br, -9, 5)]
+ [InlineData("br.s -3", ILOpCode.Br_s, -3, 2)]
+ public void NegativeBranchIntoMethodHeader_WithErrorTolerantOption_PreservesMethodBody(
+ string branchInstruction,
+ ILOpCode branchOpCode,
+ int branchOffset,
+ int tryEnd)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try 0 to {{tryEnd}} finally handler {{tryEnd}} to {{tryEnd + 1}}
+ {{branchInstruction}}
+ endfinally
+ ret
+ }
+ }
+ """;
+
+ using PEReader pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { ErrorTolerant = true });
+ MetadataReader reader = pe.GetMetadataReader();
+ MethodDefinition method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "TestMethod");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ byte[] il = body.GetILBytes()!;
+
+ Assert.Equal((byte)branchOpCode, il[0]);
+ if (branchOpCode == ILOpCode.Br_s)
+ {
+ Assert.Equal(branchOffset, unchecked((sbyte)il[1]));
+ }
+ else
+ {
+ Assert.Equal(branchOffset, BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1)));
+ }
+ Assert.Equal((byte)ILOpCode.Endfinally, il[tryEnd]);
+ Assert.Equal((byte)ILOpCode.Ret, il[tryEnd + 1]);
+
+ Assert.Equal(1, body.MaxStack);
+ Assert.False(body.LocalVariablesInitialized);
+ Assert.True(body.LocalSignature.IsNil);
+
+ ExceptionRegion region = Assert.Single(body.ExceptionRegions);
+ Assert.Equal(ExceptionRegionKind.Finally, region.Kind);
+ Assert.Equal(0, region.TryOffset);
+ Assert.Equal(tryEnd, region.TryLength);
+ Assert.Equal(tryEnd, region.HandlerOffset);
+ Assert.Equal(1, region.HandlerLength);
+ }
+
+ [Fact]
+ public void OffsetBasedCatchRegion_EmitsExactExceptionRegionBounds()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try 0 to 5 catch [mscorlib]System.Exception handler 5 to 8
+ nop
+ nop
+ nop
+ leave.s IL_8
+ IL_5:
+ pop
+ leave.s IL_8
+ IL_8:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Catch, region.Kind);
+ Assert.Equal(0, region.TryOffset);
+ Assert.Equal(5, region.TryLength);
+ Assert.Equal(5, region.HandlerOffset);
+ Assert.Equal(3, region.HandlerLength);
+ Assert.Equal("Exception", reader.GetString(reader.GetTypeReference((TypeReferenceHandle)region.CatchType).Name));
+ }
+
+ [Fact]
+ public void OffsetBasedFinallyRegion_EmitsExactExceptionRegionBounds()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try 0 to 3 finally handler 3 to 4
+ nop
+ leave.s IL_4
+ IL_3:
+ endfinally
+ IL_4:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Finally, region.Kind);
+ Assert.Equal(0, region.TryOffset);
+ Assert.Equal(3, region.TryLength);
+ Assert.Equal(3, region.HandlerOffset);
+ Assert.Equal(1, region.HandlerLength);
+ }
+
+ [Fact]
+ public void FilterHandler_EmitsFilterExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ ldnull
+ throw
+ }
+ filter
+ {
+ pop
+ ldc.i4.1
+ endfilter
+ }
+ {
+ pop
+ leave.s DONE
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Filter, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.FilterOffset >= 0);
+ Assert.True(region.HandlerOffset >= 0);
+ Assert.True(region.HandlerLength > 0);
+ }
+
+ [Fact]
+ public void FaultHandler_EmitsFaultExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ nop
+ leave.s DONE
+ }
+ fault
+ {
+ endfinally
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "TestMethod");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Fault, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.HandlerOffset >= region.TryOffset + region.TryLength);
+ Assert.True(region.HandlerLength > 0);
+ }
+
+ [Fact]
+ public void CatchBlock_EmitsCatchExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ nop
+ leave.s DONE
+ }
+ catch [mscorlib]System.Exception
+ {
+ pop
+ leave.s DONE
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "M");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Catch, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.HandlerLength > 0);
+ Assert.Equal("Exception", reader.GetString(reader.GetTypeReference((TypeReferenceHandle)region.CatchType).Name));
+ }
+
+ [Fact]
+ public void FinallyBlock_EmitsFinallyExceptionRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ nop
+ leave.s DONE
+ }
+ finally
+ {
+ endfinally
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "M");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ var region = Assert.Single(body.ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Finally, region.Kind);
+ Assert.True(region.TryLength > 0);
+ Assert.True(region.HandlerLength > 0);
+ }
+
+ [Fact]
+ public void MultipleCatchClauses_ResolveCatchTypesBeforeTheirHandlerBodies()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ leave.s DONE
+ }
+ catch [mscorlib]System.ArgumentException
+ {
+ castclass [mscorlib]System.IO.Stream
+ pop
+ leave.s DONE
+ }
+ catch [mscorlib]System.NotSupportedException
+ {
+ castclass [mscorlib]System.Text.StringBuilder
+ pop
+ leave.s DONE
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ // Native ilasm resolves a catch type as soon as the clause is parsed, so each catch type
+ // precedes every type its handler body references.
+ string[] typeReferences = reader.TypeReferences
+ .Select(reader.GetTypeReference)
+ .Select(reference => reader.GetString(reference.Namespace) + "." + reader.GetString(reference.Name))
+ .ToArray();
+ AssertTypePrecedes("System.ArgumentException", "System.IO.Stream");
+ AssertTypePrecedes("System.NotSupportedException", "System.Text.StringBuilder");
+
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "M");
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(2, body.ExceptionRegions.Length);
+ Assert.All(body.ExceptionRegions, region => Assert.Equal(ExceptionRegionKind.Catch, region.Kind));
+ Assert.Equal(
+ ["System.ArgumentException", "System.NotSupportedException"],
+ body.ExceptionRegions
+ .Select(region => reader.GetTypeReference((TypeReferenceHandle)region.CatchType))
+ .Select(reference => reader.GetString(reference.Namespace) + "." + reader.GetString(reference.Name))
+ .ToArray());
+
+ void AssertTypePrecedes(string first, string second)
+ {
+ int firstIndex = Array.IndexOf(typeReferences, first);
+ int secondIndex = Array.IndexOf(typeReferences, second);
+ Assert.True(firstIndex >= 0, $"Type reference '{first}' was not emitted.");
+ Assert.True(secondIndex >= 0, $"Type reference '{second}' was not emitted.");
+ Assert.True(firstIndex < secondIndex, $"Type reference '{first}' should precede '{second}'.");
+ }
+ }
+
+ [Fact]
+ public void LabelBasedFilterRegion_EmitsExactExceptionRegionBounds()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try TRY_START to TRY_END filter FILTER_START handler HANDLER_START to HANDLER_END
+ TRY_START:
+ nop
+ leave.s DONE
+ TRY_END:
+ FILTER_START:
+ pop
+ ldc.i4.1
+ endfilter
+ HANDLER_START:
+ pop
+ leave.s DONE
+ HANDLER_END:
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var region = Assert.Single(pe.GetMethodBody(method.RelativeVirtualAddress).ExceptionRegions);
+
+ Assert.Equal(ExceptionRegionKind.Filter, region.Kind);
+ Assert.Equal(0, region.TryOffset);
+ Assert.Equal(3, region.TryLength);
+ Assert.Equal(3, region.FilterOffset);
+ Assert.Equal(7, region.HandlerOffset);
+ Assert.Equal(3, region.HandlerLength);
+ }
+
+ [Fact]
+ public void NestedTryBlocks_EmitInnerRegionBeforeOuterRegion()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .try
+ {
+ .try
+ {
+ nop
+ leave.s INNER_DONE
+ }
+ catch [mscorlib]System.Exception
+ {
+ pop
+ leave.s INNER_DONE
+ }
+ INNER_DONE:
+ leave.s DONE
+ }
+ finally
+ {
+ endfinally
+ }
+ DONE:
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ ImmutableArray regions =
+ pe.GetMethodBody(method.RelativeVirtualAddress).ExceptionRegions;
+
+ Assert.Equal(2, regions.Length);
+ Assert.Equal(ExceptionRegionKind.Catch, regions[0].Kind);
+ Assert.Equal(ExceptionRegionKind.Finally, regions[1].Kind);
+ Assert.True(regions[0].TryOffset >= regions[1].TryOffset);
+ Assert.True(
+ regions[0].HandlerOffset + regions[0].HandlerLength <=
+ regions[1].TryOffset + regions[1].TryLength);
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs
index cf80e241dd8f1c..22eb18c3b8b165 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ExportedTypeTests.cs
@@ -153,5 +153,96 @@ .class extern forwarder System.ForwardedType
Assert.Equal(DiagnosticSeverity.Warning, warning.Severity);
}
+ [Fact]
+ public void ExportedTypeAttributesAndImplementations_EmitExpectedMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern ForwardedAssembly { }
+ .assembly test { }
+ .file Module.netmodule .hash = (01 02 03 04)
+
+ .class extern public Outer
+ {
+ .assembly extern ForwardedAssembly
+ }
+ .class extern private PrivateType
+ {
+ .assembly extern ForwardedAssembly
+ }
+ .class extern forwarder ForwardedType
+ {
+ .assembly extern ForwardedAssembly
+ }
+ .class extern nested public NestedPublic
+ {
+ .class extern Outer
+ }
+ .class extern nested private NestedPrivate
+ {
+ .class extern Outer
+ }
+ .class extern nested family NestedFamily
+ {
+ .class extern Outer
+ }
+ .class extern nested assembly NestedAssembly
+ {
+ .class extern Outer
+ }
+ .class extern nested famandassem NestedFamAndAssem
+ {
+ .class extern Outer
+ }
+ .class extern nested famorassem NestedFamOrAssem
+ {
+ .class extern Outer
+ }
+ .class extern public FileBackedType
+ {
+ .file Module.netmodule
+ }
+ .class extern public TypeDefIdType
+ {
+ .assembly extern ForwardedAssembly
+ .class 42
+ }
+ .class extern public AttributedType
+ {
+ .assembly extern ForwardedAssembly
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ;
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var exportedTypes = reader.ExportedTypes
+ .ToDictionary(
+ handle => reader.GetString(reader.GetExportedType(handle).Name),
+ handle => (Handle: handle, Type: reader.GetExportedType(handle)));
+
+ Assert.Equal(TypeAttributes.Public, exportedTypes["Outer"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NotPublic, exportedTypes["PrivateType"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.True(exportedTypes["ForwardedType"].Type.IsForwarder);
+ Assert.Equal(TypeAttributes.NestedPublic, exportedTypes["NestedPublic"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedPrivate, exportedTypes["NestedPrivate"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedFamily, exportedTypes["NestedFamily"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedAssembly, exportedTypes["NestedAssembly"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedFamANDAssem, exportedTypes["NestedFamAndAssem"].Type.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(TypeAttributes.NestedFamORAssem, exportedTypes["NestedFamOrAssem"].Type.Attributes & TypeAttributes.VisibilityMask);
+
+ Assert.Equal(HandleKind.AssemblyReference, exportedTypes["Outer"].Type.Implementation.Kind);
+ Assert.Equal(HandleKind.AssemblyFile, exportedTypes["FileBackedType"].Type.Implementation.Kind);
+ Assert.Equal(HandleKind.ExportedType, exportedTypes["NestedPublic"].Type.Implementation.Kind);
+ Assert.Equal(42, exportedTypes["TypeDefIdType"].Type.GetTypeDefinitionId());
+
+ var attribute = reader.GetCustomAttribute(
+ Assert.Single(reader.GetCustomAttributes(exportedTypes["AttributedType"].Handle)));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs
index 3d0a13705cea38..65c46d10d7afca 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/FieldTests.cs
@@ -21,6 +21,156 @@ namespace ILAssembler.Tests
{
public class FieldTests
{
+ [Fact]
+ public void TrailingCustomAttribute_AttachesToField()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public static int32 Value
+ .custom instance void [mscorlib]System.ThreadStaticAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Empty(type.GetCustomAttributes());
+ Assert.Single(field.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void TrailingFieldCustomAttribute_DoesNotLeakAcrossClasses()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi A
+ {
+ .field public static int32 Value
+ }
+ .class public auto ansi B
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var typeB = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "B");
+
+ Assert.Empty(field.GetCustomAttributes());
+ Assert.Single(typeB.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void TrailingFieldCustomAttribute_DoesNotLeakAcrossNamespaces()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .namespace First
+ {
+ .class public auto ansi A
+ {
+ .field public static int32 Value
+ }
+ }
+ .class public auto ansi B
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var typeB = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "B");
+
+ Assert.Empty(field.GetCustomAttributes());
+ Assert.Single(typeB.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void TrailingFieldCustomAttribute_BindsToFieldWithinTheSameNamespacedType()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .namespace First
+ {
+ .class public auto ansi A
+ {
+ .field public static int32 Value
+ .custom instance void [mscorlib]System.ThreadStaticAttribute::.ctor() = (01 00 00 00)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var typeA = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "A");
+
+ Assert.Single(field.GetCustomAttributes());
+ Assert.Empty(typeA.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void TrailingFieldCustomAttribute_DoesNotLeakOutOfNestedClass()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Outer
+ {
+ .class nested public auto ansi Inner
+ {
+ .field public static int32 Value
+ }
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var outer = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Outer");
+
+ Assert.Empty(field.GetCustomAttributes());
+ Assert.Single(outer.GetCustomAttributes());
+ }
+
+ [Fact]
+ public void GlobalFieldTrailingCustomAttribute_AttachesToField()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .field public static int32 Value
+ .custom instance void [mscorlib]System.ThreadStaticAttribute::.ctor() = (01 00 00 00)
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Empty(reader.GetModuleDefinition().GetCustomAttributes());
+ Assert.Single(field.GetCustomAttributes());
+ }
[Fact]
public void FieldLayout_ExplicitOffset()
@@ -59,6 +209,48 @@ .assembly extern System.Runtime { }
Assert.Equal(0, fields[2].GetOffset());
}
+ [Fact]
+ public void FieldAttributes_EmitExpectedFlagsAndNullConstant()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field family initonly int32 FamilyInitOnly
+ .field assembly int32 AssemblyField
+ .field famandassem int32 FamAndAssemField
+ .field famorassem int32 FamOrAssemField
+ .field privatescope int32 PrivateScopeField
+ .field public notserialized int32 NotSerializedField
+ .field flags(0x36) int32 FlaggedField
+ .field public volatile int32 VolatileField
+ .field public static literal string NullString = nullref
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+
+ Assert.Equal(FieldAttributes.Family, fields["FamilyInitOnly"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.True(fields["FamilyInitOnly"].Attributes.HasFlag(FieldAttributes.InitOnly));
+ Assert.Equal(FieldAttributes.Assembly, fields["AssemblyField"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.Equal(FieldAttributes.FamANDAssem, fields["FamAndAssemField"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.Equal(FieldAttributes.FamORAssem, fields["FamOrAssemField"].Attributes & FieldAttributes.FieldAccessMask);
+ Assert.Equal(FieldAttributes.PrivateScope, fields["PrivateScopeField"].Attributes & FieldAttributes.FieldAccessMask);
+#pragma warning disable SYSLIB0050
+ Assert.True(fields["NotSerializedField"].Attributes.HasFlag(FieldAttributes.NotSerialized));
+#pragma warning restore SYSLIB0050
+ Assert.Equal((FieldAttributes)0x36, fields["FlaggedField"].Attributes);
+ Assert.Equal(FieldAttributes.Public, fields["VolatileField"].Attributes & FieldAttributes.FieldAccessMask);
+
+ var nullConstant = reader.GetConstant(fields["NullString"].GetDefaultValue());
+ Assert.Equal(ConstantTypeCode.NullReference, nullConstant.TypeCode);
+ }
+
[Fact]
public void FieldRVA_MultipleDataSections()
@@ -510,18 +702,18 @@ .assembly extern mscorlib { }
.assembly test { }
.class public auto ansi beforefieldinit MyClass extends [mscorlib]System.Object
{
- .field public int32 value
+ .field public int32 'value'
.method public instance int32 GetValue() cil managed
{
ldarg.0
- ldfld int32 MyClass::value
+ ldfld int32 MyClass::'value'
ret
}
.method public instance void SetValue(int32 v) cil managed
{
ldarg.0
ldarg.1
- stfld int32 MyClass::value
+ stfld int32 MyClass::'value'
ret
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs
index 0a3e83b1c0b39f..de68c84f921465 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/FunctionPointerTests.cs
@@ -40,16 +40,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field signature: 0x06 (FIELD), 0x1B (FNPTR), ...
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- // After FNPTR: calling convention byte, param count, return type, param types
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[3]); // 1 parameter
- Assert.Equal(0x01, sigBytes[4]); // return type: void
- Assert.Equal(0x08, sigBytes[5]); // param type: int32
+ Assert.Equal(
+ "method void *(int32)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -76,13 +69,10 @@ .method public static void Invoke(method void *(int32) callback) cil managed
.Select(h => reader.GetMethodDefinition(h))
.First(m => reader.GetString(m.Name) == "Invoke");
- var sigBytes = reader.GetBlobBytes(method.Signature);
- // Method signature: 0x00 (DEFAULT), 0x01 (1 param), 0x01 (void ret), ...
- Assert.Equal(0x00, sigBytes[0]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[1]); // 1 parameter
- Assert.Equal(0x01, sigBytes[2]); // return type: void
- // Parameter should be ELEMENT_TYPE_FNPTR (0x1B)
- Assert.Equal(0x1B, sigBytes[3]); // ELEMENT_TYPE_FNPTR
+ MethodSignature signature =
+ method.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("void", signature.ReturnType);
+ Assert.Equal(new[] { "method void *(int32)" }, signature.ParameterTypes);
}
@@ -111,18 +101,10 @@ .class public auto ansi Test extends [mscorlib]System.Object
.Select(h => reader.GetMethodDefinition(h))
.First(m => reader.GetString(m.Name) == "GetAdder");
- var sigBytes = reader.GetBlobBytes(method.Signature);
- // Method signature: 0x00 (DEFAULT), 0x00 (0 params), return type...
- Assert.Equal(0x00, sigBytes[0]); // DEFAULT calling convention
- Assert.Equal(0x00, sigBytes[1]); // 0 parameters
- // Return type should be ELEMENT_TYPE_FNPTR (0x1B)
- Assert.Equal(0x1B, sigBytes[2]); // ELEMENT_TYPE_FNPTR
- // After FNPTR: calling convention, param count, return type (int32), param types (int32, int32)
- Assert.Equal(0x00, sigBytes[3]); // DEFAULT calling convention for inner sig
- Assert.Equal(0x02, sigBytes[4]); // 2 parameters in inner sig
- Assert.Equal(0x08, sigBytes[5]); // inner return type: int32
- Assert.Equal(0x08, sigBytes[6]); // inner param 1: int32
- Assert.Equal(0x08, sigBytes[7]); // inner param 2: int32
+ MethodSignature signature =
+ method.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("method int32 *(int32, int32)", signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
}
@@ -143,13 +125,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x00, sigBytes[3]); // 0 parameters
- Assert.Equal(0x01, sigBytes[4]); // return type: void
+ Assert.Equal(
+ "method void *()",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -172,17 +150,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), 0x1B (FNPTR), 0x00 (DEFAULT), 0x01 (1 param),
- // 0x0F (PTR), 0x01 (VOID) [= void* return type], 0x08 (int32 param)
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[3]); // 1 parameter
- Assert.Equal(0x0F, sigBytes[4]); // return type: ELEMENT_TYPE_PTR
- Assert.Equal(0x01, sigBytes[5]); // return type inner: VOID (making void*)
- Assert.Equal(0x08, sigBytes[6]); // param type: int32
+ Assert.Equal(
+ "method void* *(int32)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -203,16 +173,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), 0x1B (FNPTR), 0x00 (DEFAULT), 0x00 (0 params),
- // 0x0F (PTR), 0x01 (VOID) [= void* return type]
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x00, sigBytes[3]); // 0 parameters
- Assert.Equal(0x0F, sigBytes[4]); // return type: ELEMENT_TYPE_PTR
- Assert.Equal(0x01, sigBytes[5]); // return type inner: VOID (making void*)
+ Assert.Equal(
+ "method void* *()",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -233,17 +196,9 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), 0x1B (FNPTR), 0x00 (DEFAULT), 0x01 (1 param),
- // 0x0F (PTR), 0x08 (I4) [= int32* return type], 0x08 (int32 param)
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- Assert.Equal(0x1B, sigBytes[1]); // ELEMENT_TYPE_FNPTR
- Assert.Equal(0x00, sigBytes[2]); // DEFAULT calling convention
- Assert.Equal(0x01, sigBytes[3]); // 1 parameter
- Assert.Equal(0x0F, sigBytes[4]); // return type: ELEMENT_TYPE_PTR
- Assert.Equal(0x08, sigBytes[5]); // return type inner: int32 (making int32*)
- Assert.Equal(0x08, sigBytes[6]); // param type: int32
+ Assert.Equal(
+ "method int32* *(int32)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
@@ -265,15 +220,30 @@ .class public auto ansi Test extends [mscorlib]System.Object
var reader = pe.GetMetadataReader();
var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
- var sigBytes = reader.GetBlobBytes(field.Signature);
-
- // Field sig: 0x06 (FIELD), then the type is FNPTR(void(int32)) with PTR modifier
- // The modifier ordering means: 0x06, 0x1B (FNPTR), ..., then 0x0F (PTR) wraps it
- // But in practice ECMA-335 encodes: 0x06, 0x0F (PTR), 0x1B (FNPTR), ...
- Assert.Equal(0x06, sigBytes[0]); // FIELD calling convention
- // The next two bytes must contain both PTR and FNPTR
- Assert.Contains((byte)0x1B, sigBytes.Skip(1).ToArray()); // Must have ELEMENT_TYPE_FNPTR
- Assert.Contains((byte)0x0F, sigBytes.Skip(1).ToArray()); // Must have ELEMENT_TYPE_PTR
+ Assert.Equal(
+ "method void *(int32)*",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void FunctionPointer_VarargSignature_EmitsSentinel()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static method vararg void *(int32, ..., object) fnPtrField
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ Assert.Equal(
+ "method void *(int32, ..., object)",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs
index 561c1bf0d4a713..204064a9d30b2b 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/GenericTests.cs
@@ -126,6 +126,148 @@ .field public !1 fieldU
Assert.Equal(2, genericParams.Count);
}
+ [Fact]
+ public void DuplicateGenericParameterNames_PreserveFirstNameBindingInFieldSignature()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit DuplicateName`2 extends [mscorlib]System.Object
+ {
+ .field public !T Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.TypeDefinitions
+ .Select(h => reader.GetTypeDefinition(h))
+ .First(t => reader.GetString(t.Name) == "DuplicateName`2");
+
+ var genericParameters = typeDef.GetGenericParameters()
+ .Select(reader.GetGenericParameter)
+ .ToArray();
+ Assert.Equal(2, genericParameters.Length);
+ Assert.All(genericParameters, parameter => Assert.Equal("T", reader.GetString(parameter.Name)));
+
+ var field = reader.GetFieldDefinition(typeDef.GetFields().Single());
+ Assert.Equal("!0", field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void GenericParameterAttributesAndBounds_EmitExpectedMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class interface public abstract auto ansi IVariant`5<+T, -U, class .ctor V, valuetype byreflike W, flags(0x0004) X>
+ {
+ }
+ .class public auto ansi Constrained`1<(class [mscorlib]System.IDisposable) T> extends [mscorlib]System.Object
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var variantType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "IVariant`5");
+ var parameters = variantType.GetGenericParameters()
+ .Select(reader.GetGenericParameter)
+ .ToDictionary(parameter => reader.GetString(parameter.Name));
+
+ Assert.Equal(GenericParameterAttributes.Covariant, parameters["T"].Attributes & GenericParameterAttributes.VarianceMask);
+ Assert.Equal(GenericParameterAttributes.Contravariant, parameters["U"].Attributes & GenericParameterAttributes.VarianceMask);
+ Assert.True(parameters["V"].Attributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint));
+ Assert.True(parameters["V"].Attributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint));
+ Assert.True(parameters["W"].Attributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint));
+ Assert.True(((int)parameters["W"].Attributes & 0x20) != 0);
+ Assert.Equal((GenericParameterAttributes)0x0004, parameters["X"].Attributes);
+
+ var constrainedType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Constrained`1");
+ var constrainedParameter = reader.GetGenericParameter(Assert.Single(constrainedType.GetGenericParameters()));
+ var constraint = reader.GetGenericParameterConstraint(Assert.Single(constrainedParameter.GetConstraints()));
+
+ Assert.Equal(HandleKind.TypeSpecification, constraint.Type.Kind);
+ Assert.Equal(
+ "[mscorlib]System.IDisposable",
+ reader.GetTypeSpecification((TypeSpecificationHandle)constraint.Type)
+ .DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void ClassGenericParameterAndConstraintDirectives_AttachCustomAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi ByName`1<([mscorlib]System.ICloneable) T> extends [mscorlib]System.Object
+ {
+ .param type T
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param constraint T, [mscorlib]System.ICloneable
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Where(definition => reader.GetString(definition.Name) == "ByName`1")
+ .ToDictionary(definition => reader.GetString(definition.Name));
+
+ AssertGenericParameterAnnotation(reader, types["ByName`1"], "ICloneable");
+ }
+
+ [Fact]
+ public void MethodGenericParameterAndConstraintDirectives_AttachCustomAttributes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .param type [0]
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param type T
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ .param constraint [0], [mscorlib]System.IDisposable
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param constraint T, [mscorlib]System.ICloneable
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var parameterHandle = Assert.Single(method.GetGenericParameters());
+ var parameter = reader.GetGenericParameter(parameterHandle);
+ var constraints = parameter.GetConstraints().ToArray();
+
+ Assert.Equal(2, reader.GetCustomAttributes(parameterHandle).Count);
+ Assert.Equal(2, constraints.Length);
+ Assert.All(constraints, constraint => Assert.Single(reader.GetCustomAttributes(constraint)));
+ Assert.Equal(
+ new[] { "ICloneable", "IDisposable" },
+ constraints
+ .Select(reader.GetGenericParameterConstraint)
+ .Select(constraint => reader.GetString(reader.GetTypeReference((TypeReferenceHandle)constraint.Type).Name))
+ .OrderBy(name => name));
+ }
+
[Fact]
public void GenericMethod_UsesNamedElementList()
@@ -156,6 +298,179 @@ .maxstack 1
Assert.Single(genericParams);
}
+ [Fact]
+ public void GenericParameterCount_AtMetadataIndexLimit_IsAccepted()
+ {
+ const int MaximumGenericParameterCount = ushort.MaxValue + 1;
+ StringBuilder source = new("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test<
+ """);
+ AppendGenericParameters(source, MaximumGenericParameterCount, constrainLast: false);
+ source.Append("> { }");
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source.ToString(), new Options());
+ var reader = pe.GetMetadataReader();
+ Assert.Equal(MaximumGenericParameterCount, reader.GetTableRowCount(TableIndex.GenericParam));
+ }
+
+ [Fact]
+ public void GenericParameterCount_OutsideMetadataIndexRange_RequiresErrorTolerant()
+ {
+ const int GenericParameterCount = ushort.MaxValue + 2;
+ StringBuilder source = new("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test<
+ """);
+ AppendGenericParameters(source, GenericParameterCount, constrainLast: false);
+ source.Append("> { }");
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source.ToString(), "test.il"),
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options());
+
+ Diagnostic diagnostic = Assert.Single(diagnostics);
+ Assert.Equal(DiagnosticIds.TooManyGenericParameters, diagnostic.Id);
+ Assert.Null(result);
+ }
+
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public void GenericParameterCountAndConstraintOwner_OutsideMetadataIndexRange_ReportErrors(bool isMethod)
+ {
+ const int MaximumGenericParameterCount = ushort.MaxValue + 1;
+ const int GenericParameterCount = MaximumGenericParameterCount + 2;
+ StringBuilder source = new();
+ if (isMethod)
+ {
+ source.Append("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void GenericMethod<
+ """);
+ }
+ else
+ {
+ source.Append("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test<
+ """);
+ }
+
+ AppendGenericParameters(source, GenericParameterCount, constrainLast: true);
+ int secondOverflowIndex = GenericParameterCount - 1;
+ if (isMethod)
+ {
+ source.Append($$"""
+ >() cil managed
+ {
+ .param type T{{secondOverflowIndex}}
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param constraint T{{secondOverflowIndex}}, [mscorlib]System.IDisposable
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ ret
+ }
+ }
+ """);
+ }
+ else
+ {
+ source.Append($$"""
+ >
+ {
+ .param type T{{secondOverflowIndex}}
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ .param constraint T{{secondOverflowIndex}}, [mscorlib]System.IDisposable
+ .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
+ }
+ """);
+ }
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source.ToString(), "test.il"),
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+ Assert.Collection(
+ diagnostics,
+ diagnostic =>
+ {
+ Assert.Equal(DiagnosticIds.TooManyGenericParameters, diagnostic.Id);
+ Assert.Equal(DiagnosticSeverity.Error, diagnostic.Severity);
+ Assert.Equal(
+ $"Generic parameter count {GenericParameterCount} exceeds the maximum of {MaximumGenericParameterCount}",
+ diagnostic.Message);
+ },
+ diagnostic =>
+ {
+ Assert.Equal(DiagnosticIds.GenericParameterConstraintOwnerOutOfRange, diagnostic.Id);
+ Assert.Equal(DiagnosticSeverity.Error, diagnostic.Severity);
+ Assert.Equal(
+ $"Generic parameter constraint owner index {GenericParameterCount - 1} exceeds the maximum encodable generic parameter index of {ushort.MaxValue}",
+ diagnostic.Message);
+ });
+
+ Assert.NotNull(result);
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ Assert.Equal(GenericParameterCount, reader.GetTableRowCount(TableIndex.GenericParam));
+
+ EntityHandle expectedOwner = isMethod
+ ? reader.MethodDefinitions.Single()
+ : reader.TypeDefinitions.Single(
+ handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ GenericParameter firstOverflowParameter = reader.GetGenericParameter(
+ MetadataTokens.GenericParameterHandle(MaximumGenericParameterCount + 1));
+ GenericParameterHandle secondOverflowHandle =
+ MetadataTokens.GenericParameterHandle(MaximumGenericParameterCount + 2);
+ GenericParameter secondOverflowParameter = reader.GetGenericParameter(
+ secondOverflowHandle);
+
+ Assert.Equal(expectedOwner, firstOverflowParameter.Parent);
+ Assert.Equal(0, firstOverflowParameter.Index);
+ Assert.Equal($"T{MaximumGenericParameterCount}", reader.GetString(firstOverflowParameter.Name));
+ Assert.Equal(expectedOwner, secondOverflowParameter.Parent);
+ Assert.Equal(1, secondOverflowParameter.Index);
+ Assert.Equal($"T{MaximumGenericParameterCount + 1}", reader.GetString(secondOverflowParameter.Name));
+ GenericParameterConstraintHandle[] constraintHandles =
+ secondOverflowParameter.GetConstraints().ToArray();
+ Assert.Equal(2, constraintHandles.Length);
+ Assert.All(
+ constraintHandles,
+ handle => Assert.Equal(
+ secondOverflowHandle,
+ reader.GetGenericParameterConstraint(handle).Parameter));
+ string[] constraintTypes = constraintHandles
+ .Select(reader.GetGenericParameterConstraint)
+ .Select(constraint => constraint.Type.Kind switch
+ {
+ HandleKind.TypeReference => reader.GetString(
+ reader.GetTypeReference((TypeReferenceHandle)constraint.Type).Name),
+ HandleKind.TypeSpecification => reader.GetTypeSpecification(
+ (TypeSpecificationHandle)constraint.Type)
+ .DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null),
+ _ => throw new InvalidOperationException($"Unexpected constraint handle kind: {constraint.Type.Kind}")
+ })
+ .ToArray();
+ Assert.Contains("IDisposable", constraintTypes);
+ Assert.Contains("object", constraintTypes);
+ Assert.Single(reader.GetCustomAttributes(secondOverflowHandle));
+ Assert.Single(
+ constraintHandles,
+ handle => reader.GetCustomAttributes(handle).Count == 1);
+ }
[Fact]
public void GenericOverride_EmitsMethodImpl()
@@ -300,13 +615,31 @@ .method public hidebysig instance void M() cil managed
// NOT a TypeRef to System.Object.
Assert.Equal(HandleKind.TypeSpecification, constraintType.Kind);
- // Decode the TypeSpec blob to verify it's a generic instantiation of IMinusT`1
var typeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)constraintType);
- var sigBytes = reader.GetBlobBytes(typeSpec.Signature);
+ Assert.Equal(
+ "IMinusT`1",
+ typeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void RepeatedSelfReferentialConstraint_IsNotDuplicated()
+ {
+ string source = """
+ .assembly test { }
+ .class interface public abstract auto ansi I`1<(class I`1) TSelf>
+ {
+ .param constraint TSelf, class I`1
+ }
+ """;
- // Expected: GENERICINST (0x15), CLASS (0x12), ,
- // 1 (generic arg count), VAR 1 (type parameter !U which is index 1)
- Assert.Equal(0x15, sigBytes[0]); // ELEMENT_TYPE_GENERICINST
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "I`1");
+ var parameter = reader.GetGenericParameter(Assert.Single(type.GetGenericParameters()));
+
+ Assert.Single(parameter.GetConstraints());
}
@@ -365,11 +698,116 @@ .method public hidebysig newslot abstract virtual instance void
Assert.Equal(HandleKind.TypeSpecification, constraintType.Kind);
var typeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)constraintType);
- var sigBytes = reader.GetBlobBytes(typeSpec.Signature);
+ Assert.Equal(
+ "IMinusT`1",
+ typeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void VariantGenericParameters_EmitVarianceFlags()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .class interface public abstract auto ansi IVariant`2<+([mscorlib]System.Object) TOut, -([mscorlib]System.Object) TIn>
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(definition => reader.GetString(definition.Name) == "IVariant`2");
+ var parameters = type.GetGenericParameters()
+ .Select(reader.GetGenericParameter)
+ .ToArray();
+
+ Assert.Equal(2, parameters.Length);
+ Assert.Equal("TOut", reader.GetString(parameters[0].Name));
+ Assert.Equal("TIn", reader.GetString(parameters[1].Name));
+ Assert.True((parameters[0].Attributes & GenericParameterAttributes.Covariant) != 0);
+ Assert.True((parameters[1].Attributes & GenericParameterAttributes.Contravariant) != 0);
+ }
- // Expected: GENERICINST (0x15), CLASS (0x12), ,
- // 1 (generic arg count), VAR 0 (type parameter !PlusT at index 0)
- Assert.Equal(0x15, sigBytes[0]); // ELEMENT_TYPE_GENERICINST
+ [Fact]
+ public void GenericFieldAndMethod_EmitVarAndMVarSignatures()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit GenericBox`1 extends [mscorlib]System.Object
+ {
+ .field public !0 Value
+
+ .method public static !!0 Identity(!!0 arg) cil managed
+ {
+ ldarg.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .First(definition => reader.GetString(definition.Name) == "GenericBox`1");
+ var field = reader.GetFieldDefinition(type.GetFields().Single());
+ var method = type.GetMethods()
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "Identity");
+
+ Assert.Equal("!0", field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ var typeParameter = reader.GetGenericParameter(type.GetGenericParameters().Single());
+ var methodParameter = reader.GetGenericParameter(method.GetGenericParameters().Single());
+ Assert.Equal("T", reader.GetString(typeParameter.Name));
+ Assert.Equal("U", reader.GetString(methodParameter.Name));
+
+ MethodSignature methodSignature =
+ method.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.True(methodSignature.Header.IsGeneric);
+ Assert.Equal(1, methodSignature.GenericParameterCount);
+ Assert.Equal("!!0", methodSignature.ReturnType);
+ Assert.Equal(new[] { "!!0" }, methodSignature.ParameterTypes);
+ }
+
+ private static void AssertGenericParameterAnnotation(
+ MetadataReader reader,
+ TypeDefinition type,
+ string expectedConstraint)
+ {
+ var parameterHandle = Assert.Single(type.GetGenericParameters());
+ var parameter = reader.GetGenericParameter(parameterHandle);
+ var constraintHandle = Assert.Single(parameter.GetConstraints());
+ var constraint = reader.GetGenericParameterConstraint(constraintHandle);
+
+ Assert.Equal(2, reader.GetCustomAttributes(parameterHandle).Count);
+ Assert.Equal(2, reader.GetCustomAttributes(constraintHandle).Count);
+ Assert.Equal(HandleKind.TypeReference, constraint.Type.Kind);
+ Assert.Equal(
+ expectedConstraint,
+ reader.GetString(reader.GetTypeReference((TypeReferenceHandle)constraint.Type).Name));
+ }
+
+ private static void AppendGenericParameters(StringBuilder source, int count, bool constrainLast)
+ {
+ for (int i = 0; i < count; i++)
+ {
+ if (i != 0)
+ {
+ source.Append(',');
+ }
+ if (constrainLast && i == count - 1)
+ {
+ source.Append("(class [mscorlib]System.Object) ");
+ }
+ source.Append('T').Append(i);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ILAssembler.Tests.csproj b/src/tools/ilasm/tests/ILAssembler.Tests/ILAssembler.Tests.csproj
index f621b0e97351f3..f7867dac960e75 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ILAssembler.Tests.csproj
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ILAssembler.Tests.csproj
@@ -10,11 +10,15 @@
+
-
+
+
+ IlasmRootCommand.cs
+
NativeCommandLine.cs
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs
index 2c15eace3f5360..e7706f78f97126 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/InstructionTests.cs
@@ -46,11 +46,187 @@ br UndefinedLabel
Assert.Equal(DiagnosticSeverity.Error, error.Severity);
}
+ [Fact]
+ public void UndefinedBranchTarget_WithErrorTolerantOption_PreservesNativeFatHeaderBehavior()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .maxstack 3
+ br UndefinedLabel
+ ret
+ }
+ }
+ """;
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.LabelNotFound);
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ MethodDefinition method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "TestMethod");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(3, body.MaxStack);
+ Assert.True(body.LocalVariablesInitialized);
+ }
+
+ [Fact]
+ public void Diagnostic_SwitchLabelNotFound_PointsToInstruction()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ ldc.i4.0
+ switch (UndefinedLabel)
+ ret
+ }
+ }
+ """;
+
+ var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
+ var error = Assert.Single(diagnostics);
+ Assert.Equal(DiagnosticIds.LabelNotFound, error.Id);
+ Assert.Equal(source.IndexOf("switch", StringComparison.Ordinal), error.Location.Span.Start);
+ }
+
+ [Theory]
+ [InlineData("ldc.i4")]
+ [InlineData("ldc.i8")]
+ [InlineData("ldarg")]
+ [InlineData("br")]
+ [InlineData("call instance void")]
+ [InlineData("ldsfld int32")]
+ [InlineData("ldsfld mdtoken(")]
+ [InlineData("box")]
+ [InlineData("ldtoken")]
+ [InlineData("calli default void(")]
+ [InlineData("calli vararg void(class [mscorlib]System.Tuple`1
+ {
+ Assert.Fail("Expected no includes");
+ return default;
+ },
+ _ =>
+ {
+ Assert.Fail("Expected no resources");
+ return default;
+ },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ byte[] il = GetMethodIL(pe, "Good");
+
+ Assert.Equal([0x2A], il);
+ }
+
+ [Fact]
+ public void MalformedCalliSignature_DoesNotMaterializeDiscardedReferences()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void Bad() cil managed
+ {
+ calli default void(class [Unused]Payload
+ }
+
+ .method public static void Good() cil managed
+ {
+ call void [Used]Target::M()
+ ret
+ }
+ }
+ """;
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ =>
+ {
+ Assert.Fail("Expected no includes");
+ return default;
+ },
+ _ =>
+ {
+ Assert.Fail("Expected no resources");
+ return default;
+ },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ string[] assemblyReferences = reader.AssemblyReferences
+ .Select(handle => reader.GetString(reader.GetAssemblyReference(handle).Name))
+ .ToArray();
+
+ Assert.Contains("Used", assemblyReferences);
+ Assert.DoesNotContain("Unused", assemblyReferences);
+ Assert.Equal([0x28, 0x01, 0x00, 0x00, 0x0A, 0x2A], GetMethodIL(pe, "Good"));
+ }
+
[Fact]
public void DataLabelReference_FixedUpCorrectly()
{
- // Test that .data with a reference to another label (&Label) is patched with the correct RVA
+ // Test that .data with a reference to another label (&Label) is patched with the correct address
string source = """
.assembly test { }
.assembly extern mscorlib { }
@@ -81,13 +257,12 @@ .field [4] public static int32 Pointer at PointerData
Assert.NotEqual(0, targetRva);
Assert.NotEqual(0, pointerRva);
- // The pointer field should contain the RVA of the target data
+ // The pointer field should contain the address of the target data
// Read the actual data from the PE at the pointer location
var pointerSection = pe.GetSectionData(pointerRva);
- int storedRva = BinaryPrimitives.ReadInt32LittleEndian(pointerSection.GetContent().AsSpan(0, 4));
+ uint storedAddress = BinaryPrimitives.ReadUInt32LittleEndian(pointerSection.GetContent().AsSpan(0, 4));
- // The stored RVA should equal the target's RVA
- Assert.Equal(targetRva, storedRva);
+ Assert.Equal(pe.PEHeaders.PEHeader!.ImageBase + (uint)targetRva, storedAddress);
// Verify the target data contains the expected value
var targetSection = pe.GetSectionData(targetRva);
@@ -131,12 +306,13 @@ .field [8] public static int32 Ptr2Field at Ptr2
int ptr2Rva = fields["Ptr2Field"].GetRelativeVirtualAddress();
// Read both pointer values
- int storedRva1 = BinaryPrimitives.ReadInt32LittleEndian(pe.GetSectionData(ptr1Rva).GetContent().AsSpan(0, 4));
- int storedRva2 = BinaryPrimitives.ReadInt32LittleEndian(pe.GetSectionData(ptr2Rva).GetContent().AsSpan(0, 4));
+ uint storedAddress1 = BinaryPrimitives.ReadUInt32LittleEndian(pe.GetSectionData(ptr1Rva).GetContent().AsSpan(0, 4));
+ uint storedAddress2 = BinaryPrimitives.ReadUInt32LittleEndian(pe.GetSectionData(ptr2Rva).GetContent().AsSpan(0, 4));
// Both should point to the target
- Assert.Equal(targetRva, storedRva1);
- Assert.Equal(targetRva, storedRva2);
+ ulong targetAddress = pe.PEHeaders.PEHeader!.ImageBase + (uint)targetRva;
+ Assert.Equal(targetAddress, storedAddress1);
+ Assert.Equal(targetAddress, storedAddress2);
}
@@ -232,18 +408,152 @@ .method public static void M(unsigned int64[] arr) cil managed
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void UnusedInstruction_ParsedCorrectly()
+ {
+ string source = """
+ .assembly test { }
+ .method public static void F() cil managed
+ {
+ IL_0000: unused
+ IL_0001: ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal([0xFE, 0x22, 0x2A], il);
+ }
[Fact]
- public void MethodNameF1_NotConfusedWithHexByte()
+ public void Ldtoken_NumericTokenEmittedCorrectly()
{
string source = """
- .assembly extern System.Runtime { }
- .assembly TestAssembly { }
- .class public auto ansi beforefieldinit Test
+ .assembly test { }
+ .method public static void F() cil managed
{
- .method public static int32 f1() cil managed
+ ldtoken 0
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal([0xD0, 0x00, 0x00, 0x00, 0x00, 0x2A], il);
+ }
+
+ [Fact]
+ public void Calli_WritesOpcodeAndSignatureToken()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ calli void()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal(0x29, il[0]);
+ var signatureHandle = (StandaloneSignatureHandle)MetadataTokens.EntityHandle(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1)));
+ Assert.Equal(0x2A, il[5]);
+
+ MethodSignature signature = DecodeCalliSignature(reader, signatureHandle);
+ Assert.Equal(SignatureCallingConvention.Default, signature.Header.CallingConvention);
+ Assert.False(signature.Header.IsInstance);
+ Assert.False(signature.Header.HasExplicitThis);
+ Assert.Equal(PrimitiveTypeCode.Void, signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
+ }
+
+ [Theory]
+ [InlineData("explicit instance")]
+ [InlineData("instance explicit")]
+ public void Calli_ExplicitInstance_PreservesExplicitThis(string callingConvention)
+ {
+ string source = $$"""
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ calli {{callingConvention}} void()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ MethodSignature signature = DecodeCalliSignature(reader, MetadataTokens.StandaloneSignatureHandle(1));
+
+ Assert.Equal(SignatureCallingConvention.Default, signature.Header.CallingConvention);
+ Assert.True(signature.Header.IsInstance);
+ Assert.True(signature.Header.HasExplicitThis);
+ Assert.Equal(PrimitiveTypeCode.Void, signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
+ }
+
+ [Fact]
+ public void Calli_VarArgSignature_DoesNotCountSentinelAsParameter()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ calli vararg void(int32, ..., string, int64)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ MethodSignature signature = DecodeCalliSignature(reader, MetadataTokens.StandaloneSignatureHandle(1));
+
+ Assert.Equal(SignatureCallingConvention.VarArgs, signature.Header.CallingConvention);
+ Assert.Equal(1, signature.RequiredParameterCount);
+ Assert.Equal([PrimitiveTypeCode.Int32, PrimitiveTypeCode.String, PrimitiveTypeCode.Int64], signature.ParameterTypes.ToArray());
+ }
+
+ [Fact]
+ public void ReferenceAndCalliOperands_NestedSignaturesDecodeCorrectly()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
{
+ ldsfld method vararg void *(int32 modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile), ..., string) class [mscorlib]System.Tuple`1>::Callback
+ pop
+ call void class [mscorlib]System.Tuple`1>::Invoke(method vararg void *(int32 modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile), ..., string))
ldc.i4.0
+ conv.i
+ calli vararg void(class [mscorlib]System.Tuple`1>, ..., method vararg void *(int32 modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile), ..., string))
ret
}
}
@@ -251,56 +561,824 @@ .method public static int32 f1() cil managed
using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
var reader = pe.GetMetadataReader();
- var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
- var methods = typeDef.GetMethods().ToArray();
- Assert.Single(methods);
- Assert.Equal("f1", reader.GetString(reader.GetMethodDefinition(methods[0]).Name));
+
+ MemberReference fieldReference = reader.MemberReferences
+ .Select(reader.GetMemberReference)
+ .Single(reference => reader.GetString(reference.Name) == "Callback");
+ Assert.Equal(
+ "method void *(int32 modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile), ..., string)",
+ fieldReference.DecodeFieldSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ MemberReference methodReference = reader.MemberReferences
+ .Select(reader.GetMemberReference)
+ .Single(reference => reader.GetString(reference.Name) == "Invoke");
+ MethodSignature methodSignature =
+ methodReference.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("void", methodSignature.ReturnType);
+ Assert.Equal(
+ new[] { "method void *(int32 modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile), ..., string)" },
+ methodSignature.ParameterTypes);
+
+ MethodSignature calliSignature = reader
+ .GetStandaloneSignature(MetadataTokens.StandaloneSignatureHandle(1))
+ .DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal(SignatureCallingConvention.VarArgs, calliSignature.Header.CallingConvention);
+ Assert.Equal(1, calliSignature.RequiredParameterCount);
+ Assert.Equal(
+ new[]
+ {
+ "[mscorlib]System.Tuple`1<[mscorlib]System.Tuple`1>",
+ "method void *(int32 modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile), ..., string)",
+ },
+ calliSignature.ParameterTypes);
}
+ [Theory]
+ [InlineData("ret")]
+ [InlineData("ldc.i4.1\nlocalloc\npop\nret")]
+ public void MaxStackDirective_BelowEightMatchesNativeFatHeaderBehavior(string instructions)
+ {
+ string source = $$"""
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ .maxstack 3
+ {{instructions}}
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+ Assert.Equal(3, body.MaxStack);
+ Assert.True(body.LocalVariablesInitialized);
+ }
[Fact]
- public void SwitchInstruction_CommaLabels()
+ public void MaxStackDirective_DoesNotInitializeExistingLocals()
{
string source = """
- .assembly extern System.Runtime { }
- .assembly TestAssembly { }
- .class public auto ansi beforefieldinit Test
+ .assembly Test { }
+ .class public auto ansi Test
{
- .method public static void M() cil managed
+ .method public static void F() cil managed
+ {
+ .maxstack 3
+ .locals (int32 V_0)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(3, body.MaxStack);
+ Assert.False(body.LocalVariablesInitialized);
+ }
+
+ [Fact]
+ public void MethodWithoutMaxStack_UsesNativeDefault()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
{
ldc.i4.0
- switch (L0, L1, L2)
- L0: nop
- L1: nop
- L2: ret
+ pop
+ ret
}
}
""";
- var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
- Assert.Empty(diagnostics);
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(8, body.MaxStack);
+ Assert.False(body.LocalVariablesInitialized);
+ }
+
+ [Fact]
+ public void ZeroInitWithoutLocals_ForcesFatHeader()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ .zeroinit
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal(8, body.MaxStack);
+ Assert.True(body.LocalVariablesInitialized);
}
+ [Theory]
+ [InlineData("4294967295", 4294967295d)]
+ [InlineData("4503599627370496", 4503599627370496d)]
+ [InlineData("-4294967295", -4294967295d)]
+ [InlineData("0xFFFFFFFF", 4294967295d)]
+ [InlineData("4294967295.", 4294967295d)]
+ public void LdcR8_IntegerLiteral_PreservesValue(string literal, double expected)
+ {
+ string source = $$"""
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .method public static void F() cil managed
+ {
+ ldc.r8 {{literal}}
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+
+ Assert.Equal(0x23, il[0]);
+ Assert.Equal(expected, BitConverter.Int64BitsToDouble(BinaryPrimitives.ReadInt64LittleEndian(il.AsSpan(1))));
+ }
[Fact]
- public void FieldRVA_DataLabelEmitted()
+ public void LdcR4_IntegerLiteral_PreservesValue()
{
string source = """
- .assembly extern mscorlib { }
- .assembly test { }
- .data D_1 = int32(42)
- .class public auto ansi Test extends [mscorlib]System.Object
+ .assembly Test { }
+ .class public auto ansi Test
{
- .field public static int32 myData at D_1
+ .method public static void F() cil managed
+ {
+ ldc.r4 4294967295
+ pop
+ ret
+ }
}
""";
using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == "F");
+ byte[] il = pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
- // The FieldRVA table should have an entry
- int fieldRvaCount = reader.GetTableRowCount(TableIndex.FieldRva);
- Assert.True(fieldRvaCount >= 1, $"FieldRVA table should have at least 1 entry, has {fieldRvaCount}");
+ Assert.Equal(0x22, il[0]);
+ Assert.Equal(4294967295f, BitConverter.Int32BitsToSingle(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1))));
+ }
+
+ private static MethodSignature DecodeCalliSignature(MetadataReader reader, StandaloneSignatureHandle handle)
+ {
+ BlobReader blobReader = reader.GetBlobReader(reader.GetStandaloneSignature(handle).Signature);
+ var decoder = new SignatureDecoder(PrimitiveTypeProvider.Instance, reader, genericContext: null);
+
+ return decoder.DecodeMethodSignature(ref blobReader);
+ }
+
+ private sealed class PrimitiveTypeProvider : ISignatureTypeProvider
+ {
+ public static PrimitiveTypeProvider Instance { get; } = new();
+
+ public PrimitiveTypeCode GetArrayType(PrimitiveTypeCode elementType, ArrayShape shape) => elementType;
+ public PrimitiveTypeCode GetByReferenceType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetFunctionPointerType(MethodSignature signature) => PrimitiveTypeCode.IntPtr;
+ public PrimitiveTypeCode GetGenericInstantiation(PrimitiveTypeCode genericType, ImmutableArray typeArguments) => genericType;
+ public PrimitiveTypeCode GetGenericMethodParameter(object? genericContext, int index) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetGenericTypeParameter(object? genericContext, int index) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetModifiedType(PrimitiveTypeCode modifier, PrimitiveTypeCode unmodifiedType, bool isRequired) => unmodifiedType;
+ public PrimitiveTypeCode GetPinnedType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetPointerType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetPrimitiveType(PrimitiveTypeCode typeCode) => typeCode;
+ public PrimitiveTypeCode GetSZArrayType(PrimitiveTypeCode elementType) => elementType;
+ public PrimitiveTypeCode GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => PrimitiveTypeCode.Object;
+ public PrimitiveTypeCode GetTypeFromSpecification(MetadataReader reader, object? genericContext, TypeSpecificationHandle handle, byte rawTypeKind) => PrimitiveTypeCode.Object;
+ }
+
+ [Fact]
+ public void Ldtoken_FieldReference_IsBackpatched()
+ {
+ string source = """
+ .assembly Test { }
+ .class public auto ansi Test
+ {
+ .field public static int32 F
+ .method public static void M() cil managed
+ {
+ ldtoken field int32 Test::F
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "M", ILOpcode.ldtoken);
+
+ DocumentCompilerTestHelpers.AssertFieldDefToken(reader, token, "F");
+ }
+
+
+ [Fact]
+ public void MethodNameF1_NotConfusedWithHexByte()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly TestAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static int32 f1() cil managed
+ {
+ ldc.i4.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ var methods = typeDef.GetMethods().ToArray();
+ Assert.Single(methods);
+ Assert.Equal("f1", reader.GetString(reader.GetMethodDefinition(methods[0]).Name));
+ }
+
+
+ [Fact]
+ public void SwitchInstruction_NamedLabels_EmitsExpectedBranchTable()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly TestAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void M() cil managed
+ {
+ ldc.i4.0
+ switch (L0, L1, L2)
+ L0: nop
+ L1: nop
+ L2: ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "M");
+ int switchOffset = Array.IndexOf(il, (byte)0x45);
+
+ Assert.True(switchOffset >= 0);
+ Assert.Equal(3, BitConverter.ToInt32(il, switchOffset + 1));
+ Assert.Equal(0, BitConverter.ToInt32(il, switchOffset + 5));
+ Assert.Equal(1, BitConverter.ToInt32(il, switchOffset + 9));
+ Assert.Equal(2, BitConverter.ToInt32(il, switchOffset + 13));
+ }
+
+ [Theory]
+ [InlineData("ldc.r4", "1.5", 1.5)]
+ [InlineData("ldc.r8", "1.5", 1.5)]
+ [InlineData("ldc.r8", ".5", 0.5)]
+ [InlineData("ldc.r8", "5e+1", 50.0)]
+ [InlineData("ldc.r8", "-1.25e-2", -0.0125)]
+ [InlineData("ldc.r8", "float32(0x3F800000)", 1.0)]
+ public void FloatingPointInstruction_TextAndFloat32BitForms_EmitExpectedValue(
+ string opcode,
+ string literal,
+ double expected)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ {{opcode}} {{literal}}
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "M");
+ if (opcode == "ldc.r4")
+ {
+ Assert.Equal(0x22, il[0]);
+ Assert.Equal((float)expected, BitConverter.ToSingle(il, 1));
+ }
+ else
+ {
+ Assert.Equal(0x23, il[0]);
+ Assert.Equal(expected, BitConverter.ToDouble(il, 1));
+ }
+ }
+
+ [Fact]
+ public void FloatingPointInstruction_Float64BitPattern_EmitsExpectedDouble()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static float64 GetPi() cil managed
+ {
+ ldc.r8 float64(0x400921FB54442D18)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "GetPi");
+
+ Assert.Equal(0x23, il[0]);
+ Assert.Equal(Math.PI, BitConverter.ToDouble(il, 1), 14);
+ }
+
+ [Fact]
+ public void FloatingPointInstruction_IntegerOverflow_ReportsDiagnostic()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ ldc.r8 99999999999999999999999999999999
+ pop
+ ret
+ }
+ }
+ """;
+
+ var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
+ var error = Assert.Single(diagnostics);
+ Assert.Equal(DiagnosticIds.LiteralOutOfRange, error.Id);
+ }
+
+ [Fact]
+ public void FloatingPointInstruction_ByteForms_EmitExpectedConstants()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static float32 GetSingle() cil managed
+ {
+ ldc.r4 (00 00 80 3F)
+ ret
+ }
+
+ .method public static float64 GetDouble() cil managed
+ {
+ ldc.r8 bytearray(00 00 00 00 00 00 F0 3F)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] singleIL = GetMethodIL(pe, "GetSingle");
+ byte[] doubleIL = GetMethodIL(pe, "GetDouble");
+
+ Assert.Equal(0x22, singleIL[0]);
+ Assert.Equal(1f, BitConverter.ToSingle(singleIL, 1));
+ Assert.Equal(0x23, doubleIL[0]);
+ Assert.Equal(1d, BitConverter.ToDouble(doubleIL, 1));
+ }
+
+ [Fact]
+ public void CalliInstruction_EmitsStandaloneSignatureToken()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static int32 M(native int functionPointer) cil managed
+ {
+ ldarg.0
+ calli default int32()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.StandAloneSig));
+
+ var signature = reader.GetStandaloneSignature(MetadataTokens.StandaloneSignatureHandle(1));
+ MethodSignature decodedSignature =
+ signature.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal(SignatureCallingConvention.Default, decodedSignature.Header.CallingConvention);
+ Assert.Equal("int32", decodedSignature.ReturnType);
+ Assert.Empty(decodedSignature.ParameterTypes);
+
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "M", ILOpcode.calli);
+ Assert.Equal(MetadataTokens.GetToken(MetadataTokens.StandaloneSignatureHandle(1)), token);
+ }
+
+ [Theory]
+ [InlineData("unmanaged cdecl", (int)SignatureCallingConvention.CDecl, false, false)]
+ [InlineData("unmanaged stdcall", (int)SignatureCallingConvention.StdCall, false, false)]
+ [InlineData("unmanaged thiscall", (int)SignatureCallingConvention.ThisCall, false, false)]
+ [InlineData("unmanaged fastcall", (int)SignatureCallingConvention.FastCall, false, false)]
+ [InlineData("unmanaged", (int)SignatureCallingConvention.Unmanaged, false, false)]
+ [InlineData("vararg", (int)SignatureCallingConvention.VarArgs, false, false)]
+ [InlineData("instance default", (int)SignatureCallingConvention.Default, true, false)]
+ [InlineData("callconv(0x05)", (int)SignatureCallingConvention.VarArgs, false, false)]
+ public void CalliInstruction_CallingConvention_EmitsDecodedSignature(
+ string callingConvention,
+ int expectedCallingConvention,
+ bool expectedInstance,
+ bool expectedExplicitThis)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ ldc.i4.0
+ conv.i
+ calli {{callingConvention}} void()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var signature = reader.GetStandaloneSignature(Assert.Single(
+ Enumerable.Range(1, reader.GetTableRowCount(TableIndex.StandAloneSig))
+ .Select(MetadataTokens.StandaloneSignatureHandle)));
+ MethodSignature decoded =
+ signature.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+
+ Assert.Equal((SignatureCallingConvention)expectedCallingConvention, decoded.Header.CallingConvention);
+ Assert.Equal(expectedInstance, decoded.Header.IsInstance);
+ Assert.True(
+ decoded.Header.HasExplicitThis == expectedExplicitThis,
+ $"Expected explicit-this={expectedExplicitThis}, header=0x{decoded.Header.RawValue:X2}");
+ Assert.Equal("void", decoded.ReturnType);
+ Assert.Empty(decoded.ParameterTypes);
+ }
+
+ [Fact]
+ public void LdstrInstruction_ComposedAnsiAndRawForms_EmitExpectedUserStrings()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static string GetUtf16() cil managed
+ {
+ ldstr bytearray(48 00 69 00)
+ ret
+ }
+
+ .method public static string GetAnsi() cil managed
+ {
+ ldstr ansi("A" + "B")
+ ret
+ }
+
+ .method public static string GetOddAnsi() cil managed
+ {
+ ldstr ansi("A" + "BC")
+ ret
+ }
+
+ .method public static string GetComposed() cil managed
+ {
+ ldstr "A" + "B"
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("Hi", ReadLdstrValue(pe, reader, "GetUtf16"));
+ Assert.Equal("\u4241", ReadLdstrValue(pe, reader, "GetAnsi"));
+ Assert.Equal("\u4241\u0043", ReadLdstrValue(pe, reader, "GetOddAnsi"));
+ Assert.Equal("AB", ReadLdstrValue(pe, reader, "GetComposed"));
+ }
+
+ [Fact]
+ public void Ldstr_WithControlAndQuotedEscapes_EmitsExpectedUserStrings()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [System.Runtime]System.Object
+ {
+ .method public static string ControlEscapes() cil managed
+ {
+ ldstr "A\bB\fC\vD\aE\?F\'G"
+ ret
+ }
+
+ .method public static string QuotedLiteral() cil managed
+ {
+ ldstr "double\"quoted\?"
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("A\bB\fC\vD\aE?F'G", ReadLdstrValue(pe, reader, "ControlEscapes"));
+ Assert.Equal("double\"quoted?", ReadLdstrValue(pe, reader, "QuotedLiteral"));
+ }
+
+ [Fact]
+ public void Ldstr_WithLineContinuationAndShortOrHighOctalEscapes_EmitsExpectedUserString()
+ {
+ string source =
+ ".assembly extern System.Runtime { }\n" +
+ ".assembly test { }\n" +
+ ".class public auto ansi beforefieldinit Test extends [System.Runtime]System.Object\n" +
+ "{\n" +
+ " .method public static string FallbackEscapes() cil managed\n" +
+ " {\n" +
+ " ldstr \"line\\\n" +
+ " continued\\12\\400!\"\n" +
+ " ret\n" +
+ " }\n" +
+ "}\n";
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("linecontinued12400!", ReadLdstrValue(pe, reader, "FallbackEscapes"));
+ }
+
+ [Fact]
+ public void SwitchInstruction_IntegerOffsets_EmitsExpectedBranchTable()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static int32 M(int32 'value') cil managed
+ {
+ ldarg.0
+ switch (3, 6)
+ ldc.i4.0
+ ret
+ ldc.i4.1
+ ret
+ ldc.i4.2
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "M");
+ int switchOffset = Array.IndexOf(il, (byte)0x45);
+
+ Assert.True(switchOffset >= 0);
+ Assert.Equal(2, BitConverter.ToInt32(il, switchOffset + 1));
+ Assert.Equal(3, BitConverter.ToInt32(il, switchOffset + 5));
+ Assert.Equal(6, BitConverter.ToInt32(il, switchOffset + 9));
+ }
+
+ [Theory]
+ [InlineData("switch ()")]
+ [InlineData("switch ( )")]
+ public void SwitchInstruction_Empty_EmitsEmptyBranchTable(string instruction)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ {{instruction}}
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ byte[] il = GetMethodIL(pe, "M");
+
+ Assert.Equal(0x45, il[0]);
+ Assert.Equal(0, BitConverter.ToInt32(il, 1));
+ }
+
+ [Fact]
+ public void LdtokenInstruction_TypeReference_EmitsTypeReferenceToken()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static valuetype [mscorlib]System.RuntimeTypeHandle GetHandle() cil managed
+ {
+ ldtoken [mscorlib]System.Int32
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ byte[] il = GetMethodIL(pe, "GetHandle");
+
+ Assert.Equal(0xD0, il[0]);
+ int token = BitConverter.ToInt32(il, 1);
+ var handle = MetadataTokens.EntityHandle(token);
+ Assert.Equal(HandleKind.TypeReference, handle.Kind);
+ Assert.Equal("Int32", reader.GetString(reader.GetTypeReference((TypeReferenceHandle)handle).Name));
+ }
+
+ [Fact]
+ public void InstructionOperandForms_EmitExpectedTokensAndRawOperands()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static int32 Value
+
+ .method public specialname rtspecialname instance void .ctor() cil managed
+ {
+ ldarg.0
+ call instance void [mscorlib]System.Object::.ctor()
+ ret
+ }
+
+ .method public static void Exercise(object 'value') cil managed
+ {
+ br 0
+ ldsfld mdtoken(0x04000001)
+ pop
+ ldsfld int32 Test::Value
+ pop
+ ldsfld mdtoken(0x01000001)
+ pop
+ ldarg.0
+ unaligned. 1
+ ldind.i4
+ pop
+ ldarg.0
+ callvirt instance string [mscorlib]System.Object::ToString()
+ pop
+ newobj instance void Test::.ctor()
+ pop
+ ldc.i4.0
+ ldnull
+ ldc.i4.0
+ conv.i
+ calli default void(int32, string)
+ ldtoken Test
+ pop
+ switch ()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ byte[] il = GetMethodIL(pe, "Exercise");
+
+ ImmutableArray fieldTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "Exercise", ILOpcode.ldsfld);
+ Assert.Equal(3, fieldTokens.Length);
+ Assert.Equal(HandleKind.FieldDefinition, MetadataTokens.EntityHandle(fieldTokens[0]).Kind);
+ Assert.Equal(HandleKind.FieldDefinition, MetadataTokens.EntityHandle(fieldTokens[1]).Kind);
+ Assert.Equal(HandleKind.TypeReference, MetadataTokens.EntityHandle(fieldTokens[2]).Kind);
+
+ int callvirtToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Exercise", ILOpcode.callvirt);
+ Assert.Equal(
+ "ToString",
+ reader.GetString(reader.GetMemberReference((MemberReferenceHandle)MetadataTokens.EntityHandle(callvirtToken)).Name));
+
+ int newobjToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Exercise", ILOpcode.newobj);
+ Assert.Equal(
+ ".ctor",
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)MetadataTokens.EntityHandle(newobjToken)).Name));
+
+ int typeToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Exercise", ILOpcode.ldtoken);
+ Assert.Equal(
+ "Test",
+ reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)MetadataTokens.EntityHandle(typeToken)).Name));
+
+ var calliSignature = reader.GetStandaloneSignature(
+ MetadataTokens.StandaloneSignatureHandle(reader.GetTableRowCount(TableIndex.StandAloneSig)));
+ MethodSignature decodedCalli =
+ calliSignature.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal("void", decodedCalli.ReturnType);
+ Assert.Equal(new[] { "int32", "string" }, decodedCalli.ParameterTypes);
+
+ Assert.True(ContainsSequence(il, [0x38, 0x00, 0x00, 0x00, 0x00]));
+ Assert.True(ContainsSequence(il, [0xFE, 0x12, 0x01]));
+ Assert.True(ContainsSequence(il, [0x45, 0x00, 0x00, 0x00, 0x00]));
+ }
+
+
+ [Fact]
+ public void FieldRVA_DataLabelEmitted()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .data D_1 = int32(42)
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static int32 myData at D_1
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ // The FieldRVA table should have an entry
+ int fieldRvaCount = reader.GetTableRowCount(TableIndex.FieldRva);
+ Assert.True(fieldRvaCount >= 1, $"FieldRVA table should have at least 1 entry, has {fieldRvaCount}");
+ }
+
+ private static byte[] GetMethodIL(PEReader pe, string methodName)
+ {
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == methodName);
+ return pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+ }
+
+ private static string ReadLdstrValue(PEReader pe, MetadataReader reader, string methodName)
+ {
+ byte[] il = GetMethodIL(pe, methodName);
+ Assert.Equal(0x72, il[0]);
+ int token = BitConverter.ToInt32(il, 1);
+ Assert.Equal(0x70, (token >> 24) & 0xFF);
+ return reader.GetUserString(MetadataTokens.UserStringHandle(token & 0x00FFFFFF));
+ }
+
+ private static bool ContainsSequence(byte[] bytes, ReadOnlySpan sequence)
+ {
+ for (int i = 0; i <= bytes.Length - sequence.Length; i++)
+ {
+ if (bytes.AsSpan(i, sequence.Length).SequenceEqual(sequence))
+ {
+ return true;
+ }
+ }
+
+ return false;
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs
index 6f5981510ca25e..7d3329ac6d1bfb 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/InteropTests.cs
@@ -1,10 +1,12 @@
// 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.Immutable;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Runtime.InteropServices;
using Internal.IL;
using Xunit;
using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
@@ -103,6 +105,674 @@ int32 GetCurrentProcessId() cil managed preservesig
Assert.True(method.Attributes.HasFlag(MethodAttributes.PinvokeImpl));
var import = method.GetImport();
Assert.False(import.Module.IsNil);
+ Assert.Equal("GetCurrentProcessId", reader.GetString(import.Name));
+ }
+
+ [Fact]
+ public void FixedArrayMarshalWithoutElementType_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field assembly marshal(fixed array [1024]) bool[] Bool
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([0x1E, 0x84, 0x00], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void SafeArrayMarshalWithoutVariantType_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal(safearray) object[] Values
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([(byte)UnmanagedType.SafeArray, 0, 0], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void VariantBoolMarshal_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal(variant bool) bool Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([(byte)UnmanagedType.VariantBool], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Theory]
+ [InlineData("[]", "2A50")]
+ [InlineData("[100]", "2A50006400")]
+ [InlineData("[100 + 1]", "2A50016401")]
+ [InlineData("[+ 1]", "2A5001")]
+ public void LPArrayMarshalSizeSyntax_EmitsNativeCompatibleDescriptor(string sizeSyntax, string expectedHex)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal({{sizeSyntax}}) int32[] Values
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal(Convert.FromHexString(expectedHex), reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Theory]
+ [InlineData("{ 2A 50 }", "2A50")]
+ [InlineData("{ 1E }", "1E")]
+ [InlineData("{ 00 0A FF }", "000AFF")]
+ public void RawMarshalBlob_EmitsSuppliedBytes(string blob, string expectedHex)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal({{blob}}) int32[] Values
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal(Convert.FromHexString(expectedHex), reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void MalformedRawMarshalBlob_DoesNotLeakIntoFollowingField()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal({ }) int32 Bad
+ .field public marshal({ 2A 50 }) int32[] Good
+ }
+ """;
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ FieldDefinition good = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .Single(field => reader.GetString(field.Name) == "Good");
+
+ Assert.Equal([0x2A, 0x50], reader.GetBlobBytes(good.GetMarshallingDescriptor()));
+ }
+
+ [Theory]
+ [InlineData("marshal({")]
+ [InlineData("marshal(fixed array[2] int32[3 +")]
+ [InlineData("marshal(custom(\"Marshaller\",")]
+ public void MalformedNestedMarshal_DoesNotLeakFramesIntoNextDocument(string malformedMarshal)
+ {
+ ImmutableArray documents =
+ [
+ new SourceText($$"""
+ .assembly test { }
+ .class public auto ansi Broken
+ {
+ .method public static void M(object {{malformedMarshal}}
+ """, "broken.il"),
+ new SourceText("""
+ .class public auto ansi Following
+ {
+ .field public marshal(fixed array[2] int16[3+1]) int16[] Values
+ }
+ """, "following.il")
+ ];
+
+ DocumentCompiler compiler = new();
+ var (diagnostics, result) = compiler.Compile(
+ documents,
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ Assert.NotNull(result);
+
+ BlobBuilder image = new();
+ result!.Serialize(image);
+ using PEReader pe = new(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ FieldDefinition field = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .Single(field => reader.GetString(field.Name) == "Values");
+
+ Assert.Equal(
+ [0x1E, 0x02, 0x2A, 0x05, 0x01, 0x03, 0x01],
+ reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Theory]
+ [InlineData("int8", UnmanagedType.U1)]
+ [InlineData("int16", UnmanagedType.U2)]
+ [InlineData("int32", UnmanagedType.U4)]
+ [InlineData("int64", UnmanagedType.U8)]
+ public void UnsignedNativeTypeSpelling_EmitsUnsignedDescriptor(string type, UnmanagedType expected)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static bool marshal(unsigned {{type}}) F() cil managed
+ {
+ ldc.i4.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle(1));
+ var returnParameter = method.GetParameters()
+ .Select(reader.GetParameter)
+ .Single(parameter => parameter.SequenceNumber == 0);
+
+ Assert.Equal([(byte)expected], reader.GetBlobBytes(returnParameter.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void FixedSysStringMarshal_EmitsDescriptor()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .field public marshal(fixed sysstring [256]) string Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+
+ Assert.Equal([0x17, 0x81, 0x00], reader.GetBlobBytes(field.GetMarshallingDescriptor()));
+ }
+
+ [Fact]
+ public void MarshalLpStrParameter_EmitsMarshallingDescriptorBlob()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Print(string marshal(lpstr) text) cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var method = reader.MethodDefinitions
+ .Select(h => reader.GetMethodDefinition(h))
+ .First(m => reader.GetString(m.Name) == "Print");
+ var parameterHandle = Assert.Single(method.GetParameters());
+ var parameter = reader.GetParameter(parameterHandle);
+ var descriptor = parameter.GetMarshallingDescriptor();
+
+ Assert.False(descriptor.IsNil);
+ Assert.Equal("text", reader.GetString(parameter.Name));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.FieldMarshal));
+ BlobReader descriptorReader = reader.GetBlobReader(descriptor);
+ Assert.Equal((byte)UnmanagedType.LPStr, descriptorReader.ReadByte());
+ Assert.Equal(0, descriptorReader.RemainingBytes);
+ }
+
+ [Fact]
+ public void PinvokeMethod_WithAlias_EmitsImportNameAndModuleReference()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .module test.dll
+ .class public auto ansi beforefieldinit NativeMethods extends [mscorlib]System.Object
+ {
+ .method public static pinvokeimpl("kernel32.dll" as "GetTickCount" winapi)
+ int32 GetTickCountManaged() cil managed preservesig
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "GetTickCountManaged");
+ var import = method.GetImport();
+ var moduleRef = reader.GetModuleReference(import.Module);
+
+ Assert.True(method.Attributes.HasFlag(MethodAttributes.PinvokeImpl));
+ Assert.Equal("GetTickCount", reader.GetString(import.Name));
+ Assert.Equal("kernel32.dll", reader.GetString(moduleRef.Name));
+ }
+
+ [Fact]
+ public void PinvokeMethod_EmitsImportMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .module test.dll
+ .class public auto ansi beforefieldinit NativeMethods extends [mscorlib]System.Object
+ {
+ .method public static pinvokeimpl("kernel32.dll" winapi)
+ int32 GetCurrentProcessId() cil managed preservesig
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == "GetCurrentProcessId");
+ var import = method.GetImport();
+ var moduleRef = reader.GetModuleReference(import.Module);
+
+ Assert.True(method.Attributes.HasFlag(MethodAttributes.PinvokeImpl));
+ Assert.Equal("kernel32.dll", reader.GetString(moduleRef.Name));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.ModuleRef));
+ }
+
+ [Theory]
+ [InlineData("nomangle", (int)MethodImportAttributes.ExactSpelling)]
+ [InlineData("ansi", (int)MethodImportAttributes.CharSetAnsi)]
+ [InlineData("unicode", (int)MethodImportAttributes.CharSetUnicode)]
+ [InlineData("autochar", (int)MethodImportAttributes.CharSetAuto)]
+ [InlineData("lasterr", (int)MethodImportAttributes.SetLastError)]
+ [InlineData("cdecl", (int)MethodImportAttributes.CallingConventionCDecl)]
+ [InlineData("stdcall", (int)MethodImportAttributes.CallingConventionStdCall)]
+ [InlineData("thiscall", (int)MethodImportAttributes.CallingConventionThisCall)]
+ [InlineData("fastcall", (int)MethodImportAttributes.CallingConventionFastCall)]
+ [InlineData("bestfit:on", (int)MethodImportAttributes.BestFitMappingEnable)]
+ [InlineData("bestfit:off", (int)MethodImportAttributes.BestFitMappingDisable)]
+ [InlineData("charmaperror:on", (int)MethodImportAttributes.ThrowOnUnmappableCharEnable)]
+ [InlineData("charmaperror:off", (int)MethodImportAttributes.ThrowOnUnmappableCharDisable)]
+ [InlineData("flags(0x1234)", 0x1234)]
+ public void PinvokeAttribute_EmitsExpectedImportFlags(string attribute, int expectedFlags)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi NativeMethods extends [mscorlib]System.Object
+ {
+ .method public static pinvokeimpl("native.dll" {{attribute}})
+ void M() cil managed preservesig
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var import = method.GetImport();
+
+ Assert.Equal((MethodImportAttributes)expectedFlags, import.Attributes);
+ Assert.Equal("M", reader.GetString(method.Name));
+ Assert.Equal("M", reader.GetString(import.Name));
+ Assert.Equal("native.dll", reader.GetString(reader.GetModuleReference(import.Module).Name));
+ }
+
+ [Theory]
+ [InlineData("bool", 0x02)]
+ [InlineData("int8", 0x03)]
+ [InlineData("uint8", 0x04)]
+ [InlineData("int16", 0x05)]
+ [InlineData("uint16", 0x06)]
+ [InlineData("int32", 0x07)]
+ [InlineData("uint32", 0x08)]
+ [InlineData("int64", 0x09)]
+ [InlineData("uint64", 0x0A)]
+ [InlineData("float32", 0x0B)]
+ [InlineData("float64", 0x0C)]
+ [InlineData("currency", 0x0F)]
+ [InlineData("bstr", 0x13)]
+ [InlineData("lpstr", 0x14)]
+ [InlineData("lpwstr", 0x15)]
+ [InlineData("lptstr", 0x16)]
+ [InlineData("iunknown", 0x19)]
+ [InlineData("idispatch", 0x1A)]
+ [InlineData("struct", 0x1B)]
+ [InlineData("interface", 0x1C)]
+ [InlineData("int", 0x1F)]
+ [InlineData("uint", 0x20)]
+ [InlineData("byvalstr", 0x22)]
+ [InlineData("ansi bstr", 0x23)]
+ [InlineData("tbstr", 0x24)]
+ [InlineData("method", 0x26)]
+ [InlineData("as any", 0x28)]
+ [InlineData("lpstruct", 0x2B)]
+ [InlineData("error", 0x2D)]
+ public void MarshalSimpleNativeType_EmitsExpectedDescriptor(string nativeType, int expectedTypeCode)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ Assert.Empty(diagnostics);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ Assert.Equal((byte)expectedTypeCode, descriptor.ReadByte());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("fixed sysstring[5]")]
+ [InlineData("fixed array[3] int16")]
+ [InlineData("iunknown(iidparam=2)")]
+ [InlineData("idispatch(iidparam=3)")]
+ [InlineData("interface(iidparam=4)")]
+ [InlineData("int32*")]
+ [InlineData("int32[]")]
+ [InlineData("int32[3]")]
+ [InlineData("int32[3+2]")]
+ [InlineData("int32[+2]")]
+ public void MarshalNativeTypeWithPayload_EmitsExpectedDescriptor(string nativeType)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ if (nativeType == "int32*")
+ {
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.DeprecatedNativeType);
+ }
+ else
+ {
+ Assert.Empty(diagnostics);
+ }
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ switch (nativeType)
+ {
+ case "fixed sysstring[5]":
+ Assert.Equal((byte)UnmanagedType.ByValTStr, descriptor.ReadByte());
+ Assert.Equal(5, descriptor.ReadCompressedInteger());
+ break;
+
+ case "fixed array[3] int16":
+ Assert.Equal((byte)UnmanagedType.ByValArray, descriptor.ReadByte());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ Assert.Equal((byte)UnmanagedType.I2, descriptor.ReadByte());
+ break;
+
+ case "iunknown(iidparam=2)":
+ Assert.Equal((byte)UnmanagedType.IUnknown, descriptor.ReadByte());
+ Assert.Equal(2, descriptor.ReadCompressedInteger());
+ break;
+
+ case "idispatch(iidparam=3)":
+ Assert.Equal((byte)UnmanagedType.IDispatch, descriptor.ReadByte());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ break;
+
+ case "interface(iidparam=4)":
+ Assert.Equal((byte)UnmanagedType.Interface, descriptor.ReadByte());
+ Assert.Equal(4, descriptor.ReadCompressedInteger());
+ break;
+
+ case "int32*":
+ Assert.Equal(0x10, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ break;
+
+ case "int32[]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ break;
+
+ case "int32[3]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ break;
+
+ case "int32[3+2]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ Assert.Equal(2, descriptor.ReadCompressedInteger());
+ Assert.Equal(3, descriptor.ReadCompressedInteger());
+ Assert.Equal(1, descriptor.ReadCompressedInteger());
+ break;
+
+ case "int32[+2]":
+ Assert.Equal((byte)UnmanagedType.LPArray, descriptor.ReadByte());
+ Assert.Equal((byte)UnmanagedType.I4, descriptor.ReadByte());
+ Assert.Equal(2, descriptor.ReadCompressedInteger());
+ break;
+ }
+
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("custom(\"Marshaller.Type\", \"cookie\")", false)]
+ [InlineData("custom(\"guid\", \"native\", \"Marshaller.Type\", \"cookie\")", true)]
+ public void MarshalCustomMarshaller_EmitsStructuredDescriptor(
+ string nativeType,
+ bool usesDeprecatedForm)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ if (usesDeprecatedForm)
+ {
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.DeprecatedCustomMarshaller);
+ }
+ else
+ {
+ Assert.Empty(diagnostics);
+ }
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ Assert.Equal((byte)UnmanagedType.CustomMarshaler, descriptor.ReadByte());
+ if (usesDeprecatedForm)
+ {
+ Assert.Equal("guid", descriptor.ReadSerializedString());
+ Assert.Equal("native", descriptor.ReadSerializedString());
+ }
+ else
+ {
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ }
+
+ Assert.Equal("Marshaller.Type", descriptor.ReadSerializedString());
+ Assert.Equal("cookie", descriptor.ReadSerializedString());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("variant", (int)VarEnum.VT_VARIANT)]
+ [InlineData("currency", (int)VarEnum.VT_CY)]
+ [InlineData("void", (int)VarEnum.VT_VOID)]
+ [InlineData("bool", (int)VarEnum.VT_BOOL)]
+ [InlineData("int8", (int)VarEnum.VT_I1)]
+ [InlineData("int16", (int)VarEnum.VT_I2)]
+ [InlineData("int32", (int)VarEnum.VT_I4)]
+ [InlineData("int64", (int)VarEnum.VT_I8)]
+ [InlineData("float32", (int)VarEnum.VT_R4)]
+ [InlineData("float64", (int)VarEnum.VT_R8)]
+ [InlineData("uint8", (int)VarEnum.VT_UI1)]
+ [InlineData("uint16", (int)VarEnum.VT_UI2)]
+ [InlineData("uint32", (int)VarEnum.VT_UI4)]
+ [InlineData("uint64", (int)VarEnum.VT_UI8)]
+ [InlineData("decimal", (int)VarEnum.VT_DECIMAL)]
+ [InlineData("date", (int)VarEnum.VT_DATE)]
+ [InlineData("bstr", (int)VarEnum.VT_BSTR)]
+ [InlineData("lpstr", (int)VarEnum.VT_LPSTR)]
+ [InlineData("lpwstr", (int)VarEnum.VT_LPWSTR)]
+ [InlineData("iunknown", (int)VarEnum.VT_UNKNOWN)]
+ [InlineData("idispatch", (int)VarEnum.VT_DISPATCH)]
+ [InlineData("safearray", (int)VarEnum.VT_SAFEARRAY)]
+ [InlineData("int", (int)VarEnum.VT_INT)]
+ [InlineData("uint", (int)VarEnum.VT_UINT)]
+ [InlineData("error", (int)VarEnum.VT_ERROR)]
+ [InlineData("hresult", (int)VarEnum.VT_HRESULT)]
+ [InlineData("carray", (int)VarEnum.VT_CARRAY)]
+ [InlineData("userdefined", (int)VarEnum.VT_USERDEFINED)]
+ [InlineData("record", (int)VarEnum.VT_RECORD)]
+ [InlineData("filetime", (int)VarEnum.VT_FILETIME)]
+ [InlineData("blob", (int)VarEnum.VT_BLOB)]
+ [InlineData("stream", (int)VarEnum.VT_STREAM)]
+ [InlineData("storage", (int)VarEnum.VT_STORAGE)]
+ [InlineData("streamed_object", (int)VarEnum.VT_STREAMED_OBJECT)]
+ [InlineData("stored_object", (int)VarEnum.VT_STORED_OBJECT)]
+ [InlineData("blob_object", (int)VarEnum.VT_BLOB_OBJECT)]
+ [InlineData("cf", (int)VarEnum.VT_CF)]
+ [InlineData("clsid", (int)VarEnum.VT_CLSID)]
+ [InlineData("int32[]", (int)(VarEnum.VT_I4 | VarEnum.VT_ARRAY))]
+ [InlineData("int32 vector", (int)(VarEnum.VT_I4 | VarEnum.VT_VECTOR))]
+ [InlineData("int32&", (int)(VarEnum.VT_I4 | VarEnum.VT_BYREF))]
+ public void MarshalSafeArrayVariantType_EmitsExpectedDescriptor(string variantType, int expectedVariantType)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor($"safearray {variantType}");
+ Assert.Empty(diagnostics);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobHandle descriptorHandle = GetOnlyMarshallingDescriptor(reader);
+ BlobReader descriptor = reader.GetBlobReader(descriptorHandle);
+
+ Assert.True(
+ descriptor.ReadByte() == (byte)UnmanagedType.SafeArray,
+ Convert.ToHexString(reader.GetBlobBytes(descriptorHandle)));
+ Assert.Equal(expectedVariantType, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.ReadCompressedInteger());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Theory]
+ [InlineData("variant", 0x0E)]
+ [InlineData("syschar", 0x0D)]
+ [InlineData("void", 0x01)]
+ [InlineData("decimal", 0x11)]
+ [InlineData("date", 0x12)]
+ [InlineData("objectref", 0x18)]
+ [InlineData("nested struct", 0x21)]
+ public void DeprecatedMarshalNativeType_EmitsDescriptorAndWarning(
+ string nativeType,
+ int expectedTypeCode)
+ {
+ var (diagnostics, image) = CompileParameterMarshallingDescriptor(nativeType);
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.DeprecatedNativeType);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobReader descriptor = reader.GetBlobReader(GetOnlyMarshallingDescriptor(reader));
+
+ Assert.Equal((byte)expectedTypeCode, descriptor.ReadByte());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ [Fact]
+ public void MarshalSafeArrayWithUserDefinedType_EmitsVariantAndTypeName()
+ {
+ var (diagnostics, image) =
+ CompileParameterMarshallingDescriptor("safearray int32, \"Contoso.Element\"");
+ Assert.Empty(diagnostics);
+
+ using var pe = new PEReader(image);
+ var reader = pe.GetMetadataReader();
+ BlobHandle descriptorHandle = GetOnlyMarshallingDescriptor(reader);
+ BlobReader descriptor = reader.GetBlobReader(descriptorHandle);
+
+ Assert.True(
+ descriptor.ReadByte() == (byte)UnmanagedType.SafeArray,
+ Convert.ToHexString(reader.GetBlobBytes(descriptorHandle)));
+ Assert.Equal((int)VarEnum.VT_I4, descriptor.ReadCompressedInteger());
+ Assert.Equal("Contoso.Element", descriptor.ReadSerializedString());
+ Assert.Equal(0, descriptor.RemainingBytes);
+ }
+
+ private static (ImmutableArray Diagnostics, ImmutableArray Image)
+ CompileParameterMarshallingDescriptor(string nativeType)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M(object marshal({{nativeType}}) 'value') cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options());
+
+ Assert.NotNull(result);
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ return (diagnostics, image.ToImmutableArray());
+ }
+
+ private static BlobHandle GetOnlyMarshallingDescriptor(MetadataReader reader)
+ {
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var parameter = reader.GetParameter(Assert.Single(method.GetParameters()));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.FieldMarshal));
+ Assert.Equal("value", reader.GetString(parameter.Name));
+ return parameter.GetMarshallingDescriptor();
}
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ManifestResourceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ManifestResourceTests.cs
new file mode 100644
index 00000000000000..afd14a7d827443
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ManifestResourceTests.cs
@@ -0,0 +1,268 @@
+// 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.Buffers.Binary;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Reflection.PortableExecutable;
+using Xunit;
+
+namespace ILAssembler.Tests
+{
+ public class ManifestResourceTests
+ {
+ [Fact]
+ public void EmbeddedManifestResource_UsesResourceLocatorAliasAndEmitsResourceBytes()
+ {
+ string source = """
+ .assembly test { }
+ .mresource public Test.Resource as ResourceAlias
+ {
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ byte[] expectedResourceBytes = [0x10, 0x20, 0x30, 0x40];
+ List requestedAliases = new();
+
+ var (diagnostics, imageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options(),
+ resourceLocator: alias =>
+ {
+ requestedAliases.Add(alias);
+ return expectedResourceBytes;
+ });
+
+ Assert.Empty(diagnostics);
+ Assert.Equal(new[] { "ResourceAlias" }, requestedAliases);
+ Assert.False(imageBytes.IsDefault);
+
+ using var pe = new PEReader(imageBytes);
+ var reader = pe.GetMetadataReader();
+
+ var resource = reader.GetManifestResource(Assert.Single(reader.ManifestResources));
+ Assert.Equal("Test.Resource", reader.GetString(resource.Name));
+ Assert.Equal(ManifestResourceAttributes.Public, resource.Attributes);
+ Assert.True(resource.Implementation.IsNil);
+ Assert.Equal(0u, resource.Offset);
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.File));
+ Assert.Equal(expectedResourceBytes, ReadEmbeddedResource(pe, resource));
+ }
+
+ [Fact]
+ public void AssemblyBackedManifestResource_EmitsAssemblyImplementation()
+ {
+ string source = """
+ .assembly extern ResourceAssembly { }
+ .assembly test { }
+ .mresource private External.Resource
+ {
+ .assembly extern ResourceAssembly
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ int resourceLocatorCallCount = 0;
+
+ var (diagnostics, imageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options(),
+ resourceLocator: _ =>
+ {
+ resourceLocatorCallCount++;
+ return new byte[] { 0xFF };
+ });
+
+ Assert.Empty(diagnostics);
+ Assert.Equal(0, resourceLocatorCallCount);
+ Assert.False(imageBytes.IsDefault);
+
+ using var pe = new PEReader(imageBytes);
+ var reader = pe.GetMetadataReader();
+
+ var resource = reader.GetManifestResource(Assert.Single(reader.ManifestResources));
+ Assert.Equal("External.Resource", reader.GetString(resource.Name));
+ Assert.Equal(ManifestResourceAttributes.Private, resource.Attributes);
+ Assert.Equal(HandleKind.AssemblyReference, resource.Implementation.Kind);
+ Assert.Equal("ResourceAssembly", reader.GetString(reader.GetAssemblyReference((AssemblyReferenceHandle)resource.Implementation).Name));
+ Assert.Equal(0u, resource.Offset);
+ }
+
+ [Fact]
+ public void MissingEmbeddedManifestResource_WithErrorTolerantOption_StillEmitsMetadataRow()
+ {
+ string source = """
+ .assembly test { }
+ .mresource public Missing.Resource as MissingAlias
+ {
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+
+ var (strictDiagnostics, strictImageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options(),
+ resourceLocator: alias =>
+ {
+ Assert.Equal("MissingAlias", alias);
+ return null!;
+ });
+
+ var strictDiagnostic = Assert.Single(strictDiagnostics.Where(d => d.Id == DiagnosticIds.FileNotFound));
+ Assert.Equal(DiagnosticSeverity.Error, strictDiagnostic.Severity);
+ Assert.Equal("test.il", strictDiagnostic.Location.Source.Path);
+ Assert.True(strictImageBytes.IsDefault);
+
+ var (tolerantDiagnostics, tolerantImageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options { ErrorTolerant = true },
+ resourceLocator: alias =>
+ {
+ Assert.Equal("MissingAlias", alias);
+ return null!;
+ });
+
+ var tolerantDiagnostic = Assert.Single(tolerantDiagnostics.Where(d => d.Id == DiagnosticIds.FileNotFound));
+ Assert.Equal(DiagnosticSeverity.Error, tolerantDiagnostic.Severity);
+ Assert.False(tolerantImageBytes.IsDefault);
+
+ using var pe = new PEReader(tolerantImageBytes);
+ var reader = pe.GetMetadataReader();
+ var resource = reader.GetManifestResource(Assert.Single(reader.ManifestResources));
+
+ Assert.Equal("Missing.Resource", reader.GetString(resource.Name));
+ Assert.True(resource.Implementation.IsNil);
+ Assert.Equal(0u, resource.Offset);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.ResourcesDirectory.Size);
+ }
+
+ [Fact]
+ public void DeterministicOption_WithEmbeddedManifestResource_ProducesValidResourceImage()
+ {
+ string source = """
+ .assembly test { }
+ .mresource public Stable.Resource as StableAlias
+ {
+ }
+ .class public auto ansi beforefieldinit Test
+ {
+ }
+ """;
+ byte[] expectedResourceBytes = [0x01, 0x23, 0x45, 0x67];
+
+ var (firstDiagnostics, firstImageBytes) = CompileAndGetImageBytes(
+ source,
+ new Options { Deterministic = true },
+ resourceLocator: alias =>
+ {
+ Assert.Equal("StableAlias", alias);
+ return expectedResourceBytes;
+ });
+ Assert.Empty(firstDiagnostics);
+ Assert.False(firstImageBytes.IsDefault);
+
+ using var firstPe = new PEReader(firstImageBytes);
+ var firstReader = firstPe.GetMetadataReader();
+ var firstResource = firstReader.GetManifestResource(Assert.Single(firstReader.ManifestResources));
+
+ Assert.NotEqual(Guid.Empty, firstReader.GetGuid(firstReader.GetModuleDefinition().Mvid));
+ Assert.Equal("Stable.Resource", firstReader.GetString(firstResource.Name));
+ Assert.Equal(expectedResourceBytes, ReadEmbeddedResource(firstPe, firstResource));
+ }
+
+ [Fact]
+ public void FileBackedManifestResource_EmitsFileImplementationOffsetAndCustomAttribute()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .file nometadata Data.resources .hash = (01 02 03 04)
+ .mresource public File.Resource
+ {
+ .file Data.resources at 12
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var resourceHandle = Assert.Single(reader.ManifestResources);
+ var resource = reader.GetManifestResource(resourceHandle);
+
+ Assert.Equal("File.Resource", reader.GetString(resource.Name));
+ Assert.Equal(ManifestResourceAttributes.Public, resource.Attributes);
+ Assert.Equal(12u, resource.Offset);
+ Assert.Equal(HandleKind.AssemblyFile, resource.Implementation.Kind);
+
+ var file = reader.GetAssemblyFile((AssemblyFileHandle)resource.Implementation);
+ Assert.Equal("Data.resources", reader.GetString(file.Name));
+ Assert.False(file.ContainsMetadata);
+ Assert.Equal([0x01, 0x02, 0x03, 0x04], reader.GetBlobBytes(file.HashValue));
+
+ var attribute = reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(resourceHandle)));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
+ private static (ImmutableArray Diagnostics, ImmutableArray ImageBytes) CompileAndGetImageBytes(
+ string source,
+ Options options,
+ Func? includedDocumentLoader = null,
+ Func? resourceLocator = null)
+ {
+ return CompileAndGetImageBytes(
+ ImmutableArray.Create(new SourceText(source, "test.il")),
+ options,
+ includedDocumentLoader,
+ resourceLocator);
+ }
+
+ private static (ImmutableArray Diagnostics, ImmutableArray ImageBytes) CompileAndGetImageBytes(
+ ImmutableArray documents,
+ Options options,
+ Func? includedDocumentLoader = null,
+ Func? resourceLocator = null)
+ {
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ includedDocumentLoader ?? (_ => throw new InvalidOperationException("Unexpected include")),
+ resourceLocator ?? (_ => throw new InvalidOperationException("Unexpected resource")),
+ options);
+
+ if (image is null)
+ {
+ return (diagnostics, default);
+ }
+
+ var blobBuilder = new BlobBuilder();
+ image.Serialize(blobBuilder);
+ return (diagnostics, blobBuilder.ToImmutableArray());
+ }
+
+ private static byte[] ReadEmbeddedResource(PEReader pe, ManifestResource resource)
+ {
+ Assert.True(resource.Implementation.IsNil);
+
+ int resourcesRva = pe.PEHeaders.CorHeader!.ResourcesDirectory.RelativeVirtualAddress;
+ Assert.NotEqual(0, resourcesRva);
+
+ var resourceBlob = pe.GetSectionData(resourcesRva).GetContent();
+ int offset = checked((int)resource.Offset);
+ int length = BinaryPrimitives.ReadInt32LittleEndian(resourceBlob.AsSpan(offset, sizeof(int)));
+ return resourceBlob.AsSpan(offset + sizeof(int), length).ToArray();
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs
index e7fe59d280196d..b320be18e2ac02 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/MemberReferenceTests.cs
@@ -1,18 +1,11 @@
// 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.Buffers.Binary;
-using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
-using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
-using System.Reflection.PortableExecutable;
-using System.Text;
-using System.Threading.Tasks;
using Internal.IL;
using Xunit;
using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
@@ -21,5 +14,419 @@ namespace ILAssembler.Tests
{
public class MemberReferenceTests
{
+ [Fact]
+ public void UnqualifiedGlobalMethodReference_ResolvesToMethodDefinition()
+ {
+ string source = """
+ .assembly test { }
+ .method public static int32 Helper() cil managed
+ {
+ ldc.i4.s 100
+ ret
+ }
+ .class public auto ansi Program
+ {
+ .method public static int32 Main() cil managed
+ {
+ call int32 Helper()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Main", ILOpcode.call);
+ EntityHandle handle = MetadataTokens.EntityHandle(token);
+
+ Assert.Equal(HandleKind.MethodDefinition, handle.Kind);
+ Assert.Equal("Helper", reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)handle).Name));
+ }
+
+ [Fact]
+ public void UnqualifiedGlobalFieldReference_ResolvesToFieldDefinition()
+ {
+ string source = """
+ .assembly test { }
+ .field public static int32 Value
+ .class public auto ansi Program
+ {
+ .method public static void Main() cil managed
+ {
+ ldsfld int32 Value
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Main", ILOpcode.ldsfld);
+
+ DocumentCompilerTestHelpers.AssertFieldDefToken(reader, token, "Value");
+ }
+
+ [Fact]
+ public void PrivateScopeDisplaySuffix_IsNotStoredInMemberNames()
+ {
+ string source = """
+ .assembly test { }
+ .field privatescope static int32 'Value$PST04000001'
+ .method privatescope static void 'Helper$PST06000001'() cil managed
+ {
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var method = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle(1));
+
+ Assert.Equal("Value", reader.GetString(field.Name));
+ Assert.Equal("Helper", reader.GetString(method.Name));
+ }
+
+ [Fact]
+ public void PrivateScopeDisplaySuffix_DisambiguatesMethodReferences()
+ {
+ string source = """
+ .assembly test { }
+ .method privatescope static void 'Helper$PST06000001'() cil managed
+ {
+ ret
+ }
+ .method privatescope static void 'Helper$PST06000002'() cil managed
+ {
+ ret
+ }
+ .method public static void Caller() cil managed
+ {
+ call void 'Helper$PST06000002'()
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Caller", ILOpcode.call);
+
+ Assert.Equal(MetadataTokens.GetToken(MetadataTokens.MethodDefinitionHandle(2)), token);
+ Assert.All(reader.MethodDefinitions.Take(2), handle => Assert.Equal("Helper", reader.GetString(reader.GetMethodDefinition(handle).Name)));
+ }
+
+ [Fact]
+ public void NonPrivateScopeMember_PreservesPrivateScopeLikeSuffix()
+ {
+ string source = """
+ .assembly test { }
+ .field public static int32 'Value$PST04000001'
+ .method public static void 'Helper$PST06000001'() cil managed
+ {
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(MetadataTokens.FieldDefinitionHandle(1));
+ var method = reader.GetMethodDefinition(MetadataTokens.MethodDefinitionHandle(1));
+
+ Assert.Equal("Value$PST04000001", reader.GetString(field.Name));
+ Assert.Equal("Helper$PST06000001", reader.GetString(method.Name));
+ }
+
+ [Fact]
+ public void PrivateScopeVarArgReference_PreservesExplicitThisAndStripsDisplaySuffix()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method privatescope explicit instance vararg void 'Helper$PST06000001'(int32 'value') cil managed
+ {
+ ret
+ }
+ .method public static void Caller() cil managed
+ {
+ ldnull
+ ldc.i4.0
+ ldstr ""
+ call explicit instance vararg void Test::'Helper$PST06000001'(int32, ..., string)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var memberReference = reader.GetMemberReference(Assert.Single(reader.MemberReferences));
+
+ Assert.Equal(HandleKind.MethodDefinition, memberReference.Parent.Kind);
+ Assert.Equal("Helper", reader.GetString(memberReference.Name));
+ Assert.Equal(0x65, reader.GetBlobBytes(memberReference.Signature)[0]);
+ }
+
+ [Fact]
+ public void ExternalVarArgReference_DoesNotShiftLaterMemberReferenceTokens()
+ {
+ string source = """
+ .assembly extern External { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void VarArgCaller() cil managed
+ {
+ ldc.i4.0
+ ldstr ""
+ call vararg void [External]ExternalType::VarArg(int32, ..., string)
+ ret
+ }
+ .method public static void NormalCaller() cil managed
+ {
+ call void [External]ExternalType::Normal()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int varArgToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "VarArgCaller", ILOpcode.call);
+ int normalToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "NormalCaller", ILOpcode.call);
+
+ Assert.Equal("VarArg", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)MetadataTokens.EntityHandle(varArgToken)).Name));
+ Assert.Equal("Normal", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)MetadataTokens.EntityHandle(normalToken)).Name));
+ Assert.Equal(2, reader.GetTableRowCount(TableIndex.MemberRef));
+ }
+
+ [Fact]
+ public void LocalVarargCallSite_WithLocalOptionalType_EmitsSentinelMemberRefSignature()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Payload extends [mscorlib]System.Object
+ {
+ }
+ .class public auto ansi beforefieldinit Printer extends [mscorlib]System.Object
+ {
+ .method public static vararg void Print(string format) cil managed
+ {
+ ret
+ }
+
+ .method public static void Caller() cil managed
+ {
+ ldstr "payload"
+ ldnull
+ call vararg void Printer::Print(string, ..., class [test]Payload)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ Assert.Equal("Print", reader.GetString(memberRef.Name));
+ Assert.Equal(HandleKind.MethodDefinition, memberRef.Parent.Kind);
+
+ // The optional vararg parameter is carried by the MemberRef signature only.
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.Param));
+
+ MethodSignature signature =
+ memberRef.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.Equal(SignatureCallingConvention.VarArgs, signature.Header.CallingConvention);
+ Assert.Equal(1, signature.RequiredParameterCount);
+ Assert.Equal("void", signature.ReturnType);
+ Assert.Equal(new[] { "string", "Payload" }, signature.ParameterTypes);
+
+ int callToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Caller", ILOpcode.call);
+ Assert.Equal(MetadataTokens.GetToken(memberRefHandle), callToken);
+ }
+
+ [Fact]
+ public void FieldReference_OnLocalGenericInstantiation_UsesTypeSpecParent()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Box`1 extends [mscorlib]System.Object
+ {
+ .field public !0 Value
+ }
+ .class public auto ansi beforefieldinit Caller extends [mscorlib]System.Object
+ {
+ .method public static int32 Read(class Box`1 boxInstance) cil managed
+ {
+ ldarg.0
+ ldfld int32 class Box`1::Value
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ Assert.Equal("Value", reader.GetString(memberRef.Name));
+ Assert.Equal(HandleKind.TypeSpecification, memberRef.Parent.Kind);
+ Assert.Equal(
+ "int32",
+ memberRef.DecodeFieldSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ var parentTypeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)memberRef.Parent);
+ Assert.Equal(
+ "Box`1",
+ parentTypeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ int fieldToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Read", ILOpcode.ldfld);
+ Assert.Equal(MetadataTokens.GetToken(memberRefHandle), fieldToken);
+ }
+
+ [Fact]
+ public void MethodReference_OnLocalGenericInstantiation_UsesTypeSpecParent()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Box`1 extends [mscorlib]System.Object
+ {
+ .method public hidebysig instance void Touch() cil managed
+ {
+ ret
+ }
+ }
+ .class public auto ansi beforefieldinit Caller extends [mscorlib]System.Object
+ {
+ .method public static void Invoke(class Box`1 boxInstance) cil managed
+ {
+ ldarg.0
+ call instance void class Box`1::Touch()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ Assert.Equal("Touch", reader.GetString(memberRef.Name));
+ Assert.Equal(HandleKind.TypeSpecification, memberRef.Parent.Kind);
+
+ MethodSignature signature =
+ memberRef.DecodeMethodSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+ Assert.True(signature.Header.IsInstance);
+ Assert.Equal("void", signature.ReturnType);
+ Assert.Empty(signature.ParameterTypes);
+
+ var parentTypeSpec = reader.GetTypeSpecification((TypeSpecificationHandle)memberRef.Parent);
+ Assert.Equal(
+ "Box`1",
+ parentTypeSpec.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+
+ int callToken = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Invoke", ILOpcode.call);
+ Assert.Equal(MetadataTokens.GetToken(memberRefHandle), callToken);
+ }
+
+ [Fact]
+ public void MethodReferenceForms_EmitResolvableCallTokensAndMethodSpecification()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .typedef method void Test::Target() as TargetAlias
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Target() cil managed
+ {
+ ret
+ }
+
+ .method public static void GenericTarget() cil managed
+ {
+ ret
+ }
+
+ .method public static void Caller() cil managed
+ {
+ call void Target()
+ call void Test::GenericTarget<[1]>()
+ call void Test::GenericTarget()
+ call mdtoken(0x06000001)
+ call TargetAlias
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ ImmutableArray callTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "Caller", ILOpcode.call);
+
+ Assert.Equal(5, callTokens.Length);
+ Assert.Equal("Target", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[0])));
+ Assert.Equal("GenericTarget", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[1])));
+ Assert.Equal(HandleKind.MethodSpecification, MetadataTokens.EntityHandle(callTokens[2]).Kind);
+ Assert.Equal("Target", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[3])));
+ Assert.Equal("Target", GetMethodName(reader, MetadataTokens.EntityHandle(callTokens[4])));
+
+ var methodSpecification = reader.GetMethodSpecification(
+ (MethodSpecificationHandle)MetadataTokens.EntityHandle(callTokens[2]));
+ Assert.Equal(
+ new[] { "int32" },
+ methodSpecification.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void ExternalFieldReference_EmitsMemberRefFieldSignature()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Reader extends [mscorlib]System.Object
+ {
+ .method public static string GetEmpty() cil managed
+ {
+ ldsfld string [mscorlib]System.String::Empty
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var memberRefHandle = Assert.Single(reader.MemberReferences);
+ var memberRef = reader.GetMemberReference(memberRefHandle);
+ var parent = reader.GetTypeReference((TypeReferenceHandle)memberRef.Parent);
+
+ Assert.Equal("Empty", reader.GetString(memberRef.Name));
+ Assert.Equal("String", reader.GetString(parent.Name));
+ Assert.Equal(
+ "string",
+ memberRef.DecodeFieldSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ private static string GetMethodName(MetadataReader reader, EntityHandle handle)
+ {
+ return handle.Kind switch
+ {
+ HandleKind.MethodDefinition =>
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)handle).Name),
+ HandleKind.MemberReference =>
+ reader.GetString(reader.GetMemberReference((MemberReferenceHandle)handle).Name),
+ _ => throw new InvalidOperationException($"Unexpected method handle kind {handle.Kind}."),
+ };
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs
index 0490d709aaf742..900af3c5c59d44 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/MethodTests.cs
@@ -96,6 +96,144 @@ .method public static vararg void VarargMethod(int32 x) cil managed
Assert.Equal(0x5, header & 0x0F);
}
+ [Fact]
+ public void MethodAndImplementationAttributes_EmitExpectedFlags()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public abstract auto ansi Test extends [mscorlib]System.Object
+ {
+ .method private static void PrivateMethod() cil managed { ret }
+ .method family static void FamilyMethod() cil managed { ret }
+ .method assembly static void AssemblyMethod() cil managed { ret }
+ .method famandassem static void FamAndAssemMethod() cil managed { ret }
+ .method famorassem static void FamOrAssemMethod() cil managed { ret }
+ .method privatescope static void PrivateScopeMethod() cil managed { ret }
+ .method public virtual strict instance void StrictMethod() cil managed { ret }
+ .method public static unmanagedexp void UnmanagedExportMethod() cil managed { ret }
+ .method public static reqsecobj void RequireSecurityObjectMethod() cil managed { ret }
+ .method flags(0x16) void FlaggedMethod() cil managed { ret }
+
+ .method public static void NativeMethod() native unmanaged { }
+ .method public static void OptilMethod() optil managed { }
+ .method public static void RuntimeMethod() runtime managed internalcall { }
+ .method public static void ForwardMethod() cil managed forwardref preservesig synchronized noinlining aggressiveinlining nooptimization aggressiveoptimization async { }
+ .method public static void FlaggedImplMethod() flags(0x1000) { }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var methods = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .ToDictionary(method => reader.GetString(method.Name));
+
+ Assert.Equal(MethodAttributes.Private, methods["PrivateMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.Family, methods["FamilyMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.Assembly, methods["AssemblyMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.FamANDAssem, methods["FamAndAssemMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.FamORAssem, methods["FamOrAssemMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.Equal(MethodAttributes.PrivateScope, methods["PrivateScopeMethod"].Attributes & MethodAttributes.MemberAccessMask);
+ Assert.True(methods["StrictMethod"].Attributes.HasFlag(MethodAttributes.CheckAccessOnOverride));
+ Assert.True(methods["UnmanagedExportMethod"].Attributes.HasFlag(MethodAttributes.UnmanagedExport));
+ Assert.True(methods["RequireSecurityObjectMethod"].Attributes.HasFlag(MethodAttributes.RequireSecObject));
+ Assert.Equal((MethodAttributes)0x16, methods["FlaggedMethod"].Attributes);
+
+ Assert.Equal(
+ MethodImplAttributes.Native | MethodImplAttributes.Unmanaged,
+ methods["NativeMethod"].ImplAttributes & (MethodImplAttributes.CodeTypeMask | MethodImplAttributes.ManagedMask));
+ Assert.Equal(MethodImplAttributes.OPTIL, methods["OptilMethod"].ImplAttributes & MethodImplAttributes.CodeTypeMask);
+ Assert.Equal(MethodImplAttributes.Runtime, methods["RuntimeMethod"].ImplAttributes & MethodImplAttributes.CodeTypeMask);
+ Assert.True(methods["RuntimeMethod"].ImplAttributes.HasFlag(MethodImplAttributes.InternalCall));
+
+ MethodImplAttributes forwardFlags = methods["ForwardMethod"].ImplAttributes;
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.ForwardRef));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.PreserveSig));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.Synchronized));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.NoInlining));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.AggressiveInlining));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.NoOptimization));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.AggressiveOptimization));
+ Assert.True(forwardFlags.HasFlag(MethodImplAttributes.Async));
+ Assert.Equal((MethodImplAttributes)0x1000, methods["FlaggedImplMethod"].ImplAttributes);
+ }
+
+ [Fact]
+ public void MethodBodyDirectives_EmitRawInstructionLocalsInitializationAndMappedData()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public explicit ansi sealed DataHolder extends [mscorlib]System.ValueType
+ {
+ .size 4
+ .field [0] public static int32 Value at MethodData
+ .method public static void M() cil managed
+ {
+ .maxstack 1
+ .zeroinit
+ .locals (int32 local)
+ .emitbyte 0x00
+ {
+ nop
+ }
+ .data MethodData = int32(42)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var type = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "DataHolder");
+ var method = type.GetMethods()
+ .Select(reader.GetMethodDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "M");
+ var field = reader.GetFieldDefinition(Assert.Single(type.GetFields()));
+ var body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.Equal([0x00, 0x00, 0x2A], body.GetILBytes());
+ Assert.True(body.LocalVariablesInitialized);
+ Assert.Equal(
+ new[] { "int32" },
+ reader.GetStandaloneSignature(body.LocalSignature)
+ .DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ Assert.Equal(
+ 42,
+ BitConverter.ToInt32(
+ pe.GetSectionData(field.GetRelativeVirtualAddress()).GetContent().AsSpan(0, sizeof(int))));
+ }
+
+ [Fact]
+ public void EntryPointMethod_SetsCorHeaderEntryPointToken()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Program extends [mscorlib]System.Object
+ {
+ .method public static int32 Main() cil managed
+ {
+ .entrypoint
+ ldc.i4.0
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var mainHandle = reader.MethodDefinitions
+ .First(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "Main");
+
+ Assert.Equal(
+ MetadataTokens.GetToken(mainHandle),
+ pe.PEHeaders.CorHeader!.EntryPointTokenOrRelativeVirtualAddress);
+ }
+
[Fact]
public void ArrayType_InMethodSignature_ParsedCorrectly()
@@ -195,6 +333,159 @@ .method public hidebysig newslot virtual instance object GetVal(string& res) cil
Assert.Equal(1, methodImplCount);
}
+ [Theory]
+ [InlineData(".override method instance int32 [External]IFoo::M(string) with method instance int32 Bar::Impl(string)")]
+ [InlineData(".override [External]IFoo::M with instance int32 Bar::Impl(string)")]
+ public void ClassScopeOverride_EmitsMethodImpl(string overrideDirective)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly extern External { }
+ .assembly TestOverride { }
+ .class public auto ansi beforefieldinit Bar extends [mscorlib]System.Object implements [External]IFoo
+ {
+ {{overrideDirective}}
+ .method public hidebysig newslot virtual final instance int32 Impl(string 'value') cil managed
+ {
+ ldc.i4.s 42
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var bar = reader.TypeDefinitions
+ .Select(handle => (Handle: handle, Definition: reader.GetTypeDefinition(handle)))
+ .Single(type => reader.GetString(type.Definition.Name) == "Bar");
+ var implementation = reader.GetMethodImplementation(Assert.Single(bar.Definition.GetMethodImplementations()));
+
+ Assert.Equal(HandleKind.MethodDefinition, implementation.MethodBody.Kind);
+ Assert.Equal("Impl", reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)implementation.MethodBody).Name));
+ Assert.Equal("M", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)implementation.MethodDeclaration).Name));
+ }
+
+ [Fact]
+ public void ClassScopeShortOverride_EmitsDeclarationMemberRefFirst()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External { }
+ .assembly TestOverride { }
+ .class public auto ansi Bar extends [mscorlib]System.Object
+ {
+ .override [External]IFoo::M with instance int32 [External]Body::Impl(string)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var bar = reader.TypeDefinitions
+ .Select(handle => reader.GetTypeDefinition(handle))
+ .Single(type => reader.GetString(type.Name) == "Bar");
+ var implementation = reader.GetMethodImplementation(Assert.Single(bar.GetMethodImplementations()));
+
+ Assert.Equal(HandleKind.MemberReference, implementation.MethodDeclaration.Kind);
+ Assert.Equal(HandleKind.MemberReference, implementation.MethodBody.Kind);
+ Assert.True(
+ MetadataTokens.GetRowNumber((MemberReferenceHandle)implementation.MethodDeclaration)
+ < MetadataTokens.GetRowNumber((MemberReferenceHandle)implementation.MethodBody));
+ Assert.Equal("M", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)implementation.MethodDeclaration).Name));
+ Assert.Equal("Impl", reader.GetString(reader.GetMemberReference((MemberReferenceHandle)implementation.MethodBody).Name));
+ }
+
+ [Fact]
+ public void DeferredClassOverride_RemainsOwnedByOuterTypeAcrossNestedType()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly extern External { }
+ .assembly TestOverride { }
+ .class public auto ansi Outer extends [mscorlib]System.Object
+ {
+ .override [External]IFoo::M with instance int32 Outer::Impl(string)
+ .class nested public auto ansi Inner extends [mscorlib]System.Object
+ {
+ .method public instance int32 Impl(string 'value') cil managed
+ {
+ ldc.i4.0
+ ret
+ }
+ }
+ .method public instance int32 Impl(string 'value') cil managed
+ {
+ ldc.i4.1
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .ToDictionary(
+ handle => reader.GetString(reader.GetTypeDefinition(handle).Name),
+ handle => (Handle: handle, Definition: reader.GetTypeDefinition(handle)));
+
+ var implementation = reader.GetMethodImplementation(
+ Assert.Single(types["Outer"].Definition.GetMethodImplementations()));
+ Assert.Empty(types["Inner"].Definition.GetMethodImplementations());
+ Assert.Equal(HandleKind.MethodDefinition, implementation.MethodBody.Kind);
+ Assert.Equal(
+ types["Outer"].Handle,
+ reader.GetMethodDefinition((MethodDefinitionHandle)implementation.MethodBody).GetDeclaringType());
+ }
+
+ [Fact]
+ public void TruncatedNestedMethodHeader_DoesNotLeakMemberStateToFollowingDocument()
+ {
+ string malformedSource = """
+ .assembly extern mscorlib { }
+ .assembly malformed { }
+ .class public auto ansi Outer extends [mscorlib]System.Object
+ {
+ .class nested public auto ansi Inner extends [mscorlib]System.Object
+ {
+ .method public static void Broken(int32 'value'
+ """;
+ string validSource = """
+ .assembly extern mscorlib { }
+ .assembly valid { }
+ .class public auto ansi Following extends [mscorlib]System.Object
+ {
+ .method public static void Good() cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (malformedDiagnostics, _) = compiler.Compile(
+ new SourceText(malformedSource, "malformed.il"),
+ _ => default!,
+ _ => default!,
+ new Options { ErrorTolerant = true });
+ var (validDiagnostics, result) = compiler.Compile(
+ new SourceText(validSource, "valid.il"),
+ _ => default!,
+ _ => default!,
+ new Options());
+
+ Assert.Contains(malformedDiagnostics, diagnostic => diagnostic.Id == "Parser");
+ Assert.Empty(validDiagnostics);
+ Assert.NotNull(result);
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var followingType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Following");
+ MethodDefinitionHandle goodMethod = Assert.Single(followingType.GetMethods());
+ Assert.Equal("Good", reader.GetString(reader.GetMethodDefinition(goodMethod).Name));
+ }
+
[Fact]
public void MultipleOverrides_EmitsAllMethodImpls()
@@ -241,6 +532,118 @@ .method public hidebysig newslot virtual instance object Func2(string& res) cil
Assert.Equal(2, methodImplCount);
}
+ [Fact]
+ public void ClassLevelOverrideForms_EmitMethodImplementations()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Base extends [mscorlib]System.Object
+ {
+ .method public virtual instance void M() cil managed { ret }
+ .method public virtual instance void G() cil managed { ret }
+ }
+ .class public auto ansi Derived extends Base
+ {
+ .method public virtual instance void BodyM() cil managed { ret }
+ .method public virtual instance void BodyG() cil managed { ret }
+
+ .override Base::M with instance void Derived::BodyM()
+ .override method instance void Base::G<[1]>() with method instance void Derived::BodyG<[1]>()
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var derived = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "Derived");
+ var implementations = derived.GetMethodImplementations()
+ .Select(reader.GetMethodImplementation)
+ .ToArray();
+
+ Assert.Equal(2, implementations.Length);
+ Assert.Equal(
+ new[] { "BodyG", "BodyM" },
+ implementations
+ .Select(implementation =>
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)implementation.MethodBody).Name))
+ .OrderBy(name => name));
+
+ var declarations = implementations
+ .Select(implementation => implementation.MethodDeclaration)
+ .ToDictionary(handle => GetMethodName(reader, handle));
+ Assert.Equal(
+ "void",
+ DecodeMethodSignature(reader, declarations["M"]).ReturnType);
+ MethodSignature genericSignature =
+ DecodeMethodSignature(reader, declarations["G"]);
+ Assert.True(genericSignature.Header.IsGeneric);
+ Assert.Equal(1, genericSignature.GenericParameterCount);
+ }
+
+ [Fact]
+ public void ClassLevelOverrideWithMissingBody_ReportsErrorAndEmitsTypeMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Base extends [mscorlib]System.Object
+ {
+ .method public virtual instance void M() cil managed { ret }
+ }
+ .class public auto ansi Derived extends Base
+ {
+ .override Base::M with instance void Derived::Missing()
+ }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.InvalidMetadataToken);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var derived = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "Derived");
+
+ Assert.Empty(derived.GetMethodImplementations());
+ Assert.Equal("Base", reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)derived.BaseType).Name));
+ }
+
+ private static string GetMethodName(MetadataReader reader, EntityHandle handle) => handle.Kind switch
+ {
+ HandleKind.MethodDefinition =>
+ reader.GetString(reader.GetMethodDefinition((MethodDefinitionHandle)handle).Name),
+ HandleKind.MemberReference =>
+ reader.GetString(reader.GetMemberReference((MemberReferenceHandle)handle).Name),
+ _ => throw new InvalidOperationException($"Unexpected method handle kind {handle.Kind}."),
+ };
+
+ private static MethodSignature DecodeMethodSignature(
+ MetadataReader reader,
+ EntityHandle handle) => handle.Kind switch
+ {
+ HandleKind.MethodDefinition =>
+ reader.GetMethodDefinition((MethodDefinitionHandle)handle).DecodeSignature(
+ DocumentCompilerTestHelpers.Decoder,
+ genericContext: null),
+ HandleKind.MemberReference =>
+ reader.GetMemberReference((MemberReferenceHandle)handle).DecodeMethodSignature(
+ DocumentCompilerTestHelpers.Decoder,
+ genericContext: null),
+ _ => throw new InvalidOperationException($"Unexpected method handle kind {handle.Kind}."),
+ };
+
[Fact]
public void MethodRtSpecialName_Preserved()
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs
index ce7251c02c6ae4..70f4a11e203b75 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ModuleTests.cs
@@ -123,5 +123,131 @@ .class public auto ansi beforefieldinit Test
var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
Assert.Empty(diagnostics);
}
+
+ [Fact]
+ public void FileDeclaration_WithHash_EmitsMetadataFileRow()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .file NetModule.netmodule .hash = (AB CD EF 01)
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var file = reader.GetAssemblyFile(Assert.Single(reader.AssemblyFiles));
+
+ Assert.Equal("NetModule.netmodule", reader.GetString(file.Name));
+ Assert.Equal([0xAB, 0xCD, 0xEF, 0x01], reader.GetBlobBytes(file.HashValue));
+ Assert.True(file.ContainsMetadata);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.EntryPointTokenOrRelativeVirtualAddress);
+ }
+
+ [Fact]
+ public void FileDeclaration_NoMetadata_EmitsResourceFileRow()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .file nometadata DataFile.resources .hash = (FF FE)
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var file = reader.GetAssemblyFile(Assert.Single(reader.AssemblyFiles));
+
+ Assert.Equal("DataFile.resources", reader.GetString(file.Name));
+ Assert.Equal([0xFF, 0xFE], reader.GetBlobBytes(file.HashValue));
+ Assert.False(file.ContainsMetadata);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.EntryPointTokenOrRelativeVirtualAddress);
+ }
+
+ [Fact]
+ public void ModuleExtern_EmitsModuleReference()
+ {
+ string source = """
+ .assembly test { }
+ .module extern Native.netmodule
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.ModuleRef));
+ var moduleReference = reader.GetModuleReference(MetadataTokens.ModuleReferenceHandle(1));
+
+ Assert.Equal("Native.netmodule", reader.GetString(moduleReference.Name));
+ Assert.True(reader.GetModuleDefinition().Name.IsNil);
+ }
+
+ [Fact]
+ public void BareModuleDirective_PreservesDefaultOutputModuleName()
+ {
+ string source = """
+ .assembly test { }
+ .module
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { OutputFileName = "Output.dll" });
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal("Output.dll", reader.GetString(reader.GetModuleDefinition().Name));
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.ModuleRef));
+ }
+
+ [Fact]
+ public void GlobalMethodAndModuleAttribute_EmitModuleMetadataAndPdb()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor()
+ .line 1 "global.cs"
+ .method public static int32 Global() cil managed
+ {
+ .locals init (int32 'value')
+ .line 10
+ ldc.i4.s 42
+ stloc.0
+ ldloc.0
+ ret
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var moduleType = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(1));
+ var globalMethod = reader.GetMethodDefinition(Assert.Single(moduleType.GetMethods()));
+ var body = pe.GetMethodBody(globalMethod.RelativeVirtualAddress);
+
+ Assert.Equal("", reader.GetString(moduleType.Name));
+ Assert.Equal("Global", reader.GetString(globalMethod.Name));
+ Assert.True(body.LocalVariablesInitialized);
+ Assert.Equal(
+ new[] { "int32" },
+ reader.GetStandaloneSignature(body.LocalSignature)
+ .DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ Assert.Equal(42, body.GetILBytes()![1]);
+
+ CustomAttributeValue attribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetModuleDefinition().GetCustomAttributes()))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ Assert.Empty(attribute.FixedArguments);
+ Assert.Empty(attribute.NamedArguments);
+
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ Assert.Contains(
+ "global.cs",
+ pdbReader.GetString(pdbReader.GetDocument(Assert.Single(pdbReader.Documents)).Name));
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/NativeExportTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/NativeExportTests.cs
new file mode 100644
index 00000000000000..28a7d8aac8001f
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/NativeExportTests.cs
@@ -0,0 +1,735 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Buffers.Binary;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Reflection.PortableExecutable;
+using System.Text;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class NativeExportTests
+ {
+ [Fact]
+ public void ExportDirective_WithoutVTableFixup_DoesNotEmitNativeExportArtifacts()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void ExportedMethod() cil managed
+ {
+ .export [1] as MyExport
+ ret
+ }
+ }
+ """;
+
+ using PEReader pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+
+ Assert.False(pe.PEHeaders.SectionHeaders.Any(section => section.Name == ".sdata"));
+
+ DirectoryEntry exportTableDirectory = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ Assert.Equal(0, exportTableDirectory.RelativeVirtualAddress);
+ Assert.Equal(0, exportTableDirectory.Size);
+ }
+
+ [Fact]
+ public void VTableFixupAndExport_UseDeclaredWritableDataAndExecutableStubs()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0) int32(0)
+ .data VTReference = &(VT)
+ .vtfixup [2] int32 fromunmanaged at VT
+ .field public static int32 VTStorage at VT
+ .field public static int32 VTReferenceStorage at VTReference
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Zed() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as Zed
+ ret
+ }
+
+ .method public static void Alpha() cil managed
+ {
+ .vtentry 1 : 2
+ .export [3] as Alpha
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var sdataSection = pe.PEHeaders.SectionHeaders.Single(section => section.Name == ".sdata");
+ var textSection = pe.PEHeaders.SectionHeaders.Single(section => section.Name == ".text");
+ DirectoryEntry vtableFixups = pe.PEHeaders.CorHeader!.VtableFixupsDirectory;
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+
+ Assert.Equal(sdataSection.VirtualAddress, vtableFixups.RelativeVirtualAddress);
+ Assert.Equal(8, vtableFixups.Size);
+ Assert.True(sdataSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemRead));
+ Assert.True(sdataSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemWrite));
+ Assert.True(sdataSection.SectionCharacteristics.HasFlag(SectionCharacteristics.ContainsInitializedData));
+ Assert.False(sdataSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemExecute));
+ Assert.False(sdataSection.SectionCharacteristics.HasFlag(SectionCharacteristics.ContainsCode));
+ Assert.True(textSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemRead));
+ Assert.True(textSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemExecute));
+ Assert.True(textSection.SectionCharacteristics.HasFlag(SectionCharacteristics.ContainsCode));
+ Assert.False(textSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemWrite));
+ Assert.NotEqual(0, exports.RelativeVirtualAddress);
+ Assert.True(exports.Size > 0);
+ Assert.Equal(".sdata", GetContainingSection(pe, exports.RelativeVirtualAddress).Name);
+
+ MetadataReader reader = pe.GetMetadataReader();
+ var fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+ int vtableDataRva = fields["VTStorage"].GetRelativeVirtualAddress();
+ int referenceDataRva = fields["VTReferenceStorage"].GetRelativeVirtualAddress();
+ Assert.Equal(".sdata", GetContainingSection(pe, vtableDataRva).Name);
+ Assert.Equal(
+ pe.PEHeaders.PEHeader!.ImageBase + (uint)vtableDataRva,
+ ReadUInt32(pe, referenceDataRva));
+ Assert.True(HasBaseRelocation(pe, referenceDataRva, 3));
+ Assert.Equal(vtableDataRva, ReadInt32(pe, vtableFixups.RelativeVirtualAddress));
+ Assert.Equal(2, ReadUInt16(pe, vtableFixups.RelativeVirtualAddress + sizeof(int)));
+
+ int firstMethodToken = ReadInt32(pe, vtableDataRva);
+ int secondMethodToken = ReadInt32(pe, vtableDataRva + sizeof(int));
+ Assert.Equal(HandleKind.MethodDefinition, MetadataTokens.EntityHandle(firstMethodToken).Kind);
+ Assert.Equal(HandleKind.MethodDefinition, MetadataTokens.EntityHandle(secondMethodToken).Kind);
+
+ int dllNameRva = ReadInt32(pe, exports.RelativeVirtualAddress + 12);
+ int baseOrdinal = ReadInt32(pe, exports.RelativeVirtualAddress + 16);
+ int numberOfFunctions = ReadInt32(pe, exports.RelativeVirtualAddress + 20);
+ int numberOfNames = ReadInt32(pe, exports.RelativeVirtualAddress + 24);
+ int addressTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 28);
+ int namePointerTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 32);
+ int ordinalTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 36);
+
+ Assert.Equal(1, baseOrdinal);
+ Assert.Equal(3, numberOfFunctions);
+ Assert.Equal(2, numberOfNames);
+ Assert.Equal("output.dll", ReadAsciiString(pe, dllNameRva));
+ Assert.Equal("Alpha", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva)));
+ Assert.Equal("Zed", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva + 4)));
+ Assert.Equal(2, ReadUInt16(pe, ordinalTableRva));
+ Assert.Equal(0, ReadUInt16(pe, ordinalTableRva + 2));
+ int zedStubRva = ReadInt32(pe, addressTableRva);
+ int alphaStubRva = ReadInt32(pe, addressTableRva + 8);
+ Assert.Equal(".text", GetContainingSection(pe, zedStubRva).Name);
+ Assert.Equal(".text", GetContainingSection(pe, alphaStubRva).Name);
+ Assert.Equal(0, ReadInt32(pe, addressTableRva + 4));
+ }
+
+ [Theory]
+ [InlineData(Machine.I386, "FF25", 2, sizeof(uint), 16, 6, 3)]
+ [InlineData(Machine.Amd64, "48A1", 2, sizeof(ulong), 4, 12, 10)]
+ [InlineData(Machine.Arm64, "90000058100240F900021FD6", 16, sizeof(ulong), 8, 24, 10)]
+ public void ExportStub_TargetMachine_IsExecutableAndRelocatable(
+ Machine machine,
+ string expectedPrefix,
+ int addressOffset,
+ int addressSize,
+ int addressAlignment,
+ int stubSize,
+ int relocationType)
+ {
+ string slotType = addressSize == sizeof(ulong) ? "int64" : "int32";
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = {{slotType}}(0)
+ .vtfixup [1] {{slotType}} fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Exported() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as Exported
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { Machine = machine });
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ int addressTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 28);
+ int stubRva = ReadInt32(pe, addressTableRva);
+ int slotRva = ReadInt32(pe, pe.PEHeaders.CorHeader!.VtableFixupsDirectory.RelativeVirtualAddress);
+ byte[] prefix = Convert.FromHexString(expectedPrefix);
+ var stubSection = GetContainingSection(pe, stubRva);
+
+ Assert.Equal(machine, pe.PEHeaders.CoffHeader.Machine);
+ Assert.NotEqual(0, exports.RelativeVirtualAddress);
+ Assert.Equal(".text", stubSection.Name);
+ Assert.True(stubSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemExecute));
+ Assert.False(stubSection.SectionCharacteristics.HasFlag(SectionCharacteristics.MemWrite));
+ Assert.Equal(0, (stubRva + addressOffset) % addressAlignment);
+ Assert.Equal(stubSize, stubSection.VirtualSize - (stubRva - stubSection.VirtualAddress));
+ Assert.True(pe.PEHeaders.PEHeader.DllCharacteristics.HasFlag(DllCharacteristics.DynamicBase));
+ Assert.True(
+ pe.GetSectionData(stubRva).GetContent().AsSpan(0, prefix.Length).SequenceEqual(prefix));
+
+ ulong expectedAddress = pe.PEHeaders.PEHeader.ImageBase + (uint)slotRva;
+ ulong actualAddress = addressSize == sizeof(ulong)
+ ? ReadUInt64(pe, stubRva + addressOffset)
+ : ReadUInt32(pe, stubRva + addressOffset);
+ Assert.Equal(expectedAddress, actualAddress);
+ Assert.Equal(
+ ".reloc",
+ GetContainingSection(
+ pe,
+ pe.PEHeaders.PEHeader.BaseRelocationTableDirectory.RelativeVirtualAddress).Name);
+ Assert.True(HasBaseRelocation(pe, stubRva + addressOffset, relocationType));
+ }
+
+ [Theory]
+ [InlineData(Machine.I386, "int32", sizeof(uint), 3)]
+ [InlineData(Machine.Amd64, "int64", sizeof(ulong), 10)]
+ public void DataLabelReference_UsesPointerWidthAbsoluteAddressAndRelocation(
+ Machine machine,
+ string pointerType,
+ int pointerSize,
+ int relocationType)
+ {
+ string source = $$"""
+ .assembly test { }
+ .data Target = int32(0x12345678)
+ .data Pointer = &(Target)
+ .class public explicit ansi sealed DataHolder
+ {
+ .field [0] public static int32 TargetField at Target
+ .field [4] public static {{pointerType}} PointerField at Pointer
+ }
+ """;
+
+ using PEReader pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { Machine = machine });
+ MetadataReader reader = pe.GetMetadataReader();
+ var fields = reader.FieldDefinitions
+ .Select(reader.GetFieldDefinition)
+ .ToDictionary(field => reader.GetString(field.Name));
+ int targetRva = fields["TargetField"].GetRelativeVirtualAddress();
+ int pointerRva = fields["PointerField"].GetRelativeVirtualAddress();
+ ulong pointer = pointerSize == sizeof(ulong)
+ ? ReadUInt64(pe, pointerRva)
+ : ReadUInt32(pe, pointerRva);
+
+ Assert.Equal(pe.PEHeaders.PEHeader!.ImageBase + (uint)targetRva, pointer);
+ Assert.True(HasBaseRelocation(pe, pointerRva, relocationType));
+ Assert.False(pe.PEHeaders.CorHeader!.Flags.HasFlag(CorFlags.ILOnly));
+ }
+
+ [Fact]
+ public void DataLabelReference_MissingTarget_ReportsDiagnosticAndOmitsRelocation()
+ {
+ string source = """
+ .assembly test { }
+ .data Pointer = &(Missing)
+ .class public explicit ansi sealed DataHolder
+ {
+ .field [0] public static int32 PointerField at Pointer
+ }
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.LabelNotFound);
+ Assert.Contains("Missing", error.Message);
+
+ MetadataReader reader = pe.GetMetadataReader();
+ FieldDefinition field = reader.GetFieldDefinition(Assert.Single(reader.FieldDefinitions));
+ int pointerRva = field.GetRelativeVirtualAddress();
+ Assert.Equal(0U, ReadUInt32(pe, pointerRva));
+ Assert.False(HasBaseRelocation(pe, pointerRva, 3));
+ Assert.True(pe.PEHeaders.CorHeader!.Flags.HasFlag(CorFlags.ILOnly));
+ }
+ }
+
+ [Theory]
+ [InlineData(Machine.I386, "int64")]
+ [InlineData(Machine.Amd64, "int32")]
+ [InlineData(Machine.Arm64, "int32")]
+ [InlineData(Machine.I386, "int32 int64")]
+ [InlineData(Machine.I386, "")]
+ public void VTableFixup_InvalidWidthForTarget_ReportsDiagnostic(
+ Machine machine,
+ string widthAttributes)
+ {
+ string source = $$"""
+ .assembly test { }
+ .data VT = int64(0)
+ .vtfixup [1] {{widthAttributes}} fromunmanaged at VT
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) =
+ CompileErrorTolerant(source, new Options { Machine = machine });
+ using (pe)
+ {
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.InvalidVTableWidth);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.VtableFixupsDirectory.RelativeVirtualAddress);
+ }
+ }
+
+ [Theory]
+ [InlineData(2, 1, "invalid VTable entry")]
+ [InlineData(1, 2, "invalid VTable slot")]
+ public void VTableEntry_InvalidAssociationWithoutExport_ReportsDiagnostic(
+ int vtableEntry,
+ int vtableSlot,
+ string expectedMessage)
+ {
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0)
+ .vtfixup [1] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Method() cil managed
+ {
+ .vtentry {{vtableEntry}} : {{vtableSlot}}
+ ret
+ }
+ }
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.InvalidVTableEntry);
+ Assert.Contains(expectedMessage, error.Message);
+ int slotRva = ReadInt32(
+ pe,
+ pe.PEHeaders.CorHeader!.VtableFixupsDirectory.RelativeVirtualAddress);
+ Assert.Equal(0, ReadInt32(pe, slotRva));
+ }
+ }
+
+ [Fact]
+ public void Export_DuplicateOrdinalForDifferentTargets_ReportsDiagnosticAndOmitsDuplicate()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0) int32(0)
+ .vtfixup [2] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void First() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as First
+ ret
+ }
+ .method public static void Second() cil managed
+ {
+ .vtentry 1 : 2
+ .export [1] as Second
+ ret
+ }
+ }
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.DuplicateExportOrdinal);
+ Assert.Contains("Second", error.Message);
+
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 20));
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 24));
+ int namePointerTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 32);
+ Assert.Equal("First", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva)));
+ }
+ }
+
+ [Fact]
+ public void Export_DuplicateOrdinalForSameTarget_AllowsAliases()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0)
+ .vtfixup [1] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void First() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as FirstAlias
+ ret
+ }
+ .method public static void Second() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as SecondAlias
+ ret
+ }
+ }
+ """;
+
+ using PEReader pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ int addressTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 28);
+ int namePointerTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 32);
+ int ordinalTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 36);
+
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 20));
+ Assert.Equal(2, ReadInt32(pe, exports.RelativeVirtualAddress + 24));
+ Assert.NotEqual(0, ReadInt32(pe, addressTableRva));
+ Assert.Equal("FirstAlias", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva)));
+ Assert.Equal(
+ "SecondAlias",
+ ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva + sizeof(int))));
+ Assert.Equal(0, ReadUInt16(pe, ordinalTableRva));
+ Assert.Equal(0, ReadUInt16(pe, ordinalTableRva + sizeof(ushort)));
+ }
+
+ [Theory]
+ [InlineData(0)]
+ [InlineData(-1)]
+ [InlineData(int.MinValue)]
+ public void ExportOrdinal_NonPositive_ReportsDiagnosticAndOmitsExport(int ordinal)
+ {
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0)
+ .vtfixup [1] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Exported() cil managed
+ {
+ .vtentry 1 : 1
+ .export [{{ordinal}}] as InvalidOrdinal
+ ret
+ }
+ }
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.InvalidExportOrdinal);
+ Assert.Contains(ordinal.ToString(), error.Message);
+ Assert.Equal(0, pe.PEHeaders.PEHeader!.ExportTableDirectory.RelativeVirtualAddress);
+ }
+ }
+
+ [Fact]
+ public void ExportOrdinal_ExtremeSparseRange_ReportsDiagnosticAndOmitsInvalidExport()
+ {
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0) int32(0)
+ .vtfixup [2] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Low() cil managed
+ {
+ .vtentry 1 : 1
+ .export [1] as Low
+ ret
+ }
+ .method public static void High() cil managed
+ {
+ .vtentry 1 : 2
+ .export [{{int.MaxValue}}] as InvalidHigh
+ ret
+ }
+ }
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.ExportOrdinalRangeTooLarge);
+ Assert.Contains(int.MaxValue.ToString(), error.Message);
+
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ Assert.NotEqual(0, exports.RelativeVirtualAddress);
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 16));
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 20));
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 24));
+ int namePointerTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 32);
+ Assert.Equal("Low", ReadAsciiString(pe, ReadInt32(pe, namePointerTableRva)));
+ }
+ }
+
+ [Fact]
+ public void ExportOrdinal_MaxValueAsBase_EmitsSingleEntry()
+ {
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0)
+ .vtfixup [1] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Exported() cil managed
+ {
+ .vtentry 1 : 1
+ .export [{{int.MaxValue}}] as Exported
+ ret
+ }
+ }
+ """;
+
+ using PEReader pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+
+ Assert.Equal(int.MaxValue, ReadInt32(pe, exports.RelativeVirtualAddress + 16));
+ Assert.Equal(1, ReadInt32(pe, exports.RelativeVirtualAddress + 20));
+ Assert.Equal(0, ReadUInt16(pe, ReadInt32(pe, exports.RelativeVirtualAddress + 36)));
+ }
+
+ [Fact]
+ public void ExportOrdinal_MaximumWordIndex_PreservesSparseExports()
+ {
+ const int BaseOrdinal = 100000;
+ const int MaximumOrdinal = BaseOrdinal + ushort.MaxValue;
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0) int32(0)
+ .vtfixup [2] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void First() cil managed
+ {
+ .vtentry 1 : 1
+ .export [{{BaseOrdinal}}] as First
+ ret
+ }
+ .method public static void Last() cil managed
+ {
+ .vtentry 1 : 2
+ .export [{{MaximumOrdinal}}] as Last
+ ret
+ }
+ }
+ """;
+
+ using PEReader pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ DirectoryEntry exports = pe.PEHeaders.PEHeader!.ExportTableDirectory;
+ int ordinalTableRva = ReadInt32(pe, exports.RelativeVirtualAddress + 36);
+
+ Assert.Equal(BaseOrdinal, ReadInt32(pe, exports.RelativeVirtualAddress + 16));
+ Assert.Equal(ushort.MaxValue + 1, ReadInt32(pe, exports.RelativeVirtualAddress + 20));
+ Assert.Equal(0, ReadUInt16(pe, ordinalTableRva));
+ Assert.Equal(ushort.MaxValue, ReadUInt16(pe, ordinalTableRva + sizeof(ushort)));
+ }
+
+ [Theory]
+ [InlineData(2, 1, "invalid VTable entry")]
+ [InlineData(1, 2, "invalid VTable slot")]
+ public void Export_InvalidVTableReference_ReportsDiagnosticAndOmitsExport(
+ int vtableEntry,
+ int vtableSlot,
+ string expectedMessage)
+ {
+ string source = $$"""
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .data VT = int32(0)
+ .vtfixup [1] int32 fromunmanaged at VT
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void Exported() cil managed
+ {
+ .vtentry {{vtableEntry}} : {{vtableSlot}}
+ .export [1] as InvalidReference
+ ret
+ }
+ }
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.InvalidVTableEntry);
+ Assert.Contains(expectedMessage, error.Message);
+ Assert.Equal(0, pe.PEHeaders.PEHeader!.ExportTableDirectory.RelativeVirtualAddress);
+ }
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(ushort.MaxValue + 1)]
+ public void VTableFixup_InvalidSlotCount_ReportsDiagnosticAndOmitsFixup(int slotCount)
+ {
+ string source = $$"""
+ .assembly test { }
+ .data VT = int32(0)
+ .vtfixup [{{slotCount}}] int32 fromunmanaged at VT
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.InvalidVTableSlotCount);
+ Assert.Contains(slotCount.ToString(), error.Message);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.VtableFixupsDirectory.RelativeVirtualAddress);
+ }
+ }
+
+ [Fact]
+ public void VTableFixup_MissingDataLabel_ReportsDiagnosticAndOmitsFixup()
+ {
+ string source = """
+ .assembly test { }
+ .vtfixup [1] int32 fromunmanaged at Missing
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.LabelNotFound);
+ Assert.Contains("Missing", error.Message);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.VtableFixupsDirectory.RelativeVirtualAddress);
+ }
+ }
+
+ [Fact]
+ public void VTableFixup_InsufficientDataLabelStorage_ReportsDiagnosticAndOmitsFixup()
+ {
+ string source = """
+ .assembly test { }
+ .data VT = int32(0)
+ .data FollowingData = int32(0)
+ .vtfixup [2] int32 fromunmanaged at VT
+ """;
+
+ (ImmutableArray diagnostics, PEReader pe) = CompileErrorTolerant(source);
+ using (pe)
+ {
+ Diagnostic error = Assert.Single(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.InsufficientVTableData);
+ Assert.Contains("VT", error.Message);
+ Assert.Equal(0, pe.PEHeaders.CorHeader!.VtableFixupsDirectory.RelativeVirtualAddress);
+ }
+ }
+
+ private static int ReadInt32(PEReader pe, int rva) =>
+ BinaryPrimitives.ReadInt32LittleEndian(pe.GetSectionData(rva).GetContent().AsSpan(0, sizeof(int)));
+
+ private static uint ReadUInt32(PEReader pe, int rva) =>
+ BinaryPrimitives.ReadUInt32LittleEndian(pe.GetSectionData(rva).GetContent().AsSpan(0, sizeof(uint)));
+
+ private static ulong ReadUInt64(PEReader pe, int rva) =>
+ BinaryPrimitives.ReadUInt64LittleEndian(pe.GetSectionData(rva).GetContent().AsSpan(0, sizeof(ulong)));
+
+ private static ushort ReadUInt16(PEReader pe, int rva) =>
+ BinaryPrimitives.ReadUInt16LittleEndian(pe.GetSectionData(rva).GetContent().AsSpan(0, sizeof(ushort)));
+
+ private static SectionHeader GetContainingSection(PEReader pe, int rva) =>
+ pe.PEHeaders.SectionHeaders[pe.PEHeaders.GetContainingSectionIndex(rva)];
+
+ private static bool HasBaseRelocation(PEReader pe, int targetRva, int expectedType)
+ {
+ DirectoryEntry directory = pe.PEHeaders.PEHeader!.BaseRelocationTableDirectory;
+ if (directory.RelativeVirtualAddress == 0 || directory.Size == 0)
+ {
+ return false;
+ }
+
+ ReadOnlySpan content = pe
+ .GetSectionData(directory.RelativeVirtualAddress)
+ .GetContent(0, directory.Size)
+ .AsSpan();
+ int blockOffset = 0;
+ while (blockOffset < content.Length)
+ {
+ int pageRva = BinaryPrimitives.ReadInt32LittleEndian(content.Slice(blockOffset));
+ int blockSize = BinaryPrimitives.ReadInt32LittleEndian(content.Slice(blockOffset + sizeof(int)));
+ if (blockSize < 8 || blockOffset + blockSize > content.Length)
+ {
+ return false;
+ }
+
+ int entryCount = (blockSize - 8) / sizeof(ushort);
+ for (int i = 0; i < entryCount; i++)
+ {
+ ushort entry = BinaryPrimitives.ReadUInt16LittleEndian(
+ content.Slice(blockOffset + 8 + (i * sizeof(ushort))));
+ int type = entry >> 12;
+ int rva = pageRva + (entry & 0x0FFF);
+ if (type == expectedType && rva == targetRva)
+ {
+ return true;
+ }
+ }
+
+ blockOffset += blockSize;
+ }
+
+ return false;
+ }
+
+ private static string ReadAsciiString(PEReader pe, int rva)
+ {
+ var content = pe.GetSectionData(rva).GetContent();
+ int length = content.AsSpan().IndexOf((byte)0);
+ return Encoding.ASCII.GetString(content.AsSpan(0, length));
+ }
+
+ private static (ImmutableArray Diagnostics, PEReader PEReader) CompileErrorTolerant(
+ string source) =>
+ CompileErrorTolerant(source, new Options());
+
+ private static (ImmutableArray Diagnostics, PEReader PEReader) CompileErrorTolerant(
+ string source,
+ Options options)
+ {
+ options.ErrorTolerant = true;
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ options);
+
+ Assert.NotNull(result);
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ return (diagnostics, new PEReader(image.ToImmutableArray()));
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs
index 32bb09e3bc0c55..3931daef2d36e1 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/ParameterTests.cs
@@ -197,6 +197,38 @@ .method public hidebysig static void M([in] int32& x) cil managed
Assert.True(param.Attributes.HasFlag(ParameterAttributes.In));
}
+ [Fact]
+ public void ParameterAttributeForms_EmitExpectedFlags()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M(
+ [in] int32 input,
+ [out] int32 output,
+ [opt] int32 optional,
+ [7] int32 rawFlags) cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var method = reader.GetMethodDefinition(Assert.Single(reader.MethodDefinitions));
+ var parameters = method.GetParameters()
+ .Select(reader.GetParameter)
+ .ToDictionary(parameter => reader.GetString(parameter.Name));
+
+ Assert.Equal(ParameterAttributes.In, parameters["input"].Attributes);
+ Assert.Equal(ParameterAttributes.Out, parameters["output"].Attributes);
+ Assert.Equal(ParameterAttributes.Optional, parameters["optional"].Attributes);
+ Assert.Equal((ParameterAttributes)8, parameters["rawFlags"].Attributes);
+ }
+
[Fact]
public void UnnamedInstanceParam_EmitsParamRow()
{
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessedTokenSourceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessedTokenSourceTests.cs
index 8ef5458ac371c2..47f2b01e25c063 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessedTokenSourceTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessedTokenSourceTests.cs
@@ -351,6 +351,30 @@ public void Include_Includes_Tokens_With_Original_Source()
token => Assert.Equal(CILLexer.Eof, token.Type));
}
+ [Fact]
+ public void UnterminatedIfDef_EofDiagnosticHasNonNegativeSpan()
+ {
+ string source = """
+ #define X
+ #ifdef X
+ A
+ """;
+
+ ITokenSource lexer = CreateLexerForSource(source);
+ PreprocessedTokenSource preprocessor = new(
+ lexer,
+ NoIncludeDirectivesCallback,
+ CreateDefaultLexer());
+ (int Start, int Length)? diagnosticSpan = null;
+ preprocessor.OnPreprocessorSyntaxError += (_, start, length, _) =>
+ diagnosticSpan = (start, length);
+ BufferedTokenStream stream = new(preprocessor);
+
+ stream.Fill();
+
+ Assert.Equal((source.Length, 0), diagnosticSpan);
+ }
+
private void NoLexerDiagnosticsCallback(string arg1, int arg2, int arg3, string arg4)
{
Assert.Fail($"A lexer diagnostic was encountered at {arg2}:{arg3}. '{arg4}'");
@@ -443,6 +467,27 @@ public void Define_MultiTokenValue_RecursivelyExpandsQueuedMacroTokensInOrder()
token => Assert.Equal(CILLexer.Eof, token.Type));
}
+ [Fact]
+ public void Define_EscapedQuotedString_ReportsSyntaxError()
+ {
+ string source = """
+ #define STRING "\"value\""
+ """;
+
+ ITokenSource lexer = CreateLexerForSource(source);
+ PreprocessedTokenSource preprocessor = new PreprocessedTokenSource(lexer, NoIncludeDirectivesCallback, CreateDefaultLexer());
+ bool reportedSyntaxError = false;
+ preprocessor.OnPreprocessorSyntaxError += (_, _, _, _) => reportedSyntaxError = true;
+ BufferedTokenStream stream = new(preprocessor);
+
+ stream.Fill();
+
+ Assert.True(reportedSyntaxError);
+ Assert.Collection(
+ stream.GetTokens(),
+ token => Assert.Equal(CILLexer.Eof, token.Type));
+ }
+
[Fact]
public void Define_SingleTokenValue_SubstitutedCorrectly()
{
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessorIntegrationTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessorIntegrationTests.cs
new file mode 100644
index 00000000000000..16eab5824c01de
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PreprocessorIntegrationTests.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;
+using System.Buffers.Binary;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.PortableExecutable;
+using Antlr4.Runtime;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class PreprocessorIntegrationTests
+ {
+ [Fact]
+ public void NestedIncludes_EmitExpectedTypes()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #include "level1.il"
+ .class public auto ansi beforefieldinit AfterInclude extends [System.Runtime]System.Object
+ {
+ }
+ """;
+
+ using var pe = CompileWithIncludesAndGetReader(source, new Dictionary
+ {
+ ["level1.il"] = """
+ #include "level2.il"
+ .class public auto ansi beforefieldinit Included.Namespace.IncludedType extends [System.Runtime]System.Object
+ {
+ }
+ """,
+ ["level2.il"] = """
+ .class public auto ansi beforefieldinit Nested.DeepType extends [System.Runtime]System.Object
+ {
+ }
+ """
+ });
+
+ var reader = pe.GetMetadataReader();
+ var typeNames = reader.TypeDefinitions
+ .Select(handle =>
+ {
+ var type = reader.GetTypeDefinition(handle);
+ return (Namespace: reader.GetString(type.Namespace), Name: reader.GetString(type.Name));
+ })
+ .ToArray();
+
+ Assert.Contains(("Included.Namespace", "IncludedType"), typeNames);
+ Assert.Contains(("Nested", "DeepType"), typeNames);
+ Assert.Contains((string.Empty, "AfterInclude"), typeNames);
+ }
+
+ [Fact]
+ public void ChainedIncludesEndingAtEof_ReturnToRootSource()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #include "level1.il"
+ .class public auto ansi beforefieldinit AfterInclude extends [System.Runtime]System.Object
+ {
+ }
+ """;
+
+ using PEReader pe = CompileWithIncludesAndGetReader(source, new Dictionary
+ {
+ ["level1.il"] = """
+ #include "level2.il"
+ """,
+ ["level2.il"] = """
+ .class public auto ansi beforefieldinit IncludedType extends [System.Runtime]System.Object
+ {
+ }
+ """,
+ });
+
+ MetadataReader reader = pe.GetMetadataReader();
+ string[] typeNames = reader.TypeDefinitions
+ .Select(handle => reader.GetString(reader.GetTypeDefinition(handle).Name))
+ .ToArray();
+
+ Assert.Contains("IncludedType", typeNames);
+ Assert.Contains("AfterInclude", typeNames);
+ }
+
+ [Fact]
+ public void IncludedUnterminatedConditional_PreservesParentConditionalState()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #define ROOT
+ #ifndef ROOT
+ #else
+ #include "child.il"
+ #else
+ .class public auto ansi beforefieldinit SecondElse extends [System.Runtime]System.Object { }
+ #endif
+ """;
+
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ new SourceText(source, "root.il"),
+ path => new SourceText("""
+ #define CHILD
+ #ifdef CHILD
+ """, path),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ var preprocessorDiagnostics = diagnostics.Where(diagnostic => diagnostic.Id == "Preprocessor").ToArray();
+ Assert.Single(preprocessorDiagnostics);
+ Assert.Equal("root.il", preprocessorDiagnostics[0].Location.Source.Path);
+ Assert.Contains("#else", preprocessorDiagnostics[0].Message);
+ Assert.NotNull(result);
+ }
+
+ [Fact]
+ public void IncludedUnterminatedConditional_ReportsEofDiagnostic()
+ {
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ new SourceText("""
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #include "child.il"
+ """, "root.il"),
+ path => new SourceText("""
+ #define CHILD
+ #ifdef CHILD
+ """, path),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ var preprocessorDiagnostic = Assert.Single(diagnostics.Where(diagnostic => diagnostic.Id == "Preprocessor"));
+ Assert.Equal("child.il", preprocessorDiagnostic.Location.Source.Path);
+ Assert.NotNull(result);
+ }
+
+ [Fact]
+ public void ConditionalCompilation_EmitsOnlyActiveTypes()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #define OUTER
+ #ifdef OUTER
+ .class public auto ansi beforefieldinit OuterSelected extends [System.Runtime]System.Object { }
+ #else
+ .class public auto ansi beforefieldinit WrongOuter extends [System.Runtime]System.Object { }
+ #endif
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeNames = reader.TypeDefinitions
+ .Select(handle => reader.GetString(reader.GetTypeDefinition(handle).Name))
+ .ToHashSet();
+
+ Assert.Equal(2, typeNames.Count);
+ Assert.Contains("OuterSelected", typeNames);
+ Assert.DoesNotContain("WrongOuter", typeNames);
+ }
+
+ [Fact]
+ public void IncludedMultiTokenMacro_EmitsExpectedFloatOperand()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ #include "constants.il"
+ .class public auto ansi beforefieldinit Test extends [System.Runtime]System.Object
+ {
+ .method public static float32 GetValue() cil managed
+ {
+ ldc.r4 NEG_INF
+ ret
+ }
+ }
+ """;
+
+ using var pe = CompileWithIncludesAndGetReader(source, new Dictionary
+ {
+ ["constants.il"] = """
+ #define NEG_INF "float32(0xFF800000)"
+ """
+ });
+
+ var reader = pe.GetMetadataReader();
+ byte[] il = GetMethodBody(pe, reader, "GetValue");
+
+ Assert.Equal(6, il.Length);
+ Assert.True(float.IsNegativeInfinity(BitConverter.Int32BitsToSingle(BinaryPrimitives.ReadInt32LittleEndian(il.AsSpan(1, 4)))));
+ }
+
+ private static PEReader CompileWithIncludesAndGetReader(string source, IReadOnlyDictionary includes)
+ {
+ return DocumentCompilerTestHelpers.CompileAndGetReader(
+ new SourceText(source, "root.il"),
+ path =>
+ {
+ Assert.True(includes.TryGetValue(path, out string? includedSource), $"Unexpected include path '{path}'");
+ return new SourceText(includedSource!, path);
+ },
+ new Options());
+ }
+
+ private static byte[] GetMethodBody(PEReader pe, MetadataReader reader, string methodName)
+ {
+ var method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .First(definition => reader.GetString(definition.Name) == methodName);
+
+ Assert.True(method.RelativeVirtualAddress > 0, $"Method '{methodName}' should have a body");
+ return pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes()!;
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PropertyEventTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyEventTests.cs
new file mode 100644
index 00000000000000..7e508c4907f526
--- /dev/null
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyEventTests.cs
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using Xunit;
+using DocumentCompilerTestHelpers = ILAssembler.Tests.DocumentCompilerTestHelpers;
+
+namespace ILAssembler.Tests
+{
+ public class PropertyEventTests
+ {
+ [Fact]
+ public void PropertyAndEvent_EmitMapsAndMethodSemantics()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi MyDelegate extends [mscorlib]System.MulticastDelegate
+ {
+ .method public specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
+ {
+ }
+ .method public virtual instance void Invoke() runtime managed
+ {
+ }
+ }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .field private int32 _value
+
+ .method public hidebysig specialname instance int32 get_Value() cil managed
+ {
+ ldarg.0
+ ldfld int32 Test::_value
+ ret
+ }
+
+ .method public hidebysig specialname instance void set_Value(int32 'value') cil managed
+ {
+ ldarg.0
+ ldarg.1
+ stfld int32 Test::_value
+ ret
+ }
+
+ .method public hidebysig specialname instance void add_Changed(class MyDelegate 'value') cil managed
+ {
+ ret
+ }
+
+ .method public hidebysig specialname instance void remove_Changed(class MyDelegate 'value') cil managed
+ {
+ ret
+ }
+
+ .property int32 Value()
+ {
+ .get instance int32 Test::get_Value()
+ .set instance void Test::set_Value(int32)
+ }
+
+ .event MyDelegate Changed
+ {
+ .addon instance void Test::add_Changed(class MyDelegate)
+ .removeon instance void Test::remove_Changed(class MyDelegate)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.Property));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.Event));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.PropertyMap));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.EventMap));
+ Assert.Equal(4, reader.GetTableRowCount(TableIndex.MethodSemantics));
+
+ var property = reader.GetPropertyDefinition(reader.PropertyDefinitions.Single());
+ var @event = reader.GetEventDefinition(reader.EventDefinitions.Single());
+
+ Assert.Equal("Value", reader.GetString(property.Name));
+ Assert.Equal("Changed", reader.GetString(@event.Name));
+ }
+ }
+}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs
index e53e81f0e589f5..40edc7c373e47e 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/PropertyTests.cs
@@ -66,6 +66,46 @@ .method public hidebysig specialname instance int32 get_Value() cil managed
Assert.True(propCount > 0, $"Expected at least 1 property, got {propCount}");
}
+ [Fact]
+ public void PropertyAttributesOtherAccessorAndCustomAttribute_EmitMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public specialname instance int32 get_Value() cil managed { ldc.i4.0 ret }
+ .method public specialname instance void set_Value(int32 'value') cil managed { ret }
+ .method public specialname instance void other_Value() cil managed { ret }
+
+ .property specialname rtspecialname instance int32 Value()
+ {
+ .get instance int32 Test::get_Value()
+ .set instance void Test::set_Value(int32)
+ .other instance void Test::other_Value()
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var propertyHandle = Assert.Single(reader.PropertyDefinitions);
+ var property = reader.GetPropertyDefinition(propertyHandle);
+ var accessors = property.GetAccessors();
+
+ Assert.True(property.Attributes.HasFlag(PropertyAttributes.SpecialName));
+ Assert.Equal("get_Value", reader.GetString(reader.GetMethodDefinition(accessors.Getter).Name));
+ Assert.Equal("set_Value", reader.GetString(reader.GetMethodDefinition(accessors.Setter).Name));
+ Assert.Equal(
+ "other_Value",
+ reader.GetString(reader.GetMethodDefinition(Assert.Single(accessors.Others)).Name));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(reader.GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(propertyHandle))).Value));
+ }
+
+
[Fact]
public void PropertyInitOpt_WithConstantValue_CreatesConstantEntry()
{
@@ -217,5 +257,49 @@ .property instance int32 Value()
var attrs = reader.GetCustomAttributes(propHandle);
Assert.True(attrs.Count >= 1, $"Property should have at least 1 custom attribute, got {attrs.Count}");
}
+
+ [Fact]
+ public void IndexedProperty_EmitsSignatureAndAccessorMetadata()
+ {
+ string source = """
+ .assembly test { }
+ .assembly extern mscorlib { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .property instance int32 Item(int32)
+ {
+ .get instance int32 Test::get_Item(int32)
+ .set instance void Test::set_Item(int32, int32)
+ }
+
+ .method public hidebysig specialname instance int32 get_Item(int32 index) cil managed
+ {
+ ldarg.1
+ ret
+ }
+
+ .method public hidebysig specialname instance void set_Item(int32 index, int32 'value') cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var propertyHandle = reader.PropertyDefinitions.Single();
+ var property = reader.GetPropertyDefinition(propertyHandle);
+ var accessors = property.GetAccessors();
+ MethodSignature signature =
+ property.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null);
+
+ Assert.Equal("Item", reader.GetString(property.Name));
+ Assert.Equal("get_Item", reader.GetString(reader.GetMethodDefinition(accessors.Getter).Name));
+ Assert.Equal("set_Item", reader.GetString(reader.GetMethodDefinition(accessors.Setter).Name));
+ Assert.True(signature.Header.IsInstance);
+ Assert.Equal("int32", signature.ReturnType);
+ Assert.Equal(new[] { "int32" }, signature.ParameterTypes);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs
index d28234893aaf90..4d84e16057d29c 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/SecurityTests.cs
@@ -1,6 +1,9 @@
// 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.Immutable;
+using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
@@ -54,5 +57,284 @@ .class public auto ansi Test { }
// Verify assembly compiled successfully with the permission set
Assert.True(reader.GetTableRowCount(TableIndex.DeclSecurity) >= 1);
}
+
+ [Fact]
+ public void PermissionSet_ByteArrayWithoutEquals_IsAccepted()
+ {
+ string source = """
+ .assembly test
+ {
+ .permissionset reqrefuse bytearray (2E)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var declaration = reader.GetDeclarativeSecurityAttribute(MetadataTokens.DeclarativeSecurityAttributeHandle(1));
+
+ Assert.Equal(System.Reflection.DeclarativeSecurityAction.RequestRefuse, declaration.Action);
+ Assert.Equal([0x2E], reader.GetBlobBytes(declaration.PermissionSet));
+ }
+
+ [Fact]
+ public void PermissionSet_WithDemand_EmitsDeclSecurityBlob()
+ {
+ string source = """
+ .assembly test
+ {
+ .permissionset demand = (2E)
+ .ver 1:0:0:0
+ }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var securityHandle = MetadataTokens.DeclarativeSecurityAttributeHandle(1);
+ var security = reader.GetDeclarativeSecurityAttribute(securityHandle);
+
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.DeclSecurity));
+ Assert.Equal(2, (int)security.Action);
+ Assert.Equal(HandleKind.AssemblyDefinition, security.Parent.Kind);
+ Assert.Equal([0x2E], reader.GetBlobBytes(security.PermissionSet));
+ }
+
+ [Theory]
+ [InlineData("request", 1)]
+ [InlineData("demand", 2)]
+ [InlineData("assert", 3)]
+ [InlineData("deny", 4)]
+ [InlineData("permitonly", 5)]
+ [InlineData("linkcheck", 6)]
+ [InlineData("inheritcheck", 7)]
+ [InlineData("reqmin", 8)]
+ [InlineData("reqopt", 9)]
+ [InlineData("reqrefuse", 10)]
+ [InlineData("prejitgrant", 11)]
+ [InlineData("prejitdeny", 12)]
+ [InlineData("noncasdemand", 13)]
+ [InlineData("noncaslinkdemand", 14)]
+ [InlineData("noncasinheritance", 15)]
+ public void PermissionSet_Action_EmitsExpectedDeclSecurityAction(string action, int expectedAction)
+ {
+ string source = $$"""
+ .assembly test
+ {
+ .permissionset {{action}} = (2E)
+ }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var security = reader.GetDeclarativeSecurityAttribute(
+ Assert.Single(reader.GetAssemblyDefinition().GetDeclarativeSecurityAttributes()));
+
+ Assert.Equal((DeclarativeSecurityAction)expectedAction, security.Action);
+ Assert.Equal(HandleKind.AssemblyDefinition, security.Parent.Kind);
+ Assert.Equal([0x2E], reader.GetBlobBytes(security.PermissionSet));
+ }
+
+ [Fact]
+ public void PermissionSet_VerbalForm_EmitsSerializedAttributeAndNamedProperty()
+ {
+ string source = """
+ .assembly test
+ {
+ .permissionset deny = {
+ class 'My.Permission' = {
+ property bool Enabled = bool(true)
+ }
+ }
+ }
+ .class public auto ansi Test { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var security = reader.GetDeclarativeSecurityAttribute(
+ Assert.Single(reader.GetAssemblyDefinition().GetDeclarativeSecurityAttributes()));
+
+ Assert.Equal(DeclarativeSecurityAction.Deny, security.Action);
+ BlobReader permissionSet = reader.GetBlobReader(security.PermissionSet);
+ Assert.Equal((byte)'.', permissionSet.ReadByte());
+ Assert.Equal(1, permissionSet.ReadCompressedInteger());
+ Assert.Equal("My.Permission", permissionSet.ReadSerializedString());
+ Assert.Equal(1, permissionSet.ReadUInt16());
+ Assert.Equal((byte)CustomAttributeNamedArgumentKind.Property, permissionSet.ReadByte());
+ Assert.Equal((byte)SerializationTypeCode.Boolean, permissionSet.ReadByte());
+ Assert.Equal("Enabled", permissionSet.ReadSerializedString());
+ Assert.True(permissionSet.ReadBoolean());
+ Assert.Equal(0, permissionSet.RemainingBytes);
+ }
+
+ [Fact]
+ public void UnsupportedPermission_NameValueForms_ErrorTolerantImageRemainsValid()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .permission demand [mscorlib]System.Security.Permissions.SecurityPermissionAttribute(
+ "Boolean" = true,
+ "Integer" = 123,
+ "WrappedInteger" = int32(456),
+ "Text" = "hello",
+ "Enum8" = [mscorlib]Contoso.Kind(int8:1),
+ "Enum16" = [mscorlib]Contoso.Kind(int16:2),
+ "Enum32" = [mscorlib]Contoso.Kind(int32:3),
+ "EnumDefault" = [mscorlib]Contoso.Kind(4)
+ )
+ .class public auto ansi Test extends [mscorlib]System.Object { }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Id == DiagnosticIds.UnsupportedSecurityDeclaration);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+
+ Assert.Contains(
+ reader.TypeDefinitions,
+ handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ Assert.Equal(0, reader.GetTableRowCount(TableIndex.DeclSecurity));
+ }
+
+ [Fact]
+ public void TypeAndMethodPermissionSets_EmitExpectedParentsAndActions()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .permissionset demand = (2E)
+ .method public static void M() cil managed
+ {
+ .permissionset assert = (2F)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var securityDeclarations = Enumerable.Range(1, reader.GetTableRowCount(TableIndex.DeclSecurity))
+ .Select(row => reader.GetDeclarativeSecurityAttribute(MetadataTokens.DeclarativeSecurityAttributeHandle(row)))
+ .ToArray();
+
+ Assert.Contains(
+ securityDeclarations,
+ security =>
+ security.Parent.Kind == HandleKind.TypeDefinition &&
+ security.Action == DeclarativeSecurityAction.Demand &&
+ reader.GetBlobBytes(security.PermissionSet).SequenceEqual((byte[])[0x2E]));
+ Assert.Contains(
+ securityDeclarations,
+ security =>
+ security.Parent.Kind == HandleKind.MethodDefinition &&
+ security.Action == DeclarativeSecurityAction.Assert &&
+ reader.GetBlobBytes(security.PermissionSet).SequenceEqual((byte[])[0x2F]));
+ }
+
+ [Fact]
+ public void PermissionSet_VerbalAttributesPreserveNamesAndTypeReferenceOrder()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test
+ {
+ .permissionset demand = {
+ [mscorlib]Contoso.FirstPermission = { },
+ class 'Contoso.QuotedPermission' = {
+ property bool Enabled = bool(true)
+ },
+ [mscorlib]Contoso.SecondPermission = { }
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ MetadataReader reader = pe.GetMetadataReader();
+ DeclarativeSecurityAttribute security = reader.GetDeclarativeSecurityAttribute(
+ Assert.Single(reader.GetAssemblyDefinition().GetDeclarativeSecurityAttributes()));
+ BlobReader permissionSet = reader.GetBlobReader(security.PermissionSet);
+
+ Assert.Equal((byte)'.', permissionSet.ReadByte());
+ Assert.Equal(3, permissionSet.ReadCompressedInteger());
+ Assert.StartsWith(
+ "Contoso.FirstPermission, mscorlib",
+ permissionSet.ReadSerializedString(),
+ StringComparison.Ordinal);
+ Assert.Equal(0, permissionSet.ReadUInt16());
+ Assert.Equal("Contoso.QuotedPermission", permissionSet.ReadSerializedString());
+ Assert.Equal(1, permissionSet.ReadUInt16());
+ Assert.Equal((byte)CustomAttributeNamedArgumentKind.Property, permissionSet.ReadByte());
+ Assert.Equal((byte)SerializationTypeCode.Boolean, permissionSet.ReadByte());
+ Assert.Equal("Enabled", permissionSet.ReadSerializedString());
+ Assert.True(permissionSet.ReadBoolean());
+ Assert.StartsWith(
+ "Contoso.SecondPermission, mscorlib",
+ permissionSet.ReadSerializedString(),
+ StringComparison.Ordinal);
+ Assert.Equal(0, permissionSet.ReadUInt16());
+ Assert.Equal(0, permissionSet.RemainingBytes);
+
+ Assert.Equal(
+ ["FirstPermission", "SecondPermission"],
+ reader.TypeReferences
+ .Select(handle => reader.GetString(reader.GetTypeReference(handle).Name))
+ .ToArray());
+ }
+
+ [Fact]
+ public void MalformedPermissionSet_DoesNotLeakAttributesIntoNextDocument()
+ {
+ ImmutableArray documents =
+ [
+ new SourceText("""
+ .assembly test { }
+ .permissionset demand = {
+ class 'Broken.Permission' = {
+ property bool Enabled = bool(true)
+ },
+ }
+ """, "broken.il"),
+ new SourceText("""
+ .permissionset assert = (2F)
+ .class public auto ansi Test { }
+ """, "valid.il"),
+ ];
+
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ DeclarativeSecurityAttribute security = reader.GetDeclarativeSecurityAttribute(
+ Assert.Single(reader.GetAssemblyDefinition().GetDeclarativeSecurityAttributes()));
+
+ Assert.Equal(DeclarativeSecurityAction.Assert, security.Action);
+ Assert.Equal([0x2F], reader.GetBlobBytes(security.PermissionSet));
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs
index 1a2b337581c94e..e184de67a8fed5 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/SourceDirectiveTests.cs
@@ -30,7 +30,7 @@ public void LanguageDecl_DoesNotThrow()
{
string source = $$"""
.assembly test { }
- .language "{{CSharpLanguageGuid}}", "{{CSharpVendorGuid}}"
+ .language '{{CSharpLanguageGuid}}', '{{CSharpVendorGuid}}'
.class public auto ansi beforefieldinit Test
{
}
@@ -45,7 +45,7 @@ public void LanguageDecl_MultipleParameters_DoesNotThrow()
{
string source = $$"""
.assembly test { }
- .language "{{CSharpLanguageGuid}}", "{{CSharpVendorGuid}}", "{{DocumentTypeGuid}}"
+ .language '{{CSharpLanguageGuid}}', '{{CSharpVendorGuid}}', '{{DocumentTypeGuid}}'
.class public auto ansi beforefieldinit Test
{
}
@@ -60,7 +60,7 @@ public void LanguageDecl_NonGuid_DoesNotThrow()
{
string source = """
.assembly test { }
- .language "C#", "Microsoft", "Not-a-guid"
+ .language 'C#', 'Microsoft', 'Not-a-guid'
.class public auto ansi beforefieldinit Test
{
}
@@ -100,7 +100,7 @@ .class public auto ansi beforefieldinit Test
{
.method public static void TestMethod() cil managed
{
- .line 10 : 5 "test.cs"
+ .line 10 : 5 'test.cs'
nop
ret
}
@@ -267,8 +267,11 @@ .method public static void M() cil managed
}
""";
- var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(source, new Options());
- Assert.Empty(diagnostics);
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ int token = DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "M", ILOpcode.ldstr);
+ string value = reader.GetUserString(MetadataTokens.UserStringHandle(token & 0x00FFFFFF));
+ Assert.Equal("Hello\nWorld\t!", value);
}
@@ -307,5 +310,328 @@ .class public auto ansi beforefieldinit ASSEMBLY_NAME extends [mscorlib]System.O
Assert.Equal("TestAssembly", reader.GetString(typeDef.Name));
}
+ [Fact]
+ public void LineDirective_WithRange_EmitsPortablePdbSequencePointWithSpecifiedStartPosition()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void TestMethod() cil managed
+ {
+ .line 10, 10 : 5, 6 'test.cs'
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var methodHandle = reader.MethodDefinitions.Single(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "TestMethod");
+
+ var embeddedPdbEntry = pe.ReadDebugDirectory().Single(entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var debugHandle = MetadataTokens.MethodDebugInformationHandle(MetadataTokens.GetRowNumber(methodHandle));
+ var debugInfo = pdbReader.GetMethodDebugInformation(debugHandle);
+ var sequencePoint = debugInfo.GetSequencePoints().First(point => !point.IsHidden);
+
+ Assert.Equal(0, sequencePoint.Offset);
+ Assert.Equal(10, sequencePoint.StartLine);
+ Assert.Equal(5, sequencePoint.StartColumn);
+
+ var document = pdbReader.GetDocument(sequencePoint.Document);
+ Assert.Contains("test.cs", pdbReader.GetString(document.Name));
+ }
+
+ [Theory]
+ [InlineData(".line 10 'single.cs'", "single.cs")]
+ [InlineData(".line 11", "default.cs")]
+ [InlineData(".line 12 : 3 'single.cs'", "single.cs")]
+ [InlineData(".line 13 : 4", "default.cs")]
+ [InlineData(".line 14 : 5, 6 'single.cs'", "single.cs")]
+ [InlineData(".line 15 : 6, 7", "default.cs")]
+ [InlineData(".line 16, 17 : 8 'single.cs'", "single.cs")]
+ [InlineData(".line 18, 19 : 9", "default.cs")]
+ [InlineData(".line 20, 21 : 10, 11 'single.cs'", "single.cs")]
+ [InlineData(".line 22, 23 : 12, 13", "default.cs")]
+ [InlineData(".line 24 \"double.cs\"", "double.cs")]
+ public void LineDirective_SyntaxVariant_EmitsPortablePdbMethodDebugInformation(
+ string directive,
+ string expectedDocument)
+ {
+ string initialDirective =
+ directive.Contains('\'') || directive.Contains('"')
+ ? string.Empty
+ : ".line 1, 1 : 1, 2 'default.cs'";
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ {{initialDirective}}
+ {{directive}}
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var methodHandle = reader.MethodDefinitions
+ .Single(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "M");
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var debugInformation = pdbReader.GetMethodDebugInformation(
+ MetadataTokens.MethodDebugInformationHandle(MetadataTokens.GetRowNumber(methodHandle)));
+ SequencePoint[] sequencePoints = debugInformation.GetSequencePoints().ToArray();
+
+ Assert.False(debugInformation.SequencePointsBlob.IsNil);
+ Assert.NotEmpty(sequencePoints);
+ Assert.Contains(
+ expectedDocument,
+ pdbReader.GetString(pdbReader.GetDocument(debugInformation.Document).Name));
+ }
+
+ [Theory]
+ [InlineData(".language '3f5162f8-07c6-11d3-9053-00c04fa302a1'")]
+ [InlineData(".language '3f5162f8-07c6-11d3-9053-00c04fa302a1', '994b45c4-e6e9-11d2-903f-00c04fa302a1'")]
+ [InlineData(".language '3f5162f8-07c6-11d3-9053-00c04fa302a1', '994b45c4-e6e9-11d2-903f-00c04fa302a1', '5a869d0b-6611-11d3-bd2a-0000f80849bd'")]
+ public void LanguageDirective_SyntaxVariant_EmitsDocumentLanguage(string languageDirective)
+ {
+ string source = $$"""
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ {{languageDirective}}
+ .line 10 "document.cs"
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var document = pdbReader.GetDocument(Assert.Single(pdbReader.Documents));
+
+ Assert.Equal(
+ new Guid("3f5162f8-07c6-11d3-9053-00c04fa302a1"),
+ pdbReader.GetGuid(document.Language));
+ Assert.Contains("document.cs", pdbReader.GetString(document.Name));
+ }
+
+ [Fact]
+ public void ClassScopedLanguageAndLineDirectives_ApplyToMethodSequencePoint()
+ {
+ string source = """
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .language '3f5162f8-07c6-11d3-9053-00c04fa302a1'
+ .line 1 "class.cs"
+ .method public static void M() cil managed
+ {
+ .line 10
+ nop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var document = pdbReader.GetDocument(Assert.Single(pdbReader.Documents));
+
+ Assert.Equal(
+ new Guid("3f5162f8-07c6-11d3-9053-00c04fa302a1"),
+ pdbReader.GetGuid(document.Language));
+ Assert.Contains("class.cs", pdbReader.GetString(document.Name));
+ }
+
+ [Fact]
+ public void MultiDocumentCompile_WithLineDirectivesAcrossDocuments_EmitsPdbDocumentsForEachSource()
+ {
+ var documents = ImmutableArray.Create(
+ new SourceText("""
+ .assembly test { }
+ .class public auto ansi beforefieldinit First
+ {
+ .method public static void M1() cil managed
+ {
+ .line 10 "doc1.cs"
+ nop
+ ret
+ }
+ }
+ """, "doc1.il"),
+ new SourceText("""
+ .class public auto ansi beforefieldinit Second
+ {
+ .method public static void M2() cil managed
+ {
+ .line 20 "doc2.cs"
+ nop
+ ret
+ }
+ }
+ """, "doc2.il"));
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, image) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { Pdb = true });
+
+ Assert.Empty(diagnostics);
+ Assert.NotNull(image);
+
+ var imageBuilder = new BlobBuilder();
+ image!.Serialize(imageBuilder);
+ using var pe = new PEReader(imageBuilder.ToImmutableArray());
+ var embeddedPdbEntry = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using var pdbProvider = pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry);
+ var pdbReader = pdbProvider.GetMetadataReader();
+ var documentNames = pdbReader.Documents
+ .Select(handle => pdbReader.GetString(pdbReader.GetDocument(handle).Name))
+ .ToArray();
+
+ Assert.Equal(2, documentNames.Length);
+ Assert.Contains(documentNames, name => name.Contains("doc1.cs", StringComparison.Ordinal));
+ Assert.Contains(documentNames, name => name.Contains("doc2.cs", StringComparison.Ordinal));
+ Assert.Equal(pe.GetMetadataReader().MethodDefinitions.Count, pdbReader.MethodDebugInformation.Count);
+ }
+
+ [Fact]
+ public void MultiDocumentCompile_DoesNotReusePreviousDocumentPath()
+ {
+ var documents = ImmutableArray.Create(
+ new SourceText("""
+ .assembly test { }
+ .class public auto ansi First
+ {
+ .method public static void M1() cil managed
+ {
+ .line 10 "first.cs"
+ nop
+ ret
+ }
+ }
+ """, "first.il"),
+ new SourceText("""
+ .class public auto ansi Second
+ {
+ .method public static void M2() cil managed
+ {
+ .line 20
+ nop
+ ret
+ }
+ }
+ """, "second.il"));
+
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { Pdb = true });
+
+ Assert.Empty(diagnostics);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ MetadataReader reader = pe.GetMetadataReader();
+ MethodDefinitionHandle firstMethod = reader.MethodDefinitions
+ .Single(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "M1");
+ MethodDefinitionHandle secondMethod = reader.MethodDefinitions
+ .Single(handle => reader.GetString(reader.GetMethodDefinition(handle).Name) == "M2");
+ DebugDirectoryEntry embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using MetadataReaderProvider pdbProvider =
+ pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ MetadataReader pdbReader = pdbProvider.GetMetadataReader();
+
+ MethodDebugInformation firstDebugInformation = pdbReader.GetMethodDebugInformation(
+ MetadataTokens.MethodDebugInformationHandle(MetadataTokens.GetRowNumber(firstMethod)));
+ MethodDebugInformation secondDebugInformation = pdbReader.GetMethodDebugInformation(
+ MetadataTokens.MethodDebugInformationHandle(MetadataTokens.GetRowNumber(secondMethod)));
+
+ Assert.False(firstDebugInformation.SequencePointsBlob.IsNil);
+ Assert.True(secondDebugInformation.SequencePointsBlob.IsNil);
+ Assert.Contains(
+ "first.cs",
+ pdbReader.GetString(pdbReader.GetDocument(firstDebugInformation.Document).Name));
+ }
+
+ [Fact]
+ public void MalformedLanguageDirective_DoesNotPartiallyUpdateGuidState()
+ {
+ ImmutableArray documents =
+ [
+ new SourceText($$"""
+ .assembly test { }
+ .language '{{CSharpLanguageGuid}}'
+ .language '{{DocumentTypeGuid}}',
+ """, "broken.il"),
+ new SourceText("""
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ .line 10 "document.cs"
+ nop
+ ret
+ }
+ }
+ """, "valid.il"),
+ ];
+
+ var compiler = new DocumentCompiler();
+ (ImmutableArray diagnostics, CompilationResult? result) = compiler.Compile(
+ documents,
+ _ => throw new InvalidOperationException("Unexpected include"),
+ _ => throw new InvalidOperationException("Unexpected resource"),
+ new Options { ErrorTolerant = true, Pdb = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ DebugDirectoryEntry embeddedPdb = Assert.Single(
+ pe.ReadDebugDirectory(),
+ entry => entry.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
+ using MetadataReaderProvider pdbProvider =
+ pe.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdb);
+ MetadataReader pdbReader = pdbProvider.GetMetadataReader();
+ Document document = pdbReader.GetDocument(Assert.Single(pdbReader.Documents));
+
+ Assert.Equal(Guid.Parse(CSharpLanguageGuid), pdbReader.GetGuid(document.Language));
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/SyntaxTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/SyntaxTests.cs
index 7d2d2ae89a4bb9..97295ecaa3a332 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/SyntaxTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/SyntaxTests.cs
@@ -191,6 +191,245 @@ .method public static int64 M() cil managed
}
+ [Theory]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .namespace NS
+ {
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ """)]
+ [InlineData(".class public auto ansi")]
+ [InlineData(".method public static void")]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ .try
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test
+ {
+ .method public static void M(int32 .method cil managed
+ {
+ .maxstack 2
+ ret
+ }
+ }
+ """)]
+ [InlineData("""
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi
+ {
+ .method public instance void M() cil managed
+ {
+ .override [mscorlib]System.Object::ToString
+ ret
+ }
+ }
+ """)]
+ public void TruncatedDocument_ReportsDiagnosticsInsteadOfThrowing(string source)
+ {
+ var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(
+ source,
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ }
+
+ [Theory]
+ [InlineData(".assembly extern { }")]
+ [InlineData(".mresource public { }")]
+ [InlineData(".class public auto ansi Test { .event { } }")]
+ [InlineData(".class public auto ansi Test { .property { } }")]
+ [InlineData("""
+ .class public auto ansi Test
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor(string) = { string( }
+ }
+ """)]
+ [InlineData("""
+ .class public auto ansi Test
+ {
+ .method public static void M(int32,) cil managed
+ {
+ ret
+ }
+ }
+ """)]
+ [InlineData(".class public auto ansi Test { .field public }")]
+ [InlineData(".typedef")]
+ [InlineData(".custom")]
+ [InlineData(".class flags( public Test { }")]
+ [InlineData(".class public auto ansi Test<+> { }")]
+ [InlineData(".class public auto ansi Test { .field marshal( int32 F }")]
+ [InlineData(".class public auto ansi Test { .field public int32 F = bytearray( }")]
+ [InlineData("""
+ .class public auto ansi Test
+ {
+ .method pinvokeimpl( public static void M() cil managed
+ {
+ ret
+ }
+ }
+ """)]
+ [InlineData("""
+ .class public auto ansi Test
+ {
+ .method public static void M(,) cil managed
+ {
+ ret
+ }
+ }
+ """)]
+ [InlineData("""
+ .class public auto ansi Test
+ {
+ .method public static void M() cil managed
+ {
+ .custom
+ ret
+ }
+ }
+ """)]
+ [InlineData(".permission demand class X (Name = )")]
+ [InlineData(".class extern { }")]
+ [InlineData(".class public auto ansi Test { .export public { } }")]
+ [InlineData(".assembly extern Name { .ver : }")]
+ public void MalformedTypedGrammarValues_ReportParserDiagnosticsInsteadOfThrowing(string source)
+ {
+ var diagnostics = DocumentCompilerTestHelpers.CompileAndGetDiagnostics(
+ source,
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == "Parser");
+ }
+
+ public static TheoryData TruncatedDirectiveMutations
+ {
+ get
+ {
+ string[] sources =
+ [
+ ".assembly extern Dependency { .publickeytoken = (01 02 03 04) .ver 1:2:3:4 }",
+ ".mresource public Resource { .assembly extern Dependency }",
+ ".class extern public Exported { .assembly extern Dependency }",
+ ".typedef method instance void [mscorlib]System.Object::.ctor() as Constructor",
+ ".permission demand [mscorlib]System.Security.Permissions.SecurityPermissionAttribute = { }",
+ """
+ .class public auto ansi Test extends [mscorlib]System.Object implements [mscorlib]System.IDisposable
+ {
+ .field public marshal(int32) int32 F = int32(1)
+ .event specialname [mscorlib]System.EventHandler E { }
+ .property specialname int32 P() { }
+ .method public static void M(int32 'value') cil managed
+ {
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ ret
+ }
+ }
+ """
+ ];
+
+ HashSet uniqueMutations = new(StringComparer.Ordinal);
+ TheoryData mutations = new();
+ foreach (string source in sources)
+ {
+ for (int i = 1; i < source.Length; i++)
+ {
+ if (!char.IsWhiteSpace(source[i - 1]) &&
+ char.IsWhiteSpace(source[i]))
+ {
+ string mutation = source.Substring(0, i);
+ if (uniqueMutations.Add(mutation))
+ {
+ mutations.Add(mutation, false);
+ mutations.Add(mutation, true);
+ }
+ }
+ }
+ }
+
+ return mutations;
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(TruncatedDirectiveMutations))]
+ public void TruncatedDirectiveMutationCorpus_ReportsDiagnosticsInsteadOfThrowing(
+ string source,
+ bool errorTolerant)
+ {
+ ImmutableArray diagnostics =
+ DocumentCompilerTestHelpers.CompileAndGetDiagnostics(
+ source,
+ new Options { ErrorTolerant = errorTolerant });
+
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ }
+
+ [Theory]
+ [InlineData("""
+ .assembly extern Dependency
+ {
+ .publicKey = (01 02 03 04)
+ }
+ .assembly test { }
+ """)]
+ [InlineData("""
+ .assembly test { }
+ .language "3f5162f8-07c6-11d3-9053-00c04fa302a1"
+ """)]
+ [InlineData("""
+ .assembly test { }
+ .class Test
+ {
+ .method static void M() cil managed
+ {
+ .line 1, 1 : 1, 2 "test.cs"
+ ret
+ }
+ }
+ """)]
+ [InlineData("""
+ .assembly test { }
+ .class Test
+ {
+ .method static void M(int32 value) cil managed
+ {
+ ret
+ }
+ }
+ """)]
+ public void NativeIlasmUnsupportedSyntax_ReportsError(string source)
+ {
+ ImmutableArray diagnostics =
+ DocumentCompilerTestHelpers.CompileAndGetDiagnostics(
+ source,
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(
+ diagnostics,
+ diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
+ }
+
[Fact]
public void ParserErrorListener_ReportsSyntaxErrors()
{
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs
index a14dd1e9c704fe..aae8196e76a4b4 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypeDefinitionTests.cs
@@ -105,7 +105,7 @@ .assembly test { }
.class public sequential ansi beforefieldinit MyStruct
extends [System.Runtime]System.ValueType
{
- .field public int32 value
+ .field public int32 'value'
}
""";
@@ -419,6 +419,74 @@ .class public auto ansi beforefieldinit MyNamespace.MyType extends [mscorlib]Sys
Assert.Equal("MyNamespace", reader.GetString(typeDef.Namespace));
}
+ [Fact]
+ public void TypeName_QuotedNamespaceSegment()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi beforefieldinit 'tls'.tls1 extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("tls1", reader.GetString(typeDef.Name));
+ Assert.Equal("tls", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void TypeName_QuotedStartupCodeNamespaceSegment()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class private abstract auto ansi sealed ''.$Test extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("$Test", reader.GetString(typeDef.Name));
+ Assert.Equal("", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void TypeName_QuotedSegmentAfterDottedName()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi beforefieldinit System.Collections.'Type' extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("Type", reader.GetString(typeDef.Name));
+ Assert.Equal("System.Collections", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void TypeName_EmptyQuotedNamespaceSegmentPreservesSeparator()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly Test { }
+ .class public auto ansi beforefieldinit ''.Foo.'Bar' extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.GetTypeDefinition(MetadataTokens.TypeDefinitionHandle(2));
+ Assert.Equal("Bar", reader.GetString(typeDef.Name));
+ Assert.Equal(".Foo", reader.GetString(typeDef.Namespace));
+ }
+
[Fact]
public void Namespace_NoLeadingDot()
@@ -597,5 +665,220 @@ .field [4] public int32 y
Assert.Equal(16, layout.Size);
}
+ [Fact]
+ public void QuotedTypeName_WithConsecutiveDots_SplitsAtLastDot()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit 'Contoso.Tools..ctor' extends [mscorlib]System.Object
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var typeDef = reader.TypeDefinitions
+ .Select(handle => reader.GetTypeDefinition(handle))
+ .Single(type => reader.GetString(type.Name) == "ctor");
+
+ Assert.Equal("ctor", reader.GetString(typeDef.Name));
+ Assert.Equal("Contoso.Tools.", reader.GetString(typeDef.Namespace));
+ }
+
+ [Fact]
+ public void ClassAttributes_EmitExpectedFlagsAndImplicitBaseTypes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+
+ .class public auto ansi Outer extends [mscorlib]System.Object
+ {
+ .class nested private auto ansi NestedPrivate extends [mscorlib]System.Object { }
+ .class nested family auto ansi NestedFamily extends [mscorlib]System.Object { }
+ .class nested assembly auto ansi NestedAssembly extends [mscorlib]System.Object { }
+ .class nested famandassem auto ansi NestedFamAndAssem extends [mscorlib]System.Object { }
+ .class nested famorassem auto ansi NestedFamOrAssem extends [mscorlib]System.Object { }
+ }
+
+ .class public auto unicode import serializable windowsruntime UnicodeImported extends [mscorlib]System.Object { }
+ .class public value ValueTypeByKeyword { }
+ .class public enum EnumTypeByKeyword { }
+ .class flags(0x00100001) FlaggedType extends [mscorlib]System.Object { }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .Select(handle => (Handle: handle, Definition: reader.GetTypeDefinition(handle)))
+ .ToDictionary(item => reader.GetString(item.Definition.Name));
+
+ Assert.Equal(
+ TypeAttributes.NestedPrivate,
+ types["NestedPrivate"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedFamily,
+ types["NestedFamily"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedAssembly,
+ types["NestedAssembly"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedFamANDAssem,
+ types["NestedFamAndAssem"].Definition.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal(
+ TypeAttributes.NestedFamORAssem,
+ types["NestedFamOrAssem"].Definition.Attributes & TypeAttributes.VisibilityMask);
+
+ TypeAttributes unicodeImported = types["UnicodeImported"].Definition.Attributes;
+ Assert.Equal(TypeAttributes.UnicodeClass, unicodeImported & TypeAttributes.StringFormatMask);
+ Assert.True(unicodeImported.HasFlag(TypeAttributes.Import));
+ Assert.True(unicodeImported.HasFlag(TypeAttributes.Serializable));
+ Assert.True(unicodeImported.HasFlag(TypeAttributes.WindowsRuntime));
+
+ Assert.True(types["ValueTypeByKeyword"].Definition.Attributes.HasFlag(TypeAttributes.Sealed));
+ Assert.Equal("ValueType", GetBaseTypeName(reader, types["ValueTypeByKeyword"].Definition));
+ Assert.Equal("Enum", GetBaseTypeName(reader, types["EnumTypeByKeyword"].Definition));
+
+ Assert.Equal((TypeAttributes)0x00100001, types["FlaggedType"].Definition.Attributes);
+ }
+
+ [Fact]
+ public void LegacyClassFlagSentinels_EmitImplicitValueTypeAndEnumBases()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class flags(0x80100001) FlagValueType { }
+ .class flags(0x40100001) FlagEnumType { }
+ """;
+
+ var compiler = new DocumentCompiler();
+ var (diagnostics, result) = compiler.Compile(
+ new SourceText(source, "test.il"),
+ _ => { Assert.Fail("Expected no includes"); return default; },
+ _ => { Assert.Fail("Expected no resources"); return default; },
+ new Options { ErrorTolerant = true });
+
+ Assert.Contains(diagnostics, diagnostic => diagnostic.Id == DiagnosticIds.UnsealedValueType);
+ Assert.NotNull(result);
+
+ var image = new BlobBuilder();
+ result!.Serialize(image);
+ using var pe = new PEReader(image.ToImmutableArray());
+ var reader = pe.GetMetadataReader();
+ var types = reader.TypeDefinitions
+ .Select(handle => reader.GetTypeDefinition(handle))
+ .ToDictionary(type => reader.GetString(type.Name));
+
+ Assert.True(types["FlagValueType"].Attributes.HasFlag(TypeAttributes.BeforeFieldInit));
+ Assert.True(types["FlagValueType"].Attributes.HasFlag(TypeAttributes.Sealed));
+ Assert.Equal("ValueType", GetBaseTypeName(reader, types["FlagValueType"]));
+ Assert.True(types["FlagEnumType"].Attributes.HasFlag(TypeAttributes.BeforeFieldInit));
+ Assert.Equal("Enum", GetBaseTypeName(reader, types["FlagEnumType"]));
+ }
+
+ [Fact]
+ public void NestedType_EmitsDeclaringTypeMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Outer extends [mscorlib]System.Object
+ {
+ .class nested public auto ansi beforefieldinit Inner extends [mscorlib]System.Object
+ {
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var outerHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Outer");
+ var innerHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Inner");
+
+ var inner = reader.GetTypeDefinition(innerHandle);
+ Assert.Equal(TypeAttributes.NestedPublic, inner.Attributes & TypeAttributes.VisibilityMask);
+ Assert.Equal("Outer", reader.GetString(reader.GetTypeDefinition(outerHandle).Name));
+ Assert.Equal(1, reader.GetTableRowCount(TableIndex.NestedClass));
+ }
+
+ [Fact]
+ public void InterfaceImplementation_EmitsInterfaceImplRow()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class interface public abstract auto ansi IWorker
+ {
+ .method public hidebysig newslot abstract virtual instance void Run() cil managed { }
+ }
+ .class public auto ansi beforefieldinit Worker extends [mscorlib]System.Object implements IWorker
+ {
+ .method public hidebysig newslot virtual instance void Run() cil managed
+ {
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ var workerHandle = reader.TypeDefinitions
+ .First(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Worker");
+ var worker = reader.GetTypeDefinition(workerHandle);
+ var interfaceImplHandle = Assert.Single(worker.GetInterfaceImplementations());
+ var interfaceImpl = reader.GetInterfaceImplementation(interfaceImplHandle);
+
+ Assert.Equal(HandleKind.TypeDefinition, interfaceImpl.Interface.Kind);
+ Assert.Equal("IWorker", reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)interfaceImpl.Interface).Name));
+ }
+
+ [Fact]
+ public void InterfaceImplementationDirective_EmitsCustomAttributeOnInterfaceImpl()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class interface public abstract auto ansi IWorker
+ {
+ }
+ .class public auto ansi Worker extends [mscorlib]System.Object implements IWorker
+ {
+ .interfaceimpl type IWorker
+ .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00)
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var worker = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(definition => reader.GetString(definition.Name) == "Worker");
+ var implementationHandle = Assert.Single(worker.GetInterfaceImplementations());
+ var implementation = reader.GetInterfaceImplementation(implementationHandle);
+ var attribute = reader.GetCustomAttribute(
+ Assert.Single(reader.GetCustomAttributes(implementationHandle)));
+
+ Assert.Equal(HandleKind.TypeDefinition, implementation.Interface.Kind);
+ Assert.Equal(
+ "IWorker",
+ reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)implementation.Interface).Name));
+ Assert.Equal(
+ [0x01, 0x00, 0x00, 0x00],
+ reader.GetBlobBytes(attribute.Value));
+ }
+
+ private static string GetBaseTypeName(MetadataReader reader, TypeDefinition type)
+ {
+ Assert.Equal(HandleKind.TypeReference, type.BaseType.Kind);
+ return reader.GetString(reader.GetTypeReference((TypeReferenceHandle)type.BaseType).Name);
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs
index ec6a3a3e26ada5..864c694b6b9ebd 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypeReferenceTests.cs
@@ -118,6 +118,61 @@ .method public static void Main() cil managed
Assert.True(reader.GetTableRowCount(TableIndex.TypeRef) >= 1);
}
+ [Fact]
+ public void ExplicitNetstandardTypeRef_PreservesResolutionScope()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly extern netstandard { }
+ .assembly test { }
+ .class public auto ansi Test extends [System.Runtime]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ call void [netstandard]System.Console::WriteLine()
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ TypeReferenceHandle consoleHandle = DocumentCompilerTestHelpers.FindTypeRef(reader, "Console");
+ var console = reader.GetTypeReference(consoleHandle);
+ var assemblyReference = reader.GetAssemblyReference((AssemblyReferenceHandle)console.ResolutionScope);
+
+ Assert.Equal("netstandard", reader.GetString(assemblyReference.Name));
+ }
+
+ [Theory]
+ [InlineData("Console")]
+ [InlineData("Exception")]
+ public void ExplicitMscorlibNonCoreTypeRef_PreservesResolutionScope(string typeName)
+ {
+ string source = $$"""
+ .assembly extern mscorlib { }
+ .assembly extern System.Runtime { }
+ .assembly test { }
+ .class public auto ansi Test extends [System.Runtime]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ ldtoken [mscorlib]System.{{typeName}}
+ pop
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ TypeReferenceHandle typeHandle = DocumentCompilerTestHelpers.FindTypeRef(reader, typeName);
+ var type = reader.GetTypeReference(typeHandle);
+ var assemblyReference = reader.GetAssemblyReference((AssemblyReferenceHandle)type.ResolutionScope);
+
+ Assert.Equal("mscorlib", reader.GetString(assemblyReference.Name));
+ }
+
[Fact]
public void ResolvedTypeRefs_StillEmittedAsRows_InPseudoHandleOrder()
@@ -289,5 +344,135 @@ ldtoken [test]MyType
DocumentCompilerTestHelpers.AssertTypeDefToken(reader, token, "MyType");
}
+ [Fact]
+ public void ThisBaseNesterAndMetadataTokenTypeReferences_EmitExpectedTypeTokens()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Base extends [mscorlib]System.Object { }
+ .class public auto ansi Outer extends Base
+ {
+ .method public static void UseThisAndBase(object 'value') cil managed
+ {
+ ldarg.0
+ box .this
+ pop
+ ldarg.0
+ box .base
+ pop
+ ldarg.0
+ box mdtoken(0x02000002)
+ pop
+ ret
+ }
+
+ .class nested public auto ansi Inner extends [mscorlib]System.Object
+ {
+ .method public static void UseNester(object 'value') cil managed
+ {
+ ldarg.0
+ box .nester
+ pop
+ ret
+ }
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ ImmutableArray outerTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "UseThisAndBase", ILOpcode.box);
+ ImmutableArray innerTokens =
+ DocumentCompilerTestHelpers.GetTokenOperands(pe, reader, "UseNester", ILOpcode.box);
+
+ Assert.Equal(
+ new[] { "Outer", "Base", "Base" },
+ outerTokens.Select(token => GetTypeName(reader, MetadataTokens.EntityHandle(token))));
+ Assert.Equal(
+ "Outer",
+ GetTypeName(reader, MetadataTokens.EntityHandle(Assert.Single(innerTokens))));
+ }
+
+ [Fact]
+ public void ModuleScopedTypeReference_EmitsModuleReferenceResolutionScope()
+ {
+ string source = """
+ .assembly test { }
+ .module extern Native.netmodule
+ .class public auto ansi Test
+ {
+ .field public class [.module Native.netmodule]Contoso.External Value
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var field = reader.GetFieldDefinition(Assert.Single(reader.FieldDefinitions));
+ var typeReference = reader.TypeReferences
+ .Select(handle => (Handle: handle, Type: reader.GetTypeReference(handle)))
+ .Single(item => reader.GetString(item.Type.Name) == "External");
+
+ Assert.Equal(
+ "[.module Native.netmodule]Contoso.External",
+ field.DecodeSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ Assert.Equal(HandleKind.ModuleReference, typeReference.Type.ResolutionScope.Kind);
+ Assert.Equal(
+ "Native.netmodule",
+ reader.GetString(reader.GetModuleReference((ModuleReferenceHandle)typeReference.Type.ResolutionScope).Name));
+ }
+
+ [Fact]
+ public void TypelistMscorlibAndSemicolonControls_EmitExpectedMetadata()
+ {
+ string source = """
+ .assembly extern External.Assembly { }
+ .assembly test { }
+ .mscorlib
+ .typelist {
+ [External.Assembly]Contoso.First
+ [External.Assembly]Contoso.Outer/Nested
+ }
+ ;
+ .class public auto ansi Test
+ {
+ ;
+ .method public static void M() cil managed
+ {
+ ;
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var typeReferences = reader.TypeReferences
+ .Select(reader.GetTypeReference)
+ .Select(type => (Namespace: reader.GetString(type.Namespace), Name: reader.GetString(type.Name)))
+ .ToArray();
+
+ Assert.Contains(("Contoso", "First"), typeReferences);
+ Assert.Contains(("Contoso", "Outer"), typeReferences);
+ Assert.Contains((string.Empty, "Nested"), typeReferences);
+
+ var testType = reader.TypeDefinitions
+ .Select(reader.GetTypeDefinition)
+ .Single(type => reader.GetString(type.Name) == "Test");
+ var method = reader.GetMethodDefinition(Assert.Single(testType.GetMethods()));
+ Assert.Equal("M", reader.GetString(method.Name));
+ Assert.Equal([0x2A], pe.GetMethodBody(method.RelativeVirtualAddress).GetILBytes());
+ }
+
+ private static string GetTypeName(MetadataReader reader, EntityHandle handle) => handle.Kind switch
+ {
+ HandleKind.TypeDefinition =>
+ reader.GetString(reader.GetTypeDefinition((TypeDefinitionHandle)handle).Name),
+ HandleKind.TypeReference =>
+ reader.GetString(reader.GetTypeReference((TypeReferenceHandle)handle).Name),
+ _ => throw new InvalidOperationException($"Unexpected type handle kind {handle.Kind}."),
+ };
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs
index fa2e2253354490..4a1a581471c24a 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypeSignatureTests.cs
@@ -42,5 +42,104 @@ .locals init (int32[0...,0...] V_0)
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void MultiDimArrayLocal_EmitsArraySignatureShape()
+ {
+ string source = """
+ .assembly extern System.Runtime { }
+ .assembly TestAssembly { }
+ .class public auto ansi beforefieldinit Test
+ {
+ .method public static void M() cil managed
+ {
+ .locals init (int32[0...,0...] V_0)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ StandaloneSignature signature = GetLocalSignature(pe, reader, "M");
+ Assert.Equal(
+ new[] { "int32[0...,0...]" },
+ signature.DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void ArrayBoundVariants_DecodeExpectedShapes()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .locals init (
+ int32[] szArray,
+ int32[,] unspecified,
+ int32[5] sized,
+ int32[2...] lowerBoundOnly,
+ int32[2...5] bounded)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ StandaloneSignature signature = GetLocalSignature(pe, reader, "M");
+
+ Assert.Equal(
+ new[]
+ {
+ "int32[]",
+ "int32[..., ...]".Replace(" ", string.Empty),
+ "int32[0...4]",
+ "int32[2...]",
+ "int32[2...5]",
+ },
+ signature.DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ [Fact]
+ public void MultiDimensionalLocalSignature_EmitsArrayShape()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .class public auto ansi beforefieldinit Test extends [mscorlib]System.Object
+ {
+ .method public static void M() cil managed
+ {
+ .locals init (int32[0...,0...] matrix)
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+
+ StandaloneSignature signature = GetLocalSignature(pe, reader, "M");
+ Assert.Equal(
+ new[] { "int32[0...,0...]" },
+ signature.DecodeLocalSignature(DocumentCompilerTestHelpers.Decoder, genericContext: null));
+ }
+
+ private static StandaloneSignature GetLocalSignature(
+ PEReader pe,
+ MetadataReader reader,
+ string methodName)
+ {
+ MethodDefinition method = reader.MethodDefinitions
+ .Select(reader.GetMethodDefinition)
+ .Single(method => reader.GetString(method.Name) == methodName);
+ MethodBodyBlock body = pe.GetMethodBody(method.RelativeVirtualAddress);
+
+ Assert.False(body.LocalSignature.IsNil);
+ return reader.GetStandaloneSignature(body.LocalSignature);
+ }
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs
index 94605d871dd495..ac9b09e0bad4f8 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/TypedefTests.cs
@@ -143,5 +143,85 @@ .method public static void TestMethod() cil managed
Assert.Empty(diagnostics);
}
+ [Fact]
+ public void Typedef_FieldAndCustomAttributeForms_EmitResolvableMetadata()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .assembly test { }
+ .typedef field int32 Test::Value as ValueAlias
+ .typedef .custom instance void [mscorlib]System.ObsoleteAttribute::.ctor() = (01 00 00 00) as AttributeAlias
+ .typedef .custom (Test) instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00) as OwnedAttributeAlias
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ .field public static int32 Value
+ AttributeAlias
+ OwnedAttributeAlias
+ .method public static int32 Read() cil managed
+ {
+ ldsfld ValueAlias
+ ret
+ }
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ var testTypeHandle = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+ var testType = reader.GetTypeDefinition(testTypeHandle);
+ var fieldHandle = Assert.Single(testType.GetFields());
+ int fieldToken =
+ DocumentCompilerTestHelpers.GetFirstTokenOperand(pe, reader, "Read", ILOpcode.ldsfld);
+
+ Assert.Equal(MetadataTokens.GetToken(fieldHandle), fieldToken);
+
+ var fieldAttributes = reader.GetCustomAttributes(fieldHandle)
+ .Select(reader.GetCustomAttribute)
+ .Select(attribute => attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder))
+ .ToArray();
+ CustomAttributeValue fieldAttribute = Assert.Single(fieldAttributes);
+ Assert.Empty(fieldAttribute.FixedArguments);
+
+ var typeAttributes = reader.GetCustomAttributes(testTypeHandle)
+ .Select(reader.GetCustomAttribute)
+ .Select(attribute => attribute.DecodeValue(DocumentCompilerTestHelpers.Decoder))
+ .ToArray();
+ CustomAttributeValue typeAttribute = Assert.Single(typeAttributes);
+ CustomAttributeTypedArgument argument =
+ Assert.Single(typeAttribute.FixedArguments);
+ Assert.Equal("bool", argument.Type);
+ Assert.Equal(true, argument.Value);
+ Assert.Equal(2, reader.CustomAttributes.Count);
+ }
+
+ [Fact]
+ public void Typedef_CustomAttributeWithOwner_AssemblyUsePreservesOwner()
+ {
+ string source = """
+ .assembly extern mscorlib { }
+ .typedef .custom (Test) instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00) as OwnedAttributeAlias
+ .assembly test
+ {
+ OwnedAttributeAlias
+ }
+ .class public auto ansi Test extends [mscorlib]System.Object
+ {
+ }
+ """;
+
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ var reader = pe.GetMetadataReader();
+ TypeDefinitionHandle testType = reader.TypeDefinitions
+ .Single(handle => reader.GetString(reader.GetTypeDefinition(handle).Name) == "Test");
+
+ CustomAttributeValue typeAttribute = reader
+ .GetCustomAttribute(Assert.Single(reader.GetCustomAttributes(testType)))
+ .DecodeValue(DocumentCompilerTestHelpers.Decoder);
+ Assert.Equal(true, Assert.Single(typeAttribute.FixedArguments).Value);
+ Assert.Empty(reader.GetAssemblyDefinition().GetCustomAttributes());
+ Assert.Single(reader.CustomAttributes);
+ }
+
}
}
diff --git a/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs b/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs
index da71a13f68d4ca..c23df5f22cea18 100644
--- a/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs
+++ b/src/tools/ilasm/tests/ILAssembler.Tests/VTableTests.cs
@@ -99,7 +99,9 @@ .export [1]
}
""";
- using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(source, new Options());
+ using var pe = DocumentCompilerTestHelpers.CompileAndGetReader(
+ source,
+ new Options { Machine = Machine.Amd64 });
// Verify .sdata section exists
var sdataSection = pe.PEHeaders.SectionHeaders.FirstOrDefault(s => s.Name == ".sdata");