diff --git a/README.md b/README.md index 5f99baf8..5ae2f0b1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Nuget](https://img.shields.io/nuget/vpre/Tx.All.svg)](https://www.nuget.org/packages/Tx.All/) -![Build](https://ecs10.visualstudio.com/_apis/public/build/definitions/79dfec19-0be4-4364-86ec-b0b3146b0dc3/19/badge) +[![Build status](https://ci.appveyor.com/api/projects/status/6n09scr9d74lb9vp?svg=true)](https://ci.appveyor.com/project/SergeyBaranchenkov/tx-6doyh) # Tx (LINQ to Logs and Traces) diff --git a/References/LinqPad/LINQPad.exe b/References/LinqPad/LINQPad.exe index e37eca49..15d73f28 100644 Binary files a/References/LinqPad/LINQPad.exe and b/References/LinqPad/LINQPad.exe differ diff --git a/References/LinqPad/LINQPad.exe.config b/References/LinqPad/LINQPad.exe.config index 629960ad..ed648544 100644 --- a/References/LinqPad/LINQPad.exe.config +++ b/References/LinqPad/LINQPad.exe.config @@ -1,9 +1,48 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Samples/LinqPad/Queries/create_samples_package.cmd b/Samples/LinqPad/Queries/create_samples_package.cmd index 4dd9e7d0..50b64e16 100644 --- a/Samples/LinqPad/Queries/create_samples_package.cmd +++ b/Samples/LinqPad/Queries/create_samples_package.cmd @@ -1,2 +1,2 @@ -del c:\bin\samples.zip -..\..\..\Tools\zip -r c:\bin\samples.zip header.xml NoManifest HTTP.sys IE_IIS "Performance Counters" SqlXevent WcfTroubleshooting \ No newline at end of file +if exist %1 del %1 || goto failFast +..\..\..\Tools\zip -r %1 header.xml NoManifest HTTP.sys IE_IIS "Performance Counters" SqlXevent WcfTroubleshooting \ No newline at end of file diff --git a/Source/AssemblyInfo.cs b/Source/AssemblyInfo.cs deleted file mode 100644 index 62118593..00000000 --- a/Source/AssemblyInfo.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System.Reflection; - -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Tx (LINQ to Logs and Traces)")] -[assembly: AssemblyCopyright("Copyright © Microsoft. All Rights Reserved")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] diff --git a/Source/Build.cmd b/Source/Build.cmd index 4cc8abdd..722a09e2 100644 --- a/Source/Build.cmd +++ b/Source/Build.cmd @@ -1,70 +1,81 @@ -set bin="c:\Bin" +set sourceFolder=%~dp0 +set dropFolder=%~dp0 -if not exist "%bin%" mkdir %bin% || goto failFast +( +set /p versionParam= +)<%sourceFolder%version.txt -if "%1"=="NoBuild" goto noBuild +echo %versionParam% -pushd %~dp0 - -msbuild Tx.sln /p:Configuration=Release45 /p:Platform="Any CPU" || goto failFast -msbuild Tx.sln /p:Configuration=Debug45 /p:Platform="Any CPU" || goto failFast +rem set msbuildPath="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe" +set msbuildPath="msbuild" +pushd +cd /d %sourceFolder%SetVersion || goto failFast +dotnet restore || goto failFast +dotnet msbuild /p:Configuration=Release || goto failFast popd -:noBuild +pushd %sourceFolder%..\Samples\LinqPad\Queries || goto failFast +call create_samples_package.cmd %dropFolder%samples.zip +popd -copy ..\tools\NuGet.exe %bin%\ || goto failFast -copy ..\tools\zip.exe %bin%\ || goto failFast -copy ..\tools\PushPackages.cmd %bin%\ || goto failFast +call :pack Tx.Core || goto failFast +call :pack Tx.Windows || goto failFast +call :pack Tx.Bond || goto failFast +call :pack Tx.Network || goto failFast +call :pack Tx.SqlServer || goto failFast -pushd ..\Samples\LinqPad\Queries || goto failFast -call create_samples_package.cmd +pushd +%sourceFolder%SetVersion\bin\Release\SetVersion.exe %versionParam% %sourceFolder%Tx.Windows.TypeGeneration\Tx.Windows.TypeGeneration.csproj || goto failFast +cd /d %sourceFolder%Tx.Windows.TypeGeneration || goto failFast +dotnet restore || goto failFast +dotnet build -c=Release || goto failFast +%sourceFolder%SetVersion\bin\Release\SetVersion.exe %versionParam% %sourceFolder%EtwEventTypeGen\EtwEventTypeGen.csproj || goto failFast +%sourceFolder%SetVersion\bin\Release\SetVersion.exe %versionParam% %sourceFolder%EtwEventTypeGen\Properties\Tx.Windows.TypeGeneration.nuspec || goto failFast +cd /d %sourceFolder%EtwEventTypeGen || goto failFast +dotnet restore || goto failFast +dotnet build -c=Release || goto failFast +copy %sourceFolder%EtwEventTypeGen\Properties\Tx.Windows.TypeGeneration.nuspec %sourceFolder%EtwEventTypeGen\bin\Release\net45\ || goto failFast +cd /d %sourceFolder%EtwEventTypeGen\bin\Release\net45 || goto failFast +%sourceFolder%..\tools\NuGet pack Tx.Windows.TypeGeneration.nuspec || goto failFast +move %sourceFolder%EtwEventTypeGen\bin\Release\net45\Tx.Windows.TypeGeneration.%versionParam%*.nupkg %dropFolder% || goto failFast popd pushd - -cd /d %bin%\Debug || goto failFast -call :setVersion || goto failFast -call :packAll || goto failFast - -cd /d %bin%\Release || goto failFast -call :setVersion || goto failFast -call :packAll || goto failFast - -cd /d %bin%\Release\Net45 || goto failFast -..\..\zip.exe ..\..\Tx.LinqPad.lpx header.xml System.Reactive.Interfaces.dll System.Reactive.Core.dll System.Reactive.Linq.dll System.Reactive.PlatformServices.dll System.Reactive.Windows.Forms.dll Tx.Core.dll Tx.Windows.dll Tx.Windows.TypeGeneration.dll Tx.SqlServer.dll msvcr100.dll xe.dll Microsoft.SqlServer.XE.Core.dll Microsoft.SqlServer.XEvent.Configuration.dll Microsoft.SqlServer.XEvent.dll Microsoft.SqlServer.XEvent.Linq.dll Microsoft.SqlServer.XEvent.Targets.dll Tx.LinqPad.dll HTTP_Server.man HTTP_Server.etl BasicPerfCounters.blg CrossMachineHTTP.etl CrossMachineIE.etl IE_Client.man sqltrace.xel Microsoft.Windows.ApplicationServer.Applications.man SampleWcfTrace.etl || goto failFast - +%sourceFolder%SetVersion\bin\Release\SetVersion.exe %versionParam% %sourceFolder%Tx.Linqpad\Tx.Linqpad.csproj || goto failFast +cd /d %sourceFolder%Tx.Linqpad || goto failFast +dotnet restore || goto failFast +%msbuildPath% /p:Configuration=Release || goto failFast +cd /d %sourceFolder%Tx.Linqpad\bin\Release\net46 || goto failFast +%sourceFolder%..\tools\zip.exe %dropFolder%Tx.LinqPad.lpx header.xml System.Reactive.Interfaces.dll System.Reactive.Core.dll System.Reactive.Linq.dll System.Reactive.PlatformServices.dll System.Reactive.Windows.Forms.dll Tx.Core.dll Tx.Windows.dll Tx.Windows.TypeGeneration.dll Tx.SqlServer.dll %sourceFolder%..\References\XEvent\msvcr100.dll %sourceFolder%..\References\XEvent\xe.dll Microsoft.SqlServer.XE.Core.dll Microsoft.SqlServer.XEvent.Configuration.dll Microsoft.SqlServer.XEvent.dll Microsoft.SqlServer.XEvent.Linq.dll Microsoft.SqlServer.XEvent.Targets.dll Tx.LinqPad.dll HTTP_Server.man HTTP_Server.etl BasicPerfCounters.blg CrossMachineHTTP.etl CrossMachineIE.etl IE_Client.man sqltrace.xel Microsoft.Windows.ApplicationServer.Applications.man SampleWcfTrace.etl || goto failFast popd -goto end -:setVersion - -pushd Net45\Properties || goto failFast -..\SetVersion.exe || goto failFast +pushd +%sourceFolder%SetVersion\bin\Release\SetVersion.exe %versionParam% %sourceFolder%Tx.All\Tx.All.nuspec || goto failFast +cd /d %sourceFolder%Tx.All || goto failFast +%sourceFolder%..\tools\NuGet pack Tx.All.nuspec || goto failFast +move %sourceFolder%Tx.All\Tx.All.*.nupkg %dropFolder%\ || goto failFast popd -exit /b 0 +cd %dropFolder% +del /q Tx.%versionParam%.zip +%sourceFolder%..\tools\zip.exe Tx.%versionParam%.zip samples.zip Tx.LinqPad.lpx || goto failFast -:packAll -call :pack Tx.Core || goto failFast -call :pack Tx.Windows || goto failFast -call :pack Tx.Bond || goto failFast -call :pack Tx.Network || goto failFast -call :pack Tx.Windows.TypeGeneration || goto failFast -call :pack Tx.SqlServer || goto failFast -call :pack Tx.All || goto failFast +for /f "usebackq delims=|" %%f in (`dir /b "*.nupkg"`) do %sourceFolder%..\tools\zip.exe Tx.%versionParam%.zip %%f -exit /b 0 +goto end :pack %1 -call Net45\Properties\%1.Layout.cmd || goto failFast -cd /d %1 || goto failFast -copy ..\Net45\Properties\%1.nuspec || goto failFast -..\..\NuGet pack %1.nuspec || goto failFast -move *.nupkg ..\ || goto failFast -cd .. -rd /s/q %1 || goto failFast -exit /b 0 + +%sourceFolder%SetVersion\bin\Release\SetVersion.exe %versionParam% %sourceFolder%%1\%1.csproj || goto failFast + +pushd +cd /d %sourceFolder%%1 || goto failFast +dotnet restore || goto failFast +dotnet build -c=Release || goto failFast +move %sourceFolder%%1\bin\Release\%1.*.nupkg %dropFolder% || goto failFast +popd :end cd %~dp0 diff --git a/Source/EtwEventTypeGen/EtwEventTypeGen.csproj b/Source/EtwEventTypeGen/EtwEventTypeGen.csproj index ff6f99d9..7fb2f784 100644 --- a/Source/EtwEventTypeGen/EtwEventTypeGen.csproj +++ b/Source/EtwEventTypeGen/EtwEventTypeGen.csproj @@ -1,67 +1,11 @@  - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11} Exe - Properties - Microsoft.Etw - EtwEventTypeGen - 512 - - - - - - - - + net45 + 2.1.1 - - - ..\..\References\$(BuildFlavor) - - - true - - - ..\key.snk - - - - True - - - - - - - - - - - - - - - {a4517abd-d558-42f3-8fe4-2a6ba3074014} - Tx.Windows.TypeGeneration - - - {c4043abb-ec40-4194-b15b-c0d13c2cf5c8} - Tx.Windows - + - - \ No newline at end of file diff --git a/Source/EtwEventTypeGen/Properties/AssemblyInfo.cs b/Source/EtwEventTypeGen/Properties/AssemblyInfo.cs deleted file mode 100644 index 8d2edfdd..00000000 --- a/Source/EtwEventTypeGen/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("EtwEventTypeGen")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("EtwEventTypeGen")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5303acb3-7563-4a80-b445-8145334a464a")] - diff --git a/Source/EtwEventTypeGen/Properties/Tx.Windows.TypeGeneration.nuspec b/Source/EtwEventTypeGen/Properties/Tx.Windows.TypeGeneration.nuspec new file mode 100644 index 00000000..68eefd98 --- /dev/null +++ b/Source/EtwEventTypeGen/Properties/Tx.Windows.TypeGeneration.nuspec @@ -0,0 +1,27 @@ + + + + Tx.Windows.TypeGeneration + Tx.Windows.TypeGeneration + + 2.1.1 + Tx (LINQ to Logs and Traces) components for generation of C# types representing Event Tracing for Windows (ETW) and Event Log events + Microsoft + Copyright © Microsoft. All Rights Reserved + http://tx.codeplex.com + http://tx.codeplex.com/license + en-us + Tx Traces Logs Playback Replay ETW + false + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/SetVersion/App.config b/Source/SetVersion/App.config new file mode 100644 index 00000000..8e156463 --- /dev/null +++ b/Source/SetVersion/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Source/SetVersion/Program.cs b/Source/SetVersion/Program.cs index 138db2a7..ffe107b0 100644 --- a/Source/SetVersion/Program.cs +++ b/Source/SetVersion/Program.cs @@ -1,67 +1,99 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; +using System; using System.IO; +using System.Linq; using System.Xml.Linq; namespace SetVersion { internal class Program { - private const string Prefix = "[assembly: AssemblyVersion("; - - private static void Main() + private static void Main(string[] args) { - string version = GetVersion(); - Console.WriteLine(version); + string version = args[0]; + var validCharacters = "1234567890.".ToCharArray(); + var hasInvalidCharacters = version + .ToCharArray() + .Except(validCharacters).Any(); - string[] specs = Directory.GetFiles(".", "*.nuspec"); - foreach (string s in specs) + if (hasInvalidCharacters) { - Console.WriteLine(s); - FixNuSpec(s, version); + throw new ApplicationException("Version is in invalid format: " + version); } - } - private static string GetVersion() - { - StreamReader reader = File.OpenText("AssemblyInfo.cs"); - string line = reader.ReadLine(); + string filename = args[1]; - while (line != null) + if (!File.Exists(filename)) { - if (!line.StartsWith(Prefix)) - { - line = reader.ReadLine(); - continue; - } - - int startIndex = Prefix.Length + 1; - int endIndex = line.LastIndexOf('.'); - return line.Substring(startIndex, endIndex - startIndex); + throw new FileNotFoundException(filename); } - throw new Exception("could not find AssemblyVersion attribute"); - } + var extension = Path.GetExtension(filename); - private static void FixNuSpec(string path, string version) - { - XDocument spec = XDocument.Load(path); - XElement xeMetadata = spec.Element("package").Element("metadata"); + if (new[] { extension } + .Except(new[] { ".csproj", ".nuspec" }, StringComparer.OrdinalIgnoreCase).Any()) + { + throw new ApplicationException("Only csproj and nuspec files are supported"); + } + + var document = XDocument.Load(filename); - XElement xeVersion = xeMetadata.Element("version"); - xeVersion.SetValue(xeVersion.Value.Replace("{version}", version)); + XElement parentElement = null; - XElement xeDependencies = xeMetadata.Element("dependencies"); - foreach (XElement xeDependency in xeDependencies.Elements("dependency")) + if (string.Equals(extension, ".csproj", StringComparison.OrdinalIgnoreCase)) + { + parentElement = document.Descendants("Project") + .First() + .Descendants("PropertyGroup") + .First(); + } + else if(string.Equals(extension, ".nuspec", StringComparison.OrdinalIgnoreCase)) { - if (!xeDependency.Attribute("id").Value.StartsWith("Tx.")) - continue; + parentElement = document.Descendants("package") + .First() + .Descendants("metadata") + .First(); - xeDependency.SetAttributeValue("version", xeDependency.Attribute("version").Value.Replace("{version}", version)); + foreach (var item in parentElement + .Descendants("dependencies") + .Descendants()) + { + var attribute = item.Attribute(XName.Get("id")); + if (attribute.Value.StartsWith("Tx.")) + { + var versionAttribute = item.Attribute(XName.Get("version")); + if (versionAttribute.Value.Contains("{version}")) + { + versionAttribute.Value = versionAttribute.Value.Replace("{version}", version); + } + else + { + versionAttribute.Value = version; + } + } + } + } + + var versionElement = parentElement + .Descendants() + .FirstOrDefault(i => string.Equals(i.Name.ToString(), "Version", StringComparison.OrdinalIgnoreCase)); + + if (versionElement != null) + { + if (versionElement.Value.Contains("{version}")) + { + versionElement.Value = versionElement.Value.Replace("{version}", version); + } + else + { + versionElement.Value = version; + } + } + else + { + parentElement.Add(new XElement(XName.Get("Version")) { Name = "Version", Value = version }); } - spec.Save(path); + document.Save(filename); } } -} \ No newline at end of file +} diff --git a/Test/UnitTests/Properties/AssemblyInfo.cs b/Source/SetVersion/Properties/AssemblyInfo.cs similarity index 70% rename from Test/UnitTests/Properties/AssemblyInfo.cs rename to Source/SetVersion/Properties/AssemblyInfo.cs index b348689a..dac09623 100644 --- a/Test/UnitTests/Properties/AssemblyInfo.cs +++ b/Source/SetVersion/Properties/AssemblyInfo.cs @@ -2,32 +2,35 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("Tests.Tx")] +[assembly: AssemblyTitle("SetVersion")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Tests.Tx.Properties")] -[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyProduct("SetVersion")] +[assembly: AssemblyCopyright("Copyright © 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("4e72f349-2472-45a4-9e2d-f35e92a7b015")] +[assembly: Guid("d4b1be53-01b5-4341-869e-bcbbf7160ebb")] // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Source/SetVersion/SetVersion.csproj b/Source/SetVersion/SetVersion.csproj index 353de5cd..f0bf9a36 100644 --- a/Source/SetVersion/SetVersion.csproj +++ b/Source/SetVersion/SetVersion.csproj @@ -1,38 +1,48 @@  - + Debug AnyCPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76} + {D4B1BE53-01B5-4341-869E-BCBBF7160EBB} Exe - Properties SetVersion SetVersion + v4.5 512 - - - ..\..\References\$(BuildFlavor) + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + - - Properties\AssemblyInfo.cs - + + + + - \ No newline at end of file diff --git a/Source/Tx.Core/Properties/Tx.All.nuspec b/Source/Tx.All/Tx.All.nuspec similarity index 52% rename from Source/Tx.Core/Properties/Tx.All.nuspec rename to Source/Tx.All/Tx.All.nuspec index 2ddfdaab..64deb1d4 100644 --- a/Source/Tx.Core/Properties/Tx.All.nuspec +++ b/Source/Tx.All/Tx.All.nuspec @@ -1,24 +1,22 @@ - + Tx.All Tx.All - {version} + 2.1.1 Tx (LINQ to Logs and Traces) container package for all supported raw trace/log sources Microsoft Copyright © Microsoft. All Rights Reserved - http://tx.codeplex.com http://tx.codeplex.com/license - en-us - Tx Traces Logs Playback Replay XEvent ETW - false + Tx Traces Logs Playback Replay XEvent ETW + false - - - - + + + + \ No newline at end of file diff --git a/Source/Tx.Bond/Properties/Tx.Bond.Layout.cmd b/Source/Tx.Bond/Properties/Tx.Bond.Layout.cmd deleted file mode 100644 index 8d98bf72..00000000 --- a/Source/Tx.Bond/Properties/Tx.Bond.Layout.cmd +++ /dev/null @@ -1,6 +0,0 @@ -rd /s/q Tx.Bond - -md Tx.Bond\lib\Net45 -copy Net45\Tx.Bond.dll Tx.Bond\lib\Net45 -copy Net45\Tx.Bond.xml Tx.Bond\lib\Net45 -copy Net45\Tx.Bond.pdb Tx.Bond\lib\Net45 \ No newline at end of file diff --git a/Source/Tx.Bond/Properties/Tx.Bond.nuspec b/Source/Tx.Bond/Properties/Tx.Bond.nuspec deleted file mode 100644 index 7fbca838..00000000 --- a/Source/Tx.Bond/Properties/Tx.Bond.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - Tx.Bond - Tx.Bond - - {version} - Tx (LINQ to Logs and Traces) Binary-in-ETW transport components - Microsoft - Copyright © Microsoft. All Rights Reserved - - http://tx.codeplex.com - http://tx.codeplex.com/license - - en-us - Tx Traces Logs Playback Replay ETW Bond - false - - - - - - - \ No newline at end of file diff --git a/Source/Tx.Bond/Tx.Bond.csproj b/Source/Tx.Bond/Tx.Bond.csproj index 7fdb822e..67c6b597 100644 --- a/Source/Tx.Bond/Tx.Bond.csproj +++ b/Source/Tx.Bond/Tx.Bond.csproj @@ -1,102 +1,35 @@  - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9} - Library - Properties - Tx.Bond - Tx.Bond - 512 - - - - - ..\..\References\$(BuildFlavor) - - - $(OutputPath)\$(AssemblyName).XML - - - true - + + net45 + True ..\key.snk + Tx (LINQ to Logs and Traces) Binary-in-ETW transport components + Microsoft + Microsoft + True + Tx Traces Logs Playback Replay ETW Bond + git + Copyright © Microsoft. All Rights Reserved + https://github.com/Microsoft/Tx/blob/master/license.txt + https://github.com/Microsoft/Tx/ + https://github.com/Microsoft/Tx.git + 2.1.1 + + + bin\Release\net45\Tx.Bond.xml - - $(CPReferencePath)\Bond.dll - - - $(CPReferencePath)\Bond.Attributes.dll - - - False - $(CPReferencePath)\Microsoft.Diagnostics.Tracing.EventSource.dll - - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - + + - - Properties\AssemblyInfo.cs - Always - - - - - - - - - - - - - - - - - - - + - - Properties\key.snk - - - Always - - - Always - Designer - + - - {c5cc33b0-1684-4dd4-83a5-5da4a9a25a7f} - Tx.Core - - - {c4043abb-ec40-4194-b15b-c0d13c2cf5c8} - Tx.Windows - + - \ No newline at end of file diff --git a/Source/Tx.Bond/Tx.Bond.csproj.DotSettings b/Source/Tx.Bond/Tx.Bond.csproj.DotSettings deleted file mode 100644 index 827beb42..00000000 --- a/Source/Tx.Bond/Tx.Bond.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - Experimental \ No newline at end of file diff --git a/Source/Tx.Core/CompositeDeserializer.cs b/Source/Tx.Core/CompositeDeserializer.cs index 7db3272e..50764109 100644 --- a/Source/Tx.Core/CompositeDeserializer.cs +++ b/Source/Tx.Core/CompositeDeserializer.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; +using System.Reflection; namespace System.Reactive { @@ -22,33 +23,35 @@ public CompositeDeserializer( _deserializers = new List>(); foreach (ITypeMap mapInstance in typeMaps) { - Type mapInterface = mapInstance.GetType().GetInterfaces() + Type mapInterface = mapInstance.GetType().GetTypeInfo().ImplementedInterfaces .FirstOrDefault(i => i.Name == typeof(IPartitionableTypeMap<,>).Name); if (mapInterface != null) { Type deserializerType = - typeof (PartitionKeyDeserializer<,>).MakeGenericType(mapInterface.GetGenericArguments()); + typeof (PartitionKeyDeserializer<,>).MakeGenericType(mapInterface.GenericTypeArguments); object deserializerInstance = Activator.CreateInstance(deserializerType, mapInstance); _deserializers.Add((IDeserializer) deserializerInstance); continue; } - mapInterface = mapInstance.GetType().GetInterface(typeof(IRootTypeMap<,>).Name); + mapInterface = mapInstance.GetType().GetTypeInfo().ImplementedInterfaces + .FirstOrDefault(i => i.Name == typeof(IRootTypeMap<,>).Name); if (mapInterface != null) { Type deserializerType = - typeof (RootDeserializer<,>).MakeGenericType(mapInterface.GetGenericArguments()); + typeof (RootDeserializer<,>).MakeGenericType(mapInterface.GenericTypeArguments); object deserializerInstance = Activator.CreateInstance(deserializerType, mapInstance); _deserializers.Add((IDeserializer) deserializerInstance); continue; } - mapInterface = mapInstance.GetType().GetInterface(typeof(ITypeMap<>).Name); + mapInterface = mapInstance.GetType().GetTypeInfo().ImplementedInterfaces + .FirstOrDefault(i => i.Name == typeof(ITypeMap<>).Name); if (mapInterface != null) { Type deserializerType = - typeof (TransformDeserializer<>).MakeGenericType(mapInterface.GetGenericArguments()); + typeof (TransformDeserializer<>).MakeGenericType(mapInterface.GenericTypeArguments); object deserializerInstance = Activator.CreateInstance(deserializerType, mapInstance); _deserializers.Add((IDeserializer) deserializerInstance); continue; @@ -105,7 +108,7 @@ public void OnNext(TInput value) { if (timestamp.HasValue && timestamp.Value != ts.Timestamp) { - _observer.OnError(new ApplicationException("Several type maps return different timestamps for the same source event.")); + _observer.OnError(new Exception("Several type maps return different timestamps for the same source event.")); return; } diff --git a/Source/Tx.Core/Converter.cs b/Source/Tx.Core/Converter.cs index 370973a1..51ee12a3 100644 --- a/Source/Tx.Core/Converter.cs +++ b/Source/Tx.Core/Converter.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; + using System.Reflection; public class Converter : IObserver { @@ -16,11 +17,11 @@ public Converter(IObserver next, params ITransformBuilder[] transfor { if (next == null) { - throw new ArgumentNullException("next"); + throw new ArgumentNullException(nameof(next)); } if (transformBuilders == null) { - throw new ArgumentNullException("transformBuilders"); + throw new ArgumentNullException(nameof(transformBuilders)); } this.next = next; @@ -70,7 +71,7 @@ public void RegisterTransformerBuilder(ITransformBuilder transformBuilder) { if (transformBuilder == null) { - throw new ArgumentNullException("transformBuilder", "Cannot be null."); + throw new ArgumentNullException(nameof(transformBuilder), "Cannot be null."); } this.transformBuilders = this.transformBuilders @@ -99,7 +100,7 @@ internal static class E public static Func Build(this ITransformBuilder transformBuilder, Type type) { var method = typeof(ITransformBuilder) - .GetMethod("Build") + .GetRuntimeMethod("Build", new Type[0]) .MakeGenericMethod(type) .Invoke(transformBuilder, new object[0]) as Func; diff --git a/Source/Tx.Core/Csv/CsvExtensions.cs b/Source/Tx.Core/Csv/CsvExtensions.cs index d90f13c5..d5fc857e 100644 --- a/Source/Tx.Core/Csv/CsvExtensions.cs +++ b/Source/Tx.Core/Csv/CsvExtensions.cs @@ -2,6 +2,7 @@ using System.Collections; using System.IO; +using System.Reflection; namespace System.Reactive { @@ -17,9 +18,9 @@ public static IDisposable ToTsvFile(this IObservable source, string filePa return source.Subscribe(new TextFileWriter("\t", filePath)); } - class TextFileWriter : IObserver, IDisposable + internal sealed class TextFileWriter : IObserver, IDisposable { - private string _separator; + private readonly string _separator; private StreamWriter _writer; private bool _wroteHeader = false; @@ -34,7 +35,7 @@ public TextFileWriter(string separator, string filePath) /// public void OnCompleted() { - _writer.Close(); + _writer.Dispose(); } /// @@ -59,7 +60,7 @@ public void OnNext(T value) } bool isFirst = true; - foreach (var p in typeof(T).GetProperties()) + foreach (var p in typeof(T).GetTypeInfo().DeclaredProperties) { if (isFirst) isFirst = false; @@ -90,7 +91,7 @@ public void Dispose() void WriteHeader(T firstValue) { bool isFirst = true; - foreach (var p in typeof(T).GetProperties()) + foreach (var p in typeof(T).GetTypeInfo().DeclaredProperties) { if (isFirst) isFirst = false; diff --git a/Source/Tx.Core/Csv/CsvObservable.cs b/Source/Tx.Core/Csv/CsvObservable.cs index 38b8371f..69460fb2 100644 --- a/Source/Tx.Core/Csv/CsvObservable.cs +++ b/Source/Tx.Core/Csv/CsvObservable.cs @@ -37,7 +37,8 @@ private IEnumerable ReadRecords(string fileName) { var stringBuilder = new StringBuilder(); - using (var reader = new StreamReader(fileName)) + using(var stream = File.OpenRead(fileName)) + using (var reader = new StreamReader(stream)) { ReadOnlyCollection header; if (reader.Peek() >= 0) diff --git a/Source/Tx.Core/Csv/CsvRecordTypeMap.cs b/Source/Tx.Core/Csv/CsvRecordTypeMap.cs index 6c59f5d2..e3988709 100644 --- a/Source/Tx.Core/Csv/CsvRecordTypeMap.cs +++ b/Source/Tx.Core/Csv/CsvRecordTypeMap.cs @@ -42,7 +42,7 @@ public Func GetTransform(Type outputType) { if (outputType == null) { - throw new ArgumentNullException("outputType"); + throw new ArgumentNullException(nameof(outputType)); } KeyValuePair> value; diff --git a/Source/Tx.Core/CustomAttributeProviderExtensions.cs b/Source/Tx.Core/CustomAttributeProviderExtensions.cs deleted file mode 100644 index 218a838b..00000000 --- a/Source/Tx.Core/CustomAttributeProviderExtensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -namespace System.Reactive -{ - public static class CustomAttributeProviderExtensions - { - public static TAttribute GetAttribute(this ICustomAttributeProvider provider) - { - object[] attributes = provider.GetCustomAttributes(typeof (TAttribute), false); - if (attributes.Length == 0) - return default(TAttribute); - - return (TAttribute) attributes[0]; - } - - public static IEnumerable GetAttributes(this ICustomAttributeProvider provider) - { - return (provider.GetCustomAttributes(typeof (TAttribute), false)).Cast(); - } - } -} \ No newline at end of file diff --git a/Source/Tx.Core/Demultiplexor.cs b/Source/Tx.Core/Demultiplexor.cs index 40ba7502..873e61d5 100644 --- a/Source/Tx.Core/Demultiplexor.cs +++ b/Source/Tx.Core/Demultiplexor.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Reactive.Disposables; using System.Reactive.Subjects; +using System.Reflection; namespace System.Reactive { @@ -82,16 +83,16 @@ public IObservable GetObservable() return output; } - private List GetTypes(Type inputType) + private static List GetTypes(Type inputType) { var typeList = new List(); var temp = inputType; while (temp != typeof(object)) { typeList.Add(temp); - temp = temp.BaseType; + temp = temp.GetTypeInfo().BaseType; } - typeList.AddRange(inputType.GetInterfaces()); + typeList.AddRange(inputType.GetTypeInfo().ImplementedInterfaces); return typeList; } @@ -106,7 +107,7 @@ private void RefreshKnownOutputMappings(Type outputType) } } - private class OutputSubject : ISubject, IDisposable + private sealed class OutputSubject : ISubject, IDisposable { private readonly Subject _subject; private int _refcount; diff --git a/Source/Tx.Core/Internal/BufferQueue.cs b/Source/Tx.Core/Internal/BufferQueue.cs index ebf00574..0ee272d3 100644 --- a/Source/Tx.Core/Internal/BufferQueue.cs +++ b/Source/Tx.Core/Internal/BufferQueue.cs @@ -6,7 +6,7 @@ namespace System.Reactive { - internal class BufferQueue : IObserver, IEnumerator + internal sealed class BufferQueue : IObserver, IEnumerator { private readonly BlockingCollection _queue = new BlockingCollection(); private T _current; diff --git a/Source/Tx.Core/Internal/Pump.cs b/Source/Tx.Core/Internal/Pump.cs index adf26063..22041dad 100644 --- a/Source/Tx.Core/Internal/Pump.cs +++ b/Source/Tx.Core/Internal/Pump.cs @@ -2,14 +2,15 @@ using System.Collections.Generic; using System.Threading; +using System.Threading.Tasks; namespace System.Reactive { - internal class OutputPump : IDisposable + internal sealed class OutputPump : IDisposable { private readonly IEnumerator _source; private readonly IObserver _target; - private readonly Thread _thread; + private readonly Task _thread; private readonly WaitHandle _waitStart; private long _eventsRead; @@ -17,9 +18,8 @@ public OutputPump(IEnumerable source, IObserver target, WaitHandle waitSta { _source = source.GetEnumerator(); _target = target; - _waitStart = waitStart; - _thread = new Thread(ThreadProc) {Name = "Pump " + typeof (T).Name}; - _thread.Start(); + _waitStart = waitStart; + _thread = Task.Run((Action)ThreadProc); } public void Dispose() diff --git a/Source/Tx.Core/PassthroughTransformBuilder.cs b/Source/Tx.Core/PassthroughTransformBuilder.cs index 29fea33f..66668eb2 100644 --- a/Source/Tx.Core/PassthroughTransformBuilder.cs +++ b/Source/Tx.Core/PassthroughTransformBuilder.cs @@ -1,4 +1,6 @@ -namespace Tx.Core +using System.Reflection; + +namespace Tx.Core { using System; using System.Reactive; @@ -7,7 +9,7 @@ public class PassthroughTransformBuilder : ITransformBuilder { public Func Build() { - if (typeof(IEnvelope).IsAssignableFrom(typeof(TIn))) + if (typeof(IEnvelope).GetTypeInfo().IsAssignableFrom(typeof(TIn).GetTypeInfo())) { return Transform; } diff --git a/Source/Tx.Core/PlaybackConfigurationExtensions.cs b/Source/Tx.Core/PlaybackConfigurationExtensions.cs index 719a5619..62e51b4b 100644 --- a/Source/Tx.Core/PlaybackConfigurationExtensions.cs +++ b/Source/Tx.Core/PlaybackConfigurationExtensions.cs @@ -17,12 +17,12 @@ public static void AddInput(this IPlaybackConfiguration playbackConfiguration, I { if (playbackConfiguration == null) { - throw new ArgumentNullException("playbackConfiguration"); + throw new ArgumentNullException(nameof(playbackConfiguration)); } if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } playbackConfiguration @@ -47,22 +47,22 @@ public static void AddCsvInput( { if (playback == null) { - throw new ArgumentNullException("playback"); + throw new ArgumentNullException(nameof(playback)); } if (transformation == null) { - throw new ArgumentNullException("transformation"); + throw new ArgumentNullException(nameof(transformation)); } if (timestampSelector == null) { - throw new ArgumentNullException("timestampSelector"); + throw new ArgumentNullException(nameof(timestampSelector)); } if (files == null) { - throw new ArgumentNullException("files"); + throw new ArgumentNullException(nameof(files)); } AddCsvInput(playback, ',', 0, transformation, timestampSelector, files); @@ -88,22 +88,22 @@ public static void AddCsvInput( { if (playback == null) { - throw new ArgumentNullException("playback"); + throw new ArgumentNullException(nameof(playback)); } if (transformation == null) { - throw new ArgumentNullException("transformation"); + throw new ArgumentNullException(nameof(transformation)); } if (timestampSelector == null) { - throw new ArgumentNullException("timestampSelector"); + throw new ArgumentNullException(nameof(timestampSelector)); } if (files == null) { - throw new ArgumentNullException("files"); + throw new ArgumentNullException(nameof(files)); } playback.AddInput( @@ -119,11 +119,11 @@ public static IObservable OfType( { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } if (typeMaps == null) { - throw new ArgumentNullException("typeMaps"); + throw new ArgumentNullException(nameof(typeMaps)); } return Observable diff --git a/Source/Tx.Core/Properties/Tx.All.Layout.cmd b/Source/Tx.Core/Properties/Tx.All.Layout.cmd deleted file mode 100644 index bc800b87..00000000 --- a/Source/Tx.Core/Properties/Tx.All.Layout.cmd +++ /dev/null @@ -1,2 +0,0 @@ -rd /s/q Tx.All -md Tx.All diff --git a/Source/Tx.Core/Properties/Tx.Core.Layout.cmd b/Source/Tx.Core/Properties/Tx.Core.Layout.cmd deleted file mode 100644 index abf510be..00000000 --- a/Source/Tx.Core/Properties/Tx.Core.Layout.cmd +++ /dev/null @@ -1,6 +0,0 @@ -rd /s/q Tx.Core - -md Tx.Core\lib\Net45 -copy Net45\Tx.Core.dll Tx.Core\lib\Net45 -copy Net45\Tx.Core.xml Tx.Core\lib\Net45 -copy Net45\Tx.Core.pdb Tx.Core\lib\Net45 diff --git a/Source/Tx.Core/Properties/Tx.Core.nuspec b/Source/Tx.Core/Properties/Tx.Core.nuspec deleted file mode 100644 index df3f02fa..00000000 --- a/Source/Tx.Core/Properties/Tx.Core.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - - Tx.Core - Tx.Core - - {version} - Tx (LINQ to Logs and Traces) core components, not specific to the event format - Microsoft - Copyright © Microsoft. All Rights Reserved - - http://tx.codeplex.com - http://tx.codeplex.com/license - - en-us - Tx Traces Logs Playback Replay XEvent ETW - false - - - - - \ No newline at end of file diff --git a/Source/Tx.Core/PullMergeSort.cs b/Source/Tx.Core/PullMergeSort.cs index 2bd5edb3..546a791f 100644 --- a/Source/Tx.Core/PullMergeSort.cs +++ b/Source/Tx.Core/PullMergeSort.cs @@ -120,7 +120,7 @@ private Reader FindStreamToRead() } } - private class Reader : IDisposable + private sealed class Reader : IDisposable { private readonly IEnumerator _enumerator; private bool _isCompleted; diff --git a/Source/Tx.Core/StringExtensions.cs b/Source/Tx.Core/StringExtensions.cs index 6348f227..90d8db1b 100644 --- a/Source/Tx.Core/StringExtensions.cs +++ b/Source/Tx.Core/StringExtensions.cs @@ -6,7 +6,7 @@ public static class StringExtensions { public static string GetSubstring(this string source, string startMarker, string endMarker) { - int startIndex = source.IndexOf(startMarker, StringComparison.InvariantCulture); + int startIndex = source.IndexOf(startMarker, StringComparison.Ordinal); int begin = startIndex + startMarker.Length; string result; @@ -16,7 +16,7 @@ public static string GetSubstring(this string source, string startMarker, string } else { - int end = source.IndexOf(endMarker, begin, StringComparison.InvariantCulture); + int end = source.IndexOf(endMarker, begin, StringComparison.Ordinal); result = source.Substring(begin, end - begin); } diff --git a/Source/Tx.Core/TimeSource.cs b/Source/Tx.Core/TimeSource.cs index 783abc1e..262ba9b3 100644 --- a/Source/Tx.Core/TimeSource.cs +++ b/Source/Tx.Core/TimeSource.cs @@ -34,7 +34,7 @@ public TimeSource( Func timeFunction) { if (timeFunction == null) - throw new ArgumentNullException("timeFunction"); + throw new ArgumentNullException(nameof(timeFunction)); _source = source; _scheduler = new TimeSegmentScheduler(); diff --git a/Source/Tx.Core/Tx.Core.csproj b/Source/Tx.Core/Tx.Core.csproj index 890c2b8d..d3f57a0b 100644 --- a/Source/Tx.Core/Tx.Core.csproj +++ b/Source/Tx.Core/Tx.Core.csproj @@ -1,117 +1,32 @@  - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F} - Library - Properties - System.Reactive - Tx.Core - 512 - - - - - ..\..\References\$(BuildFlavor) - - - $(OutputPath)\$(AssemblyName).XML + netcoreapp1.1;net45 + True + ..\key.snk + False + True + Tx (LINQ to Logs and Traces) core components, not specific to the event format + https://github.com/Microsoft/Tx/blob/master/license.txt + https://github.com/Microsoft/Tx/ + Copyright © Microsoft. All Rights Reserved + Microsoft + Microsoft + Tx Traces Logs Playback Replay + git + https://github.com/Microsoft/Tx.git + 2.1.1 - - true + + bin\Release\netcoreapp1.1\.xml - - ..\key.snk + + bin\Release\net45\.xml - - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - - - - Properties\AssemblyInfo.cs - Always - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - Properties\key.snk - - - Always - - - Always - Designer - - - Always - - - Always - Designer - + - - - \ No newline at end of file diff --git a/Source/Tx.Core/TypeIdentifierHelpers.cs b/Source/Tx.Core/TypeIdentifierHelpers.cs index 1b8b7a9e..bcc24dfe 100644 --- a/Source/Tx.Core/TypeIdentifierHelpers.cs +++ b/Source/Tx.Core/TypeIdentifierHelpers.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; + using System.Reflection; public static class TypeIdentifierHelpers { @@ -38,7 +39,7 @@ public static string GetTypeIdentifier(this object instance) { if (instance == null) { - throw new ArgumentNullException("instance"); + throw new ArgumentNullException(nameof(instance)); } var type = instance.GetType(); @@ -58,10 +59,10 @@ public static string GetTypeIdentifier(this Type type) { if (type == null) { - throw new ArgumentNullException("type"); + throw new ArgumentNullException(nameof(type)); } - var bondMapAttribute = ((GuidAttribute[])type.GetCustomAttributes(typeof(GuidAttribute), false)) + var bondMapAttribute = ((GuidAttribute[])type.GetTypeInfo().GetCustomAttributes(typeof(GuidAttribute), false)) .FirstOrDefault(); if (bondMapAttribute != null && diff --git a/Source/Tx.Core/TypeMap/LambdaTypeMap.cs b/Source/Tx.Core/TypeMap/LambdaTypeMap.cs index 005e623f..147f735b 100644 --- a/Source/Tx.Core/TypeMap/LambdaTypeMap.cs +++ b/Source/Tx.Core/TypeMap/LambdaTypeMap.cs @@ -10,7 +10,7 @@ public LambdaTypeMap(Func timestampSelector) { if (timestampSelector == null) { - throw new ArgumentNullException("timestampSelector"); + throw new ArgumentNullException(nameof(timestampSelector)); } this._timestampSelector = timestampSelector; diff --git a/Source/Tx.Core/TypeMap/PartitionableContravariantTypeMap.cs b/Source/Tx.Core/TypeMap/PartitionableContravariantTypeMap.cs index 35f796c4..794b076e 100644 --- a/Source/Tx.Core/TypeMap/PartitionableContravariantTypeMap.cs +++ b/Source/Tx.Core/TypeMap/PartitionableContravariantTypeMap.cs @@ -4,6 +4,7 @@ namespace System.Reactive { using System; using System.Collections.Generic; + using System.Reflection; public sealed class PartitionableContravariantTypeMap : IPartitionableTypeMap, Type> { @@ -35,9 +36,9 @@ public Type GetInputKey(Timestamped evt) } var type = evt.Value.GetType(); - while (type.BaseType != _objectType && type.BaseType != typeof(ValueType)) + while (type.GetTypeInfo().BaseType != _objectType && type.GetTypeInfo().BaseType != typeof(ValueType)) { - type = type.BaseType; + type = type.GetTypeInfo().BaseType; } return type; diff --git a/Source/Tx.Core/TypeOccurenceStatistics.cs b/Source/Tx.Core/TypeOccurenceStatistics.cs index b71cd147..727e75b6 100644 --- a/Source/Tx.Core/TypeOccurenceStatistics.cs +++ b/Source/Tx.Core/TypeOccurenceStatistics.cs @@ -5,6 +5,7 @@ using System.Linq.Expressions; using System.Reactive.Subjects; using System.Threading; +using System.Reflection; namespace System.Reactive { @@ -58,11 +59,11 @@ public void AddInput( foreach (var mapInstance in typeMaps) { - Type mapInterface = mapInstance.GetType().GetInterface(typeof(IPartitionableTypeMap<,>).Name); + Type mapInterface = mapInstance.GetType().GetTypeInfo().ImplementedInterfaces.FirstOrDefault(i => i.Name == typeof(IPartitionableTypeMap<,>).Name); if (mapInterface == null) continue; Type aggregatorType = - typeof (TypeOccurenceAggregator<,>).MakeGenericType(mapInterface.GetGenericArguments()); + typeof (TypeOccurenceAggregator<,>).MakeGenericType(mapInterface.GenericTypeArguments); object aggregatorInstance = Activator.CreateInstance(aggregatorType, mapInstance, _availableTypes); _aggregators.Add((TypeOccurenceAggregator) aggregatorInstance); diff --git a/Source/Tx.LinqPad/ParserRegistry.cs b/Source/Tx.LinqPad/ParserRegistry.cs index f06a2aa2..7ed72b9f 100644 --- a/Source/Tx.LinqPad/ParserRegistry.cs +++ b/Source/Tx.LinqPad/ParserRegistry.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +using LINQPad.Extensibility.DataContext; using Microsoft.SqlServer.XEvent; using System; using System.Collections.Generic; @@ -21,20 +22,20 @@ public ParserRegistry() string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); IEnumerable types = from file in Directory.GetFiles(dir, "Tx*.dll") - from t in Assembly.LoadFrom(file).GetTypes() + from t in DataContextDriver.LoadAssemblySafely(file).GetTypes() where t.IsPublic select t; IEnumerable methods = from t in types from m in t.GetMethods() - where m.GetAttribute() != null + where m.GetCustomAttribute() != null select m; _addFiles = methods.ToArray(); methods = from t in types from m in t.GetMethods() - where m.GetAttribute() != null + where m.GetCustomAttribute() != null select m; _addSessions = methods.ToArray(); @@ -45,7 +46,7 @@ public string Filter get { FileParserAttribute[] attributes = (from mi in _addFiles - select mi.GetAttribute()).ToArray(); + select mi.GetCustomAttribute()).ToArray(); var sb = new StringBuilder("All Files|"); foreach (string ext in attributes.SelectMany(a => a.Extensions)) @@ -122,7 +123,7 @@ public void AddFiles(IPlaybackConfiguration playback, string[] files) foreach (string ext in filesByExtension.Keys) { MethodInfo addMethod = (from mi in _addFiles - where mi.GetAttribute().Extensions.Contains(ext) + where mi.GetCustomAttribute().Extensions.Contains(ext) select mi).FirstOrDefault(); addMethod.Invoke(null, new object[] {playback, filesByExtension[ext].ToArray()}); diff --git a/Source/Tx.LinqPad/Tx.LinqPad.csproj b/Source/Tx.LinqPad/Tx.LinqPad.csproj index bee2e992..bbcb2cb4 100644 --- a/Source/Tx.LinqPad/Tx.LinqPad.csproj +++ b/Source/Tx.LinqPad/Tx.LinqPad.csproj @@ -1,73 +1,56 @@  - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {3326CF58-CDA1-4514-BADD-465F4CEDAF50} - Library - Properties - Tx.LinqPad - Tx.LinqPad - 512 - v4.5 - - - - false - - - false - - - - ..\..\References\$(BuildFlavor) + net46 + True + ..\key.snk + 2.1.1 - - true + + x86 - - ..\key.snk + + x86 + + + + ConnectionDialog.xaml + + + MSBuild:Compile + Designer + + + + + + + + + ..\..\References\LinqPad\LINQPad.exe - False ..\..\References\XEvent\Microsoft.SqlServer.XE.Core.dll - False ..\..\References\XEvent\Microsoft.SqlServer.XEvent.dll - - False + ..\..\References\XEvent\Microsoft.SqlServer.XEvent.Linq.dll - False ..\..\References\XEvent\Microsoft.SqlServer.XEvent.Targets.dll - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - $(CPReferencePath)\System.Reactive.Windows.Forms.dll + ..\..\References\DESKTOPCLR45\System.Reactive.Windows.Forms.dll @@ -78,100 +61,46 @@ - - Properties\AssemblyInfo.cs - - - ConnectionDialog.xaml - - - - - - - - - MSBuild:Compile - Designer - + + PreserveNewest + - + + HTTP_Server.etl + PreserveNewest + + HTTP_Server.man - Always - - + PreserveNewest + + BasicPerfCounters.blg - Always - - - HTTP_Server.etl - Always - - + PreserveNewest + + CrossMachineHTTP.etl - Always - - + PreserveNewest + + CrossMachineIE.etl - Always - - + PreserveNewest + + IE_Client.man - Always - - + PreserveNewest + + sqltrace.xel - Always - - - Microsoft.Windows.ApplicationServer.Applications.manifest - Always - - - SampleWcfTrace.etl - Always - - - devsetup.cmd + PreserveNewest - - Properties\key.snk + + Microsoft.Windows.ApplicationServer.Applications.man + PreserveNewest + + + SampleWcfTrace.etl + PreserveNewest - - - Designer - Always - - - - - {8892848f-45a1-46ac-a686-6a25eec1475b} - Tx.SqlServer - - - {A4517ABD-D558-42F3-8FE4-2A6BA3074014} - Tx.Windows.TypeGeneration - - - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F} - Tx.Core - - - - - $(SolutionDir)devsetup.cmd $(SolutionDir) - - - - - - \ No newline at end of file diff --git a/Source/Tx.LinqPad/TxDataContextDriver.cs b/Source/Tx.LinqPad/TxDataContextDriver.cs index e6a49957..2815c8d8 100644 --- a/Source/Tx.LinqPad/TxDataContextDriver.cs +++ b/Source/Tx.LinqPad/TxDataContextDriver.cs @@ -133,8 +133,19 @@ public override string GetConnectionDescription(IConnectionInfo cxInfo) public override bool ShowConnectionDialog(IConnectionInfo cxInfo, bool isNewConnection) { - var properties = new TxProperties(cxInfo); - return new ConnectionDialog(properties, _parserRegistry.Filter).ShowDialog() ?? false; + try + { + var properties = new TxProperties(cxInfo); + return new ConnectionDialog(properties, _parserRegistry.Filter).ShowDialog() ?? false; + } + catch (Exception error) + { + TxEventSource.Log.TraceError(error.ToString()); + + MessageBox.Show(error.ToString(), "ShowConnectionDialog"); + + return false; + } } public override ParameterDescriptor[] GetContextConstructorParameters(IConnectionInfo cxInfo) @@ -301,19 +312,26 @@ public override void OnQueryFinishing(IConnectionInfo cxInfo, object context, Qu private static Assembly AssemblyResolve(object sender, ResolveEventArgs args) { - string assemblyname = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll"; - string driverDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - IEnumerable assemblies = Directory.EnumerateFiles(driverDir, assemblyname); - foreach (string path in assemblies) + try { - return Assembly.LoadFrom(path); - } + string assemblyname = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll"; + string driverDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + IEnumerable assemblies = Directory.EnumerateFiles(driverDir, assemblyname); + foreach (string path in assemblies) + { + return DataContextDriver.LoadAssemblySafely(path); + } - string root = Path.Combine(Path.GetTempPath(), @"LINQPad\"); - assemblies = Directory.EnumerateFiles(root, assemblyname, SearchOption.AllDirectories); - foreach (string path in assemblies) + string root = Path.Combine(Path.GetTempPath(), @"LINQPad\"); + assemblies = Directory.EnumerateFiles(root, assemblyname, SearchOption.AllDirectories); + foreach (string path in assemblies) + { + return DataContextDriver.LoadAssemblySafely(path); + } + } + catch (Exception error) { - return Assembly.LoadFrom(path); + TxEventSource.Log.TraceError(error.ToString()); } return null; diff --git a/Source/Tx.LinqPad/TxEventSource.cs b/Source/Tx.LinqPad/TxEventSource.cs new file mode 100644 index 00000000..03f9e7d8 --- /dev/null +++ b/Source/Tx.LinqPad/TxEventSource.cs @@ -0,0 +1,31 @@ +using System.Diagnostics.Tracing; +using System.Runtime.CompilerServices; + +namespace Tx.LinqPad +{ + [EventSource(Name = "Microsoft-Tx-LinqpadDriver")] + public sealed class TxEventSource : EventSource + { + public static readonly TxEventSource Log = new TxEventSource(); + + public class Keywords + { + public const EventKeywords Debug = ((EventKeywords)(1)); + + public const EventKeywords Perf = ((EventKeywords)(2)); + + public const EventKeywords Telemetry = ((EventKeywords)(4)); + + public const EventKeywords Auditing = ((EventKeywords)(8)); + } + + [Event(1, Level = EventLevel.Error, Keywords = Keywords.Debug, Message = "File: {0} Method: {1}, Exception: {2}")] + public void TraceError(string exception, [CallerFilePath] string fileName = null, [CallerMemberName] string methodName = null) + { + if (this.IsEnabled()) + { + this.WriteEvent(1, fileName, methodName, exception); + } + } + } +} diff --git a/Source/Tx.LinqPad/TypeCache.cs b/Source/Tx.LinqPad/TypeCache.cs index 2cc22fa7..6608893c 100644 --- a/Source/Tx.LinqPad/TypeCache.cs +++ b/Source/Tx.LinqPad/TypeCache.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +using LINQPad.Extensibility.DataContext; using Microsoft.SqlServer.XEvent; using System; using System.Collections.Generic; @@ -75,7 +76,7 @@ public void BuildCache(string targetDir, string[] traces, string[] metadaFiles) { s = ManifestParser.Parse(manifest); } - catch (XmlException ex) + catch (XmlException) { // if one manifest is bad, we should still see the other events string err = String.Format( @@ -147,7 +148,7 @@ public string[] GetAssemblies(string targetDir, string[] traces, string[] metada public Type[] GetAvailableTypes(string targetDir, string[] traces, string[] metadaFiles) { Assembly[] assemblies = (from file in GetAssemblies(targetDir, traces, metadaFiles) - select Assembly.LoadFrom(file)).ToArray(); + select DataContextDriver.LoadAssemblySafely(file)).ToArray(); var types = (from a in assemblies from t in a.GetTypes() diff --git a/Source/Tx.Network/Pcap/PcapNgWriter.cs b/Source/Tx.Network/Pcap/PcapNgWriter.cs index 4b7ae3a5..e63eb2f6 100644 --- a/Source/Tx.Network/Pcap/PcapNgWriter.cs +++ b/Source/Tx.Network/Pcap/PcapNgWriter.cs @@ -74,7 +74,7 @@ public void Dispose() if (this.stream != null) { this.stream.Flush(); - this.stream.Close(); + this.stream.Dispose(); this.stream = null; } } diff --git a/Source/Tx.Network/Properties/Tx.Network.Layout.cmd b/Source/Tx.Network/Properties/Tx.Network.Layout.cmd deleted file mode 100644 index 7c929e86..00000000 --- a/Source/Tx.Network/Properties/Tx.Network.Layout.cmd +++ /dev/null @@ -1,6 +0,0 @@ -rd /s/q Tx.Network - -md Tx.Network\lib\Net45 -copy Net45\Tx.Network.dll Tx.Network\lib\Net45 -copy Net45\Tx.Network.xml Tx.Network\lib\Net45 -copy Net45\Tx.Network.pdb Tx.Network\lib\Net45 diff --git a/Source/Tx.Network/Properties/Tx.Network.nuspec b/Source/Tx.Network/Properties/Tx.Network.nuspec deleted file mode 100644 index 0f3bf199..00000000 --- a/Source/Tx.Network/Properties/Tx.Network.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - - Tx.Network - Tx.Network - - {version}-beta7 - Parsing of Network related file and wire formats, such as .pcap and .pcapng, UDP datagrams, Syslog and SNMP messages. - Microsoft - Copyright © Microsoft. All Rights Reserved - - http://tx.codeplex.com - http://tx.codeplex.com/license - - en-us - Tx Playback Replay Pcap PcapNG Snmp Syslog - false - - - - - \ No newline at end of file diff --git a/Source/Tx.Network/Properties/TxNetworkAssemblyInfo.cs b/Source/Tx.Network/Properties/TxNetworkAssemblyInfo.cs index e93a4efd..f56413e1 100644 --- a/Source/Tx.Network/Properties/TxNetworkAssemblyInfo.cs +++ b/Source/Tx.Network/Properties/TxNetworkAssemblyInfo.cs @@ -1,2 +1,2 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Tests.Tx,PublicKey=0024000004800000940000000602000000240000525341310004000001000100517789c13e6805dc176aa2ac748fe291fdc43357c7a6f5044a2d979e8c51baf27fe7ce2dc23b2f06e10dc6d2bbd460bf3756d0d2208b12708e5dd9498493b882e7869cf2e3e48c4b7bc758ae4f882835c559a4082a11051cbf74ddf36e8272fdde45e3da6ec2fea577b6e21f27b45a02f6a5b2d358c4a0fa60ed1407a2bc96cc")] +[assembly: InternalsVisibleTo("Tx.Network.Tests,PublicKey=0024000004800000940000000602000000240000525341310004000001000100517789c13e6805dc176aa2ac748fe291fdc43357c7a6f5044a2d979e8c51baf27fe7ce2dc23b2f06e10dc6d2bbd460bf3756d0d2208b12708e5dd9498493b882e7869cf2e3e48c4b7bc758ae4f882835c559a4082a11051cbf74ddf36e8272fdde45e3da6ec2fea577b6e21f27b45a02f6a5b2d358c4a0fa60ed1407a2bc96cc")] diff --git a/Source/Tx.Network/Snmp/Dynamic/TrapTypeMap.cs b/Source/Tx.Network/Snmp/Dynamic/TrapTypeMap.cs index e979e106..29a8ddee 100644 --- a/Source/Tx.Network/Snmp/Dynamic/TrapTypeMap.cs +++ b/Source/Tx.Network/Snmp/Dynamic/TrapTypeMap.cs @@ -36,7 +36,7 @@ public Func GetTransform(Type outputType) public ObjectIdentifier GetTypeKey(Type outputType) { - var attribute = outputType.GetAttribute(); + var attribute = outputType.GetTypeInfo().GetCustomAttribute(); return attribute?.SnmpTrapOid ?? default(ObjectIdentifier); } @@ -117,7 +117,7 @@ internal static Func CreateTransform(Type outputTrapType) var foundValue = Expression.Call(getVarBindMethod, Expression.Property(parameter, pduVarBindsField), Expression.Constant(notificationObjectIdentifier.Oid), varbindVar); Expression convertedValue = Expression.Field(varbindVar, varbindValueField); - if (p.PropertyType.IsEnum || typeof(int).IsAssignableFrom(p.PropertyType)) + if (p.PropertyType.GetTypeInfo().IsEnum || typeof(int).IsAssignableFrom(p.PropertyType)) { convertedValue = Expression.Convert(convertedValue, typeof(long)); } diff --git a/Source/Tx.Network/Syslogs/Syslog.cs b/Source/Tx.Network/Syslogs/Syslog.cs index 7f2882d3..1131805e 100644 --- a/Source/Tx.Network/Syslogs/Syslog.cs +++ b/Source/Tx.Network/Syslogs/Syslog.cs @@ -1,7 +1,6 @@ namespace Tx.Network.Syslogs { using System; - using System.Collections.Generic; using System.Text; /// @@ -33,12 +32,7 @@ public class Syslog /// Facility of the Syslog provided from the PRIVAL field. /// public Facility LogFacility { get; private set; } - - /// - /// Collection of regular expression matches. - /// - public IReadOnlyDictionary NamedCollectedMatches { get; private set; } - + /// /// Creates a default instance of the Log object. /// @@ -47,33 +41,22 @@ public Syslog( string sourceIpAddress, Severity severity, Facility facility, - string message, - IReadOnlyDictionary namedCollectedMatches) + string message) { this.ReceivedTime = receivedTime; this.SourceIpAddress = sourceIpAddress; this.LogSeverity = severity; this.LogFacility = facility; this.Message = message; - this.NamedCollectedMatches = namedCollectedMatches; + } public override string ToString() { var sb = new StringBuilder(); - sb.AppendLine(); - - if (this.NamedCollectedMatches != null) - { - foreach (var c in this.NamedCollectedMatches) - { - sb.AppendFormat(c.Key).Append(", "); - sb.AppendLine(c.Value); - sb.AppendLine(); - } - } - + sb.AppendFormat("Received Time: {0}; Source IP: {1}; Severity: {2}; Facility: {3}; Message: {4}", ReceivedTime, SourceIpAddress, LogSeverity, LogFacility, Message); + return sb.ToString(); } } diff --git a/Source/Tx.Network/Syslogs/SyslogListener.cs b/Source/Tx.Network/Syslogs/SyslogListener.cs index c3c4d8e2..32ada743 100644 --- a/Source/Tx.Network/Syslogs/SyslogListener.cs +++ b/Source/Tx.Network/Syslogs/SyslogListener.cs @@ -6,8 +6,6 @@ public class SyslogListener : BaseUdpReceiver { - private readonly SyslogParser syslogParser = new SyslogParser(); - public SyslogListener(IPEndPoint listenEndPoint, uint concurrentReceivers) : base(listenEndPoint, concurrentReceivers) { @@ -32,7 +30,7 @@ protected override bool TryParse(IpPacket packet, out IEnvelope envelope) try { - syslog = this.syslogParser.Parse( + syslog = SyslogParser.Parse( upacket.UdpData, upacket.ReceivedTime, upacket.PacketHeader.SourceIpAddress.ToString()); diff --git a/Source/Tx.Network/Syslogs/SyslogParser.cs b/Source/Tx.Network/Syslogs/SyslogParser.cs index ac076986..4bb05857 100644 --- a/Source/Tx.Network/Syslogs/SyslogParser.cs +++ b/Source/Tx.Network/Syslogs/SyslogParser.cs @@ -1,47 +1,22 @@ namespace Tx.Network.Syslogs { using System; - using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using Tx.Network; - public class SyslogParser + public static class SyslogParser { public static readonly Regex DefaultParser = new Regex( @"\<(?\d+?)\>\s*(?.+)", RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Compiled); - private readonly Regex parser; - - private readonly string[] groupNames; - - private readonly bool usingOnlyDefaultParser; - - public SyslogParser() - : this(DefaultParser) + public static Syslog Parse(IUdpDatagram receivedPacket) { - this.usingOnlyDefaultParser = true; + return Parse(receivedPacket.Data.AsByteArraySegment(), receivedPacket.ReceivedTime, receivedPacket.PacketHeader.SourceIpAddress.ToString()); } - public SyslogParser(Regex parser) - { - if (parser == null) - { - throw new ArgumentNullException("parser"); - } - - this.parser = parser; - this.groupNames = parser.GetGroupNames(); - - } - - public Syslog Parse(IUdpDatagram receivedPacket) - { - return this.Parse(receivedPacket.Data.AsByteArraySegment(), receivedPacket.ReceivedTime, receivedPacket.PacketHeader.SourceIpAddress.ToString()); - } - - public Syslog Parse(ArraySegment segment, DateTimeOffset receivedTime, string sourceIpAddress) + public static Syslog Parse(ArraySegment segment, DateTimeOffset receivedTime, string sourceIpAddress) { if (segment.Array == null) { @@ -55,10 +30,8 @@ public Syslog Parse(ArraySegment segment, DateTimeOffset receivedTime, str throw new ArgumentException("Incoming UDP datagram contained no Syslog data."); } - var defMatch = DefaultParser.Match(logMessage); - - + if (!defMatch.Success) { throw new ArgumentException("Cannot parse the incoming UDP datagram."); @@ -78,33 +51,11 @@ public Syslog Parse(ArraySegment segment, DateTimeOffset receivedTime, str } var prival = int.Parse(privalMatch); - var severity = (Severity)Enum.ToObject(typeof(Severity), prival & 0x7); - var facility = (Facility)Enum.ToObject(typeof(Facility), prival >> 3); + var severity = (Severity)(prival & 0x7); + var facility = (Facility)(prival >> 3); var message = defMatch.Groups["MESSAGE"].Value.Trim(); - - Match customMatch; - if (this.usingOnlyDefaultParser) - { - customMatch = defMatch; - } - else - { - customMatch = this.parser.Match(logMessage); - } - - var matches = new Dictionary(StringComparer.OrdinalIgnoreCase); - - foreach (var groupName in this.groupNames) - { - var group = customMatch.Groups[groupName]; - - if (group.Success && !string.IsNullOrEmpty(group.Value)) - { - matches[groupName] = group.Value; - } - } - - return new Syslog(receivedTime, sourceIpAddress, severity, facility, message, matches); + + return new Syslog(receivedTime, sourceIpAddress, severity, facility, message); } } } \ No newline at end of file diff --git a/Source/Tx.Network/Tx.Network.csproj b/Source/Tx.Network/Tx.Network.csproj index 13b0b1bc..2cab3d16 100644 --- a/Source/Tx.Network/Tx.Network.csproj +++ b/Source/Tx.Network/Tx.Network.csproj @@ -1,155 +1,28 @@  - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA} - Library - Properties - Tx.Network - Tx.Network - 512 - - - - - ..\..\References\$(BuildFlavor) - - - $(OutputPath)\$(AssemblyName).XML + netcoreapp1.1;net45 + Parsing of Network related file and wire formats, such as .pcap and .pcapng, UDP datagrams, Syslog and SNMP messages. + Tx Playback Replay Pcap PcapNG Snmp Syslog + Copyright © Microsoft. All Rights Reserved + Microsoft + Microsoft + https://github.com/Microsoft/Tx/blob/master/license.txt + https://github.com/Microsoft/Tx/ + https://github.com/Microsoft/Tx.git + git + True + True + ..\key.snk + 2.1.1 - - true + + bin\Release\netcoreapp1.1\.xml - - ..\key.snk + + bin\Release\net45\.xml - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - - - - Properties\AssemblyInfo.cs - Always - - - - - - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - Code - - - Code - - - Code - - - - - - - - - - - Code - - - Code - - - - - Code - - - - - - - - - - - - - - - Properties\key.snk - - - Always - - - Always - Designer - - - - - {c5cc33b0-1684-4dd4-83a5-5da4a9a25a7f} - Tx.Core - + - - \ No newline at end of file diff --git a/Source/Tx.Network/Udp/BaseUdpReceiver.cs b/Source/Tx.Network/Udp/BaseUdpReceiver.cs index b6144a09..d6707302 100644 --- a/Source/Tx.Network/Udp/BaseUdpReceiver.cs +++ b/Source/Tx.Network/Udp/BaseUdpReceiver.cs @@ -107,7 +107,7 @@ private void ReceiveCompletedHandler(object caller, SocketAsyncEventArgs socketA if (!this.disposeCalled) { this.GetDataProcessorAndReceive(); //call a new processor - //var packet = new IP(socketArgs.Buffer); + T packet; var ipPacket = PacketParser.Parse(DateTimeOffset.UtcNow, false, socketArgs.Buffer, 0, socketArgs.Buffer.Length); diff --git a/Source/Tx.SqlServer/Properties/Tx.SqlServer.Layout.cmd b/Source/Tx.SqlServer/Properties/Tx.SqlServer.Layout.cmd deleted file mode 100644 index 8995876a..00000000 --- a/Source/Tx.SqlServer/Properties/Tx.SqlServer.Layout.cmd +++ /dev/null @@ -1,26 +0,0 @@ -rd /s/q Tx.SqlServer - -md Tx.SqlServer\lib\Net45 - -call :copy Tx.SqlServer.dll -call :copy Tx.SqlServer.xml -call :copy Tx.SqlServer.pdb -call :copy Microsoft.SqlServer.XEvent.dll -call :copy Microsoft.SqlServer.XE.Core.dll -call :copy Microsoft.SqlServer.XEvent.Configuration.dll -call :copy Microsoft.SqlServer.XEvent.Linq.dll -call :copy Microsoft.SqlServer.XEvent.Targets.dll - -md Tx.SqlServer\content -copy Net45\xe.dll Tx.SqlServer\content\ -copy Net45\msvcr100.dll Tx.SqlServer\content\ - -goto end - -:copy -copy Net45\%1 Tx.SqlServer\lib\Net45\ -exit /b 0 - -:end -exit /b 0 - diff --git a/Source/Tx.SqlServer/Properties/Tx.SqlServer.nuspec b/Source/Tx.SqlServer/Properties/Tx.SqlServer.nuspec deleted file mode 100644 index 5ab0059e..00000000 --- a/Source/Tx.SqlServer/Properties/Tx.SqlServer.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - - Tx.SqlServer - Tx.SqlServer - - {version} - Tx (LINQ to Logs and Traces) components for SQL Server. So far, this incldes Extended Events (XEvent) - Microsoft - Copyright © Microsoft. All Rights Reserved - - http://tx.codeplex.com - http://tx.codeplex.com/license - - en-us - Tx Traces Logs Playback Replay XEvent - false - - - - - \ No newline at end of file diff --git a/Source/Tx.SqlServer/Tx.SqlServer.csproj b/Source/Tx.SqlServer/Tx.SqlServer.csproj index 8a459afa..d187d319 100644 --- a/Source/Tx.SqlServer/Tx.SqlServer.csproj +++ b/Source/Tx.SqlServer/Tx.SqlServer.csproj @@ -1,43 +1,31 @@  - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {8892848F-45A1-46AC-A686-6A25EEC1475B} - Library - Properties - Tx.SqlServer - Tx.SqlServer - 512 - - - - x86 - - - x86 - - + net45 + True + ..\key.snk + True + Microsoft + Microsoft + https://github.com/Microsoft/Tx.git + git + https://github.com/Microsoft/Tx/blob/master/license.txt + https://github.com/Microsoft/Tx/ + Copyright © Microsoft. All Rights Reserved + Tx (LINQ to Logs and Traces) components for SQL Server. So far, this incldes Extended Events (XEvent) + Tx Traces Logs Playback Replay XEvent + 2.1.1 + + x86 - + x86 - - - - ..\..\References\$(BuildFlavor) - - - $(OutputPath)\$(AssemblyName).XML - - - true - - - ..\key.snk + bin\Release\net45\Tx.SqlServer.xml + + + ..\..\References\XEvent\Microsoft.SqlServer.XE.Core.dll @@ -51,65 +39,5 @@ ..\..\References\XEvent\Microsoft.SqlServer.XEvent.Targets.dll - - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - - - - - Properties\key.snk - - - Always - - - Always - - - - - {c5cc33b0-1684-4dd4-83a5-5da4a9a25a7f} - Tx.Core - - - - - Properties\AssemblyInfo.cs - - - - - - - - - - msvcr100.dll - Always - - - xe.dll - Always - - - \ No newline at end of file diff --git a/Source/Tx.SqlServer/XeTypeMap.cs b/Source/Tx.SqlServer/XeTypeMap.cs index 458b083d..849b5a2f 100644 --- a/Source/Tx.SqlServer/XeTypeMap.cs +++ b/Source/Tx.SqlServer/XeTypeMap.cs @@ -24,7 +24,7 @@ public Guid GetInputKey(PublishedEvent evt) public Guid GetTypeKey(Type outpuType) { - var eventAttribute = outpuType.GetAttribute(); + var eventAttribute = outpuType.GetCustomAttribute(); if (eventAttribute == null) return Guid.Empty; @@ -50,7 +50,7 @@ public Func GetTransform(Type outpuType) foreach (PropertyInfo property in outpuType.GetProperties()) { Expression readExpression; - if (property.GetAttribute() != null) + if (property.GetCustomAttribute() != null) continue; MemberExpression propertyValue = Expression.Property( diff --git a/Source/Tx.Windows.TypeGeneration/AssemblyBuilder.cs b/Source/Tx.Windows.TypeGeneration/AssemblyBuilder.cs index bd68bb7e..9b07d49b 100644 --- a/Source/Tx.Windows.TypeGeneration/AssemblyBuilder.cs +++ b/Source/Tx.Windows.TypeGeneration/AssemblyBuilder.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Text; using Microsoft.CSharp; -using System.Reflection; namespace Tx.Windows { diff --git a/Source/Tx.Windows.TypeGeneration/ManifestParser.cs b/Source/Tx.Windows.TypeGeneration/ManifestParser.cs index 24275d76..36644622 100644 --- a/Source/Tx.Windows.TypeGeneration/ManifestParser.cs +++ b/Source/Tx.Windows.TypeGeneration/ManifestParser.cs @@ -575,13 +575,34 @@ private string LookupResourceString(string message) if (_stringTable == null) return message; - string stringId = message.Substring(9) // skip "$(string." - .TrimEnd(')'); + string stringId = message.Substring(9); // skip "$(string." - return (from s in _stringTable.Elements() - where s.Attribute(AttributeNames.Id).Value == stringId - select s.Attribute(AttributeNames.Value).Value) - .FirstOrDefault(); + if (stringId.Last() == ')') + { + stringId = stringId.Substring(0, stringId.Length - 1); + } + + var elements = _stringTable.Elements() + .Select(s => new + { + Id = s.Attribute(AttributeNames.Id), + Value = s.Attribute(AttributeNames.Value) + }) + .Where(s => s.Id != null && s.Value != null) + .OrderBy(s => s.Id.Value) + .ToArray(); + + var element = elements + .FirstOrDefault(s => s.Id.Value == stringId); + + if (element == null) + { + return message; + } + else + { + return element.Value.Value; + } } private string[] LookupKeywords(XElement evt, XElement keywords) diff --git a/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.Layout.cmd b/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.Layout.cmd deleted file mode 100644 index c022f5a4..00000000 --- a/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.Layout.cmd +++ /dev/null @@ -1,10 +0,0 @@ -rd /s/q Tx.Windows.TypeGeneration - -md Tx.Windows.TypeGeneration\lib\Net45 -copy Net45\Tx.Windows.TypeGeneration.dll Tx.Windows.TypeGeneration\lib\Net45 -copy Net45\Tx.Windows.TypeGeneration.xml Tx.Windows.TypeGeneration\lib\Net45 -copy Net45\Tx.Windows.TypeGeneration.pdb Tx.Windows.TypeGeneration\lib\Net45 - -md Tx.Windows.TypeGeneration\tools\Net45 -copy Net45\EtwEventTypeGen.exe Tx.Windows.TypeGeneration\tools\Net45 -copy Net45\EtwEventTypeGen.pdb Tx.Windows.TypeGeneration\tools\Net45 diff --git a/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.nuspec b/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.nuspec index 34ca0b19..32b4aa6b 100644 --- a/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.nuspec +++ b/Source/Tx.Windows.TypeGeneration/Properties/Tx.Windows.TypeGeneration.nuspec @@ -4,20 +4,24 @@ Tx.Windows.TypeGeneration Tx.Windows.TypeGeneration - {version} + 2.0.2 Tx (LINQ to Logs and Traces) components for generation of C# types representing Event Tracing for Windows (ETW) and Event Log events Microsoft Copyright © Microsoft. All Rights Reserved - http://tx.codeplex.com http://tx.codeplex.com/license - en-us - Tx Traces Logs Playback Replay ETW - false + Tx Traces Logs Playback Replay ETW + false - - + + + + + + + + \ No newline at end of file diff --git a/Source/Tx.Windows.TypeGeneration/Tx.Windows.TypeGeneration.csproj b/Source/Tx.Windows.TypeGeneration/Tx.Windows.TypeGeneration.csproj index 6c023fe5..8bc3567e 100644 --- a/Source/Tx.Windows.TypeGeneration/Tx.Windows.TypeGeneration.csproj +++ b/Source/Tx.Windows.TypeGeneration/Tx.Windows.TypeGeneration.csproj @@ -1,78 +1,30 @@  - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {A4517ABD-D558-42F3-8FE4-2A6BA3074014} - Library - Properties - Tx.Windows - Tx.Windows.TypeGeneration - 512 - - - false - - - - ..\..\References\$(BuildFlavor) - - - $(OutputPath)\$(AssemblyName).XML - - - true - + + net45 + True ..\key.snk + False + Copyright © Microsoft. All Rights Reserved + Microsoft + Microsoft + Tx (LINQ to Logs and Traces) components for generation of C# types representing Event Tracing for Windows (ETW) and Event Log events + Tx Traces Logs Playback Replay ETW + git + https://github.com/Microsoft/Tx/blob/master/license.txt + https://github.com/Microsoft/Tx/ + https://github.com/Microsoft/Tx.git + 2.1.1 + + + bin\Release\net45\Tx.Windows.TypeGeneration.xml - - - - - - - - - Properties\AssemblyInfo.cs - - - - - - + - - Properties\key.snk + + PreserveNewest - - Always - - - Always - Designer - - - - - {c5cc33b0-1684-4dd4-83a5-5da4a9a25a7f} - Tx.Core - - - {c4043abb-ec40-4194-b15b-c0d13c2cf5c8} - Tx.Windows - - - \ No newline at end of file diff --git a/Source/Tx.Windows/EtwNative/EtwClassicTypeMap.cs b/Source/Tx.Windows/EtwNative/EtwClassicTypeMap.cs index 471e610f..2fb62e50 100644 --- a/Source/Tx.Windows/EtwNative/EtwClassicTypeMap.cs +++ b/Source/Tx.Windows/EtwNative/EtwClassicTypeMap.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Reactive; +using System.Reflection; namespace Tx.Windows { @@ -27,7 +28,7 @@ public ClassicEventPartitionKey GetInputKey(EtwNativeEvent evt) public ClassicEventPartitionKey GetTypeKey(Type outputType) { - var eventAttribute = outputType.GetAttribute(); + var eventAttribute = outputType.GetTypeInfo().GetCustomAttribute(); if (eventAttribute == null) return null; diff --git a/Source/Tx.Windows/EtwNative/EtwManifestTypeMap.cs b/Source/Tx.Windows/EtwNative/EtwManifestTypeMap.cs index 66e87bcd..1d24bfa9 100644 --- a/Source/Tx.Windows/EtwNative/EtwManifestTypeMap.cs +++ b/Source/Tx.Windows/EtwNative/EtwManifestTypeMap.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Reactive; +using System.Reflection; namespace Tx.Windows { @@ -27,7 +28,7 @@ public ManifestEventPartitionKey GetInputKey(EtwNativeEvent evt) public ManifestEventPartitionKey GetTypeKey(Type outputType) { - var eventAttribute = outputType.GetAttribute(); + var eventAttribute = outputType.GetTypeInfo().GetCustomAttribute(); if (eventAttribute == null) return null; diff --git a/Source/Tx.Windows/EtwNative/EtwTypeMap.cs b/Source/Tx.Windows/EtwNative/EtwTypeMap.cs index a6486f85..8307103d 100644 --- a/Source/Tx.Windows/EtwNative/EtwTypeMap.cs +++ b/Source/Tx.Windows/EtwNative/EtwTypeMap.cs @@ -59,7 +59,7 @@ public Func GetTransform(Type outputType) PropertyInfo[] properties = outputType.GetProperties(); foreach (PropertyInfo p in properties) { - var attribute = p.GetAttribute(); + var attribute = p.GetCustomAttribute(); if (attribute == null) continue; Expression readExpression = null; diff --git a/Source/Tx.Windows/EventFormatter.cs b/Source/Tx.Windows/EventFormatter.cs index 4c6b0b7d..ce4ab6e2 100644 --- a/Source/Tx.Windows/EventFormatter.cs +++ b/Source/Tx.Windows/EventFormatter.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -using System.Reactive; using System.Reflection; using System.Text; @@ -53,7 +52,7 @@ private static string Concatenate(params string[] tokens) private static Expression CompileFormatString(Type type) { - var attribute = type.GetAttribute(); + var attribute = type.GetTypeInfo().GetCustomAttribute(); string format = attribute == null ? type.Name : attribute.FormatString; diff --git a/Source/Tx.Windows/Evtx/EvtxManifestTypeMap.cs b/Source/Tx.Windows/Evtx/EvtxManifestTypeMap.cs index 6879d830..63151957 100644 --- a/Source/Tx.Windows/Evtx/EvtxManifestTypeMap.cs +++ b/Source/Tx.Windows/Evtx/EvtxManifestTypeMap.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Diagnostics.Eventing.Reader; using System.Reactive; +using System.Reflection; namespace Tx.Windows { @@ -28,7 +29,7 @@ public ManifestEventPartitionKey GetInputKey(EventRecord evt) public ManifestEventPartitionKey GetTypeKey(Type outputType) { - var eventAttribute = outputType.GetAttribute(); + var eventAttribute = outputType.GetTypeInfo().GetCustomAttribute(); if (eventAttribute == null) return null; diff --git a/Source/Tx.Windows/Evtx/EvtxTypeMap.cs b/Source/Tx.Windows/Evtx/EvtxTypeMap.cs index 78d1e5e5..24aaf85c 100644 --- a/Source/Tx.Windows/Evtx/EvtxTypeMap.cs +++ b/Source/Tx.Windows/Evtx/EvtxTypeMap.cs @@ -66,7 +66,7 @@ public Func GetTransform(Type outputType) int index = 0; foreach (PropertyInfo p in properties) { - var attribute = p.GetAttribute(); + var attribute = p.GetCustomAttribute(); if (attribute == null) continue; // the following is to handle value maps, that were emitted as enumerations diff --git a/Source/Tx.Windows/InternalsVisibleTo.cs b/Source/Tx.Windows/InternalsVisibleTo.cs index 8569ec3f..f5404302 100644 --- a/Source/Tx.Windows/InternalsVisibleTo.cs +++ b/Source/Tx.Windows/InternalsVisibleTo.cs @@ -4,7 +4,7 @@ [assembly: InternalsVisibleTo( - "Tests.Tx, PublicKey=0024000004800000940000000602000000240000525341310004000001000100517789C13E6805DC176AA2AC748FE291FDC43357C7A6F5044A2D979E8C51BAF27FE7CE2DC23B2F06E10DC6D2BBD460BF3756D0D2208B12708E5DD9498493B882E7869CF2E3E48C4B7BC758AE4F882835C559A4082A11051CBF74DDF36E8272FDDE45E3DA6EC2FEA577B6E21F27B45A02F6A5B2D358C4A0FA60ED1407A2BC96CC" + "Tx.Windows.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100517789C13E6805DC176AA2AC748FE291FDC43357C7A6F5044A2D979E8C51BAF27FE7CE2DC23B2F06E10DC6D2BBD460BF3756D0D2208B12708E5DD9498493B882E7869CF2E3E48C4B7BC758AE4F882835C559A4082A11051CBF74DDF36E8272FDDE45E3DA6EC2FEA577B6E21F27B45A02F6A5B2D358C4A0FA60ED1407A2BC96CC" )] [assembly: InternalsVisibleTo( diff --git a/Source/Tx.Windows/PerfCounters/PerfCounterTypeMap.cs b/Source/Tx.Windows/PerfCounters/PerfCounterTypeMap.cs index 61ec16ad..2f945527 100644 --- a/Source/Tx.Windows/PerfCounters/PerfCounterTypeMap.cs +++ b/Source/Tx.Windows/PerfCounters/PerfCounterTypeMap.cs @@ -21,7 +21,7 @@ public IEqualityComparer Comparer public PerfCounterPartitionKey GetTypeKey(Type outputType) { - var attribute = outputType.GetAttribute(); + var attribute = outputType.GetTypeInfo().GetCustomAttribute(); if (attribute == null) return null; diff --git a/Source/Tx.Windows/Properties/Tx.Windows.Layout.cmd b/Source/Tx.Windows/Properties/Tx.Windows.Layout.cmd deleted file mode 100644 index 76aa1733..00000000 --- a/Source/Tx.Windows/Properties/Tx.Windows.Layout.cmd +++ /dev/null @@ -1,6 +0,0 @@ -rd /s/q Tx.Windows - -md Tx.Windows\lib\Net45 -copy Net45\Tx.Windows.dll Tx.Windows\lib\Net45 -copy Net45\Tx.Windows.xml Tx.Windows\lib\Net45 -copy Net45\Tx.Windows.pdb Tx.Windows\lib\Net45 diff --git a/Source/Tx.Windows/Properties/Tx.Windows.nuspec b/Source/Tx.Windows/Properties/Tx.Windows.nuspec deleted file mode 100644 index b14a4383..00000000 --- a/Source/Tx.Windows/Properties/Tx.Windows.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - - Tx.Windows - Tx.Windows - - {version} - Tx (LINQ to Logs and Traces) components for Windows: ETW, Logs (.evtx), Perormance Counters (.blg, .csv, .tsv), IIS Logs in W3C format - Microsoft - Copyright © Microsoft. All Rights Reserved - - http://tx.codeplex.com - http://tx.codeplex.com/license - - en-us - Tx Traces Logs Playback ETW - false - - - - - \ No newline at end of file diff --git a/Source/Tx.Windows/Tx.Windows.csproj b/Source/Tx.Windows/Tx.Windows.csproj index 0dc44c98..9c2fcf9b 100644 --- a/Source/Tx.Windows/Tx.Windows.csproj +++ b/Source/Tx.Windows/Tx.Windows.csproj @@ -1,118 +1,32 @@  - + - Debug - AnyCPU - 8.0.30703 - 2.0 - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8} - Library - Properties - Tx.Windows - Tx.Windows - 512 - true - - - - ..\..\References\$(BuildFlavor) - - - $(OutputPath)\$(AssemblyName).XML + net45 + True + ..\key.snk + True + git + https://github.com/Microsoft/Tx.git + https://github.com/Microsoft/Tx/ + https://github.com/Microsoft/Tx/blob/master/license.txt + Copyright © Microsoft. All Rights Reserved + Microsoft + Microsoft + Tx (LINQ to Logs and Traces) components for Windows: ETW, Logs (.evtx), Perormance Counters (.blg, .csv, .tsv), IIS Logs in W3C format + Tx Traces Logs Playback ETW W3C + 2.1.1 - - true + + True + bin\Debug\net45\.xml - - ..\key.snk + + True - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - - - - Properties\AssemblyInfo.cs - - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F} - Tx.Core - + - - Properties\key.snk - - - Always - - - Always - + - - - \ No newline at end of file diff --git a/Source/Tx.sln b/Source/Tx.sln index bcda9be9..0129f05e 100644 --- a/Source/Tx.sln +++ b/Source/Tx.sln @@ -1,154 +1,70 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{55D729F2-BC6B-4165-B1A9-932E9662469D}" - ProjectSection(SolutionItems) = preProject - Common.targets = Common.targets - devsetup.cmd = devsetup.cmd - key.snk = key.snk - Local.testsettings = Local.testsettings - TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings - Tx.vsmdi = Tx.vsmdi - EndProjectSection +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Core", "Tx.Core\Tx.Core.csproj", "{EDD05A7B-04F9-4179-A317-587D42B6E2CA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Core", "Tx.Core\Tx.Core.csproj", "{C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Network", "Tx.Network\Tx.Network.csproj", "{57DD2DE6-844C-48B0-90EA-A7823AEFFE14}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows", "Tx.Windows\Tx.Windows.csproj", "{C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Windows", "Tx.Windows\Tx.Windows.csproj", "{ACF1E6AF-AE43-4E04-9153-46D1D58F15F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows.TypeGeneration", "Tx.Windows.TypeGeneration\Tx.Windows.TypeGeneration.csproj", "{A4517ABD-D558-42F3-8FE4-2A6BA3074014}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.SqlServer", "Tx.SqlServer\Tx.SqlServer.csproj", "{1ADC080C-A85F-4423-8068-A0D213EBBF4E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.SqlServer", "Tx.SqlServer\Tx.SqlServer.csproj", "{8892848F-45A1-46AC-A686-6A25EEC1475B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Windows.TypeGeneration", "Tx.Windows.TypeGeneration\Tx.Windows.TypeGeneration.csproj", "{3A1F226B-85FB-4F30-8703-285F13577BD4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EtwEventTypeGen", "EtwEventTypeGen\EtwEventTypeGen.csproj", "{D8051D89-46E1-47E0-AA9A-9B352AE3CC11}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.LinqPad", "Tx.LinqPad\Tx.LinqPad.csproj", "{C49836B8-2343-4FE7-875E-EFB58D6FC24D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.LinqPad", "Tx.LinqPad\Tx.LinqPad.csproj", "{3326CF58-CDA1-4514-BADD-465F4CEDAF50}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Bond", "Tx.Bond\Tx.Bond.csproj", "{01B8BC42-7B2B-488E-B0AE-113C8F9C1D35}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetVersion", "SetVersion\SetVersion.csproj", "{8E9F5FFD-5533-4384-9841-9D07CDCEBB76}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetVersion", "SetVersion\SetVersion.csproj", "{D4B1BE53-01B5-4341-869E-BCBBF7160EBB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TxFmt", "TxFmt\TxFmt.csproj", "{D7CA2959-ACF0-4C31-B22A-292253BC813E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Bond", "Tx.Bond\Tx.Bond.csproj", "{6DCE4A40-4946-41B0-ABE5-CE1700B598E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Network", "Tx.Network\Tx.Network.csproj", "{B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EtwEventTypeGen", "EtwEventTypeGen\EtwEventTypeGen.csproj", "{19EBFB63-AD5C-4FDE-A14B-3A34D5573C06}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug40|Any CPU = Debug40|Any CPU - Debug45|Any CPU = Debug45|Any CPU Release|Any CPU = Release|Any CPU - Release40|Any CPU = Release40|Any CPU - Release45|Any CPU = Release45|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release|Any CPU.Build.0 = Release45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release45|Any CPU.Build.0 = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release|Any CPU.Build.0 = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release45|Any CPU.Build.0 = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release|Any CPU.Build.0 = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release45|Any CPU.Build.0 = Release45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Release|Any CPU.Build.0 = Release45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {8892848F-45A1-46AC-A686-6A25EEC1475B}.Release45|Any CPU.Build.0 = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release|Any CPU.Build.0 = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release45|Any CPU.Build.0 = Release45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Release|Any CPU.Build.0 = Release45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Release40|Any CPU.Build.0 = Release45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {3326CF58-CDA1-4514-BADD-465F4CEDAF50}.Release45|Any CPU.Build.0 = Release45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Release|Any CPU.Build.0 = Release45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {8E9F5FFD-5533-4384-9841-9D07CDCEBB76}.Release45|Any CPU.Build.0 = Release45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Release|Any CPU.Build.0 = Release45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E}.Release45|Any CPU.Build.0 = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release|Any CPU.Build.0 = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release45|Any CPU.Build.0 = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug|Any CPU.Build.0 = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug40|Any CPU.ActiveCfg = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release|Any CPU.ActiveCfg = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release|Any CPU.Build.0 = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release40|Any CPU.ActiveCfg = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release45|Any CPU.Build.0 = Release45|Any CPU + {EDD05A7B-04F9-4179-A317-587D42B6E2CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDD05A7B-04F9-4179-A317-587D42B6E2CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDD05A7B-04F9-4179-A317-587D42B6E2CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDD05A7B-04F9-4179-A317-587D42B6E2CA}.Release|Any CPU.Build.0 = Release|Any CPU + {57DD2DE6-844C-48B0-90EA-A7823AEFFE14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57DD2DE6-844C-48B0-90EA-A7823AEFFE14}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57DD2DE6-844C-48B0-90EA-A7823AEFFE14}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57DD2DE6-844C-48B0-90EA-A7823AEFFE14}.Release|Any CPU.Build.0 = Release|Any CPU + {ACF1E6AF-AE43-4E04-9153-46D1D58F15F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACF1E6AF-AE43-4E04-9153-46D1D58F15F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACF1E6AF-AE43-4E04-9153-46D1D58F15F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACF1E6AF-AE43-4E04-9153-46D1D58F15F9}.Release|Any CPU.Build.0 = Release|Any CPU + {1ADC080C-A85F-4423-8068-A0D213EBBF4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1ADC080C-A85F-4423-8068-A0D213EBBF4E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1ADC080C-A85F-4423-8068-A0D213EBBF4E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1ADC080C-A85F-4423-8068-A0D213EBBF4E}.Release|Any CPU.Build.0 = Release|Any CPU + {3A1F226B-85FB-4F30-8703-285F13577BD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A1F226B-85FB-4F30-8703-285F13577BD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A1F226B-85FB-4F30-8703-285F13577BD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A1F226B-85FB-4F30-8703-285F13577BD4}.Release|Any CPU.Build.0 = Release|Any CPU + {C49836B8-2343-4FE7-875E-EFB58D6FC24D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C49836B8-2343-4FE7-875E-EFB58D6FC24D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C49836B8-2343-4FE7-875E-EFB58D6FC24D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C49836B8-2343-4FE7-875E-EFB58D6FC24D}.Release|Any CPU.Build.0 = Release|Any CPU + {01B8BC42-7B2B-488E-B0AE-113C8F9C1D35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01B8BC42-7B2B-488E-B0AE-113C8F9C1D35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01B8BC42-7B2B-488E-B0AE-113C8F9C1D35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01B8BC42-7B2B-488E-B0AE-113C8F9C1D35}.Release|Any CPU.Build.0 = Release|Any CPU + {D4B1BE53-01B5-4341-869E-BCBBF7160EBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4B1BE53-01B5-4341-869E-BCBBF7160EBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4B1BE53-01B5-4341-869E-BCBBF7160EBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4B1BE53-01B5-4341-869E-BCBBF7160EBB}.Release|Any CPU.Build.0 = Release|Any CPU + {19EBFB63-AD5C-4FDE-A14B-3A34D5573C06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19EBFB63-AD5C-4FDE-A14B-3A34D5573C06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19EBFB63-AD5C-4FDE-A14B-3A34D5573C06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19EBFB63-AD5C-4FDE-A14B-3A34D5573C06}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(TestCaseManagementSettings) = postSolution - CategoryFile = Tx.vsmdi - EndGlobalSection EndGlobal diff --git a/Source/Tx.vsmdi b/Source/Tx.vsmdi deleted file mode 100644 index 1aca4591..00000000 --- a/Source/Tx.vsmdi +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Source/TxFmt/Program.cs b/Source/TxFmt/Program.cs deleted file mode 100644 index 80f7c14b..00000000 --- a/Source/TxFmt/Program.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reactive; -using System.Reflection; -using Tx.Windows; - -namespace TxFmt -{ - internal class Program - { - private static void Main(string[] args) - { - if (args.Length < 2) - { - Console.WriteLine( - @"Usage: TxFmt files... - -Supported files are - .man : Manifest - .etl : Event Trace Log - .evtx : Event Log"); - - Environment.Exit(1); - } - - try - { - var pb = new Playback(); - - string asmDir = Path.Combine(Path.GetTempPath(), "TxFmt"); - if (Directory.Exists(asmDir)) - Directory.Delete(asmDir, true); - Directory.CreateDirectory(asmDir); - - foreach (string a in args) - { - string ext = Path.GetExtension(a).ToLower(); - - switch (ext) - { - case ".etl": - pb.AddEtlFiles(a); - break; - - case ".evtx": - pb.AddLogFiles(a); - break; - - case ".man": - string manifest = File.ReadAllText(a); - Dictionary generated = ManifestParser.Parse(manifest); - - string assemblyPath = Path.Combine(asmDir, Path.ChangeExtension(Path.GetFileName(a), ".dll")); - AssemblyBuilder.OutputAssembly(generated, new string[]{}, assemblyPath); - break; - - default: - throw new Exception("unknown extension " + ext); - } - } - - var knownTypes = new List(); - - foreach (string a in Directory.GetFiles(asmDir, "*.dll")) - { - Assembly assembly = Assembly.LoadFrom(a); - knownTypes.AddRange(assembly.GetTypes()); - } - - pb.KnownTypes = knownTypes.ToArray(); - - IObservable all = pb.GetObservable(); - all.Subscribe(e=> - { - if (!e.ToString().StartsWith(" DocumentServiceId")) - { - Console.WriteLine("{0} {1}", e.Header.EventId, e.ToString()); - }; - }); - pb.Run(); - } - catch (Exception ex) - { - ConsoleColor color = Console.ForegroundColor; - Console.ForegroundColor = ConsoleColor.Red; - Console.Error.WriteLine(ex.Message + "\n\n" + ex.StackTrace); - Console.ForegroundColor = color; - } - } - } -} \ No newline at end of file diff --git a/Source/TxFmt/TxFmt.csproj b/Source/TxFmt/TxFmt.csproj deleted file mode 100644 index 506312f5..00000000 --- a/Source/TxFmt/TxFmt.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - Debug - AnyCPU - {D7CA2959-ACF0-4C31-B22A-292253BC813E} - Exe - Properties - TxFmt - TxFmt - 512 - - - - ..\..\References\$(BuildFlavor) - - - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - - - Properties\AssemblyInfo.cs - - - - - - {c5cc33b0-1684-4dd4-83a5-5da4a9a25a7f} - Tx.Core - - - {a4517abd-d558-42f3-8fe4-2a6ba3074014} - Tx.Windows.TypeGeneration - - - {c4043abb-ec40-4194-b15b-c0d13c2cf5c8} - Tx.Windows - - - - - - \ No newline at end of file diff --git a/Source/devsetup.cmd b/Source/devsetup.cmd deleted file mode 100644 index 45278240..00000000 --- a/Source/devsetup.cmd +++ /dev/null @@ -1,59 +0,0 @@ -@rem This is post build step that sets locally the LINQPad data context driver for Tx - -@echo off - -if not "%1" == "" cd %1 - -set DRIVER_DIR=c:\ProgramData\LINQPad\Drivers\DataContext\4.0\Tx.LinqPad (3d3a4b0768c9178e) -if not exist "%DRIVER_DIR%" md "%DRIVER_DIR%" - -set TYPE_DIR=%DRIVER_DIR%\EventTypes -if not exist "%TYPE_DIR%" md "%TYPE_DIR%" - -call :copy_dll Tx.Core -call :copy_dll Tx.Windows -call :copy_dll Tx.Windows.TypeGeneration -call :copy_dll Tx.SqlServer -call :copy_dll Tx.LinqPad - -echo Reactive Binaries -copy ..\References\DESKTOPCLR45\System.Reactive.Interfaces.dll "%DRIVER_DIR%"\ -copy ..\References\DESKTOPCLR45\System.Reactive.Core.dll "%DRIVER_DIR%"\ -copy ..\References\DESKTOPCLR45\System.Reactive.Linq.dll "%DRIVER_DIR%"\ -copy ..\References\DESKTOPCLR45\System.Reactive.PlatformServices.dll "%DRIVER_DIR%"\ -copy ..\References\DESKTOPCLR45\System.Reactive.Windows.Forms.dll "%DRIVER_DIR%"\ - -echo XEvent Binaries -copy ..\References\XEvent\* "%DRIVER_DIR%"\ - -echo header.xml -copy Tx.LinqPad\header.xml "%DRIVER_DIR%"\ - -echo Sample Traces -copy ..\Manifests\HTTP_Server.man "%DRIVER_DIR%"\ -copy ..\Manifests\IE_Client.man "%DRIVER_DIR%"\ -copy ..\Traces\HTTP_Server.etl "%DRIVER_DIR%"\ -copy ..\Traces\BasicPerfCounters.blg "%DRIVER_DIR%"\ -copy ..\Traces\CrossMachineHTTP.etl "%DRIVER_DIR%"\ -copy ..\Traces\CrossMachineIE.etl "%DRIVER_DIR%"\ -copy ..\Traces\sqltrace.xel "%DRIVER_DIR%"\ -copy ..\Samples\LinqPad\Manifests\Microsoft.Windows.ApplicationServer.Applications.manifest "%DRIVER_DIR%"\ -copy ..\Samples\LinqPad\Traces\SampleWcfTrace.etl "%DRIVER_DIR%"\ - -goto end - -:copy_dll -echo %1.dll -copy c:\bin\Debug\Net45\%1.dll "%DRIVER_DIR%"\ -copy c:\bin\Debug\Net45\%1.pdb "%DRIVER_DIR%"\ -exit /b 0 - -:copy_exe -echo %1.exe -copy c:\bin\Debug\Net45\%1.exe "%DRIVER_DIR%"\ -copy c:\bin\Debug\Net45\%1.pdb "%DRIVER_DIR%"\ - -exit /b 0 - -:end -exit /b 0 \ No newline at end of file diff --git a/Source/version.txt b/Source/version.txt new file mode 100644 index 00000000..7c327287 --- /dev/null +++ b/Source/version.txt @@ -0,0 +1 @@ +2.1.1 \ No newline at end of file diff --git a/Test/UnitTests/BinaryEtw/BondEtwObserverTests.cs b/Test/Tx.Bond.Tests/BondEtwObserverTests.cs similarity index 77% rename from Test/UnitTests/BinaryEtw/BondEtwObserverTests.cs rename to Test/Tx.Bond.Tests/BondEtwObserverTests.cs index cd7113a4..01637d0d 100644 --- a/Test/UnitTests/BinaryEtw/BondEtwObserverTests.cs +++ b/Test/Tx.Bond.Tests/BondEtwObserverTests.cs @@ -1,9 +1,7 @@ -namespace Tests.Tx.BinaryEtw -{ - using global::Tx.Bond; - - using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; +namespace Tx.Bond.Tests +{ [TestClass] public class BondEtwObserverTests { diff --git a/Test/UnitTests/BinaryEtw/EnvelopeTypeMapTests.cs b/Test/Tx.Bond.Tests/EnvelopeTypeMapTests.cs similarity index 91% rename from Test/UnitTests/BinaryEtw/EnvelopeTypeMapTests.cs rename to Test/Tx.Bond.Tests/EnvelopeTypeMapTests.cs index f54ceaea..16431fc6 100644 --- a/Test/UnitTests/BinaryEtw/EnvelopeTypeMapTests.cs +++ b/Test/Tx.Bond.Tests/EnvelopeTypeMapTests.cs @@ -1,17 +1,14 @@ -namespace Tests.Tx.BinaryEtw +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive; +using System.Reactive.Linq; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Tx.Bond.Tests { - using System; - using System.Collections.Generic; - using System.Linq; - using System.Reactive; - using System.Reactive.Linq; - using System.Runtime.InteropServices; - using System.Text; - - using global::Tx.Bond; - - using Microsoft.VisualStudio.TestTools.UnitTesting; - [TestClass] public class EnvelopeTypeMapTests { diff --git a/Test/UnitTests/BinaryEtw/TestBondClass.bond b/Test/Tx.Bond.Tests/TestBondClass.bond similarity index 100% rename from Test/UnitTests/BinaryEtw/TestBondClass.bond rename to Test/Tx.Bond.Tests/TestBondClass.bond diff --git a/Test/Tx.Bond.Tests/Tx.Bond.Tests.csproj b/Test/Tx.Bond.Tests/Tx.Bond.Tests.csproj new file mode 100644 index 00000000..9ac99432 --- /dev/null +++ b/Test/Tx.Bond.Tests/Tx.Bond.Tests.csproj @@ -0,0 +1,19 @@ + + + + net45 + + + + + + + + + + + + + + + diff --git a/Test/UnitTests/CompositeDeserializerTests.cs b/Test/Tx.Core.Tests/CompositeDeserializerTests.cs similarity index 100% rename from Test/UnitTests/CompositeDeserializerTests.cs rename to Test/Tx.Core.Tests/CompositeDeserializerTests.cs diff --git a/Test/UnitTests/DemultiplexorTest.cs b/Test/Tx.Core.Tests/DemultiplexorTest.cs similarity index 100% rename from Test/UnitTests/DemultiplexorTest.cs rename to Test/Tx.Core.Tests/DemultiplexorTest.cs diff --git a/Test/UnitTests/EnvelopeTypeMapTests.cs b/Test/Tx.Core.Tests/EnvelopeTypeMapTests.cs similarity index 99% rename from Test/UnitTests/EnvelopeTypeMapTests.cs rename to Test/Tx.Core.Tests/EnvelopeTypeMapTests.cs index 07aee662..63c633bb 100644 --- a/Test/UnitTests/EnvelopeTypeMapTests.cs +++ b/Test/Tx.Core.Tests/EnvelopeTypeMapTests.cs @@ -1,4 +1,4 @@ -namespace Tests.Tx +namespace Tests.Tx { using System; using System.Collections.Generic; diff --git a/Test/UnitTests/PlaybackTest.cs b/Test/Tx.Core.Tests/PlaybackTest.cs similarity index 79% rename from Test/UnitTests/PlaybackTest.cs rename to Test/Tx.Core.Tests/PlaybackTest.cs index d5392b42..ca90cc2c 100644 --- a/Test/UnitTests/PlaybackTest.cs +++ b/Test/Tx.Core.Tests/PlaybackTest.cs @@ -3,8 +3,6 @@ using System.IO; using System.Reactive; using System.Reflection; -using Tx.Windows; -using Tx.Windows.Microsoft_Windows_HttpService; namespace Tests.Tx { @@ -16,113 +14,6 @@ namespace Tests.Tx [TestClass] public class PlaybackTest { - string EtlFileName - { - get - { - string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - return Path.Combine(dir, @"HTTP_Server.etl"); - } - } - - string EvtxFileName - { - get - { - string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - return Path.Combine(dir, @"HTTP_Server.evtx"); - } - } - - [TestMethod] - public void PlayOne() - { - var p = new Playback(); - p.AddEtlFiles(EtlFileName); - - int count = 0; - p.GetObservable().Subscribe(e => { count++; }); - p.Run(); - - Assert.AreEqual(291, count); - } - - [TestMethod] - public void OfType() - { - var count = EtwObservable.FromFiles(this.EtlFileName) - .OfType( - new EtwManifestTypeMap(), - new EtwClassicTypeMap(), - new EtwTypeMap()) - .Count() - .Wait(); - - Assert.AreEqual(291, count); - } - - [TestMethod] - public void PlayTwo() - { - var p = new Playback(); - p.AddEtlFiles(EtlFileName); - - int parseCount = 0; - int fastSendCount = 0; - p.GetObservable().Subscribe(e => { parseCount++; }); - p.GetObservable().Subscribe(e => { fastSendCount++; }); - p.Run(); - - Assert.AreEqual(291, parseCount); - Assert.AreEqual(289, fastSendCount); - } - - [TestMethod] - public void PlayTwoBothEtlAndEvtx() - { - var p = new Playback(); - p.AddEtlFiles(EtlFileName); - p.AddLogFiles(EvtxFileName); - - int parseCount = 0; - int fastSendCount = 0; - p.GetObservable().Subscribe(e => { parseCount++; }); - p.GetObservable().Subscribe(e => { fastSendCount++; }); - p.Run(); - - Assert.AreEqual(582, parseCount); - Assert.AreEqual(578, fastSendCount); - } - - [TestMethod] - public void PlayRoot() - { - var p = new Playback(); - p.AddEtlFiles(EtlFileName); - - int count = 0; - p.GetObservable().Subscribe(e => { count++; }); - p.Run(); - - Assert.AreEqual(2041, count); - } - - [TestMethod] - public void PlayRootAndKnownType() - { - var p = new Playback(); - p.AddEtlFiles(EtlFileName); - - int count = 0; - p.GetObservable().Subscribe(e => { count++; }); - int parseCount = 0; - p.GetObservable().Subscribe(e => { parseCount++; }); - p.Run(); - - Assert.AreEqual(2041+291, count); - Assert.AreEqual(291, parseCount); - } - [TestMethod] public void MergeTwoStreams_1() { @@ -177,7 +68,6 @@ public void MergeEmptyWindowAndEmptyStream() } [TestMethod] - //[Ignore] public void MergeTwoStreams_2() { var result = new List(); @@ -191,14 +81,10 @@ public void MergeTwoStreams_2() playback.AddInput(new[] { new Timestamped("0", start), - //new Timestamped("1", start.AddSeconds(1)), - //new Timestamped("2", start.AddSeconds(2)), - //new Timestamped("3", start.AddSeconds(3)), }); playback.AddInput(new[] { -// new Timestamped(new {}, start), new Timestamped("1", start.AddSeconds(1)), new Timestamped("2", start.AddSeconds(2)), new Timestamped("3", start.AddSeconds(3)), diff --git a/Test/UnitTests/PullMergeSortTest.cs b/Test/Tx.Core.Tests/PullMergeSortTest.cs similarity index 100% rename from Test/UnitTests/PullMergeSortTest.cs rename to Test/Tx.Core.Tests/PullMergeSortTest.cs diff --git a/Test/UnitTests/TimeSourceTest.cs b/Test/Tx.Core.Tests/TimeSourceTest.cs similarity index 95% rename from Test/UnitTests/TimeSourceTest.cs rename to Test/Tx.Core.Tests/TimeSourceTest.cs index 2c1e3642..7777edcc 100644 --- a/Test/UnitTests/TimeSourceTest.cs +++ b/Test/Tx.Core.Tests/TimeSourceTest.cs @@ -1,17 +1,17 @@ -using Microsoft.Reactive.Testing; -using Microsoft.VisualStudio.TestTools.UnitTesting; +#if NET45 using System; using System.Collections.Generic; using System.Reactive; -using System.Reactive.Concurrency; using System.Reactive.Linq; +using Microsoft.Reactive.Testing; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Core.Tests { [TestClass] public class TimeSourceTest : ReactiveTest { - static Recorded>[] s_testData = new Recorded>[] + static Recorded>[] s_testData = new Recorded>[] { OnNext(101), OnNext(102), @@ -38,7 +38,7 @@ from Count in window.Count() var list = new List>(); counts .Timestamp(timeSource.Scheduler) - .Subscribe(ts=>list.Add(ts)); + .Subscribe(ts => list.Add(ts)); timeSource.Connect(); scheduler.AdvanceTo(120); @@ -119,3 +119,4 @@ public static Timestamped Result(long ticks, int value) } } } +#endif diff --git a/Test/Tx.Core.Tests/Tx.Core.Tests.csproj b/Test/Tx.Core.Tests/Tx.Core.Tests.csproj new file mode 100644 index 00000000..bd9c3008 --- /dev/null +++ b/Test/Tx.Core.Tests/Tx.Core.Tests.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp1.1;net45 + + + + + + + + + + + + + + + + + + + + 3.0.0 + + + + diff --git a/Test/Tx.Core.Tests/Tx.Core.Tests.sln b/Test/Tx.Core.Tests/Tx.Core.Tests.sln new file mode 100644 index 00000000..07c9c012 --- /dev/null +++ b/Test/Tx.Core.Tests/Tx.Core.Tests.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Core.Tests", "Tx.Core.Tests.csproj", "{58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Core", "..\..\Source\Tx.Core\Tx.Core.csproj", "{6D4419B5-4F59-4666-991F-23D35A0C76FF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Release|Any CPU.Build.0 = Release|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Test/UnitTests/Network/Asn1BERDecoderUnitTest.cs b/Test/Tx.Network.Tests/Asn1BERDecoderUnitTest.cs similarity index 91% rename from Test/UnitTests/Network/Asn1BERDecoderUnitTest.cs rename to Test/Tx.Network.Tests/Asn1BERDecoderUnitTest.cs index d8ddf470..9ce51cfb 100644 --- a/Test/UnitTests/Network/Asn1BERDecoderUnitTest.cs +++ b/Test/Tx.Network.Tests/Asn1BERDecoderUnitTest.cs @@ -1,66 +1,66 @@ -namespace Tx.Network.UnitTests -{ - using Tx.Network.Snmp; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - [TestClass] - public class Asn1BERDecoderUnitTest - { - [TestMethod] - public void SnmpDecodeToClassConstructTypeTest() - { - byte testBit = (byte)48; - var decodedType = testBit.DecodeToClassConstructType(); - Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Universal); - Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Constructed); - Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData); - Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.Sequence); - - testBit = (byte)2; - decodedType = testBit.DecodeToClassConstructType(); - Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Universal); - Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Primitive); - Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData); - Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.Integer); - - testBit = (byte)4; - decodedType = testBit.DecodeToClassConstructType(); - Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Universal); - Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Primitive); - Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData); - Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.OctetString); - - testBit = (byte)65; - decodedType = testBit.DecodeToClassConstructType(); - Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Application); - Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Primitive); - Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.Counter32); - Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.NotAsn1Data); - } - - [TestMethod] - public void SnmpIntegerDecodeTest() - { - byte[] bytes = new byte[] { 7, 102, 0 }; - int retVal = bytes.ReadInteger(0, 2); - Assert.IsTrue(retVal == 1894); - - bytes = new byte[] { 1, 0, 0 }; - retVal = bytes.ReadInteger(0, 1); - Assert.IsTrue(retVal == 1); - - bytes = new byte[] { 0, 0, 0 }; - retVal = bytes.ReadInteger(0, 1); - Assert.IsTrue(retVal == 0); - } - - [TestMethod] - public void SnmpReadLengthDecodeTest() - { - byte[] bytes = new byte[] { 7,102, 2, 1,1 }; - int retVal; - bytes.ReadLength(0, out retVal); - Assert.IsTrue(retVal == 7); - } - } -} +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Snmp; + +namespace Tx.Network.Tests +{ + [TestClass] + public class Asn1BERDecoderUnitTest + { + [TestMethod] + public void SnmpDecodeToClassConstructTypeTest() + { + byte testBit = (byte)48; + var decodedType = testBit.DecodeToClassConstructType(); + Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Universal); + Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Constructed); + Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData); + Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.Sequence); + + testBit = (byte)2; + decodedType = testBit.DecodeToClassConstructType(); + Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Universal); + Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Primitive); + Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData); + Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.Integer); + + testBit = (byte)4; + decodedType = testBit.DecodeToClassConstructType(); + Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Universal); + Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Primitive); + Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData); + Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.OctetString); + + testBit = (byte)65; + decodedType = testBit.DecodeToClassConstructType(); + Assert.IsTrue(decodedType.Asn1ClassType == Asn1Class.Application); + Assert.IsTrue(decodedType.Asn1ConstructType == ConstructType.Primitive); + Assert.IsTrue(decodedType.Asn1SnmpTagType == Asn1SnmpTag.Counter32); + Assert.IsTrue(decodedType.Asn1TagType == Asn1Tag.NotAsn1Data); + } + + [TestMethod] + public void SnmpIntegerDecodeTest() + { + byte[] bytes = new byte[] { 7, 102, 0 }; + int retVal = bytes.ReadInteger(0, 2); + Assert.IsTrue(retVal == 1894); + + bytes = new byte[] { 1, 0, 0 }; + retVal = bytes.ReadInteger(0, 1); + Assert.IsTrue(retVal == 1); + + bytes = new byte[] { 0, 0, 0 }; + retVal = bytes.ReadInteger(0, 1); + Assert.IsTrue(retVal == 0); + } + + [TestMethod] + public void SnmpReadLengthDecodeTest() + { + byte[] bytes = new byte[] { 7, 102, 2, 1, 1 }; + int retVal; + bytes.ReadLength(0, out retVal); + Assert.IsTrue(retVal == 7); + } + } +} diff --git a/Test/UnitTests/Network/Asn1BEREncoderUnitTest.cs b/Test/Tx.Network.Tests/Asn1BEREncoderUnitTest.cs similarity index 95% rename from Test/UnitTests/Network/Asn1BEREncoderUnitTest.cs rename to Test/Tx.Network.Tests/Asn1BEREncoderUnitTest.cs index d507ad00..fa0dd33e 100644 --- a/Test/UnitTests/Network/Asn1BEREncoderUnitTest.cs +++ b/Test/Tx.Network.Tests/Asn1BEREncoderUnitTest.cs @@ -1,338 +1,335 @@ -namespace Tx.Network.UnitTests -{ - using System; - - using Tx.Network.Snmp; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - using Tests.Tx.Network; - - [TestClass] - public class Asn1BEREncoderUnitTest - { - [TestMethod] - public void SnmpEncodeToClassConstructTypeTest() - { - byte[] testBit = new byte[] { 0, 0, 0, 0, 0, 0 }; - Assert.IsTrue(testBit.EncodeClassConstructType(0, Asn1Class.Universal, ConstructType.Primitive, (byte)Asn1Tag.Integer) == 1); - Assert.IsTrue(testBit[0] == 2); - } - - [TestMethod] - public void SnmpIntegerEncodeTest() - { - byte[] bytes = new byte[] { 0, 0, 0, 0, 0, 0 }; - Assert.IsTrue(bytes.EncodeInteger(0, 1) == 3); - Assert.IsTrue(bytes[0] == 2); - Assert.IsTrue(bytes[1] == 1); - Assert.IsTrue(bytes[2] == 1); - } - - [TestMethod] - public void SnmpReadLengthEncoderTest() - { - byte[] bytes = new byte[] { 0, 0, 0, 0, 0, 0 }; - Assert.IsTrue(bytes.EncodeLength(0, 1) == 1); - Assert.IsTrue(bytes[0] == 1); - } - - [TestMethod] - public void TestTimeTicksTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1UInt32EncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, new Asn1TagInfo(Asn1SnmpTag.UInt32)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1Counter64EncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - (ulong)50600900, new Asn1TagInfo(Asn1SnmpTag.Counter64)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual((ulong)50600900, (ulong)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1IntegerEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009979999L, new Asn1TagInfo(Asn1Tag.Integer)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(506009979999L, (long)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1NegativeIntegerEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - -506009979999L, new Asn1TagInfo(Asn1Tag.Integer)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(-506009979999L, (long)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1SmallIntegerEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 1, new Asn1TagInfo(Asn1Tag.Integer)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(1, (long)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1GaugeEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, new Asn1TagInfo(Asn1SnmpTag.Gauge)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1IpAdressEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - new System.Net.IPAddress(123453), new Asn1TagInfo(Asn1SnmpTag.IpAddress)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual("61.226.1.0", snmpPack.VarBinds[0].Value.ToString()); - } - - [TestMethod] - public void Asn1NullEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.IsNull(snmpPack.VarBinds[0].Value); - } - - [TestMethod] - public void Asn1NullAndNotNullEncodingTest() - { - var oidWithNull = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")); - var oidWithoutNull = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), - 1, new Asn1TagInfo(Asn1Tag.Integer)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { oidWithNull, oidWithoutNull }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.IsNull(snmpPack.VarBinds[0].Value); - Assert.AreEqual(1, (long)snmpPack.VarBinds[1].Value); - } - - [TestMethod] - public void Asn1BigVarBindEncodingTest() - { - var varBinds = new VarBind[] { - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 143, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 122, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13456, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1334, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1444, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13, new Asn1TagInfo(Asn1Tag.Integer)), - new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 10, new Asn1TagInfo(Asn1Tag.Integer)), - }; - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - varBinds, - PduType.SNMPv2Trap, - 509000, - SnmpErrorStatus.TooBig, - 10000); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.IsNull(snmpPack.VarBinds[0].Value); - Assert.AreEqual(1, (long)snmpPack.VarBinds[1].Value); - } - - [TestMethod] - public void Asn1StringEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - "TestString", new Asn1TagInfo(Asn1Tag.OctetString)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual("TestString", snmpPack.VarBinds[0].Value.ToString()); - } - - [TestMethod] - public void Asn1ObjectIdentifierEncodingTest() - { - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - new ObjectIdentifier("1.3.6.1.2.1.1.1.1.1"), new Asn1TagInfo(Asn1Tag.ObjectIdentifier)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var encoded = packet.ToSnmpEncodedByteArray(); - var snmpPack = encoded.ToSnmpDatagram(); - - Assert.AreEqual(new ObjectIdentifier("1.3.6.1.2.1.1.1.1.1"), (ObjectIdentifier)snmpPack.VarBinds[0].Value); - } - } -} +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Snmp; + +namespace Tx.Network.Tests +{ + [TestClass] + public class Asn1BEREncoderUnitTest + { + [TestMethod] + public void SnmpEncodeToClassConstructTypeTest() + { + byte[] testBit = new byte[] { 0, 0, 0, 0, 0, 0 }; + Assert.IsTrue(testBit.EncodeClassConstructType(0, Asn1Class.Universal, ConstructType.Primitive, (byte)Asn1Tag.Integer) == 1); + Assert.IsTrue(testBit[0] == 2); + } + + [TestMethod] + public void SnmpIntegerEncodeTest() + { + byte[] bytes = new byte[] { 0, 0, 0, 0, 0, 0 }; + Assert.IsTrue(bytes.EncodeInteger(0, 1) == 3); + Assert.IsTrue(bytes[0] == 2); + Assert.IsTrue(bytes[1] == 1); + Assert.IsTrue(bytes[2] == 1); + } + + [TestMethod] + public void SnmpReadLengthEncoderTest() + { + byte[] bytes = new byte[] { 0, 0, 0, 0, 0, 0 }; + Assert.IsTrue(bytes.EncodeLength(0, 1) == 1); + Assert.IsTrue(bytes[0] == 1); + } + + [TestMethod] + public void TestTimeTicksTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1UInt32EncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, new Asn1TagInfo(Asn1SnmpTag.UInt32)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1Counter64EncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + (ulong)50600900, new Asn1TagInfo(Asn1SnmpTag.Counter64)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual((ulong)50600900, (ulong)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1IntegerEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009979999L, new Asn1TagInfo(Asn1Tag.Integer)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(506009979999L, (long)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1NegativeIntegerEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + -506009979999L, new Asn1TagInfo(Asn1Tag.Integer)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(-506009979999L, (long)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1SmallIntegerEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 1, new Asn1TagInfo(Asn1Tag.Integer)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(1, (long)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1GaugeEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, new Asn1TagInfo(Asn1SnmpTag.Gauge)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(506009u, (uint)snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1IpAdressEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + new System.Net.IPAddress(123453), new Asn1TagInfo(Asn1SnmpTag.IpAddress)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual("61.226.1.0", snmpPack.VarBinds[0].Value.ToString()); + } + + [TestMethod] + public void Asn1NullEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.IsNull(snmpPack.VarBinds[0].Value); + } + + [TestMethod] + public void Asn1NullAndNotNullEncodingTest() + { + var oidWithNull = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")); + var oidWithoutNull = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), + 1, new Asn1TagInfo(Asn1Tag.Integer)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { oidWithNull, oidWithoutNull }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.IsNull(snmpPack.VarBinds[0].Value); + Assert.AreEqual(1, (long)snmpPack.VarBinds[1].Value); + } + + [TestMethod] + public void Asn1BigVarBindEncodingTest() + { + var varBinds = new[] { + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 143, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 122, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13456, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1334, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 1444, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 13, new Asn1TagInfo(Asn1Tag.Integer)), + new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.1"), 10, new Asn1TagInfo(Asn1Tag.Integer)), + }; + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + varBinds, + PduType.SNMPv2Trap, + 509000, + SnmpErrorStatus.TooBig, + 10000); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.IsNull(snmpPack.VarBinds[0].Value); + Assert.AreEqual(1, (long)snmpPack.VarBinds[1].Value); + } + + [TestMethod] + public void Asn1StringEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + "TestString", new Asn1TagInfo(Asn1Tag.OctetString)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual("TestString", snmpPack.VarBinds[0].Value.ToString()); + } + + [TestMethod] + public void Asn1ObjectIdentifierEncodingTest() + { + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + new ObjectIdentifier("1.3.6.1.2.1.1.1.1.1"), new Asn1TagInfo(Asn1Tag.ObjectIdentifier)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var encoded = packet.ToSnmpEncodedByteArray(); + var snmpPack = encoded.ToSnmpDatagram(); + + Assert.AreEqual(new ObjectIdentifier("1.3.6.1.2.1.1.1.1.1"), (ObjectIdentifier)snmpPack.VarBinds[0].Value); + } + } +} diff --git a/Test/UnitTests/Network/DeviceResponseData.dat b/Test/Tx.Network.Tests/DeviceResponseData.dat similarity index 99% rename from Test/UnitTests/Network/DeviceResponseData.dat rename to Test/Tx.Network.Tests/DeviceResponseData.dat index dc230144..cab2ba0d 100644 --- a/Test/UnitTests/Network/DeviceResponseData.dat +++ b/Test/Tx.Network.Tests/DeviceResponseData.dat @@ -1,25 +1,25 @@ -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 -48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 +48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 48,130,7,99,2,1,1,4,4,84,101,115,116,162,130,7,86,2,2,10,67,2,1,0,2,1,0,48,130,7,72,48,16,6,10,43,6,1,2,1,2,2,1,1,1,2,1,1,48,16,6,10,43,6,1,2,1,2,2,1,1,4,2,1,4,48,16,6,10,43,6,1,2,1,2,2,1,1,5,2,1,5,48,16,6,10,43,6,1,2,1,2,2,1,1,6,2,1,6,48,16,6,10,43,6,1,2,1,2,2,1,1,7,2,1,7,48,16,6,10,43,6,1,2,1,2,2,1,1,8,2,1,8,48,16,6,10,43,6,1,2,1,2,2,1,1,9,2,1,9,48,16,6,10,43,6,1,2,1,2,2,1,1,10,2,1,10,48,16,6,10,43,6,1,2,1,2,2,1,1,11,2,1,11,48,16,6,10,43,6,1,2,1,2,2,1,1,12,2,1,12,48,16,6,10,43,6,1,2,1,2,2,1,1,13,2,1,13,48,16,6,10,43,6,1,2,1,2,2,1,1,16,2,1,16,48,16,6,10,43,6,1,2,1,2,2,1,1,17,2,1,17,48,16,6,10,43,6,1,2,1,2,2,1,1,18,2,1,18,48,16,6,10,43,6,1,2,1,2,2,1,1,21,2,1,21,48,16,6,10,43,6,1,2,1,2,2,1,1,22,2,1,22,48,16,6,10,43,6,1,2,1,2,2,1,1,23,2,1,23,48,16,6,10,43,6,1,2,1,2,2,1,1,24,2,1,24,48,18,6,11,43,6,1,2,1,2,2,1,1,131,117,2,2,1,245,48,18,6,11,43,6,1,2,1,2,2,1,1,131,118,2,2,1,246,48,18,6,11,43,6,1,2,1,2,2,1,1,131,119,2,2,1,247,48,18,6,11,43,6,1,2,1,2,2,1,1,131,120,2,2,1,248,48,18,6,11,43,6,1,2,1,2,2,1,1,131,121,2,2,1,249,48,18,6,11,43,6,1,2,1,2,2,1,1,131,122,2,2,1,250,48,18,6,11,43,6,1,2,1,2,2,1,1,131,123,2,2,1,251,48,18,6,11,43,6,1,2,1,2,2,1,1,131,124,2,2,1,252,48,18,6,11,43,6,1,2,1,2,2,1,1,131,125,2,2,1,253,48,18,6,11,43,6,1,2,1,2,2,1,1,131,126,2,2,1,254,48,18,6,11,43,6,1,2,1,2,2,1,1,131,127,2,2,1,255,48,18,6,11,43,6,1,2,1,2,2,1,1,132,0,2,2,2,0,48,18,6,11,43,6,1,2,1,2,2,1,1,132,1,2,2,2,1,48,18,6,11,43,6,1,2,1,2,2,1,1,132,2,2,2,2,2,48,18,6,11,43,6,1,2,1,2,2,1,1,132,3,2,2,2,3,48,18,6,11,43,6,1,2,1,2,2,1,1,132,4,2,2,2,4,48,18,6,11,43,6,1,2,1,2,2,1,1,132,5,2,2,2,5,48,18,6,11,43,6,1,2,1,2,2,1,1,132,6,2,2,2,6,48,18,6,11,43,6,1,2,1,2,2,1,1,132,7,2,2,2,7,48,18,6,11,43,6,1,2,1,2,2,1,1,132,8,2,2,2,8,48,18,6,11,43,6,1,2,1,2,2,1,1,132,9,2,2,2,9,48,18,6,11,43,6,1,2,1,2,2,1,1,132,10,2,2,2,10,48,18,6,11,43,6,1,2,1,2,2,1,1,132,11,2,2,2,11,48,18,6,11,43,6,1,2,1,2,2,1,1,132,12,2,2,2,12,48,18,6,11,43,6,1,2,1,2,2,1,1,132,13,2,2,2,13,48,18,6,11,43,6,1,2,1,2,2,1,1,132,14,2,2,2,14,48,18,6,11,43,6,1,2,1,2,2,1,1,132,15,2,2,2,15,48,18,6,11,43,6,1,2,1,2,2,1,1,132,16,2,2,2,16,48,18,6,11,43,6,1,2,1,2,2,1,1,132,17,2,2,2,17,48,18,6,11,43,6,1,2,1,2,2,1,1,132,18,2,2,2,18,48,18,6,11,43,6,1,2,1,2,2,1,1,132,19,2,2,2,19,48,18,6,11,43,6,1,2,1,2,2,1,1,132,20,2,2,2,20,48,18,6,11,43,6,1,2,1,2,2,1,1,132,21,2,2,2,21,48,18,6,11,43,6,1,2,1,2,2,1,1,132,22,2,2,2,22,48,18,6,11,43,6,1,2,1,2,2,1,1,132,23,2,2,2,23,48,18,6,11,43,6,1,2,1,2,2,1,1,132,24,2,2,2,24,48,18,6,11,43,6,1,2,1,2,2,1,1,132,25,2,2,2,25,48,18,6,11,43,6,1,2,1,2,2,1,1,132,26,2,2,2,26,48,18,6,11,43,6,1,2,1,2,2,1,1,132,27,2,2,2,27,48,18,6,11,43,6,1,2,1,2,2,1,1,132,28,2,2,2,28,48,18,6,11,43,6,1,2,1,2,2,1,1,132,29,2,2,2,29,48,18,6,11,43,6,1,2,1,2,2,1,1,132,30,2,2,2,30,48,18,6,11,43,6,1,2,1,2,2,1,1,132,31,2,2,2,31,48,18,6,11,43,6,1,2,1,2,2,1,1,132,32,2,2,2,32,48,18,6,11,43,6,1,2,1,2,2,1,1,132,33,2,2,2,33,48,18,6,11,43,6,1,2,1,2,2,1,1,132,34,2,2,2,34,48,18,6,11,43,6,1,2,1,2,2,1,1,132,35,2,2,2,35,48,18,6,11,43,6,1,2,1,2,2,1,1,132,36,2,2,2,36,48,18,6,11,43,6,1,2,1,2,2,1,1,132,37,2,2,2,37,48,18,6,11,43,6,1,2,1,2,2,1,1,132,38,2,2,2,38,48,18,6,11,43,6,1,2,1,2,2,1,1,132,39,2,2,2,39,48,18,6,11,43,6,1,2,1,2,2,1,1,132,40,2,2,2,40,48,18,6,11,43,6,1,2,1,2,2,1,1,132,41,2,2,2,41,48,18,6,11,43,6,1,2,1,2,2,1,1,132,42,2,2,2,42,48,18,6,11,43,6,1,2,1,2,2,1,1,132,43,2,2,2,43,48,18,6,11,43,6,1,2,1,2,2,1,1,132,44,2,2,2,44,48,18,6,11,43,6,1,2,1,2,2,1,1,132,45,2,2,2,45,48,18,6,11,43,6,1,2,1,2,2,1,1,132,46,2,2,2,46,48,18,6,11,43,6,1,2,1,2,2,1,1,132,47,2,2,2,47,48,18,6,11,43,6,1,2,1,2,2,1,1,132,48,2,2,2,48,48,18,6,11,43,6,1,2,1,2,2,1,1,132,49,2,2,2,49,48,18,6,11,43,6,1,2,1,2,2,1,1,132,50,2,2,2,50,48,18,6,11,43,6,1,2,1,2,2,1,1,132,51,2,2,2,51,48,18,6,11,43,6,1,2,1,2,2,1,1,132,52,2,2,2,52,48,18,6,11,43,6,1,2,1,2,2,1,1,132,53,2,2,2,53,48,18,6,11,43,6,1,2,1,2,2,1,1,132,54,2,2,2,54,48,18,6,11,43,6,1,2,1,2,2,1,1,132,55,2,2,2,55,48,18,6,11,43,6,1,2,1,2,2,1,1,132,56,2,2,2,56,48,18,6,11,43,6,1,2,1,2,2,1,1,132,57,2,2,2,57,48,18,6,11,43,6,1,2,1,2,2,1,1,132,58,2,2,2,58,48,18,6,11,43,6,1,2,1,2,2,1,1,132,59,2,2,2,59,48,18,6,11,43,6,1,2,1,2,2,1,1,132,60,2,2,2,60,48,18,6,11,43,6,1,2,1,2,2,1,1,132,61,2,2,2,61,48,18,6,11,43,6,1,2,1,2,2,1,1,132,62,2,2,2,62,48,18,6,11,43,6,1,2,1,2,2,1,1,132,63,2,2,2,63,48,18,6,11,43,6,1,2,1,2,2,1,1,132,64,2,2,2,64,48,18,6,11,43,6,1,2,1,2,2,1,1,132,65,2,2,2,65,48,18,6,11,43,6,1,2,1,2,2,1,1,132,66,2,2,2,66,48,18,6,11,43,6,1,2,1,2,2,1,1,132,67,2,2,2,67,48,18,6,11,43,6,1,2,1,2,2,1,1,132,68,2,2,2,68,48,18,6,11,43,6,1,2,1,2,2,1,1,132,69,2,2,2,69,48,18,6,11,43,6,1,2,1,2,2,1,1,132,70,2,2,2,70 \ No newline at end of file diff --git a/Test/UnitTests/Network/Extensions.cs b/Test/Tx.Network.Tests/Extensions.cs similarity index 59% rename from Test/UnitTests/Network/Extensions.cs rename to Test/Tx.Network.Tests/Extensions.cs index 6508c7f1..a9ec5048 100644 --- a/Test/UnitTests/Network/Extensions.cs +++ b/Test/Tx.Network.Tests/Extensions.cs @@ -1,15 +1,13 @@ -namespace Tests.Tx.Network -{ - using System; - - using global::Tx.Network; - using global::Tx.Network.Snmp; +using System; +using Tx.Network.Snmp; +namespace Tx.Network.Tests +{ internal static class Extensions { internal static SnmpDatagram ToSnmpDatagram(this byte[] source) { - return source.AsByteArraySegment().ToSnmpDatagram(DateTimeOffset.MinValue, ""); + return source.AsByteArraySegment().ToSnmpDatagram(DateTimeOffset.MinValue, string.Empty); } } } diff --git a/Test/UnitTests/Network/SnmpDatagramUnitTest.cs b/Test/Tx.Network.Tests/SnmpDatagramUnitTest.cs similarity index 82% rename from Test/UnitTests/Network/SnmpDatagramUnitTest.cs rename to Test/Tx.Network.Tests/SnmpDatagramUnitTest.cs index 46f99e4e..446244fa 100644 --- a/Test/UnitTests/Network/SnmpDatagramUnitTest.cs +++ b/Test/Tx.Network.Tests/SnmpDatagramUnitTest.cs @@ -1,191 +1,189 @@ -namespace Tx.Network.UnitTests -{ - using System; - using System.Collections.Generic; - using System.Diagnostics; - using System.IO; - using System.Linq; - using Tx.Network.Snmp; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - using Tests.Tx.Network; - - [TestClass] - public class SnmpDatagramUnitTest - { - private static IList testDeviceResponseCollection; - - private static byte[] V1trapBytes; - - /// - /// Tests the initi. - /// - /// The test context. - [ClassInitialize] - public static void TestIniti(TestContext testContext) - { - testDeviceResponseCollection = new List(); - foreach (var line in File.ReadAllLines(".\\Network\\DeviceResponseData.dat")) - { - testDeviceResponseCollection.Add(line.Split(',').Select(x => (byte)Convert.ToInt32(x)).ToArray()); - } - - V1trapBytes = "48,129,135,2,1,0,4,6,112,117,98,108,105,99,164,122,6,11,6,43,43,43,43,43,43,43,43,43,43,64,4,127,0,0,1,2,1,6,2,2,5,62,67,4,8,6,62,180,48,88,48,26,6,18,43,6,6,6,6,6,6,6,6,6,2,1,1,56,67,77,77,77,2,4,33,10,3,66,48,29,6,14,43,6,6,6,6,6,6,6,6,6,6,6,7,55,4,11,7,7,8,10,19,9,39,1,43,2,0,48,27,6,14,43,6,6,6,6,6,6,6,6,2,1,4,155,55,4,9,83,3,3,3,3,3,3,3,3".Split(',').Select(x => (byte)Convert.ToInt32(x)).ToArray(); - } - - /// - /// Decodes the without error. - /// - [TestMethod] - public void SnmpDecodeWithoutError() - { - try - { - foreach (var device in testDeviceResponseCollection) - { - device.ToSnmpDatagram(); - } - } - catch (Exception ex) - { - Assert.Fail("Failed to Decode data " + ex); - } - } - - /// - /// Encodes the decoded data without error. - /// - [TestMethod] - public void SnmpEncodeDecodedDataWithoutError() - { - try - { - foreach (var device in testDeviceResponseCollection) - { - var snmpPacket = device.ToSnmpDatagram() as SnmpDatagramV2C; - byte[] encodedData = snmpPacket.ToSnmpEncodedByteArray(); - - //Check if encoding is correct by decoding that back - encodedData.ToSnmpDatagram(); - } - } - catch (Exception ex) - { - Assert.Fail("Encoding/Decoding Failed " + ex); - } - } - - /// - /// Encodes the decoded data without error. - /// - [TestMethod] - public void SnmpTrapV1DecodedDataWithoutError() - { - try - { - var datagram = V1trapBytes.ToSnmpDatagram(); - Assert.IsTrue(datagram.Header.Version == SnmpVersion.V1); - //Assert.IsTrue(datagram.PduV1.PduType == PduType.Trap); - } - catch (Exception ex) - { - Assert.Fail("Encoding/Decoding Failed " + ex); - } - } - - /// - /// Decoders the performance test. - /// - [TestMethod] - [Ignore] - public void SnmpDecoderPerformanceTest() - { - long mSec = 0; - Stopwatch sw = Stopwatch.StartNew(); - try - { - for (int i = 0; i < 1000; i++) - { - foreach (var device in testDeviceResponseCollection) - { - device.ToSnmpDatagram(); - } - } - } - catch (Exception ex) - { - Assert.Fail("Failed to Decode data " + ex); - } - finally - { - mSec = sw.ElapsedMilliseconds; - sw.Stop(); - } - -#if DEBUG - Assert.IsTrue(mSec < 1250, "Parser running slower than designed, Time Taken :" + mSec.ToString()); -#else - Assert.IsTrue(mSec < 600, "Parser running slower than designed, Time Taken :" + mSec.ToString()); -#endif - } - - /// - /// Encoders the performance test. - /// - [TestMethod] - [Ignore] - public void SnmpEncoderPerformanceTest() - { - IList packets = new List(); - foreach (var device in testDeviceResponseCollection) - { - packets.Add(device.ToSnmpDatagram()); - } - - long mSec = 0; - Stopwatch sw = Stopwatch.StartNew(); - try - { - for (int i = 0; i < 500; i++) - { - foreach (var packet in packets) - { - (packet as SnmpDatagramV2C).ToSnmpEncodedByteArray(); - } - } - } - catch (Exception ex) - { - Assert.Fail("Failed to Encode data " + ex); - } - finally - { - mSec = sw.ElapsedMilliseconds; - sw.Stop(); - } - -#if DEBUG - Assert.IsTrue(mSec < 1250, "Parser running slower than designed, Time Taken :" + mSec.ToString()); -#else - Assert.IsTrue(mSec < 600, "Parser running slower than designed, Time Taken :" + mSec.ToString()); -#endif - } - - [TestMethod] - public void Asn1ObjectIdentifierTest() - { - var ObjectIdentifier1 = new ObjectIdentifier("1.3.6.1.2.1.1.3.0"); - var ObjectIdentifier2 = new ObjectIdentifier("1.3.6.1.2.1.1.1.1.1"); - var ObjectIdentifier3 = new ObjectIdentifier("1.3.6.1.2.1.1.3.0"); - - Assert.IsTrue(ObjectIdentifier1.IsSubOid(ObjectIdentifier3)); - Assert.IsTrue(ObjectIdentifier1.IsSubOid(new ObjectIdentifier("1.3.6.1.2.1.1"))); - Assert.IsTrue(!ObjectIdentifier1.IsSubOid(ObjectIdentifier2)); - - Assert.IsFalse(default(ObjectIdentifier).IsSubOid(ObjectIdentifier1)); - Assert.IsFalse(ObjectIdentifier1.IsSubOid(default(ObjectIdentifier))); - - Assert.IsTrue(default(ObjectIdentifier).IsSubOid(default(ObjectIdentifier))); - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Snmp; + +namespace Tx.Network.Tests +{ + [TestClass] + public class SnmpDatagramUnitTest + { + private static IList testDeviceResponseCollection; + + private static byte[] V1trapBytes; + + /// + /// Tests the initi. + /// + /// The test context. + [ClassInitialize] + public static void TestIniti(TestContext testContext) + { + testDeviceResponseCollection = new List(); + foreach (var line in File.ReadAllLines(".\\DeviceResponseData.dat")) + { + testDeviceResponseCollection.Add(line.Split(',').Select(x => (byte)Convert.ToInt32(x)).ToArray()); + } + + V1trapBytes = "48,129,135,2,1,0,4,6,112,117,98,108,105,99,164,122,6,11,6,43,43,43,43,43,43,43,43,43,43,64,4,127,0,0,1,2,1,6,2,2,5,62,67,4,8,6,62,180,48,88,48,26,6,18,43,6,6,6,6,6,6,6,6,6,2,1,1,56,67,77,77,77,2,4,33,10,3,66,48,29,6,14,43,6,6,6,6,6,6,6,6,6,6,6,7,55,4,11,7,7,8,10,19,9,39,1,43,2,0,48,27,6,14,43,6,6,6,6,6,6,6,6,2,1,4,155,55,4,9,83,3,3,3,3,3,3,3,3".Split(',').Select(x => (byte)Convert.ToInt32(x)).ToArray(); + } + + /// + /// Decodes the without error. + /// + [TestMethod] + public void SnmpDecodeWithoutError() + { + try + { + foreach (var device in testDeviceResponseCollection) + { + device.ToSnmpDatagram(); + } + } + catch (Exception ex) + { + Assert.Fail("Failed to Decode data " + ex); + } + } + + /// + /// Encodes the decoded data without error. + /// + [TestMethod] + public void SnmpEncodeDecodedDataWithoutError() + { + try + { + foreach (var device in testDeviceResponseCollection) + { + var snmpPacket = device.ToSnmpDatagram() as SnmpDatagramV2C; + byte[] encodedData = snmpPacket.ToSnmpEncodedByteArray(); + + //Check if encoding is correct by decoding that back + encodedData.ToSnmpDatagram(); + } + } + catch (Exception ex) + { + Assert.Fail("Encoding/Decoding Failed " + ex); + } + } + + /// + /// Encodes the decoded data without error. + /// + [TestMethod] + public void SnmpTrapV1DecodedDataWithoutError() + { + try + { + var datagram = V1trapBytes.ToSnmpDatagram(); + Assert.IsTrue(datagram.Header.Version == SnmpVersion.V1); + //Assert.IsTrue(datagram.PduV1.PduType == PduType.Trap); + } + catch (Exception ex) + { + Assert.Fail("Encoding/Decoding Failed " + ex); + } + } + + /// + /// Decoders the performance test. + /// + [TestMethod] + [Ignore] + public void SnmpDecoderPerformanceTest() + { + long mSec; + Stopwatch sw = Stopwatch.StartNew(); + try + { + for (int i = 0; i < 1000; i++) + { + foreach (var device in testDeviceResponseCollection) + { + device.ToSnmpDatagram(); + } + } + } + catch (Exception ex) + { + Assert.Fail("Failed to Decode data " + ex); + } + finally + { + mSec = sw.ElapsedMilliseconds; + sw.Stop(); + } + +#if DEBUG + Assert.IsTrue(mSec < 1250, "Parser running slower than designed, Time Taken :" + mSec.ToString()); +#else + Assert.IsTrue(mSec < 600, "Parser running slower than designed, Time Taken :" + mSec.ToString()); +#endif + } + + /// + /// Encoders the performance test. + /// + [TestMethod] + [Ignore] + public void SnmpEncoderPerformanceTest() + { + IList packets = new List(); + foreach (var device in testDeviceResponseCollection) + { + packets.Add(device.ToSnmpDatagram()); + } + + long mSec; + Stopwatch sw = Stopwatch.StartNew(); + try + { + for (int i = 0; i < 500; i++) + { + foreach (var packet in packets) + { + (packet as SnmpDatagramV2C).ToSnmpEncodedByteArray(); + } + } + } + catch (Exception ex) + { + Assert.Fail("Failed to Encode data " + ex); + } + finally + { + mSec = sw.ElapsedMilliseconds; + sw.Stop(); + } + +#if DEBUG + Assert.IsTrue(mSec < 1250, "Parser running slower than designed, Time Taken :" + mSec.ToString()); +#else + Assert.IsTrue(mSec < 600, "Parser running slower than designed, Time Taken :" + mSec.ToString()); +#endif + } + + [TestMethod] + public void Asn1ObjectIdentifierTest() + { + var objectIdentifier1 = new ObjectIdentifier("1.3.6.1.2.1.1.3.0"); + var objectIdentifier2 = new ObjectIdentifier("1.3.6.1.2.1.1.1.1.1"); + var objectIdentifier3 = new ObjectIdentifier("1.3.6.1.2.1.1.3.0"); + + Assert.IsTrue(objectIdentifier1.IsSubOid(objectIdentifier3)); + Assert.IsTrue(objectIdentifier1.IsSubOid(new ObjectIdentifier("1.3.6.1.2.1.1"))); + Assert.IsTrue(!objectIdentifier1.IsSubOid(objectIdentifier2)); + + Assert.IsFalse(default(ObjectIdentifier).IsSubOid(objectIdentifier1)); + Assert.IsFalse(objectIdentifier1.IsSubOid(default(ObjectIdentifier))); + + Assert.IsTrue(default(ObjectIdentifier).IsSubOid(default(ObjectIdentifier))); + } + } +} diff --git a/Test/UnitTests/Network/SnmpSimpleDatagramTest.cs b/Test/Tx.Network.Tests/SnmpSimpleDatagramTest.cs similarity index 100% rename from Test/UnitTests/Network/SnmpSimpleDatagramTest.cs rename to Test/Tx.Network.Tests/SnmpSimpleDatagramTest.cs diff --git a/Test/UnitTests/Network/SnmpSimpleTrapV2CTest.cs b/Test/Tx.Network.Tests/SnmpSimpleTrapV2CTest.cs similarity index 100% rename from Test/UnitTests/Network/SnmpSimpleTrapV2CTest.cs rename to Test/Tx.Network.Tests/SnmpSimpleTrapV2CTest.cs diff --git a/Test/UnitTests/Network/SnmpTrapTest.cs b/Test/Tx.Network.Tests/SnmpTrapTest.cs similarity index 100% rename from Test/UnitTests/Network/SnmpTrapTest.cs rename to Test/Tx.Network.Tests/SnmpTrapTest.cs diff --git a/Test/UnitTests/Network/SnmpTrapTypeMapTests.cs b/Test/Tx.Network.Tests/SnmpTrapTypeMapTests.cs similarity index 90% rename from Test/UnitTests/Network/SnmpTrapTypeMapTests.cs rename to Test/Tx.Network.Tests/SnmpTrapTypeMapTests.cs index 43771bba..2c7cb4e3 100644 --- a/Test/UnitTests/Network/SnmpTrapTypeMapTests.cs +++ b/Test/Tx.Network.Tests/SnmpTrapTypeMapTests.cs @@ -1,24 +1,19 @@ -namespace Tests.Tx.Network +using System; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using System.Reactive; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Snmp; +using Tx.Network.Snmp.Dynamic; + +namespace Tx.Network.Tests { - using System; - using System.Collections.ObjectModel; - using System.Linq; - using System.Net; - using System.Reactive; - - using global::Tx.Network; - using global::Tx.Network.Snmp; - using global::Tx.Network.Snmp.Dynamic; - - using Microsoft.VisualStudio.TestTools.UnitTesting; - [TestClass] public class SnmpTrapTypeMapTests { private SnmpDatagramV2C snmpDatagram; - private UdpDatagram fakeTrapUdp; - [TestInitialize] public void TestInitialize() { @@ -50,12 +45,6 @@ public void TestInitialize() 0); var encoded = this.snmpDatagram.ToSnmpEncodedByteArray(); - - this.fakeTrapUdp = new UdpDatagram - { - UdpData = encoded.AsByteArraySegment(), - PacketHeader = new IpPacketHeader(IPAddress.Parse("1.1.1.1"), IPAddress.Parse("2.2.2.2"), false, 1, 1, 1, 1, 1, 1, 1, 1, 1) - }; } [TestMethod] diff --git a/Test/UnitTests/Network/SyslogSender.cs b/Test/Tx.Network.Tests/SyslogSender.cs similarity index 73% rename from Test/UnitTests/Network/SyslogSender.cs rename to Test/Tx.Network.Tests/SyslogSender.cs index c813c049..652c2e4f 100644 --- a/Test/UnitTests/Network/SyslogSender.cs +++ b/Test/Tx.Network.Tests/SyslogSender.cs @@ -1,15 +1,14 @@ -namespace Tests.Tx.Network -{ - using System; - using System.Collections.Generic; - using System.Net; - using System.Net.Sockets; - using System.Text; - using System.Threading; - using System.Threading.Tasks; - - using global::Tx.Network.Syslogs; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Tx.Network.Syslogs; +namespace Tx.Network.Tests +{ /// /// Simulates sending Syslogs over the network. /// @@ -18,7 +17,7 @@ internal class TxSyslogSender //public int Counter; public CancellationToken Cancel { get; set; } - public List SentList { get; private set; } + public List SentList { get; } public TxSyslogSender() { this.Cancel = Task.Factory.CancellationToken; @@ -27,14 +26,14 @@ public TxSyslogSender() public Task StartSendAsync(string sourceIp, string targetIp, int udpPort, TimeSpan delay, TimeSpan duration, List source) { - return Task.Factory.StartNew(() => { return this.Send(sourceIp, targetIp, udpPort, delay, duration, source); }, this.Cancel); + return Task.Factory.StartNew(() => this.Send(sourceIp, targetIp, udpPort, delay, duration, source), this.Cancel); } public int Send(string sourceIp, string targetIp, int udpPort, TimeSpan delay, TimeSpan duration, List source) { var start = DateTime.UtcNow; var localCounter = 0; - using (var UC = new UdpClient(new IPEndPoint(IPAddress.Parse(sourceIp), 0))) + using (var client = new UdpClient(new IPEndPoint(IPAddress.Parse(sourceIp), 0))) { while (DateTime.UtcNow < start.Add(duration)) { @@ -50,7 +49,7 @@ public int Send(string sourceIp, string targetIp, int udpPort, TimeSpan delay, T Message = defMatch.Groups["MESSAGE"].Value.Trim(), }; this.SentList.Add(sent); - UC.Send(msg, msg.Length, targetIp, udpPort); + client.SendAsync(msg, msg.Length, targetIp, udpPort).Wait(); localCounter++; Thread.Sleep(delay); } diff --git a/Test/UnitTests/Network/TestHelpers.cs b/Test/Tx.Network.Tests/TestHelpers.cs similarity index 93% rename from Test/UnitTests/Network/TestHelpers.cs rename to Test/Tx.Network.Tests/TestHelpers.cs index 8f749bc5..6a93c590 100644 --- a/Test/UnitTests/Network/TestHelpers.cs +++ b/Test/Tx.Network.Tests/TestHelpers.cs @@ -1,14 +1,13 @@ -namespace Tests.Tx.Network -{ - using System; - using System.Collections.Generic; - - using global::Tx.Network.Syslogs; +using System; +using System.Collections.Generic; +using Tx.Network.Syslogs; +namespace Tx.Network.Tests +{ public class TxSyslogTestSettings { - public static string SourceIP = "127.0.0.1"; - public static string TargetIP = "127.0.0.1"; + public static string SourceIp = "127.0.0.1"; + public static string TargetIp = "127.0.0.1"; public static int TargetPort = 514; public static TimeSpan Delay = TimeSpan.FromMilliseconds(10); public static TimeSpan Duration = TimeSpan.FromSeconds(10); diff --git a/Test/UnitTests/Network/TrapTypeMapTests.cs b/Test/Tx.Network.Tests/TrapTypeMapTests.cs similarity index 94% rename from Test/UnitTests/Network/TrapTypeMapTests.cs rename to Test/Tx.Network.Tests/TrapTypeMapTests.cs index 1af539a4..cdcebd82 100644 --- a/Test/UnitTests/Network/TrapTypeMapTests.cs +++ b/Test/Tx.Network.Tests/TrapTypeMapTests.cs @@ -1,302 +1,300 @@ -namespace Tests.Tx.Network -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Net; - using System.Text; - - using global::Tx.Network.Snmp; - using global::Tx.Network.Snmp.Dynamic; - - using Microsoft.VisualStudio.TestTools.UnitTesting; - - [TestClass] - public class TrapTypeMapTests - { - private SnmpDatagramV2C fakeIpPacket; - - [TestInitialize] - public void TestInitialize() - { - var integerVarBind = new VarBind( - new ObjectIdentifier("1.3.6.1.4.1.1.1.1"), - 5L, - new Asn1TagInfo(Asn1Tag.Integer, ConstructType.Primitive, Asn1Class.Universal)); - - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, - new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); - - var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), - new ObjectIdentifier("1.3.6.1.4.1.500.12"), - new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); - - var extraneousVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.42.42.42.0"), - 8938ul, - new Asn1TagInfo(Asn1SnmpTag.Counter64)); - - this.fakeIpPacket = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime, trapVb, integerVarBind, extraneousVb }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - } - - [TestMethod] - public void TestUnattributedClassReturnsDefaultKey() - { - var typeMap = new TrapTypeMap(); - var key = typeMap.GetTypeKey(typeof(UnmarkedTrap)); - - Assert.IsNotNull(key); - Assert.AreEqual(default(ObjectIdentifier), key); - } - - [TestMethod] - public void TestFakeTrapTransform() - { - var typeMap = new TrapTypeMap(); - - var transform = typeMap.GetTransform(typeof(FakeTrap)); - - Assert.IsNotNull(transform); - - var transformedOutput = transform(this.fakeIpPacket) as FakeTrap; - - Assert.IsNotNull(transformedOutput); - Assert.AreEqual(506009u, transformedOutput.SysUpTime); - Assert.AreEqual(5L, transformedOutput.Integer); - Assert.IsNotNull(transformedOutput.Objects); - Assert.AreEqual(4, transformedOutput.Objects.Count); - Assert.AreEqual(IPAddress.Parse(this.fakeIpPacket.SourceIpAddress), transformedOutput.SourceAddress); - Assert.AreEqual(this.fakeIpPacket.ReceivedTime, transformedOutput.ReceivedTime); - - var varbinds = transformedOutput.Objects; - var extraneous = varbinds.FirstOrDefault(vb => vb.Oid.Equals(new ObjectIdentifier("1.3.6.1.6.3.1.1.42.42.42.0"))); - - Assert.IsNotNull(extraneous); - Assert.AreNotEqual(default(VarBind), extraneous); - Assert.AreEqual(8938ul, extraneous.Value); - } - - [TestMethod] - public void TestNullTrap() - { - var typeMap = new TrapTypeMap(); - - var transform = typeMap.GetTransform(typeof(FakeTrap)); - - Assert.IsNotNull(transform); - - var transformedOutput = transform(null) as FakeTrap; - - Assert.IsNull(transformedOutput); - } - - [TestMethod] - public void TestFakeTrapStringIpTransform() - { - var typeMap = new TrapTypeMap(); - - var transform = typeMap.GetTransform(typeof(FakeTrapStringIp)); - - Assert.IsNotNull(transform); - - var transformedOutput = transform(this.fakeIpPacket) as FakeTrapStringIp; - - Assert.IsNotNull(transformedOutput); - Assert.AreEqual("1.1.1.1", transformedOutput.SourceAddress); - } - - [TestMethod] - public void TestFakeTrapInputKey() - { - var typeMap = new TrapTypeMap(); - var inputKey = typeMap.GetInputKey(this.fakeIpPacket); - - Assert.AreEqual(new ObjectIdentifier("1.3.6.1.4.1.500.12"), inputKey); - - var typeKey = typeMap.GetTypeKey(typeof(FakeTrap)); - - Assert.AreEqual(inputKey, typeKey); - } - - [TestMethod] - public void Test_OctetStringAsByteArray_1() - { - var typeMap = new TrapTypeMap(); - - var transform = typeMap.GetTransform(typeof(FakeTrap2)); - - Assert.IsNotNull(transform); - - var octetStringVarBind = new VarBind( - new ObjectIdentifier("1.3.6.1.4.1.562.29.6.2.2"), - "Hello", - new Asn1TagInfo(Asn1Tag.OctetString, ConstructType.Primitive, Asn1Class.Universal)); - - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, - new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); - - var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), - new ObjectIdentifier("1.3.6.1.4.1.500.12"), - new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime, trapVb, octetStringVarBind }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var transformedOutput = transform(packet) as FakeTrap2; - - Assert.IsNotNull(transformedOutput); - Assert.IsNotNull(transformedOutput.Property); - Assert.AreEqual("Hello", Encoding.UTF8.GetString(transformedOutput.Property)); - Assert.AreEqual("Hello", transformedOutput.StringProperty); - } - - [TestMethod] - public void Test_OctetStringAsByteArray_2() - { - var typeMap = new TrapTypeMap(); - - var transform = typeMap.GetTransform(typeof(FakeTrap2)); - - Assert.IsNotNull(transform); - - var payload = new byte[] { 0x07, 0xE0, 0x06, 0x0E, 0x0E, 0x1E, 0x0E, 0x00 }; - - var octetStringVarBind = new VarBind( - new ObjectIdentifier("1.3.6.1.4.1.562.29.6.2.2"), - payload.ReadOctetString(0, payload.Length), - new Asn1TagInfo(Asn1Tag.OctetString, ConstructType.Primitive, Asn1Class.Universal)); - - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, - new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); - - var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), - new ObjectIdentifier("1.3.6.1.4.1.500.12"), - new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); - - var packet = new SnmpDatagram( - DateTimeOffset.MinValue, - "1.2.3.4", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime, trapVb, octetStringVarBind }); - - var transformedOutput = transform(packet) as FakeTrap2; - - Assert.IsNotNull(transformedOutput); - Assert.IsNotNull(transformedOutput.Property); - - Assert.AreEqual(payload.Length, transformedOutput.Property.Length); - Assert.IsTrue(payload.Zip(transformedOutput.Property, (b, b1) => b == b1).All(i => i)); - } - - [TestMethod] - public void Test_Enum() - { - var typeMap = new TrapTypeMap(); - - var transform = typeMap.GetTransform(typeof(FakeTrap3)); - - Assert.IsNotNull(transform); - - var integerVarBind = new VarBind( - new ObjectIdentifier("1.3.6.1.4.1.562.29.6.1.1.1.6"), - 1L, - new Asn1TagInfo(Asn1Tag.Integer, ConstructType.Primitive, Asn1Class.Universal)); - - var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), - 506009u, - new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); - - var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), - new ObjectIdentifier("1.3.6.1.4.1.500.12"), - new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); - - var packet = new SnmpDatagramV2C( - DateTimeOffset.MinValue, - "1.1.1.1", - new SnmpHeader(SnmpVersion.V2C, "Community"), - new[] { sysUpTime, trapVb, integerVarBind }, - PduType.SNMPv2Trap, - 50000, - SnmpErrorStatus.NoError, - 0); - - var transformedOutput = transform(packet) as FakeTrap3; - - Assert.IsNotNull(transformedOutput); - Assert.AreEqual(SimpleEnum.B, transformedOutput.EnumProperty); - } - - [SnmpTrap("1.3.6.1.4.1.500.12")] - internal class FakeTrap2 - { - [SnmpOid("1.3.6.1.4.1.562.29.6.2.2")] - public byte[] Property { get; set; } - - [SnmpOid("1.3.6.1.4.1.562.29.6.2.2")] - public string StringProperty { get; set; } - } - - [SnmpTrap("1.3.6.1.4.1.500.12")] - internal class FakeTrap3 - { - [SnmpOid("1.3.6.1.4.1.562.29.6.1.1.1.6")] - public SimpleEnum EnumProperty { get; set; } - } - - public enum SimpleEnum - { - A = 0, - B = 1, - C = 2, - }; - - [SnmpTrap("1.3.6.1.4.1.500.12")] - internal class FakeTrap - { - [SnmpOid("1.3.6.1.2.1.1.3.0")] - public uint SysUpTime { get; set; } - - [SnmpOid("1.3.6.1.4.1.1.1.1")] - public long Integer { get; set; } - - [IpAddress] - public IPAddress SourceAddress { get; set; } - - [NotificationObjects] - public IReadOnlyCollection Objects { get; set; } - - [Timestamp] - public DateTimeOffset ReceivedTime { get; set; } - } - - [SnmpTrap("1.3.6.1.4.1.500.12")] - internal class FakeTrapStringIp - { - [IpAddress] - public string SourceAddress { get; set; } - } - - internal class UnmarkedTrap - { - [SnmpOid("1.3.6.1.2.1.1.3.0")] - public uint SysUpTime { get; set; } - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Snmp; +using Tx.Network.Snmp.Dynamic; + +namespace Tx.Network.Tests +{ + [TestClass] + public class TrapTypeMapTests + { + private SnmpDatagramV2C fakeIpPacket; + + [TestInitialize] + public void TestInitialize() + { + var integerVarBind = new VarBind( + new ObjectIdentifier("1.3.6.1.4.1.1.1.1"), + 5L, + new Asn1TagInfo(Asn1Tag.Integer, ConstructType.Primitive, Asn1Class.Universal)); + + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, + new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); + + var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), + new ObjectIdentifier("1.3.6.1.4.1.500.12"), + new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); + + var extraneousVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.42.42.42.0"), + 8938ul, + new Asn1TagInfo(Asn1SnmpTag.Counter64)); + + this.fakeIpPacket = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime, trapVb, integerVarBind, extraneousVb }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + } + + [TestMethod] + public void TestUnattributedClassReturnsDefaultKey() + { + var typeMap = new TrapTypeMap(); + var key = typeMap.GetTypeKey(typeof(UnmarkedTrap)); + + Assert.IsNotNull(key); + Assert.AreEqual(default(ObjectIdentifier), key); + } + + [TestMethod] + public void TestFakeTrapTransform() + { + var typeMap = new TrapTypeMap(); + + var transform = typeMap.GetTransform(typeof(FakeTrap)); + + Assert.IsNotNull(transform); + + var transformedOutput = transform(this.fakeIpPacket) as FakeTrap; + + Assert.IsNotNull(transformedOutput); + Assert.AreEqual(506009u, transformedOutput.SysUpTime); + Assert.AreEqual(5L, transformedOutput.Integer); + Assert.IsNotNull(transformedOutput.Objects); + Assert.AreEqual(4, transformedOutput.Objects.Count); + Assert.AreEqual(IPAddress.Parse(this.fakeIpPacket.SourceIpAddress), transformedOutput.SourceAddress); + Assert.AreEqual(this.fakeIpPacket.ReceivedTime, transformedOutput.ReceivedTime); + + var varbinds = transformedOutput.Objects; + var extraneous = varbinds.FirstOrDefault(vb => vb.Oid.Equals(new ObjectIdentifier("1.3.6.1.6.3.1.1.42.42.42.0"))); + + Assert.IsNotNull(extraneous); + Assert.AreNotEqual(default(VarBind), extraneous); + Assert.AreEqual(8938ul, extraneous.Value); + } + + [TestMethod] + public void TestNullTrap() + { + var typeMap = new TrapTypeMap(); + + var transform = typeMap.GetTransform(typeof(FakeTrap)); + + Assert.IsNotNull(transform); + + var transformedOutput = transform(null) as FakeTrap; + + Assert.IsNull(transformedOutput); + } + + [TestMethod] + public void TestFakeTrapStringIpTransform() + { + var typeMap = new TrapTypeMap(); + + var transform = typeMap.GetTransform(typeof(FakeTrapStringIp)); + + Assert.IsNotNull(transform); + + var transformedOutput = transform(this.fakeIpPacket) as FakeTrapStringIp; + + Assert.IsNotNull(transformedOutput); + Assert.AreEqual("1.1.1.1", transformedOutput.SourceAddress); + } + + [TestMethod] + public void TestFakeTrapInputKey() + { + var typeMap = new TrapTypeMap(); + var inputKey = typeMap.GetInputKey(this.fakeIpPacket); + + Assert.AreEqual(new ObjectIdentifier("1.3.6.1.4.1.500.12"), inputKey); + + var typeKey = typeMap.GetTypeKey(typeof(FakeTrap)); + + Assert.AreEqual(inputKey, typeKey); + } + + [TestMethod] + public void Test_OctetStringAsByteArray_1() + { + var typeMap = new TrapTypeMap(); + + var transform = typeMap.GetTransform(typeof(FakeTrap2)); + + Assert.IsNotNull(transform); + + var octetStringVarBind = new VarBind( + new ObjectIdentifier("1.3.6.1.4.1.562.29.6.2.2"), + "Hello", + new Asn1TagInfo(Asn1Tag.OctetString, ConstructType.Primitive, Asn1Class.Universal)); + + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, + new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); + + var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), + new ObjectIdentifier("1.3.6.1.4.1.500.12"), + new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime, trapVb, octetStringVarBind }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var transformedOutput = transform(packet) as FakeTrap2; + + Assert.IsNotNull(transformedOutput); + Assert.IsNotNull(transformedOutput.Property); + Assert.AreEqual("Hello", Encoding.UTF8.GetString(transformedOutput.Property)); + Assert.AreEqual("Hello", transformedOutput.StringProperty); + } + + [TestMethod] + public void Test_OctetStringAsByteArray_2() + { + var typeMap = new TrapTypeMap(); + + var transform = typeMap.GetTransform(typeof(FakeTrap2)); + + Assert.IsNotNull(transform); + + var payload = new byte[] { 0x07, 0xE0, 0x06, 0x0E, 0x0E, 0x1E, 0x0E, 0x00 }; + + var octetStringVarBind = new VarBind( + new ObjectIdentifier("1.3.6.1.4.1.562.29.6.2.2"), + payload.ReadOctetString(0, payload.Length), + new Asn1TagInfo(Asn1Tag.OctetString, ConstructType.Primitive, Asn1Class.Universal)); + + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, + new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); + + var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), + new ObjectIdentifier("1.3.6.1.4.1.500.12"), + new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); + + var packet = new SnmpDatagram( + DateTimeOffset.MinValue, + "1.2.3.4", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime, trapVb, octetStringVarBind }); + + var transformedOutput = transform(packet) as FakeTrap2; + + Assert.IsNotNull(transformedOutput); + Assert.IsNotNull(transformedOutput.Property); + + Assert.AreEqual(payload.Length, transformedOutput.Property.Length); + Assert.IsTrue(payload.Zip(transformedOutput.Property, (b, b1) => b == b1).All(i => i)); + } + + [TestMethod] + public void Test_Enum() + { + var typeMap = new TrapTypeMap(); + + var transform = typeMap.GetTransform(typeof(FakeTrap3)); + + Assert.IsNotNull(transform); + + var integerVarBind = new VarBind( + new ObjectIdentifier("1.3.6.1.4.1.562.29.6.1.1.1.6"), + 1L, + new Asn1TagInfo(Asn1Tag.Integer, ConstructType.Primitive, Asn1Class.Universal)); + + var sysUpTime = new VarBind(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), + 506009u, + new Asn1TagInfo(Asn1SnmpTag.TimeTicks)); + + var trapVb = new VarBind(new ObjectIdentifier("1.3.6.1.6.3.1.1.4.1.0"), + new ObjectIdentifier("1.3.6.1.4.1.500.12"), + new Asn1TagInfo(Asn1Tag.ObjectIdentifier, ConstructType.Primitive, Asn1Class.Universal)); + + var packet = new SnmpDatagramV2C( + DateTimeOffset.MinValue, + "1.1.1.1", + new SnmpHeader(SnmpVersion.V2C, "Community"), + new[] { sysUpTime, trapVb, integerVarBind }, + PduType.SNMPv2Trap, + 50000, + SnmpErrorStatus.NoError, + 0); + + var transformedOutput = transform(packet) as FakeTrap3; + + Assert.IsNotNull(transformedOutput); + Assert.AreEqual(SimpleEnum.B, transformedOutput.EnumProperty); + } + + [SnmpTrap("1.3.6.1.4.1.500.12")] + internal class FakeTrap2 + { + [SnmpOid("1.3.6.1.4.1.562.29.6.2.2")] + public byte[] Property { get; set; } + + [SnmpOid("1.3.6.1.4.1.562.29.6.2.2")] + public string StringProperty { get; set; } + } + + [SnmpTrap("1.3.6.1.4.1.500.12")] + internal class FakeTrap3 + { + [SnmpOid("1.3.6.1.4.1.562.29.6.1.1.1.6")] + public SimpleEnum EnumProperty { get; set; } + } + + public enum SimpleEnum + { + A = 0, + B = 1, + C = 2, + }; + + [SnmpTrap("1.3.6.1.4.1.500.12")] + internal class FakeTrap + { + [SnmpOid("1.3.6.1.2.1.1.3.0")] + public uint SysUpTime { get; set; } + + [SnmpOid("1.3.6.1.4.1.1.1.1")] + public long Integer { get; set; } + + [IpAddress] + public IPAddress SourceAddress { get; set; } + + [NotificationObjects] + public IReadOnlyCollection Objects { get; set; } + + [Timestamp] + public DateTimeOffset ReceivedTime { get; set; } + } + + [SnmpTrap("1.3.6.1.4.1.500.12")] + internal class FakeTrapStringIp + { + [IpAddress] + public string SourceAddress { get; set; } + } + + internal class UnmarkedTrap + { + [SnmpOid("1.3.6.1.2.1.1.3.0")] + public uint SysUpTime { get; set; } + } + } +} diff --git a/Test/Tx.Network.Tests/Tx.Network.Tests.csproj b/Test/Tx.Network.Tests/Tx.Network.Tests.csproj new file mode 100644 index 00000000..76443d89 --- /dev/null +++ b/Test/Tx.Network.Tests/Tx.Network.Tests.csproj @@ -0,0 +1,30 @@ + + + + netcoreapp1.1;net45 + True + ..\..\Source\key.snk + + + + + + + + + + + + + + + + + + + + Always + + + + diff --git a/Test/UnitTests/Network/UdpReceiverTests.cs b/Test/Tx.Network.Tests/UdpReceiverTests.cs similarity index 82% rename from Test/UnitTests/Network/UdpReceiverTests.cs rename to Test/Tx.Network.Tests/UdpReceiverTests.cs index 4135b0f3..a53f6056 100644 --- a/Test/UnitTests/Network/UdpReceiverTests.cs +++ b/Test/Tx.Network.Tests/UdpReceiverTests.cs @@ -1,14 +1,12 @@ -namespace Tests.Tx.Network -{ - using global::Tx.Network; - using global::Tx.Network.Syslogs; - using System.Net; - using System.Collections.Generic; - using System.Reactive.Linq; - using System; - - using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Net; +using System.Reactive.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Syslogs; +namespace Tx.Network.Tests +{ [TestClass] public class UdpReceiverTests { @@ -28,9 +26,10 @@ public void Run_10s_10ms() RunCompareSendReceive(duration, delay); } - private void RunCompareSendReceive(TimeSpan duration, TimeSpan delay) + + private static void RunCompareSendReceive(TimeSpan duration, TimeSpan delay) { - ReceiveTxSyslog txReceiver = new ReceiveTxSyslog(new IPEndPoint(IPAddress.Parse(TxSyslogTestSettings.TargetIP), TxSyslogTestSettings.TargetPort), 10); + ReceiveTxSyslog txReceiver = new ReceiveTxSyslog(new IPEndPoint(IPAddress.Parse(TxSyslogTestSettings.TargetIp), TxSyslogTestSettings.TargetPort), 10); txReceiver.RunCount(); var txRecdObs = txReceiver.ObserveTx(); @@ -39,8 +38,8 @@ private void RunCompareSendReceive(TimeSpan duration, TimeSpan delay) .Subscribe(j => receivedList.Add(j)); TxSyslogSender sysSend = new TxSyslogSender(); - var sendTask = sysSend.StartSendAsync(TxSyslogTestSettings.SourceIP, - TxSyslogTestSettings.TargetIP, + var sendTask = sysSend.StartSendAsync(TxSyslogTestSettings.SourceIp, + TxSyslogTestSettings.TargetIp, TxSyslogTestSettings.TargetPort, delay, duration, @@ -54,7 +53,7 @@ private void RunCompareSendReceive(TimeSpan duration, TimeSpan delay) { Assert.AreEqual(sysSend.SentList[c].Fac, receivedList[c].LogFacility); Assert.AreEqual(sysSend.SentList[c].Sev, receivedList[c].LogSeverity); - Assert.AreEqual(TxSyslogTestSettings.SourceIP, receivedList[c].SourceIpAddress); + Assert.AreEqual(TxSyslogTestSettings.SourceIp, receivedList[c].SourceIpAddress); Assert.AreEqual(sysSend.SentList[c].Message.ToLowerInvariant(), receivedList[c].Message.ToLowerInvariant()); Console.Out.WriteLine(receivedList[c].Message); Console.Out.WriteLine(sysSend.SentList[c].Message); diff --git a/Test/UnitTests/Network/UnitTestSyslog.cs b/Test/Tx.Network.Tests/UnitTestSyslog.cs similarity index 89% rename from Test/UnitTests/Network/UnitTestSyslog.cs rename to Test/Tx.Network.Tests/UnitTestSyslog.cs index bb38719d..854ff69d 100644 --- a/Test/UnitTests/Network/UnitTestSyslog.cs +++ b/Test/Tx.Network.Tests/UnitTestSyslog.cs @@ -1,18 +1,17 @@ -namespace Tx.Network.UnitTests +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Network.Syslogs; + +namespace Tx.Network.Tests { - using Microsoft.VisualStudio.TestTools.UnitTesting; - using System; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Net; - using Tx.Network.Syslogs; - using System.Text.RegularExpressions; - using System.Text; - [TestClass] public class UnitTestSyslog { - [TestMethod] public void TestBuildSyslogsSyslog() { @@ -24,9 +23,9 @@ public void TestBuildSyslogsSyslog() var anyMessage = "This is a syslog"; var tmpDict = new Dictionary(); tmpDict.Add("somekey", "somevalue"); - var anyRODictionary = new ReadOnlyDictionary(tmpDict); + var anyRoDictionary = new ReadOnlyDictionary(tmpDict); - var sys = new Syslog(someDateTimeOffset, anyIpAddress, anySeverity, anyFacility, anyMessage, anyRODictionary); + var sys = new Syslog(someDateTimeOffset, anyIpAddress, anySeverity, anyFacility, anyMessage, anyRoDictionary); Assert.AreEqual(someDateTimeOffset, sys.ReceivedTime); Assert.AreEqual(anyIpAddress, sys.SourceIpAddress); @@ -34,7 +33,6 @@ public void TestBuildSyslogsSyslog() Assert.AreEqual(anyFacility, sys.LogFacility); Assert.AreEqual(anyMessage, sys.Message); Assert.AreEqual(tmpDict["somekey"], sys.NamedCollectedMatches["somekey"]); - } [TestMethod] @@ -50,7 +48,6 @@ public void TestBuildSyslogParser() var sysparserWithRegex = new SyslogParser(anyRegex); Assert.IsNotNull(sysparserWithRegex); - } [TestMethod] @@ -84,7 +81,7 @@ public void TestSyslogParserParsing() var udHeader = new UdpDatagramHeader(16, 16, (ushort)udData.Array.Length, 0); UdpDatagram ud = new UdpDatagram() { - @UdpDatagramHeader = udHeader, + UdpDatagramHeader = udHeader, UdpData = udData, PacketHeader = pHeader, ReceivedTime = DateTimeOffset.UtcNow @@ -98,10 +95,8 @@ public void TestSyslogParserParsing() Assert.AreEqual(severity, sys.LogSeverity); Assert.AreEqual(facility, sys.LogFacility); Assert.AreEqual(testmessage, sys.NamedCollectedMatches["MESSAGE"]); - - - } + [TestMethod] public void TestSyslogCustomParserParsing() { @@ -133,7 +128,7 @@ public void TestSyslogCustomParserParsing() var udHeader = new UdpDatagramHeader(16, 16, (ushort)udData.Array.Length, 0); UdpDatagram ud = new UdpDatagram() { - @UdpDatagramHeader = udHeader, + UdpDatagramHeader = udHeader, UdpData = udData, PacketHeader = pHeader, ReceivedTime = DateTimeOffset.UtcNow @@ -148,9 +143,6 @@ public void TestSyslogCustomParserParsing() Assert.AreEqual(severity, sys.LogSeverity); Assert.AreEqual(facility, sys.LogFacility); Assert.AreEqual("with any", sys.NamedCollectedMatches["WithAny"]); - - - } } diff --git a/Test/UnitTests/Network/UnitTestWireEncoding.cs b/Test/Tx.Network.Tests/UnitTestWireEncoding.cs similarity index 94% rename from Test/UnitTests/Network/UnitTestWireEncoding.cs rename to Test/Tx.Network.Tests/UnitTestWireEncoding.cs index ff450689..a652f1c5 100644 --- a/Test/UnitTests/Network/UnitTestWireEncoding.cs +++ b/Test/Tx.Network.Tests/UnitTestWireEncoding.cs @@ -1,11 +1,9 @@ -namespace Tests.Tx.Network -{ - using Microsoft.VisualStudio.TestTools.UnitTesting; - using System; - using System.Net; - - using global::Tx.Network; +using System; +using System.Net; +using Microsoft.VisualStudio.TestTools.UnitTesting; +namespace Tx.Network.Tests +{ [TestClass] public class UnitTestWireEncoding { diff --git a/Test/Tx.Network.Tests/key.snk b/Test/Tx.Network.Tests/key.snk new file mode 100644 index 00000000..02385756 Binary files /dev/null and b/Test/Tx.Network.Tests/key.snk differ diff --git a/Test/Tx.Tests.sln b/Test/Tx.Tests.sln new file mode 100644 index 00000000..f69b7b17 --- /dev/null +++ b/Test/Tx.Tests.sln @@ -0,0 +1,82 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Core.Tests", "Tx.Core.Tests\Tx.Core.Tests.csproj", "{58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Core", "..\Source\Tx.Core\Tx.Core.csproj", "{6D4419B5-4F59-4666-991F-23D35A0C76FF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.Network", "..\Source\Tx.Network\Tx.Network.csproj", "{022862F8-D9EF-4A2D-9790-D9DA89B04CFF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Network.Tests", "Tx.Network.Tests\Tx.Network.Tests.csproj", "{26D16316-475E-4B64-9937-F99719BBCB31}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows", "..\Source\Tx.Windows\Tx.Windows.csproj", "{BEC073AC-01E4-4158-AB27-D28DE542E3F7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows.Tests", "Tx.Windows.Tests\Tx.Windows.Tests.csproj", "{1580A387-C94F-40A5-84BF-6E1ADC6EE9CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.SqlServer", "..\Source\Tx.SqlServer\Tx.SqlServer.csproj", "{4F00AE91-FFAF-4150-9E4D-ACCA532B3953}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Bond", "..\Source\Tx.Bond\Tx.Bond.csproj", "{4060E404-8ADD-4E19-8FBA-06D5A8121BBA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Bond.Tests", "Tx.Bond.Tests\Tx.Bond.Tests.csproj", "{2604AC3D-1F61-4B73-85E8-74BC00E126F7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows.TypeGeneration", "..\Source\Tx.Windows.TypeGeneration\Tx.Windows.TypeGeneration.csproj", "{5DA070F5-72F7-4140-B8C2-71D0F8AD2C12}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tx.LinqPad", "..\Source\Tx.LinqPad\Tx.LinqPad.csproj", "{389F5864-DBF2-462D-8DC1-E1649AAA23BE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58AFB236-9BEC-4FA6-8EF3-A937AD619D0D}.Release|Any CPU.Build.0 = Release|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D4419B5-4F59-4666-991F-23D35A0C76FF}.Release|Any CPU.Build.0 = Release|Any CPU + {022862F8-D9EF-4A2D-9790-D9DA89B04CFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {022862F8-D9EF-4A2D-9790-D9DA89B04CFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {022862F8-D9EF-4A2D-9790-D9DA89B04CFF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {022862F8-D9EF-4A2D-9790-D9DA89B04CFF}.Release|Any CPU.Build.0 = Release|Any CPU + {26D16316-475E-4B64-9937-F99719BBCB31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26D16316-475E-4B64-9937-F99719BBCB31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26D16316-475E-4B64-9937-F99719BBCB31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26D16316-475E-4B64-9937-F99719BBCB31}.Release|Any CPU.Build.0 = Release|Any CPU + {BEC073AC-01E4-4158-AB27-D28DE542E3F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEC073AC-01E4-4158-AB27-D28DE542E3F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEC073AC-01E4-4158-AB27-D28DE542E3F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEC073AC-01E4-4158-AB27-D28DE542E3F7}.Release|Any CPU.Build.0 = Release|Any CPU + {1580A387-C94F-40A5-84BF-6E1ADC6EE9CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1580A387-C94F-40A5-84BF-6E1ADC6EE9CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1580A387-C94F-40A5-84BF-6E1ADC6EE9CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1580A387-C94F-40A5-84BF-6E1ADC6EE9CD}.Release|Any CPU.Build.0 = Release|Any CPU + {4F00AE91-FFAF-4150-9E4D-ACCA532B3953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F00AE91-FFAF-4150-9E4D-ACCA532B3953}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F00AE91-FFAF-4150-9E4D-ACCA532B3953}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F00AE91-FFAF-4150-9E4D-ACCA532B3953}.Release|Any CPU.Build.0 = Release|Any CPU + {4060E404-8ADD-4E19-8FBA-06D5A8121BBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4060E404-8ADD-4E19-8FBA-06D5A8121BBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4060E404-8ADD-4E19-8FBA-06D5A8121BBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4060E404-8ADD-4E19-8FBA-06D5A8121BBA}.Release|Any CPU.Build.0 = Release|Any CPU + {2604AC3D-1F61-4B73-85E8-74BC00E126F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2604AC3D-1F61-4B73-85E8-74BC00E126F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2604AC3D-1F61-4B73-85E8-74BC00E126F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2604AC3D-1F61-4B73-85E8-74BC00E126F7}.Release|Any CPU.Build.0 = Release|Any CPU + {5DA070F5-72F7-4140-B8C2-71D0F8AD2C12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DA070F5-72F7-4140-B8C2-71D0F8AD2C12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DA070F5-72F7-4140-B8C2-71D0F8AD2C12}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DA070F5-72F7-4140-B8C2-71D0F8AD2C12}.Release|Any CPU.Build.0 = Release|Any CPU + {389F5864-DBF2-462D-8DC1-E1649AAA23BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {389F5864-DBF2-462D-8DC1-E1649AAA23BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {389F5864-DBF2-462D-8DC1-E1649AAA23BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {389F5864-DBF2-462D-8DC1-E1649AAA23BE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Test/UnitTests/EtwDeserializerTest.cs b/Test/Tx.Windows.Tests/EtwDeserializerTest.cs similarity index 89% rename from Test/UnitTests/EtwDeserializerTest.cs rename to Test/Tx.Windows.Tests/EtwDeserializerTest.cs index 5c589c88..db17f060 100644 --- a/Test/UnitTests/EtwDeserializerTest.cs +++ b/Test/Tx.Windows.Tests/EtwDeserializerTest.cs @@ -1,8 +1,11 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; +using System.IO; +using System.Reactive; +using System.Reactive.Subjects; using System.Reflection; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class EtwDeserializerTest @@ -20,8 +23,8 @@ string FileName //public void EtwManifestDeserializerOne() //{ // var subject = new Subject>(); - // var deserializer = new PartitionKeyDeserializer( - // new EtwManifestTypeMap(), + // var deserializer = new PartitionKeyDeserializer( + // new EtwManifestTypeMap(), // subject); // deserializer.AddKnownType(typeof(Parse)); diff --git a/Test/UnitTests/EtwTest.cs b/Test/Tx.Windows.Tests/EtwTest.cs similarity index 97% rename from Test/UnitTests/EtwTest.cs rename to Test/Tx.Windows.Tests/EtwTest.cs index 0243b8b4..ba8e5567 100644 --- a/Test/UnitTests/EtwTest.cs +++ b/Test/Tx.Windows.Tests/EtwTest.cs @@ -1,5 +1,4 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -7,9 +6,9 @@ using System.Reactive.Linq; using System.Reflection; using System.Threading; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class EtwTest diff --git a/Test/UnitTests/EventNormalizerTest.cs b/Test/Tx.Windows.Tests/EventNormalizerTest.cs similarity index 90% rename from Test/UnitTests/EventNormalizerTest.cs rename to Test/Tx.Windows.Tests/EventNormalizerTest.cs index bec003ed..c1a307a0 100644 --- a/Test/UnitTests/EventNormalizerTest.cs +++ b/Test/Tx.Windows.Tests/EventNormalizerTest.cs @@ -1,14 +1,13 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Reflection; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class EventNormalizerTest @@ -21,15 +20,6 @@ string EtlFileName return Path.Combine(dir, @"HTTP_Server.etl"); } } - - string EvtxFileName - { - get - { - string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - return Path.Combine(dir, @"HTTP_Server.evtx"); - } - } [TestMethod] public void EtlEventTypeStatistics() diff --git a/Test/UnitTests/EvtxDeserializerTestcs.cs b/Test/Tx.Windows.Tests/EvtxDeserializerTestcs.cs similarity index 87% rename from Test/UnitTests/EvtxDeserializerTestcs.cs rename to Test/Tx.Windows.Tests/EvtxDeserializerTestcs.cs index ca8406a9..9ca7a5ef 100644 --- a/Test/UnitTests/EvtxDeserializerTestcs.cs +++ b/Test/Tx.Windows.Tests/EvtxDeserializerTestcs.cs @@ -1,8 +1,15 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Diagnostics.Eventing.Reader; using System.IO; +using System.Reactive; +using System.Reactive.Linq; +using System.Reactive.Subjects; using System.Reflection; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Windows.Microsoft_Windows_HttpService; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class EvtxDeserializerTestcs @@ -51,7 +58,7 @@ string FileName // var subject = new Subject>(); // var deserializer = new PartitionKeyDeserializer( // new EvtxManifestTypeMap(), - // subject); + // subject); // deserializer.AddKnownType(typeof(Deliver)); // deserializer.AddKnownType(typeof(FastResp)); diff --git a/Test/UnitTests/EvtxTest.cs b/Test/Tx.Windows.Tests/EvtxTest.cs similarity index 85% rename from Test/UnitTests/EvtxTest.cs rename to Test/Tx.Windows.Tests/EvtxTest.cs index b4d3f00b..fa71eb4b 100644 --- a/Test/UnitTests/EvtxTest.cs +++ b/Test/Tx.Windows.Tests/EvtxTest.cs @@ -1,10 +1,9 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; +using System.IO; using System.Linq; using System.Reflection; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class EvtxTest diff --git a/Test/UnitTests/HttpQueriesTest.cs b/Test/Tx.Windows.Tests/HttpQueriesTest.cs similarity index 90% rename from Test/UnitTests/HttpQueriesTest.cs rename to Test/Tx.Windows.Tests/HttpQueriesTest.cs index 308fec07..f16533f3 100644 --- a/Test/UnitTests/HttpQueriesTest.cs +++ b/Test/Tx.Windows.Tests/HttpQueriesTest.cs @@ -1,15 +1,14 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Reflection; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Tx.Windows.Microsoft_Windows_HttpService; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class HttpQueriesTest @@ -49,10 +48,10 @@ public void HTTP_FastSend() pb.AddEtlFiles(EtlFileName); var parsed = from s in pb.GetObservable() select new - { - s.Header.ActivityId, - s.HttpStatus - }; + { + s.Header.ActivityId, + s.HttpStatus + }; int count = 0; parsed.Count().Subscribe(c => count = c); @@ -65,7 +64,7 @@ public void HTTP_FastSend() public void HTTP_WholeRequest() { var pb = new Playback(); - pb.AddEtlFiles(EtlFileName); + pb.AddEtlFiles(EtlFileName); var begin = pb.GetObservable(); var end = pb.GetObservable(); @@ -80,7 +79,7 @@ from e in end.Where(e => e.Header.ActivityId == b.Header.ActivityId).Take(1) }; int count = 0; - requests.Subscribe(r=>count++); + requests.Subscribe(r => count++); pb.Run(); Assert.AreEqual(289, count); @@ -209,16 +208,20 @@ where r.Duration.TotalMilliseconds > 0.5 [TestMethod] public void HTTP_Parse_Format() { - string msg = ""; - - var pb = new Playback(); - pb.AddEtlFiles(EtlFileName); + string msg = null; - var parsed = pb.GetObservable().Take(1); - parsed.Subscribe(p => msg = p.ToString()); - pb.Run(); + using (var playback = new Playback()) + { + playback.AddEtlFiles(EtlFileName); + + var parsed = playback.GetObservable().Take(1); + using (parsed.Subscribe(p => msg = p.ToString())) + { + playback.Run(); + } + } - Assert.AreEqual(msg, "Parsed request (request pointer 18446738026454074672, method 4) with URI http://georgis2:80/windir.txt"); + Assert.AreEqual("Parsed request (request pointer 18446738026454074672, method 4) with URI http://georgis2:80/windir.txt", msg); } [TestMethod] diff --git a/Test/UnitTests/PerfCounterTest.cs b/Test/Tx.Windows.Tests/PerfCounterTest.cs similarity index 98% rename from Test/UnitTests/PerfCounterTest.cs rename to Test/Tx.Windows.Tests/PerfCounterTest.cs index f0d392c1..e1925c3b 100644 --- a/Test/UnitTests/PerfCounterTest.cs +++ b/Test/Tx.Windows.Tests/PerfCounterTest.cs @@ -1,17 +1,15 @@ -using System.Collections.Generic; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; +using System; +using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Reflection; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { - using System.Globalization; - [TestClass] public class PerfCounterTest { diff --git a/Test/Tx.Windows.Tests/PlaybackTest.cs b/Test/Tx.Windows.Tests/PlaybackTest.cs new file mode 100644 index 00000000..f58e68e8 --- /dev/null +++ b/Test/Tx.Windows.Tests/PlaybackTest.cs @@ -0,0 +1,121 @@ +using System; +using System.IO; +using System.Reactive; +using System.Reactive.Linq; +using System.Reflection; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Tx.Windows.Microsoft_Windows_HttpService; + +namespace Tx.Windows.Tests +{ + [TestClass] + public class PlaybackTest + { + string EtlFileName + { + get + { + string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + return Path.Combine(dir, @"HTTP_Server.etl"); + } + } + + string EvtxFileName + { + get + { + string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + return Path.Combine(dir, @"HTTP_Server.evtx"); + } + } + + [TestMethod] + public void PlayOne() + { + var p = new Playback(); + p.AddEtlFiles(EtlFileName); + + int count = 0; + p.GetObservable().Subscribe(e => { count++; }); + p.Run(); + + Assert.AreEqual(291, count); + } + + [TestMethod] + public void OfType() + { + var count = EtwObservable.FromFiles(this.EtlFileName) + .OfType( + new EtwManifestTypeMap(), + new EtwClassicTypeMap(), + new EtwTypeMap()) + .Count() + .Wait(); + + Assert.AreEqual(291, count); + } + + [TestMethod] + public void PlayTwo() + { + var p = new Playback(); + p.AddEtlFiles(EtlFileName); + + int parseCount = 0; + int fastSendCount = 0; + p.GetObservable().Subscribe(e => { parseCount++; }); + p.GetObservable().Subscribe(e => { fastSendCount++; }); + p.Run(); + + Assert.AreEqual(291, parseCount); + Assert.AreEqual(289, fastSendCount); + } + + [TestMethod] + public void PlayTwoBothEtlAndEvtx() + { + var p = new Playback(); + p.AddEtlFiles(EtlFileName); + p.AddLogFiles(EvtxFileName); + + int parseCount = 0; + int fastSendCount = 0; + p.GetObservable().Subscribe(e => { parseCount++; }); + p.GetObservable().Subscribe(e => { fastSendCount++; }); + p.Run(); + + Assert.AreEqual(582, parseCount); + Assert.AreEqual(578, fastSendCount); + } + + [TestMethod] + public void PlayRoot() + { + var p = new Playback(); + p.AddEtlFiles(EtlFileName); + + int count = 0; + p.GetObservable().Subscribe(e => { count++; }); + p.Run(); + + Assert.AreEqual(2041, count); + } + + [TestMethod] + public void PlayRootAndKnownType() + { + var p = new Playback(); + p.AddEtlFiles(EtlFileName); + + int count = 0; + p.GetObservable().Subscribe(e => { count++; }); + int parseCount = 0; + p.GetObservable().Subscribe(e => { parseCount++; }); + p.Run(); + + Assert.AreEqual(2041 + 291, count); + Assert.AreEqual(291, parseCount); + } + } +} diff --git a/Test/UnitTests/ProcessTest.cs b/Test/Tx.Windows.Tests/ProcessTest.cs similarity index 95% rename from Test/UnitTests/ProcessTest.cs rename to Test/Tx.Windows.Tests/ProcessTest.cs index c44b9076..6ccc72a8 100644 --- a/Test/UnitTests/ProcessTest.cs +++ b/Test/Tx.Windows.Tests/ProcessTest.cs @@ -1,13 +1,12 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; +using System; using System.IO; using System.Reactive; using System.Reactive.Linq; using System.Reflection; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Tx.Windows.Microsoft_Windows_Kernel_Process; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class ProcessTest diff --git a/Test/Tx.Windows.Tests/Tx.Windows.Tests.csproj b/Test/Tx.Windows.Tests/Tx.Windows.Tests.csproj new file mode 100644 index 00000000..4ed9428d --- /dev/null +++ b/Test/Tx.Windows.Tests/Tx.Windows.Tests.csproj @@ -0,0 +1,64 @@ + + + + net45 + True + ..\..\Source\key.snk + + + + + + + + + + + + + + + + u_ex130609.log + PreserveNewest + + + + + + Process.etl + PreserveNewest + + + + + + HTTP_Server.etl + PreserveNewest + + + + + + HTTP_Server.evtx + PreserveNewest + + + + + + BasicPerfCounters.blg + PreserveNewest + + + + + + Microsoft_Windows_HttpService.cs + + + Microsoft_Windows_Kernel_Process.cs + + + + diff --git a/Test/UnitTests/TypeStatisticsTest.cs b/Test/Tx.Windows.Tests/TypeStatisticsTest.cs similarity index 91% rename from Test/UnitTests/TypeStatisticsTest.cs rename to Test/Tx.Windows.Tests/TypeStatisticsTest.cs index 1ec2039a..38a012f1 100644 --- a/Test/UnitTests/TypeStatisticsTest.cs +++ b/Test/Tx.Windows.Tests/TypeStatisticsTest.cs @@ -1,10 +1,9 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.IO; +using System.IO; using System.Reactive; using System.Reflection; -using Tx.Windows; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { [TestClass] public class TypeStatisticsTest diff --git a/Test/UnitTests/W3CTest.cs b/Test/Tx.Windows.Tests/W3CTest.cs similarity index 97% rename from Test/UnitTests/W3CTest.cs rename to Test/Tx.Windows.Tests/W3CTest.cs index 0d2837b2..4e68a47a 100644 --- a/Test/UnitTests/W3CTest.cs +++ b/Test/Tx.Windows.Tests/W3CTest.cs @@ -1,14 +1,12 @@ using System; +using System.Globalization; using System.Linq; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Tx.Windows; using System.Reactive; using System.Reactive.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Tests.Tx +namespace Tx.Windows.Tests { - using System.Globalization; - [TestClass] public class W3CTest { diff --git a/Test/Tx.Windows.Tests/key.snk b/Test/Tx.Windows.Tests/key.snk new file mode 100644 index 00000000..02385756 Binary files /dev/null and b/Test/Tx.Windows.Tests/key.snk differ diff --git a/Test/UnitTests/AspRequestInstance.cs b/Test/UnitTests/AspRequestInstance.cs deleted file mode 100644 index dd1cd168..00000000 --- a/Test/UnitTests/AspRequestInstance.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace Tests.Tx -{ - using System; - - public class AspRequestInstance - { - public Guid RequestId { get; set; } - public DateTime RecvReq { get; set; } - public DateTime Start { get; set; } - public DateTime StartHandler { get; set; } - public DateTime HttpHandlerEnter { get; set; } - public DateTime HttpHanlerLeave { get; set; } - public DateTime EndHandler { get; set; } - public DateTime End { get; set; } - - public AspRequestInstance Merge(AspRequestInstance other) - { - if (other.RecvReq != default(DateTime)) - RecvReq = other.RecvReq; - - if (other.Start != default(DateTime)) - Start = other.Start; - - if (other.StartHandler != default(DateTime)) - StartHandler = other.StartHandler; - - if (other.HttpHandlerEnter != default(DateTime)) - HttpHandlerEnter = other.HttpHandlerEnter; - - if (other.HttpHanlerLeave != default(DateTime)) - HttpHanlerLeave = other.HttpHanlerLeave; - - if (other.EndHandler != default(DateTime)) - EndHandler = other.EndHandler; - - if (other.End != default(DateTime)) - End = other.End; - - return this; - } - - public bool IsCompleted - { - get { return End != default(DateTime); } - } - } -} diff --git a/Test/UnitTests/BingCoreUx.cs b/Test/UnitTests/BingCoreUx.cs deleted file mode 100644 index 564a7b8b..00000000 --- a/Test/UnitTests/BingCoreUx.cs +++ /dev/null @@ -1,106 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.IO; -using System.Reactive; -using System.Reactive.Linq; -using System.Reflection; -using Tx.Windows; -using Tx.Windows.AspNetTrace; -using Tx.Windows.Microsoft_Windows_HttpService; - -namespace Tests.Tx -{ - [TestClass] - public class BingCoreUx - { - string EtlFileName - { - get - { - string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - return Path.Combine(dir, @"AspTrace.etl"); - } - } - - [TestMethod] - public void ConcatenateRequest() - { - var pb = new Playback(); - pb.AddEtlFiles(EtlFileName); - - var recvReq = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = new Guid(0, 0, 0, BitConverter.GetBytes(e.RequestId)), - RecvReq = e.Header.Timestamp - }; - - var start = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = e.ContextId, - Start = e.Header.Timestamp - }; - - - var startHandler = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = e.ContextId, - StartHandler = e.Header.Timestamp - }; - - var httpHandlerEnter = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = e.ContextId, - HttpHandlerEnter = e.Header.Timestamp - }; - - var httpHandlerLeave = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = e.ContextId, - HttpHanlerLeave = e.Header.Timestamp - }; - - var endHandler = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = e.ContextId, - EndHandler = e.Header.Timestamp - }; - - var end = from e in pb.GetObservable() - select new AspRequestInstance - { - RequestId = e.ContextId, - End = e.Header.Timestamp - }; - - var sameSchema = recvReq - .Merge(start) - .Merge(startHandler) - .Merge(httpHandlerEnter) - .Merge(httpHandlerLeave) - .Merge(endHandler) - .Merge(end); - - var requests = from r in sameSchema - group r by r.RequestId into gs - from i in gs.Scan((v, i) => v.Merge(i)).Where(v => v.IsCompleted).Take(1) - select i; - - int counter = 0; - requests.Subscribe(r=> - { - counter++; - }); - - pb.Run(); - - Assert.AreEqual(9530, counter); - - } - } -} diff --git a/Test/UnitTests/EtwGeneration.cs b/Test/UnitTests/EtwGeneration.cs deleted file mode 100644 index 49f41ccb..00000000 --- a/Test/UnitTests/EtwGeneration.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Diagnostics; -using System.IO; -using System.Reflection; - -namespace Tests.Tx -{ - [TestClass] - public class EtwGeneration - { - string ToolFileName - { - get - { - string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - return Path.Combine(dir, @"EtwEventTypeGen.exe"); - } - } - - [TestMethod] - public void GenerateHttp() - { - - var tool = Process.Start(ToolFileName, "/m:HTTP_Server.man /o:http"); - tool.WaitForExit(); - - Assert.AreEqual(0, tool.ExitCode); - } - - [TestMethod] - public void GenerateAsp() - { - - var tool = Process.Start(ToolFileName, "/m:asp.man /o:http"); - tool.WaitForExit(); - - Assert.AreEqual(0, tool.ExitCode); - } - } -} diff --git a/Test/UnitTests/Tests.Tx.csproj b/Test/UnitTests/Tests.Tx.csproj deleted file mode 100644 index 6000b9d0..00000000 --- a/Test/UnitTests/Tests.Tx.csproj +++ /dev/null @@ -1,167 +0,0 @@ - - - - Debug - AnyCPU - - - 2.0 - {E88FF544-1342-4ADC-B88A-1BDCE0057DA6} - Library - Properties - Tests.Tx - Tests.Tx - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - false - - - - ..\..\References\$(BuildFlavor) - - - true - - - ..\..\Source\key.snk - - - - $(CPReferencePath)\Bond.dll - - - $(CPReferencePath)\Bond.Attributes.dll - - - False - $(CPReferencePath)\Microsoft.Diagnostics.Tracing.EventSource.dll - - - $(CPReferencePath)\xunit.assert.dll - - - $(CPReferencePath)\Microsoft.Reactive.Testing.dll - - - False - - - - - $(CPReferencePath)\System.Reactive.Core.dll - - - $(CPReferencePath)\System.Reactive.Interfaces.dll - - - $(CPReferencePath)\System.Reactive.Linq.dll - - - $(CPReferencePath)\System.Reactive.PlatformServices.dll - - - - - False - - - - - Microsoft_Windows_HttpService.cs - - - Microsoft_Windows_Kernel_Process.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - - BasicPerfCounters.blg - Always - - - HTTP_Server.etl - Always - - - HTTP_Server.evtx - Always - - - Process.etl - Always - - - u_ex130609.log - Always - - - - - - - {6dce4a40-4946-41b0-abe5-ce1700b598e9} - Tx.Bond - - - {c5cc33b0-1684-4dd4-83a5-5da4a9a25a7f} - Tx.Core - - - {b5284d80-7497-4bf3-afd5-9a3cf8f213fa} - Tx.Network - - - {c4043abb-ec40-4194-b15b-c0d13c2cf5c8} - Tx.Windows - - - - - \ No newline at end of file diff --git a/Test/UnitTests/Tests.Tx.sln b/Test/UnitTests/Tests.Tx.sln deleted file mode 100644 index 7f89411d..00000000 --- a/Test/UnitTests/Tests.Tx.sln +++ /dev/null @@ -1,69 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Tx", "Tests.Tx.csproj", "{E88FF544-1342-4ADC-B88A-1BDCE0057DA6}" - ProjectSection(ProjectDependencies) = postProject - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9} = {6DCE4A40-4946-41B0-ABE5-CE1700B598E9} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Core", "..\..\Source\Tx.Core\Tx.Core.csproj", "{C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows", "..\..\Source\Tx.Windows\Tx.Windows.csproj", "{C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Bond", "..\..\Source\Tx.Bond\Tx.Bond.csproj", "{6DCE4A40-4946-41B0-ABE5-CE1700B598E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Network", "..\..\Source\Tx.Network\Tx.Network.csproj", "{B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EtwEventTypeGen", "..\..\Source\EtwEventTypeGen\EtwEventTypeGen.csproj", "{D8051D89-46E1-47E0-AA9A-9B352AE3CC11}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tx.Windows.TypeGeneration", "..\..\Source\Tx.Windows.TypeGeneration\Tx.Windows.TypeGeneration.csproj", "{A4517ABD-D558-42F3-8FE4-2A6BA3074014}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug45|Any CPU = Debug45|Any CPU - Release45|Any CPU = Release45|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E88FF544-1342-4ADC-B88A-1BDCE0057DA6}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {E88FF544-1342-4ADC-B88A-1BDCE0057DA6}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {E88FF544-1342-4ADC-B88A-1BDCE0057DA6}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {E88FF544-1342-4ADC-B88A-1BDCE0057DA6}.Release45|Any CPU.Build.0 = Release45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {C5CC33B0-1684-4DD4-83A5-5DA4A9A25A7F}.Release45|Any CPU.Build.0 = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {C4043ABB-EC40-4194-B15B-C0D13C2CF5C8}.Release45|Any CPU.Build.0 = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {6DCE4A40-4946-41B0-ABE5-CE1700B598E9}.Release45|Any CPU.Build.0 = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {B5284D80-7497-4BF3-AFD5-9A3CF8F213FA}.Release45|Any CPU.Build.0 = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug40|Any CPU.Build.0 = Debug40|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release40|Any CPU.ActiveCfg = Release40|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release40|Any CPU.Build.0 = Release40|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {D8051D89-46E1-47E0-AA9A-9B352AE3CC11}.Release45|Any CPU.Build.0 = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug40|Any CPU.Build.0 = Debug40|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Debug45|Any CPU.Build.0 = Debug45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release40|Any CPU.ActiveCfg = Release40|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release40|Any CPU.Build.0 = Release40|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release45|Any CPU.ActiveCfg = Release45|Any CPU - {A4517ABD-D558-42F3-8FE4-2A6BA3074014}.Release45|Any CPU.Build.0 = Release45|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Test/UnitTests/Transformer/BinaryPassthroughTransformerBuilderTests.cs b/Test/UnitTests/Transformer/BinaryPassthroughTransformerBuilderTests.cs deleted file mode 100644 index 79d5d070..00000000 --- a/Test/UnitTests/Transformer/BinaryPassthroughTransformerBuilderTests.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Tests.Tx.Transformer -{ - class BinaryPassthroughTransformerBuilderTests - { - } -}